From 658652bfd1bf946299cc4a855609c503643855c9 Mon Sep 17 00:00:00 2001 From: Mads Boddum Date: Fri, 9 Oct 2015 02:08:51 +0200 Subject: [PATCH 1/2] Fixed an issue that prevented equipping a weapon --- .../encodables/player/Equipment.java | 44 ++++++++++++++----- .../objects/creature/CreatureObject.java | 2 +- .../objects/weapon/WeaponObject.java | 28 +----------- 3 files changed, 34 insertions(+), 40 deletions(-) diff --git a/src/resources/encodables/player/Equipment.java b/src/resources/encodables/player/Equipment.java index 6178b1137..0efff434f 100644 --- a/src/resources/encodables/player/Equipment.java +++ b/src/resources/encodables/player/Equipment.java @@ -28,10 +28,13 @@ package resources.encodables.player; import network.packets.Packet; +import network.packets.swg.zone.baselines.Baseline.BaselineType; import resources.common.CRC; import resources.encodables.Encodable; +import resources.network.BaselineBuilder; import resources.objects.SWGObject; import resources.objects.weapon.WeaponObject; +import resources.player.Player; import java.io.Serializable; import java.nio.ByteBuffer; @@ -40,35 +43,36 @@ import java.nio.ByteOrder; public class Equipment implements Encodable, Serializable { private static final long serialVersionUID = 1L; -// private WeaponObject weapon; + private WeaponObject weapon; private byte[] customizationString; private int arrangementId = 4; private long objectId; private String template; + private Player weaponOwner; public Equipment(long objectId, String template) { this.objectId = objectId; this.template = template; } - public Equipment(WeaponObject weapon) { + public Equipment(WeaponObject weapon, Player weaponOwner) { this(weapon.getObjectId(), weapon.getTemplate()); -// this.weapon = weapon; + this.weapon = weapon; + this.weaponOwner = weaponOwner; } @Override public byte[] encode() { - // TODO: This is not working for weapons (crashes w/ a weapon), needs to be refactored ByteBuffer buffer; - //byte[] weaponData = null; + byte[] weaponData = null; -/* if (weapon != null) { - weaponData = weapon.encode(); + if (weapon != null) { + weaponData = weaponData(); buffer = ByteBuffer.allocate(19 + weaponData.length).order(ByteOrder.LITTLE_ENDIAN); - } else {*/ + } else { buffer = ByteBuffer.allocate(19).order(ByteOrder.LITTLE_ENDIAN); -/* }*/ + } if (customizationString == null) buffer.putShort((short) 0); // TODO: Create encodable class for customization string else buffer.put(customizationString); @@ -77,12 +81,12 @@ public class Equipment implements Encodable, Serializable { buffer.putLong(objectId); buffer.putInt(CRC.getCrc(template)); -/* if (weapon != null) { + if (weapon != null) { buffer.put((byte) 0x01); buffer.put(weaponData); - } else {*/ + } else { buffer.put((byte) 0x00); -/* }*/ + } return buffer.array(); } @@ -110,6 +114,22 @@ public class Equipment implements Encodable, Serializable { public String getTemplate() { return template; } public void setTemplate(String template) { this.template = template; } + private byte[] weaponData() { + BaselineBuilder bb = new BaselineBuilder(weapon, BaselineType.WEAO, 3); + weapon.createBaseline3(weaponOwner, bb); + byte[] data3 = bb.buildAsBaselinePacket(); + + bb = new BaselineBuilder(weapon, BaselineType.WEAO, 6); + weapon.createBaseline6(weaponOwner, bb); + byte[] data6 = bb.buildAsBaselinePacket(); + + byte[] ret = new byte[data3.length + data6.length]; + System.arraycopy(data3, 0, ret, 0, data3.length); + System.arraycopy(data6, 0, ret, data3.length, data6.length); + + return ret; + } + @Override public String toString() { return "Equipment: " + template; diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 9f2c7034d..6a20ea059 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -133,7 +133,7 @@ public class CreatureObject extends TangibleObject { public void addEquipment(SWGObject obj) { synchronized(equipmentList) { if (obj instanceof WeaponObject) - equipmentList.add(new Equipment((WeaponObject) obj)); + equipmentList.add(new Equipment((WeaponObject) obj, getOwner())); else equipmentList.add(new Equipment(obj.getObjectId(), obj.getTemplate())); equipmentList.sendDeltaMessage(this); diff --git a/src/resources/objects/weapon/WeaponObject.java b/src/resources/objects/weapon/WeaponObject.java index 3f0692570..67bb66949 100644 --- a/src/resources/objects/weapon/WeaponObject.java +++ b/src/resources/objects/weapon/WeaponObject.java @@ -28,14 +28,11 @@ package resources.objects.weapon; import network.packets.swg.zone.baselines.Baseline.BaselineType; -import resources.encodables.Encodable; import resources.network.BaselineBuilder; import resources.objects.tangible.TangibleObject; import resources.player.Player; -import java.nio.ByteBuffer; - -public class WeaponObject extends TangibleObject implements Encodable { +public class WeaponObject extends TangibleObject { private static final long serialVersionUID = 1L; @@ -128,27 +125,4 @@ public class WeaponObject extends TangibleObject implements Encodable { super.createBaseline9(target, bb); } - @Override - public byte[] encode() { - // TODO: Refactor, causes crashes - BaselineBuilder bb = new BaselineBuilder(this, BaselineType.WEAO, 3); - createBaseline3(null, bb); - byte[] data3 = bb.buildAsBaselinePacket(); - - bb = new BaselineBuilder(this, BaselineType.WEAO, 6); - createBaseline6(null, bb); // TODO: This needs to have a target otherwise null pointer will be thrown, new encode function in encodable? - byte[] data6 = bb.buildAsBaselinePacket(); - - byte[] ret = new byte[data3.length + data6.length]; - System.arraycopy(data3, 0, ret, 0, data3.length); - System.arraycopy(data6, 0, ret, data3.length, data6.length); - - return ret; - } - - @Override - public void decode(ByteBuffer data) { - // TODO: Implement decode method in WeaponObject - } - } From d88da7dbf5d733ad15b5c0ca1b8d5ed99b12d3d3 Mon Sep 17 00:00:00 2001 From: Mads Boddum Date: Fri, 9 Oct 2015 02:17:14 +0200 Subject: [PATCH 2/2] Renamed weaponData() in Equipment to getWeaponData() --- src/resources/encodables/player/Equipment.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/resources/encodables/player/Equipment.java b/src/resources/encodables/player/Equipment.java index 0efff434f..68d0d7fc1 100644 --- a/src/resources/encodables/player/Equipment.java +++ b/src/resources/encodables/player/Equipment.java @@ -67,7 +67,7 @@ public class Equipment implements Encodable, Serializable { byte[] weaponData = null; if (weapon != null) { - weaponData = weaponData(); + weaponData = getWeaponData(); buffer = ByteBuffer.allocate(19 + weaponData.length).order(ByteOrder.LITTLE_ENDIAN); } else { @@ -114,7 +114,7 @@ public class Equipment implements Encodable, Serializable { public String getTemplate() { return template; } public void setTemplate(String template) { this.template = template; } - private byte[] weaponData() { + private byte[] getWeaponData() { BaselineBuilder bb = new BaselineBuilder(weapon, BaselineType.WEAO, 3); weapon.createBaseline3(weaponOwner, bb); byte[] data3 = bb.buildAsBaselinePacket();