From b13fb15490b0588d8d973c3bcf43095d235c24d2 Mon Sep 17 00:00:00 2001 From: Obique PSWG Date: Sat, 24 Jun 2017 20:22:50 -0500 Subject: [PATCH] Wandered in the dark until I figured out what broke zone-in --- src/network/PacketType.java | 2 +- .../encodables/OutOfBandPackage.java | 4 +- src/resources/encodables/ProsePackage.java | 2 +- .../encodables/player/Equipment.java | 43 +++++++++------- src/resources/network/BaselineObject.java | 51 +++++++++++-------- .../objects/awareness/AwarenessHandler.java | 6 ++- .../objects/creature/CreatureObject.java | 6 --- .../objects/mission/MissionObject.java | 12 ----- .../objects/staticobject/StaticObject.java | 7 +-- .../objects/tangible/TangibleObject.java | 8 --- 10 files changed, 65 insertions(+), 76 deletions(-) diff --git a/src/network/PacketType.java b/src/network/PacketType.java index 7848d74ff..324617278 100644 --- a/src/network/PacketType.java +++ b/src/network/PacketType.java @@ -362,7 +362,7 @@ public enum PacketType { public static SWGPacket getForCrc(int crc) { PacketType type = packetMap.get(crc); - if (type == null) + if (type == null || type == UNKNOWN) return null; Class c = type.c; try { diff --git a/src/resources/encodables/OutOfBandPackage.java b/src/resources/encodables/OutOfBandPackage.java index 2189a0a21..d193ccfbb 100644 --- a/src/resources/encodables/OutOfBandPackage.java +++ b/src/resources/encodables/OutOfBandPackage.java @@ -81,7 +81,7 @@ public class OutOfBandPackage implements Encodable, Persistable { int padding = data.getShort(); Type type = Type.getTypeForByte(data.getByte()); unpackOutOfBandData(data, type); - data.position(data.position() + padding); + data.seek(padding); remaining -= data.position() - start; } } @@ -170,7 +170,7 @@ public class OutOfBandPackage implements Encodable, Persistable { private static final EnumLookup LOOKUP = new EnumLookup<>(Type.class, t -> t.getType()); - byte type; + private byte type; Type(int type) { this.type = (byte) type; diff --git a/src/resources/encodables/ProsePackage.java b/src/resources/encodables/ProsePackage.java index 7301c0dd7..b1ac3bca9 100644 --- a/src/resources/encodables/ProsePackage.java +++ b/src/resources/encodables/ProsePackage.java @@ -274,7 +274,7 @@ public class ProsePackage implements OutOfBandData { return base.hashCode() * 3 + actor.hashCode() * 7 + target.hashCode() * 13 + other.hashCode() * 17 + (grammarFlag ? 1 : 0) + di * 19 + ((int) (df * 23)); } - private static class Prose implements Encodable, Persistable { + public static class Prose implements Encodable, Persistable { private long objectId; private StringId stringId; diff --git a/src/resources/encodables/player/Equipment.java b/src/resources/encodables/player/Equipment.java index 57b1c93c0..c5bf2518b 100644 --- a/src/resources/encodables/player/Equipment.java +++ b/src/resources/encodables/player/Equipment.java @@ -39,13 +39,12 @@ import resources.objects.SWGObject; import resources.objects.tangible.TangibleObject; import resources.objects.weapon.WeaponObject; import resources.persistable.SWGObjectFactory; -import resources.player.Player; import services.objects.ObjectCreator; public class Equipment implements Encodable, Persistable { private TangibleObject weapon; - private byte [] customizationString; + private byte[] customizationString; private int arrangementId; private long objectId; private CRC template; @@ -70,14 +69,14 @@ public class Equipment implements Encodable, Persistable { @Override public byte [] encode() { - byte [] weaponData = (weapon != null) ? getWeaponData() : new byte[0]; - - NetBuffer buffer = NetBuffer.allocate(17 + weaponData.length + customizationString.length + template.getLength()); + boolean hasWeapon = weapon != null; + byte [] weaponData = hasWeapon ? getWeaponData() : new byte[0]; + NetBuffer buffer = NetBuffer.allocate(getLength(weaponData.length)); buffer.addArray(customizationString); // TODO: Create encodable class for customization string buffer.addInt(arrangementId); buffer.addLong(objectId); buffer.addEncodable(template); - buffer.addBoolean(weapon != null); + buffer.addBoolean(hasWeapon); buffer.addRawArray(weaponData); return buffer.array(); } @@ -94,7 +93,13 @@ public class Equipment implements Encodable, Persistable { @Override public int getLength() { - return 19 + (weapon != null ? getWeaponData().length : 0); + boolean hasWeapon = weapon != null; + int weaponLength = hasWeapon ? getWeaponData().length : 0; + return getLength(weaponLength); + } + + private int getLength(int weaponLength) { + return 15 + weaponLength + customizationString.length + template.getLength(); } @Override @@ -120,8 +125,8 @@ public class Equipment implements Encodable, Persistable { weapon = (TangibleObject) SWGObjectFactory.create(stream); } - public byte[] getCustomizationString() {return customizationString;} - public void setCustomizationString(byte[] customizationString) { this.customizationString = customizationString; } + public byte [] getCustomizationString() {return customizationString;} + public void setCustomizationString(byte [] customizationString) { this.customizationString = customizationString; } public int getArrangementId() { return arrangementId; } public void setArrangementId(int arrangementId) { this.arrangementId = arrangementId; } @@ -136,17 +141,17 @@ public class Equipment implements Encodable, Persistable { public void setWeapon(TangibleObject weapon) { this.weapon = weapon; } private byte[] getWeaponData() { - Player target = weapon.getOwner(); - NetBuffer data3 = weapon.createBaseline3(target).encode(); - data3.position(0); - - NetBuffer data6 = weapon.createBaseline6(target).encode(); - data6.position(0); + if (weapon == null) + return new byte[0]; + NetBuffer data3 = weapon.createBaseline3(null).encode(); + NetBuffer data6 = weapon.createBaseline6(null).encode(); - NetBuffer ret = NetBuffer.allocate(data3.remaining() + data6.remaining()); - ret.addRawArray(data3.array()); - ret.addRawArray(data6.array()); - return ret.array(); + int data3Size = data3.limit(); + int data6Size = data6.limit(); + byte [] ret = new byte[data3Size + data6Size]; + System.arraycopy(data3.array(), 0, ret, 0, data3Size); + System.arraycopy(data6.array(), 0, ret, data3Size, data6Size); + return ret; } private TangibleObject createWeaponFromData(NetBuffer data) { diff --git a/src/resources/network/BaselineObject.java b/src/resources/network/BaselineObject.java index e15cdf582..b60f16574 100644 --- a/src/resources/network/BaselineObject.java +++ b/src/resources/network/BaselineObject.java @@ -30,6 +30,8 @@ package resources.network; import java.io.IOException; import java.io.ObjectInputStream; import java.lang.ref.SoftReference; +import java.nio.BufferOverflowException; +import java.nio.BufferUnderflowException; import java.util.ArrayList; import java.util.List; @@ -71,28 +73,33 @@ public class BaselineObject { public void parseBaseline(Baseline baseline) { NetBuffer buffer = NetBuffer.wrap(baseline.getBaselineData()); buffer.getShort(); - switch (baseline.getNum()) { - case 1: - parseBaseline1(buffer); - break; - case 3: - parseBaseline3(buffer); - break; - case 4: - parseBaseline4(buffer); - break; - case 6: - parseBaseline6(buffer); - break; - case 7: - parseBaseline7(buffer); - break; - case 8: - parseBaseline8(buffer); - break; - case 9: - parseBaseline9(buffer); - break; + try { + switch (baseline.getNum()) { + case 1: + parseBaseline1(buffer); + break; + case 3: + parseBaseline3(buffer); + break; + case 4: + parseBaseline4(buffer); + break; + case 6: + parseBaseline6(buffer); + break; + case 7: + parseBaseline7(buffer); + break; + case 8: + parseBaseline8(buffer); + break; + case 9: + parseBaseline9(buffer); + break; + } + } catch (BufferUnderflowException | BufferOverflowException e) { + Log.e("Failed to parse baseline %s %d with object: %s", baseline.getType(), baseline.getNum(), this); + Log.e(e); } } diff --git a/src/resources/objects/awareness/AwarenessHandler.java b/src/resources/objects/awareness/AwarenessHandler.java index 763374c91..4048fd4ba 100644 --- a/src/resources/objects/awareness/AwarenessHandler.java +++ b/src/resources/objects/awareness/AwarenessHandler.java @@ -37,6 +37,8 @@ import com.projectswg.common.debug.Log; import resources.objects.SWGObject; import resources.objects.awareness.TerrainMap.TerrainMapCallback; +import resources.objects.creature.CreatureObject; +import resources.objects.creature.CreatureState; public class AwarenessHandler implements AutoCloseable { @@ -80,7 +82,7 @@ public class AwarenessHandler implements AutoCloseable { } // Update location obj.setLocation(requestedLocation); - if (obj.getParent() != null) + if (obj.getParent() != null && !(obj instanceof CreatureObject && ((CreatureObject) obj).isStatesBitmask(CreatureState.RIDING_MOUNT))) obj.moveToContainer(null); obj.onObjectMoved(); // Update awareness @@ -101,7 +103,7 @@ public class AwarenessHandler implements AutoCloseable { if (oldMap != null) oldMap.removeWithoutUpdate(obj); // Update location - if (obj.getParent() != parent) + if (obj.getParent() != parent && !(obj instanceof CreatureObject && ((CreatureObject) obj).isStatesBitmask(CreatureState.RIDING_MOUNT))) obj.moveToContainer(parent); obj.setLocation(requestedLocation); obj.onObjectMoved(); diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 44db46e54..3e41c74e7 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -983,8 +983,6 @@ public class CreatureObject extends TangibleObject { @Override protected void parseBaseline3(NetBuffer buffer) { super.parseBaseline3(buffer); - if (getStringId().toString().equals("@obj_n:unknown_object")) - return; posture = Posture.getFromId(buffer.getByte()); factionRank = buffer.getByte(); ownerId = buffer.getLong(); @@ -996,16 +994,12 @@ public class CreatureObject extends TangibleObject { @Override protected void parseBaseline4(NetBuffer buffer) { super.parseBaseline4(buffer); - if (getStringId().toString().equals("@obj_n:unknown_object")) - return; creo4.parseBaseline4(buffer); } @Override protected void parseBaseline6(NetBuffer buffer) { super.parseBaseline6(buffer); - if (getStringId().toString().equals("@obj_n:unknown_object")) - return; creo6.parseBaseline6(buffer); } diff --git a/src/resources/objects/mission/MissionObject.java b/src/resources/objects/mission/MissionObject.java index 018747233..d7f8c111f 100644 --- a/src/resources/objects/mission/MissionObject.java +++ b/src/resources/objects/mission/MissionObject.java @@ -78,12 +78,6 @@ public class MissionObject extends IntangibleObject { bb.addObject(waypoint); } - @Override - public void createBaseline6(Player target, BaselineBuilder bb) { - super.createBaseline6(target, bb); - bb.addInt(-1); - } - @Override public void parseBaseline3(NetBuffer buffer) { super.parseBaseline3(buffer); @@ -106,12 +100,6 @@ public class MissionObject extends IntangibleObject { waypoint.decode(buffer); } - @Override - public void parseBaseline6(NetBuffer buffer) { - super.parseBaseline6(buffer); - buffer.getInt(); - } - @Override public void save(NetBufferStream stream) { super.save(stream); diff --git a/src/resources/objects/staticobject/StaticObject.java b/src/resources/objects/staticobject/StaticObject.java index 461fbf8a4..f4b13ca8f 100644 --- a/src/resources/objects/staticobject/StaticObject.java +++ b/src/resources/objects/staticobject/StaticObject.java @@ -29,12 +29,13 @@ package resources.objects.staticobject; import com.projectswg.common.network.NetBufferStream; -import resources.objects.creature.CreatureObject; +import network.packets.swg.zone.baselines.Baseline.BaselineType; +import resources.objects.SWGObject; -public class StaticObject extends CreatureObject { +public class StaticObject extends SWGObject { public StaticObject(long objectId) { - super(objectId); + super(objectId, BaselineType.STAO); } @Override diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index a2168b1b3..4d56d7036 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -294,8 +294,6 @@ public class TangibleObject extends SWGObject { @Override protected void createBaseline3(Player target, BaselineBuilder bb) { super.createBaseline3(target, bb); // 4 variables - BASE3 (4) - if (getStringId().toString().equals("@obj_n:unknown_object")) - return; bb.addInt(pvpFaction.getCrc()); // Faction - 4 bb.addInt(pvpStatus.getValue()); // Faction Status - 5 bb.addArray(appearanceData); // - 6 @@ -313,8 +311,6 @@ public class TangibleObject extends SWGObject { @Override protected void createBaseline6(Player target, BaselineBuilder bb) { super.createBaseline6(target, bb); - if (getStringId().toString().equals("@obj_n:unknown_object")) - return; bb.addBoolean(inCombat); // 2 - Combat flag bb.addObject(defenders); // 3 - Defenders List (Set, Long) bb.addInt(0); // 4 - Map color @@ -330,8 +326,6 @@ public class TangibleObject extends SWGObject { @Override protected void parseBaseline3(NetBuffer buffer) { super.parseBaseline3(buffer); - if (getStringId().toString().equals("@obj_n:unknown_object")) - return; pvpFaction = PvpFaction.getFactionForCrc(buffer.getInt()); pvpStatus = PvpStatus.getStatusForValue(buffer.getInt()); appearanceData = buffer.getArray(); @@ -346,8 +340,6 @@ public class TangibleObject extends SWGObject { @Override protected void parseBaseline6(NetBuffer buffer) { super.parseBaseline6(buffer); - if (getStringId().toString().equals("@obj_n:unknown_object")) - return; inCombat = buffer.getBoolean(); defenders = SWGSet.getSwgSet(buffer, 6, 3, Long.TYPE); buffer.getInt();