Merge pull request #5394 from Abextm/if-cache-names

cache: Name InterfaceDefinition
This commit is contained in:
Adam
2018-09-12 08:12:38 -04:00
committed by GitHub
5 changed files with 357 additions and 260 deletions

View File

@@ -0,0 +1,61 @@
/*
* Copyright (c) 2018 Abex
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.cache.definitions;
import lombok.RequiredArgsConstructor;
public class ClientScript1Instruction
{
@RequiredArgsConstructor
public enum Opcode
{
RETURN(0),
BOOSTED_SKILL_LEVELS(1),
REAL_SKILL_LEVELS(1),
SKILL_EXPERIENCE(1),
WIDGET_CONTAINS_ITEM_GET_QUANTITY(3),
VARP(1),
EXPERIENCE_AT_LEVEL_FOR_SKILL(1),
VARP_TIMES_469(1),
COMBAT_LEVEL(1),
TOTAL_LEVEL(0),
WIDGET_CONTAINS_ITEM_STAR(3),
RUN_ENERGY(0),
WEIGHT(0),
VARP_TESTBIT(2),
VARBIT(1),
MINUS(0),
DIV(0),
MUL(0),
WORLD_X(0),
WORLD_Y(1),
CONSTANT(1);
public final int argumentCount;
}
public Opcode opcode;
public int[] operands;
}

View File

@@ -27,102 +27,102 @@ package net.runelite.cache.definitions;
public class InterfaceDefinition public class InterfaceDefinition
{ {
public int id = -1; public int id = -1;
public boolean hasScript = true; public boolean isIf3 = false;
public int type; public int type;
public int contentType; public int contentType;
public int originalX; public int originalX;
public int originalY; public int originalY;
public int originalWidth; public int originalWidth;
public int field2231; public int originalHeight;
public int field2226; public int widthMode;
public int field2227; public int heightMode;
public int field2351; public int xPositionMode;
public int field2217; public int yPositionMode;
public int parentId = -1; public int parentId = -1;
public boolean isHidden; public boolean isHidden;
public int scrollWidth; public int scrollWidth;
public int scrollHeight; public int scrollHeight;
public boolean field2210; public boolean noClickThrough;
public int spriteId; public int spriteId;
public int field2294; public int textureId;
public boolean field2257; public boolean spriteTiling;
public int opacity; public int opacity;
public int borderThickness; public int borderType;
public int sprite2; public int shadowColor;
public boolean flippedVertically; public boolean flippedVertically;
public boolean flippedHorizontally; public boolean flippedHorizontally;
public int modelType; public int modelType;
public int modelId; public int modelId;
public int field2268; public int offsetX2d;
public int field2269; public int offsetY2d;
public int rotationX; public int rotationX;
public int rotationY; public int rotationY;
public int rotationZ; public int rotationZ;
public int modelZoom; public int modelZoom;
public int field2266; public int animation;
public boolean field2296; public boolean orthogonal;
public int field2274; public int modelHeightOverride;
public int fontId; public int fontId;
public String text; public String text;
public int field2212; public int lineHeight;
public int field2219; public int xTextAlignment;
public int field2283; public int yTextAlignment;
public boolean textShadowed; public boolean textShadowed;
public int textColor; public int textColor;
public boolean field2267; public boolean filled;
public int field2218; public int lineWidth;
public boolean field2253; public boolean lineDirection;
public int config; public int clickMask;
public String name; public String name;
public String[] actions; public String[] actions;
public int field2295; public int dragDeadZone;
public int field2223; public int dragDeadTime;
public boolean field2297; public boolean dragRenderBehavior;
public String selectedAction; public String targetVerb;
public Object[] field2225; public Object[] onLoadListener;
public Object[] field2300; public Object[] onMouseOverListener;
public Object[] field2248; public Object[] onMouseLeaveListener;
public Object[] field2311; public Object[] onTargetLeaveListener;
public Object[] field2350; public Object[] onTargetEnterListener;
public Object[] field2312; public Object[] onVarTransmitListener;
public Object[] field2314; public Object[] onInvTransmitListener;
public Object[] field2316; public Object[] onStatTransmitListener;
public Object[] field2318; public Object[] onTimerListener;
public Object[] field2319; public Object[] onOpListener;
public Object[] field2306; public Object[] onMouseRepeatListener;
public Object[] field2337; public Object[] onClickListener;
public Object[] field2287; public Object[] onClickRepeatListener;
public Object[] field2303; public Object[] onReleaseListener;
public Object[] field2304; public Object[] onHoldListener;
public Object[] field2308; public Object[] onDragListener;
public Object[] field2310; public Object[] onDragCompleteListener;
public Object[] field2262; public Object[] onScrollWheelListener;
public int[] field2313; public int[] varTransmitTriggers;
public int[] field2315; public int[] invTransmitTriggers;
public int[] field2282; public int[] statTransmitTriggers;
public boolean field2299; public boolean hasListener;
public int field2222; public int menuType;
public int field2334; // This is set to a siblings' child id when that widget should get a hover effect when this one is hovered
public int[] tableActions; public int hoveredSiblingId;
public int[] field2333; public int[] alternateOperators;
public int[][] dynamicValues; public int[] alternateRhs;
public ClientScript1Instruction[][] clientScripts;
public int[] itemIds; public int[] itemIds;
public int[] itemQuantities; public int[] itemQuantities;
public int paddingX; public int xPitch;
public int paddingY; public int yPitch;
public int[] xSprites; public int[] xOffsets;
public int[] field2288; public int[] yOffsets;
public int[] field2289; public int[] sprites;
public String[] configActions; public String[] configActions;
public String field2241; public String alternateText;
public int field2245; public int alternateTextColor;
public int field2280; public int hoveredTextColor;
public int field2247; public int alternateHoveredTextColor;
public int field2332; public int alternateSpriteId;
public int field2264; public int alternateModelId;
public int field2265; public int alternateAnimation;
public int field2276; public String spellName;
public String field2335;
public String tooltip; public String tooltip;
} }

View File

@@ -24,6 +24,10 @@
*/ */
package net.runelite.cache.definitions.loaders; package net.runelite.cache.definitions.loaders;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import net.runelite.cache.definitions.ClientScript1Instruction;
import net.runelite.cache.definitions.InterfaceDefinition; import net.runelite.cache.definitions.InterfaceDefinition;
import net.runelite.cache.io.InputStream; import net.runelite.cache.io.InputStream;
@@ -35,54 +39,54 @@ public class InterfaceLoader
iface.id = id; iface.id = id;
if (b[0] == -1) if (b[0] == -1)
{ {
method3252(iface, new InputStream(b)); decodeIf3(iface, new InputStream(b));
} }
else else
{ {
method3251(iface, new InputStream(b)); decodeIf1(iface, new InputStream(b));
} }
return iface; return iface;
} }
private void method3251(InterfaceDefinition iface, InputStream var1) private void decodeIf1(InterfaceDefinition iface, InputStream var1)
{ {
iface.hasScript = false; iface.isIf3 = false;
iface.type = var1.readUnsignedByte(); iface.type = var1.readUnsignedByte();
iface.field2222 = var1.readUnsignedByte(); iface.menuType = var1.readUnsignedByte();
iface.contentType = var1.readUnsignedShort(); iface.contentType = var1.readUnsignedShort();
iface.originalX = var1.readShort(); iface.originalX = var1.readShort();
iface.originalY = var1.readShort(); iface.originalY = var1.readShort();
iface.originalWidth = var1.readUnsignedShort(); iface.originalWidth = var1.readUnsignedShort();
iface.field2231 = var1.readUnsignedShort(); iface.originalHeight = var1.readUnsignedShort();
iface.opacity = var1.readUnsignedByte(); iface.opacity = var1.readUnsignedByte();
iface.parentId = var1.readUnsignedShort(); iface.parentId = var1.readUnsignedShort();
if (iface.parentId == '\uffff') if (iface.parentId == 0xFFFF)
{ {
iface.parentId = -1; iface.parentId = -1;
} }
else else
{ {
iface.parentId += iface.id & -65536; iface.parentId += iface.id & ~0xFFFF;
} }
iface.field2334 = var1.readUnsignedShort(); iface.hoveredSiblingId = var1.readUnsignedShort();
if (iface.field2334 == '\uffff') if (iface.hoveredSiblingId == 0xFFFF)
{ {
iface.field2334 = -1; iface.hoveredSiblingId = -1;
} }
int var2 = var1.readUnsignedByte(); int var2 = var1.readUnsignedByte();
int var3; int var3;
if (var2 > 0) if (var2 > 0)
{ {
iface.tableActions = new int[var2]; iface.alternateOperators = new int[var2];
iface.field2333 = new int[var2]; iface.alternateRhs = new int[var2];
for (var3 = 0; var3 < var2; ++var3) for (var3 = 0; var3 < var2; ++var3)
{ {
iface.tableActions[var3] = var1.readUnsignedByte(); iface.alternateOperators[var3] = var1.readUnsignedByte();
iface.field2333[var3] = var1.readUnsignedShort(); iface.alternateRhs[var3] = var1.readUnsignedShort();
} }
} }
@@ -92,20 +96,35 @@ public class InterfaceLoader
int var6; int var6;
if (var3 > 0) if (var3 > 0)
{ {
iface.dynamicValues = new int[var3][]; iface.clientScripts = new ClientScript1Instruction[var3][];
for (var4 = 0; var4 < var3; ++var4) for (var4 = 0; var4 < var3; ++var4)
{ {
var5 = var1.readUnsignedShort(); var5 = var1.readUnsignedShort();
iface.dynamicValues[var4] = new int[var5]; int[] bytecode = new int[var5];
for (var6 = 0; var6 < var5; ++var6) for (var6 = 0; var6 < var5; ++var6)
{ {
iface.dynamicValues[var4][var6] = var1.readUnsignedShort(); bytecode[var6] = var1.readUnsignedShort();
if (iface.dynamicValues[var4][var6] == '\uffff') if (bytecode[var6] == 0xFFFF)
{ {
iface.dynamicValues[var4][var6] = -1; bytecode[var6] = -1;
} }
List<ClientScript1Instruction> instructions = new ArrayList<>();
for (int i = 0; i < bytecode.length;)
{
ClientScript1Instruction ins = new ClientScript1Instruction();
ins.opcode = ClientScript1Instruction.Opcode.values()[bytecode[i++]];
int ac = ins.opcode.argumentCount;
ins.operands = Arrays.copyOfRange(bytecode, i, i + ac);
instructions.add(ins);
i += ac;
}
iface.clientScripts[var4] = instructions.toArray(new ClientScript1Instruction[0]);
} }
} }
} }
@@ -124,37 +143,37 @@ public class InterfaceLoader
if (iface.type == 2) if (iface.type == 2)
{ {
iface.itemIds = new int[iface.originalWidth * iface.field2231]; iface.itemIds = new int[iface.originalWidth * iface.originalHeight];
iface.itemQuantities = new int[iface.field2231 * iface.originalWidth]; iface.itemQuantities = new int[iface.originalHeight * iface.originalWidth];
var4 = var1.readUnsignedByte(); var4 = var1.readUnsignedByte();
if (var4 == 1) if (var4 == 1)
{ {
iface.config |= 268435456; iface.clickMask |= 268435456;
} }
var5 = var1.readUnsignedByte(); var5 = var1.readUnsignedByte();
if (var5 == 1) if (var5 == 1)
{ {
iface.config |= 1073741824; iface.clickMask |= 1073741824;
} }
var6 = var1.readUnsignedByte(); var6 = var1.readUnsignedByte();
if (var6 == 1) if (var6 == 1)
{ {
iface.config |= Integer.MIN_VALUE; iface.clickMask |= Integer.MIN_VALUE;
} }
int var7 = var1.readUnsignedByte(); int var7 = var1.readUnsignedByte();
if (var7 == 1) if (var7 == 1)
{ {
iface.config |= 536870912; iface.clickMask |= 536870912;
} }
iface.paddingX = var1.readUnsignedByte(); iface.xPitch = var1.readUnsignedByte();
iface.paddingY = var1.readUnsignedByte(); iface.yPitch = var1.readUnsignedByte();
iface.xSprites = new int[20]; iface.xOffsets = new int[20];
iface.field2288 = new int[20]; iface.yOffsets = new int[20];
iface.field2289 = new int[20]; iface.sprites = new int[20];
int var8; int var8;
for (var8 = 0; var8 < 20; ++var8) for (var8 = 0; var8 < 20; ++var8)
@@ -162,13 +181,13 @@ public class InterfaceLoader
int var9 = var1.readUnsignedByte(); int var9 = var1.readUnsignedByte();
if (var9 == 1) if (var9 == 1)
{ {
iface.xSprites[var8] = var1.readShort(); iface.xOffsets[var8] = var1.readShort();
iface.field2288[var8] = var1.readShort(); iface.yOffsets[var8] = var1.readShort();
iface.field2289[var8] = var1.readInt(); iface.sprites[var8] = var1.readInt();
} }
else else
{ {
iface.field2289[var8] = -1; iface.sprites[var8] = -1;
} }
} }
@@ -180,23 +199,23 @@ public class InterfaceLoader
if (var11.length() > 0) if (var11.length() > 0)
{ {
iface.configActions[var8] = var11; iface.configActions[var8] = var11;
iface.config |= 1 << var8 + 23; iface.clickMask |= 1 << var8 + 23;
} }
} }
} }
if (iface.type == 3) if (iface.type == 3)
{ {
iface.field2267 = var1.readUnsignedByte() == 1; iface.filled = var1.readUnsignedByte() == 1;
} }
if (iface.type == 4 || iface.type == 1) if (iface.type == 4 || iface.type == 1)
{ {
iface.field2219 = var1.readUnsignedByte(); iface.xTextAlignment = var1.readUnsignedByte();
iface.field2283 = var1.readUnsignedByte(); iface.yTextAlignment = var1.readUnsignedByte();
iface.field2212 = var1.readUnsignedByte(); iface.lineHeight = var1.readUnsignedByte();
iface.fontId = var1.readUnsignedShort(); iface.fontId = var1.readUnsignedShort();
if (iface.fontId == '\uffff') if (iface.fontId == 0xFFFF)
{ {
iface.fontId = -1; iface.fontId = -1;
} }
@@ -207,7 +226,7 @@ public class InterfaceLoader
if (iface.type == 4) if (iface.type == 4)
{ {
iface.text = var1.readString(); iface.text = var1.readString();
iface.field2241 = var1.readString(); iface.alternateText = var1.readString();
} }
if (iface.type == 1 || iface.type == 3 || iface.type == 4) if (iface.type == 1 || iface.type == 3 || iface.type == 4)
@@ -217,43 +236,42 @@ public class InterfaceLoader
if (iface.type == 3 || iface.type == 4) if (iface.type == 3 || iface.type == 4)
{ {
iface.field2245 = var1.readInt(); iface.alternateTextColor = var1.readInt();
iface.field2280 = var1.readInt(); iface.hoveredTextColor = var1.readInt();
iface.field2247 = var1.readInt(); iface.alternateHoveredTextColor = var1.readInt();
} }
if (iface.type == 5) if (iface.type == 5)
{ {
iface.spriteId = var1.readInt(); iface.spriteId = var1.readInt();
iface.field2332 = var1.readInt(); iface.alternateSpriteId = var1.readInt();
} }
if (iface.type == 6) if (iface.type == 6)
{ {
iface.modelType = 1; iface.modelType = 1;
iface.modelId = var1.readUnsignedShort(); iface.modelId = var1.readUnsignedShort();
if (iface.modelId == '\uffff') if (iface.modelId == 0xFFFF)
{ {
iface.modelId = -1; iface.modelId = -1;
} }
iface.field2264 = 1; iface.alternateModelId = var1.readUnsignedShort();
iface.field2265 = var1.readUnsignedShort(); if (iface.alternateModelId == 0xFFFF)
if (iface.field2265 == '\uffff')
{ {
iface.field2265 = -1; iface.alternateModelId = -1;
} }
iface.field2266 = var1.readUnsignedShort(); iface.animation = var1.readUnsignedShort();
if (iface.field2266 == '\uffff') if (iface.animation == 0xFFFF)
{ {
iface.field2266 = -1; iface.animation = -1;
} }
iface.field2276 = var1.readUnsignedShort(); iface.alternateAnimation = var1.readUnsignedShort();
if (iface.field2276 == '\uffff') if (iface.alternateAnimation == 0xFFFF)
{ {
iface.field2276 = -1; iface.alternateAnimation = -1;
} }
iface.modelZoom = var1.readUnsignedShort(); iface.modelZoom = var1.readUnsignedShort();
@@ -263,23 +281,23 @@ public class InterfaceLoader
if (iface.type == 7) if (iface.type == 7)
{ {
iface.itemIds = new int[iface.originalWidth * iface.field2231]; iface.itemIds = new int[iface.originalWidth * iface.originalHeight];
iface.itemQuantities = new int[iface.originalWidth * iface.field2231]; iface.itemQuantities = new int[iface.originalWidth * iface.originalHeight];
iface.field2219 = var1.readUnsignedByte(); iface.xTextAlignment = var1.readUnsignedByte();
iface.fontId = var1.readUnsignedShort(); iface.fontId = var1.readUnsignedShort();
if (iface.fontId == '\uffff') if (iface.fontId == 0xFFFF)
{ {
iface.fontId = -1; iface.fontId = -1;
} }
iface.textShadowed = var1.readUnsignedByte() == 1; iface.textShadowed = var1.readUnsignedByte() == 1;
iface.textColor = var1.readInt(); iface.textColor = var1.readInt();
iface.paddingX = var1.readShort(); iface.xPitch = var1.readShort();
iface.paddingY = var1.readShort(); iface.yPitch = var1.readShort();
var4 = var1.readUnsignedByte(); var4 = var1.readUnsignedByte();
if (var4 == 1) if (var4 == 1)
{ {
iface.config |= 1073741824; iface.clickMask |= 1073741824;
} }
iface.configActions = new String[5]; iface.configActions = new String[5];
@@ -290,7 +308,7 @@ public class InterfaceLoader
if (var10.length() > 0) if (var10.length() > 0)
{ {
iface.configActions[var5] = var10; iface.configActions[var5] = var10;
iface.config |= 1 << var5 + 23; iface.clickMask |= 1 << var5 + 23;
} }
} }
} }
@@ -300,57 +318,57 @@ public class InterfaceLoader
iface.text = var1.readString(); iface.text = var1.readString();
} }
if (iface.field2222 == 2 || iface.type == 2) if (iface.menuType == 2 || iface.type == 2)
{ {
iface.selectedAction = var1.readString(); iface.targetVerb = var1.readString();
iface.field2335 = var1.readString(); iface.spellName = var1.readString();
var4 = var1.readUnsignedShort() & 63; var4 = var1.readUnsignedShort() & 63;
iface.config |= var4 << 11; iface.clickMask |= var4 << 11;
} }
if (iface.field2222 == 1 || iface.field2222 == 4 || iface.field2222 == 5 || iface.field2222 == 6) if (iface.menuType == 1 || iface.menuType == 4 || iface.menuType == 5 || iface.menuType == 6)
{ {
iface.tooltip = var1.readString(); iface.tooltip = var1.readString();
if (iface.tooltip.length() == 0) if (iface.tooltip.length() == 0)
{ {
if (iface.field2222 == 1) if (iface.menuType == 1)
{ {
iface.tooltip = "Ok"; iface.tooltip = "Ok";
} }
if (iface.field2222 == 4) if (iface.menuType == 4)
{ {
iface.tooltip = "Select"; iface.tooltip = "Select";
} }
if (iface.field2222 == 5) if (iface.menuType == 5)
{ {
iface.tooltip = "Select"; iface.tooltip = "Select";
} }
if (iface.field2222 == 6) if (iface.menuType == 6)
{ {
iface.tooltip = "Continue"; iface.tooltip = "Continue";
} }
} }
} }
if (iface.field2222 == 1 || iface.field2222 == 4 || iface.field2222 == 5) if (iface.menuType == 1 || iface.menuType == 4 || iface.menuType == 5)
{ {
iface.config |= 4194304; iface.clickMask |= 4194304;
} }
if (iface.field2222 == 6) if (iface.menuType == 6)
{ {
iface.config |= 1; iface.clickMask |= 1;
} }
} }
private void method3252(InterfaceDefinition iface, InputStream var1) private void decodeIf3(InterfaceDefinition iface, InputStream var1)
{ {
var1.readUnsignedByte(); var1.readUnsignedByte();
iface.hasScript = true; iface.isIf3 = true;
iface.type = var1.readUnsignedByte(); iface.type = var1.readUnsignedByte();
iface.contentType = var1.readUnsignedShort(); iface.contentType = var1.readUnsignedShort();
iface.originalX = var1.readShort(); iface.originalX = var1.readShort();
@@ -358,25 +376,25 @@ public class InterfaceLoader
iface.originalWidth = var1.readUnsignedShort(); iface.originalWidth = var1.readUnsignedShort();
if (iface.type == 9) if (iface.type == 9)
{ {
iface.field2231 = var1.readShort(); iface.originalHeight = var1.readShort();
} }
else else
{ {
iface.field2231 = var1.readUnsignedShort(); iface.originalHeight = var1.readUnsignedShort();
} }
iface.field2226 = var1.readByte(); iface.widthMode = var1.readByte();
iface.field2227 = var1.readByte(); iface.heightMode = var1.readByte();
iface.field2351 = var1.readByte(); iface.xPositionMode = var1.readByte();
iface.field2217 = var1.readByte(); iface.yPositionMode = var1.readByte();
iface.parentId = var1.readUnsignedShort(); iface.parentId = var1.readUnsignedShort();
if (iface.parentId == '\uffff') if (iface.parentId == 0xFFFF)
{ {
iface.parentId = -1; iface.parentId = -1;
} }
else else
{ {
iface.parentId += iface.id & -65536; iface.parentId += iface.id & ~0xFFFF;
} }
iface.isHidden = var1.readUnsignedByte() == 1; iface.isHidden = var1.readUnsignedByte() == 1;
@@ -384,17 +402,17 @@ public class InterfaceLoader
{ {
iface.scrollWidth = var1.readUnsignedShort(); iface.scrollWidth = var1.readUnsignedShort();
iface.scrollHeight = var1.readUnsignedShort(); iface.scrollHeight = var1.readUnsignedShort();
iface.field2210 = var1.readUnsignedByte() == 1; iface.noClickThrough = var1.readUnsignedByte() == 1;
} }
if (iface.type == 5) if (iface.type == 5)
{ {
iface.spriteId = var1.readInt(); iface.spriteId = var1.readInt();
iface.field2294 = var1.readUnsignedShort(); iface.textureId = var1.readUnsignedShort();
iface.field2257 = var1.readUnsignedByte() == 1; iface.spriteTiling = var1.readUnsignedByte() == 1;
iface.opacity = var1.readUnsignedByte(); iface.opacity = var1.readUnsignedByte();
iface.borderThickness = var1.readUnsignedByte(); iface.borderType = var1.readUnsignedByte();
iface.sprite2 = var1.readInt(); iface.shadowColor = var1.readInt();
iface.flippedVertically = var1.readUnsignedByte() == 1; iface.flippedVertically = var1.readUnsignedByte() == 1;
iface.flippedHorizontally = var1.readUnsignedByte() == 1; iface.flippedHorizontally = var1.readUnsignedByte() == 1;
} }
@@ -403,31 +421,31 @@ public class InterfaceLoader
{ {
iface.modelType = 1; iface.modelType = 1;
iface.modelId = var1.readUnsignedShort(); iface.modelId = var1.readUnsignedShort();
if (iface.modelId == '\uffff') if (iface.modelId == 0xFFFF)
{ {
iface.modelId = -1; iface.modelId = -1;
} }
iface.field2268 = var1.readShort(); iface.offsetX2d = var1.readShort();
iface.field2269 = var1.readShort(); iface.offsetY2d = var1.readShort();
iface.rotationX = var1.readUnsignedShort(); iface.rotationX = var1.readUnsignedShort();
iface.rotationZ = var1.readUnsignedShort(); iface.rotationZ = var1.readUnsignedShort();
iface.rotationY = var1.readUnsignedShort(); iface.rotationY = var1.readUnsignedShort();
iface.modelZoom = var1.readUnsignedShort(); iface.modelZoom = var1.readUnsignedShort();
iface.field2266 = var1.readUnsignedShort(); iface.animation = var1.readUnsignedShort();
if (iface.field2266 == '\uffff') if (iface.animation == 0xFFFF)
{ {
iface.field2266 = -1; iface.animation = -1;
} }
iface.field2296 = var1.readUnsignedByte() == 1; iface.orthogonal = var1.readUnsignedByte() == 1;
var1.readUnsignedShort(); var1.readUnsignedShort();
if (iface.field2226 != 0) if (iface.widthMode != 0)
{ {
iface.field2274 = var1.readUnsignedShort(); iface.modelHeightOverride = var1.readUnsignedShort();
} }
if (iface.field2227 != 0) if (iface.heightMode != 0)
{ {
var1.readUnsignedShort(); var1.readUnsignedShort();
} }
@@ -436,15 +454,15 @@ public class InterfaceLoader
if (iface.type == 4) if (iface.type == 4)
{ {
iface.fontId = var1.readUnsignedShort(); iface.fontId = var1.readUnsignedShort();
if (iface.fontId == '\uffff') if (iface.fontId == 0xFFFF)
{ {
iface.fontId = -1; iface.fontId = -1;
} }
iface.text = var1.readString(); iface.text = var1.readString();
iface.field2212 = var1.readUnsignedByte(); iface.lineHeight = var1.readUnsignedByte();
iface.field2219 = var1.readUnsignedByte(); iface.xTextAlignment = var1.readUnsignedByte();
iface.field2283 = var1.readUnsignedByte(); iface.yTextAlignment = var1.readUnsignedByte();
iface.textShadowed = var1.readUnsignedByte() == 1; iface.textShadowed = var1.readUnsignedByte() == 1;
iface.textColor = var1.readInt(); iface.textColor = var1.readInt();
} }
@@ -452,18 +470,18 @@ public class InterfaceLoader
if (iface.type == 3) if (iface.type == 3)
{ {
iface.textColor = var1.readInt(); iface.textColor = var1.readInt();
iface.field2267 = var1.readUnsignedByte() == 1; iface.filled = var1.readUnsignedByte() == 1;
iface.opacity = var1.readUnsignedByte(); iface.opacity = var1.readUnsignedByte();
} }
if (iface.type == 9) if (iface.type == 9)
{ {
iface.field2218 = var1.readUnsignedByte(); iface.lineWidth = var1.readUnsignedByte();
iface.textColor = var1.readInt(); iface.textColor = var1.readInt();
iface.field2253 = var1.readUnsignedByte() == 1; iface.lineDirection = var1.readUnsignedByte() == 1;
} }
iface.config = var1.read24BitInt(); iface.clickMask = var1.read24BitInt();
iface.name = var1.readString(); iface.name = var1.readString();
int var2 = var1.readUnsignedByte(); int var2 = var1.readUnsignedByte();
if (var2 > 0) if (var2 > 0)
@@ -476,34 +494,34 @@ public class InterfaceLoader
} }
} }
iface.field2295 = var1.readUnsignedByte(); iface.dragDeadZone = var1.readUnsignedByte();
iface.field2223 = var1.readUnsignedByte(); iface.dragDeadTime = var1.readUnsignedByte();
iface.field2297 = var1.readUnsignedByte() == 1; iface.dragRenderBehavior = var1.readUnsignedByte() == 1;
iface.selectedAction = var1.readString(); iface.targetVerb = var1.readString();
iface.field2225 = this.method3282(iface, var1); iface.onLoadListener = this.decodeListener(iface, var1);
iface.field2300 = this.method3282(iface, var1); iface.onMouseOverListener = this.decodeListener(iface, var1);
iface.field2248 = this.method3282(iface, var1); iface.onMouseLeaveListener = this.decodeListener(iface, var1);
iface.field2311 = this.method3282(iface, var1); iface.onTargetLeaveListener = this.decodeListener(iface, var1);
iface.field2350 = this.method3282(iface, var1); iface.onTargetEnterListener = this.decodeListener(iface, var1);
iface.field2312 = this.method3282(iface, var1); iface.onVarTransmitListener = this.decodeListener(iface, var1);
iface.field2314 = this.method3282(iface, var1); iface.onInvTransmitListener = this.decodeListener(iface, var1);
iface.field2316 = this.method3282(iface, var1); iface.onStatTransmitListener = this.decodeListener(iface, var1);
iface.field2318 = this.method3282(iface, var1); iface.onTimerListener = this.decodeListener(iface, var1);
iface.field2319 = this.method3282(iface, var1); iface.onOpListener = this.decodeListener(iface, var1);
iface.field2306 = this.method3282(iface, var1); iface.onMouseRepeatListener = this.decodeListener(iface, var1);
iface.field2337 = this.method3282(iface, var1); iface.onClickListener = this.decodeListener(iface, var1);
iface.field2287 = this.method3282(iface, var1); iface.onClickRepeatListener = this.decodeListener(iface, var1);
iface.field2303 = this.method3282(iface, var1); iface.onReleaseListener = this.decodeListener(iface, var1);
iface.field2304 = this.method3282(iface, var1); iface.onHoldListener = this.decodeListener(iface, var1);
iface.field2308 = this.method3282(iface, var1); iface.onDragListener = this.decodeListener(iface, var1);
iface.field2310 = this.method3282(iface, var1); iface.onDragCompleteListener = this.decodeListener(iface, var1);
iface.field2262 = this.method3282(iface, var1); iface.onScrollWheelListener = this.decodeListener(iface, var1);
iface.field2313 = this.method3274(var1); iface.varTransmitTriggers = this.decodeTriggers(var1);
iface.field2315 = this.method3274(var1); iface.invTransmitTriggers = this.decodeTriggers(var1);
iface.field2282 = this.method3274(var1); iface.statTransmitTriggers = this.decodeTriggers(var1);
} }
private Object[] method3282(InterfaceDefinition iface, InputStream var1) private Object[] decodeListener(InterfaceDefinition iface, InputStream var1)
{ {
int var2 = var1.readUnsignedByte(); int var2 = var1.readUnsignedByte();
if (var2 == 0) if (var2 == 0)
@@ -527,12 +545,12 @@ public class InterfaceLoader
} }
} }
iface.field2299 = true; iface.hasListener = true;
return var3; return var3;
} }
} }
private int[] method3274(InputStream var1) private int[] decodeTriggers(InputStream var1)
{ {
int var2 = var1.readUnsignedByte(); int var2 = var1.readUnsignedByte();
if (var2 == 0) if (var2 == 0)

View File

@@ -24,6 +24,7 @@
*/ */
package net.runelite.cache.definitions.savers; package net.runelite.cache.definitions.savers;
import net.runelite.cache.definitions.ClientScript1Instruction;
import net.runelite.cache.definitions.InterfaceDefinition; import net.runelite.cache.definitions.InterfaceDefinition;
import net.runelite.cache.io.OutputStream; import net.runelite.cache.io.OutputStream;
@@ -31,56 +32,74 @@ public class InterfaceSaver
{ {
public byte[] save(InterfaceDefinition def) public byte[] save(InterfaceDefinition def)
{ {
if (def.hasScript) if (def.isIf3)
{ {
return saveScript(def); return saveIf3(def);
} }
else else
{ {
return saveNoScript(def); return saveIf1(def);
} }
} }
private byte[] saveScript(InterfaceDefinition def) private byte[] saveIf3(InterfaceDefinition def)
{ {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
} }
private byte[] saveNoScript(InterfaceDefinition def) private byte[] saveIf1(InterfaceDefinition def)
{ {
OutputStream out = new OutputStream(); OutputStream out = new OutputStream();
out.writeByte(def.type); out.writeByte(def.type);
out.writeByte(def.field2222); out.writeByte(def.menuType);
out.writeShort(def.contentType); out.writeShort(def.contentType);
out.writeShort(def.originalX); out.writeShort(def.originalX);
out.writeShort(def.originalY); out.writeShort(def.originalY);
out.writeShort(def.originalWidth); out.writeShort(def.originalWidth);
out.writeShort(def.field2231); out.writeShort(def.originalHeight);
out.writeByte(def.opacity); out.writeByte(def.opacity);
out.writeShort(def.parentId); out.writeShort(def.parentId);
out.writeShort(def.field2334); out.writeShort(def.hoveredSiblingId);
if (def.tableActions != null) if (def.alternateOperators != null)
{ {
out.writeByte(def.tableActions.length); out.writeByte(def.alternateOperators.length);
for (int i = 0; i < def.tableActions.length; ++i) for (int i = 0; i < def.alternateOperators.length; ++i)
{ {
out.writeByte(def.tableActions[i]); out.writeByte(def.alternateOperators[i]);
out.writeShort(def.field2333[i]); out.writeShort(def.alternateRhs[i]);
} }
} }
else else
{ {
out.writeByte(0); out.writeByte(0);
} }
if (def.dynamicValues != null) if (def.clientScripts != null)
{ {
out.writeByte(def.dynamicValues.length); out.writeByte(def.clientScripts.length);
for (int i = 0; i < def.dynamicValues.length; ++i) for (int i = 0; i < def.clientScripts.length; ++i)
{ {
out.writeShort(def.dynamicValues[i].length); int len = 0;
for (int j = 0; j < def.dynamicValues[i].length; ++j) for (int j = 0; j < def.clientScripts[i].length; ++j)
{ {
out.writeShort(def.dynamicValues[i][j]); ClientScript1Instruction ins = def.clientScripts[i][j];
len++;
if (ins.operands != null)
{
len += ins.operands.length;
}
}
out.writeShort(len);
for (int j = 0; j < def.clientScripts[i].length; ++j)
{
ClientScript1Instruction ins = def.clientScripts[i][j];
out.writeShort(ins.opcode.ordinal());
if (ins.operands != null)
{
for (int op : ins.operands)
{
out.writeShort(op);
}
}
} }
} }
} }
@@ -100,20 +119,20 @@ public class InterfaceSaver
} }
if (def.type == 2) if (def.type == 2)
{ {
out.writeByte((def.config & 268435456) != 0 ? 1 : 0); out.writeByte((def.clickMask & 268435456) != 0 ? 1 : 0);
out.writeByte((def.config & 1073741824) != 0 ? 1 : 0); out.writeByte((def.clickMask & 1073741824) != 0 ? 1 : 0);
out.writeByte((def.config & Integer.MIN_VALUE) != 0 ? 1 : 0); out.writeByte((def.clickMask & Integer.MIN_VALUE) != 0 ? 1 : 0);
out.writeByte((def.config & 536870912) != 0 ? 1 : 0); out.writeByte((def.clickMask & 536870912) != 0 ? 1 : 0);
out.writeByte(def.paddingX); out.writeByte(def.xPitch);
out.writeByte(def.paddingY); out.writeByte(def.yPitch);
for (int i = 0; i < 20; ++i) for (int i = 0; i < 20; ++i)
{ {
if (def.field2289[i] != -1) if (def.sprites[i] != -1)
{ {
out.writeByte(1); out.writeByte(1);
out.writeShort(def.xSprites[i]); out.writeShort(def.xOffsets[i]);
out.writeShort(def.field2288[i]); out.writeShort(def.yOffsets[i]);
out.writeShort(def.field2289[i]); out.writeShort(def.sprites[i]);
} }
else else
{ {
@@ -134,20 +153,20 @@ public class InterfaceSaver
} }
if (def.type == 3) if (def.type == 3)
{ {
out.writeByte(def.field2267 ? 1 : 0); out.writeByte(def.filled ? 1 : 0);
} }
if (def.type == 4 || def.type == 1) if (def.type == 4 || def.type == 1)
{ {
out.writeByte(def.field2219); out.writeByte(def.xTextAlignment);
out.writeByte(def.field2283); out.writeByte(def.yTextAlignment);
out.writeByte(def.field2212); out.writeByte(def.lineHeight);
out.writeShort(def.fontId); out.writeShort(def.fontId);
out.writeByte(def.textShadowed ? 1 : 0); out.writeByte(def.textShadowed ? 1 : 0);
} }
if (def.type == 4) if (def.type == 4)
{ {
out.writeString(def.text); out.writeString(def.text);
out.writeString(def.field2241); out.writeString(def.alternateText);
} }
if (def.type == 1 || def.type == 3 || def.type == 4) if (def.type == 1 || def.type == 3 || def.type == 4)
{ {
@@ -155,34 +174,34 @@ public class InterfaceSaver
} }
if (def.type == 3 || def.type == 4) if (def.type == 3 || def.type == 4)
{ {
out.writeInt(def.field2245); out.writeInt(def.alternateTextColor);
out.writeInt(def.field2280); out.writeInt(def.hoveredTextColor);
out.writeInt(def.field2247); out.writeInt(def.alternateHoveredTextColor);
} }
if (def.type == 5) if (def.type == 5)
{ {
out.writeInt(def.spriteId); out.writeInt(def.spriteId);
out.writeInt(def.field2332); out.writeInt(def.alternateSpriteId);
} }
if (def.type == 6) if (def.type == 6)
{ {
out.writeShort(def.modelId); out.writeShort(def.modelId);
out.writeShort(def.field2265); out.writeShort(def.alternateModelId);
out.writeShort(def.field2266); out.writeShort(def.animation);
out.writeShort(def.field2276); out.writeShort(def.alternateAnimation);
out.writeShort(def.modelZoom); out.writeShort(def.modelZoom);
out.writeShort(def.rotationX); out.writeShort(def.rotationX);
out.writeShort(def.rotationZ); out.writeShort(def.rotationZ);
} }
if (def.type == 7) if (def.type == 7)
{ {
out.writeByte(def.field2219); out.writeByte(def.xTextAlignment);
out.writeShort(def.fontId); out.writeShort(def.fontId);
out.writeByte(def.textShadowed ? 1 : 0); out.writeByte(def.textShadowed ? 1 : 0);
out.writeInt(def.textColor); out.writeInt(def.textColor);
out.writeShort(def.paddingX); out.writeShort(def.xPitch);
out.writeShort(def.paddingY); out.writeShort(def.yPitch);
out.writeByte((def.config & 1073741824) != 0 ? 1 : 0); out.writeByte((def.clickMask & 1073741824) != 0 ? 1 : 0);
for (int i = 0; i < 5; ++i) for (int i = 0; i < 5; ++i)
{ {
out.writeString(def.configActions[i]); out.writeString(def.configActions[i]);
@@ -192,13 +211,13 @@ public class InterfaceSaver
{ {
out.writeString(def.text); out.writeString(def.text);
} }
if (def.field2222 == 2 || def.type == 2) if (def.menuType == 2 || def.type == 2)
{ {
out.writeString(def.selectedAction); out.writeString(def.targetVerb);
out.writeString(def.field2335); out.writeString(def.spellName);
out.writeShort((def.config >>> 11) & 63); out.writeShort((def.clickMask >>> 11) & 63);
} }
if (def.field2222 == 1 || def.field2222 == 4 || def.field2222 == 5 || def.field2222 == 6) if (def.menuType == 1 || def.menuType == 4 || def.menuType == 5 || def.menuType == 6)
{ {
out.writeString(def.tooltip); out.writeString(def.tooltip);
} }

View File

@@ -40,7 +40,6 @@ import org.junit.Test;
public class InterfaceSaverTest public class InterfaceSaverTest
{ {
@Test @Test
public void testSave() throws Exception public void testSave() throws Exception
{ {
@@ -51,10 +50,10 @@ public class InterfaceSaverTest
Storage storage = store.getStorage(); Storage storage = store.getStorage();
Index index = store.getIndex(IndexType.INTERFACES); Index index = store.getIndex(IndexType.INTERFACES);
Archive archive = index.getArchive(149); Archive archive = index.getArchive(31);
byte[] archiveData = storage.loadArchive(archive); byte[] archiveData = storage.loadArchive(archive);
ArchiveFiles files = archive.getFiles(archiveData); ArchiveFiles files = archive.getFiles(archiveData);
FSFile file = files.findFile(0); FSFile file = files.findFile(76);
byte[] contents = file.getContents(); byte[] contents = file.getContents();
InterfaceDefinition def = new InterfaceLoader().load(0, contents); InterfaceDefinition def = new InterfaceLoader().load(0, contents);