diff --git a/src/resources/objects/creature/CreatureMessageBuilder.java b/src/resources/objects/creature/CreatureMessageBuilder.java index 8c8edbf9..b8f2113b 100644 --- a/src/resources/objects/creature/CreatureMessageBuilder.java +++ b/src/resources/objects/creature/CreatureMessageBuilder.java @@ -191,20 +191,7 @@ public class CreatureMessageBuilder extends TangibleMessageBuilder { buffer.putInt(0); // MissionCritical objects todo later buffer.putInt(0); - - if(creature.getAbilities().isEmpty()) { - buffer.putInt(0); - buffer.putInt(creature.getAbilitiesUpdateCounter()); - } else { - buffer.putInt(creature.getAbilities().size()); - buffer.putInt(creature.getAbilitiesUpdateCounter()); - - for(String ability : creature.getAbilities().get()) { - buffer.put((byte) 0); - buffer.put(getAsciiString(ability)); - buffer.putInt(1); - } - } + buffer.put(creature.getAbilities().getBytes()); buffer.putInt(creature.getXpBarValue()); // xp bar value int size = buffer.position(); buffer = bufferPool.allocate(size, false).put(buffer.array(), 0, size); @@ -912,44 +899,6 @@ public class CreatureMessageBuilder extends TangibleMessageBuilder { } - public IoBuffer buildAddAbilityDelta(String name) { - - CreatureObject creature = (CreatureObject) object; - - IoBuffer buffer = bufferPool.allocate(15 + name.length(), false).order(ByteOrder.LITTLE_ENDIAN); - buffer.putInt(1); - buffer.putInt(creature.getAbilitiesUpdateCounter()); - buffer.put((byte) 0); - buffer.put(getAsciiString(name)); - buffer.putInt(1); - - int size = buffer.position(); - buffer.flip(); - buffer = createDelta("CREO", (byte) 4, (short) 1, (short) 0x0E, buffer, size + 4); - - return buffer; - - } - - public IoBuffer buildRemoveAbilityDelta(String name) { - - CreatureObject creature = (CreatureObject) object; - - IoBuffer buffer = bufferPool.allocate(15 + name.length(), false).order(ByteOrder.LITTLE_ENDIAN); - buffer.putInt(1); - buffer.putInt(creature.getAbilitiesUpdateCounter()); - buffer.put((byte) 1); - buffer.put(getAsciiString(name)); - buffer.putInt(1); - - int size = buffer.position(); - buffer.flip(); - buffer = createDelta("CREO", (byte) 4, (short) 1, (short) 0x0E, buffer, size + 4); - - return buffer; - - } - public IoBuffer buildResetHAMListDelta() { CreatureObject creature = (CreatureObject) object; diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 40e15fc4..583d4fcf 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -95,8 +95,7 @@ public class CreatureObject extends TangibleObject implements Serializable { private float turnRadius = 1; private float walkSpeed = (float) 1.549; private float waterModPercent = (float) 0.75; - private SWGList abilities; - private int abilitiesUpdateCounter = 0; + private SWGMap abilities; private int xpBarValue = 0; private SWGMap missionCriticalObjects; @@ -193,7 +192,7 @@ public class CreatureObject extends TangibleObject implements Serializable { loadTemplateData(); skills = new ArrayList(); skillMods = new SWGMap(this, 4, 3, true); - abilities = new SWGList(this, 4, 14, true); + abilities = new SWGMap(this, 4, 14, true); missionCriticalObjects = new SWGMap(this, 4, 13, false); equipmentList = new SWGList(this, 6, 23, false); buffList = new SWGList(this, 6, 26, false); @@ -786,60 +785,29 @@ public class CreatureObject extends TangibleObject implements Serializable { this.waterModPercent = waterModPercent; } } - - public SWGList getAbilities() { + + public SWGMap getAbilities() { return abilities; } public boolean hasAbility(String name) { - for (String ability : abilities) { - if (ability.equals(name)) { - return true; - } - } - - return false; + return abilities.containsKey(name); } - - public int getAbilitiesUpdateCounter() { - synchronized(objectMutex) { - return abilitiesUpdateCounter; - } - } - - public void setAbilitiesUpdateCounter(int abilitiesUpdateCounter) { - synchronized(objectMutex) { - this.abilitiesUpdateCounter = abilitiesUpdateCounter; - } - } - public void addAbility(String abilityName) { - - if(abilities.contains(abilityName)) + if (abilities.containsKey(abilityName)) { return; - - abilities.add(abilityName); - - if(getClient() != null) { - setAbilitiesUpdateCounter((short) (getAbilitiesUpdateCounter() + 1)); - getClient().getSession().write(messageBuilder.buildAddAbilityDelta(abilityName)); } - + + abilities.put(abilityName, 1); } public void removeAbility(String abilityName) { - - if(!abilities.contains(abilityName)) + if (!abilities.containsKey(abilityName)) { return; - - abilities.remove(abilityName); - - if(getClient() != null) { - setAbilitiesUpdateCounter((short) (getAbilitiesUpdateCounter() + 1)); - getClient().getSession().write(messageBuilder.buildRemoveAbilityDelta(abilityName)); } + abilities.remove(abilityName); } public SWGMap getMissionCriticalObjects() { @@ -1862,6 +1830,15 @@ public class CreatureObject extends TangibleObject implements Serializable { getClient().getSession().write(buffer); } + break; + } + case 14: { + buffer = messageBuilder.createDelta("CREO", (byte) 4, (short) 1, (byte) 14, buffer, buffer.array().length + 4); + + if (getClient() != null && getClient().getSession() != null) { + getClient().getSession().write(buffer); + } + break; } } diff --git a/src/services/SkillService.java b/src/services/SkillService.java index 6396581f..fcd3ec36 100644 --- a/src/services/SkillService.java +++ b/src/services/SkillService.java @@ -25,6 +25,7 @@ import java.nio.ByteOrder; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.TreeMap; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; @@ -163,10 +164,16 @@ public class SkillService implements INetworkDispatch { } } } else { + Map abilitiesMap = new TreeMap(); + for (String ability : abilities) { - creature.addAbility(ability); + if (!creature.hasAbility(ability)) { + abilitiesMap.put(ability, 1); + } } + creature.getAbilities().putAll(abilitiesMap); + for (String expertiseName : creature.getSkills()) { if (expertiseName.startsWith("expertise")) { if (FileUtilities.doesFileExist("scripts/expertise/" + expertiseName + ".py")) {