diff --git a/injector/src/main/java/com/openosrs/injector/InjectUtil.java b/injector/src/main/java/com/openosrs/injector/InjectUtil.java index d8c9fbd7c2..f4ff0ff3ac 100644 --- a/injector/src/main/java/com/openosrs/injector/InjectUtil.java +++ b/injector/src/main/java/com/openosrs/injector/InjectUtil.java @@ -13,6 +13,7 @@ import static com.openosrs.injector.rsapi.RSApi.RL_API_BASE; import com.openosrs.injector.rsapi.RSApiClass; import com.openosrs.injector.rsapi.RSApiMethod; import java.util.List; +import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -340,6 +341,11 @@ public interface InjectUtil } static Type apiToDeob(InjectData data, Type api) + { + return apiToDeob(data, api, null); + } + + static Type apiToDeob(InjectData data, Type api, Type deobType) { if (api.isPrimitive()) { @@ -354,29 +360,43 @@ public interface InjectUtil else if (internalName.startsWith(RL_API_BASE)) { Class rlApiC = new Class(internalName); - RSApiClass highestKnown = data.getRsApi().withInterface(rlApiC); + Set allClasses = data.getRsApi().withInterface(rlApiC); // Cheeky unchecked exception - assert highestKnown != null : "No rs api class implements rl api class " + rlApiC.toString(); + assert allClasses.size() > 0 : "No rs api class implements rl api class " + rlApiC.toString(); - boolean changed; - do + if (allClasses.size() == 1) { - changed = false; - - for (RSApiClass interf : highestKnown.getApiInterfaces()) + RSApiClass highestKnown = allClasses.stream().findFirst().get(); + boolean changed; + do { - if (interf.getInterfaces().contains(rlApiC)) + changed = false; + + for (RSApiClass interf : highestKnown.getApiInterfaces()) { - highestKnown = interf; - changed = true; - break; + if (interf.getInterfaces().contains(rlApiC)) + { + highestKnown = interf; + changed = true; + break; + } + } + } + while (changed); + + return apiToDeob(data, Type.getType(highestKnown.getName(), api.getDimensions())); + } + else + { + for (RSApiClass rsApiClass : allClasses) + { + if (rsApiClass.getName().contains(deobType.getInternalName())) + { + return apiToDeob(data, Type.getType(rsApiClass.getName(), api.getDimensions())); } } } - while (changed); - - return apiToDeob(data, Type.getType(highestKnown.getName(), api.getDimensions())); } return api; diff --git a/injector/src/main/java/com/openosrs/injector/Injector.java b/injector/src/main/java/com/openosrs/injector/Injector.java index 5216adae21..643bd17886 100644 --- a/injector/src/main/java/com/openosrs/injector/Injector.java +++ b/injector/src/main/java/com/openosrs/injector/Injector.java @@ -23,7 +23,7 @@ import com.openosrs.injector.injectors.raw.Occluder; import com.openosrs.injector.injectors.raw.RasterizerAlpha; import com.openosrs.injector.injectors.raw.RenderDraw; import com.openosrs.injector.injectors.raw.CopyRuneLiteClasses; -import com.openosrs.injector.injectors.raw.RuneLiteIterableHashTable; +import com.openosrs.injector.injectors.raw.RuneLiteIterables; import com.openosrs.injector.injectors.raw.RuneliteObject; import com.openosrs.injector.injectors.raw.ScriptVM; import com.openosrs.injector.rsapi.RSApi; @@ -117,7 +117,7 @@ public class Injector extends InjectData implements InjectTaskHandler inject(new CopyRuneLiteClasses(this)); - inject(new RuneLiteIterableHashTable(this)); + inject(new RuneLiteIterables(this)); inject(new RuneliteObject(this)); diff --git a/injector/src/main/java/com/openosrs/injector/injectors/RSApiInjector.java b/injector/src/main/java/com/openosrs/injector/injectors/RSApiInjector.java index c469542463..fb02f3079e 100644 --- a/injector/src/main/java/com/openosrs/injector/injectors/RSApiInjector.java +++ b/injector/src/main/java/com/openosrs/injector/injectors/RSApiInjector.java @@ -131,7 +131,7 @@ public class RSApiInjector extends AbstractInjector } else if (sig.size() == 0) { - Type type = InjectUtil.apiToDeob(inject, sig.getReturnValue()); + Type type = InjectUtil.apiToDeob(inject, sig.getReturnValue(), deobType); if (deobType.equals(type)) { continue; diff --git a/injector/src/main/java/com/openosrs/injector/injectors/raw/CopyRuneLiteClasses.java b/injector/src/main/java/com/openosrs/injector/injectors/raw/CopyRuneLiteClasses.java index 72fdf81ea4..5875671232 100644 --- a/injector/src/main/java/com/openosrs/injector/injectors/raw/CopyRuneLiteClasses.java +++ b/injector/src/main/java/com/openosrs/injector/injectors/raw/CopyRuneLiteClasses.java @@ -19,6 +19,7 @@ import net.runelite.asm.Type; import net.runelite.asm.attributes.Code; import net.runelite.asm.attributes.code.Instruction; import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.attributes.code.instructions.CheckCast; import net.runelite.asm.attributes.code.instructions.GetField; import net.runelite.asm.attributes.code.instructions.GetStatic; import net.runelite.asm.attributes.code.instructions.InvokeSpecial; @@ -35,7 +36,9 @@ public class CopyRuneLiteClasses extends AbstractInjector { private static final List RUNELITE_OBJECTS = List.of( "RuneLiteObject", - "RuneLiteIterableHashTable" + "RuneLiteIterableLinkDeque", + "RuneLiteIterableNodeDeque", + "RuneLiteIterableNodeHashTable" ); public CopyRuneLiteClasses(InjectData inject) diff --git a/injector/src/main/java/com/openosrs/injector/injectors/raw/RuneLiteIterableHashTable.java b/injector/src/main/java/com/openosrs/injector/injectors/raw/RuneLiteIterableHashTable.java deleted file mode 100644 index a8c63dd97b..0000000000 --- a/injector/src/main/java/com/openosrs/injector/injectors/raw/RuneLiteIterableHashTable.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2021, Owain van Brakel - * All rights reserved. - * - * This code is licensed under GPL3, see the complete license in - * the LICENSE file in the root directory of this submodule. - */ -package com.openosrs.injector.injectors.raw; - -import com.openosrs.injector.injection.InjectData; -import com.openosrs.injector.injectors.AbstractInjector; -import java.util.List; -import net.runelite.asm.ClassFile; -import net.runelite.asm.Method; -import net.runelite.asm.attributes.Code; -import net.runelite.asm.attributes.code.Instruction; -import net.runelite.asm.attributes.code.InstructionType; -import net.runelite.asm.attributes.code.Instructions; -import net.runelite.asm.attributes.code.instructions.ALoad; -import net.runelite.asm.attributes.code.instructions.Dup; -import net.runelite.asm.attributes.code.instructions.InvokeSpecial; -import net.runelite.asm.attributes.code.instructions.New; -import net.runelite.asm.attributes.code.instructions.Return; -import net.runelite.asm.signature.Signature; - -public class RuneLiteIterableHashTable extends AbstractInjector -{ - private static final String RUNELITE_ITERABLE_HASHTABLE = "RuneLiteIterableHashTable"; - - public RuneLiteIterableHashTable(InjectData inject) - { - super(inject); - } - - public void inject() - { - ClassFile runeliteIterableHashTableVanilla = inject.vanilla.findClass(RUNELITE_ITERABLE_HASHTABLE); - - final ClassFile nodeHashTableVanilla = inject.toVanilla( - inject.getDeobfuscated() - .findClass("NodeHashTable") - ); - - Method copy = new Method(nodeHashTableVanilla, "iterator", new Signature("()Ljava/util/Iterator;")); - copy.setPublic(); - - final Code code = new Code(copy); - code.setMaxStack(3); - copy.setCode(code); - nodeHashTableVanilla.addMethod(copy); - - final Instructions instructions = code.getInstructions(); - final List ins = instructions.getInstructions(); - - ins.add(new New(instructions, runeliteIterableHashTableVanilla.getPoolClass())); - ins.add(new Dup(instructions)); - ins.add(new ALoad(instructions, 0)); - ins.add(new InvokeSpecial(instructions, new net.runelite.asm.pool.Method(runeliteIterableHashTableVanilla.getPoolClass(), "", new Signature("(L" + nodeHashTableVanilla.getName() + ";)V")))); - ins.add(new Return(instructions, InstructionType.ARETURN)); - } -} diff --git a/injector/src/main/java/com/openosrs/injector/injectors/raw/RuneLiteIterables.java b/injector/src/main/java/com/openosrs/injector/injectors/raw/RuneLiteIterables.java new file mode 100644 index 0000000000..42fc49f5da --- /dev/null +++ b/injector/src/main/java/com/openosrs/injector/injectors/raw/RuneLiteIterables.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2021, Owain van Brakel + * All rights reserved. + * + * This code is licensed under GPL3, see the complete license in + * the LICENSE file in the root directory of this submodule. + */ +package com.openosrs.injector.injectors.raw; + +import com.openosrs.injector.injection.InjectData; +import com.openosrs.injector.injectors.AbstractInjector; +import java.util.List; +import net.runelite.asm.ClassFile; +import net.runelite.asm.Method; +import net.runelite.asm.attributes.Code; +import net.runelite.asm.attributes.code.Instruction; +import net.runelite.asm.attributes.code.InstructionType; +import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.attributes.code.instructions.ALoad; +import net.runelite.asm.attributes.code.instructions.Dup; +import net.runelite.asm.attributes.code.instructions.InvokeSpecial; +import net.runelite.asm.attributes.code.instructions.New; +import net.runelite.asm.attributes.code.instructions.Return; +import net.runelite.asm.signature.Signature; + +public class RuneLiteIterables extends AbstractInjector +{ + private static final String RUNELITE_ITERABLE_HASHTABLE = "RuneLiteIterableNodeHashTable"; + private static final String RUNELITE_ITERABLE_NODE_DEQUE = "RuneLiteIterableNodeDeque"; + private static final String RUNELITE_ITERABLE_LINK_DEQUE = "RuneLiteIterableLinkDeque"; + + public RuneLiteIterables(InjectData inject) + { + super(inject); + } + + public void inject() + { + injectHashTable(); + injectNodeDeque(); + injectLinkDeque(); + } + + public void injectHashTable() + { + ClassFile runeliteIterableHashTableVanilla = inject.vanilla.findClass(RUNELITE_ITERABLE_HASHTABLE); + + final ClassFile nodeHashTableVanilla = inject.toVanilla( + inject.getDeobfuscated() + .findClass(RUNELITE_ITERABLE_HASHTABLE.replace("RuneLiteIterable", "")) + ); + + Method copy = new Method(nodeHashTableVanilla, "iterator", new Signature("()Ljava/util/Iterator;")); + copy.setPublic(); + + final Code code = new Code(copy); + code.setMaxStack(3); + copy.setCode(code); + nodeHashTableVanilla.addMethod(copy); + + final Instructions instructions = code.getInstructions(); + final List ins = instructions.getInstructions(); + + ins.add(new New(instructions, runeliteIterableHashTableVanilla.getPoolClass())); + ins.add(new Dup(instructions)); + ins.add(new ALoad(instructions, 0)); + ins.add(new InvokeSpecial(instructions, new net.runelite.asm.pool.Method(runeliteIterableHashTableVanilla.getPoolClass(), "", new Signature("(L" + nodeHashTableVanilla.getName() + ";)V")))); + ins.add(new Return(instructions, InstructionType.ARETURN)); + } + + public void injectNodeDeque() + { + ClassFile runeliteIterableNodeDequeVanilla = inject.vanilla.findClass(RUNELITE_ITERABLE_NODE_DEQUE); + + final ClassFile nodeDequeVanilla = inject.toVanilla( + inject.getDeobfuscated() + .findClass(RUNELITE_ITERABLE_NODE_DEQUE.replace("RuneLiteIterable", "")) + ); + + Method copy = new Method(nodeDequeVanilla, "iterator", new Signature("()Ljava/util/Iterator;")); + copy.setPublic(); + + final Code code = new Code(copy); + code.setMaxStack(3); + copy.setCode(code); + nodeDequeVanilla.addMethod(copy); + + final Instructions instructions = code.getInstructions(); + final List ins = instructions.getInstructions(); + + ins.add(new New(instructions, runeliteIterableNodeDequeVanilla.getPoolClass())); + ins.add(new Dup(instructions)); + ins.add(new ALoad(instructions, 0)); + ins.add(new InvokeSpecial(instructions, new net.runelite.asm.pool.Method(runeliteIterableNodeDequeVanilla.getPoolClass(), "", new Signature("(L" + nodeDequeVanilla.getName() + ";)V")))); + ins.add(new Return(instructions, InstructionType.ARETURN)); + } + + public void injectLinkDeque() + { + ClassFile runeliteIterableLinkDequeVanilla = inject.vanilla.findClass(RUNELITE_ITERABLE_LINK_DEQUE); + + final ClassFile linkDequeVanilla = inject.toVanilla( + inject.getDeobfuscated() + .findClass(RUNELITE_ITERABLE_LINK_DEQUE.replace("RuneLiteIterable", "")) + ); + + Method copy = new Method(linkDequeVanilla, "iterator", new Signature("()Ljava/util/Iterator;")); + copy.setPublic(); + + final Code code = new Code(copy); + code.setMaxStack(3); + copy.setCode(code); + linkDequeVanilla.addMethod(copy); + + final Instructions instructions = code.getInstructions(); + final List ins = instructions.getInstructions(); + + ins.add(new New(instructions, runeliteIterableLinkDequeVanilla.getPoolClass())); + ins.add(new Dup(instructions)); + ins.add(new ALoad(instructions, 0)); + ins.add(new InvokeSpecial(instructions, new net.runelite.asm.pool.Method(runeliteIterableLinkDequeVanilla.getPoolClass(), "", new Signature("(L" + linkDequeVanilla.getName() + ";)V")))); + ins.add(new Return(instructions, InstructionType.ARETURN)); + } +} diff --git a/injector/src/main/java/com/openosrs/injector/rsapi/RSApi.java b/injector/src/main/java/com/openosrs/injector/rsapi/RSApi.java index def5997c75..cbcbdf9744 100644 --- a/injector/src/main/java/com/openosrs/injector/rsapi/RSApi.java +++ b/injector/src/main/java/com/openosrs/injector/rsapi/RSApi.java @@ -15,8 +15,10 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Set; import lombok.Getter; import lombok.NoArgsConstructor; import net.runelite.asm.Type; @@ -111,23 +113,19 @@ public class RSApi implements Iterable return findClass(name) != null; } - public RSApiClass withInterface(Class interf) + public Set withInterface(Class interf) { - RSApiClass clazz = findClass(interf.getName()); - if (clazz != null) - { - return clazz; - } + Set classes = new HashSet<>(); for (RSApiClass apiC : this) { if (apiC.getInterfaces().contains(interf)) { - return apiC; + classes.add(apiC); } } - return null; + return classes; } @NotNull diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/ClickboxMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/ClickboxMixin.java index 30854ef800..86e44fc473 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/ClickboxMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/ClickboxMixin.java @@ -59,15 +59,15 @@ public abstract class ClickboxMixin implements RSClient // otherwise we must check if the mouse is in a triangle final int vertexCount = model.getVerticesCount(); - final int triangleCount = model.getTrianglesCount(); + final int triangleCount = model.getFaceCount(); final int[] vertexX = model.getVerticesX(); final int[] vertexY = model.getVerticesY(); final int[] vertexZ = model.getVerticesZ(); - final int[] triangleX = model.getTrianglesX(); - final int[] triangleY = model.getTrianglesY(); - final int[] triangleZ = model.getTrianglesZ(); + final int[] triangleX = model.getFaceIndices1(); + final int[] triangleY = model.getFaceIndices2(); + final int[] triangleZ = model.getFaceIndices3(); final int[] color3 = model.getFaceColors3(); diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java index 1885cb949f..06bea2ec7d 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -39,9 +39,10 @@ import java.util.Map; import java.util.Set; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.runelite.api.Animation; import net.runelite.api.ChatMessageType; import net.runelite.api.EnumComposition; -import net.runelite.api.Friend; +import net.runelite.api.FriendContainer; import net.runelite.api.GameState; import net.runelite.api.GrandExchangeOffer; import net.runelite.api.GraphicsObject; @@ -79,7 +80,6 @@ import net.runelite.api.Point; import net.runelite.api.Prayer; import net.runelite.api.Projectile; import net.runelite.api.ScriptEvent; -import net.runelite.api.Sequence; import net.runelite.api.Skill; import net.runelite.api.SpritePixels; import net.runelite.api.StructComposition; @@ -789,6 +789,15 @@ public abstract class RSClientMixin implements RSClient setChatCycle(getCycleCntr()); } + @Inject + @Override + public MenuEntry createMenuEntry(int idx) + { + // TODO: Implement this + + return new MenuEntry(); + } + @Inject @Override public MenuEntry[] getMenuEntries() @@ -887,9 +896,9 @@ public abstract class RSClientMixin implements RSClient options[oldCount] = event.getOption(); targets[oldCount] = event.getTarget(); identifiers[oldCount] = event.getIdentifier(); - opcodes[oldCount] = event.getOpcode(); - arguments1[oldCount] = event.getParam0(); - arguments2[oldCount] = event.getParam1(); + opcodes[oldCount] = event.getType(); + arguments1[oldCount] = event.getActionParam0(); + arguments2[oldCount] = event.getActionParam1(); forceLeftClick[oldCount] = event.isForceLeftClick(); } } @@ -999,7 +1008,7 @@ public abstract class RSClientMixin implements RSClient @Inject @Override - public NameableContainer getFriendContainer() + public FriendContainer getFriendContainer() { return getFriendManager().getFriendContainer(); } @@ -2427,7 +2436,7 @@ public abstract class RSClientMixin implements RSClient } @Inject - public Sequence loadAnimation(int id) + public Animation loadAnimation(int id) { return client.getSequenceDefinition(id); } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSFriendLoginUpdatesMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSFriendLoginUpdatesMixin.java new file mode 100644 index 0000000000..8df78b44c4 --- /dev/null +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSFriendLoginUpdatesMixin.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2016-2017, Adam + * 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.mixins; + +import net.runelite.api.mixins.Inject; +import net.runelite.api.mixins.Mixin; +import net.runelite.rs.api.RSFriendLoginUpdate; +import net.runelite.rs.api.RSUsername; + +@Mixin(RSFriendLoginUpdate.class) +public abstract class RSFriendLoginUpdatesMixin implements RSFriendLoginUpdate +{ + @Inject + @Override + public String getName() + { + final RSUsername rsName = getRsName(); + + if (rsName == null) + { + return null; + } + + String name = rsName.getName(); + + if (name == null) + { + return null; + } + + return name.replace('\u00A0', ' '); + } +} \ No newline at end of file diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSLinkDequeMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSLinkDequeMixin.java new file mode 100644 index 0000000000..1ab3935574 --- /dev/null +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSLinkDequeMixin.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2016-2017, Adam + * 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.mixins; + +import net.runelite.api.mixins.Inject; +import net.runelite.api.mixins.Mixin; +import net.runelite.rs.api.RSLink; +import net.runelite.rs.api.RSLinkDeque; + +@Mixin(RSLinkDeque.class) +public abstract class RSLinkDequeMixin implements RSLinkDeque +{ + @Inject + @Override + public void clear() + { + while (true) + { + RSLink rsLink = getSentinel().getPrevious(); + if (rsLink == getSentinel()) + { + setCurrent(null); + return; + } + + rsLink.remove(); + } + } +} \ No newline at end of file diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSModelMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSModelMixin.java index f17215d244..c18e32c59d 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSModelMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSModelMixin.java @@ -78,7 +78,7 @@ public abstract class RSModelMixin implements RSModel { if (getFaceTextures() != null) { - int count = getTrianglesCount(); + int count = getFaceCount(); float[] uv = new float[count * 6]; int idx = 0; @@ -91,10 +91,10 @@ public abstract class RSModelMixin implements RSModel if (modelUV != null) { - System.arraycopy(modelUV, 0, uv, idx, model.getTrianglesCount() * 6); + System.arraycopy(modelUV, 0, uv, idx, model.getFaceCount() * 6); } - idx += model.getTrianglesCount() * 6; + idx += model.getFaceCount() * 6; } } @@ -131,14 +131,14 @@ public abstract class RSModelMixin implements RSModel @Inject public List getTriangles() { - int[] trianglesX = getTrianglesX(); - int[] trianglesY = getTrianglesY(); - int[] trianglesZ = getTrianglesZ(); + int[] trianglesX = getFaceIndices1(); + int[] trianglesY = getFaceIndices2(); + int[] trianglesZ = getFaceIndices3(); List vertices = getVertices(); - List triangles = new ArrayList<>(getTrianglesCount()); + List triangles = new ArrayList<>(getFaceCount()); - for (int i = 0; i < getTrianglesCount(); ++i) + for (int i = 0; i < getFaceCount(); ++i) { int triangleX = trianglesX[i]; int triangleY = trianglesY[i]; @@ -408,14 +408,14 @@ public abstract class RSModelMixin implements RSModel rl$vertexNormalsY = new int[verticesCount]; rl$vertexNormalsZ = new int[verticesCount]; - int[] trianglesX = getTrianglesX(); - int[] trianglesY = getTrianglesY(); - int[] trianglesZ = getTrianglesZ(); + int[] trianglesX = getFaceIndices1(); + int[] trianglesY = getFaceIndices2(); + int[] trianglesZ = getFaceIndices3(); int[] verticesX = getVerticesX(); int[] verticesY = getVerticesY(); int[] verticesZ = getVerticesZ(); - for (int i = 0; i < getTrianglesCount(); ++i) + for (int i = 0; i < getFaceCount(); ++i) { int var9 = trianglesX[i]; int var10 = trianglesY[i]; diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java index 2fd8f9b6a4..661f076b0c 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java @@ -181,13 +181,13 @@ public abstract class RSPlayerMixin implements RSPlayer final int tileHeight = Perspective.getTileHeight(client, new LocalPoint(localX, localY), client.getPlane()); Perspective.modelToCanvas(client, model.getVerticesCount(), localX, localY, tileHeight, getOrientation(), model.getVerticesX(), model.getVerticesZ(), model.getVerticesY(), x2d, y2d); - ArrayList polys = new ArrayList(model.getTrianglesCount()); + ArrayList polys = new ArrayList(model.getFaceCount()); - int[] trianglesX = model.getTrianglesX(); - int[] trianglesY = model.getTrianglesY(); - int[] trianglesZ = model.getTrianglesZ(); + int[] trianglesX = model.getFaceIndices1(); + int[] trianglesY = model.getFaceIndices2(); + int[] trianglesZ = model.getFaceIndices3(); - for (int triangle = 0; triangle < model.getTrianglesCount(); ++triangle) + for (int triangle = 0; triangle < model.getFaceCount(); ++triangle) { int[] xx = { diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RuneLiteObjectMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RuneLiteObjectMixin.java index b4db85cf4e..788eeaf7f5 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RuneLiteObjectMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RuneLiteObjectMixin.java @@ -24,9 +24,9 @@ */ package net.runelite.mixins; +import net.runelite.api.Animation; import net.runelite.api.Model; import net.runelite.api.Perspective; -import net.runelite.api.Sequence; import net.runelite.api.coords.LocalPoint; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; @@ -55,7 +55,7 @@ public abstract class RuneLiteObjectMixin implements RSRuneLiteObject } @Inject - public void setAnimation(Sequence var1) + public void setAnimation(Animation var1) { setFrame(0); setFrameCycle(0); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSFriendLoginUpdate.java b/runescape-api/src/main/java/net/runelite/rs/api/RSFriendLoginUpdate.java index b8de44e8a9..2a7721cdf3 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSFriendLoginUpdate.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSFriendLoginUpdate.java @@ -1,3 +1,13 @@ package net.runelite.rs.api; -public interface RSFriendLoginUpdate {} +import net.runelite.api.PendingLogin; +import net.runelite.mapping.Import; + +public interface RSFriendLoginUpdate extends PendingLogin +{ + @Import("username") + RSUsername getRsName(); + + @Import("world") + short getWorld(); +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSFriendSystem.java b/runescape-api/src/main/java/net/runelite/rs/api/RSFriendSystem.java index 87bd7ed14e..ad77d41299 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSFriendSystem.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSFriendSystem.java @@ -1,11 +1,12 @@ package net.runelite.rs.api; +import net.runelite.api.FriendContainer; import net.runelite.mapping.Import; public interface RSFriendSystem { @Import("friendsList") - RSFriendsList getFriendContainer(); + FriendContainer getFriendContainer(); @Import("ignoreList") RSIgnoreList getIgnoreContainer(); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSFriendsList.java b/runescape-api/src/main/java/net/runelite/rs/api/RSFriendsList.java index 68eddcc8a1..25666db7ff 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSFriendsList.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSFriendsList.java @@ -1,6 +1,12 @@ package net.runelite.rs.api; -import net.runelite.api.Friend; -import net.runelite.api.NameableContainer; +import net.runelite.api.Deque; +import net.runelite.api.FriendContainer; +import net.runelite.api.PendingLogin; +import net.runelite.mapping.Import; -public interface RSFriendsList extends NameableContainer {} +public interface RSFriendsList extends FriendContainer +{ + @Import("friendLoginUpdates") + Deque getPendingLogins(); +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSLink.java b/runescape-api/src/main/java/net/runelite/rs/api/RSLink.java index 3ff6db1a48..800b172b12 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSLink.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSLink.java @@ -1,3 +1,15 @@ package net.runelite.rs.api; -public interface RSLink {} +import net.runelite.mapping.Import; + +public interface RSLink +{ + @Import("previous") + RSLink getPrevious(); + + @Import("next") + RSLink next(); + + @Import("remove") + void remove(); +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSLinkDeque.java b/runescape-api/src/main/java/net/runelite/rs/api/RSLinkDeque.java index b55e7e1632..8610c54b61 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSLinkDeque.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSLinkDeque.java @@ -1,3 +1,25 @@ package net.runelite.rs.api; -public interface RSLinkDeque {} +import net.runelite.api.Deque; +import net.runelite.mapping.Import; + +public interface RSLinkDeque extends Deque +{ + @Import("current") + RSLink getCurrent(); + + @Import("current") + void setCurrent(RSLink link); + + @Import("sentinel") + RSLink getSentinel(); + + @Import("last") + RSLink last(); + + @Import("previous") + RSLink previous(); + + @Import("addFirst") + void addFirst(RSLink val); +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSModel.java b/runescape-api/src/main/java/net/runelite/rs/api/RSModel.java index de2835e5f2..afeacaabe9 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSModel.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSModel.java @@ -48,19 +48,19 @@ public interface RSModel extends RSRenderable, Model @Import("indicesCount") @Override - int getTrianglesCount(); + int getFaceCount(); @Import("indices1") @Override - int[] getTrianglesX(); + int[] getFaceIndices1(); @Import("indices2") @Override - int[] getTrianglesY(); + int[] getFaceIndices2(); @Import("indices3") @Override - int[] getTrianglesZ(); + int[] getFaceIndices3(); @Import("faceColors1") @Override @@ -76,7 +76,7 @@ public interface RSModel extends RSRenderable, Model @Import("faceAlphas") @Override - byte[] getTriangleTransparencies(); + byte[] getFaceTransparencies(); @Import("faceRenderPriorities") @Override @@ -184,4 +184,20 @@ public interface RSModel extends RSRenderable, Model int[] getVertexNormalsZ(); void setVertexNormalsZ(int[] vertexNormalsZ); + + @Import("overrideAmount") + @Override + byte getOverrideAmount(); + + @Import("overrideHue") + @Override + byte getOverrideHue(); + + @Import("overrideSaturation") + @Override + byte getOverrideSaturation(); + + @Import("overrideLuminance") + @Override + byte getOverrideLuminance(); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSObjectSound.java b/runescape-api/src/main/java/net/runelite/rs/api/RSObjectSound.java index 3be4aba4d0..68e2aa226b 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSObjectSound.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSObjectSound.java @@ -1,8 +1,9 @@ package net.runelite.rs.api; +import net.runelite.api.AmbientSoundEffect; import net.runelite.mapping.Import; -public interface RSObjectSound +public interface RSObjectSound extends AmbientSoundEffect { @Import("x") int getX(); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSRuneLiteIterableLinkDeque.java b/runescape-api/src/main/java/net/runelite/rs/api/RSRuneLiteIterableLinkDeque.java new file mode 100644 index 0000000000..0d63db74fe --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSRuneLiteIterableLinkDeque.java @@ -0,0 +1,4 @@ +package net.runelite.rs.api; + +public interface RSRuneLiteIterableLinkDeque +{} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSRuneLiteIterableNodeDeque.java b/runescape-api/src/main/java/net/runelite/rs/api/RSRuneLiteIterableNodeDeque.java new file mode 100644 index 0000000000..9816004c85 --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSRuneLiteIterableNodeDeque.java @@ -0,0 +1,4 @@ +package net.runelite.rs.api; + +public interface RSRuneLiteIterableNodeDeque +{} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSSequenceDefinition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSSequenceDefinition.java index 8436ba4d11..79e4ef0ace 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSSequenceDefinition.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSSequenceDefinition.java @@ -1,26 +1,11 @@ package net.runelite.rs.api; -import net.runelite.api.Sequence; +import net.runelite.api.Animation; import net.runelite.api.SequenceDefinition; import net.runelite.mapping.Import; -public interface RSSequenceDefinition extends RSNode, SequenceDefinition, Sequence +public interface RSSequenceDefinition extends RSNode, SequenceDefinition, Animation { -// @Import("stretches") -// boolean getStretches(); -// -// @Import("maxLoops") -// int getMaxLoops(); -// -// @Import("precedenceAnimating") --- All unused -// int getPrecedenceAnimating(); -// -// @Import("replyMode") -// int getReplyMode(); -// -// @Import("interleaveLeave") -// int[] getInterleaveLeave(); - @Import("frameCount") @Override int getFrameCount(); diff --git a/runescape-client/src/main/java/Model.java b/runescape-client/src/main/java/Model.java index 9a27115261..04d186a751 100644 --- a/runescape-client/src/main/java/Model.java +++ b/runescape-client/src/main/java/Model.java @@ -200,13 +200,17 @@ public class Model extends Renderable { @Export("zMidOffset") int zMidOffset; @ObfuscatedName("bo") - public byte field2494; + @Export("overrideHue") + public byte overrideHue; @ObfuscatedName("bf") - public byte field2495; + @Export("overrideSaturation") + public byte overrideSaturation; @ObfuscatedName("be") - public byte field2479; + @Export("overrideLuminance") + public byte overrideLuminance; @ObfuscatedName("ce") - public byte field2474; + @Export("overrideAmount") + public byte overrideAmount; static { Model_sharedSequenceModel = new Model(); @@ -574,7 +578,7 @@ public class Model extends Renderable { var2.field2449 = this.field2449; var2.isSingleTile = this.isSingleTile; var2.resetBounds(); - var2.field2474 = 0; + var2.overrideAmount = 0; return var2; } @@ -1569,10 +1573,10 @@ public class Model extends Renderable { } } else if (this.faceColors3[var1] == -1) { Rasterizer3D.method3856(modelViewportYs[var2], modelViewportYs[var3], modelViewportYs[var4], modelViewportXs[var2], modelViewportXs[var3], modelViewportXs[var4], Model_colorPalette[this.faceColors1[var1]]); - } else if (this.field2474 > 0) { - var5 = this.method4216(this.faceColors1[var1], this.field2494, this.field2495, this.field2479, this.field2474); - var6 = this.method4216(this.faceColors2[var1], this.field2494, this.field2495, this.field2479, this.field2474); - var7 = this.method4216(this.faceColors3[var1], this.field2494, this.field2495, this.field2479, this.field2474); + } else if (this.overrideAmount > 0) { + var5 = this.method4216(this.faceColors1[var1], this.overrideHue, this.overrideSaturation, this.overrideLuminance, this.overrideAmount); + var6 = this.method4216(this.faceColors2[var1], this.overrideHue, this.overrideSaturation, this.overrideLuminance, this.overrideAmount); + var7 = this.method4216(this.faceColors3[var1], this.overrideHue, this.overrideSaturation, this.overrideLuminance, this.overrideAmount); Rasterizer3D.method3854(modelViewportYs[var2], modelViewportYs[var3], modelViewportYs[var4], modelViewportXs[var2], modelViewportXs[var3], modelViewportXs[var4], var5, var6, var7); } else { Rasterizer3D.method3854(modelViewportYs[var2], modelViewportYs[var3], modelViewportYs[var4], modelViewportXs[var2], modelViewportXs[var3], modelViewportXs[var4], this.faceColors1[var1], this.faceColors2[var1], this.faceColors3[var1]); diff --git a/runescape-client/src/main/java/NPC.java b/runescape-client/src/main/java/NPC.java index 0507cf325a..54bc07a1b2 100644 --- a/runescape-client/src/main/java/NPC.java +++ b/runescape-client/src/main/java/NPC.java @@ -129,12 +129,12 @@ public final class NPC extends Actor { } if (super.field1146 != 0 && Client.cycle >= super.field1141 && Client.cycle < super.field1140) { - var3.field2494 = super.field1143; - var3.field2495 = super.field1144; - var3.field2479 = super.field1095; - var3.field2474 = super.field1146; + var3.overrideHue = super.field1143; + var3.overrideSaturation = super.field1144; + var3.overrideLuminance = super.field1095; + var3.overrideAmount = super.field1146; } else { - var3.field2474 = 0; + var3.overrideAmount = 0; } return var3; diff --git a/runescape-client/src/main/java/Player.java b/runescape-client/src/main/java/Player.java index 0866f9e41e..b0e15a332a 100644 --- a/runescape-client/src/main/java/Player.java +++ b/runescape-client/src/main/java/Player.java @@ -381,12 +381,12 @@ public final class Player extends Actor { var3.isSingleTile = true; if (super.field1146 != 0 && Client.cycle >= super.field1141 && Client.cycle < super.field1140) { - var3.field2494 = super.field1143; - var3.field2495 = super.field1144; - var3.field2479 = super.field1095; - var3.field2474 = super.field1146; + var3.overrideHue = super.field1143; + var3.overrideSaturation = super.field1144; + var3.overrideLuminance = super.field1095; + var3.overrideAmount = super.field1146; } else { - var3.field2474 = 0; + var3.overrideAmount = 0; } return var3; diff --git a/runescape-client/src/main/java/RuneLiteIterableLinkDeque.java b/runescape-client/src/main/java/RuneLiteIterableLinkDeque.java new file mode 100644 index 0000000000..2b53c7a870 --- /dev/null +++ b/runescape-client/src/main/java/RuneLiteIterableLinkDeque.java @@ -0,0 +1,49 @@ +import java.util.Iterator; +import java.util.NoSuchElementException; + +public class RuneLiteIterableLinkDeque implements Iterator +{ + public final LinkDeque linkDeque; + public Link link; + + public RuneLiteIterableLinkDeque(LinkDeque linkDeque) + { + this.linkDeque = linkDeque; + this.link = this.linkDeque.sentinel.previous; + } + + @Override + public boolean hasNext() + { + return this.link != this.linkDeque.sentinel; + } + + @Override + public Link next() + { + if (this.link == this.linkDeque.sentinel) + { + throw new NoSuchElementException(); + } + else + { + Link friendLoginUpdate = this.link; + this.link = this.link.previous; + + return friendLoginUpdate; + } + } + + public void remove() + { + Link link = this.link.next; + if (link == this.linkDeque.sentinel) + { + throw new IllegalStateException(); + } + else + { + link.remove(); + } + } +} diff --git a/runescape-client/src/main/java/RuneLiteIterableNodeDeque.java b/runescape-client/src/main/java/RuneLiteIterableNodeDeque.java new file mode 100644 index 0000000000..b6bfb495e4 --- /dev/null +++ b/runescape-client/src/main/java/RuneLiteIterableNodeDeque.java @@ -0,0 +1,49 @@ +import java.util.Iterator; +import java.util.NoSuchElementException; + +public class RuneLiteIterableNodeDeque implements Iterator +{ + public final NodeDeque nodeDeque; + public Node node; + + public RuneLiteIterableNodeDeque(NodeDeque nodeDeque) + { + this.nodeDeque = nodeDeque; + this.node = this.nodeDeque.sentinel.previous; + } + + @Override + public boolean hasNext() + { + return this.node != this.nodeDeque.sentinel; + } + + @Override + public Node next() + { + if (this.node == this.nodeDeque.sentinel) + { + throw new NoSuchElementException(); + } + else + { + Node node = this.node; + this.node = this.node.previous; + + return node; + } + } + + public void remove() + { + Node node = this.node.next; + if (node == this.nodeDeque.sentinel) + { + throw new IllegalStateException(); + } + else + { + node.remove(); + } + } +} diff --git a/runescape-client/src/main/java/RuneLiteIterableHashTable.java b/runescape-client/src/main/java/RuneLiteIterableNodeHashTable.java similarity index 89% rename from runescape-client/src/main/java/RuneLiteIterableHashTable.java rename to runescape-client/src/main/java/RuneLiteIterableNodeHashTable.java index ca4f181efb..5fd93eaee1 100644 --- a/runescape-client/src/main/java/RuneLiteIterableHashTable.java +++ b/runescape-client/src/main/java/RuneLiteIterableNodeHashTable.java @@ -1,13 +1,13 @@ import java.util.Iterator; import java.util.NoSuchElementException; -public class RuneLiteIterableHashTable implements Iterator +public class RuneLiteIterableNodeHashTable implements Iterator { public Node node; public final NodeHashTable nodeHashTable; public int it; - public RuneLiteIterableHashTable(NodeHashTable nodeHashTable) + public RuneLiteIterableNodeHashTable(NodeHashTable nodeHashTable) { this.nodeHashTable = nodeHashTable; }