From 6a2d4a0fb17aa3c1ffd2df52c6e727c4bb9db5c1 Mon Sep 17 00:00:00 2001 From: Ziggeh Date: Thu, 21 Aug 2014 13:04:32 +0200 Subject: [PATCH 1/8] Changed ObjectMessageBuilder to use StandardCharsets --- src/resources/objects/ObjectMessageBuilder.java | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/resources/objects/ObjectMessageBuilder.java b/src/resources/objects/ObjectMessageBuilder.java index 20a294c8..f8da2d6c 100644 --- a/src/resources/objects/ObjectMessageBuilder.java +++ b/src/resources/objects/ObjectMessageBuilder.java @@ -24,6 +24,7 @@ package resources.objects; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.nio.charset.StandardCharsets; import java.util.Map; import org.apache.mina.core.buffer.IoBuffer; @@ -136,11 +137,7 @@ public class ObjectMessageBuilder { buffer.putShort((short) 5); buffer.putInt(0x68A75F0C); buffer.putLong(object.getObjectID()); - try { - buffer.put(reverse(objectType).getBytes("US-ASCII")); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } + buffer.put(reverse(objectType).getBytes(StandardCharsets.US_ASCII)); buffer.put(viewType); buffer.putInt(size); buffer.put(data); @@ -155,11 +152,7 @@ public class ObjectMessageBuilder { buffer.putShort((short) 5); buffer.putInt(Opcodes.DeltasMessage); buffer.putLong(object.getObjectID()); - try { - buffer.put(reverse(objectType).getBytes("US-ASCII")); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } + buffer.put(reverse(objectType).getBytes(StandardCharsets.US_ASCII)); buffer.put(viewType); buffer.putInt(size); buffer.putShort(updateCount); From bd898e6bcc407002f405feff567780fbe68f9b49 Mon Sep 17 00:00:00 2001 From: Ziggeh Date: Thu, 21 Aug 2014 14:26:07 +0200 Subject: [PATCH 2/8] Changed ChatInstantMessageToCharacter to use StandardCharsets --- .../chat/ChatInstantMessageToCharacter.java | 42 +++++++------------ 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/src/protocol/swg/chat/ChatInstantMessageToCharacter.java b/src/protocol/swg/chat/ChatInstantMessageToCharacter.java index 8a1414f9..c4e746f3 100644 --- a/src/protocol/swg/chat/ChatInstantMessageToCharacter.java +++ b/src/protocol/swg/chat/ChatInstantMessageToCharacter.java @@ -23,6 +23,7 @@ package protocol.swg.chat; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; import org.apache.mina.core.buffer.IoBuffer; @@ -48,34 +49,23 @@ public class ChatInstantMessageToCharacter extends SWGMessage { buffer.getInt(); int size; - - try { - size = buffer.getShort(); - game = new String(ByteBuffer.allocate(size).put(buffer.array(), buffer.position(), size).array(), "UTF8"); - buffer.position(buffer.position() + size); - - size = buffer.getShort(); - galaxy = new String(ByteBuffer.allocate(size).put(buffer.array(), buffer.position(), size).array(), "US-ASCII"); - buffer.position(buffer.position() + size); - - size = buffer.getShort(); - recipient = new String(ByteBuffer.allocate(size).put(buffer.array(), buffer.position(), size).array(), "US-ASCII"); - buffer.position(buffer.position() + size); - - size = buffer.getInt(); - message = new String(ByteBuffer.allocate(size * 2).put(buffer.array(), buffer.position(), size * 2).array(), "UTF-16LE"); - buffer.position(buffer.position() + size * 2); - - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - + size = buffer.getShort(); + game = new String(ByteBuffer.allocate(size).put(buffer.array(), buffer.position(), size).array(), StandardCharsets.UTF_8); + buffer.position(buffer.position() + size); - //game = getNextAsciiString(buffer); - //galaxy = getNextAsciiString(buffer); - //recipient = getNextAsciiString(buffer); - //message = getNextUnicodeString(buffer); + size = buffer.getShort(); + galaxy = new String(ByteBuffer.allocate(size).put(buffer.array(), buffer.position(), size).array(), StandardCharsets.US_ASCII); + buffer.position(buffer.position() + size); + + size = buffer.getShort(); + recipient = new String(ByteBuffer.allocate(size).put(buffer.array(), buffer.position(), size).array(), StandardCharsets.US_ASCII); + buffer.position(buffer.position() + size); + + size = buffer.getInt(); + message = new String(ByteBuffer.allocate(size * 2).put(buffer.array(), buffer.position(), size * 2).array(), StandardCharsets.UTF_16LE); + buffer.position(buffer.position() + size * 2); + buffer.getInt(); sequence = buffer.getInt(); } From 499411f77dc223f563e55744c0c7ea76cadce1c7 Mon Sep 17 00:00:00 2001 From: Treeku Date: Thu, 21 Aug 2014 17:47:30 +0100 Subject: [PATCH 3/8] Minor buff adjustment --- src/resources/buffs/Buff.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/resources/buffs/Buff.java b/src/resources/buffs/Buff.java index d2443d25..21347856 100644 --- a/src/resources/buffs/Buff.java +++ b/src/resources/buffs/Buff.java @@ -142,15 +142,9 @@ public class Buff extends Delta { public byte[] getBytes() { synchronized(objectMutex) { IoBuffer buffer = createBuffer(24); - if (duration > 0) { - buffer.putInt((int) (totalPlayTime + getRemainingDuration())); - buffer.putInt(0); - buffer.putInt((int) duration); - } else { - buffer.putInt(-1); - buffer.putInt(0); - buffer.putInt(0); - } + buffer.putInt((int) (duration > 0) ? (totalPlayTime + getRemainingDuration()) : -1); + buffer.putInt(0); + buffer.putInt((int) duration); buffer.putLong(ownerId); buffer.putInt(stacks); buffer.flip(); From 3d1f244f4dc4ee91446f9577e51ced8a16655127 Mon Sep 17 00:00:00 2001 From: Treeku Date: Thu, 21 Aug 2014 18:27:06 +0100 Subject: [PATCH 4/8] See extended... - Fixed minor issue where bufferId was being set to the buffeeId. --- src/services/BuffService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/BuffService.java b/src/services/BuffService.java index b03adf00..52441682 100644 --- a/src/services/BuffService.java +++ b/src/services/BuffService.java @@ -145,7 +145,7 @@ public class BuffService implements INetworkDispatch { return null; } - final Buff buff = new Buff(buffMap.get(buffName), target.getObjectID()); + final Buff buff = new Buff(buffMap.get(buffName), buffer.getObjectID()); if(target.getSlottedObject("ghost") != null) buff.setTotalPlayTime(((PlayerObject) target.getSlottedObject("ghost")).getTotalPlayTime()); else From 73eebd1d06f99f9813d08c32c9bfed27312f7fb3 Mon Sep 17 00:00:00 2001 From: Treeku Date: Thu, 21 Aug 2014 18:56:23 +0100 Subject: [PATCH 5/8] Fixed some long-term buff issues. We've had a completely incorrect buff structure in baselines for the last year due to some small misinterpretations of its structure. It worked because there was the right amount of bytes, but otherwise the structure wasn't right and variables have been in the wrong place. Specifically, we interpreted the stack variable (which comes last) to be the beginning of all buffs except the first, assumed there was an abnormal starting buff, and treated the final stack variable as an unknown variable that comes after the buff list. This is most likely also why it didn't work without this "default buff". The structure has been correct in Buff.getBytes() and buff deltas for a while but has been incorrect for baselines. --- src/resources/objects/creature/CreatureObject.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 691781d5..eb22ce5a 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -51,7 +51,6 @@ import resources.objects.player.PlayerObject; import resources.objects.tangible.TangibleObject; import resources.skills.SkillMod; import resources.buffs.Buff; -import resources.buffs.BuffList; import resources.buffs.DamageOverTime; import resources.common.OutOfBand; import resources.datatables.Difficulty; @@ -104,7 +103,6 @@ public class CreatureObject extends TangibleObject implements IPersistent { getMaxAttribs().add(0); getMaxAttribs().add(300); getMaxAttribs().add(0); - getBuffList().put(0, new Buff("", getObjectID())); // Initial Default Buff } public CreatureObject() { @@ -189,7 +187,7 @@ public class CreatureObject extends TangibleObject implements IPersistent { baseline.put("equipmentList", new SWGList(this, 6, 23, false)); baseline.put("appearance", ""); baseline.put("visible", true); - baseline.put("buffList", new BuffList(new SWGMap(this, 6, 26, false))); + baseline.put("buffList", new SWGMap(this, 6, 26, true)); baseline.put("performing", false); baseline.put("difficulty", Difficulty.NORMAL); baseline.put("hologramColor", -1); @@ -967,8 +965,9 @@ public class CreatureObject extends TangibleObject implements IPersistent { setVisible(!cloaked); } + @SuppressWarnings("unchecked") public SWGMap getBuffList() { - return ((BuffList) getBaseline(6).get("buffList")).getList(); + return (SWGMap) getBaseline(6).get("buffList"); } public Buff getBuffByName(String buffName) { @@ -982,8 +981,12 @@ public class CreatureObject extends TangibleObject implements IPersistent { } public void addBuff(Buff buff) { + if (buff == null) { + System.err.println("CreatureObject:addBuff(): Attempting to add a null Buff object. Something is wrong in BuffService!"); + } + synchronized(objectMutex) { - PlayerObject player = (PlayerObject) this.getSlottedObject("ghost"); + PlayerObject player = (PlayerObject) getSlottedObject("ghost"); buff.setTotalPlayTime((int) (player.getTotalPlayTime() + (System.currentTimeMillis() - player.getLastPlayTimeUpdate()) / 1000)); } From 6847b990356dad647e70a9df1f8584c13f4abddd Mon Sep 17 00:00:00 2001 From: Waverunner Date: Thu, 21 Aug 2014 14:07:13 -0400 Subject: [PATCH 6/8] Fixed missing parentheses in Buff.java ternary cast --- src/resources/buffs/Buff.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/resources/buffs/Buff.java b/src/resources/buffs/Buff.java index 21347856..d212ffc2 100644 --- a/src/resources/buffs/Buff.java +++ b/src/resources/buffs/Buff.java @@ -142,7 +142,7 @@ public class Buff extends Delta { public byte[] getBytes() { synchronized(objectMutex) { IoBuffer buffer = createBuffer(24); - buffer.putInt((int) (duration > 0) ? (totalPlayTime + getRemainingDuration()) : -1); + buffer.putInt((int) ((duration > 0) ? (totalPlayTime + getRemainingDuration()) : -1)); buffer.putInt(0); buffer.putInt((int) duration); buffer.putLong(ownerId); From 50cfb10673b39079047b1b8449b58ce961b4ae1f Mon Sep 17 00:00:00 2001 From: Treeku Date: Thu, 21 Aug 2014 21:11:23 +0100 Subject: [PATCH 7/8] See update notes... - Changed Buffs to track the buff giver as well as the buff receiver. - Fixed some potential buff time issues. --- src/resources/buffs/Buff.java | 50 +++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/src/resources/buffs/Buff.java b/src/resources/buffs/Buff.java index d212ffc2..50fdd88b 100644 --- a/src/resources/buffs/Buff.java +++ b/src/resources/buffs/Buff.java @@ -30,6 +30,7 @@ import main.NGECore; import org.apache.mina.core.buffer.IoBuffer; import resources.objects.creature.CreatureObject; +import resources.objects.player.PlayerObject; import engine.clientdata.ClientFileManager; import engine.clientdata.visitors.DatatableVisitor; @@ -43,7 +44,8 @@ public class Buff extends Delta { private int priority = 0; private float duration = 0; private String buffName = ""; - private long ownerId = 0; + private long bufferId = 0; + private long buffeeId = 0; private String effect1Name = "", effect2Name = "", effect3Name = "", effect4Name = "", effect5Name = ""; private float effect1Value, effect2Value, effect3Value, effect4Value, effect5Value; private String callback = ""; @@ -63,7 +65,9 @@ public class Buff extends Delta { private int stacks = 1; private long groupBufferId = 0; - public Buff(Buff baseBuff, long ownerId) { + public Buff(Buff baseBuff, long bufferId, long buffeeId) { + this.bufferId = bufferId; + this.buffeeId = buffeeId; this.buffName = baseBuff.getBuffName(); this.group1 = baseBuff.getGroup1(); this.group2 = baseBuff.getGroup2(); @@ -91,9 +95,10 @@ public class Buff extends Delta { this.decayOnPvPDeath = baseBuff.isDecayOnPvPDeath(); } - public Buff(String buffName, long ownerId) { + public Buff(String buffName, long bufferId, long buffeeId) { + this.bufferId = bufferId; + this.buffeeId = buffeeId; this.buffName = buffName; - this.ownerId = ownerId; DatatableVisitor visitor; @@ -140,19 +145,24 @@ public class Buff extends Delta { } public byte[] getBytes() { + // If getObject ever returns null here, it means there's a major bug with objects being in quadtree but not in objectList. + PlayerObject player = (PlayerObject) NGECore.getInstance().objectService.getObject(buffeeId).getSlottedObject("ghost"); + long lastPlayTimeUpdate = ((player == null) ? 0L : player.getLastPlayTimeUpdate()); + int remainingDuration = getRemainingDuration(); + synchronized(objectMutex) { + totalPlayTime = ((player == null) ? 0 : (int) (totalPlayTime + (System.currentTimeMillis() - lastPlayTimeUpdate) / 1000)); IoBuffer buffer = createBuffer(24); - buffer.putInt((int) ((duration > 0) ? (totalPlayTime + getRemainingDuration()) : -1)); + buffer.putInt((int) ((duration > 0) ? (totalPlayTime + remainingDuration) : -1)); buffer.putInt(0); buffer.putInt((int) duration); - buffer.putLong(ownerId); + buffer.putLong(bufferId); buffer.putInt(stacks); buffer.flip(); return buffer.array(); } } - public String getGroup1() { synchronized(objectMutex) { return group1; @@ -213,15 +223,27 @@ public class Buff extends Delta { } } - public long getOwnerId() { + public long getBufferId() { synchronized(objectMutex) { - return ownerId; + return bufferId; } } - public void setOwnerId(long ownerId) { + public void setBufferId(long bufferId) { synchronized(objectMutex) { - this.ownerId = ownerId; + this.bufferId = bufferId; + } + } + + public long getBuffeeId() { + synchronized(objectMutex) { + return buffeeId; + } + } + + public void setBuffeeId(long buffeeId) { + synchronized(objectMutex) { + this.buffeeId = buffeeId; } } @@ -531,9 +553,9 @@ public class Buff extends Delta { removalTask.cancel(true); final NGECore core = NGECore.getInstance(); - final CreatureObject owner = (CreatureObject) core.objectService.getObject(getOwnerId()); + final CreatureObject creature = (CreatureObject) core.objectService.getObject(getBuffeeId()); - if (owner == null) { + if (creature == null) { return; } @@ -542,7 +564,7 @@ public class Buff extends Delta { @Override public void run() { try { - core.buffService.removeBuffFromCreature(owner, Buff.this); + core.buffService.removeBuffFromCreature(creature, Buff.this); } catch (Exception e) { e.printStackTrace(); } From eaf6e7511c5a646d38298b652221a88583de81af Mon Sep 17 00:00:00 2001 From: Treeku Date: Thu, 21 Aug 2014 21:15:40 +0100 Subject: [PATCH 8/8] Minor addition to last commit. --- src/services/BuffService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/BuffService.java b/src/services/BuffService.java index 52441682..c9cb092e 100644 --- a/src/services/BuffService.java +++ b/src/services/BuffService.java @@ -145,7 +145,7 @@ public class BuffService implements INetworkDispatch { return null; } - final Buff buff = new Buff(buffMap.get(buffName), buffer.getObjectID()); + final Buff buff = new Buff(buffMap.get(buffName), buffer.getObjectID(), target.getObjectID()); if(target.getSlottedObject("ghost") != null) buff.setTotalPlayTime(((PlayerObject) target.getSlottedObject("ghost")).getTotalPlayTime()); else