From dd48daaca1ab069c59e5637fe3ce716667a0c4c5 Mon Sep 17 00:00:00 2001 From: Light2 Date: Mon, 9 Jun 2014 19:05:58 +0200 Subject: [PATCH] Refactored Building and Harvester Permission Lists, fixed AI pathing into cells --- scripts/commands/permissionlistmodify.py | 11 +-- .../structure_management_terminal.py | 7 +- .../objects/building/BuildingObject.java | 45 ++++++++++- .../objects/harvester/HarvesterObject.java | 9 +++ src/services/CharacterService.java | 6 +- src/services/GroupService.java | 1 + src/services/SimulationService.java | 1 + src/services/ai/AIService.java | 2 + src/services/command/CommandService.java | 7 +- src/services/housing/HousingService.java | 78 ++++++++++++++----- src/services/resources/HarvesterService.java | 57 +++++++++----- 11 files changed, 172 insertions(+), 52 deletions(-) diff --git a/scripts/commands/permissionlistmodify.py b/scripts/commands/permissionlistmodify.py index 5d75a1e2..05f567ea 100644 --- a/scripts/commands/permissionlistmodify.py +++ b/scripts/commands/permissionlistmodify.py @@ -6,12 +6,13 @@ def setup(): def run(core, actor, target, commandString): permissionType = 'Undetermined' commandArgs = commandString.split(' ') - if len(commandArgs) > 3: - permissionType = commandArgs[2] - if permissionType=='ENTRY' | permissionType=='BAN': + target = core.housingService.getClosestStructureWithAdminRights(actor) + if not target: + return + if target.getTemplate().startswith('object/building'): core.housingService.handlePermissionListModify(actor, target, commandString) - if permissionType=='ADMIN' | permissionType=='HOPPER': + elif target.getTemplate().startswith('object/installation'): core.harvesterService.handlePermissionListModify(actor, target, commandString) - return + return \ No newline at end of file diff --git a/scripts/radial/structure/structure_management_terminal.py b/scripts/radial/structure/structure_management_terminal.py index 98e5dc0a..0c227cce 100644 --- a/scripts/radial/structure/structure_management_terminal.py +++ b/scripts/radial/structure/structure_management_terminal.py @@ -22,7 +22,8 @@ def createRadial(core, owner, target, radials): radials.add(RadialOptions(2, 174, 0, '@player_structure:find_items_search_for_house_items')) radials.add(RadialOptions(2, 175, 0, '@player_structure:delete_all_items_title')) radials.add(RadialOptions(2, 172, 0, 'Pack Up This Building')) - radials.add(RadialOptions(3, 121, 0, '@player_structure:permission_enter')) + radials.add(RadialOptions(3, 121, 0, '@player_structure:permission_enter')) + radials.add(RadialOptions(3, 122, 0, '@player_structure:permission_admin')) radials.add(RadialOptions(3, 123, 0, '@player_structure:permission_banned')) if owner.getSkillModBase('manage_vendor') >= 1: radials.add(RadialOptions(2, 130, 0, '@player_structure:create_vendor')) @@ -71,6 +72,10 @@ def handleSelection(core, owner, target, option): if owner is not None: core.housingService.handlePermissionEntry(owner,target) return + if option == 122: + if owner is not None: + core.housingService.handlePermissionAdmin(owner,target) + return if option == 123: if owner is not None: core.housingService.handlePermissionBan(owner,target) diff --git a/src/resources/objects/building/BuildingObject.java b/src/resources/objects/building/BuildingObject.java index 4c4a05a2..916bfff7 100644 --- a/src/resources/objects/building/BuildingObject.java +++ b/src/resources/objects/building/BuildingObject.java @@ -35,6 +35,7 @@ import resources.datatables.Options; import resources.objects.ObjectMessageBuilder; import resources.objects.cell.CellObject; import resources.objects.creature.CreatureObject; +import resources.objects.player.PlayerObject; import resources.objects.tangible.TangibleObject; import engine.clientdata.ClientFileManager; import engine.clientdata.visitors.PortalVisitor; @@ -54,6 +55,7 @@ public class BuildingObject extends TangibleObject implements IPersistent, Seria private Vector entryList = new Vector(); private Vector banList = new Vector(); + private Vector adminList = new Vector(); public static final byte PRIVATE = (byte) 0; public static final byte PUBLIC = (byte) 1; @@ -289,6 +291,18 @@ public class BuildingObject extends TangibleObject implements IPersistent, Seria owner.getClient().getSession().write(messageBuilder.buildPermissionListCreate(banListFirstNames, name)); } + public void setPermissionAdmin(String name, CreatureObject owner){ + Vector adminListFirstNames = new Vector(); + + for (long oid : adminList) { + String firstName = NGECore.getInstance().characterService.getPlayerFirstName(oid); + adminListFirstNames.add(firstName); + } + + owner.getClient().getSession().write(messageBuilder.buildPermissionListCreate(adminListFirstNames, name)); + } + + public void addPlayerToEntryList(CreatureObject owner, long oid, String firstName){ if (!entryList.contains(oid)){ SWGObject obj = NGECore.getInstance().objectService.getObject(oid); @@ -329,6 +343,22 @@ public class BuildingObject extends TangibleObject implements IPersistent, Seria } } + public void addPlayerToAdminList(CreatureObject owner, long oid, String firstName){ + if (!adminList.contains(oid)){ + adminList.add(oid); + if(owner != null) + owner.sendSystemMessage(OutOfBand.ProsePackage("@player_structure:player_added", "TO", NGECore.getInstance().objectService.getObject(oid).getCustomName()), DisplayType.Screen); + } + } + + public void removePlayerFromAdminList(CreatureObject owner, long oid, String firstName){ + if (adminList.contains(oid)){ + adminList.remove(oid); + if(owner != null) + owner.sendSystemMessage(OutOfBand.ProsePackage("@player_structure:player_removed", "TO", NGECore.getInstance().objectService.getObject(oid).getCustomName()), DisplayType.Screen); + } + } + @Override public void notifyClients(IoBuffer buffer, boolean notifySelf) { notifyObservers(buffer, false); @@ -365,7 +395,7 @@ public class BuildingObject extends TangibleObject implements IPersistent, Seria } public boolean canEnter(SWGObject object) { - return (getPrivacy() == PRIVATE && entryList.contains(object.getObjectID())) || !banList.contains(object.getObjectID()); + return (getPrivacy() == PRIVATE && (entryList.contains(object.getObjectID()) || adminList.contains(object.getObjectID()))) || !banList.contains(object.getObjectID()) || object.getClient().isGM(); } public void updateCellPermissions(SWGObject obj) { @@ -374,4 +404,17 @@ public class BuildingObject extends TangibleObject implements IPersistent, Seria viewChildren(this, true, false, (cell) -> ((CellObject) cell).sendPermissionMessage(obj.getClient())); } + public boolean isOnEntryList(CreatureObject creature) { + return entryList.contains(creature.getObjectID()); + } + + public boolean isOnBanList(CreatureObject creature) { + return banList.contains(creature.getObjectID()); + } + + public boolean isOnAdminList(CreatureObject creature) { + return adminList.contains(creature.getObjectID()); + } + + } diff --git a/src/resources/objects/harvester/HarvesterObject.java b/src/resources/objects/harvester/HarvesterObject.java index 50f87e23..c4dce6dc 100644 --- a/src/resources/objects/harvester/HarvesterObject.java +++ b/src/resources/objects/harvester/HarvesterObject.java @@ -424,4 +424,13 @@ public class HarvesterObject extends InstallationObject implements Serializable return messageBuilder; } + public boolean isOnHopperList(CreatureObject creature) { + return hopperList.contains(creature.getCustomName().split(" ")[0]); + } + + public boolean isOnAdminList(CreatureObject creature) { + return adminList.contains(creature.getCustomName().split(" ")[0]); + } + + } diff --git a/src/services/CharacterService.java b/src/services/CharacterService.java index 8c2c1810..5e44d250 100644 --- a/src/services/CharacterService.java +++ b/src/services/CharacterService.java @@ -552,9 +552,13 @@ public class CharacterService implements INetworkDispatch { */ public long getPlayerOID(String name) { if (!name.equals("")) { + if (name.contains(" ")) { + name = name.split(" ")[0]; + } + name = name.toLowerCase(); long oid = 0L; try { - PreparedStatement ps = databaseConnection.preparedStatement("SELECT * FROM characters WHERE \"firstName\"=?"); + PreparedStatement ps = databaseConnection.preparedStatement("SELECT * FROM characters WHERE LOWER(\"firstName\")=?"); ps.setString(1, name); ResultSet resultSet = ps.executeQuery(); while (resultSet.next()) { diff --git a/src/services/GroupService.java b/src/services/GroupService.java index bcdc2d02..e7b06a1b 100644 --- a/src/services/GroupService.java +++ b/src/services/GroupService.java @@ -45,6 +45,7 @@ public class GroupService implements INetworkDispatch { core.commandService.registerCommand("invite"); core.commandService.registerCommand("join"); core.commandService.registerCommand("disband"); + core.commandService.registerAlias("leavegroup", "disband"); core.commandService.registerCommand("decline"); core.commandService.registerCommand("dismissgroupmember"); } diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index 03d2a5a4..85862e17 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -515,6 +515,7 @@ public class SimulationService implements INetworkDispatch { } Point3D newPos = new Point3D(dataTransform.getXPosition(), dataTransform.getYPosition(), dataTransform.getZPosition()); + newPos.setCell((CellObject) parent); if(Float.isNaN(newPos.x) || Float.isNaN(newPos.y) || Float.isNaN(newPos.z)) return; Point3D oldPos = object.getPosition(); diff --git a/src/services/ai/AIService.java b/src/services/ai/AIService.java index 1e684fbc..2b76826f 100644 --- a/src/services/ai/AIService.java +++ b/src/services/ai/AIService.java @@ -54,6 +54,8 @@ public class AIService { float z = pointB.z - 1 + new Random().nextFloat(); Point3D endPoint = new Point3D(x, core.terrainService.getHeight(planetId, x, z), z); endPoint.setCell(pointB.getCell()); + if(endPoint.getCell() != null) + endPoint.y = pointB.y; path.add(endPoint); return path; } diff --git a/src/services/command/CommandService.java b/src/services/command/CommandService.java index b7359d8f..9c511792 100644 --- a/src/services/command/CommandService.java +++ b/src/services/command/CommandService.java @@ -69,6 +69,7 @@ public class CommandService implements INetworkDispatch { } public boolean callCommand(CreatureObject actor, SWGObject target, BaseSWGCommand command, int actionCounter, String commandArgs) { + if (actor == null) { return false; } @@ -115,10 +116,10 @@ public class CommandService implements INetworkDispatch { case 0: // Target Not Used For This Command break; case 1: // Other Only (objectId/targetName) - if (target == null) { + if (target == null || target == actor) { if (commandArgs != null && !commandArgs.equals("")) { String name = commandArgs.split(" ")[0]; - + target = core.objectService.getObjectByFirstName(name); if (target == actor) { @@ -128,7 +129,7 @@ public class CommandService implements INetworkDispatch { break; } - + if (target == actor) { return false; } diff --git a/src/services/housing/HousingService.java b/src/services/housing/HousingService.java index 6ef59c27..fc2f7aab 100644 --- a/src/services/housing/HousingService.java +++ b/src/services/housing/HousingService.java @@ -45,6 +45,8 @@ import protocol.swg.EnterStructurePlacementModeMessage; import resources.datatables.DisplayType; import resources.objects.building.BuildingObject; import resources.objects.creature.CreatureObject; +import resources.objects.harvester.HarvesterObject; +import resources.objects.installation.InstallationObject; import resources.objects.player.PlayerObject; import resources.objects.tangible.TangibleObject; import services.playercities.PlayerCity; @@ -142,16 +144,13 @@ public class HousingService implements INetworkDispatch { core.objectService.destroyObject(deed); - // Structure management - Vector admins = new Vector<>(); - admins.add(actor.getObjectID()); building.setAttachment("sign", sign); // meh workaround building.setAttachment("nextMaintenance", System.currentTimeMillis() + 3600000); building.setAttachment("structureOwner", actor.getObjectID()); - building.setAttachment("structureAdmins", admins); building.setAttachment("isCondemned", false); building.setAttachment("outstandingMaint", 0); + building.addPlayerToAdminList(null, actor.getObjectID(), playerFirstName); building.setDeedTemplate(deed.getTemplate()); building.setMaintenanceAmount(houseTemplate.getBaseMaintenanceRate()); building.setConditionDamage(100); // Ouch @@ -233,13 +232,7 @@ public class HousingService implements INetworkDispatch { @SuppressWarnings("unchecked") public boolean getPermissions(SWGObject player, SWGObject container) { SWGObject structure = container.getContainer(); - Vector structureAdmins = (Vector) structure.getAttachment("structureAdmins"); - - if (structureAdmins != null && structureAdmins.contains(player.getObjectID())) { - return true; - } - - return false; + return ((BuildingObject) structure).isOnAdminList((CreatureObject) player); } public void createDestroySUIPage(final SWGObject owner, final TangibleObject target) { @@ -768,25 +761,46 @@ public class HousingService implements INetworkDispatch { public void handlePermissionEntry(CreatureObject owner, TangibleObject target) { final BuildingObject building = (BuildingObject) target.getGrandparent(); //final BuildingObject building = (BuildingObject) target.getAttachment("housing_parentstruct"); - String listName = "ENTRY"; + String listName = "entry"; building.setPermissionEntry(listName,owner); } public void handlePermissionBan(CreatureObject owner, TangibleObject target) { final BuildingObject building = (BuildingObject) target.getGrandparent(); //final BuildingObject building = (BuildingObject) target.getAttachment("housing_parentstruct"); - String listName = "BAN"; + String listName = "ban"; building.setPermissionBan(listName,owner); } + public void handlePermissionAdmin(CreatureObject owner, TangibleObject target) { + final BuildingObject building = (BuildingObject) target.getGrandparent(); + //final BuildingObject building = (BuildingObject) target.getAttachment("housing_parentstruct"); + String listName = "admin"; + building.setPermissionAdmin(listName,owner); + } + + + public SWGObject getClosestStructureWithAdminRights(CreatureObject actor) { + return core.simulationService.get(actor.getPlanet(), actor.getWorldPosition().x, actor.getWorldPosition().z, 20) + .stream().filter(o -> o instanceof BuildingObject || o instanceof InstallationObject) + .filter(o -> { + if(o instanceof BuildingObject) + return ((BuildingObject) o).isOnAdminList(actor); + else if(o instanceof HarvesterObject) { + System.out.println("test"); + return ((HarvesterObject) o).isOnAdminList(actor); + } + return false; + }).min((o1, o2) -> (int) (o1.getWorldPosition().getDistance(actor.getWorldPosition()) - o2.getWorldPosition().getDistance(actor.getWorldPosition()))).orElse(null); + } + public void handlePermissionListModify(CreatureObject owner, SWGObject target, String commandArgs){ String[] commandSplit = commandArgs.split(" "); - if (commandSplit.length==3){ - if (core.characterService.playerExists(commandSplit[2]) && - core.characterService.getPlayerOID(commandSplit[2])>0){ + if (commandSplit.length >= 3) { + if (core.characterService.playerExists(commandSplit[2]) && core.characterService.getPlayerOID(commandSplit[2]) > 0) { long playerOID = core.characterService.getPlayerOID(commandSplit[2]); - if (commandSplit[2].equals("ENTRY")){ + if (commandSplit[1].equals("entry")) { if (commandSplit[0].equals("add")){ ((BuildingObject)target).addPlayerToEntryList(owner, playerOID, commandSplit[2]); @@ -795,13 +809,35 @@ public class HousingService implements INetworkDispatch { ((BuildingObject)target).removePlayerFromEntryList(owner, playerOID, commandSplit[2]); } } - if (commandSplit[2].equals("BAN")){ + if (commandSplit[1].equals("ban")) { + + if (commandSplit[0].equals("add")) { + if(((BuildingObject)target).isOnAdminList((CreatureObject) core.objectService.getObject(playerOID))) { + owner.sendSystemMessage("@player_structure:cannot_ban_admin", (byte) 0); + return; + } + ((BuildingObject)target).addPlayerToBanList(owner, playerOID, commandSplit[2]); + ((BuildingObject)target).removePlayerFromEntryList(owner, playerOID, commandSplit[2]); + } + if (commandSplit[0].equals("remove")) { + ((BuildingObject)target).removePlayerFromBanList(owner, playerOID, commandSplit[2]); + } + } + if (commandSplit[1].equals("admin")) { if (commandSplit[0].equals("add")){ - ((BuildingObject)target).addPlayerToBanList(owner, playerOID, commandSplit[2]); + ((BuildingObject)target).addPlayerToAdminList(owner, playerOID, commandSplit[2]); } - if (commandSplit[0].equals("remove")){ - ((BuildingObject)target).removePlayerFromBanList(owner, playerOID, commandSplit[2]); + if (commandSplit[0].equals("remove")) { + if(playerOID == (long) target.getAttachment("structureOwner")) { + owner.sendSystemMessage("@player_structure:cannot_remove_owner", (byte) 0); + return; + } + else if(playerOID == owner.getObjectID()) { + owner.sendSystemMessage("@player_structure:cannot_remove_self", (byte) 0); + return; + } + ((BuildingObject)target).removePlayerFromAdminList(owner, playerOID, commandSplit[2]); } } } else { diff --git a/src/services/resources/HarvesterService.java b/src/services/resources/HarvesterService.java index d9d79383..cd0a1306 100644 --- a/src/services/resources/HarvesterService.java +++ b/src/services/resources/HarvesterService.java @@ -692,45 +692,62 @@ public class HarvesterService implements INetworkDispatch { public void handlePermissionAdmin(CreatureObject owner, TangibleObject target) { - String listName = "ADMIN"; + String listName = "admin"; ((HarvesterObject) target).setPermissionAdmin(listName,owner); } public void handlePermissionHopper(CreatureObject owner, TangibleObject target) { - String listName = "HOPPER"; + String listName = "hopper"; ((HarvesterObject) target).setPermissionHopper(listName,owner); } public void handlePermissionListModify(CreatureObject crafter, SWGObject target, String commandArgs){ String[] commandSplit = commandArgs.split(" "); - if (commandSplit.length==3){ - if (core.characterService.playerExists(commandSplit[2])){ - if (commandSplit[2].equals("ADMIN")){ + if (commandSplit.length >= 3) { + if (core.characterService.playerExists(commandSplit[2])) { + SWGObject obj = core.objectService.getObject(core.characterService.getPlayerOID(commandSplit[2])); + if (commandSplit[2].equals("admin")){ Vector adminList = ((HarvesterObject)target).getAdminList(); if (commandSplit[0].equals("add") && (!adminList.contains(commandSplit[2]))){ crafter.sendSystemMessage(commandSplit[2] + " added as administrator", (byte) 0); adminList.add(commandSplit[2]); ((HarvesterObject)target).setAdminList(adminList); } - if (commandSplit[0].equals("remove") && (adminList.contains(commandSplit[2]))){ + if (commandSplit[0].equals("remove") && (adminList.contains(commandSplit[2]))){ + if(((HarvesterObject)target).getOwner() == obj.getObjectID()) { + crafter.sendSystemMessage("@player_structure:cannot_remove_owner", (byte) 0); + return; + } + if(crafter == obj) { + crafter.sendSystemMessage("@player_structure:cannot_remove_self", (byte) 0); + return; + } crafter.sendSystemMessage(commandSplit[2] + " removed as administrator", (byte) 0); adminList.remove(commandSplit[2]); ((HarvesterObject)target).setAdminList(adminList); } - } - if (commandSplit[2].equals("HOPPER")){ - Vector hopperList = ((HarvesterObject)target).getHopperList(); - if (commandSplit[0].equals("add") && (!hopperList.contains(commandSplit[2]))){ - crafter.sendSystemMessage(commandSplit[2] + " added as administrator", (byte) 0); - hopperList.add(commandSplit[2]); - ((HarvesterObject)target).setHopperList(hopperList); - } - if (commandSplit[0].equals("remove") && (hopperList.contains(commandSplit[2]))){ - crafter.sendSystemMessage(commandSplit[2] + " removed as administrator", (byte) 0); - hopperList.remove(commandSplit[2]); - ((HarvesterObject)target).setHopperList(hopperList); + if (commandSplit[2].equals("hopper")){ + Vector hopperList = ((HarvesterObject)target).getHopperList(); + if (commandSplit[0].equals("add") && (!hopperList.contains(commandSplit[2]))){ + crafter.sendSystemMessage(commandSplit[2] + " added as administrator", (byte) 0); + hopperList.add(commandSplit[2]); + ((HarvesterObject)target).setHopperList(hopperList); + } + if (commandSplit[0].equals("remove") && (hopperList.contains(commandSplit[2]))) { + if(((HarvesterObject)target).getOwner() == obj.getObjectID()) { + crafter.sendSystemMessage("@player_structure:cannot_remove_owner", (byte) 0); + return; + } + if(crafter == obj) { + crafter.sendSystemMessage("@player_structure:cannot_remove_self", (byte) 0); + return; + } + crafter.sendSystemMessage(commandSplit[2] + " removed as administrator", (byte) 0); + hopperList.remove(commandSplit[2]); + ((HarvesterObject)target).setHopperList(hopperList); + } } } } else { @@ -1015,8 +1032,8 @@ public class HarvesterService implements INetworkDispatch { String structureTemplate = (String) object.getAttachment("StructureTemplate"); HarvesterObject harvester = (HarvesterObject) NGECore.getInstance().objectService.createObject(structureTemplate, actor.getPlanet()); Vector adminList = harvester.getAdminList(); - //String[] fullName = ((CreatureObject)actor).getCustomName().split(" "); - adminList.add(actor.getCustomName()); + String[] fullName = ((CreatureObject)actor).getCustomName().split(" "); + adminList.add(fullName[0]); // Set BER and outputhopper capacity here, take it from deed harvester.setBER((int)object.getAttachment("Deed_BER")); harvester.setSpecRate((int)(1.5F*(int)object.getAttachment("Deed_BER")));