From d79754f93167386d0bcf5667f29a4089b4d80673 Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Thu, 4 Jun 2020 01:49:58 +0200 Subject: [PATCH] add HFloorItems constructPacket() --- .../gearth/extensions/parsers/HFloorItem.java | 158 ++++++++++-------- .../gearth/extensions/parsers/HStuff.java | 91 ++++++++++ .../main/java/gearth/protocol/HPacket.java | 38 +++-- 3 files changed, 201 insertions(+), 86 deletions(-) create mode 100644 G-Earth/src/main/java/gearth/extensions/parsers/HStuff.java diff --git a/G-Earth/src/main/java/gearth/extensions/parsers/HFloorItem.java b/G-Earth/src/main/java/gearth/extensions/parsers/HFloorItem.java index 9f703dc..251ca30 100644 --- a/G-Earth/src/main/java/gearth/extensions/parsers/HFloorItem.java +++ b/G-Earth/src/main/java/gearth/extensions/parsers/HFloorItem.java @@ -2,7 +2,9 @@ package gearth.extensions.parsers; import gearth.protocol.HPacket; -import java.util.HashMap; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; public class HFloorItem implements IFurni { private int id; @@ -16,6 +18,11 @@ public class HFloorItem implements IFurni { private int usagePolicy; private int ownerId; private String ownerName; + private Object[] stuff; + + private String ignore1; + private Integer ignore2; + private String ignore3; public HFloorItem(HPacket packet) { id = packet.readInteger(); @@ -27,91 +34,31 @@ public class HFloorItem implements IFurni { tile = new HPoint(x, y, Double.parseDouble(packet.readString())); - packet.readString(); - packet.readInteger(); + ignore1 = packet.readString(); + ignore2 = packet.readInteger(); category = packet.readInteger(); - setStuffData(packet); + stuff = HStuff.readData(packet, category); secondsToExpiration = packet.readInteger(); usagePolicy = packet.readInteger(); ownerId = packet.readInteger(); - if (typeId < 0) - packet.readString(); - - } - - private void setStuffData(HPacket packet) - { - switch(category & 255) - { - case 0: // RegularFurni - packet.readString(); - break; - case 1: // MapStuffData - { - int max = packet.readInteger(); - for (int i = 0; i < max; i++) { - packet.readString(); - packet.readString(); - } - } - break; - case 2: // StringArrayStuffData - { - int max = packet.readInteger(); - for (int i = 0; i < max; i++) - packet.readString(); - } - break; - case 3: // idk about this one lol - packet.readString(); - packet.readInteger(); - break; - case 4: // neither about this one - break; - case 5: // IntArrayStuffData - { - int max = packet.readInteger(); - - for (int i = 0; i < max; i++) - packet.readInteger(); - } - break; - case 6: // HighScoreStuffData - { - packet.readString(); - packet.readInteger(); - packet.readInteger(); - int max = packet.readInteger(); - - for (int i = 0; i < max; i++) { - packet.readInteger(); - int dataCount = packet.readInteger(); - for (int j = 0; j < dataCount; j++) - packet.readString(); - } - } - break; - case 7: // Crackables (Eggs and stuff) - packet.readString(); - packet.readInteger(); - packet.readInteger(); - break; + if (typeId < 0) { + ignore3 = packet.readString(); } - if ((category & 0xFF00 & 0x100) > 0) - { - packet.readInteger(); - packet.readInteger(); + else { + ignore3 = null; } + + } public static HFloorItem[] parse(HPacket packet) { int ownersCount = packet.readInteger(); - HashMap owners = new HashMap<>(ownersCount); + Map owners = new HashMap<>(ownersCount); for (int i = 0; i < ownersCount; i++) owners.put(packet.readInteger(), packet.readString()); @@ -126,6 +73,75 @@ public class HFloorItem implements IFurni { return furniture; } + public static HPacket constructPacket(HFloorItem[] floorItems, int headerId) { + Map owners = new HashMap<>(); + for (HFloorItem floorItem : floorItems) { + owners.put(floorItem.ownerId, floorItem.getOwnerName()); + } + + HPacket packet = new HPacket(headerId); + packet.appendInt(owners.size()); + for (Integer ownerId : owners.keySet()) { + packet.appendInt(ownerId); + packet.appendString(owners.get(ownerId)); + } + + packet.appendInt(floorItems.length); + for (HFloorItem floorItem : floorItems) { +// id = packet.readInteger(); + packet.appendInt(floorItem.id); + +// typeId = packet.readInteger(); + packet.appendInt(floorItem.typeId); + +// int x = packet.readInteger(); + packet.appendInt(floorItem.tile.getX()); + +// int y = packet.readInteger(); + packet.appendInt(floorItem.tile.getY()); + +// facing = HDirection.values()[packet.readInteger()]; + packet.appendInt(floorItem.facing.ordinal()); + +// tile = new HPoint(x, y, Double.parseDouble(packet.readString())); + packet.appendString(floorItem.tile.getZ() + ""); + + +// ignore1 = packet.readString(); + packet.appendString(floorItem.ignore1); + +// ignore2 = packet.readInteger(); + packet.appendInt(floorItem.ignore2); + +// category = packet.readInteger(); + packet.appendInt(floorItem.category); + + +// stuff = HStuff.readData(packet, category); + for (Object object : floorItem.stuff) { + packet.appendObject(object); + } + +// secondsToExpiration = packet.readInteger(); + packet.appendInt(floorItem.secondsToExpiration); + +// usagePolicy = packet.readInteger(); + packet.appendInt(floorItem.usagePolicy); + +// ownerId = packet.readInteger(); + packet.appendInt(floorItem.ownerId); + + + if (floorItem.typeId < 0) { + // ignore3 = packet.readString(); + packet.appendString(floorItem.ignore3); + } + } + + return packet; + } + + @Override public int getId() { return id; diff --git a/G-Earth/src/main/java/gearth/extensions/parsers/HStuff.java b/G-Earth/src/main/java/gearth/extensions/parsers/HStuff.java new file mode 100644 index 0000000..041a93e --- /dev/null +++ b/G-Earth/src/main/java/gearth/extensions/parsers/HStuff.java @@ -0,0 +1,91 @@ +package gearth.extensions.parsers; + +import gearth.protocol.HPacket; + +import java.util.ArrayList; +import java.util.List; + +public class HStuff { + + public static Object[] readData(HPacket packet, int category) { + List values = new ArrayList<>(); + switch (category & 0xFF) + { + case 0: /* LegacyStuffData */ { + values.add(packet.readString()); + break; + } + case 1: /* MapStuffData */ { + int count = packet.readInteger(); + values.add(count); + + for (int j = 0; j < count; j++) + { + values.add(packet.readString()); + values.add(packet.readString()); + } + break; + } + case 2: /* StringArrayStuffData */ { + int count = packet.readInteger(); + values.add(count); + + for (int j = 0; j < count; j++) + { + values.add(packet.readString()); + } + break; + } + case 3: /* VoteResultStuffData */ { + values.add(packet.readString()); + values.add(packet.readInteger()); + break; + } + case 5: /* IntArrayStuffData */ { + int count = packet.readInteger(); + values.add(count); + + for (int j = 0; j < count; j++) + { + values.add(packet.readInteger()); + } + break; + } + case 6: /* HighScoreStuffData */ { + values.add(packet.readString()); + values.add(packet.readInteger()); + values.add(packet.readInteger()); + + int count = packet.readInteger(); + values.add(count); + + for (int j = 0; j < count; j++) + { + int score = packet.readInteger(); + values.add(score); + + int subCount = packet.readInteger(); + values.add(subCount); + + for (int k = 0; k < subCount; k++) + { + values.add(packet.readString()); + } + } + break; + } + case 7: /* CrackableStuffData */ { + values.add(packet.readString()); + values.add(packet.readInteger()); + values.add(packet.readInteger()); + break; + } + } + if ((category & 0xFF00 & 0x100) > 0) { + values.add(packet.readInteger()); + values.add(packet.readInteger()); + } + return values.toArray(); + } + +} diff --git a/G-Earth/src/main/java/gearth/protocol/HPacket.java b/G-Earth/src/main/java/gearth/protocol/HPacket.java index 924f04a..dc5a02e 100644 --- a/G-Earth/src/main/java/gearth/protocol/HPacket.java +++ b/G-Earth/src/main/java/gearth/protocol/HPacket.java @@ -54,21 +54,7 @@ public class HPacket implements StringifyAble { this(header); for (int i = 0; i < objects.length; i++) { Object o = objects[i]; - if (o instanceof Byte) { - appendByte((Byte)o); - } - else if (o instanceof Integer) { - appendInt((Integer)o); - } - else if (o instanceof String) { - appendString((String)o); - } - else if (o instanceof Boolean) { - appendBoolean((Boolean) o); - } - else { - throw new InvalidParameterException(); - } + appendObject(o); } isEdited = false; @@ -475,6 +461,28 @@ public class HPacket implements StringifyAble { appendBytes(s.getBytes(StandardCharsets.ISO_8859_1)); return this; } + public HPacket appendObject(Object o) throws InvalidParameterException { + isEdited = true; + + if (o instanceof Byte) { + appendByte((Byte)o); + } + else if (o instanceof Integer) { + appendInt((Integer)o); + } + else if (o instanceof String) { + appendString((String)o); + } + else if (o instanceof Boolean) { + appendBoolean((Boolean) o); + } + else { + throw new InvalidParameterException(); + } + + return this; + } + public HPacket removeFrom(int index) { return removeRange(index, packetInBytes.length - index);