Merge branch 'master' into loot-tracker-reset
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
patreon: RuneLitePlus
|
||||
@@ -13,3 +13,4 @@ git
|
||||
classes/artifacts/client_jar/run.bat
|
||||
classes/artifacts/client_jar/client.jar
|
||||
*.jar
|
||||
.live/
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
<parent>
|
||||
<groupId>net.runelite</groupId>
|
||||
<artifactId>runelite-parent</artifactId>
|
||||
<version>1.5.28-SNAPSHOT</version>
|
||||
<version>1.5.29-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>cache-client</artifactId>
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<parent>
|
||||
<groupId>net.runelite</groupId>
|
||||
<artifactId>runelite-parent</artifactId>
|
||||
<version>1.5.28-SNAPSHOT</version>
|
||||
<version>1.5.29-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<name>Cache Updater</name>
|
||||
|
||||
Vendored
+1
-1
@@ -29,7 +29,7 @@
|
||||
<parent>
|
||||
<groupId>net.runelite</groupId>
|
||||
<artifactId>runelite-parent</artifactId>
|
||||
<version>1.5.28-SNAPSHOT</version>
|
||||
<version>1.5.29-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>cache</artifactId>
|
||||
|
||||
@@ -78,6 +78,7 @@ public class Instructions
|
||||
add(CC_SETSIZE, "cc_setsize");
|
||||
add(CC_SETHIDE, "cc_sethide");
|
||||
add(CC_SETNOCLICKTHROUGH, "cc_setnoclickthrough");
|
||||
add(CC_SETNOSCROLLTHROUGH, "cc_setnoscrollthrough");
|
||||
add(CC_SETSCROLLPOS, "cc_setscrollpos");
|
||||
add(CC_SETCOLOUR, "cc_setcolour");
|
||||
add(CC_SETFILL, "cc_setfill");
|
||||
@@ -287,11 +288,14 @@ public class Instructions
|
||||
add(SETSHOWLOADINGMESSAGES, "setshowloadingmessages");
|
||||
add(SETTAPTODROP, "settaptodrop");
|
||||
add(GETTAPTODROP, "gettaptodrop");
|
||||
add(SETOCULUSORBSPEED, "setoculusorbspeed");
|
||||
add(GETCANVASSIZE, "getcanvassize");
|
||||
add(SETHIDEUSERNAME, "sethideusername");
|
||||
add(GETHIDEUSERNAME, "gethideusername");
|
||||
add(SETREMEMBERUSERNAME, "setrememberusername");
|
||||
add(GETREMEMBERUSERNAME, "getrememberusername");
|
||||
add(SETTITLEMUSICENABLED, "settitlemusicenabled");
|
||||
add(GETTITLEMUSICENABLED, "gettitlemusicenabled");
|
||||
add(SOUND_SYNTH, "sound_synth");
|
||||
add(SOUND_SONG, "sound_song");
|
||||
add(SOUND_JINGLE, "sound_jingle");
|
||||
@@ -411,6 +415,7 @@ public class Instructions
|
||||
add(REMOVETAGS, "removetags");
|
||||
add(STRING_INDEXOF_CHAR, "string_indexof_char");
|
||||
add(STRING_INDEXOF_STRING, "string_indexof_string");
|
||||
add(UPPERCASE, "uppercase");
|
||||
add(OC_NAME, "oc_name");
|
||||
add(OC_OP, "oc_op");
|
||||
add(OC_IOP, "oc_iop");
|
||||
@@ -461,6 +466,7 @@ public class Instructions
|
||||
add(WORLDLIST_NEXT, "worldlist_next");
|
||||
add(WORLDLIST_SPECIFIC, "worldlist_specific");
|
||||
add(WORLDLIST_SORT, "worldlist_sort");
|
||||
add(GETWORLDINFO, "getworldinfo");
|
||||
add(SETFOLLOWEROPSLOWPRIORITY, "setfolloweropslowpriority");
|
||||
add(NC_PARAM, "nc_param");
|
||||
add(LC_PARAM, "lc_param");
|
||||
|
||||
@@ -69,6 +69,7 @@ public class Opcodes
|
||||
public static final int CC_SETSIZE = 1001;
|
||||
public static final int CC_SETHIDE = 1003;
|
||||
public static final int CC_SETNOCLICKTHROUGH = 1005;
|
||||
public static final int CC_SETNOSCROLLTHROUGH = 1006;
|
||||
public static final int CC_SETSCROLLPOS = 1100;
|
||||
public static final int CC_SETCOLOUR = 1101;
|
||||
public static final int CC_SETFILL = 1102;
|
||||
@@ -278,11 +279,14 @@ public class Opcodes
|
||||
public static final int SETSHOWLOADINGMESSAGES = 3126;
|
||||
public static final int SETTAPTODROP = 3127;
|
||||
public static final int GETTAPTODROP = 3128;
|
||||
public static final int SETOCULUSORBSPEED = 3129;
|
||||
public static final int GETCANVASSIZE = 3132;
|
||||
public static final int SETHIDEUSERNAME = 3141;
|
||||
public static final int GETHIDEUSERNAME = 3142;
|
||||
public static final int SETREMEMBERUSERNAME = 3143;
|
||||
public static final int GETREMEMBERUSERNAME = 3144;
|
||||
public static final int SETTITLEMUSICENABLED = 3146;
|
||||
public static final int GETTITLEMUSICENABLED = 3147;
|
||||
public static final int SOUND_SYNTH = 3200;
|
||||
public static final int SOUND_SONG = 3201;
|
||||
public static final int SOUND_JINGLE = 3202;
|
||||
@@ -402,6 +406,7 @@ public class Opcodes
|
||||
public static final int REMOVETAGS = 4119;
|
||||
public static final int STRING_INDEXOF_CHAR = 4120;
|
||||
public static final int STRING_INDEXOF_STRING = 4121;
|
||||
public static final int UPPERCASE = 4122;
|
||||
public static final int OC_NAME = 4200;
|
||||
public static final int OC_OP = 4201;
|
||||
public static final int OC_IOP = 4202;
|
||||
@@ -452,6 +457,7 @@ public class Opcodes
|
||||
public static final int WORLDLIST_NEXT = 6502;
|
||||
public static final int WORLDLIST_SPECIFIC = 6506;
|
||||
public static final int WORLDLIST_SORT = 6507;
|
||||
public static final int GETWORLDINFO = 6511;
|
||||
public static final int SETFOLLOWEROPSLOWPRIORITY = 6512;
|
||||
public static final int NC_PARAM = 6513;
|
||||
public static final int LC_PARAM = 6514;
|
||||
|
||||
+1
-1
@@ -88,7 +88,7 @@ public class FrameDumper
|
||||
|
||||
int framemapArchiveId = (contents[0] & 0xff) << 8 | contents[1] & 0xff;
|
||||
|
||||
Archive framemapArchive = framemapIndex.getArchives().get(framemapArchiveId);
|
||||
Archive framemapArchive = framemapIndex.getArchive(framemapArchiveId);
|
||||
archiveData = storage.loadArchive(framemapArchive);
|
||||
byte[] framemapContents = framemapArchive.decompress(archiveData);
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<?xml version="1.0"?>
|
||||
<!--
|
||||
Copyright (c) 2017, Adam <Adam@sigterm.info>
|
||||
Copyright (c) 2019, ThatGamerBlue <thatgamerblue@gmail.com>
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@@ -40,6 +41,11 @@
|
||||
<property name="message" value="Indent must use tab characters"/>
|
||||
<property name="ignoreComments" value="true"/>
|
||||
</module>
|
||||
<module name="RegexpSinglelineJava">
|
||||
<property name="format" value="import (?!static|java\.awt).*\*"/>
|
||||
<property name="message" value="Multiline imports are disallowed if they are not static"/>
|
||||
<property name="ignoreComments" value="true"/>
|
||||
</module>
|
||||
<module name="WhitespaceAround"/>
|
||||
<module name="WhitespaceAfter">
|
||||
<property name="tokens" value="COMMA"/>
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
<parent>
|
||||
<groupId>net.runelite</groupId>
|
||||
<artifactId>runelite-parent</artifactId>
|
||||
<version>1.5.28-SNAPSHOT</version>
|
||||
<version>1.5.29-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>deobfuscator</artifactId>
|
||||
@@ -65,6 +65,7 @@
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-simple</artifactId>
|
||||
<version>1.7.12</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.code.gson</groupId>
|
||||
|
||||
@@ -110,7 +110,7 @@ public class Type
|
||||
{
|
||||
s = s.substring(1);
|
||||
}
|
||||
if (s.startsWith("L"))
|
||||
if (s.startsWith("L") && s.endsWith(";"))
|
||||
{
|
||||
return s.substring(1, s.length() - 1);
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ import net.runelite.asm.Field;
|
||||
import net.runelite.asm.Method;
|
||||
import net.runelite.asm.signature.util.VirtualMethods;
|
||||
import net.runelite.deob.Deob;
|
||||
import net.runelite.deob.DeobAnnotations;
|
||||
import net.runelite.deob.Deobfuscator;
|
||||
import net.runelite.deob.util.NameMappings;
|
||||
|
||||
@@ -60,7 +61,7 @@ public class RenameUnique implements Deobfuscator
|
||||
for (ClassFile cf : group.getClasses())
|
||||
for (Field field : cf.getFields())
|
||||
{
|
||||
if (field.getName().length() > Deob.OBFUSCATED_NAME_MAX_LEN)
|
||||
if (field.getName().length() > Deob.OBFUSCATED_NAME_MAX_LEN && !field.getName().startsWith("__") || field.getName().equals(DeobAnnotations.getExportedName(field.getAnnotations())))
|
||||
continue;
|
||||
|
||||
map.map(field.getPoolField(), "field" + i++);
|
||||
@@ -74,7 +75,7 @@ public class RenameUnique implements Deobfuscator
|
||||
for (ClassFile cf : group.getClasses())
|
||||
for (Method method : cf.getMethods())
|
||||
{
|
||||
if (method.getName().length() > Deob.OBFUSCATED_NAME_MAX_LEN)
|
||||
if (method.getName().length() > Deob.OBFUSCATED_NAME_MAX_LEN && !method.getName().startsWith("__") || method.getName().equals(DeobAnnotations.getExportedName(method.getAnnotations())))
|
||||
continue;
|
||||
|
||||
List<Method> virtualMethods = VirtualMethods.getVirtualMethods(method);
|
||||
|
||||
@@ -216,6 +216,8 @@ public class Renamer implements Deobfuscator
|
||||
field.getAnnotations().addAnnotation(DeobAnnotations.OBFUSCATED_NAME, "value", field.getName());
|
||||
}
|
||||
|
||||
assert DeobAnnotations.getExportedName(field.getAnnotations()) == null || DeobAnnotations.getExportedName(field.getAnnotations()).equals(newName) : "Tried changing field name to something other than the exported name!";
|
||||
|
||||
field.setName(newName);
|
||||
++fields;
|
||||
}
|
||||
|
||||
+152
@@ -0,0 +1,152 @@
|
||||
package net.runelite.deob.deobfuscators.transformers;
|
||||
|
||||
import java.util.ListIterator;
|
||||
import net.runelite.asm.ClassFile;
|
||||
import net.runelite.asm.ClassGroup;
|
||||
import net.runelite.asm.Field;
|
||||
import net.runelite.asm.Method;
|
||||
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.instruction.types.PushConstantInstruction;
|
||||
import net.runelite.asm.attributes.code.instructions.GetStatic;
|
||||
import net.runelite.asm.attributes.code.instructions.ILoad;
|
||||
import net.runelite.asm.attributes.code.instructions.IfICmpEq;
|
||||
import net.runelite.asm.attributes.code.instructions.IfICmpNe;
|
||||
import net.runelite.asm.attributes.code.instructions.LDC;
|
||||
import net.runelite.asm.attributes.code.instructions.PutStatic;
|
||||
import net.runelite.asm.attributes.code.instructions.VReturn;
|
||||
import net.runelite.asm.pool.Class;
|
||||
import net.runelite.asm.signature.Signature;
|
||||
import net.runelite.deob.Transformer;
|
||||
import net.runelite.deob.deobfuscators.transformers.scriptopcodes.ScriptOpcode;
|
||||
import org.objectweb.asm.Opcodes;
|
||||
import static org.objectweb.asm.Opcodes.ACC_FINAL;
|
||||
import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
|
||||
import static org.objectweb.asm.Opcodes.ACC_STATIC;
|
||||
|
||||
public class ScriptOpcodesTransformer implements Transformer // robots in disguise
|
||||
{
|
||||
private static final String SCRIPT_OPCODES = "net/runelite/rs/ScriptOpcodes";
|
||||
|
||||
@Override
|
||||
public void transform(ClassGroup group)
|
||||
{
|
||||
initializeOpcodesClassFile(group);
|
||||
|
||||
for (ClassFile cf : group.getClasses())
|
||||
{
|
||||
if (cf.getName().startsWith("net/runelite/rs"))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
for (Method m : cf.getMethods())
|
||||
{
|
||||
if (!m.isStatic())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!m.getDescriptor().getArguments().contains(new Type("LScript;")) && !m.getDescriptor().getArguments().contains(new Type("LScriptEvent;")))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
boolean varIndexIsKnownAnd0 = m.getDescriptor().getArguments().contains(new Type("LScript;"));
|
||||
|
||||
Code code = m.getCode();
|
||||
Instructions ins = code.getInstructions();
|
||||
ListIterator<Instruction> it = ins.getInstructions().listIterator();
|
||||
|
||||
Instruction i;
|
||||
while (it.hasNext())
|
||||
{
|
||||
i = it.next();
|
||||
|
||||
if (!(i instanceof ILoad) || (varIndexIsKnownAnd0 && ((ILoad) i).getVariableIndex() != 0))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
i = it.next();
|
||||
|
||||
if (!(i instanceof PushConstantInstruction) ||
|
||||
!(((PushConstantInstruction) i).getConstant() instanceof Number))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
int val = ((Number) ((PushConstantInstruction) i).getConstant()).intValue();
|
||||
String name = ScriptOpcode.nameFromID(val);
|
||||
|
||||
i = it.next();
|
||||
|
||||
if (name == null || !(i instanceof IfICmpNe || i instanceof IfICmpEq))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
it.previous();
|
||||
it.previous();
|
||||
|
||||
net.runelite.asm.pool.Field pool = new net.runelite.asm.pool.Field(
|
||||
new Class(SCRIPT_OPCODES),
|
||||
name,
|
||||
Type.INT
|
||||
);
|
||||
|
||||
GetStatic getStatic = new GetStatic(ins, pool);
|
||||
it.set(getStatic);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void initializeOpcodesClassFile(ClassGroup group)
|
||||
{
|
||||
ClassFile scriptOpcodes = group.findClass(SCRIPT_OPCODES);
|
||||
if (scriptOpcodes == null)
|
||||
{
|
||||
scriptOpcodes = new ClassFile(group);
|
||||
scriptOpcodes.setName(SCRIPT_OPCODES);
|
||||
scriptOpcodes.setSuperName(Type.OBJECT.getInternalName());
|
||||
scriptOpcodes.setAccess(Opcodes.ACC_PUBLIC);
|
||||
group.addClass(scriptOpcodes);
|
||||
}
|
||||
else
|
||||
{
|
||||
scriptOpcodes.getFields().clear();
|
||||
}
|
||||
|
||||
Method clinit = scriptOpcodes.findMethod("<clinit>");
|
||||
if (clinit == null)
|
||||
{
|
||||
clinit = new Method(scriptOpcodes, "<clinit>", new Signature("()V"));
|
||||
clinit.setStatic(true);
|
||||
Code code = new Code(clinit);
|
||||
code.setMaxStack(1);
|
||||
clinit.setCode(code);
|
||||
scriptOpcodes.addMethod(clinit);
|
||||
}
|
||||
|
||||
Code code = clinit.getCode();
|
||||
Instructions ins = code.getInstructions();
|
||||
|
||||
for (ScriptOpcode opcode : ScriptOpcode.values())
|
||||
{
|
||||
Field field = new Field(scriptOpcodes, opcode.name(), Type.INT);
|
||||
field.setAccessFlags(ACC_PUBLIC | ACC_STATIC | ACC_FINAL);
|
||||
field.setValue(opcode.opcode);
|
||||
scriptOpcodes.addField(field);
|
||||
|
||||
LDC ldc = new LDC(ins, opcode.opcode);
|
||||
PutStatic put = new PutStatic(ins, field);
|
||||
ins.addInstruction(0, ldc);
|
||||
ins.addInstruction(1, put);
|
||||
}
|
||||
|
||||
ins.addInstruction(new VReturn(ins));
|
||||
}
|
||||
}
|
||||
+517
@@ -0,0 +1,517 @@
|
||||
package net.runelite.deob.deobfuscators.transformers.scriptopcodes;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import java.util.Map;
|
||||
|
||||
public enum ScriptOpcode
|
||||
{
|
||||
// This class is pretty much the same as net.runelite.cache.script.Opcodes, and should be updated alongside that
|
||||
|
||||
ICONST(0),
|
||||
GET_VARP(1),
|
||||
SET_VARP(2),
|
||||
SCONST(3),
|
||||
JUMP(6),
|
||||
IF_ICMPNE(7),
|
||||
IF_ICMPEQ(8),
|
||||
IF_ICMPLT(9),
|
||||
IF_ICMPGT(10),
|
||||
RETURN(21),
|
||||
GET_VARBIT(25),
|
||||
SET_VARBIT(27),
|
||||
IF_ICMPLE(31),
|
||||
IF_ICMPGE(32),
|
||||
ILOAD(33),
|
||||
ISTORE(34),
|
||||
SLOAD(35),
|
||||
SSTORE(36),
|
||||
JOIN_STRING(37),
|
||||
POP_INT(38),
|
||||
POP_STRING(39),
|
||||
INVOKE(40),
|
||||
GET_VARC_INT(42),
|
||||
SET_VARC_INT(43),
|
||||
DEFINE_ARRAY(44),
|
||||
GET_ARRAY_INT(45),
|
||||
SET_ARRAY_INT(46),
|
||||
GET_VARC_STRING_OLD(47),
|
||||
SET_VARC_STRING_OLD(48),
|
||||
GET_VARC_STRING(49),
|
||||
SET_VARC_STRING(50),
|
||||
SWITCH(60),
|
||||
CC_CREATE(100),
|
||||
CC_DELETE(101),
|
||||
CC_DELETEALL(102),
|
||||
CC_FIND(200),
|
||||
IF_FIND(201),
|
||||
CC_SETPOSITION(1000),
|
||||
CC_SETSIZE(1001),
|
||||
CC_SETHIDE(1003),
|
||||
CC_SETNOCLICKTHROUGH(1005),
|
||||
CC_SETNOSCROLLTHROUGH(1006),
|
||||
CC_SETSCROLLPOS(1100),
|
||||
CC_SETCOLOUR(1101),
|
||||
CC_SETFILL(1102),
|
||||
CC_SETTRANS(1103),
|
||||
CC_SETLINEWID(1104),
|
||||
CC_SETGRAPHIC(1105),
|
||||
CC_SET2DANGLE(1106),
|
||||
CC_SETTILING(1107),
|
||||
CC_SETMODEL(1108),
|
||||
CC_SETMODELANGLE(1109),
|
||||
CC_SETMODELANIM(1110),
|
||||
CC_SETMODELORTHOG(1111),
|
||||
CC_SETTEXT(1112),
|
||||
CC_SETTEXTFONT(1113),
|
||||
CC_SETTEXTALIGN(1114),
|
||||
CC_SETTEXTSHADOW(1115),
|
||||
CC_SETOUTLINE(1116),
|
||||
CC_SETGRAPHICSHADOW(1117),
|
||||
CC_SETVFLIP(1118),
|
||||
CC_SETHFLIP(1119),
|
||||
CC_SETSCROLLSIZE(1120),
|
||||
CC_RESUME_PAUSEBUTTON(1121),
|
||||
CC_SETFILLCOLOUR(1123),
|
||||
CC_SETLINEDIRECTION(1126),
|
||||
CC_SETOBJECT(1200),
|
||||
CC_SETNPCHEAD(1201),
|
||||
CC_SETPLAYERHEAD_SELF(1202),
|
||||
CC_SETOBJECT_NONUM(1205),
|
||||
CC_SETOBJECT_ALWAYS_NUM(1212),
|
||||
CC_SETOP(1300),
|
||||
CC_SETDRAGGABLE(1301),
|
||||
CC_SETDRAGGABLEBEHAVIOR(1302),
|
||||
CC_SETDRAGDEADZONE(1303),
|
||||
CC_SETDRAGDEADTIME(1304),
|
||||
CC_SETOPBASE(1305),
|
||||
CC_SETTARGETVERB(1306),
|
||||
CC_CLEAROPS(1307),
|
||||
CC_SETONCLICK(1400),
|
||||
CC_SETONHOLD(1401),
|
||||
CC_SETONRELEASE(1402),
|
||||
CC_SETONMOUSEOVER(1403),
|
||||
CC_SETONMOUSELEAVE(1404),
|
||||
CC_SETONDRAG(1405),
|
||||
CC_SETONTARGETLEAVE(1406),
|
||||
CC_SETONVARTRANSMIT(1407),
|
||||
CC_SETONTIMER(1408),
|
||||
CC_SETONOP(1409),
|
||||
CC_SETONDRAGCOMPLETE(1410),
|
||||
CC_SETONCLICKREPEAT(1411),
|
||||
CC_SETONMOUSEREPEAT(1412),
|
||||
CC_SETONINVTRANSMIT(1414),
|
||||
CC_SETONSTATTRANSMIT(1415),
|
||||
CC_SETONTARGETENTER(1416),
|
||||
CC_SETONSCROLLWHEEL(1417),
|
||||
CC_SETONCHATTRANSMIT(1418),
|
||||
CC_SETONKEY(1419),
|
||||
CC_SETONFRIENDTRANSMIT(1420),
|
||||
CC_SETONCLANTRANSMIT(1421),
|
||||
CC_SETONMISCTRANSMIT(1422),
|
||||
CC_SETONDIALOGABORT(1423),
|
||||
CC_SETONSUBCHANGE(1424),
|
||||
CC_SETONSTOCKTRANSMIT(1425),
|
||||
CC_SETONRESIZE(1427),
|
||||
CC_GETX(1500),
|
||||
CC_GETY(1501),
|
||||
CC_GETWIDTH(1502),
|
||||
CC_GETHEIGHT(1503),
|
||||
CC_GETHIDE(1504),
|
||||
CC_GETLAYER(1505),
|
||||
CC_GETSCROLLX(1600),
|
||||
CC_GETSCROLLY(1601),
|
||||
CC_GETTEXT(1602),
|
||||
CC_GETSCROLLWIDTH(1603),
|
||||
CC_GETSCROLLHEIGHT(1604),
|
||||
CC_GETMODELZOOM(1605),
|
||||
CC_GETMODELANGLE_X(1606),
|
||||
CC_GETMODELANGLE_Z(1607),
|
||||
CC_GETMODELANGLE_Y(1608),
|
||||
CC_GETTRANS(1609),
|
||||
CC_GETCOLOUR(1611),
|
||||
CC_GETFILLCOLOUR(1612),
|
||||
CC_GETINVOBJECT(1700),
|
||||
CC_GETINVCOUNT(1701),
|
||||
CC_GETID(1702),
|
||||
CC_GETTARGETMASK(1800),
|
||||
CC_GETOP(1801),
|
||||
CC_GETOPBASE(1802),
|
||||
CC_CALLONRESIZE(1927),
|
||||
IF_SETPOSITION(2000),
|
||||
IF_SETSIZE(2001),
|
||||
IF_SETHIDE(2003),
|
||||
IF_SETNOCLICKTHROUGH(2005),
|
||||
IF_SETSCROLLPOS(2100),
|
||||
IF_SETCOLOUR(2101),
|
||||
IF_SETFILL(2102),
|
||||
IF_SETTRANS(2103),
|
||||
IF_SETLINEWID(2104),
|
||||
IF_SETGRAPHIC(2105),
|
||||
IF_SET2DANGLE(2106),
|
||||
IF_SETTILING(2107),
|
||||
IF_SETMODEL(2108),
|
||||
IF_SETMODELANGLE(2109),
|
||||
IF_SETMODELANIM(2110),
|
||||
IF_SETMODELORTHOG(2111),
|
||||
IF_SETTEXT(2112),
|
||||
IF_SETTEXTFONT(2113),
|
||||
IF_SETTEXTALIGN(2114),
|
||||
IF_SETTEXTSHADOW(2115),
|
||||
IF_SETOUTLINE(2116),
|
||||
IF_SETGRAPHICSHADOW(2117),
|
||||
IF_SETVFLIP(2118),
|
||||
IF_SETHFLIP(2119),
|
||||
IF_SETSCROLLSIZE(2120),
|
||||
IF_RESUME_PAUSEBUTTON(2121),
|
||||
IF_SETFILLCOLOUR(2123),
|
||||
IF_SETLINEDIRECTION(2126),
|
||||
IF_SETOBJECT(2200),
|
||||
IF_SETNPCHEAD(2201),
|
||||
IF_SETPLAYERHEAD_SELF(2202),
|
||||
IF_SETOBJECT_NONUM(2205),
|
||||
IF_SETOBJECT_ALWAYS_NUM(2212),
|
||||
IF_SETOP(2300),
|
||||
IF_SETDRAGGABLE(2301),
|
||||
IF_SETDRAGGABLEBEHAVIOR(2302),
|
||||
IF_SETDRAGDEADZONE(2303),
|
||||
IF_SETDRAGDEADTIME(2304),
|
||||
IF_SETOPBASE(2305),
|
||||
IF_SETTARGETVERB(2306),
|
||||
IF_CLEAROPS(2307),
|
||||
IF_SETOPKEY(2350),
|
||||
IF_SETOPTKEY(2351),
|
||||
IF_SETOPKEYRATE(2352),
|
||||
IF_SETOPTKEYRATE(2353),
|
||||
IF_SETOPKEYIGNOREHELD(2354),
|
||||
IF_SETOPTKEYIGNOREHELD(2355),
|
||||
IF_SETONCLICK(2400),
|
||||
IF_SETONHOLD(2401),
|
||||
IF_SETONRELEASE(2402),
|
||||
IF_SETONMOUSEOVER(2403),
|
||||
IF_SETONMOUSELEAVE(2404),
|
||||
IF_SETONDRAG(2405),
|
||||
IF_SETONTARGETLEAVE(2406),
|
||||
IF_SETONVARTRANSMIT(2407),
|
||||
IF_SETONTIMER(2408),
|
||||
IF_SETONOP(2409),
|
||||
IF_SETONDRAGCOMPLETE(2410),
|
||||
IF_SETONCLICKREPEAT(2411),
|
||||
IF_SETONMOUSEREPEAT(2412),
|
||||
IF_SETONINVTRANSMIT(2414),
|
||||
IF_SETONSTATTRANSMIT(2415),
|
||||
IF_SETONTARGETENTER(2416),
|
||||
IF_SETONSCROLLWHEEL(2417),
|
||||
IF_SETONCHATTRANSMIT(2418),
|
||||
IF_SETONKEY(2419),
|
||||
IF_SETONFRIENDTRANSMIT(2420),
|
||||
IF_SETONCLANTRANSMIT(2421),
|
||||
IF_SETONMISCTRANSMIT(2422),
|
||||
IF_SETONDIALOGABORT(2423),
|
||||
IF_SETONSUBCHANGE(2424),
|
||||
IF_SETONSTOCKTRANSMIT(2425),
|
||||
IF_SETONRESIZE(2427),
|
||||
IF_GETX(2500),
|
||||
IF_GETY(2501),
|
||||
IF_GETWIDTH(2502),
|
||||
IF_GETHEIGHT(2503),
|
||||
IF_GETHIDE(2504),
|
||||
IF_GETLAYER(2505),
|
||||
IF_GETSCROLLX(2600),
|
||||
IF_GETSCROLLY(2601),
|
||||
IF_GETTEXT(2602),
|
||||
IF_GETSCROLLWIDTH(2603),
|
||||
IF_GETSCROLLHEIGHT(2604),
|
||||
IF_GETMODELZOOM(2605),
|
||||
IF_GETMODELANGLE_X(2606),
|
||||
IF_GETMODELANGLE_Z(2607),
|
||||
IF_GETMODELANGLE_Y(2608),
|
||||
IF_GETTRANS(2609),
|
||||
IF_GETCOLOUR(2611),
|
||||
IF_GETFILLCOLOUR(2612),
|
||||
IF_GETINVOBJECT(2700),
|
||||
IF_GETINVCOUNT(2701),
|
||||
IF_HASSUB(2702),
|
||||
IF_GETTOP(2706),
|
||||
IF_GETTARGETMASK(2800),
|
||||
IF_GETOP(2801),
|
||||
IF_GETOPBASE(2802),
|
||||
IF_CALLONRESIZE(2927),
|
||||
MES(3100),
|
||||
ANIM(3101),
|
||||
IF_CLOSE(3103),
|
||||
RESUME_COUNTDIALOG(3104),
|
||||
RESUME_NAMEDIALOG(3105),
|
||||
RESUME_STRINGDIALOG(3106),
|
||||
OPPLAYER(3107),
|
||||
IF_DRAGPICKUP(3108),
|
||||
CC_DRAGPICKUP(3109),
|
||||
MOUSECAM(3110),
|
||||
GETREMOVEROOFS(3111),
|
||||
SETREMOVEROOFS(3112),
|
||||
OPENURL(3113),
|
||||
RESUME_OBJDIALOG(3115),
|
||||
BUG_REPORT(3116),
|
||||
SETSHIFTCLICKDROP(3117),
|
||||
SETSHOWMOUSEOVERTEXT(3118),
|
||||
RENDERSELF(3119),
|
||||
SETSHOWMOUSECROSS(3125),
|
||||
SETSHOWLOADINGMESSAGES(3126),
|
||||
SETTAPTODROP(3127),
|
||||
GETTAPTODROP(3128),
|
||||
SETOCULUSORBSPEED(3129),
|
||||
GETCANVASSIZE(3132),
|
||||
SETHIDEUSERNAME(3141),
|
||||
GETHIDEUSERNAME(3142),
|
||||
SETREMEMBERUSERNAME(3143),
|
||||
GETREMEMBERUSERNAME(3144),
|
||||
SETTITLEMUSICENABLED(3146),
|
||||
GETTITLEMUSICENABLED(3147),
|
||||
SOUND_SYNTH(3200),
|
||||
SOUND_SONG(3201),
|
||||
SOUND_JINGLE(3202),
|
||||
CLIENTCLOCK(3300),
|
||||
INV_GETOBJ(3301),
|
||||
INV_GETNUM(3302),
|
||||
INV_TOTAL(3303),
|
||||
INV_SIZE(3304),
|
||||
STAT(3305),
|
||||
STAT_BASE(3306),
|
||||
STAT_XP(3307),
|
||||
COORD(3308),
|
||||
COORDX(3309),
|
||||
COORDZ(3310),
|
||||
COORDY(3311),
|
||||
MAP_MEMBERS(3312),
|
||||
INVOTHER_GETOBJ(3313),
|
||||
INVOTHER_GETNUM(3314),
|
||||
INVOTHER_TOTAL(3315),
|
||||
STAFFMODLEVEL(3316),
|
||||
REBOOTTIMER(3317),
|
||||
MAP_WORLD(3318),
|
||||
RUNENERGY_VISIBLE(3321),
|
||||
RUNWEIGHT_VISIBLE(3322),
|
||||
PLAYERMOD(3323),
|
||||
WORLDFLAGS(3324),
|
||||
MOVECOORD(3325),
|
||||
ENUM_STRING(3400),
|
||||
ENUM(3408),
|
||||
ENUM_GETOUTPUTCOUNT(3411),
|
||||
FRIEND_COUNT(3600),
|
||||
FRIEND_GETNAME(3601),
|
||||
FRIEND_GETWORLD(3602),
|
||||
FRIEND_GETRANK(3603),
|
||||
FRIEND_SETRANK(3604),
|
||||
FRIEND_ADD(3605),
|
||||
FRIEND_DEL(3606),
|
||||
IGNORE_ADD(3607),
|
||||
IGNORE_DEL(3608),
|
||||
FRIEND_TEST(3609),
|
||||
CLAN_GETCHATDISPLAYNAME(3611),
|
||||
CLAN_GETCHATCOUNT(3612),
|
||||
CLAN_GETCHATUSERNAME(3613),
|
||||
CLAN_GETCHATUSERWORLD(3614),
|
||||
CLAN_GETCHATUSERRANK(3615),
|
||||
CLAN_GETCHATMINKICK(3616),
|
||||
CLAN_KICKUSER(3617),
|
||||
CLAN_GETCHATRANK(3618),
|
||||
CLAN_JOINCHAT(3619),
|
||||
CLAN_LEAVECHAT(3620),
|
||||
IGNORE_COUNT(3621),
|
||||
IGNORE_GETNAME(3622),
|
||||
IGNORE_TEST(3623),
|
||||
CLAN_ISSELF(3624),
|
||||
CLAN_GETCHATOWNERNAME(3625),
|
||||
CLAN_ISFRIEND(3626),
|
||||
CLAN_ISIGNORE(3627),
|
||||
STOCKMARKET_GETOFFERTYPE(3903),
|
||||
STOCKMARKET_GETOFFERITEM(3904),
|
||||
STOCKMARKET_GETOFFERPRICE(3905),
|
||||
STOCKMARKET_GETOFFERCOUNT(3906),
|
||||
STOCKMARKET_GETOFFERCOMPLETEDCOUNT(3907),
|
||||
STOCKMARKET_GETOFFERCOMPLETEDGOLD(3908),
|
||||
STOCKMARKET_ISOFFEREMPTY(3910),
|
||||
STOCKMARKET_ISOFFERSTABLE(3911),
|
||||
STOCKMARKET_ISOFFERFINISHED(3912),
|
||||
STOCKMARKET_ISOFFERADDING(3913),
|
||||
TRADINGPOST_SORTBY_NAME(3914),
|
||||
TRADINGPOST_SORTBY_PRICE(3915),
|
||||
TRADINGPOST_SORTFILTERBY_WORLD(3916),
|
||||
TRADINGPOST_SORTBY_AGE(3917),
|
||||
TRADINGPOST_SORTBY_COUNT(3918),
|
||||
TRADINGPOST_GETTOTALOFFERS(3919),
|
||||
TRADINGPOST_GETOFFERWORLD(3920),
|
||||
TRADINGPOST_GETOFFERNAME(3921),
|
||||
TRADINGPOST_GETOFFERPREVIOUSNAME(3922),
|
||||
TRADINGPOST_GETOFFERAGE(3923),
|
||||
TRADINGPOST_GETOFFERCOUNT(3924),
|
||||
TRADINGPOST_GETOFFERPRICE(3925),
|
||||
TRADINGPOST_GETOFFERITEM(3926),
|
||||
ADD(4000),
|
||||
SUB(4001),
|
||||
MULTIPLY(4002),
|
||||
DIV(4003),
|
||||
RANDOM(4004),
|
||||
RANDOMINC(4005),
|
||||
INTERPOLATE(4006),
|
||||
ADDPERCENT(4007),
|
||||
SETBIT(4008),
|
||||
CLEARBIT(4009),
|
||||
TESTBIT(4010),
|
||||
MOD(4011),
|
||||
POW(4012),
|
||||
INVPOW(4013),
|
||||
AND(4014),
|
||||
OR(4015),
|
||||
SCALE(4018),
|
||||
APPEND_NUM(4100),
|
||||
APPEND(4101),
|
||||
APPEND_SIGNNUM(4102),
|
||||
LOWERCASE(4103),
|
||||
FROMDATE(4104),
|
||||
TEXT_GENDER(4105),
|
||||
TOSTRING(4106),
|
||||
COMPARE(4107),
|
||||
PARAHEIGHT(4108),
|
||||
PARAWIDTH(4109),
|
||||
TEXT_SWITCH(4110),
|
||||
ESCAPE(4111),
|
||||
APPEND_CHAR(4112),
|
||||
CHAR_ISPRINTABLE(4113),
|
||||
CHAR_ISALPHANUMERIC(4114),
|
||||
CHAR_ISALPHA(4115),
|
||||
CHAR_ISNUMERIC(4116),
|
||||
STRING_LENGTH(4117),
|
||||
SUBSTRING(4118),
|
||||
REMOVETAGS(4119),
|
||||
STRING_INDEXOF_CHAR(4120),
|
||||
STRING_INDEXOF_STRING(4121),
|
||||
UPPERCASE(4122),
|
||||
OC_NAME(4200),
|
||||
OC_OP(4201),
|
||||
OC_IOP(4202),
|
||||
OC_COST(4203),
|
||||
OC_STACKABLE(4204),
|
||||
OC_CERT(4205),
|
||||
OC_UNCERT(4206),
|
||||
OC_MEMBERS(4207),
|
||||
OC_PLACEHOLDER(4208),
|
||||
OC_UNPLACEHOLDER(4209),
|
||||
OC_FIND(4210),
|
||||
OC_FINDNEXT(4211),
|
||||
OC_FINDRESET(4212),
|
||||
CHAT_GETFILTER_PUBLIC(5000),
|
||||
CHAT_SETFILTER(5001),
|
||||
CHAT_SENDABUSEREPORT(5002),
|
||||
CHAT_GETHISTORY_BYTYPEANDLINE(5003),
|
||||
CHAT_GETHISTORY_BYUID(5004),
|
||||
CHAT_GETFILTER_PRIVATE(5005),
|
||||
CHAT_SENDPUBLIC(5008),
|
||||
CHAT_SENDPRIVATE(5009),
|
||||
CHAT_PLAYERNAME(5015),
|
||||
CHAT_GETFILTER_TRADE(5016),
|
||||
CHAT_GETHISTORYLENGTH(5017),
|
||||
CHAT_GETNEXTUID(5018),
|
||||
CHAT_GETPREVUID(5019),
|
||||
DOCHEAT(5020),
|
||||
CHAT_SETMESSAGEFILTER(5021),
|
||||
CHAT_GETMESSAGEFILTER(5022),
|
||||
GETWINDOWMODE(5306),
|
||||
SETWINDOWMODE(5307),
|
||||
GETDEFAULTWINDOWMODE(5308),
|
||||
SETDEFAULTWINDOWMODE(5309),
|
||||
CAM_FORCEANGLE(5504),
|
||||
CAM_GETANGLE_XA(5505),
|
||||
CAM_GETANGLE_YA(5506),
|
||||
CAM_SETFOLLOWHEIGHT(5530),
|
||||
CAM_GETFOLLOWHEIGHT(5531),
|
||||
LOGOUT(5630),
|
||||
VIEWPORT_SETFOV(6200),
|
||||
VIEWPORT_SETZOOM(6201),
|
||||
VIEWPORT_CLAMPFOV(6202),
|
||||
VIEWPORT_GETEFFECTIVESIZE(6203),
|
||||
VIEWPORT_GETZOOM(6204),
|
||||
VIEWPORT_GETFOV(6205),
|
||||
WORLDLIST_FETCH(6500),
|
||||
WORLDLIST_START(6501),
|
||||
WORLDLIST_NEXT(6502),
|
||||
WORLDLIST_SPECIFIC(6506),
|
||||
WORLDLIST_SORT(6507),
|
||||
GETWORLDINFO(6511),
|
||||
SETFOLLOWEROPSLOWPRIORITY(6512),
|
||||
NC_PARAM(6513),
|
||||
LC_PARAM(6514),
|
||||
OC_PARAM(6515),
|
||||
STRUCT_PARAM(6516),
|
||||
ON_MOBILE(6518),
|
||||
CLIENTTYPE(6519),
|
||||
BATTERYLEVEL(6524),
|
||||
BATTERYCHARGING(6525),
|
||||
WIFIAVAILABLE(6526),
|
||||
WORLDMAP_GETMAPNAME(6601),
|
||||
WORLDMAP_SETMAP(6602),
|
||||
WORLDMAP_GETZOOM(6603),
|
||||
WORLDMAP_SETZOOM(6604),
|
||||
WORLDMAP_ISLOADED(6605),
|
||||
WORLDMAP_JUMPTODISPLAYCOORD(6606),
|
||||
WORLDMAP_JUMPTODISPLAYCOORD_INSTANT(6607),
|
||||
WORLDMAP_JUMPTOSOURCECOORD(6608),
|
||||
WORLDMAP_JUMPTOSOURCECOORD_INSTANT(6609),
|
||||
WORLDMAP_GETDISPLAYPOSITION(6610),
|
||||
WORLDMAP_GETCONFIGORIGIN(6611),
|
||||
WORLDMAP_GETCONFIGSIZE(6612),
|
||||
WORLDMAP_GETCONFIGBOUNDS(6613),
|
||||
WORLDMAP_GETCONFIGZOOM(6614),
|
||||
WORLDMAP_GETCURRENTMAP(6616),
|
||||
WORLDMAP_GETDISPLAYCOORD(6617),
|
||||
WORLDMAP_COORDINMAP(6621),
|
||||
WORLDMAP_GETSIZE(6622),
|
||||
WORLDMAP_PERPETUALFLASH(6628),
|
||||
WORLDMAP_FLASHELEMENT(6629),
|
||||
WORLDMAP_FLASHELEMENTCATEGORY(6630),
|
||||
WORLDMAP_STOPCURRENTFLASHES(6631),
|
||||
WORLDMAP_DISABLEELEMENTS(6632),
|
||||
WORLDMAP_DISABLEELEMENT(6633),
|
||||
WORLDMAP_DISABLEELEMENTCATEGORY(6634),
|
||||
WORLDMAP_GETDISABLEELEMENTS(6635),
|
||||
WORLDMAP_GETDISABLEELEMENT(6636),
|
||||
WORLDMAP_GETDISABLEELEMENTCATEGORY(6637),
|
||||
WORLDMAP_LISTELEMENT_START(6639),
|
||||
WORLDMAP_LISTELEMENT_NEXT(6640),
|
||||
MEC_TEXT(6693),
|
||||
MEC_TEXTSIZE(6694),
|
||||
MEC_CATEGORY(6695),
|
||||
MEC_SPRITE(6696);
|
||||
|
||||
public final int opcode;
|
||||
|
||||
ScriptOpcode(int opcode)
|
||||
{
|
||||
this.opcode = opcode;
|
||||
}
|
||||
|
||||
private static final Map<Integer, ScriptOpcode> map;
|
||||
|
||||
static
|
||||
{
|
||||
ImmutableMap.Builder<Integer, ScriptOpcode> builder = ImmutableMap.builder();
|
||||
|
||||
for (ScriptOpcode value : values())
|
||||
{
|
||||
builder.put(value.opcode, value);
|
||||
}
|
||||
|
||||
map = builder.build();
|
||||
}
|
||||
|
||||
public static String nameFromID(int opcode)
|
||||
{
|
||||
ScriptOpcode op = map.get(opcode);
|
||||
|
||||
if (op == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return op.name();
|
||||
}
|
||||
}
|
||||
@@ -24,9 +24,12 @@
|
||||
*/
|
||||
package net.runelite.deob.updater;
|
||||
|
||||
import java.util.List;
|
||||
import net.runelite.asm.ClassFile;
|
||||
import net.runelite.asm.ClassGroup;
|
||||
import net.runelite.asm.Method;
|
||||
import net.runelite.asm.attributes.code.LocalVariable;
|
||||
import net.runelite.asm.attributes.code.Parameter;
|
||||
import net.runelite.deob.deobfuscators.mapping.ParallelExecutorMapping;
|
||||
|
||||
public class ParameterRenamer
|
||||
@@ -49,9 +52,39 @@ public class ParameterRenamer
|
||||
for (Method sourceM : sourceCF.getMethods())
|
||||
{
|
||||
Method destM = (Method) mapping.get(sourceM);
|
||||
if (destM != null)
|
||||
if (sourceM.getParameters() != null && !sourceM.getParameters().isEmpty() && destM.getParameters().size() >= 1)
|
||||
{
|
||||
destM.setParameters(sourceM.getParameters());
|
||||
List<Parameter> oldParams = destM.getParameters();
|
||||
for (int i = 0; i < sourceM.getParameters().size(); i++)
|
||||
{
|
||||
String name = sourceM.getParameters().get(i).getName();
|
||||
if (name.matches("arg[0-9]") || name.length() <= 2 && (name.charAt(0) != 'x' || name.charAt(0) != 'y'))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
Parameter oldParam = oldParams.get(i);
|
||||
LocalVariable oldVar = oldParam.getLocalVariable();
|
||||
|
||||
Parameter newParam = new Parameter(name, oldParam.getAccess());
|
||||
oldParams.set(i, newParam);
|
||||
|
||||
if (oldVar == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
LocalVariable newVar = new LocalVariable(
|
||||
name,
|
||||
oldVar.getDesc(),
|
||||
oldVar.getSignature(),
|
||||
oldVar.getStart(),
|
||||
oldVar.getEnd(),
|
||||
oldVar.getIndex()
|
||||
);
|
||||
|
||||
newParam.setLocalVariable(newVar);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,24 +26,20 @@ package net.runelite.deob.updater;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Map;
|
||||
import net.runelite.asm.ClassGroup;
|
||||
import net.runelite.asm.Field;
|
||||
import net.runelite.asm.Method;
|
||||
import net.runelite.deob.deobfuscators.Renamer;
|
||||
import net.runelite.deob.deobfuscators.mapping.AnnotationIntegrityChecker;
|
||||
import net.runelite.deob.deobfuscators.mapping.AnnotationMapper;
|
||||
import net.runelite.deob.deobfuscators.mapping.Mapper;
|
||||
import net.runelite.deob.deobfuscators.mapping.ParallelExecutorMapping;
|
||||
import net.runelite.deob.deobfuscators.transformers.ScriptOpcodesTransformer;
|
||||
import net.runelite.deob.util.JarUtil;
|
||||
import net.runelite.deob.util.NameMappings;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class UpdateMappings
|
||||
{
|
||||
private static final Logger logger = LoggerFactory.getLogger(UpdateMappings.class);
|
||||
private static boolean renameRL = true;
|
||||
|
||||
private final ClassGroup group1, group2;
|
||||
|
||||
public UpdateMappings(ClassGroup group1, ClassGroup group2)
|
||||
@@ -77,32 +73,8 @@ public class UpdateMappings
|
||||
|
||||
ParameterRenamer pr = new ParameterRenamer(group1, group2, mapping);
|
||||
pr.run();
|
||||
}
|
||||
|
||||
public void updateRL()
|
||||
{
|
||||
Mapper mapper = new Mapper(group1, group2);
|
||||
mapper.run();
|
||||
ParallelExecutorMapping mapping = mapper.getMapping();
|
||||
NameMappings names = new NameMappings();
|
||||
|
||||
for (Map.Entry<Object, Object> e : mapping.getMap().entrySet())
|
||||
{
|
||||
Object k = e.getKey();
|
||||
Object v = e.getValue();
|
||||
|
||||
if (k instanceof Field)
|
||||
{
|
||||
names.map(((Field) v).getPoolField(), ((Field) k).getName());
|
||||
}
|
||||
else if (k instanceof Method)
|
||||
{
|
||||
names.map(((Method) v).getPoolMethod(), ((Method) k).getName());
|
||||
}
|
||||
}
|
||||
|
||||
Renamer renamer = new Renamer(names);
|
||||
renamer.run(group2);
|
||||
new ScriptOpcodesTransformer().transform(group2);
|
||||
}
|
||||
|
||||
public void save(File out) throws IOException
|
||||
@@ -121,14 +93,7 @@ public class UpdateMappings
|
||||
JarUtil.loadJar(new File(args[0])),
|
||||
JarUtil.loadJar(new File(args[1]))
|
||||
);
|
||||
if (renameRL)
|
||||
{
|
||||
u.updateRL();
|
||||
}
|
||||
else
|
||||
{
|
||||
u.update();
|
||||
}
|
||||
u.save(new File(args[2]));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package net.runelite.deob.updater;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
import java.io.File;
|
||||
import net.runelite.asm.ClassFile;
|
||||
import net.runelite.asm.ClassGroup;
|
||||
@@ -39,6 +40,16 @@ public class AnnotationCleaner
|
||||
|
||||
log.debug("Checking {}", c.toString());
|
||||
|
||||
String implementingName = DeobAnnotations.getImplements(c);
|
||||
if (!Strings.isNullOrEmpty(implementingName))
|
||||
{
|
||||
assertEquals(c + " implements " + implementingName + " but is called " + c.getClassName(), implementingName, c.getClassName());
|
||||
}
|
||||
else
|
||||
{
|
||||
assertTrue(c + " isn't obfuscated but doesn't have @Implements", Deob.isObfuscated(c.getClassName()));
|
||||
}
|
||||
|
||||
for (Field f : c.getFields())
|
||||
{
|
||||
Annotations an = f.getAnnotations();
|
||||
@@ -48,11 +59,11 @@ public class AnnotationCleaner
|
||||
|
||||
if (exportedName == null)
|
||||
{
|
||||
assertTrue("Field " + fieldName + " isn't obfuscated but doesn't have @Export.", Deob.isObfuscated(fieldName) || fieldName.contains("$"));
|
||||
assertTrue("Field " + c.getClassName() + '.' + fieldName + " isn't obfuscated but doesn't have @Export.", Deob.isObfuscated(fieldName) || fieldName.equals(DeobAnnotations.getObfuscatedName(an)) || DeobAnnotations.getObfuscatedName(an) == null);
|
||||
continue;
|
||||
}
|
||||
|
||||
assertEquals("Field " + fieldName + " has " + exportedName + " in @Export", fieldName, exportedName);
|
||||
assertEquals("Field " + c.getClassName() + '.' + fieldName + " has " + exportedName + " in @Export", fieldName, exportedName);
|
||||
}
|
||||
|
||||
for (Method m : c.getMethods())
|
||||
@@ -64,11 +75,11 @@ public class AnnotationCleaner
|
||||
|
||||
if (exportedName == null)
|
||||
{
|
||||
assertTrue("Method " + fieldName + " isn't obfuscated but doesn't have @Export.", Deob.isObfuscated(fieldName) || fieldName.endsWith("init>") || fieldName.equals("values") || fieldName.equals("valueOf") || fieldName.startsWith("compareTo") || fieldName.equals("equals") || fieldName.equals("hashCode") || fieldName.equals("compare"));
|
||||
assertTrue("Method " + c.getClassName() + '.' + fieldName + " isn't obfuscated but doesn't have @Export.", Deob.isObfuscated(fieldName) || fieldName.equals(DeobAnnotations.getObfuscatedName(an)) || DeobAnnotations.getObfuscatedName(an) == null);
|
||||
continue;
|
||||
}
|
||||
|
||||
assertEquals("Method " + fieldName + " has " + exportedName + " in @Export", fieldName, exportedName);
|
||||
assertEquals("Method " + c.getClassName() + '.' + fieldName + " has " + exportedName + " in @Export", fieldName, exportedName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,6 +37,7 @@ import net.runelite.deob.deobfuscators.mapping.AnnotationIntegrityChecker;
|
||||
import net.runelite.deob.deobfuscators.mapping.AnnotationMapper;
|
||||
import net.runelite.deob.deobfuscators.mapping.Mapper;
|
||||
import net.runelite.deob.deobfuscators.mapping.ParallelExecutorMapping;
|
||||
import net.runelite.deob.deobfuscators.transformers.ScriptOpcodesTransformer;
|
||||
import net.runelite.deob.util.JarUtil;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Ignore;
|
||||
@@ -87,6 +88,19 @@ public class UpdateMappingsTest
|
||||
check(group1, group2);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore
|
||||
public void testScriptopcodes() throws Exception
|
||||
{
|
||||
File client = new File("C:\\Users\\Lucas\\IdeaProjects\\runelitexxx\\client.jar");
|
||||
|
||||
ClassGroup group = JarUtil.loadJar(client);
|
||||
|
||||
new ScriptOpcodesTransformer().transform(group);
|
||||
|
||||
JarUtil.saveJar(group, new File("C:/Users/Lucas/Desktop/Apapapapapap.jar"));
|
||||
}
|
||||
|
||||
private void unannotate(ClassGroup group)
|
||||
{
|
||||
for (ClassFile cf : group.getClasses())
|
||||
|
||||
@@ -8,7 +8,6 @@ public class HookClass
|
||||
@SerializedName("class")
|
||||
String clazz;
|
||||
String name;
|
||||
int access;
|
||||
List<HookField> fields;
|
||||
List<HookMethod> methods;
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@ public class HookField
|
||||
String field;
|
||||
String owner;
|
||||
String name;
|
||||
int access;
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
|
||||
@@ -39,6 +39,8 @@ import net.runelite.asm.Type;
|
||||
import net.runelite.asm.attributes.Annotations;
|
||||
import net.runelite.asm.attributes.annotation.Annotation;
|
||||
import net.runelite.asm.attributes.annotation.Element;
|
||||
import net.runelite.asm.attributes.code.LocalVariable;
|
||||
import net.runelite.asm.attributes.code.Parameter;
|
||||
import net.runelite.asm.signature.Signature;
|
||||
import net.runelite.asm.signature.util.VirtualMethods;
|
||||
import static net.runelite.deob.DeobAnnotations.EXPORT;
|
||||
@@ -97,7 +99,7 @@ public class HookImporter
|
||||
@Ignore
|
||||
public void importHooks()
|
||||
{
|
||||
int classes = 0, fields = 0, methods = 0, access = 0;
|
||||
int classes = 0, fields = 0, methods = 0, params = 0;
|
||||
NameMappings mappings = new NameMappings();
|
||||
|
||||
for (HookClass hc : hooks)
|
||||
@@ -107,12 +109,6 @@ public class HookImporter
|
||||
|
||||
assert cf != null;
|
||||
|
||||
if (cf.getAccess() != hc.access)
|
||||
{
|
||||
cf.setAccess(hc.access);
|
||||
++access;
|
||||
}
|
||||
|
||||
String implementsName = getAnnotation(cf.getAnnotations(), IMPLEMENTS);
|
||||
if (implementsName.isEmpty())
|
||||
{
|
||||
@@ -122,23 +118,28 @@ public class HookImporter
|
||||
++classes;
|
||||
}
|
||||
|
||||
if (!implementsName.isEmpty() && !implementsName.equals(hc.clazz))
|
||||
{
|
||||
logger.info("Runestar calls class {} {}, while we call it {}", hc.name, hc.clazz, implementsName);
|
||||
}
|
||||
|
||||
for (HookField fh : hc.fields)
|
||||
{
|
||||
if (fh.field.startsWith("__"))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
ClassFile cf2 = findClassWithObfuscatedName(fh.owner);
|
||||
assert cf2 != null;
|
||||
|
||||
Field f = findFieldWithObfuscatedName(cf2, fh.name);
|
||||
if (f == null)
|
||||
{
|
||||
logger.warn("Missing field {}", fh); // inlined constant maybe?
|
||||
continue;
|
||||
}
|
||||
|
||||
if (f.getAccessFlags() != fh.access)
|
||||
{
|
||||
f.setAccessFlags(fh.access);
|
||||
++access;
|
||||
}
|
||||
|
||||
String exportedName = getAnnotation(f.getAnnotations(), EXPORT);
|
||||
if (exportedName.isEmpty())
|
||||
{
|
||||
@@ -155,11 +156,20 @@ public class HookImporter
|
||||
mappings.map(f.getPoolField(), deobfuscatedFieldName);
|
||||
++fields;
|
||||
}
|
||||
|
||||
if (!exportedName.isEmpty() && !exportedName.equals(fh.field))
|
||||
{
|
||||
logger.info("Runestar calls field {}.{} {}, while we call it {}", fh.owner, fh.name, fh.field, exportedName);
|
||||
}
|
||||
}
|
||||
|
||||
outer:
|
||||
for (HookMethod hm : hc.methods)
|
||||
{
|
||||
if (hm.method.startsWith("__"))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
ClassFile cf2 = findClassWithObfuscatedName(hm.owner);
|
||||
assert cf2 != null;
|
||||
@@ -171,10 +181,40 @@ public class HookImporter
|
||||
continue;
|
||||
}
|
||||
|
||||
if (m.getAccessFlags() != hm.access)
|
||||
if (hm.parameters != null && !hm.parameters.isEmpty() && m.getParameters().size() >= 1)
|
||||
{
|
||||
m.setAccessFlags(hm.access);
|
||||
++access;
|
||||
List<Parameter> oldParams = m.getParameters();
|
||||
for (int i = 0; i < hm.parameters.size(); i++)
|
||||
{
|
||||
String name = hm.parameters.get(i);
|
||||
if (name.matches("arg[0-9]") || name.length() <= 2 && (name.charAt(0) != 'x' && name.charAt(0) != 'y'))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
Parameter oldParam = oldParams.get(i);
|
||||
LocalVariable oldVar = oldParam.getLocalVariable();
|
||||
|
||||
Parameter newParam = new Parameter(name, oldParam.getAccess());
|
||||
oldParams.set(i, newParam);
|
||||
params++;
|
||||
|
||||
if (oldVar == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
LocalVariable newVar = new LocalVariable(
|
||||
name,
|
||||
oldVar.getDesc(),
|
||||
oldVar.getSignature(),
|
||||
oldVar.getStart(),
|
||||
oldVar.getEnd(),
|
||||
oldVar.getIndex()
|
||||
);
|
||||
|
||||
newParam.setLocalVariable(newVar);
|
||||
}
|
||||
}
|
||||
|
||||
// maybe only the base class method is exported
|
||||
@@ -184,6 +224,10 @@ public class HookImporter
|
||||
String exportedName = getAnnotation(method.getAnnotations(), EXPORT);
|
||||
if (!exportedName.isEmpty())
|
||||
{
|
||||
if (!exportedName.equals(hm.method))
|
||||
{
|
||||
logger.info("Runestar calls {}.{} {}, while we call it {}", hm.owner, hm.name, hm.method, exportedName);
|
||||
}
|
||||
continue outer;
|
||||
}
|
||||
}
|
||||
@@ -198,7 +242,7 @@ public class HookImporter
|
||||
Renamer renamer = new Renamer(mappings);
|
||||
renamer.run(group);
|
||||
|
||||
logger.info("Imported {} classes, {} fields, {} methods, {} access levels", classes, fields, methods, access);
|
||||
logger.info("Imported {} classes, {} fields, {} methods, {} params", classes, fields, methods, params);
|
||||
}
|
||||
|
||||
private ClassFile findClassWithObfuscatedName(String name)
|
||||
@@ -259,8 +303,7 @@ public class HookImporter
|
||||
{
|
||||
for (Element e : a.getElements())
|
||||
{
|
||||
String str = (String) e.getValue();
|
||||
return str;
|
||||
return (String) e.getValue();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -270,13 +313,13 @@ public class HookImporter
|
||||
private Signature getObfuscatedMethodSignature(Method method)
|
||||
{
|
||||
String sig = getAnnotation(method.getAnnotations(), OBFUSCATED_SIGNATURE);
|
||||
if (sig.isEmpty() == false)
|
||||
{
|
||||
return new Signature(sig); // if it is annotated, use that
|
||||
}
|
||||
else
|
||||
if (sig.isEmpty())
|
||||
{
|
||||
return method.getDescriptor();
|
||||
}
|
||||
else
|
||||
{
|
||||
return new Signature(sig); // if it is annotated, use that
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
package net.runelite.runesuite;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class HookMethod
|
||||
{
|
||||
String method;
|
||||
String owner;
|
||||
String name;
|
||||
int access;
|
||||
String[] parameters;
|
||||
List<String> parameters;
|
||||
String descriptor;
|
||||
|
||||
@Override
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -28,7 +28,7 @@
|
||||
<parent>
|
||||
<groupId>net.runelite</groupId>
|
||||
<artifactId>runelite-parent</artifactId>
|
||||
<version>1.5.28-SNAPSHOT</version>
|
||||
<version>1.5.29-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<name>Web API</name>
|
||||
|
||||
@@ -103,8 +103,8 @@ public class RuneLiteAPI
|
||||
|
||||
CLIENT = new OkHttpClient.Builder()
|
||||
.pingInterval(30, TimeUnit.SECONDS)
|
||||
.connectTimeout(5655, TimeUnit.MILLISECONDS)
|
||||
.writeTimeout(5655, TimeUnit.MILLISECONDS)
|
||||
.connectTimeout(8655, TimeUnit.MILLISECONDS)
|
||||
.writeTimeout(8655, TimeUnit.MILLISECONDS)
|
||||
.addNetworkInterceptor(new Interceptor()
|
||||
{
|
||||
@Override
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<parent>
|
||||
<groupId>net.runelite</groupId>
|
||||
<artifactId>runelite-parent</artifactId>
|
||||
<version>1.5.28-SNAPSHOT</version>
|
||||
<version>1.5.29-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<name>Web Service</name>
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
<parent>
|
||||
<groupId>net.runelite</groupId>
|
||||
<artifactId>runelite-parent</artifactId>
|
||||
<version>1.5.28-SNAPSHOT</version>
|
||||
<version>1.5.29-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>injected-client</artifactId>
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
<parent>
|
||||
<groupId>net.runelite</groupId>
|
||||
<artifactId>runelite-parent</artifactId>
|
||||
<version>1.5.28-SNAPSHOT</version>
|
||||
<version>1.5.29-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<groupId>net.runelite.rs</groupId>
|
||||
|
||||
@@ -33,6 +33,7 @@ import net.runelite.asm.ClassGroup;
|
||||
import net.runelite.asm.Method;
|
||||
import net.runelite.asm.Type;
|
||||
import net.runelite.asm.attributes.Annotations;
|
||||
import net.runelite.asm.attributes.Code;
|
||||
import net.runelite.asm.attributes.annotation.Annotation;
|
||||
import net.runelite.asm.attributes.code.Instruction;
|
||||
import net.runelite.asm.attributes.code.InstructionType;
|
||||
@@ -89,9 +90,9 @@ public class InjectHookMethod
|
||||
obfuscatedClassName = DeobAnnotations.getObfuscatedName(cf.getAnnotations());
|
||||
|
||||
// might be a constructor
|
||||
if (obfuscatedMethodName == null && method.getName().equals("<init>"))
|
||||
if (obfuscatedMethodName == null)
|
||||
{
|
||||
obfuscatedMethodName = "<init>";
|
||||
obfuscatedMethodName = method.getName();
|
||||
}
|
||||
|
||||
assert obfuscatedClassName != null : "hook on method in class with no obfuscated name";
|
||||
@@ -110,7 +111,12 @@ public class InjectHookMethod
|
||||
|
||||
private void injectHookMethod(Method hookMethod, String hookName, boolean end, Method deobMethod, Method vanillaMethod, boolean useHooks) throws InjectionException
|
||||
{
|
||||
Instructions instructions = vanillaMethod.getCode().getInstructions();
|
||||
Code code = vanillaMethod.getCode();
|
||||
if (code == null)
|
||||
{
|
||||
logger.warn(vanillaMethod + " code is null");
|
||||
}
|
||||
Instructions instructions = code.getInstructions();
|
||||
|
||||
Signature.Builder builder = new Signature.Builder()
|
||||
.setReturnType(Type.VOID); // Hooks always return void
|
||||
|
||||
@@ -27,6 +27,33 @@ public class InjectUtil
|
||||
|
||||
public static Method findMethod(Inject inject, String name) throws InjectionException
|
||||
{
|
||||
return findMethod(inject, name, null);
|
||||
}
|
||||
|
||||
public static Method findMethod(Inject inject, String name, String hint) throws InjectionException
|
||||
{
|
||||
if (hint != null)
|
||||
{
|
||||
ClassFile c = inject.getDeobfuscated().findClass(hint);
|
||||
|
||||
if (c == null)
|
||||
{
|
||||
throw new InjectionException("Class " + hint + " doesn't exist. (check capitalization)");
|
||||
}
|
||||
|
||||
Method deob = c.findMethod(name);
|
||||
|
||||
if (deob != null)
|
||||
{
|
||||
String obfuscatedName = DeobAnnotations.getObfuscatedName(deob.getAnnotations());
|
||||
Signature obfuscatedSignature = DeobAnnotations.getObfuscatedSignature(deob);
|
||||
|
||||
ClassFile ob = inject.toObClass(c);
|
||||
|
||||
return ob.findMethod(obfuscatedName, (obfuscatedSignature != null) ? obfuscatedSignature : deob.getDescriptor());
|
||||
}
|
||||
}
|
||||
|
||||
for (ClassFile c : inject.getDeobfuscated().getClasses())
|
||||
{
|
||||
for (Method m : c.getMethods())
|
||||
|
||||
@@ -76,8 +76,8 @@ public class DrawAfterWidgets
|
||||
|
||||
@Export("drawLoggedIn")
|
||||
final void drawLoggedIn() {
|
||||
if(rootWidgetGroup != -1) {
|
||||
ClientPreferences.method1809(rootWidgetGroup);
|
||||
if(rootInterface != -1) {
|
||||
ClientPreferences.method1809(rootInterface);
|
||||
}
|
||||
|
||||
int var1;
|
||||
@@ -94,9 +94,9 @@ public class DrawAfterWidgets
|
||||
__client_lq = -1;
|
||||
__client_ln = -1;
|
||||
UserComparator6.__fg_jh = null;
|
||||
if(rootWidgetGroup != -1) {
|
||||
if(rootInterface != -1) {
|
||||
rootWidgetCount = 0;
|
||||
Interpreter.method1977(rootWidgetGroup, 0, 0, SoundCache.canvasWidth, Huffman.canvasHeight, 0, 0, -1);
|
||||
Interpreter.method1977(rootInterface, 0, 0, SoundCache.canvasWidth, Huffman.canvasHeight, 0, 0, -1);
|
||||
}
|
||||
|
||||
< -- here appearantly
|
||||
|
||||
@@ -2,6 +2,7 @@ package net.runelite.injector.raw;
|
||||
|
||||
import com.google.common.base.Stopwatch;
|
||||
import java.util.Iterator;
|
||||
import java.util.ListIterator;
|
||||
import net.runelite.asm.Method;
|
||||
import net.runelite.asm.attributes.code.Instruction;
|
||||
import net.runelite.asm.attributes.code.Instructions;
|
||||
@@ -9,9 +10,12 @@ import net.runelite.asm.attributes.code.Label;
|
||||
import net.runelite.asm.attributes.code.instruction.types.ComparisonInstruction;
|
||||
import net.runelite.asm.attributes.code.instruction.types.JumpingInstruction;
|
||||
import net.runelite.asm.attributes.code.instructions.ALoad;
|
||||
import net.runelite.asm.attributes.code.instructions.BiPush;
|
||||
import net.runelite.asm.attributes.code.instructions.GetStatic;
|
||||
import net.runelite.asm.attributes.code.instructions.IAnd;
|
||||
import net.runelite.asm.attributes.code.instructions.IfACmpEq;
|
||||
import net.runelite.asm.attributes.code.instructions.IfACmpNe;
|
||||
import net.runelite.asm.attributes.code.instructions.IfICmpNe;
|
||||
import net.runelite.asm.attributes.code.instructions.IfNe;
|
||||
import net.runelite.asm.attributes.code.instructions.InvokeStatic;
|
||||
import net.runelite.asm.pool.Field;
|
||||
@@ -31,14 +35,28 @@ public class HidePlayerAttacks
|
||||
this.inject = inject;
|
||||
}
|
||||
|
||||
private Method addPlayerOptions;
|
||||
private net.runelite.asm.pool.Method shouldHideAttackOptionFor;
|
||||
|
||||
public void inject() throws InjectionException
|
||||
{
|
||||
Stopwatch stopwatch = Stopwatch.createStarted();
|
||||
|
||||
final Method addPlayerOptions = InjectUtil.findStaticMethod(inject, "addPlayerToMenu");
|
||||
addPlayerOptions = InjectUtil.findStaticMethod(inject, "addPlayerToMenu");
|
||||
shouldHideAttackOptionFor = inject.getVanilla().findClass("client").findMethod("shouldHideAttackOptionFor").getPoolMethod();
|
||||
|
||||
injectHideAttack();
|
||||
injectHideCast();
|
||||
|
||||
stopwatch.stop();
|
||||
|
||||
log.info("HidePlayerAttacks took {}", stopwatch.toString());
|
||||
}
|
||||
|
||||
private void injectHideAttack() throws InjectionException
|
||||
{
|
||||
final Field AttackOption_hidden = InjectUtil.findDeobField(inject, "AttackOption_hidden", "AttackOption").getPoolField();
|
||||
final Field attackOption = InjectUtil.findDeobField(inject, "playerAttackOption", "Client").getPoolField();
|
||||
final net.runelite.asm.pool.Method shouldHideAttackOptionFor = inject.getVanilla().findClass("client").findMethod("shouldHideAttackOptionFor").getPoolMethod();
|
||||
|
||||
// GETSTATIC GETSTATIC
|
||||
// GETSTATIC GETSTATIC
|
||||
@@ -123,9 +141,65 @@ public class HidePlayerAttacks
|
||||
IfNe i3 = new IfNe(ins, label);
|
||||
|
||||
ins.addInstruction(injectIdx, i3);
|
||||
}
|
||||
|
||||
stopwatch.stop();
|
||||
private void injectHideCast() throws InjectionException
|
||||
{
|
||||
// LABEL before
|
||||
// BIPUSH 8
|
||||
// LDC (garbage)
|
||||
// GETSTATIC selectedSpellFlags
|
||||
// IMUL
|
||||
// BIPUSH 8
|
||||
// IAND
|
||||
// IF_ICMPNE -> skip adding option
|
||||
//
|
||||
// <--- Inject call here
|
||||
// <--- Inject comparison here (duh)
|
||||
//
|
||||
// add option n such
|
||||
|
||||
log.info("HidePlayerAttacks took {}", stopwatch.toString());
|
||||
Instructions ins = addPlayerOptions.getCode().getInstructions();
|
||||
ListIterator<Instruction> iterator = ins.getInstructions().listIterator();
|
||||
while (iterator.hasNext())
|
||||
{
|
||||
Instruction i = iterator.next();
|
||||
if (!(i instanceof BiPush) || (byte) ((BiPush) i).getConstant() != 8)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
i = iterator.next();
|
||||
while (!(i instanceof BiPush) || (byte) ((BiPush) i).getConstant() != 8)
|
||||
{
|
||||
i = iterator.next();
|
||||
}
|
||||
|
||||
i = iterator.next();
|
||||
if (!(i instanceof IAnd))
|
||||
{
|
||||
throw new InjectionException("Yikes I didn't expect this");
|
||||
}
|
||||
|
||||
i = iterator.next();
|
||||
if (!(i instanceof IfICmpNe))
|
||||
{
|
||||
throw new InjectionException("Yikes I didn't expect this");
|
||||
}
|
||||
|
||||
Label target = ((IfICmpNe) i).getJumps().get(0);
|
||||
|
||||
// Load the player
|
||||
ALoad i1 = new ALoad(ins, 0);
|
||||
// Get the boolean
|
||||
InvokeStatic i2 = new InvokeStatic(ins, shouldHideAttackOptionFor);
|
||||
// Compare n such
|
||||
IfNe i3 = new IfNe(ins, target);
|
||||
|
||||
iterator.add(i1);
|
||||
iterator.add(i2);
|
||||
iterator.add(i3);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ public class RenderDraw
|
||||
Stopwatch stopwatch = Stopwatch.createStarted();
|
||||
|
||||
net.runelite.asm.Method obmethod = findMethod(inject, "drawTile");
|
||||
Method renderDraw = findMethod(inject, "renderDraw").getPoolMethod();
|
||||
Method renderDraw = findMethod(inject, "draw", "Entity").getPoolMethod();
|
||||
|
||||
Instructions ins = obmethod.getCode().getInstructions();
|
||||
replace(ins, renderDraw);
|
||||
@@ -69,7 +69,7 @@ public class RenderDraw
|
||||
}
|
||||
else if (count != 21)
|
||||
{
|
||||
log.warn("Found {} renderDraws while 21 were expected. Rev update?", count);
|
||||
log.warn("Found {} draws while 21 were expected. Rev update?", count);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"buildCommit": "2d0c2b8eb66a8088b41b29d42ec2a58ead460581",
|
||||
"buildCommit": "b82c8903c64695d44b255d45b449440e4eaa17ef",
|
||||
"artifacts": [
|
||||
{
|
||||
"hash": "b12331da8683e5f107d294adeebb83ecf9124abc1db533554d2a8d3c62832d75",
|
||||
@@ -20,10 +20,10 @@
|
||||
"size": "3168921"
|
||||
},
|
||||
{
|
||||
"hash": "4c388a85fb538bbb8cb6e0fd93e0ba0666605123d77b976764818be6f090bbe5",
|
||||
"name": "client-1.5.28-SNAPSHOT.jar",
|
||||
"path": "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/live/client-1.5.28-SNAPSHOT.jar",
|
||||
"size": "5871886"
|
||||
"hash": "bc9ad97e68f88e53d6e5844a5b02e8b874cb7f0bbdd08a99c4529caf9148e99f",
|
||||
"name": "client-1.5.29-SNAPSHOT.jar",
|
||||
"path": "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/live/client-1.5.29-SNAPSHOT.jar",
|
||||
"size": "6018354"
|
||||
},
|
||||
{
|
||||
"hash": "18c4a0095d5c1da6b817592e767bb23d29dd2f560ad74df75ff3961dbde25b79",
|
||||
@@ -212,22 +212,22 @@
|
||||
"size": "2327547"
|
||||
},
|
||||
{
|
||||
"hash": "440c629bec3905eb21dc5965fa38464f160a4cb8f87ca76806cdecc18b2c5992",
|
||||
"name": "runelite-api-1.5.28-SNAPSHOT.jar",
|
||||
"path": "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/live/runelite-api-1.5.28-SNAPSHOT.jar",
|
||||
"size": "1019717"
|
||||
"hash": "aa603ad557917ad4c14f0683195c481e84760e2c12cf7564f4ad9a22f66fe9d6",
|
||||
"name": "runelite-api-1.5.29-SNAPSHOT.jar",
|
||||
"path": "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/live/runelite-api-1.5.29-SNAPSHOT.jar",
|
||||
"size": "1027726"
|
||||
},
|
||||
{
|
||||
"hash": "45e3bcec9e7bae4ca2facd0fbee1f3da5e0700584e8419deed784a95255552c1",
|
||||
"name": "runescape-api-1.5.28-SNAPSHOT.jar",
|
||||
"path": "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/live/runescape-api-1.5.28-SNAPSHOT.jar",
|
||||
"size": "56079"
|
||||
"hash": "051f8c8fb6dfbcdf35c6b266bf4dddbfb1eca44ea3e5319b622dda57a83b0eea",
|
||||
"name": "runescape-api-1.5.29-SNAPSHOT.jar",
|
||||
"path": "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/live/runescape-api-1.5.29-SNAPSHOT.jar",
|
||||
"size": "58029"
|
||||
},
|
||||
{
|
||||
"hash": "811aadce9ce35ac638712da86123d4cb99570a9550614931471295cb26f91c36",
|
||||
"name": "http-api-1.5.28-SNAPSHOT.jar",
|
||||
"path": "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/live/http-api-1.5.28-SNAPSHOT.jar",
|
||||
"size": "101785"
|
||||
"hash": "9084498c38d640206ec099578ec21f0e52ff1afab5d77580e12e27f59b9987c8",
|
||||
"name": "http-api-1.5.29-SNAPSHOT.jar",
|
||||
"path": "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/live/http-api-1.5.29-SNAPSHOT.jar",
|
||||
"size": "115763"
|
||||
},
|
||||
{
|
||||
"hash": "f55abda036da75e1af45bd43b9dfa79b2a3d90905be9cb38687c6621597a8165",
|
||||
@@ -254,10 +254,10 @@
|
||||
"size": "617294"
|
||||
},
|
||||
{
|
||||
"hash": "a3cab9293960d1d61968ce1591c87859ddcaa6cb2faca554cc938961c8fb3d3a",
|
||||
"name": "injected-client-1.5.28-SNAPSHOT.jar",
|
||||
"path": "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/live/injected-client-1.5.28-SNAPSHOT.jar",
|
||||
"size": "2193046"
|
||||
"hash": "48bfa99ac87f3c3b8d555efd2ac3a84f636e8f9fd282284f87df77cd9feacfa6",
|
||||
"name": "injected-client-1.5.29-SNAPSHOT.jar",
|
||||
"path": "https://raw.githubusercontent.com/runelite-extended/maven-repo/master/live/injected-client-1.5.29-SNAPSHOT.jar",
|
||||
"size": "2196574"
|
||||
}
|
||||
],
|
||||
"client": {
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
<groupId>net.runelite</groupId>
|
||||
<artifactId>runelite-parent</artifactId>
|
||||
<version>1.5.28-SNAPSHOT</version>
|
||||
<version>1.5.29-SNAPSHOT</version>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<name>RuneLite</name>
|
||||
@@ -37,6 +37,7 @@
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<maven.compiler.useIncrementalCompilation>false</maven.compiler.useIncrementalCompilation>
|
||||
<java.version>1.8</java.version>
|
||||
<lombok.version>1.18.4</lombok.version>
|
||||
<checkstyle.version>8.3</checkstyle.version>
|
||||
@@ -53,7 +54,7 @@
|
||||
<zlika.reproducible.build.maven.plugin.version>0.7</zlika.reproducible.build.maven.plugin.version>
|
||||
|
||||
<maven.jar.plugin.version>3.0.2</maven.jar.plugin.version>
|
||||
<maven.compiler.plugin.version>3.6.1</maven.compiler.plugin.version>
|
||||
<maven.compiler.plugin.version>3.8.1</maven.compiler.plugin.version>
|
||||
<maven.checkstyle.plugin.version>2.17</maven.checkstyle.plugin.version>
|
||||
<maven.javadoc.plugin.version>3.0.0-M1</maven.javadoc.plugin.version>
|
||||
<maven.release.plugin.version>2.5.3</maven.release.plugin.version>
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
<parent>
|
||||
<groupId>net.runelite</groupId>
|
||||
<artifactId>runelite-parent</artifactId>
|
||||
<version>1.5.28-SNAPSHOT</version>
|
||||
<version>1.5.29-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>protocol-api</artifactId>
|
||||
|
||||
+1
-1
@@ -29,7 +29,7 @@
|
||||
<parent>
|
||||
<groupId>net.runelite</groupId>
|
||||
<artifactId>runelite-parent</artifactId>
|
||||
<version>1.5.28-SNAPSHOT</version>
|
||||
<version>1.5.29-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>protocol</artifactId>
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
<parent>
|
||||
<groupId>net.runelite</groupId>
|
||||
<artifactId>runelite-parent</artifactId>
|
||||
<version>1.5.28-SNAPSHOT</version>
|
||||
<version>1.5.29-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>runelite-api</artifactId>
|
||||
|
||||
@@ -164,6 +164,7 @@ public final class AnimationID
|
||||
public static final int BLOCK_SHIELD = 1156;
|
||||
public static final int BLOCK_SWORD = 388;
|
||||
public static final int BLOCK_UNARMED = 424; // Same Animation as failed pickpocked
|
||||
public static final int DRAGONFIRE_SHIELD_SPECIAL = 6696;
|
||||
|
||||
// NPC animations
|
||||
public static final int TZTOK_JAD_RANGE_ATTACK = 2652;
|
||||
@@ -312,4 +313,11 @@ public final class AnimationID
|
||||
public static final int DAG_REX = 2853;
|
||||
public static final int DAG_PRIME = 2854;
|
||||
public static final int DAG_SUPREME = 2855;
|
||||
|
||||
// Lizardman shaman
|
||||
public static final int LIZARDMAN_SHAMAN_SPAWN = 2855;
|
||||
|
||||
// Combat counter
|
||||
public static final int BARRAGE_ANIMATION = 1979;
|
||||
public static final int CHIN_ANIMATION = 7618;
|
||||
}
|
||||
@@ -29,6 +29,7 @@ import java.awt.Dimension;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import javax.annotation.Nullable;
|
||||
import net.runelite.api.coords.LocalPoint;
|
||||
import net.runelite.api.coords.WorldPoint;
|
||||
@@ -1661,17 +1662,36 @@ public interface Client extends GameShell
|
||||
|
||||
String getSelectedSpellName();
|
||||
|
||||
boolean getIsSpellSelected();
|
||||
boolean isSpellSelected();
|
||||
|
||||
/**
|
||||
* Set whether or not player attack options will be hidden for clanmembers/friends
|
||||
*/
|
||||
void setHideFriendAttackOptions(boolean yes);
|
||||
|
||||
/**
|
||||
* Set whether or not player cast options will be hidden for clanmembers/friends
|
||||
*/
|
||||
void setHideFriendCastOptions(boolean yes);
|
||||
|
||||
/**
|
||||
* Set spells excluded from above hiding
|
||||
*/
|
||||
void setUnhiddenCasts(Set<String> casts);
|
||||
|
||||
/**
|
||||
* Sorts the current menu entries in the same way the client does this.
|
||||
* The last entry will be the left click one after this.
|
||||
*/
|
||||
void sortMenuEntries();
|
||||
|
||||
/**
|
||||
* Add player to friendlist
|
||||
*/
|
||||
void addFriend(String name);
|
||||
|
||||
/**
|
||||
* Remove player from friendlist
|
||||
*/
|
||||
void removeFriend(String name);
|
||||
}
|
||||
|
||||
@@ -24,6 +24,11 @@
|
||||
*/
|
||||
package net.runelite.api;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* An enumeration of game states the client is in.
|
||||
*/
|
||||
@@ -66,6 +71,10 @@ public enum GameState
|
||||
*/
|
||||
HOPPING(45);
|
||||
|
||||
private static final Map<Integer, GameState> stateValueMap =
|
||||
Arrays.stream(GameState.values())
|
||||
.collect(Collectors.toMap(gs -> gs.state, Function.identity()));
|
||||
|
||||
/**
|
||||
* The raw state value.
|
||||
*/
|
||||
@@ -85,13 +94,6 @@ public enum GameState
|
||||
*/
|
||||
public static GameState of(int state)
|
||||
{
|
||||
for (GameState gs : GameState.values())
|
||||
{
|
||||
if (gs.state == state)
|
||||
{
|
||||
return gs;
|
||||
}
|
||||
}
|
||||
return UNKNOWN;
|
||||
return stateValueMap.getOrDefault(state, UNKNOWN);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10821,5 +10821,21 @@ public final class ItemID
|
||||
public static final int HEALER_ICON_23486 = 23486;
|
||||
public static final int WINE_OF_ZAMORAK_23489 = 23489;
|
||||
public static final int LARRANS_KEY = 23490;
|
||||
public static final int SRARACHA = 23495;
|
||||
public static final int TEMPLE_COIN = 23497;
|
||||
public static final int GRUBBY_KEY = 23499;
|
||||
public static final int TEMPLE_KEY = 23502;
|
||||
public static final int TOME_OF_THE_MOON = 23504;
|
||||
public static final int TOME_OF_THE_SUN = 23506;
|
||||
public static final int TOME_OF_THE_TEMPLE = 23508;
|
||||
public static final int TATTERED_MOON_PAGE = 23510;
|
||||
public static final int TATTERED_SUN_PAGE = 23512;
|
||||
public static final int TATTERED_TEMPLE_PAGE = 23514;
|
||||
public static final int LAMP_OF_KNOWLEDGE = 23516;
|
||||
public static final int GIANT_EGG_SACFULL = 23517;
|
||||
public static final int GIANT_EGG_SAC = 23520;
|
||||
public static final int MASK_OF_RANUL = 23522;
|
||||
public static final int JAR_OF_EYES = 23525;
|
||||
public static final int SARACHNIS_CUDGEL = 23528;
|
||||
/* This file is automatically generated. Do not edit. */
|
||||
}
|
||||
|
||||
@@ -1992,9 +1992,9 @@ public final class NpcID
|
||||
public static final int CYCLOPS_2140 = 2140;
|
||||
public static final int CYCLOPS_2141 = 2141;
|
||||
public static final int CYCLOPS_2142 = 2142;
|
||||
public static final int GIANT_FROG_2143 = 2143;
|
||||
public static final int BIG_FROG_2144 = 2144;
|
||||
public static final int FROG_2145 = 2145;
|
||||
public static final int SRARACHA = 2143;
|
||||
public static final int SRARACHA_2144 = 2144;
|
||||
public static final int UNDEAD_DRUID = 2145;
|
||||
public static final int FISHING_SPOT_2146 = 2146;
|
||||
public static final int VEOS = 2147;
|
||||
public static final int GRAND_EXCHANGE_CLERK = 2148;
|
||||
@@ -7866,5 +7866,21 @@ public final class NpcID
|
||||
public static final int LEKE_QUO_KERAN = 8697;
|
||||
public static final int MONK_OF_ZAMORAK_8698 = 8698;
|
||||
public static final int LARRAN = 8699;
|
||||
public static final int GIANT_FROG_8700 = 8700;
|
||||
public static final int BIG_FROG_8701 = 8701;
|
||||
public static final int FROG_8702 = 8702;
|
||||
public static final int TEMPLE_SPIDER = 8703;
|
||||
public static final int BROTHER_AIMERI = 8704;
|
||||
public static final int BROTHER_AIMERI_8705 = 8705;
|
||||
public static final int OLBERTUS = 8706;
|
||||
public static final int OLBERTUS_8707 = 8707;
|
||||
public static final int OLBERTUS_8708 = 8708;
|
||||
public static final int SHAEDED_BEAST = 8709;
|
||||
public static final int SHAEDED_BEAST_8710 = 8710;
|
||||
public static final int EODAN = 8711;
|
||||
public static final int KNIGHT_OF_VARLAMORE_8712 = 8712;
|
||||
public static final int SARACHNIS = 8713;
|
||||
public static final int SPAWN_OF_SARACHNIS = 8714;
|
||||
public static final int SPAWN_OF_SARACHNIS_8715 = 8715;
|
||||
/* This file is automatically generated. Do not edit. */
|
||||
}
|
||||
|
||||
@@ -12463,5 +12463,25 @@ public final class NullItemID
|
||||
public static final int NULL_23492 = 23492;
|
||||
public static final int NULL_23493 = 23493;
|
||||
public static final int NULL_23494 = 23494;
|
||||
public static final int NULL_23496 = 23496;
|
||||
public static final int NULL_23498 = 23498;
|
||||
public static final int NULL_23500 = 23500;
|
||||
public static final int NULL_23501 = 23501;
|
||||
public static final int NULL_23503 = 23503;
|
||||
public static final int NULL_23505 = 23505;
|
||||
public static final int NULL_23507 = 23507;
|
||||
public static final int NULL_23509 = 23509;
|
||||
public static final int NULL_23511 = 23511;
|
||||
public static final int NULL_23513 = 23513;
|
||||
public static final int NULL_23515 = 23515;
|
||||
public static final int NULL_23518 = 23518;
|
||||
public static final int NULL_23519 = 23519;
|
||||
public static final int NULL_23521 = 23521;
|
||||
public static final int NULL_23523 = 23523;
|
||||
public static final int NULL_23524 = 23524;
|
||||
public static final int NULL_23526 = 23526;
|
||||
public static final int NULL_23527 = 23527;
|
||||
public static final int NULL_23529 = 23529;
|
||||
public static final int NULL_23530 = 23530;
|
||||
/* This file is automatically generated. Do not edit. */
|
||||
}
|
||||
|
||||
@@ -16211,5 +16211,33 @@ public final class NullObjectID
|
||||
public static final int NULL_34825 = 34825;
|
||||
public static final int NULL_34831 = 34831;
|
||||
public static final int NULL_34832 = 34832;
|
||||
public static final int NULL_34841 = 34841;
|
||||
public static final int NULL_34869 = 34869;
|
||||
public static final int NULL_34875 = 34875;
|
||||
public static final int NULL_34876 = 34876;
|
||||
public static final int NULL_34877 = 34877;
|
||||
public static final int NULL_34878 = 34878;
|
||||
public static final int NULL_34879 = 34879;
|
||||
public static final int NULL_34880 = 34880;
|
||||
public static final int NULL_34881 = 34881;
|
||||
public static final int NULL_34882 = 34882;
|
||||
public static final int NULL_34883 = 34883;
|
||||
public static final int NULL_34884 = 34884;
|
||||
public static final int NULL_34885 = 34885;
|
||||
public static final int NULL_34886 = 34886;
|
||||
public static final int NULL_34887 = 34887;
|
||||
public static final int NULL_34888 = 34888;
|
||||
public static final int NULL_34889 = 34889;
|
||||
public static final int NULL_34890 = 34890;
|
||||
public static final int NULL_34891 = 34891;
|
||||
public static final int NULL_34892 = 34892;
|
||||
public static final int NULL_34893 = 34893;
|
||||
public static final int NULL_34894 = 34894;
|
||||
public static final int NULL_34895 = 34895;
|
||||
public static final int NULL_34900 = 34900;
|
||||
public static final int NULL_34901 = 34901;
|
||||
public static final int NULL_34902 = 34902;
|
||||
public static final int NULL_34903 = 34903;
|
||||
public static final int NULL_34904 = 34904;
|
||||
/* This file is automatically generated. Do not edit. */
|
||||
}
|
||||
|
||||
@@ -15241,11 +15241,11 @@ public final class ObjectID
|
||||
public static final int ROCKS_28890 = 28890;
|
||||
public static final int CRACK_28892 = 28892;
|
||||
public static final int STONE_28893 = 28893;
|
||||
public static final int ROPE_LADDER_28894 = 28894;
|
||||
public static final int ROPE_28895 = 28895;
|
||||
public static final int ROPE_28896 = 28896;
|
||||
public static final int ROPE_28897 = 28897;
|
||||
public static final int ROPE_28898 = 28898;
|
||||
public static final int VINE_LADDER = 28894;
|
||||
public static final int VINE_28895 = 28895;
|
||||
public static final int VINE_28896 = 28896;
|
||||
public static final int VINE_28897 = 28897;
|
||||
public static final int VINE_28898 = 28898;
|
||||
public static final int ALTAR_28900 = 28900;
|
||||
public static final int BOULDER_28901 = 28901;
|
||||
public static final int BOULDER_28904 = 28904;
|
||||
@@ -16846,7 +16846,7 @@ public final class ObjectID
|
||||
public static final int ROCK_31787 = 31787;
|
||||
public static final int ROCK_31788 = 31788;
|
||||
public static final int ROCK_31789 = 31789;
|
||||
public static final int VINE_LADDER = 31790;
|
||||
public static final int VINE_LADDER_31790 = 31790;
|
||||
public static final int HOLE_31791 = 31791;
|
||||
public static final int ROOTS_31792 = 31792;
|
||||
public static final int ROOT_31796 = 31796;
|
||||
@@ -18610,5 +18610,49 @@ public final class ObjectID
|
||||
public static final int LARRANS_SMALL_CHEST_34828 = 34828;
|
||||
public static final int LARRANS_BIG_CHEST = 34829;
|
||||
public static final int LARRANS_BIG_CHEST_34830 = 34830;
|
||||
public static final int SARACHNIS_DISPLAY = 34833;
|
||||
public static final int STRANGE_FLOOR_34834 = 34834;
|
||||
public static final int ANCIENT_FIRE = 34835;
|
||||
public static final int CURSED_ALTAR = 34836;
|
||||
public static final int ALTAR_34837 = 34837;
|
||||
public static final int GRUBBY_CHEST = 34838;
|
||||
public static final int GRUBBY_CHEST_34839 = 34839;
|
||||
public static final int GRUBBY_DOOR = 34840;
|
||||
public static final int TEMPLE_DOOR_34842 = 34842;
|
||||
public static final int TEMPLE_DOOR_34843 = 34843;
|
||||
public static final int DOOR_34844 = 34844;
|
||||
public static final int LEVER_34845 = 34845;
|
||||
public static final int LEVER_34846 = 34846;
|
||||
public static final int MUSTY_BOOKSHELF = 34847;
|
||||
public static final int MUSTY_BOOKSHELF_34848 = 34848;
|
||||
public static final int MUSTY_BOOKSHELF_34849 = 34849;
|
||||
public static final int MUSTY_BOOKSHELF_34850 = 34850;
|
||||
public static final int STONE_RELIEF = 34851;
|
||||
public static final int STONE_RELIEF_34852 = 34852;
|
||||
public static final int PASSAGE_34853 = 34853;
|
||||
public static final int WALL_34854 = 34854;
|
||||
public static final int SACRED_BONE_BURNER = 34855;
|
||||
public static final int TORCH_34856 = 34856;
|
||||
public static final int DRAGON_EGG_34857 = 34857;
|
||||
public static final int THICK_WEB = 34858;
|
||||
public static final int THICK_WEB_34859 = 34859;
|
||||
public static final int STRANGE_PASSAGE = 34860;
|
||||
public static final int STRANGE_WALL_34861 = 34861;
|
||||
public static final int LADDER_34862 = 34862;
|
||||
public static final int LADDER_34863 = 34863;
|
||||
public static final int STAIRCASE_34864 = 34864;
|
||||
public static final int STAIRCASE_34865 = 34865;
|
||||
public static final int CAULDRON_34866 = 34866;
|
||||
public static final int EGG_SAC = 34867;
|
||||
public static final int EMPTY_SAC = 34868;
|
||||
public static final int STONE_PILE_34870 = 34870;
|
||||
public static final int STONE_PILE_34871 = 34871;
|
||||
public static final int BROKEN_SUN_ALTAR = 34872;
|
||||
public static final int EMPTY_SARCOPHAGUS = 34873;
|
||||
public static final int FLOOR_TILE = 34874;
|
||||
public static final int BLOOD_34896 = 34896;
|
||||
public static final int WEB_34897 = 34897;
|
||||
public static final int WEB_34898 = 34898;
|
||||
public static final int SLASHED_WEB_34899 = 34899;
|
||||
/* This file is automatically generated. Do not edit. */
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
*/
|
||||
package net.runelite.api;
|
||||
|
||||
import java.awt.geom.Path2D;
|
||||
import static net.runelite.api.Constants.TILE_FLAG_BRIDGE;
|
||||
import java.awt.FontMetrics;
|
||||
import java.awt.Graphics2D;
|
||||
@@ -316,12 +317,6 @@ public class Perspective
|
||||
final int neX = localLocation.getX() + (size * LOCAL_TILE_SIZE / 2);
|
||||
final int neY = localLocation.getY() + (size * LOCAL_TILE_SIZE / 2);
|
||||
|
||||
final int seX = swX;
|
||||
final int seY = neY;
|
||||
|
||||
final int nwX = neX;
|
||||
final int nwY = swY;
|
||||
|
||||
final byte[][][] tileSettings = client.getTileSettings();
|
||||
|
||||
final int sceneX = localLocation.getSceneX();
|
||||
@@ -339,14 +334,14 @@ public class Perspective
|
||||
}
|
||||
|
||||
final int swHeight = getHeight(client, swX, swY, tilePlane);
|
||||
final int nwHeight = getHeight(client, nwX, nwY, tilePlane);
|
||||
final int nwHeight = getHeight(client, neX, swY, tilePlane);
|
||||
final int neHeight = getHeight(client, neX, neY, tilePlane);
|
||||
final int seHeight = getHeight(client, seX, seY, tilePlane);
|
||||
final int seHeight = getHeight(client, swX, neY, tilePlane);
|
||||
|
||||
Point p1 = localToCanvas(client, swX, swY, swHeight);
|
||||
Point p2 = localToCanvas(client, nwX, nwY, nwHeight);
|
||||
Point p2 = localToCanvas(client, neX, swY, nwHeight);
|
||||
Point p3 = localToCanvas(client, neX, neY, neHeight);
|
||||
Point p4 = localToCanvas(client, seX, seY, seHeight);
|
||||
Point p4 = localToCanvas(client, swX, neY, seHeight);
|
||||
|
||||
if (p1 == null || p2 == null || p3 == null || p4 == null)
|
||||
{
|
||||
@@ -549,7 +544,7 @@ public class Perspective
|
||||
)
|
||||
{
|
||||
int radius = 5;
|
||||
Area geometry = new Area();
|
||||
Path2D.Double geometry = new Path2D.Double();
|
||||
|
||||
final int tileHeight = getTileHeight(client, point, client.getPlane());
|
||||
|
||||
@@ -607,10 +602,10 @@ public class Perspective
|
||||
continue;
|
||||
}
|
||||
|
||||
geometry.add(new Area(clickableRect));
|
||||
geometry.append(clickableRect, false);
|
||||
}
|
||||
|
||||
return geometry;
|
||||
return new Area(geometry);
|
||||
}
|
||||
|
||||
private static Area getAABB(
|
||||
|
||||
@@ -104,10 +104,6 @@ public class Point
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (this.y != other.y)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
return this.y == other.y;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,11 +95,6 @@ public final class ScriptID
|
||||
*/
|
||||
public static final int CHAT_PROMPT_INIT = 223;
|
||||
|
||||
/**
|
||||
* Joins the corresponding minigame chat
|
||||
*/
|
||||
public static final int FORCE_JOIN_CC = 437;
|
||||
|
||||
/**
|
||||
* Displays the game messages when clicking on an item inside the Items Kept on Death interface
|
||||
* <ul>
|
||||
@@ -200,4 +195,14 @@ public final class ScriptID
|
||||
* Join a clan, duh
|
||||
*/
|
||||
public static final int CUSTOM_JOIN_CLAN = 10690;
|
||||
|
||||
/**
|
||||
* Send a public message
|
||||
*/
|
||||
public static final int PUBLICMSG = 13337;
|
||||
|
||||
/**
|
||||
* Clicking bank pin buttons runs this
|
||||
*/
|
||||
public static final int BANK_PIN_OP = 685;
|
||||
}
|
||||
@@ -651,7 +651,9 @@ public enum Varbits
|
||||
/**
|
||||
* POH Building mode (1 = yes, 0 = no)
|
||||
*/
|
||||
BUILDING_MODE(2176);
|
||||
BUILDING_MODE(2176),
|
||||
|
||||
WINTERTODT_TIMER(7980);
|
||||
|
||||
/**
|
||||
* The raw varbit ID.
|
||||
|
||||
@@ -271,8 +271,16 @@ public class WorldArea
|
||||
|
||||
LocalPoint lp = LocalPoint.fromWorld(client, x, y);
|
||||
|
||||
int startX = lp.getSceneX() + dx;
|
||||
int startY = lp.getSceneY() + dy;
|
||||
int startX = 0;
|
||||
if (lp != null)
|
||||
{
|
||||
startX = lp.getSceneX() + dx;
|
||||
}
|
||||
int startY = 0;
|
||||
if (lp != null)
|
||||
{
|
||||
startY = lp.getSceneY() + dy;
|
||||
}
|
||||
int checkX = startX + (dx > 0 ? width - 1 : 0);
|
||||
int checkY = startY + (dy > 0 ? height - 1 : 0);
|
||||
int endX = startX + width - 1;
|
||||
@@ -427,11 +435,8 @@ public class WorldArea
|
||||
}
|
||||
if (height == 1)
|
||||
{
|
||||
if ((collisionDataFlags[checkX - dx][checkY] & yFlags) != 0 &&
|
||||
extraCondition.test(WorldPoint.fromScene(client, startX, checkY, client.getPlane())))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return (collisionDataFlags[checkX - dx][checkY] & yFlags) == 0 ||
|
||||
!extraCondition.test(WorldPoint.fromScene(client, startX, checkY, client.getPlane()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -370,16 +370,12 @@ public class WorldPoint
|
||||
*/
|
||||
public static boolean isInZone(WorldPoint lowerBound, WorldPoint upperBound, WorldPoint userLocation)
|
||||
{
|
||||
if (userLocation.getX() < lowerBound.getX()
|
||||
|| userLocation.getX() > upperBound.getX()
|
||||
|| userLocation.getY() < lowerBound.getY()
|
||||
|| userLocation.getY() > upperBound.getY()
|
||||
|| userLocation.getPlane() < lowerBound.getPlane()
|
||||
|| userLocation.getPlane() > upperBound.getPlane())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
return userLocation.getX() >= lowerBound.getX()
|
||||
&& userLocation.getX() <= upperBound.getX()
|
||||
&& userLocation.getY() >= lowerBound.getY()
|
||||
&& userLocation.getY() <= upperBound.getY()
|
||||
&& userLocation.getPlane() >= lowerBound.getPlane()
|
||||
&& userLocation.getPlane() <= upperBound.getPlane();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -29,4 +29,10 @@ package net.runelite.api.events;
|
||||
*/
|
||||
public class BeforeRender
|
||||
{
|
||||
public static final BeforeRender INSTANCE = new BeforeRender();
|
||||
|
||||
private BeforeRender()
|
||||
{
|
||||
// noop
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,4 +29,10 @@ package net.runelite.api.events;
|
||||
*/
|
||||
public class CannonballFired
|
||||
{
|
||||
public static final CannonballFired INSTANCE = new CannonballFired();
|
||||
|
||||
private CannonballFired()
|
||||
{
|
||||
// noop
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,4 +29,10 @@ package net.runelite.api.events;
|
||||
*/
|
||||
public class CanvasSizeChanged
|
||||
{
|
||||
public static final CanvasSizeChanged INSTANCE = new CanvasSizeChanged();
|
||||
|
||||
private CanvasSizeChanged()
|
||||
{
|
||||
// noop
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,4 +29,10 @@ package net.runelite.api.events;
|
||||
*/
|
||||
public class ClientTick
|
||||
{
|
||||
public static final ClientTick INSTANCE = new ClientTick();
|
||||
|
||||
private ClientTick()
|
||||
{
|
||||
// noop
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package net.runelite.api.events;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class DynamicObjectAnimationChanged
|
||||
{
|
||||
/**
|
||||
* The object that has entered a new animation.
|
||||
*/
|
||||
private int object;
|
||||
/**
|
||||
* The id of the animation animation.
|
||||
*/
|
||||
private int animation;
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package net.runelite.api.events;
|
||||
|
||||
import lombok.Value;
|
||||
|
||||
/**
|
||||
* An event where a request to add a friend is sent to the server.
|
||||
*/
|
||||
@Value
|
||||
public class FriendAdded
|
||||
{
|
||||
/**
|
||||
* The name of the added friend.
|
||||
*/
|
||||
private final String name;
|
||||
}
|
||||
+1
-1
@@ -30,7 +30,7 @@ import lombok.Value;
|
||||
* An event where a request to remove a friend is sent to the server.
|
||||
*/
|
||||
@Value
|
||||
public class RemovedFriend
|
||||
public class FriendRemoved
|
||||
{
|
||||
/**
|
||||
* The name of the removed friend.
|
||||
@@ -24,8 +24,6 @@
|
||||
*/
|
||||
package net.runelite.api.events;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
// The NPC update event seem to run every server tick,
|
||||
// but having the game tick event after all packets
|
||||
// have been processed is typically more useful.
|
||||
@@ -43,7 +41,12 @@ import lombok.Data;
|
||||
* Note that occurrences that take place purely on the client, such as right
|
||||
* click menus, are independent of the game tick.
|
||||
*/
|
||||
@Data
|
||||
public class GameTick
|
||||
{
|
||||
public static final GameTick INSTANCE = new GameTick();
|
||||
|
||||
private GameTick()
|
||||
{
|
||||
// noop
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,4 +29,10 @@ package net.runelite.api.events;
|
||||
*/
|
||||
public class LocalPlayerDeath
|
||||
{
|
||||
public static final LocalPlayerDeath INSTANCE = new LocalPlayerDeath();
|
||||
|
||||
private LocalPlayerDeath()
|
||||
{
|
||||
// noop
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,7 +24,9 @@
|
||||
*/
|
||||
package net.runelite.api.events;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
import lombok.Data;
|
||||
import lombok.Setter;
|
||||
import net.runelite.api.MenuAction;
|
||||
import net.runelite.api.MenuEntry;
|
||||
|
||||
@@ -45,6 +47,13 @@ public class MenuOptionClicked
|
||||
public MenuOptionClicked(MenuEntry entry)
|
||||
{
|
||||
menuEntry = entry;
|
||||
authentic = true;
|
||||
}
|
||||
|
||||
public MenuOptionClicked(MenuEntry entry, boolean authentic)
|
||||
{
|
||||
menuEntry = entry;
|
||||
this.authentic = authentic;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -129,4 +138,10 @@ public class MenuOptionClicked
|
||||
{
|
||||
this.consumed = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether or not the event is authentic.
|
||||
*/
|
||||
@Setter(AccessLevel.PRIVATE)
|
||||
private boolean authentic;
|
||||
}
|
||||
|
||||
@@ -32,4 +32,10 @@ package net.runelite.api.events;
|
||||
*/
|
||||
public class UsernameChanged
|
||||
{
|
||||
public static final UsernameChanged INSTANCE = new UsernameChanged();
|
||||
|
||||
private UsernameChanged()
|
||||
{
|
||||
// noop
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,13 +24,16 @@
|
||||
*/
|
||||
package net.runelite.api.events;
|
||||
|
||||
import lombok.Value;
|
||||
|
||||
/**
|
||||
* An event where the position of a {@link net.runelite.api.widgets.Widget}
|
||||
* relative to its parent has changed.
|
||||
*/
|
||||
@Value
|
||||
public class WidgetPositioned
|
||||
{
|
||||
public static final WidgetPositioned INSTANCE = new WidgetPositioned();
|
||||
|
||||
private WidgetPositioned()
|
||||
{
|
||||
// noop
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Copyright (c) 2019, 7ate9 <https://github.com/se7enAte9>
|
||||
* Copyright (c) 2019, https://runelitepl.us
|
||||
* 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.api.events;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* An event where a draggable widget has been pressed.
|
||||
*/
|
||||
@Data
|
||||
public class WidgetPressed
|
||||
{
|
||||
public static final WidgetPressed INSTANCE = new WidgetPressed();
|
||||
|
||||
private WidgetPressed()
|
||||
{
|
||||
// noop
|
||||
}
|
||||
}
|
||||
@@ -125,8 +125,7 @@ public class Jarvis
|
||||
|
||||
private static long crossProduct(Point p, Point q, Point r)
|
||||
{
|
||||
long val = (long)(q.getY() - p.getY()) * (r.getX() - q.getX())
|
||||
return (long)(q.getY() - p.getY()) * (r.getX() - q.getX())
|
||||
- (long)(q.getX() - p.getX()) * (r.getY() - q.getY());
|
||||
return val;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -151,6 +151,7 @@ public class WidgetID
|
||||
public static final int BEGINNER_CLUE_MAP_WIZARDS_TOWER = 356;
|
||||
public static final int SEED_BOX_GROUP_ID = 128;
|
||||
public static final int ITEMS_KEPT_ON_DEATH_GROUP_ID = 4;
|
||||
public static final int TRADING_SCREEN = 335;
|
||||
|
||||
static class WorldMap
|
||||
{
|
||||
@@ -253,6 +254,7 @@ public class WidgetID
|
||||
static final int INVENTORY_ITEM_CONTAINER = 3;
|
||||
static final int BANK_TITLE_BAR = 4;
|
||||
static final int CONTENT_CONTAINER = 10;
|
||||
static final int TAB_CONTAINER = 11;
|
||||
static final int ITEM_CONTAINER = 13;
|
||||
static final int SEARCH_BUTTON_BACKGROUND = 40;
|
||||
static final int DEPOSIT_INVENTORY = 42;
|
||||
@@ -665,6 +667,7 @@ public class WidgetID
|
||||
|
||||
static class TheatreOfBlood
|
||||
{
|
||||
static final int RAIDING_PARTY = 9;
|
||||
static final int ORB_BOX = 10;
|
||||
static final int BOSS_HEALTH_BAR = 35;
|
||||
}
|
||||
|
||||
@@ -140,6 +140,7 @@ public enum WidgetInfo
|
||||
BANK_CONTENT_CONTAINER(WidgetID.BANK_GROUP_ID, WidgetID.Bank.CONTENT_CONTAINER),
|
||||
BANK_DEPOSIT_EQUIPMENT(WidgetID.BANK_GROUP_ID, WidgetID.Bank.DEPOSIT_EQUIPMENT),
|
||||
BANK_DEPOSIT_INVENTORY(WidgetID.BANK_GROUP_ID, WidgetID.Bank.DEPOSIT_INVENTORY),
|
||||
BANK_TAB_CONTAINER(WidgetID.BANK_GROUP_ID, WidgetID.Bank.TAB_CONTAINER),
|
||||
|
||||
GRAND_EXCHANGE_WINDOW_CONTAINER(WidgetID.GRAND_EXCHANGE_GROUP_ID, WidgetID.GrandExchange.WINDOW_CONTAINER),
|
||||
GRAND_EXCHANGE_OFFER_CONTAINER(WidgetID.GRAND_EXCHANGE_GROUP_ID, WidgetID.GrandExchange.OFFER_CONTAINER),
|
||||
@@ -444,6 +445,7 @@ public enum WidgetInfo
|
||||
|
||||
THEATRE_OF_BLOOD_HEALTH_ORBS(WidgetID.THEATRE_OF_BLOOD_GROUP_ID, WidgetID.TheatreOfBlood.ORB_BOX),
|
||||
THEATRE_OF_BLOOD_BOSS_HEALTH(WidgetID.THEATRE_OF_BLOOD_GROUP_ID, WidgetID.TheatreOfBlood.BOSS_HEALTH_BAR),
|
||||
THEATRE_OF_BLOOD_RAIDING_PARTY(WidgetID.THEATRE_OF_BLOOD_GROUP_ID, WidgetID.TheatreOfBlood.RAIDING_PARTY),
|
||||
|
||||
BLAST_FURNACE_COFFER(WidgetID.BLAST_FURNACE_GROUP_ID, 2),
|
||||
|
||||
|
||||
@@ -35,4 +35,10 @@ public final class WidgetType
|
||||
public static final int TEXT_INVENTORY = 7;
|
||||
public static final int IF1_TOOLTIP = 8;
|
||||
public static final int LINE = 9;
|
||||
public static final int FPS = 1336;
|
||||
public static final int VIEWPORT = 1337;
|
||||
public static final int MINIMAP = 1338;
|
||||
public static final int COMPASS = 1339;
|
||||
public static final int WORLD_MAP = 1400;
|
||||
public static final int WORLD_MAP_OVERVIEW = 1401;
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
<parent>
|
||||
<groupId>net.runelite</groupId>
|
||||
<artifactId>runelite-parent</artifactId>
|
||||
<version>1.5.28-SNAPSHOT</version>
|
||||
<version>1.5.29-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>client</artifactId>
|
||||
@@ -285,9 +285,10 @@
|
||||
<version>6.0_BETA</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.json</groupId>
|
||||
<artifactId>json</artifactId>
|
||||
<version>20180813</version>
|
||||
<groupId>org.codehaus.plexus</groupId>
|
||||
<artifactId>plexus-utils</artifactId>
|
||||
<version>3.0.21</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
||||
@@ -83,13 +83,13 @@ import org.slf4j.LoggerFactory;
|
||||
@Slf4j
|
||||
public class RuneLite
|
||||
{
|
||||
public static final String RUNELIT_VERSION = "2.0.1-1";
|
||||
public static final String RUNELIT_VERSION = "2.0.2";
|
||||
public static final File RUNELITE_DIR = new File(System.getProperty("user.home"), ".runelite");
|
||||
public static final File PROFILES_DIR = new File(RUNELITE_DIR, "profiles");
|
||||
public static final File PLUGIN_DIR = new File(RUNELITE_DIR, "plugins");
|
||||
public static final File SCREENSHOT_DIR = new File(RUNELITE_DIR, "screenshots");
|
||||
static final RuneLiteSplashScreen splashScreen = new RuneLiteSplashScreen();
|
||||
|
||||
public static final File LOGS_DIR = new File(RUNELITE_DIR, "logs");
|
||||
private static final RuneLiteSplashScreen splashScreen = new RuneLiteSplashScreen();
|
||||
|
||||
@Getter
|
||||
private static Injector injector;
|
||||
|
||||
@@ -41,6 +41,7 @@ import net.runelite.client.chat.ChatMessageManager;
|
||||
import net.runelite.client.config.ChatColorConfig;
|
||||
import net.runelite.client.config.ConfigManager;
|
||||
import net.runelite.client.config.RuneLiteConfig;
|
||||
import net.runelite.client.config.RuneLitePlusConfig;
|
||||
import net.runelite.client.eventbus.EventBus;
|
||||
import net.runelite.client.game.ItemManager;
|
||||
import net.runelite.client.menus.MenuManager;
|
||||
@@ -117,6 +118,13 @@ public class RuneLiteModule extends AbstractModule
|
||||
return configManager.getConfig(RuneLiteConfig.class);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
RuneLitePlusConfig providePlusConfig(ConfigManager configManager)
|
||||
{
|
||||
return configManager.getConfig(RuneLitePlusConfig.class);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
ChatColorConfig provideChatColorConfig(ConfigManager configManager)
|
||||
|
||||
@@ -31,17 +31,18 @@ import javax.annotation.Nullable;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.runelite.client.plugins.runeliteplus.RuneLitePlusPlugin;
|
||||
import net.runelite.client.config.RuneLitePlusConfig;
|
||||
|
||||
@Singleton
|
||||
@Slf4j
|
||||
public class RuneLiteProperties
|
||||
{
|
||||
public static String discordAppID = "409416265891971072";
|
||||
private static final String RUNELITE_TITLE = "runelite.title";
|
||||
private static final String RUNELITE_VERSION = "runelite.version";
|
||||
private static final String RUNELIT_VERSION = "runelit.version";
|
||||
private static final String RUNESCAPE_VERSION = "runescape.version";
|
||||
private static final String DISCORD_APP_ID = "runelite.discord.appid";
|
||||
private static final String DISCORD_APP_ID_PLUS = "runelite.plus.discord.appid";
|
||||
private static final String DISCORD_INVITE = "runelite.discord.invite";
|
||||
private static final String GITHUB_LINK = "runelite.github.link";
|
||||
private static final String WIKI_LINK = "runelite.wiki.link";
|
||||
@@ -50,9 +51,26 @@ public class RuneLiteProperties
|
||||
|
||||
private final Properties properties = new Properties();
|
||||
|
||||
private final RuneLitePlusConfig runeLitePlusConfig;
|
||||
|
||||
@Inject
|
||||
public RuneLiteProperties(final RuneLitePlusConfig runeLiteConfig)
|
||||
{
|
||||
this.runeLitePlusConfig = runeLiteConfig;
|
||||
|
||||
try (InputStream in = getClass().getResourceAsStream("runelite.properties"))
|
||||
{
|
||||
properties.load(in);
|
||||
}
|
||||
catch (IOException ex)
|
||||
{
|
||||
log.warn("unable to load propertries", ex);
|
||||
}
|
||||
}
|
||||
|
||||
public RuneLiteProperties()
|
||||
{
|
||||
runeLitePlusConfig = null;
|
||||
try (InputStream in = getClass().getResourceAsStream("runelite.properties"))
|
||||
{
|
||||
properties.load(in);
|
||||
@@ -79,6 +97,11 @@ public class RuneLiteProperties
|
||||
return properties.getProperty(RUNELITE_VERSION);
|
||||
}
|
||||
|
||||
public String getRunelitVersion()
|
||||
{
|
||||
return properties.getProperty(RUNELIT_VERSION);
|
||||
}
|
||||
|
||||
public String getRunescapeVersion()
|
||||
{
|
||||
return properties.getProperty(RUNESCAPE_VERSION);
|
||||
@@ -86,9 +109,14 @@ public class RuneLiteProperties
|
||||
|
||||
public String getDiscordAppId()
|
||||
{
|
||||
if (RuneLitePlusPlugin.customPresenceEnabled)
|
||||
if (this.runeLitePlusConfig == null)
|
||||
{
|
||||
return properties.getProperty(RuneLitePlusPlugin.rlPlusDiscordApp);
|
||||
return properties.getProperty(DISCORD_APP_ID);
|
||||
}
|
||||
|
||||
if (this.runeLitePlusConfig.customPresence())
|
||||
{
|
||||
return properties.getProperty(DISCORD_APP_ID_PLUS);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -36,7 +36,7 @@ import net.runelite.api.Client;
|
||||
@Slf4j
|
||||
public class ClientThread
|
||||
{
|
||||
private ConcurrentLinkedQueue<BooleanSupplier> invokes = new ConcurrentLinkedQueue<>();
|
||||
private final ConcurrentLinkedQueue<BooleanSupplier> invokes = new ConcurrentLinkedQueue<>();
|
||||
|
||||
@Inject
|
||||
private Client client;
|
||||
|
||||
@@ -87,9 +87,6 @@ public class Hooks implements Callbacks
|
||||
private static final OverlayRenderer renderer = injector.getInstance(OverlayRenderer.class);
|
||||
private static final OverlayManager overlayManager = injector.getInstance(OverlayManager.class);
|
||||
|
||||
private static final GameTick GAME_TICK = new GameTick();
|
||||
private static final BeforeRender BEFORE_RENDER = new BeforeRender();
|
||||
|
||||
@Inject
|
||||
private EventBus eventBus;
|
||||
|
||||
@@ -151,13 +148,13 @@ public class Hooks implements Callbacks
|
||||
|
||||
deferredEventBus.replay();
|
||||
|
||||
eventBus.post(GAME_TICK);
|
||||
eventBus.post(GameTick.INSTANCE);
|
||||
|
||||
int tick = client.getTickCount();
|
||||
client.setTickCount(tick + 1);
|
||||
}
|
||||
|
||||
eventBus.post(BEFORE_RENDER);
|
||||
eventBus.post(BeforeRender.INSTANCE);
|
||||
|
||||
clientThread.invoke();
|
||||
|
||||
|
||||
@@ -115,7 +115,7 @@ public class ChatMessageManager
|
||||
|
||||
boolean isChatboxTransparent = client.isResized() && client.getVar(Varbits.TRANSPARENT_CHATBOX) == 1;
|
||||
Color usernameColor = null;
|
||||
Color senderColor = null;
|
||||
Color senderColor;
|
||||
|
||||
switch (chatMessageType)
|
||||
{
|
||||
|
||||
@@ -53,10 +53,7 @@ public class ConfigDescriptor
|
||||
Collection<ConfigItemDescriptor> allItems = new ArrayList<>();
|
||||
for (ConfigItemsGroup g : itemGroups)
|
||||
{
|
||||
for (ConfigItemDescriptor item : g.getItems())
|
||||
{
|
||||
allItems.add(item);
|
||||
}
|
||||
allItems.addAll(g.getItems());
|
||||
}
|
||||
return allItems;
|
||||
}
|
||||
|
||||
@@ -81,7 +81,6 @@ public class ConfigManager
|
||||
@Inject
|
||||
EventBus eventBus;
|
||||
|
||||
private final ScheduledExecutorService executor;
|
||||
private final ConfigInvocationHandler handler = new ConfigInvocationHandler(this);
|
||||
private final Properties properties = new Properties();
|
||||
private final Map<String, Object> configObjectCache = new HashMap<>();
|
||||
@@ -90,9 +89,8 @@ public class ConfigManager
|
||||
@Inject
|
||||
public ConfigManager(ScheduledExecutorService scheduledExecutorService)
|
||||
{
|
||||
this.executor = scheduledExecutorService;
|
||||
|
||||
executor.scheduleWithFixedDelay(this::sendConfig, 30, 30, TimeUnit.SECONDS);
|
||||
scheduledExecutorService.scheduleWithFixedDelay(this::sendConfig, 30, 30, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
public final void switchSession()
|
||||
@@ -245,12 +243,10 @@ public class ConfigManager
|
||||
throw new RuntimeException("Non-public configuration classes can't have default methods invoked");
|
||||
}
|
||||
|
||||
T t = (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class<?>[]
|
||||
return (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class<?>[]
|
||||
{
|
||||
clazz
|
||||
}, handler);
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
public List<String> getConfigurationKeys(String prefix)
|
||||
|
||||
@@ -60,7 +60,7 @@ public class Keybind
|
||||
private final int keyCode;
|
||||
private final int modifiers;
|
||||
|
||||
protected Keybind(int keyCode, int modifiers, boolean ignoreModifiers)
|
||||
Keybind(int keyCode, int modifiers, boolean ignoreModifiers)
|
||||
{
|
||||
modifiers &= KEYBOARD_MODIFIER_MASK;
|
||||
|
||||
@@ -108,7 +108,7 @@ public class Keybind
|
||||
return matches(e, false);
|
||||
}
|
||||
|
||||
protected boolean matches(KeyEvent e, boolean ignoreModifiers)
|
||||
boolean matches(KeyEvent e, boolean ignoreModifiers)
|
||||
{
|
||||
if (NOT_SET.equals(this))
|
||||
{
|
||||
@@ -177,7 +177,7 @@ public class Keybind
|
||||
return mod;
|
||||
}
|
||||
|
||||
public static String getModifiersExText(int modifiers)
|
||||
private static String getModifiersExText(int modifiers)
|
||||
{
|
||||
StringBuilder buf = new StringBuilder();
|
||||
if ((modifiers & InputEvent.META_DOWN_MASK) != 0)
|
||||
|
||||
@@ -65,17 +65,6 @@ public interface RuneLiteConfig extends Config
|
||||
return false;
|
||||
}
|
||||
|
||||
@ConfigItem(
|
||||
keyName = "enablePlugins",
|
||||
name = "Enable loading of external plugins",
|
||||
description = "Enable loading of external plugins",
|
||||
position = 10
|
||||
)
|
||||
default boolean enablePlugins()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@ConfigItem(
|
||||
keyName = "containInScreen",
|
||||
name = "Contain in screen",
|
||||
|
||||
+12
-1
@@ -24,7 +24,7 @@
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
package net.runelite.client.plugins.runeliteplus;
|
||||
package net.runelite.client.config;
|
||||
|
||||
import net.runelite.client.config.Config;
|
||||
import net.runelite.client.config.ConfigGroup;
|
||||
@@ -81,4 +81,15 @@ public interface RuneLitePlusConfig extends Config
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@ConfigItem(
|
||||
keyName = "enablePlugins",
|
||||
name = "Enable loading of external plugins",
|
||||
description = "Enable loading of external plugins",
|
||||
position = 10
|
||||
)
|
||||
default boolean enablePlugins()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -49,7 +49,7 @@ import net.runelite.discord.DiscordUser;
|
||||
public class DiscordService implements AutoCloseable
|
||||
{
|
||||
private final EventBus eventBus;
|
||||
public final RuneLiteProperties runeLiteProperties;
|
||||
private final RuneLiteProperties runeLiteProperties;
|
||||
private final ScheduledExecutorService executorService;
|
||||
private final DiscordRPC discordRPC;
|
||||
|
||||
@@ -106,7 +106,7 @@ public class DiscordService implements AutoCloseable
|
||||
discordEventHandlers.joinGame = this::joinGame;
|
||||
discordEventHandlers.spectateGame = this::spectateGame;
|
||||
discordEventHandlers.joinRequest = this::joinRequest;
|
||||
discordRPC.Discord_Initialize(RuneLiteProperties.discordAppID, discordEventHandlers, true, null);
|
||||
discordRPC.Discord_Initialize(runeLiteProperties.getDiscordAppId(), discordEventHandlers, true, null);
|
||||
executorService.scheduleAtFixedRate(discordRPC::Discord_RunCallbacks, 0, 2, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@ import static net.runelite.client.game.HiscoreManager.NONE;
|
||||
import net.runelite.http.api.hiscore.HiscoreClient;
|
||||
import net.runelite.http.api.hiscore.HiscoreEndpoint;
|
||||
import net.runelite.http.api.hiscore.HiscoreResult;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@Slf4j
|
||||
class HiscoreLoader extends CacheLoader<HiscoreManager.HiscoreKey, HiscoreResult>
|
||||
@@ -50,7 +51,7 @@ class HiscoreLoader extends CacheLoader<HiscoreManager.HiscoreKey, HiscoreResult
|
||||
}
|
||||
|
||||
@Override
|
||||
public HiscoreResult load(HiscoreManager.HiscoreKey hiscoreKey) throws Exception
|
||||
public HiscoreResult load(@NotNull HiscoreManager.HiscoreKey hiscoreKey) throws Exception
|
||||
{
|
||||
return EMPTY;
|
||||
}
|
||||
|
||||
@@ -168,6 +168,7 @@ import net.runelite.client.eventbus.Subscribe;
|
||||
import net.runelite.http.api.item.ItemClient;
|
||||
import net.runelite.http.api.item.ItemPrice;
|
||||
import net.runelite.http.api.item.ItemStats;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@Singleton
|
||||
@Slf4j
|
||||
@@ -279,7 +280,7 @@ public class ItemManager
|
||||
.build(new CacheLoader<ImageKey, AsyncBufferedImage>()
|
||||
{
|
||||
@Override
|
||||
public AsyncBufferedImage load(ImageKey key) throws Exception
|
||||
public AsyncBufferedImage load(@NotNull ImageKey key) throws Exception
|
||||
{
|
||||
return loadImage(key.itemId, key.itemQuantity, key.stackable);
|
||||
}
|
||||
@@ -291,7 +292,7 @@ public class ItemManager
|
||||
.build(new CacheLoader<Integer, ItemDefinition>()
|
||||
{
|
||||
@Override
|
||||
public ItemDefinition load(Integer key) throws Exception
|
||||
public ItemDefinition load(@NotNull Integer key) throws Exception
|
||||
{
|
||||
return client.getItemDefinition(key);
|
||||
}
|
||||
@@ -303,7 +304,7 @@ public class ItemManager
|
||||
.build(new CacheLoader<OutlineKey, BufferedImage>()
|
||||
{
|
||||
@Override
|
||||
public BufferedImage load(OutlineKey key) throws Exception
|
||||
public BufferedImage load(@NotNull OutlineKey key) throws Exception
|
||||
{
|
||||
return loadItemOutline(key.itemId, key.itemQuantity, key.outlineColor);
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ public class SkillIconManager
|
||||
public BufferedImage getSkillImage(Skill skill, boolean small)
|
||||
{
|
||||
int skillIdx = skill.ordinal() + (small ? Skill.values().length : 0);
|
||||
BufferedImage skillImage = null;
|
||||
BufferedImage skillImage;
|
||||
|
||||
if (imgCache[skillIdx] != null)
|
||||
{
|
||||
|
||||
@@ -20,10 +20,10 @@ public enum Sound
|
||||
RESTORED_SPECIAL_ATTACK(16, "net/runelite/client/game/sounds/restorespec.wav"),
|
||||
IDLE(17, "net/runelite/client/game/sounds/idle.wav");
|
||||
|
||||
private String filePath;
|
||||
private int id;
|
||||
private final String filePath;
|
||||
private final int id;
|
||||
|
||||
private Sound(int id, String filePath)
|
||||
Sound(int id, String filePath)
|
||||
{
|
||||
this.id = id;
|
||||
this.filePath = filePath;
|
||||
|
||||
@@ -54,7 +54,7 @@ public class SpriteManager
|
||||
@Inject
|
||||
private ClientThread clientThread;
|
||||
|
||||
public Cache<Long, BufferedImage> cache = CacheBuilder.newBuilder()
|
||||
private final Cache<Long, BufferedImage> cache = CacheBuilder.newBuilder()
|
||||
.maximumSize(128L)
|
||||
.expireAfterAccess(1, TimeUnit.HOURS)
|
||||
.build();
|
||||
@@ -110,12 +110,8 @@ public class SpriteManager
|
||||
public void addSpriteTo(JButton c, int archive, int file)
|
||||
{
|
||||
getSpriteAsync(archive, file, img ->
|
||||
{
|
||||
SwingUtilities.invokeLater(() ->
|
||||
{
|
||||
c.setIcon(new ImageIcon(img));
|
||||
});
|
||||
});
|
||||
c.setIcon(new ImageIcon(img))));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -124,12 +120,8 @@ public class SpriteManager
|
||||
public void addSpriteTo(JLabel c, int archive, int file)
|
||||
{
|
||||
getSpriteAsync(archive, file, img ->
|
||||
{
|
||||
SwingUtilities.invokeLater(() ->
|
||||
{
|
||||
c.setIcon(new ImageIcon(img));
|
||||
});
|
||||
});
|
||||
c.setIcon(new ImageIcon(img))));
|
||||
}
|
||||
|
||||
public void addSpriteOverrides(SpriteOverride[] add)
|
||||
|
||||
@@ -27,13 +27,13 @@ package net.runelite.client.game.chatbox;
|
||||
/**
|
||||
* A modal input that lives in the chatbox panel.
|
||||
*/
|
||||
public abstract class ChatboxInput
|
||||
abstract class ChatboxInput
|
||||
{
|
||||
protected void open()
|
||||
void open()
|
||||
{
|
||||
}
|
||||
|
||||
protected void close()
|
||||
void close()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
+2
-5
@@ -156,12 +156,12 @@ public class ChatboxTextInput extends ChatboxInput implements KeyListener, Mouse
|
||||
return this;
|
||||
}
|
||||
|
||||
public ChatboxTextInput cursorAt(int index)
|
||||
private ChatboxTextInput cursorAt(int index)
|
||||
{
|
||||
return cursorAt(index, index);
|
||||
}
|
||||
|
||||
public ChatboxTextInput cursorAt(int indexA, int indexB)
|
||||
private ChatboxTextInput cursorAt(int indexA, int indexB)
|
||||
{
|
||||
if (indexA < 0)
|
||||
{
|
||||
@@ -722,9 +722,6 @@ public class ChatboxTextInput extends ChatboxInput implements KeyListener, Mouse
|
||||
newPos++;
|
||||
break;
|
||||
case KeyEvent.VK_UP:
|
||||
ev.consume();
|
||||
newPos = getLineOffset.applyAsInt(code);
|
||||
break;
|
||||
case KeyEvent.VK_DOWN:
|
||||
ev.consume();
|
||||
newPos = getLineOffset.applyAsInt(code);
|
||||
|
||||
@@ -27,6 +27,7 @@ package net.runelite.client.menus;
|
||||
import joptsimple.internal.Strings;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import net.runelite.api.MenuEntry;
|
||||
import static net.runelite.client.menus.MenuManager.LEVEL_PATTERN;
|
||||
import net.runelite.client.util.Text;
|
||||
@@ -52,6 +53,16 @@ public class ComparableEntry
|
||||
@Getter
|
||||
private boolean strictTarget;
|
||||
|
||||
/**
|
||||
* If two entries are both suppose to be left click,
|
||||
* the entry with the higher priority will be selected.
|
||||
* This only effects left click priority entries.
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
@EqualsAndHashCode.Exclude
|
||||
private int priority;
|
||||
|
||||
public ComparableEntry(String option, String target)
|
||||
{
|
||||
this(option, target, -1, -1, true, true);
|
||||
@@ -70,6 +81,7 @@ public class ComparableEntry
|
||||
this.type = type;
|
||||
this.strictOption = strictOption;
|
||||
this.strictTarget = strictTarget;
|
||||
this.priority = 0;
|
||||
}
|
||||
|
||||
// This is only used for type checking, which is why it has everything but target
|
||||
@@ -80,6 +92,7 @@ public class ComparableEntry
|
||||
this.id = e.getIdentifier();
|
||||
this.type = e.getType();
|
||||
this.strictOption = true;
|
||||
this.priority = 0;
|
||||
}
|
||||
|
||||
boolean matches(MenuEntry entry)
|
||||
|
||||
@@ -31,17 +31,20 @@ import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Multimap;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
@@ -60,6 +63,7 @@ import net.runelite.api.events.NpcActionChanged;
|
||||
import net.runelite.api.events.PlayerMenuOptionClicked;
|
||||
import net.runelite.api.events.PlayerMenuOptionsChanged;
|
||||
import net.runelite.api.events.WidgetMenuOptionClicked;
|
||||
import net.runelite.api.events.WidgetPressed;
|
||||
import net.runelite.api.widgets.WidgetInfo;
|
||||
import net.runelite.client.eventbus.EventBus;
|
||||
import net.runelite.client.eventbus.Subscribe;
|
||||
@@ -78,7 +82,6 @@ public class MenuManager
|
||||
|
||||
private final Client client;
|
||||
private final EventBus eventBus;
|
||||
private final Prioritizer prioritizer;
|
||||
|
||||
//Maps the indexes that are being used to the menu option.
|
||||
private final Map<Integer, String> playerMenuIndexMap = new HashMap<>();
|
||||
@@ -86,24 +89,23 @@ public class MenuManager
|
||||
private final Multimap<Integer, WidgetMenuOption> managedMenuOptions = HashMultimap.create();
|
||||
private final Set<String> npcMenuOptions = new HashSet<>();
|
||||
|
||||
private final Set<ComparableEntry> priorityEntries = new HashSet<>();
|
||||
private final Set<MenuEntry> currentPriorityEntries = new HashSet<>();
|
||||
private final Set<ComparableEntry> hiddenEntries = new HashSet<>();
|
||||
private final Set<MenuEntry> currentHiddenEntries = new HashSet<>();
|
||||
private final Map<ComparableEntry, ComparableEntry> swaps = new HashMap<>();
|
||||
private final Map<ComparableEntry, MenuEntry> currentSwaps = new HashMap<>();
|
||||
private final HashSet<ComparableEntry> priorityEntries = new HashSet<>();
|
||||
private HashMap<MenuEntry, ComparableEntry> currentPriorityEntries = new HashMap<>();
|
||||
private final ConcurrentHashMap<MenuEntry, ComparableEntry> safeCurrentPriorityEntries = new ConcurrentHashMap<>();
|
||||
private final HashSet<ComparableEntry> hiddenEntries = new HashSet<>();
|
||||
private HashSet<MenuEntry> currentHiddenEntries = new HashSet<>();
|
||||
private final HashMap<ComparableEntry, ComparableEntry> swaps = new HashMap<>();
|
||||
|
||||
private final LinkedHashSet<MenuEntry> entries = Sets.newLinkedHashSet();
|
||||
|
||||
private MenuEntry leftClickEntry = null;
|
||||
private int leftClickType = -1;
|
||||
private MenuEntry firstEntry = null;
|
||||
|
||||
@Inject
|
||||
private MenuManager(Client client, EventBus eventBus)
|
||||
{
|
||||
this.client = client;
|
||||
this.eventBus = eventBus;
|
||||
this.prioritizer = new Prioritizer();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -147,22 +149,11 @@ public class MenuManager
|
||||
public void onMenuOpened(MenuOpened event)
|
||||
{
|
||||
currentPriorityEntries.clear();
|
||||
currentHiddenEntries.clear();
|
||||
|
||||
// Need to reorder the list to normal, then rebuild with swaps
|
||||
MenuEntry[] oldEntries = event.getMenuEntries();
|
||||
|
||||
for (MenuEntry entry : oldEntries)
|
||||
{
|
||||
if (entry == leftClickEntry)
|
||||
{
|
||||
entry.setType(leftClickType);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
leftClickEntry = null;
|
||||
leftClickType = -1;
|
||||
firstEntry = null;
|
||||
|
||||
client.sortMenuEntries();
|
||||
|
||||
@@ -192,7 +183,7 @@ public class MenuManager
|
||||
{
|
||||
shouldDeprioritize = true;
|
||||
}
|
||||
currentPriorityEntries.add(entry);
|
||||
currentPriorityEntries.put(entry, p);
|
||||
newEntries.remove(entry);
|
||||
continue prioritizer;
|
||||
}
|
||||
@@ -221,8 +212,8 @@ public class MenuManager
|
||||
}
|
||||
}
|
||||
|
||||
// Do not need to swap with itself
|
||||
if (swapFrom != null && swapFrom != entry)
|
||||
// Do not need to swap with itself or if the swapFrom is already the first entry
|
||||
if (swapFrom != null && swapFrom != entry && swapFrom != Iterables.getLast(newEntries))
|
||||
{
|
||||
// Deprioritize entries if the swaps are not in similar type groups
|
||||
if ((swapFrom.getType() >= 1000 && entry.getType() < 1000) || (entry.getType() >= 1000 && swapFrom.getType() < 1000) && !shouldDeprioritize)
|
||||
@@ -250,12 +241,19 @@ public class MenuManager
|
||||
}
|
||||
}
|
||||
|
||||
if (!priorityEntries.isEmpty())
|
||||
if (!currentPriorityEntries.isEmpty())
|
||||
{
|
||||
newEntries.addAll(currentPriorityEntries);
|
||||
newEntries.addAll(currentPriorityEntries.entrySet().stream()
|
||||
.sorted(Comparator.comparingInt(e -> e.getValue().getPriority()))
|
||||
.map(Map.Entry::getKey)
|
||||
.collect(Collectors.toList()));
|
||||
}
|
||||
|
||||
event.setMenuEntries(newEntries.toArray(new MenuEntry[0]));
|
||||
MenuEntry[] arrayEntries = newEntries.toArray(new MenuEntry[0]);
|
||||
|
||||
// Need to set the event entries to prevent conflicts
|
||||
event.setMenuEntries(arrayEntries);
|
||||
client.setMenuEntries(arrayEntries);
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
@@ -282,77 +280,63 @@ public class MenuManager
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Subscribe
|
||||
public void onBeforeRender(BeforeRender event)
|
||||
{
|
||||
leftClickEntry = null;
|
||||
leftClickType = -1;
|
||||
|
||||
if (client.isMenuOpen())
|
||||
{
|
||||
return;
|
||||
rebuildLeftClickMenu();
|
||||
}
|
||||
|
||||
entries.clear();
|
||||
private MenuEntry rebuildLeftClickMenu()
|
||||
{
|
||||
if (client.isMenuOpen())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
firstEntry = null;
|
||||
entries.clear();
|
||||
entries.addAll(Arrays.asList(client.getMenuEntries()));
|
||||
|
||||
if (entries.size() < 2)
|
||||
{
|
||||
return;
|
||||
return null;
|
||||
}
|
||||
|
||||
currentPriorityEntries.clear();
|
||||
if (!hiddenEntries.isEmpty())
|
||||
{
|
||||
currentHiddenEntries.clear();
|
||||
currentSwaps.clear();
|
||||
indexHiddenEntries(entries);
|
||||
|
||||
prioritizer.prioritize();
|
||||
|
||||
while (prioritizer.isRunning())
|
||||
if (!currentHiddenEntries.isEmpty())
|
||||
{
|
||||
// wait
|
||||
}
|
||||
|
||||
entries.removeAll(currentHiddenEntries);
|
||||
|
||||
|
||||
for (MenuEntry entry : currentPriorityEntries)
|
||||
{
|
||||
if (entries.contains(entry))
|
||||
{
|
||||
leftClickEntry = entry;
|
||||
leftClickType = entry.getType();
|
||||
entries.remove(leftClickEntry);
|
||||
leftClickEntry.setType(MenuAction.WIDGET_DEFAULT.getId());
|
||||
entries.add(leftClickEntry);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (leftClickEntry == null)
|
||||
if (!priorityEntries.isEmpty())
|
||||
{
|
||||
MenuEntry first = Iterables.getLast(entries);
|
||||
|
||||
for (ComparableEntry swap : currentSwaps.keySet())
|
||||
{
|
||||
if (swap.matches(first))
|
||||
{
|
||||
leftClickEntry = currentSwaps.get(swap);
|
||||
leftClickType = leftClickEntry.getType();
|
||||
entries.remove(leftClickEntry);
|
||||
leftClickEntry.setType(MenuAction.WIDGET_DEFAULT.getId());
|
||||
entries.add(leftClickEntry);
|
||||
break;
|
||||
indexPriorityEntries(entries);
|
||||
}
|
||||
|
||||
if (firstEntry == null && !swaps.isEmpty())
|
||||
{
|
||||
indexSwapEntries(entries);
|
||||
}
|
||||
|
||||
if (firstEntry != null)
|
||||
{
|
||||
entries.remove(firstEntry);
|
||||
entries.add(firstEntry);
|
||||
}
|
||||
else if (!currentHiddenEntries.isEmpty())
|
||||
{
|
||||
firstEntry = Iterables.getLast(entries, null);
|
||||
}
|
||||
|
||||
client.setMenuEntries(entries.toArray(new MenuEntry[0]));
|
||||
}
|
||||
|
||||
return firstEntry;
|
||||
}
|
||||
|
||||
public void addPlayerMenuItem(String menuText)
|
||||
{
|
||||
@@ -455,15 +439,30 @@ public class MenuManager
|
||||
}
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onWidgetPressed(WidgetPressed event)
|
||||
{
|
||||
leftClickEntry = rebuildLeftClickMenu();
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onMenuOptionClicked(MenuOptionClicked event)
|
||||
{
|
||||
if (leftClickEntry != null && leftClickType != -1)
|
||||
if (!client.isMenuOpen() && event.isAuthentic())
|
||||
{
|
||||
// The mouse button will not be 0 if a non draggable widget was clicked,
|
||||
// otherwise the left click entry will have been set in onWidgetPressed
|
||||
if (client.getMouseCurrentButton() != 0)
|
||||
{
|
||||
leftClickEntry = rebuildLeftClickMenu();
|
||||
}
|
||||
|
||||
if (leftClickEntry != null)
|
||||
{
|
||||
leftClickEntry.setType(leftClickType);
|
||||
event.setMenuEntry(leftClickEntry);
|
||||
leftClickEntry = null;
|
||||
}
|
||||
}
|
||||
|
||||
if (event.getMenuAction() != MenuAction.RUNELITE)
|
||||
{
|
||||
@@ -534,7 +533,7 @@ public class MenuManager
|
||||
/**
|
||||
* Adds to the set of menu entries which when present, will remove all entries except for this one
|
||||
*/
|
||||
public void addPriorityEntry(String option, String target)
|
||||
public ComparableEntry addPriorityEntry(String option, String target)
|
||||
{
|
||||
option = Text.standardize(option);
|
||||
target = Text.standardize(target);
|
||||
@@ -542,6 +541,8 @@ public class MenuManager
|
||||
ComparableEntry entry = new ComparableEntry(option, target);
|
||||
|
||||
priorityEntries.add(entry);
|
||||
|
||||
return entry;
|
||||
}
|
||||
|
||||
public void removePriorityEntry(String option, String target)
|
||||
@@ -559,13 +560,15 @@ public class MenuManager
|
||||
* Adds to the set of menu entries which when present, will remove all entries except for this one
|
||||
* This method will add one with strict option, but not-strict target (contains for target, equals for option)
|
||||
*/
|
||||
public void addPriorityEntry(String option)
|
||||
public ComparableEntry addPriorityEntry(String option)
|
||||
{
|
||||
option = Text.standardize(option);
|
||||
|
||||
ComparableEntry entry = new ComparableEntry(option, "", false);
|
||||
|
||||
priorityEntries.add(entry);
|
||||
|
||||
return entry;
|
||||
}
|
||||
|
||||
public void removePriorityEntry(String option)
|
||||
@@ -789,115 +792,67 @@ public class MenuManager
|
||||
hiddenEntries.remove(entry);
|
||||
}
|
||||
|
||||
private class Prioritizer
|
||||
private void indexHiddenEntries(Set<MenuEntry> entries)
|
||||
{
|
||||
private MenuEntry[] entries;
|
||||
private AtomicInteger state = new AtomicInteger(0);
|
||||
|
||||
boolean isRunning()
|
||||
{
|
||||
return state.get() != 0;
|
||||
}
|
||||
|
||||
void prioritize()
|
||||
{
|
||||
if (state.get() != 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
entries = client.getMenuEntries();
|
||||
|
||||
state.set(3);
|
||||
|
||||
if (!hiddenEntries.isEmpty())
|
||||
{
|
||||
hiddenFinder.run();
|
||||
}
|
||||
else
|
||||
{
|
||||
state.decrementAndGet();
|
||||
}
|
||||
|
||||
if (!priorityEntries.isEmpty())
|
||||
{
|
||||
priorityFinder.run();
|
||||
}
|
||||
else
|
||||
{
|
||||
state.decrementAndGet();
|
||||
}
|
||||
|
||||
if (!swaps.isEmpty())
|
||||
{
|
||||
swapFinder.run();
|
||||
}
|
||||
else
|
||||
{
|
||||
state.decrementAndGet();
|
||||
}
|
||||
}
|
||||
|
||||
private Thread hiddenFinder = new Thread()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
Arrays.stream(entries).parallel().forEach(entry ->
|
||||
currentHiddenEntries = entries.parallelStream().filter(entry ->
|
||||
{
|
||||
for (ComparableEntry p : hiddenEntries)
|
||||
{
|
||||
if (p.matches(entry))
|
||||
{
|
||||
currentHiddenEntries.add(entry);
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
});
|
||||
state.decrementAndGet();
|
||||
return false;
|
||||
}).collect(Collectors.toCollection(HashSet::new));
|
||||
}
|
||||
};
|
||||
|
||||
private Thread priorityFinder = new Thread()
|
||||
// This could use some optimization
|
||||
private void indexPriorityEntries(Set<MenuEntry> entries)
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
Arrays.stream(entries).parallel().forEach(entry ->
|
||||
safeCurrentPriorityEntries.clear();
|
||||
entries.parallelStream().forEach(entry ->
|
||||
{
|
||||
for (ComparableEntry p : priorityEntries)
|
||||
{
|
||||
if (p.matches(entry))
|
||||
{
|
||||
currentPriorityEntries.add(entry);
|
||||
return;
|
||||
safeCurrentPriorityEntries.put(entry, p);
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
state.decrementAndGet();
|
||||
firstEntry = Iterables.getLast(safeCurrentPriorityEntries.entrySet().stream()
|
||||
.sorted(Comparator.comparingInt(e -> e.getValue().getPriority()))
|
||||
.map(Map.Entry::getKey)
|
||||
.collect(Collectors.toList()), null);
|
||||
}
|
||||
};
|
||||
|
||||
private Thread swapFinder = new Thread()
|
||||
private void indexSwapEntries(Set<MenuEntry> entries)
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
Arrays.stream(entries).parallel().forEach(entry ->
|
||||
{
|
||||
for (Map.Entry<ComparableEntry, ComparableEntry> p : swaps.entrySet())
|
||||
{
|
||||
if (p.getValue().matches(entry))
|
||||
{
|
||||
currentSwaps.put(p.getKey(), entry);
|
||||
return;
|
||||
}
|
||||
}
|
||||
});
|
||||
MenuEntry first = Iterables.getLast(entries);
|
||||
|
||||
state.decrementAndGet();
|
||||
}
|
||||
};
|
||||
List<ComparableEntry> values = new ArrayList<>();
|
||||
|
||||
for (Map.Entry<ComparableEntry, ComparableEntry> pair : swaps.entrySet())
|
||||
{
|
||||
if (pair.getKey().matches(first))
|
||||
{
|
||||
values.add(pair.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
firstEntry = entries.parallelStream().filter(entry ->
|
||||
{
|
||||
for (ComparableEntry value : values)
|
||||
{
|
||||
if (value.matches(entry))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}).findFirst().orElse(null);
|
||||
}
|
||||
}
|
||||
@@ -43,11 +43,16 @@ import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Iterator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.stream.Collectors;
|
||||
import javax.inject.Inject;
|
||||
@@ -228,7 +233,6 @@ public class PluginManager
|
||||
.directed()
|
||||
.build();
|
||||
|
||||
List<Plugin> scannedPlugins = new ArrayList<>();
|
||||
ClassPath classPath = ClassPath.from(classLoader);
|
||||
|
||||
ImmutableSet<ClassInfo> classes = packageName == null ? classPath.getAllClasses()
|
||||
@@ -285,24 +289,47 @@ public class PluginManager
|
||||
throw new RuntimeException("Plugin dependency graph contains a cycle!");
|
||||
}
|
||||
|
||||
List<Class<? extends Plugin>> sortedPlugins = topologicalSort(graph);
|
||||
List<List<Class<? extends Plugin>>> sortedPlugins = topologicalGroupSort(graph);
|
||||
sortedPlugins = Lists.reverse(sortedPlugins);
|
||||
|
||||
for (Class<? extends Plugin> pluginClazz : sortedPlugins)
|
||||
final long start = System.currentTimeMillis();
|
||||
|
||||
// some plugins get stuck on IO, so add some extra threads
|
||||
ExecutorService exec = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
|
||||
|
||||
List<Plugin> scannedPlugins = new CopyOnWriteArrayList<>();
|
||||
sortedPlugins.forEach(group ->
|
||||
{
|
||||
List<Future<?>> curGroup = new ArrayList<>();
|
||||
group.forEach(pluginClazz ->
|
||||
curGroup.add(exec.submit(() ->
|
||||
{
|
||||
Plugin plugin;
|
||||
try
|
||||
{
|
||||
plugin = instantiate(scannedPlugins, (Class<Plugin>) pluginClazz);
|
||||
}
|
||||
catch (PluginInstantiationException ex)
|
||||
catch (PluginInstantiationException e)
|
||||
{
|
||||
log.warn("Error instantiating plugin!", ex);
|
||||
continue;
|
||||
log.warn("Error instantiating plugin!", e);
|
||||
return;
|
||||
}
|
||||
|
||||
scannedPlugins.add(plugin);
|
||||
})));
|
||||
curGroup.forEach(future ->
|
||||
{
|
||||
try
|
||||
{
|
||||
future.get();
|
||||
}
|
||||
catch (InterruptedException | ExecutionException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
log.info("Plugin instantiation took {}ms", System.currentTimeMillis() - start);
|
||||
|
||||
return scannedPlugins;
|
||||
}
|
||||
@@ -515,40 +542,54 @@ public class PluginManager
|
||||
}
|
||||
|
||||
/**
|
||||
* Topologically sort a graph. Uses Kahn's algorithm.
|
||||
*
|
||||
* Topologically sort a graph into separate groups.
|
||||
* Each group represents the dependency level of the plugins.
|
||||
* Plugins in group (index) 0 has no dependents.
|
||||
* Plugins in group 1 has dependents in group 0.
|
||||
* Plugins in group 2 has dependents in group 1, etc.
|
||||
* This allows for loading dependent groups serially, starting from the last group,
|
||||
* while loading plugins within each group in parallel.
|
||||
* @param graph
|
||||
* @param <T>
|
||||
* @return
|
||||
*/
|
||||
private <T> List<T> topologicalSort(Graph<T> graph)
|
||||
private <T> List<List<T>> topologicalGroupSort(Graph<T> graph)
|
||||
{
|
||||
MutableGraph<T> graphCopy = Graphs.copyOf(graph);
|
||||
List<T> l = new ArrayList<>();
|
||||
Set<T> s = graphCopy.nodes().stream()
|
||||
.filter(node -> graphCopy.inDegree(node) == 0)
|
||||
final Set<T> root = graph.nodes().stream()
|
||||
.filter(node -> graph.inDegree(node) == 0)
|
||||
.collect(Collectors.toSet());
|
||||
while (!s.isEmpty())
|
||||
{
|
||||
Iterator<T> it = s.iterator();
|
||||
T n = it.next();
|
||||
it.remove();
|
||||
final Map<T, Integer> dependencyCount = new HashMap<>();
|
||||
|
||||
l.add(n);
|
||||
root.forEach(n -> dependencyCount.put(n, 0));
|
||||
root.forEach(n -> graph.successors(n)
|
||||
.forEach(m -> incrementChildren(graph, dependencyCount, m, dependencyCount.get(n) + 1)));
|
||||
|
||||
for (T m : graphCopy.successors(n))
|
||||
// create list<list> dependency grouping
|
||||
final List<List<T>> dependencyGroups = new ArrayList<>();
|
||||
final int[] curGroup = {-1};
|
||||
|
||||
dependencyCount.entrySet().stream()
|
||||
.sorted(Map.Entry.comparingByValue())
|
||||
.forEach(entry ->
|
||||
{
|
||||
graphCopy.removeEdge(n, m);
|
||||
if (graphCopy.inDegree(m) == 0)
|
||||
if (entry.getValue() != curGroup[0])
|
||||
{
|
||||
s.add(m);
|
||||
curGroup[0] = entry.getValue();
|
||||
dependencyGroups.add(new ArrayList<>());
|
||||
}
|
||||
dependencyGroups.get(dependencyGroups.size() - 1).add(entry.getKey());
|
||||
});
|
||||
|
||||
return dependencyGroups;
|
||||
}
|
||||
}
|
||||
if (!graphCopy.edges().isEmpty())
|
||||
|
||||
private <T> void incrementChildren(Graph<T> graph, Map<T, Integer> dependencyCount, T n, int val)
|
||||
{
|
||||
throw new RuntimeException("Graph has at least one cycle");
|
||||
}
|
||||
return l;
|
||||
if (!dependencyCount.containsKey(n) || dependencyCount.get(n) < val)
|
||||
{
|
||||
dependencyCount.put(n, val);
|
||||
graph.successors(n).forEach(m ->
|
||||
incrementChildren(graph, dependencyCount, m, val + 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import net.runelite.client.RuneLite;
|
||||
import net.runelite.client.config.Config;
|
||||
import net.runelite.client.config.ConfigManager;
|
||||
import net.runelite.client.config.RuneLiteConfig;
|
||||
import net.runelite.client.config.RuneLitePlusConfig;
|
||||
|
||||
@Singleton
|
||||
@Slf4j
|
||||
@@ -53,7 +53,7 @@ public class PluginWatcher extends Thread
|
||||
{
|
||||
private static final File BASE = RuneLite.PLUGIN_DIR;
|
||||
|
||||
private final RuneLiteConfig runeliteConfig;
|
||||
private final RuneLitePlusConfig runelitePlusConfig;
|
||||
private final PluginManager pluginManager;
|
||||
private final WatchService watchService;
|
||||
private final WatchKey watchKey;
|
||||
@@ -62,9 +62,9 @@ public class PluginWatcher extends Thread
|
||||
private ConfigManager configManager;
|
||||
|
||||
@Inject
|
||||
public PluginWatcher(RuneLiteConfig runeliteConfig, PluginManager pluginManager) throws IOException
|
||||
public PluginWatcher(RuneLitePlusConfig runelitePlusConfig, PluginManager pluginManager) throws IOException
|
||||
{
|
||||
this.runeliteConfig = runeliteConfig;
|
||||
this.runelitePlusConfig = runelitePlusConfig;
|
||||
this.pluginManager = pluginManager;
|
||||
|
||||
setName("Plugin Watcher");
|
||||
@@ -84,7 +84,7 @@ public class PluginWatcher extends Thread
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
if (runeliteConfig.enablePlugins())
|
||||
if (runelitePlusConfig.enablePlugins())
|
||||
{
|
||||
scan();
|
||||
}
|
||||
@@ -96,7 +96,7 @@ public class PluginWatcher extends Thread
|
||||
WatchKey key = watchService.take();
|
||||
Thread.sleep(50);
|
||||
|
||||
if (!runeliteConfig.enablePlugins())
|
||||
if (!runelitePlusConfig.enablePlugins())
|
||||
{
|
||||
key.reset();
|
||||
continue;
|
||||
|
||||
@@ -27,6 +27,7 @@ package net.runelite.client.plugins.account;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
import javax.swing.JOptionPane;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.runelite.client.account.AccountSession;
|
||||
@@ -47,6 +48,7 @@ import net.runelite.client.util.ImageUtil;
|
||||
loadWhenOutdated = true
|
||||
)
|
||||
@Slf4j
|
||||
@Singleton
|
||||
public class AccountPlugin extends Plugin
|
||||
{
|
||||
@Inject
|
||||
|
||||
+2
-4
@@ -32,6 +32,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Pattern;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.runelite.api.Client;
|
||||
import net.runelite.api.FontTypeFace;
|
||||
@@ -66,6 +67,7 @@ import net.runelite.client.util.Text;
|
||||
description = "Display level requirements in Achievement Diary interface",
|
||||
tags = {"achievements", "tasks"}
|
||||
)
|
||||
@Singleton
|
||||
public class DiaryRequirementsPlugin extends Plugin
|
||||
{
|
||||
private static final String AND_JOINER = ", ";
|
||||
@@ -122,10 +124,6 @@ public class DiaryRequirementsPlugin extends Plugin
|
||||
}
|
||||
|
||||
Map<String, String> skillRequirements = buildRequirements(requirements.getRequirements());
|
||||
if (skillRequirements == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int offset = 0;
|
||||
String taskBuffer = "";
|
||||
|
||||
+16
-13
@@ -32,6 +32,7 @@ import java.awt.Polygon;
|
||||
import java.awt.geom.Area;
|
||||
import java.util.List;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
import net.runelite.api.Client;
|
||||
import net.runelite.api.Point;
|
||||
import net.runelite.api.Tile;
|
||||
@@ -42,23 +43,23 @@ import net.runelite.client.ui.overlay.OverlayLayer;
|
||||
import net.runelite.client.ui.overlay.OverlayPosition;
|
||||
import net.runelite.client.ui.overlay.OverlayUtil;
|
||||
|
||||
@Singleton
|
||||
class AgilityOverlay extends Overlay
|
||||
{
|
||||
private static final int MAX_DISTANCE = 2350;
|
||||
private static final Color SHORTCUT_HIGH_LEVEL_COLOR = Color.ORANGE;
|
||||
|
||||
private final Client client;
|
||||
private final AgilityPlugin plugin;
|
||||
private final AgilityConfig config;
|
||||
|
||||
@Inject
|
||||
private AgilityOverlay(Client client, AgilityPlugin plugin, AgilityConfig config)
|
||||
private AgilityOverlay(final Client client, final AgilityPlugin plugin)
|
||||
{
|
||||
super(plugin);
|
||||
setPosition(OverlayPosition.DYNAMIC);
|
||||
setLayer(OverlayLayer.ABOVE_SCENE);
|
||||
this.client = client;
|
||||
this.plugin = plugin;
|
||||
this.config = config;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -69,14 +70,15 @@ class AgilityOverlay extends Overlay
|
||||
final List<Tile> marksOfGrace = plugin.getMarksOfGrace();
|
||||
plugin.getObstacles().forEach((object, obstacle) ->
|
||||
{
|
||||
if (Obstacles.SHORTCUT_OBSTACLE_IDS.containsKey(object.getId()) && !config.highlightShortcuts() ||
|
||||
Obstacles.TRAP_OBSTACLE_IDS.contains(object.getId()) && !config.showTrapOverlay())
|
||||
if (Obstacles.SHORTCUT_OBSTACLE_IDS.containsKey(object.getId()) && !plugin.isHighlightShortcuts() ||
|
||||
Obstacles.TRAP_OBSTACLE_IDS.contains(object.getId()) && !plugin.isShowTrapOverlay())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Tile tile = obstacle.getTile();
|
||||
if (tile.getPlane() == client.getPlane())
|
||||
if (tile.getPlane() == client.getPlane()
|
||||
&& object.getLocalLocation().distanceTo(playerLocation) < MAX_DISTANCE)
|
||||
{
|
||||
// This assumes that the obstacle is not clickable.
|
||||
if (Obstacles.TRAP_OBSTACLE_IDS.contains(object.getId()))
|
||||
@@ -84,7 +86,7 @@ class AgilityOverlay extends Overlay
|
||||
Polygon polygon = object.getCanvasTilePoly();
|
||||
if (polygon != null)
|
||||
{
|
||||
OverlayUtil.renderPolygon(graphics, polygon, config.getTrapColor());
|
||||
OverlayUtil.renderPolygon(graphics, polygon, plugin.getTrapColor());
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -92,10 +94,10 @@ class AgilityOverlay extends Overlay
|
||||
if (objectClickbox != null)
|
||||
{
|
||||
AgilityShortcut agilityShortcut = obstacle.getShortcut();
|
||||
Color configColor = agilityShortcut == null || agilityShortcut.getLevel() <= plugin.getAgilityLevel() ? config.getOverlayColor() : SHORTCUT_HIGH_LEVEL_COLOR;
|
||||
if (config.highlightMarks() && !marksOfGrace.isEmpty())
|
||||
Color configColor = agilityShortcut == null || agilityShortcut.getLevel() <= plugin.getAgilityLevel() ? plugin.getOverlayColor() : SHORTCUT_HIGH_LEVEL_COLOR;
|
||||
if (plugin.isHighlightMarks() && !marksOfGrace.isEmpty())
|
||||
{
|
||||
configColor = config.getMarkColor();
|
||||
configColor = plugin.getMarkColor();
|
||||
}
|
||||
|
||||
if (objectClickbox.contains(mousePosition.getX(), mousePosition.getY()))
|
||||
@@ -115,11 +117,12 @@ class AgilityOverlay extends Overlay
|
||||
|
||||
});
|
||||
|
||||
if (config.highlightMarks() && !marksOfGrace.isEmpty())
|
||||
if (plugin.isHighlightMarks() && !marksOfGrace.isEmpty())
|
||||
{
|
||||
for (Tile markOfGraceTile : marksOfGrace)
|
||||
{
|
||||
if (markOfGraceTile.getPlane() == client.getPlane() && markOfGraceTile.getItemLayer() != null)
|
||||
if (markOfGraceTile.getPlane() == client.getPlane() && markOfGraceTile.getItemLayer() != null
|
||||
&& markOfGraceTile.getLocalLocation().distanceTo(playerLocation) < MAX_DISTANCE)
|
||||
{
|
||||
final Polygon poly = markOfGraceTile.getItemLayer().getCanvasTilePoly();
|
||||
|
||||
@@ -128,7 +131,7 @@ class AgilityOverlay extends Overlay
|
||||
continue;
|
||||
}
|
||||
|
||||
OverlayUtil.renderPolygon(graphics, poly, config.getMarkColor());
|
||||
OverlayUtil.renderPolygon(graphics, poly, plugin.getMarkColor());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+63
-9
@@ -32,6 +32,8 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.Getter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.runelite.api.Client;
|
||||
@@ -83,14 +85,15 @@ import net.runelite.client.util.ColorUtil;
|
||||
tags = {"grace", "marks", "overlay", "shortcuts", "skilling", "traps"}
|
||||
)
|
||||
@Slf4j
|
||||
@Singleton
|
||||
public class AgilityPlugin extends Plugin
|
||||
{
|
||||
private static final int AGILITY_ARENA_REGION_ID = 11157;
|
||||
|
||||
@Getter
|
||||
@Getter(AccessLevel.PACKAGE)
|
||||
private final Map<TileObject, Obstacle> obstacles = new HashMap<>();
|
||||
|
||||
@Getter
|
||||
@Getter(AccessLevel.PACKAGE)
|
||||
private final List<Tile> marksOfGrace = new ArrayList<>();
|
||||
|
||||
@Inject
|
||||
@@ -117,13 +120,13 @@ public class AgilityPlugin extends Plugin
|
||||
@Inject
|
||||
private ItemManager itemManager;
|
||||
|
||||
@Getter
|
||||
@Getter(AccessLevel.PACKAGE)
|
||||
private AgilitySession session;
|
||||
|
||||
private int lastAgilityXp;
|
||||
private WorldPoint lastArenaTicketPosition;
|
||||
|
||||
@Getter
|
||||
@Getter(AccessLevel.PACKAGE)
|
||||
private int agilityLevel;
|
||||
|
||||
@Provides
|
||||
@@ -132,9 +135,36 @@ public class AgilityPlugin extends Plugin
|
||||
return configManager.getConfig(AgilityConfig.class);
|
||||
}
|
||||
|
||||
// Config values
|
||||
@Getter(AccessLevel.PACKAGE)
|
||||
private boolean showLapCount;
|
||||
@Getter(AccessLevel.PACKAGE)
|
||||
private int lapTimeout;
|
||||
@Getter(AccessLevel.PACKAGE)
|
||||
private boolean lapsToLevel;
|
||||
@Getter(AccessLevel.PACKAGE)
|
||||
private boolean lapsToGoal;
|
||||
@Getter(AccessLevel.PACKAGE)
|
||||
private Color overlayColor;
|
||||
@Getter(AccessLevel.PACKAGE)
|
||||
private boolean highlightMarks;
|
||||
@Getter(AccessLevel.PACKAGE)
|
||||
private Color markColor;
|
||||
@Getter(AccessLevel.PACKAGE)
|
||||
private boolean highlightShortcuts;
|
||||
@Getter(AccessLevel.PACKAGE)
|
||||
private boolean showTrapOverlay;
|
||||
@Getter(AccessLevel.PACKAGE)
|
||||
private Color trapColor;
|
||||
private boolean notifyAgilityArena;
|
||||
private boolean showAgilityArenaTimer;
|
||||
private boolean showShortcutLevel;
|
||||
|
||||
@Override
|
||||
protected void startUp() throws Exception
|
||||
{
|
||||
updateConfig();
|
||||
|
||||
overlayManager.add(agilityOverlay);
|
||||
overlayManager.add(lapCounterOverlay);
|
||||
agilityLevel = client.getBoostedSkillLevel(Skill.AGILITY);
|
||||
@@ -179,16 +209,40 @@ public class AgilityPlugin extends Plugin
|
||||
@Subscribe
|
||||
public void onConfigChanged(ConfigChanged event)
|
||||
{
|
||||
if (!config.showAgilityArenaTimer())
|
||||
if (!event.getGroup().equals("agility"))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
updateConfig();
|
||||
|
||||
if (!this.showAgilityArenaTimer)
|
||||
{
|
||||
removeAgilityArenaTimer();
|
||||
}
|
||||
}
|
||||
|
||||
public void updateConfig()
|
||||
{
|
||||
this.showLapCount = config.showLapCount();
|
||||
this.lapTimeout = config.lapTimeout();
|
||||
this.lapsToLevel = config.lapsToLevel();
|
||||
this.lapsToGoal = config.lapsToGoal();
|
||||
this.overlayColor = config.getOverlayColor();
|
||||
this.highlightMarks = config.highlightMarks();
|
||||
this.markColor = config.getMarkColor();
|
||||
this.highlightShortcuts = config.highlightShortcuts();
|
||||
this.showTrapOverlay = config.showTrapOverlay();
|
||||
this.trapColor = config.getTrapColor();
|
||||
this.notifyAgilityArena = config.notifyAgilityArena();
|
||||
this.showAgilityArenaTimer = config.showAgilityArenaTimer();
|
||||
this.showShortcutLevel = config.showShortcutLevel();
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onExperienceChanged(ExperienceChanged event)
|
||||
{
|
||||
if (event.getSkill() != AGILITY || !config.showLapCount())
|
||||
if (event.getSkill() != AGILITY || !this.showLapCount)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -272,12 +326,12 @@ public class AgilityPlugin extends Plugin
|
||||
{
|
||||
log.debug("Ticked position moved from {} to {}", oldTickPosition, newTicketPosition);
|
||||
|
||||
if (config.notifyAgilityArena())
|
||||
if (this.notifyAgilityArena)
|
||||
{
|
||||
notifier.notify("Ticket location changed");
|
||||
}
|
||||
|
||||
if (config.showAgilityArenaTimer())
|
||||
if (this.showAgilityArenaTimer)
|
||||
{
|
||||
showNewAgilityArenaTimer();
|
||||
}
|
||||
@@ -430,7 +484,7 @@ public class AgilityPlugin extends Plugin
|
||||
@Subscribe
|
||||
public void onMenuEntryAdded(MenuEntryAdded event)
|
||||
{
|
||||
if (!config.showShortcutLevel())
|
||||
if (!this.showShortcutLevel)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
+1
-1
@@ -42,7 +42,7 @@ class AgilitySession
|
||||
private int lapsTillLevel;
|
||||
private int lapsTillGoal;
|
||||
|
||||
AgilitySession(Courses course)
|
||||
AgilitySession(final Courses course)
|
||||
{
|
||||
this.course = course;
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ package net.runelite.client.plugins.agility;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import java.util.Map;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.Getter;
|
||||
import net.runelite.api.coords.WorldPoint;
|
||||
|
||||
@@ -50,16 +51,16 @@ enum Courses
|
||||
|
||||
private final static Map<Integer, Courses> coursesByRegion;
|
||||
|
||||
@Getter
|
||||
@Getter(AccessLevel.PACKAGE)
|
||||
private final double totalXp;
|
||||
|
||||
@Getter
|
||||
@Getter(AccessLevel.PACKAGE)
|
||||
private final int lastObstacleXp;
|
||||
|
||||
@Getter
|
||||
@Getter(AccessLevel.PACKAGE)
|
||||
private final int regionId;
|
||||
|
||||
@Getter
|
||||
@Getter(AccessLevel.PACKAGE)
|
||||
private final WorldPoint[] courseEndWorldPoints;
|
||||
|
||||
static
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user