diff --git a/cache/src/main/java/net/runelite/cache/definitions/ItemDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/ItemDefinition.java index 9c33a0b763..775b8936f1 100644 --- a/cache/src/main/java/net/runelite/cache/definitions/ItemDefinition.java +++ b/cache/src/main/java/net/runelite/cache/definitions/ItemDefinition.java @@ -24,6 +24,8 @@ */ package net.runelite.cache.definitions; +import java.util.Map; + public class ItemDefinition { public int id; @@ -96,6 +98,8 @@ public class ItemDefinition public int placeholderId = -1; public int placeholderTemplateId = -1; + public Map params = null; + public ItemDefinition(int definitionID) { this.id = definitionID; diff --git a/cache/src/main/java/net/runelite/cache/definitions/NpcDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/NpcDefinition.java index af09a402d0..79a5fd3d88 100644 --- a/cache/src/main/java/net/runelite/cache/definitions/NpcDefinition.java +++ b/cache/src/main/java/net/runelite/cache/definitions/NpcDefinition.java @@ -25,6 +25,8 @@ package net.runelite.cache.definitions; +import java.util.Map; + public class NpcDefinition { @@ -54,13 +56,14 @@ public class NpcDefinition public boolean hasRenderPriority = false; public int ambient = 0; public int headIcon = -1; - public int anInt2184 = 30; + //public int anInt2184 = 30; public int[] anIntArray2185; public short[] retextureToFind; public int anInt2187 = -1; public boolean isClickable = true; public int anInt2189 = -1; public boolean aBool2190 = false; + public Map params = null; public NpcDefinition(int definitionID) { diff --git a/cache/src/main/java/net/runelite/cache/definitions/ObjectDefinition.java b/cache/src/main/java/net/runelite/cache/definitions/ObjectDefinition.java index 725a50e42c..b33dd54f08 100644 --- a/cache/src/main/java/net/runelite/cache/definitions/ObjectDefinition.java +++ b/cache/src/main/java/net/runelite/cache/definitions/ObjectDefinition.java @@ -25,6 +25,8 @@ package net.runelite.cache.definitions; +import java.util.Map; + public class ObjectDefinition { private int id; @@ -70,6 +72,7 @@ public class ObjectDefinition private int anInt2112 = 0; private int anInt2113 = 0; private boolean aBool2114 = true; + private Map params = null; public int getId() { @@ -500,4 +503,14 @@ public class ObjectDefinition { this.aBool2114 = aBool2114; } + + public Map getParams() + { + return params; + } + + public void setParams(final Map params) + { + this.params = params; + } } diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/ItemLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/ItemLoader.java index 66eb776f45..408d38f370 100644 --- a/cache/src/main/java/net/runelite/cache/definitions/loaders/ItemLoader.java +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/ItemLoader.java @@ -30,6 +30,8 @@ import net.runelite.cache.io.InputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.HashMap; + public class ItemLoader { private static final Logger logger = LoggerFactory.getLogger(ItemLoader.class); @@ -254,6 +256,31 @@ public class ItemLoader { def.placeholderTemplateId = stream.readUnsignedShort(); } + else if (opcode == 249) + { + int length = stream.readUnsignedByte(); + + def.params = new HashMap<>(length); + + for (int i = 0; i < length; i++) + { + boolean isString = stream.readUnsignedByte() == 1; + int key = stream.read24BitInt(); + Object value; + + if (isString) + { + value = stream.readString(); + } + + else + { + value = stream.readInt(); + } + + def.params.put(key, value); + } + } else { logger.warn("Unrecognized opcode {}", opcode); diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/NpcLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/NpcLoader.java index a70039ed1e..0f3dc6c6a0 100644 --- a/cache/src/main/java/net/runelite/cache/definitions/loaders/NpcLoader.java +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/NpcLoader.java @@ -29,6 +29,8 @@ import net.runelite.cache.io.InputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.HashMap; + public class NpcLoader { private static final Logger logger = LoggerFactory.getLogger(NpcLoader.class); @@ -190,11 +192,11 @@ public class NpcLoader def.anInt2187 = stream.readUnsignedShort(); if ('\uffff' == def.anInt2187) { - def.anInt2187 = -40212193; + def.anInt2187 = -1; } length = stream.readUnsignedByte(); - def.anIntArray2185 = new int[length + 1]; + def.anIntArray2185 = new int[length + 2]; for (index = 0; index <= length; ++index) { @@ -205,6 +207,8 @@ public class NpcLoader } } + def.anIntArray2185[length + 1] = -1; + } else if (107 == opcode) { @@ -218,9 +222,68 @@ public class NpcLoader { def.aBool2190 = true; } - else if (opcode == 112) + //else if (opcode == 112) // Appears to be removed from the client + //{ + // def.anInt2184 = stream.readUnsignedByte(); + //} + else if (opcode == 118) { - def.anInt2184 = stream.readUnsignedByte(); + def.anInt2174 = stream.readUnsignedShort(); + if ('\uffff' == def.anInt2174) + { + def.anInt2174 = -1; + } + + def.anInt2187 = stream.readUnsignedShort(); + if ('\uffff' == def.anInt2187) + { + def.anInt2187 = -1; + } + + int var = stream.readUnsignedShort(); + if (var == 0xFFFF) + { + var = -1; + } + + length = stream.readUnsignedByte(); + def.anIntArray2185 = new int[length + 2]; + + for (index = 0; index <= length; ++index) + { + def.anIntArray2185[index] = stream.readUnsignedShort(); + if (def.anIntArray2185[index] == '\uffff') + { + def.anIntArray2185[index] = -1; + } + } + + def.anIntArray2185[length + 1] = var; + } + else if (opcode == 249) + { + length = stream.readUnsignedByte(); + + def.params = new HashMap<>(length); + + for (int i = 0; i < length; i++) + { + boolean isString = stream.readUnsignedByte() == 1; + int key = stream.read24BitInt(); + Object value; + + if (isString) + { + value = stream.readString(); + } + + else + { + value = stream.readInt(); + } + + def.params.put(key, value); + } } else { diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/ObjectLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/ObjectLoader.java index a55383d066..c629672214 100644 --- a/cache/src/main/java/net/runelite/cache/definitions/loaders/ObjectLoader.java +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/ObjectLoader.java @@ -29,6 +29,9 @@ import net.runelite.cache.io.InputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.HashMap; +import java.util.Map; + public class ObjectLoader { private static final Logger logger = LoggerFactory.getLogger(ObjectLoader.class); @@ -263,7 +266,7 @@ public class ObjectLoader def.setConfigId(configId); int length = is.readUnsignedByte(); - int[] configChangeDest = new int[length + 1]; + int[] configChangeDest = new int[length + 2]; for (int index = 0; index <= length; ++index) { @@ -274,6 +277,8 @@ public class ObjectLoader } } + configChangeDest[length + 1] = -1; + def.setConfigChangeDest(configChangeDest); } else if (opcode == 78) @@ -300,6 +305,71 @@ public class ObjectLoader { def.setAnInt2105(is.readUnsignedByte()); } + else if (opcode == 92) + { + int varpID = is.readUnsignedShort(); + if (varpID == 0xFFFF) + { + varpID = -1; + } + def.setVarpID(varpID); + + int configId = is.readUnsignedShort(); + if (configId == 0xFFFF) + { + configId = -1; + } + def.setConfigId(configId); + + + int var = is.readUnsignedShort(); + if (var == 0xFFFF) + { + var = -1; + } + + int length = is.readUnsignedByte(); + int[] configChangeDest = new int[length + 2]; + + for (int index = 0; index <= length; ++index) + { + configChangeDest[index] = is.readUnsignedShort(); + if (0xFFFF == configChangeDest[index]) + { + configChangeDest[index] = -1; + } + } + + configChangeDest[length + 1] = var; + + def.setConfigChangeDest(configChangeDest); + } + else if (opcode == 249) + { + int length = is.readUnsignedByte(); + + Map params = new HashMap<>(length); + for (int i = 0; i < length; i++) + { + boolean isString = is.readUnsignedByte() == 1; + int key = is.read24BitInt(); + Object value; + + if (isString) + { + value = is.readString(); + } + + else + { + value = is.readInt(); + } + + params.put(key, value); + } + + def.setParams(params); + } else { logger.warn("Unrecognized opcode {}", opcode);