Merge pull request #151 from WiredSpast/master

Reformat StuffData
This commit is contained in:
sirjonasxx 2023-03-30 22:12:26 +02:00 committed by GitHub
commit 8de3d5cdd4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 1010 additions and 149 deletions

View File

@ -1,10 +1,9 @@
package gearth.extensions.parsers; package gearth.extensions.parsers;
import gearth.extensions.parsers.stuffdata.IStuffData;
import gearth.protocol.HPacket; import gearth.protocol.HPacket;
import java.util.*; import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
public class HFloorItem implements IFurni { public class HFloorItem implements IFurni {
private int id; private int id;
@ -12,17 +11,15 @@ public class HFloorItem implements IFurni {
private HPoint tile; private HPoint tile;
private HDirection facing; private HDirection facing;
private int category;
private int secondsToExpiration; private int secondsToExpiration;
private int usagePolicy; private int usagePolicy;
private int ownerId; private int ownerId;
private String ownerName; private String ownerName;
private Object[] stuff; private IStuffData stuff;
private String ignore1; private String sizeZ;
private Integer ignore2; private Integer extra;
private String ignore3; private String staticClass;
public HFloorItem(HPacket packet) { public HFloorItem(HPacket packet) {
id = packet.readInteger(); id = packet.readInteger();
@ -34,12 +31,10 @@ public class HFloorItem implements IFurni {
tile = new HPoint(x, y, Double.parseDouble(packet.readString())); tile = new HPoint(x, y, Double.parseDouble(packet.readString()));
ignore1 = packet.readString(); sizeZ = packet.readString();
ignore2 = packet.readInteger(); extra = packet.readInteger();
category = packet.readInteger(); stuff = IStuffData.read(packet);
stuff = HStuff.readData(packet, category);
secondsToExpiration = packet.readInteger(); secondsToExpiration = packet.readInteger();
usagePolicy = packet.readInteger(); usagePolicy = packet.readInteger();
@ -47,13 +42,11 @@ public class HFloorItem implements IFurni {
ownerId = packet.readInteger(); ownerId = packet.readInteger();
if (typeId < 0) { if (typeId < 0) {
ignore3 = packet.readString(); staticClass = packet.readString();
} }
else { else {
ignore3 = null; staticClass = null;
} }
} }
public void appendToPacket(HPacket packet) { public void appendToPacket(HPacket packet) {
@ -76,20 +69,14 @@ public class HFloorItem implements IFurni {
packet.appendString(tile.getZ() + ""); packet.appendString(tile.getZ() + "");
// ignore1 = packet.readString(); // sizeZ = packet.readString();
packet.appendString(ignore1); packet.appendString(sizeZ);
// ignore2 = packet.readInteger(); // extra = packet.readInteger();
packet.appendInt(ignore2); packet.appendInt(extra);
// category = packet.readInteger(); // stuff = IStuffData.read(packet);
packet.appendInt(category); stuff.appendToPacket(packet);
// stuff = HStuff.readData(packet, category);
for (Object object : stuff) {
packet.appendObject(object);
}
// secondsToExpiration = packet.readInteger(); // secondsToExpiration = packet.readInteger();
packet.appendInt(secondsToExpiration); packet.appendInt(secondsToExpiration);
@ -102,8 +89,8 @@ public class HFloorItem implements IFurni {
if (typeId < 0) { if (typeId < 0) {
// ignore3 = packet.readString(); // staticClass = packet.readString();
packet.appendString(ignore3); packet.appendString(staticClass);
} }
} }
@ -174,9 +161,9 @@ public class HFloorItem implements IFurni {
return secondsToExpiration; return secondsToExpiration;
} }
public int getCategory() { // public int getCategory() {
return category; // return category;
} // }
public HDirection getFacing() { public HDirection getFacing() {
return facing; return facing;
@ -186,7 +173,7 @@ public class HFloorItem implements IFurni {
return tile; return tile;
} }
public Object[] getStuff() { public IStuffData getStuff() {
return stuff; return stuff;
} }
@ -210,9 +197,9 @@ public class HFloorItem implements IFurni {
this.facing = facing; this.facing = facing;
} }
public void setCategory(int category) { // public void setCategory(int category) {
this.category = category; // this.category = category;
} // }
public void setSecondsToExpiration(int secondsToExpiration) { public void setSecondsToExpiration(int secondsToExpiration) {
this.secondsToExpiration = secondsToExpiration; this.secondsToExpiration = secondsToExpiration;
@ -226,7 +213,7 @@ public class HFloorItem implements IFurni {
this.ownerId = ownerId; this.ownerId = ownerId;
} }
public void setStuff(Object[] stuff) { public void setStuff(IStuffData stuff) {
this.stuff = stuff; this.stuff = stuff;
} }
} }

View File

@ -1,5 +1,6 @@
package gearth.extensions.parsers; package gearth.extensions.parsers;
import gearth.extensions.parsers.stuffdata.IStuffData;
import gearth.protocol.HPacket; import gearth.protocol.HPacket;
public class HInventoryItem { public class HInventoryItem {
@ -8,8 +9,7 @@ public class HInventoryItem {
private int id; private int id;
private int typeId; private int typeId;
private HSpecialType specialType; private HSpecialType specialType;
private int category; private IStuffData stuff;
private Object[] stuff;
private boolean recyclable; private boolean recyclable;
private boolean tradeable; private boolean tradeable;
private boolean groupable; private boolean groupable;
@ -27,8 +27,7 @@ public class HInventoryItem {
id = packet.readInteger(); id = packet.readInteger();
typeId = packet.readInteger(); typeId = packet.readInteger();
specialType = HSpecialType.fromId(packet.readInteger()); specialType = HSpecialType.fromId(packet.readInteger());
category = packet.readInteger(); stuff = IStuffData.read(packet);
stuff = HStuff.readData(packet, category);
recyclable = packet.readBoolean(); recyclable = packet.readBoolean();
tradeable = packet.readBoolean(); tradeable = packet.readBoolean();
groupable = packet.readBoolean(); groupable = packet.readBoolean();
@ -49,11 +48,7 @@ public class HInventoryItem {
packet.appendInt(id); packet.appendInt(id);
packet.appendInt(typeId); packet.appendInt(typeId);
packet.appendInt(specialType.getId()); packet.appendInt(specialType.getId());
packet.appendInt(category); stuff.appendToPacket(packet);
for (Object object : stuff) {
packet.appendObject(object);
}
packet.appendBoolean(recyclable); packet.appendBoolean(recyclable);
packet.appendBoolean(tradeable); packet.appendBoolean(tradeable);
@ -133,19 +128,11 @@ public class HInventoryItem {
this.typeId = typeId; this.typeId = typeId;
} }
public int getCategory() { public IStuffData getStuff() {
return category;
}
public void setCategory(int category) {
this.category = category;
}
public Object[] getStuff() {
return stuff; return stuff;
} }
public void setStuff(Object[] stuff) { public void setStuff(IStuffData stuff) {
this.stuff = stuff; this.stuff = stuff;
} }

View File

@ -1,91 +0,0 @@
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

@ -0,0 +1,173 @@
package gearth.extensions.parsers.stuffdata;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.UnaryOperator;
import java.util.stream.Stream;
/**
* Wrapper class to make IntArrayStuffData and StringArrayStuffData behave like a List
* @param <T> Value class
*/
public class ArrayStuffData<T> extends StuffDataBase implements List<T> {
protected List<T> values = new ArrayList<>();
public ArrayStuffData() {
super();
}
public ArrayStuffData(int uniqueSerialNumber, int uniqueSerialSize) {
super(uniqueSerialNumber, uniqueSerialSize);
}
@Override
public int size() {
return values.size();
}
@Override
public boolean isEmpty() {
return values.isEmpty();
}
@Override
public boolean contains(Object o) {
return values.contains(o);
}
@Override
public Iterator<T> iterator() {
return values.iterator();
}
@Override
public void forEach(Consumer<? super T> action) {
values.forEach(action);
}
@Override
public Object[] toArray() {
return values.toArray();
}
@Override
public <T1> T1[] toArray(T1[] a) {
return values.toArray(a);
}
@Override
public boolean add(T t) {
return values.add(t);
}
@Override
public boolean remove(Object o) {
return values.remove(o);
}
@Override
public boolean containsAll(Collection<?> c) {
return values.containsAll(c);
}
@Override
public boolean addAll(Collection<? extends T> c) {
return values.addAll(c);
}
@Override
public boolean addAll(int index, Collection<? extends T> c) {
return values.addAll(index, c);
}
@Override
public boolean removeAll(Collection<?> c) {
return values.removeAll(c);
}
@Override
public boolean removeIf(Predicate<? super T> filter) {
return values.removeIf(filter);
}
@Override
public boolean retainAll(Collection<?> c) {
return values.retainAll(c);
}
@Override
public void replaceAll(UnaryOperator<T> operator) {
values.replaceAll(operator);
}
@Override
public void sort(Comparator<? super T> c) {
values.sort(c);
}
@Override
public void clear() {
values.clear();
}
@Override
public T get(int index) {
return values.get(index);
}
@Override
public T set(int index, T element) {
return values.set(index, element);
}
@Override
public void add(int index, T element) {
values.add(index, element);
}
@Override
public T remove(int index) {
return values.remove(index);
}
@Override
public int indexOf(Object o) {
return values.indexOf(o);
}
@Override
public int lastIndexOf(Object o) {
return values.lastIndexOf(o);
}
@Override
public ListIterator<T> listIterator() {
return values.listIterator();
}
@Override
public ListIterator<T> listIterator(int index) {
return values.listIterator(index);
}
@Override
public List<T> subList(int fromIndex, int toIndex) {
return values.subList(fromIndex, toIndex);
}
@Override
public Spliterator<T> spliterator() {
return values.spliterator();
}
@Override
public Stream<T> stream() {
return values.stream();
}
@Override
public Stream<T> parallelStream() {
return values.parallelStream();
}
}

View File

@ -0,0 +1,73 @@
package gearth.extensions.parsers.stuffdata;
import gearth.protocol.HPacket;
public class CrackableStuffData extends StuffDataBase {
public final static int IDENTIFIER = 7;
private String legacyString = "";
private int hits = 0;
private int target = 0;
protected CrackableStuffData() {}
public CrackableStuffData(String legacyString, int hits, int target) {
super();
this.legacyString = legacyString == null ? "" : legacyString;
this.hits = hits;
this.target = target;
}
public CrackableStuffData(int uniqueSerialNumber, int uniqueSerialSize, String legacyString, int hits, int target) {
super(uniqueSerialNumber, uniqueSerialSize);
this.legacyString = legacyString == null ? "" : legacyString;
this.hits = hits;
this.target = target;
}
@Override
protected void initialize(HPacket packet) {
this.legacyString = packet.readString();
this.hits = packet.readInteger();
this.target = packet.readInteger();
super.initialize(packet);
}
@Override
public void appendToPacket(HPacket packet) {
packet.appendInt(IDENTIFIER | this.getFlags());
packet.appendObjects(
this.legacyString,
this.hits,
this.target
);
super.appendToPacket(packet);
}
@Override
public String getLegacyString() {
return this.legacyString;
}
@Override
public void setLegacyString(String legacyString) {
this.legacyString = legacyString;
}
public int getHits() {
return this.hits;
}
public void setHits(int hits) {
this.hits = hits;
}
public int getTarget() {
return this.target;
}
public void setTarget(int target) {
this.target = target;
}
}

View File

@ -0,0 +1,26 @@
package gearth.extensions.parsers.stuffdata;
import gearth.protocol.HPacket;
public class EmptyStuffData extends StuffDataBase {
public final static int IDENTIFIER = 4;
public EmptyStuffData() {
super();
}
public EmptyStuffData(int uniqueSerialNumber, int uniqueSerialSize) {
super(uniqueSerialNumber, uniqueSerialSize);
}
@Override
protected void initialize(HPacket packet) {
super.initialize(packet);
}
@Override
public void appendToPacket(HPacket packet) {
packet.appendInt(IDENTIFIER | this.getFlags());
super.appendToPacket(packet);
}
}

View File

@ -0,0 +1,53 @@
package gearth.extensions.parsers.stuffdata;
import gearth.protocol.HPacket;
import java.util.Arrays;
import java.util.Objects;
public class HighScoreData {
private int score;
private String[] users;
protected HighScoreData(HPacket packet) {
this.score = packet.readInteger();
int size = packet.readInteger();
this.users = new String[size];
for (int i = 0; i < size; i++) {
this.users[i] = packet.readString();
}
}
public HighScoreData(int score, String... users) {
super();
this.score = score;
this.users = Arrays.stream(users).filter(Objects::nonNull).toArray(String[]::new);
}
protected void appendToPacket(HPacket packet) {
packet.appendInt(this.score);
packet.appendInt(this.users.length);
for (String user : this.users) {
packet.appendString(user);
}
}
public int getScore() {
return this.score;
}
public void setScore(int score) {
this.score = score;
}
public String[] getUsers() {
return this.users.clone();
}
public void setUsers(String[] users) {
this.users = Arrays
.stream(users == null ? new String[0] : users)
.filter(Objects::nonNull)
.toArray(String[]::new);
}
}

View File

@ -0,0 +1,99 @@
package gearth.extensions.parsers.stuffdata;
import gearth.protocol.HPacket;
import java.util.Arrays;
import java.util.Objects;
public class HighScoreStuffData extends StuffDataBase {
public final static int IDENTIFIER = 6;
private String legacyString = "";
// ['perteam', 'mostwins', 'classic', 'fastesttime', 'longesttime']
private int scoreType = 0;
// ['alltime', 'daily', 'weekly', 'monthly']
private int clearType = 0;
private HighScoreData[] entries = {};
protected HighScoreStuffData() {}
public HighScoreStuffData(String legacyString, int scoreType, int clearType, HighScoreData... entries) {
super();
this.legacyString = legacyString == null ? "" : legacyString;
this.scoreType = scoreType;
this.clearType = clearType;
this.entries = Arrays.stream(entries).filter(Objects::nonNull).toArray(HighScoreData[]::new);
}
public HighScoreStuffData(int uniqueSerialNumber, int uniqueSerialSize, String legacyString, int scoreType, int clearType, HighScoreData... entries) {
super(uniqueSerialNumber, uniqueSerialSize);
this.legacyString = legacyString == null ? "" : legacyString;
this.scoreType = scoreType;
this.clearType = clearType;
this.entries = Arrays.stream(entries).filter(Objects::nonNull).toArray(HighScoreData[]::new);
}
@Override
protected void initialize(HPacket packet) {
this.legacyString = packet.readString();
this.scoreType = packet.readInteger();
this.clearType = packet.readInteger();
int size = packet.readInteger();
this.entries = new HighScoreData[size];
for (int i = 0; i < size; i++) {
this.entries[i] = new HighScoreData(packet);
}
}
@Override
public void appendToPacket(HPacket packet) {
packet.appendInt(IDENTIFIER | this.getFlags());
packet.appendObjects(
this.legacyString,
this.scoreType,
this.clearType,
this.entries.length
);
for (HighScoreData entry : this.entries) {
entry.appendToPacket(packet);
}
}
@Override
public String getLegacyString() {
return this.legacyString;
}
@Override
public void setLegacyString(String legacyString) {
this.legacyString = legacyString;
}
public int getScoreType() {
return this.scoreType;
}
public void setScoreType(int scoreType) {
this.scoreType = scoreType;
}
public int getClearType() {
return this.clearType;
}
public void setClearType(int clearType) {
this.clearType = clearType;
}
public HighScoreData[] getEntries() {
return this.entries.clone();
}
public void setEntries(HighScoreData[] entries) {
this.entries = Arrays
.stream(entries == null ? new HighScoreData[0] : entries)
.filter(Objects::nonNull)
.toArray(HighScoreData[]::new);
}
}

View File

@ -0,0 +1,66 @@
package gearth.extensions.parsers.stuffdata;
import gearth.protocol.HPacket;
public interface IStuffData {
static IStuffData read(HPacket packet) {
int a = packet.readInteger();
StuffDataBase stuffData = null;
switch (a & 255) {
case LegacyStuffData.IDENTIFIER:
stuffData = new LegacyStuffData();
break;
case MapStuffData.IDENTIFIER:
stuffData = new MapStuffData();
break;
case StringArrayStuffData.IDENTIFIER:
stuffData = new StringArrayStuffData();
break;
case VoteResultStuffData.IDENTIFIER:
stuffData = new VoteResultStuffData();
break;
case EmptyStuffData.IDENTIFIER:
stuffData = new EmptyStuffData();
break;
case IntArrayStuffData.IDENTIFIER:
stuffData = new IntArrayStuffData();
break;
case HighScoreStuffData.IDENTIFIER:
stuffData = new HighScoreStuffData();
break;
case CrackableStuffData.IDENTIFIER:
stuffData = new CrackableStuffData();
break;
}
if (stuffData != null) {
stuffData.setFlags(a & 65280);
stuffData.initialize(packet);
} else {
throw new RuntimeException("Unknown stuffdata type");
}
return stuffData;
}
void appendToPacket(HPacket packet);
String getLegacyString();
void setLegacyString(String legacyString);
void setFlags(int flags);
int getFlags();
int getUniqueSerialNumber();
int getUniqueSerialSize();
void setUniqueSerialNumber(int uniqueSerialNumber);
void setUniqueSerialSize(int uniqueSerialSize);
int getRarityLevel();
int getState();
void setState(int state);
String getJSONValue(String key);
}

View File

@ -0,0 +1,53 @@
package gearth.extensions.parsers.stuffdata;
import gearth.protocol.HPacket;
import java.util.Arrays;
// 5
public class IntArrayStuffData extends ArrayStuffData<Integer> {
public final static int IDENTIFIER = 5;
protected IntArrayStuffData() {}
public IntArrayStuffData(Integer... values) {
super();
this.values = Arrays.asList(values);
}
public IntArrayStuffData(int uniqueSerialNumber, int uniqueSerialSize, Integer... values) {
super(uniqueSerialNumber, uniqueSerialSize);
this.values = Arrays.asList(values);
}
@Override
protected void initialize(HPacket packet) {
int size = packet.readInteger();
this.clear();
for (int i = 0; i < size; i++) {
this.add(packet.readInteger());
}
super.initialize(packet);
}
@Override
public void appendToPacket(HPacket packet) {
packet.appendInt(IDENTIFIER | this.getFlags());
packet.appendInt(this.size());
for (int i : this) {
packet.appendInt(i);
}
super.appendToPacket(packet);
}
@Override
public String getLegacyString() {
return this.size() > 0 ? String.valueOf(this.get(0)) : "";
}
@Override
public void setLegacyString(String legacyString) {
if (this.size() > 0)
this.set(0, Integer.parseInt(legacyString));
}
}

View File

@ -0,0 +1,43 @@
package gearth.extensions.parsers.stuffdata;
import gearth.protocol.HPacket;
public class LegacyStuffData extends StuffDataBase {
public final static int IDENTIFIER = 0;
private String legacyString;
protected LegacyStuffData() {}
public LegacyStuffData(String legacyString) {
this.legacyString = legacyString == null ? "" : legacyString;
}
public LegacyStuffData(int uniqueSerialNumber, int uniqueSerialSize, String legacyString) {
super(uniqueSerialNumber, uniqueSerialSize);
this.legacyString = legacyString == null ? "" : legacyString;
}
@Override
protected void initialize(HPacket packet) {
this.legacyString = packet.readString();
super.initialize(packet);
}
@Override
public void appendToPacket(HPacket packet) {
packet.appendInt(IDENTIFIER | this.getFlags());
packet.appendString(this.legacyString);
super.appendToPacket(packet);
}
@Override
public String getLegacyString() {
return this.legacyString;
}
@Override
public void setLegacyString(String legacyString) {
this.legacyString = legacyString;
}
}

View File

@ -0,0 +1,177 @@
package gearth.extensions.parsers.stuffdata;
import gearth.protocol.HPacket;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.stream.Collectors;
public class MapStuffData extends StuffDataBase implements Map<String, String> {
public final static int IDENTIFIER = 1;
private Map<String, String> map = new HashMap<>();
protected MapStuffData() {}
public MapStuffData(HashMap<String, String> map) {
this.map = map == null ? new HashMap<>() : map.entrySet().stream().filter(e -> e.getValue() != null).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> y, HashMap::new));
}
public MapStuffData(int uniqueSerialNumber, int uniqueSerialSize, HashMap<String, String> map) {
super(uniqueSerialNumber, uniqueSerialSize);
this.map = map == null ? new HashMap<>() : map.entrySet().stream().filter(e -> e.getValue() != null).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> y, HashMap::new));
}
@Override
protected void initialize(HPacket packet) {
int size = packet.readInteger();
this.clear();
for (int i = 0; i < size; i++) {
this.put(packet.readString(), packet.readString());
}
super.initialize(packet);
}
@Override
public void appendToPacket(HPacket packet) {
packet.appendInt(IDENTIFIER | this.getFlags());
packet.appendInt(this.size());
for (Entry<String, String> entry : this.entrySet()) {
packet.appendObjects(
entry.getKey(),
entry.getValue() == null ? "" : entry.getValue()
);
}
super.appendToPacket(packet);
}
@Override
public String getLegacyString() {
return this.getOrDefault("state", "");
}
@Override
public void setLegacyString(String legacyString) {
this.put("state", legacyString == null ? "" : legacyString);
}
@Override
public int size() {
return this.map.size();
}
@Override
public boolean isEmpty() {
return this.map.isEmpty();
}
@Override
public boolean containsKey(Object key) {
return this.map.containsKey(key);
}
@Override
public boolean containsValue(Object value) {
return this.map.containsValue(value);
}
@Override
public String get(Object key) {
return this.map.get(key);
}
@Override
public String put(String key, String value) {
return this.map.put(key, value);
}
@Override
public String remove(Object key) {
return this.map.remove(key);
}
@Override
public void putAll(Map<? extends String, ? extends String> m) {
this.map.putAll(m);
}
@Override
public void clear() {
this.map.clear();
}
@Override
public Set<String> keySet() {
return this.map.keySet();
}
@Override
public Collection<String> values() {
return this.map.values();
}
@Override
public Set<Entry<String, String>> entrySet() {
return this.map.entrySet();
}
@Override
public String getOrDefault(Object key, String defaultValue) {
return this.map.getOrDefault(key, defaultValue);
}
@Override
public void forEach(BiConsumer<? super String, ? super String> action) {
this.map.forEach(action);
}
@Override
public void replaceAll(BiFunction<? super String, ? super String, ? extends String> function) {
this.map.replaceAll(function);
}
@Override
public String putIfAbsent(String key, String value) {
return this.map.putIfAbsent(key, value);
}
@Override
public boolean remove(Object key, Object value) {
return this.map.remove(key, value);
}
@Override
public boolean replace(String key, String oldValue, String newValue) {
return this.map.replace(key, oldValue, newValue);
}
@Override
public String replace(String key, String value) {
return this.map.replace(key, value);
}
@Override
public String computeIfAbsent(String key, Function<? super String, ? extends String> mappingFunction) {
return this.map.computeIfAbsent(key, mappingFunction);
}
@Override
public String computeIfPresent(String key, BiFunction<? super String, ? super String, ? extends String> remappingFunction) {
return this.map.computeIfPresent(key, remappingFunction);
}
@Override
public String compute(String key, BiFunction<? super String, ? super String, ? extends String> remappingFunction) {
return this.map.compute(key, remappingFunction);
}
@Override
public String merge(String key, String value, BiFunction<? super String, ? super String, ? extends String> remappingFunction) {
return this.map.merge(key, value, remappingFunction);
}
}

View File

@ -0,0 +1,55 @@
package gearth.extensions.parsers.stuffdata;
import gearth.protocol.HPacket;
import java.util.Arrays;
import java.util.Objects;
import java.util.stream.Collectors;
// 2
public class StringArrayStuffData extends ArrayStuffData<String> {
public final static int IDENTIFIER = 2;
protected StringArrayStuffData() {}
public StringArrayStuffData(String... array) {
this.values = Arrays.stream(array).filter(Objects::nonNull).collect(Collectors.toList());
}
public StringArrayStuffData(int uniqueSerialNumber, int uniqueSerialSize, String... array) {
super(uniqueSerialNumber, uniqueSerialSize);
this.values = Arrays.stream(array).filter(Objects::nonNull).collect(Collectors.toList());
}
@Override
protected void initialize(HPacket packet) {
int size = packet.readInteger();
this.clear();
for (int i = 0; i < size; i++) {
this.add(packet.readString());
}
super.initialize(packet);
}
@Override
public void appendToPacket(HPacket packet) {
packet.appendInt(IDENTIFIER | this.getFlags());
packet.appendInt(this.size());
for (String s : this) {
packet.appendString(s);
}
super.appendToPacket(packet);
}
@Override
public String getLegacyString() {
return this.size() > 0 ? this.get(0) : "";
}
@Override
public void setLegacyString(String legacyString) {
if (this.size() > 0) {
this.set(0, legacyString == null ? "" : legacyString);
}
}
}

View File

@ -0,0 +1,98 @@
package gearth.extensions.parsers.stuffdata;
import gearth.protocol.HPacket;
import org.json.JSONObject;
public abstract class StuffDataBase implements IStuffData {
private int flags = 0;
private int uniqueSerialNumber = 0;
private int uniqueSerialSize = 0;
protected StuffDataBase() {}
protected StuffDataBase(int uniqueSerialNumber, int uniqueSerialSize) {
this.uniqueSerialNumber = uniqueSerialNumber;
this.uniqueSerialSize = uniqueSerialSize;
flags = 256;
}
protected void initialize(HPacket packet) {
if ((flags & 256) > 0) {
this.uniqueSerialNumber = packet.readInteger();
this.uniqueSerialSize = packet.readInteger();
}
}
public void appendToPacket(HPacket packet) {
if ((flags & 256) > 0) {
packet.appendInt(this.uniqueSerialNumber);
packet.appendInt(this.uniqueSerialSize);
}
}
@Override
public String getLegacyString() {
return "";
}
@Override
public void setLegacyString(String legacyString) {}
@Override
public final void setFlags(int flags) {
this.flags = flags;
}
@Override
public final int getFlags() {
return this.flags;
}
@Override
public final int getUniqueSerialNumber() {
return this.uniqueSerialNumber;
}
@Override
public final int getUniqueSerialSize() {
return this.uniqueSerialSize;
}
@Override
public final void setUniqueSerialNumber(int uniqueSerialNumber) {
this.uniqueSerialNumber = uniqueSerialNumber;
}
@Override
public final void setUniqueSerialSize(int uniqueSerialSize) {
this.uniqueSerialSize = uniqueSerialSize;
}
@Override
public int getRarityLevel() {
return -1;
}
@Override
public final int getState() {
try {
return Integer.parseInt(getLegacyString());
} catch (Exception e) {
return -1;
}
}
@Override
public final void setState(int state) {
setLegacyString(String.valueOf(state));
}
@Override
public final String getJSONValue(String key) {
try {
return new JSONObject(getLegacyString()).getString(key);
} catch (Exception e) {
return "";
}
}
}

View File

@ -0,0 +1,58 @@
package gearth.extensions.parsers.stuffdata;
import gearth.protocol.HPacket;
public class VoteResultStuffData extends StuffDataBase {
public static final int IDENTIFIER = 3;
private String legacyString = "";
private int result = 0;
protected VoteResultStuffData() {}
public VoteResultStuffData(String legacyString, int result) {
this.legacyString = legacyString == null ? "" : legacyString;
this.result = result;
}
public VoteResultStuffData(int uniqueSerialNumber, int uniqueSerialSize, String legacyString, int result) {
super(uniqueSerialNumber, uniqueSerialSize);
this.legacyString = legacyString == null ? "" : legacyString;
this.result = result;
}
@Override
protected void initialize(HPacket packet) {
this.legacyString = packet.readString();
this.result = packet.readInteger();
super.initialize(packet);
}
@Override
public void appendToPacket(HPacket packet) {
packet.appendInt(IDENTIFIER | this.getFlags());
packet.appendObjects(
this.legacyString,
this.result
);
super.appendToPacket(packet);
}
@Override
public String getLegacyString() {
return this.legacyString;
}
@Override
public void setLegacyString(String legacyString) {
this.legacyString = legacyString == null ? "" : legacyString;
}
public int getResult() {
return this.result;
}
public void setResult(int result) {
this.result = result;
}
}

View File

@ -134,6 +134,10 @@ public class MacOsHabboClient extends HabboClient {
private static byte[] hexStringToByteArray(String s) { private static byte[] hexStringToByteArray(String s) {
int len = s.length(); int len = s.length();
if (len % 2 == 1) {
s = "0" + s;
len += 1;
}
byte[] data = new byte[len / 2]; byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) { for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)