From 6aca49baeaf1d8b7ca207a23e47fa8b19a384c56 Mon Sep 17 00:00:00 2001 From: Seefo Date: Sun, 11 May 2014 12:23:53 -0400 Subject: [PATCH 1/8] Fixed container limit checks --- src/resources/objects/tangible/TangibleObject.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index 2609d507..0c34c595 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -695,7 +695,7 @@ public class TangibleObject extends SWGObject implements Serializable { { if(getTemplateData().getAttribute("containerVolumeLimit") == null) return false; - int containerVolumeLimit = getTemplateData().getAttribute("containerVolumeLimit"); + int containerVolumeLimit = (int)getTemplateData().getAttribute("containerVolumeLimit") >> 8; // Shifting because it seems to be returning an extra byte before it should if(NGECore.getInstance().objectService.objsInContainer(this, this) >= containerVolumeLimit) return true; From c47ddf77df82116fb2edb127019d9cbae9641d89 Mon Sep 17 00:00:00 2001 From: Seefo Date: Sun, 11 May 2014 12:42:40 -0400 Subject: [PATCH 2/8] Fixed a container limit bug --- scripts/commands/transferitemarmor.py | 13 +++++++------ scripts/commands/transferitemmisc.py | 2 +- scripts/commands/transferitemweapon.py | 12 +++++++----- src/resources/objects/tangible/TangibleObject.java | 2 ++ 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/scripts/commands/transferitemarmor.py b/scripts/commands/transferitemarmor.py index f4af003c..8e166cbc 100644 --- a/scripts/commands/transferitemarmor.py +++ b/scripts/commands/transferitemarmor.py @@ -4,17 +4,18 @@ def setup(): return def run(core, actor, target, commandString): - canEquip = core.equipmentService.canEquip(actor, target) - - if canEquip[0] is False: - actor.sendSystemMessage(canEquip[1], 0) - return - parsedMsg = commandString.split(' ', 3) objService = core.objectService containerID = long(parsedMsg[1]) container = objService.getObject(containerID) + + canEquip = core.equipmentService.canEquip(actor, target) + + if canEquip[0] is False and container == actor: + actor.sendSystemMessage(canEquip[1], 0) + return + if target and container and target.getContainer(): oldContainer = target.getContainer() if container == oldContainer: diff --git a/scripts/commands/transferitemmisc.py b/scripts/commands/transferitemmisc.py index 3583e05b..2bc32e5e 100644 --- a/scripts/commands/transferitemmisc.py +++ b/scripts/commands/transferitemmisc.py @@ -45,7 +45,7 @@ def run(core, actor, target, commandString): canEquip = core.equipmentService.canEquip(actor, target) - if canEquip[0] is False: + if canEquip[0] is False and container == actor: actor.sendSystemMessage(canEquip[1], 0) return diff --git a/scripts/commands/transferitemweapon.py b/scripts/commands/transferitemweapon.py index 60f34718..b07c4e03 100644 --- a/scripts/commands/transferitemweapon.py +++ b/scripts/commands/transferitemweapon.py @@ -4,11 +4,7 @@ def setup(): return def run(core, actor, target, commandString): - canEquip = core.equipmentService.canEquip(actor, target) - - if canEquip[0] is False: - actor.sendSystemMessage(canEquip[1], 0) - return + parsedMsg = commandString.split(' ', 3) @@ -21,6 +17,12 @@ def run(core, actor, target, commandString): print 'Error: New container is same as old container.' return; + canEquip = core.equipmentService.canEquip(actor, target) + + if canEquip[0] is False and container == actor: + actor.sendSystemMessage(canEquip[1], 0) + return + replacedObject = None slotName = None replacedObjects = [] diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index 0c34c595..4dc85628 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -697,6 +697,8 @@ public class TangibleObject extends SWGObject implements Serializable { int containerVolumeLimit = (int)getTemplateData().getAttribute("containerVolumeLimit") >> 8; // Shifting because it seems to be returning an extra byte before it should + if(containerVolumeLimit == 0) return false; + if(NGECore.getInstance().objectService.objsInContainer(this, this) >= containerVolumeLimit) return true; return false; From fd524a5a753aeef7864ffcb7149f963df12ee202 Mon Sep 17 00:00:00 2001 From: Seefo Date: Sun, 11 May 2014 14:12:16 -0400 Subject: [PATCH 3/8] Fixed #650 and #651 --- src/services/object/ObjectService.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 62344573..a1b6b79b 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -121,6 +121,7 @@ import resources.objects.tangible.TangibleObject; import resources.objects.tool.SurveyTool; import resources.objects.waypoint.WaypointObject; import resources.objects.weapon.WeaponObject; +import services.EquipmentService; import services.ai.AIActor; import services.command.BaseSWGCommand; import services.command.CombatCommand; @@ -457,7 +458,7 @@ public class ObjectService implements INetworkDispatch { return; } - if (object.getAttachment("AI") != null && ((AIActor) object.getAttachment("AI")).getMobileTemplate().getRespawnTime() > 0) { + if (object.getAttachment("AI") != null && object.getAttachment("AI") instanceof AIActor && ((AIActor) object.getAttachment("AI")).getMobileTemplate().getRespawnTime() > 0) { final long objectId = object.getObjectID(); final String Template = object.getTemplate(); final Planet planet = object.getPlanet(); @@ -501,6 +502,8 @@ public class ObjectService implements INetworkDispatch { if(parent != null) { if(parent instanceof CreatureObject) { + core.equipmentService.unequip((CreatureObject) parent, object); + ((CreatureObject) parent).removeObjectFromEquipList(object); ((CreatureObject) parent).removeObjectFromAppearanceEquipList(object); } From 146df320b8de42f4f1fc8851b33f42f209eaed36 Mon Sep 17 00:00:00 2001 From: Seefo Date: Sun, 11 May 2014 16:21:34 -0400 Subject: [PATCH 4/8] Fixed CollectionService system messages, added STF datatable to quickly obtain an entry from an STF --- src/resources/datatables/STF.java | 29 +++++++++++++++++++ .../objects/tangible/TangibleObject.java | 4 +-- .../collections/CollectionService.java | 13 +++++---- 3 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 src/resources/datatables/STF.java diff --git a/src/resources/datatables/STF.java b/src/resources/datatables/STF.java new file mode 100644 index 00000000..9c0983c8 --- /dev/null +++ b/src/resources/datatables/STF.java @@ -0,0 +1,29 @@ +package resources.datatables; + +import engine.clientdata.StfTable; + +public class STF +{ + /* + Returns a string containing the value of a key in the SWG STF path; + Example: get("@cmd_err:success_prose") returns "The command %TO was a success." + */ + static public String get(String stfPath) + { + stfPath = stfPath.replace("@", ""); + String stfFile = stfPath.split(":")[0]; + String stfKey = stfPath.split(":")[1]; + + try + { + StfTable stf = new StfTable("clientdata/string/en/" + stfFile + ".stf"); + for (int s = 1; s < stf.getRowCount(); s++) + { + if(stf.getStringById(s).getKey().equals(stfKey)) return stf.getStringById(s).getValue(); + } + } + catch (Exception e) { } + + return ""; + } +} diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index 4dc85628..7a12d993 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -134,10 +134,10 @@ public class TangibleObject extends SWGObject implements Serializable { messageBuilder = new TangibleMessageBuilder(this); } + @Deprecated public void setCustomName2(String customName) { setCustomName(customName); - - notifyObservers(messageBuilder.buildCustomNameDelta(customName), true); + System.err.println("setCustomName2 is now deprecated - please use setCustomName"); } public int getIncapTimer() { diff --git a/src/services/collections/CollectionService.java b/src/services/collections/CollectionService.java index d4fd99b1..a936a1d9 100644 --- a/src/services/collections/CollectionService.java +++ b/src/services/collections/CollectionService.java @@ -32,6 +32,7 @@ import org.python.core.PyObject; import resources.common.FileUtilities; import resources.common.OutOfBand; import resources.datatables.DisplayType; +import resources.datatables.STF; import resources.objects.creature.CreatureObject; import resources.objects.player.PlayerObject; import main.NGECore; @@ -310,16 +311,16 @@ public class CollectionService implements INetworkDispatch { } if (hidden && !(getCollection(creature, collectionName) > 0)) { - creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_hidden_slot_added", "TO", "@collection_n:" + collectionName), DisplayType.Broadcast); + creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_hidden_slot_added", "TO", STF.get("@collection_n:" + collectionName)), DisplayType.Broadcast); } player.setCollections(collections.toByteArray()); if (!noMessage) { if (!bookName.equals("crafting_book")) { - creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_slot_added", "TU", "@collection_n:" + slotName, "TO", "@collection_n:" + collectionName), DisplayType.Broadcast); + creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_slot_added", "TU", STF.get("@collection_n:" + slotName), "TO", STF.get("@collection_n:" + collectionName)), DisplayType.Broadcast); } else { - creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_slot_increment", "TU", "@collection_n:" + slotName, "TO", "@collection_n:" + collectionName), DisplayType.Broadcast); + creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_slot_increment", "TU", STF.get("@collection_n:" + slotName), "TO", STF.get("@collection_n:" + collectionName)), DisplayType.Broadcast); } } @@ -356,7 +357,7 @@ public class CollectionService implements INetworkDispatch { } if (isComplete(creature, collectionName)) { - creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_collection_complete", "TO", "@collection_n:" + collectionName), DisplayType.Broadcast); + creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_collection_complete", "TO", STF.get("@collection_n:" + collectionName)), DisplayType.Broadcast); if (!noReward) { try { @@ -445,7 +446,7 @@ public class CollectionService implements INetworkDispatch { if (trackServerFirst) { if (core.guildService.getGuildObject().addServerFirst(collectionName, new ServerFirst(creature.getCustomName(), creature.getObjectId(), collectionName, System.currentTimeMillis()))) { addCollection(creature, "bdg_server_first_01"); - creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_server_first", "TT", core.getGalaxyName(), "TO", "@collection_n:" + collectionName), DisplayType.Broadcast); + creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_server_first", "TT", core.getGalaxyName(), "TO", STF.get("@collection_n:" + collectionName)), DisplayType.Broadcast); } } @@ -818,7 +819,7 @@ public class CollectionService implements INetworkDispatch { } if (collection.equals(collectionName)) { - creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_collection_reset", "TO", "@collection_n:" + collectionName), DisplayType.Broadcast); + creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_collection_reset", "TO", STF.get("@collection_n:" + collectionName)), DisplayType.Broadcast); } continue; From 1445086a58b5ccec87cac3ed7325a321b43d2caf Mon Sep 17 00:00:00 2001 From: Seefo Date: Sun, 11 May 2014 17:15:04 -0400 Subject: [PATCH 5/8] Fixed a few bugs --- src/resources/datatables/STF.java | 2 +- .../objects/tangible/TangibleObject.java | 16 +++------------- src/services/collections/CollectionService.java | 12 ++++++------ 3 files changed, 10 insertions(+), 20 deletions(-) diff --git a/src/resources/datatables/STF.java b/src/resources/datatables/STF.java index 9c0983c8..411b929a 100644 --- a/src/resources/datatables/STF.java +++ b/src/resources/datatables/STF.java @@ -19,7 +19,7 @@ public class STF StfTable stf = new StfTable("clientdata/string/en/" + stfFile + ".stf"); for (int s = 1; s < stf.getRowCount(); s++) { - if(stf.getStringById(s).getKey().equals(stfKey)) return stf.getStringById(s).getValue(); + if(stf.getStringById(s).getKey() != null && stf.getStringById(s).getKey().equals(stfKey)) return stf.getStringById(s).getValue(); } } catch (Exception e) { } diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index 7a12d993..340aea17 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -43,6 +43,7 @@ import protocol.swg.objectControllerObjects.ShowFlyText; import resources.common.OutOfBand; import resources.datatables.Options; import resources.datatables.PvpStatus; +import resources.datatables.STF; import resources.loot.LootGroup; import resources.objects.ObjectMessageBuilder; import resources.objects.creature.CreatureObject; @@ -535,24 +536,13 @@ public class TangibleObject extends SWGObject implements Serializable { // Returns the current, true name of the Object public String getTrueName() { - return getCustomName() != null ? getCustomName() : getTrueStfName(); + return (getCustomName() != null && getCustomName().length() > 0) ? getCustomName() : getTrueStfName(); } // Returns the true STF-based name public String getTrueStfName() { - String name = null; - try - { - StfTable stf = new StfTable("clientdata/string/en/" + getStfFilename() + ".stf"); - for (int s = 1; s < stf.getRowCount(); s++) - { - if(stf.getStringById(s).getKey().equals(getStfName())) name = stf.getStringById(s).getValue(); - } - } - catch (Exception e) { } - - return name; + return STF.get(getProperName()); } public List getLootGroups() { diff --git a/src/services/collections/CollectionService.java b/src/services/collections/CollectionService.java index a936a1d9..dc339b70 100644 --- a/src/services/collections/CollectionService.java +++ b/src/services/collections/CollectionService.java @@ -311,16 +311,16 @@ public class CollectionService implements INetworkDispatch { } if (hidden && !(getCollection(creature, collectionName) > 0)) { - creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_hidden_slot_added", "TO", STF.get("@collection_n:" + collectionName)), DisplayType.Broadcast); + creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_hidden_slot_added", "TO", STF.get("@collection_n:" + collectionName).replace(":", " -")), DisplayType.Broadcast); } player.setCollections(collections.toByteArray()); if (!noMessage) { if (!bookName.equals("crafting_book")) { - creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_slot_added", "TU", STF.get("@collection_n:" + slotName), "TO", STF.get("@collection_n:" + collectionName)), DisplayType.Broadcast); + creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_slot_added", "TU", STF.get("@collection_n:" + slotName).replace(":", " -"), "TO", STF.get("@collection_n:" + collectionName).replace(":", " -")), DisplayType.Broadcast); } else { - creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_slot_increment", "TU", STF.get("@collection_n:" + slotName), "TO", STF.get("@collection_n:" + collectionName)), DisplayType.Broadcast); + creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_slot_increment", "TU", STF.get("@collection_n:" + slotName).replace(":", " -"), "TO", STF.get("@collection_n:" + collectionName).replace(":", " -")), DisplayType.Broadcast); } } @@ -357,7 +357,7 @@ public class CollectionService implements INetworkDispatch { } if (isComplete(creature, collectionName)) { - creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_collection_complete", "TO", STF.get("@collection_n:" + collectionName)), DisplayType.Broadcast); + creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_collection_complete", "TO", STF.get("@collection_n:" + collectionName).replace(":", " -")), DisplayType.Broadcast); if (!noReward) { try { @@ -446,7 +446,7 @@ public class CollectionService implements INetworkDispatch { if (trackServerFirst) { if (core.guildService.getGuildObject().addServerFirst(collectionName, new ServerFirst(creature.getCustomName(), creature.getObjectId(), collectionName, System.currentTimeMillis()))) { addCollection(creature, "bdg_server_first_01"); - creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_server_first", "TT", core.getGalaxyName(), "TO", STF.get("@collection_n:" + collectionName)), DisplayType.Broadcast); + creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_server_first", "TT", core.getGalaxyName(), "TO", STF.get("@collection_n:" + collectionName).replace(":", " -")), DisplayType.Broadcast); } } @@ -819,7 +819,7 @@ public class CollectionService implements INetworkDispatch { } if (collection.equals(collectionName)) { - creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_collection_reset", "TO", STF.get("@collection_n:" + collectionName)), DisplayType.Broadcast); + creature.sendSystemMessage(OutOfBand.ProsePackage("@collection:player_collection_reset", "TO", STF.get("@collection_n:" + collectionName).replace(":", " -")), DisplayType.Broadcast); } continue; From e04ccfa965f61469a15a3e623d18c71ca2702224 Mon Sep 17 00:00:00 2001 From: Seefo Date: Sun, 11 May 2014 22:00:17 -0400 Subject: [PATCH 6/8] Fixed a bug where a player would become 'grey' upon logging out --- src/services/SimulationService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index eea6564f..1eb8ede6 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -766,8 +766,6 @@ public class SimulationService implements INetworkDispatch { if(object.getAttachment("proposer") != null) object.setAttachment("proposer", null); - object.setPvPBitmask(0); - //session.suspendWrite(); final long objectId = object.getObjectID(); From f9e413239d5cdc9a082e04e6cf98d3114ab57267 Mon Sep 17 00:00:00 2001 From: Seefo Date: Sun, 11 May 2014 22:46:45 -0400 Subject: [PATCH 7/8] Fixed a bug where respeccing wouldn't remove old abilities --- src/services/PlayerService.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/services/PlayerService.java b/src/services/PlayerService.java index 29134bb8..69d3a554 100644 --- a/src/services/PlayerService.java +++ b/src/services/PlayerService.java @@ -573,12 +573,13 @@ public class PlayerService implements INetworkDispatch { return; } - player.setProfession(profession); - String xpType = ((profession.contains("entertainer")) ? "entertainer" : ((profession.contains("trader")) ? "crafting" : "combat_general")); - int experience = player.getXp(xpType); + resetLevel(creature); // Clears old profession abilities + + player.setProfession(profession); + try { experienceTable = ClientFileManager.loadFile("datatables/player/player_level.iff", DatatableVisitor.class); From 6cb8f40793aed6bcffd7747fec770b2afcadd88c Mon Sep 17 00:00:00 2001 From: Seefo Date: Sun, 11 May 2014 22:54:15 -0400 Subject: [PATCH 8/8] Small fix to last commit --- src/services/PlayerService.java | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/services/PlayerService.java b/src/services/PlayerService.java index 69d3a554..74b690ec 100644 --- a/src/services/PlayerService.java +++ b/src/services/PlayerService.java @@ -576,7 +576,27 @@ public class PlayerService implements INetworkDispatch { String xpType = ((profession.contains("entertainer")) ? "entertainer" : ((profession.contains("trader")) ? "crafting" : "combat_general")); int experience = player.getXp(xpType); - resetLevel(creature); // Clears old profession abilities + // Remove old profession abilties - resetLevel wont due because resetLevel grants basic specials for level 1 + try + { + String[] skills; + + DatatableVisitor skillTemplate = ClientFileManager.loadFile("datatables/skill_template/skill_template.iff", DatatableVisitor.class); + + for (int s = 0; s < skillTemplate.getRowCount(); s++) + { + if (skillTemplate.getObject(s, 0) != null) { + if (((String) skillTemplate.getObject(s, 0)).equals(player.getProfession())) + { + skills = ((String) skillTemplate.getObject(s, 4)).split(","); + for (String skill : skills) core.skillService.removeSkill(creature, skill); + + break; + } + } + } + } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); } + core.skillService.resetExpertise(creature); player.setProfession(profession);