add HFloorItems constructPacket()

This commit is contained in:
sirjonasxx 2020-06-04 01:49:58 +02:00
parent 64c6f35b2f
commit d79754f931
3 changed files with 201 additions and 86 deletions

View File

@ -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<Integer, String> owners = new HashMap<>(ownersCount);
Map<Integer, String> 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<Integer, String> 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;

View File

@ -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<Object> 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();
}
}

View File

@ -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);