Add XP drop plugin

This commit is contained in:
ceikry 2022-07-10 18:46:25 -05:00 committed by Ceikry
parent be61fd1daf
commit 529f741e13
18 changed files with 342 additions and 71 deletions

View file

@ -1,6 +1,7 @@
plugins { plugins {
id 'java' id 'java'
id 'application' id 'application'
id 'org.jetbrains.kotlin.jvm' version '1.4.10'
} }
mainClassName = 'rt4.client' mainClassName = 'rt4.client'
@ -35,6 +36,8 @@ dependencies {
implementation 'lib:jogl-all-natives-linux-i586' implementation 'lib:jogl-all-natives-linux-i586'
implementation 'lib:jogl-all-natives-macosx-universal' implementation 'lib:jogl-all-natives-macosx-universal'
implementation 'lib:jogl-all-natives-android-aarch64' implementation 'lib:jogl-all-natives-android-aarch64'
runtime 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10'
} }
jar { jar {
@ -42,4 +45,5 @@ jar {
attributes 'Main-Class': "$mainClassName" attributes 'Main-Class': "$mainClassName"
} }
from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } } from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
duplicatesStrategy = DuplicatesStrategy.INCLUDE
} }

View file

@ -37,8 +37,10 @@ public abstract class Plugin {
/** /**
* OnXPUpdate() is called when the client receives an XP update packet. This includes at login. * OnXPUpdate() is called when the client receives an XP update packet. This includes at login.
* @param skill - the skill ID being updated
* @param xp - the new total XP for the skill.
*/ */
public void OnXPUpdate() {} public void OnXPUpdate(int skill, int xp) {}
/** /**
* Update() is called once per tick, aka once every 600ms. * Update() is called once per tick, aka once every 600ms.
@ -81,4 +83,9 @@ public abstract class Plugin {
* @param value the value the varp is being set to. * @param value the value the varp is being set to.
*/ */
public void OnVarpUpdate(int id, int value) {} public void OnVarpUpdate(int id, int value) {}
/**
* OnLogout is called when the client logs out. This should be used to clear player-relevant plugin state.
*/
public void OnLogout() {}
} }

View file

@ -103,4 +103,12 @@ public class PluginRepository {
public static void OnVarpUpdate(int id, int value) { public static void OnVarpUpdate(int id, int value) {
loadedPlugins.values().forEach((plugin) -> plugin.OnVarpUpdate(id, value)); loadedPlugins.values().forEach((plugin) -> plugin.OnVarpUpdate(id, value));
} }
public static void OnXPUpdate(int skill, int xp) {
loadedPlugins.values().forEach((plugin) -> plugin.OnXPUpdate(skill, xp));
}
public static void OnLogout() {
loadedPlugins.values().forEach(Plugin::OnLogout);
}
} }

View file

@ -1,6 +1,10 @@
package plugin.api; package plugin.api;
import rt4.*; import rt4.*;
import rt4.DisplayMode;
import rt4.Font;
import java.awt.*;
/** /**
* API used for writing plugins, so dozens of plugins don't break when we rename shit :) * API used for writing plugins, so dozens of plugins don't break when we rename shit :)
@ -8,7 +12,7 @@ import rt4.*;
*/ */
public class API { public class API {
public static void DrawText(FontType fontType, FontColor color, TextModifier mod, String text, int screenX, int screenY) { public static void DrawText(FontType fontType, FontColor color, TextModifier mod, String text, int screenX, int screenY) {
JagString js = JagString.parse(text); JagString js = JagString.of(text);
Font font; Font font;
switch (fontType) { switch (fontType) {
@ -51,4 +55,60 @@ public class API {
public static boolean IsHD() { public static boolean IsHD() {
return GlRenderer.enabled; return GlRenderer.enabled;
} }
public static Sprite GetSprite(int spriteId) {
Sprite rawSprite = null;
if (client.js5Archive8.isFileReady(spriteId)) {
rawSprite = SpriteLoader.loadSprites(spriteId, client.js5Archive8);
}
return rawSprite;
}
public static WindowMode GetWindowMode() {
int mode = DisplayMode.getWindowMode();
switch(mode) {
case 2:
return WindowMode.RESIZABLE;
case 3:
return WindowMode.FULLSCREEN;
default:
return WindowMode.FIXED;
}
}
public static Dimension GetWindowDimensions() {
return new Dimension(GameShell.canvasWidth, GameShell.canvasHeight);
}
public static void FillRect(int x, int y, int width, int height, int color, int alpha) {
if (IsHD()) {
if (alpha != 0)
GlRaster.fillRectAlpha(x,y,width,height,color,alpha);
else
GlRaster.fillRect(x,y,width,height,color);
} else {
if (alpha != 0)
SoftwareRaster.fillRectAlpha(x,y,width,height,color,alpha);
else
SoftwareRaster.fillRect(x,y,width,height,color);
}
}
public static void DrawRect(int x, int y, int width, int height, int color) {
if (IsHD()) {
GlRaster.drawRect(x, y, width, height, color);
} else {
SoftwareRaster.drawRect(x, y, width, height, color);
}
}
public static void ClipRect(int x, int y, int width, int height) {
if (IsHD()) {
GlRaster.setClip(x,y,width,height);
} else {
SoftwareRaster.setClip(x,y,width,height);
}
}
} }

View file

@ -12,6 +12,6 @@ public class FontColor {
} }
public static FontColor fromColor(Color color) { public static FontColor fromColor(Color color) {
return new FontColor(color.getRed() << 16 + color.getGreen() << 8 + color.getBlue()); return new FontColor((color.getRed() << 16) + (color.getGreen() << 8) + color.getBlue());
} }
} }

View file

@ -0,0 +1,7 @@
package plugin.api;
public enum WindowMode {
FIXED,
RESIZABLE,
FULLSCREEN
}

View file

@ -102,7 +102,7 @@ public class Cheat {
@OriginalMember(owner = "client!en", name = "a", descriptor = "(IIIB)V") @OriginalMember(owner = "client!en", name = "a", descriptor = "(IIIB)V")
public static void teleport(@OriginalArg(0) int arg0, @OriginalArg(1) int arg1, @OriginalArg(2) int arg2) { public static void teleport(@OriginalArg(0) int arg0, @OriginalArg(1) int arg1, @OriginalArg(2) int arg2) {
@Pc(66) JagString local66 = JagString.concatenate(new JagString[]{aClass100_521, JagString.parseInt(arg2), Cs1ScriptRunner.aClass100_760, JagString.parseInt(arg0 >> 6), Cs1ScriptRunner.aClass100_760, JagString.parseInt(arg1 >> 6), Cs1ScriptRunner.aClass100_760, JagString.parseInt(arg0 & 0x3F), Cs1ScriptRunner.aClass100_760, JagString.parseInt(arg1 & 0x3F)}); @Pc(66) JagString local66 = JagString.concatenate(new JagString[]{aClass100_521, JagString.parseInt(arg2), JagString.aClass100_760, JagString.parseInt(arg0 >> 6), JagString.aClass100_760, JagString.parseInt(arg1 >> 6), JagString.aClass100_760, JagString.parseInt(arg0 & 0x3F), JagString.aClass100_760, JagString.parseInt(arg1 & 0x3F)});
local66.print(); local66.print();
execute(local66); execute(local66);
} }

View file

@ -34,22 +34,6 @@ public class Cs1ScriptRunner {
public static final int anInt671 = 0x332d25; public static final int anInt671 = 0x332d25;
@OriginalMember(owner = "client!pg", name = "V", descriptor = "I") @OriginalMember(owner = "client!pg", name = "V", descriptor = "I")
public static final int anInt4504 = 50; public static final int anInt4504 = 50;
@OriginalMember(owner = "client!wa", name = "pb", descriptor = "Lclient!na;")
public static final JagString aClass100_556 = JagString.parse("<br>");
@OriginalMember(owner = "client!ed", name = "H", descriptor = "Lclient!na;")
public static final JagString aClass100_375 = JagString.parse("<)4col> x");
@OriginalMember(owner = "client!je", name = "db", descriptor = "Lclient!na;")
public static final JagString aClass100_589 = JagString.parse(" <col=ffffff>");
@OriginalMember(owner = "client!uf", name = "s", descriptor = "Lclient!na;")
public static final JagString aClass100_1043 = JagString.parse(" <col=00ff80>");
@OriginalMember(owner = "client!wj", name = "b", descriptor = "Lclient!na;")
public static final JagString aClass100_1101 = JagString.parse(" <col=ffff00>");
@OriginalMember(owner = "client!mi", name = "R", descriptor = "Lclient!na;")
public static final JagString aClass100_760 = JagString.parse(")1");
@OriginalMember(owner = "client!sj", name = "w", descriptor = "Lclient!na;")
public static final JagString aClass100_978 = JagString.parse("<)4col>");
@OriginalMember(owner = "client!jb", name = "c", descriptor = "Lclient!na;")
public static final JagString aClass100_583 = JagString.parse("(Y<)4col>");
@OriginalMember(owner = "client!th", name = "m", descriptor = "[Lclient!be;") @OriginalMember(owner = "client!th", name = "m", descriptor = "[Lclient!be;")
public static Component[] aClass13Array13; public static Component[] aClass13Array13;
@OriginalMember(owner = "client!k", name = "j", descriptor = "I") @OriginalMember(owner = "client!k", name = "j", descriptor = "I")
@ -776,7 +760,7 @@ public class Cs1ScriptRunner {
local1934 = MiniMenu.NULL; local1934 = MiniMenu.NULL;
} }
if ((local1989.stackable == 1 || component.objCount != 1) && component.objCount != -1) { if ((local1989.stackable == 1 || component.objCount != 1) && component.objCount != -1) {
local1934 = JagString.concatenate(new JagString[]{MiniMenu.aClass100_32, local1934, aClass100_375, method1548(component.objCount)}); local1934 = JagString.concatenate(new JagString[]{MiniMenu.aClass100_32, local1934, JagString.aClass100_375, method1548(component.objCount)});
} }
} }
if (aClass13_10 == component) { if (aClass13_10 == component) {
@ -1018,9 +1002,9 @@ public class Cs1ScriptRunner {
local2611 = ObjTypeList.get(component.objTypes[local276] - 1); local2611 = ObjTypeList.get(component.objTypes[local276] - 1);
@Pc(3159) JagString local3159; @Pc(3159) JagString local3159;
if (local2611.stackable != 1 && component.objCounts[local276] == 1) { if (local2611.stackable != 1 && component.objCounts[local276] == 1) {
local3159 = JagString.concatenate(new JagString[]{MiniMenu.aClass100_32, local2611.name, aClass100_978}); local3159 = JagString.concatenate(new JagString[]{MiniMenu.aClass100_32, local2611.name, JagString.aClass100_978});
} else { } else {
local3159 = JagString.concatenate(new JagString[]{MiniMenu.aClass100_32, local2611.name, aClass100_375, method1548(component.objCounts[local276])}); local3159 = JagString.concatenate(new JagString[]{MiniMenu.aClass100_32, local2611.name, JagString.aClass100_375, method1548(component.objCounts[local276])});
} }
local556 = local123 + memory * (component.invMarginX + 115); local556 = local123 + memory * (component.invMarginX + 115);
objId = (component.invMarginY + 12) * local468 + local114; objId = (component.invMarginY + 12) * local468 + local114;
@ -1045,7 +1029,7 @@ public class Cs1ScriptRunner {
local3297 = interpolate(component, local3297); local3297 = interpolate(component, local3297);
@Pc(3325) JagString local3325; @Pc(3325) JagString local3325;
while (local3297.length() > 0) { while (local3297.length() > 0) {
cardMemory = local3297.indexOf(aClass100_556); cardMemory = local3297.indexOf(JagString.aClass100_556);
if (cardMemory == -1) { if (cardMemory == -1) {
local3325 = local3297; local3325 = local3297;
local3297 = JagString.EMPTY; local3297 = JagString.EMPTY;
@ -1083,7 +1067,7 @@ public class Cs1ScriptRunner {
objId = local556 + local3299.lineHeight + 2; objId = local556 + local3299.lineHeight + 2;
local3297 = interpolate(component, local3297); local3297 = interpolate(component, local3297);
while (local3297.length() > 0) { while (local3297.length() > 0) {
local563 = local3297.indexOf(aClass100_556); local563 = local3297.indexOf(JagString.aClass100_556);
if (local563 == -1) { if (local563 == -1) {
local3325 = local3297; local3325 = local3297;
local3297 = JagString.EMPTY; local3297 = JagString.EMPTY;
@ -1257,14 +1241,14 @@ public class Cs1ScriptRunner {
public static JagString method1548(@OriginalArg(1) int arg0) { public static JagString method1548(@OriginalArg(1) int arg0) {
@Pc(9) JagString local9 = JagString.parseInt(arg0); @Pc(9) JagString local9 = JagString.parseInt(arg0);
for (@Pc(21) int local21 = local9.length() - 3; local21 > 0; local21 -= 3) { for (@Pc(21) int local21 = local9.length() - 3; local21 > 0; local21 -= 3) {
local9 = JagString.concatenate(new JagString[]{local9.substring(local21, 0), aClass100_760, local9.substring(local21)}); local9 = JagString.concatenate(new JagString[]{local9.substring(local21, 0), JagString.aClass100_760, local9.substring(local21)});
} }
if (local9.length() > 9) { if (local9.length() > 9) {
return JagString.concatenate(new JagString[]{aClass100_1043, local9.substring(local9.length() - 8, 0), LocalizedText.MILLION_SHORT, MiniMenu.OPEN_PARENTHESIS, local9, aClass100_583}); return JagString.concatenate(new JagString[]{JagString.aClass100_1043, local9.substring(local9.length() - 8, 0), LocalizedText.MILLION_SHORT, MiniMenu.OPEN_PARENTHESIS, local9, JagString.aClass100_583});
} else if (local9.length() > 6) { } else if (local9.length() > 6) {
return JagString.concatenate(new JagString[]{aClass100_589, local9.substring(local9.length() - 4, 0), LocalizedText.THOUSAND_SHORT, MiniMenu.OPEN_PARENTHESIS, local9, aClass100_583}); return JagString.concatenate(new JagString[]{JagString.aClass100_589, local9.substring(local9.length() - 4, 0), LocalizedText.THOUSAND_SHORT, MiniMenu.OPEN_PARENTHESIS, local9, JagString.aClass100_583});
} else { } else {
return JagString.concatenate(new JagString[]{aClass100_1101, local9, aClass100_978}); return JagString.concatenate(new JagString[]{JagString.aClass100_1101, local9, JagString.aClass100_978});
} }
} }

View file

@ -12,16 +12,6 @@ public final class DateUtil {
@OriginalMember(owner = "client!cl", name = "K", descriptor = "Ljava/util/Calendar;") @OriginalMember(owner = "client!cl", name = "K", descriptor = "Ljava/util/Calendar;")
public static final Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); public static final Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
@OriginalMember(owner = "client!fn", name = "Z", descriptor = "Lclient!na;")
public static final JagString aClass100_461 = JagString.parse(")1 ");
@OriginalMember(owner = "client!wb", name = "a", descriptor = "Lclient!na;")
public static final JagString aClass100_1089 = JagString.parse(")2");
@OriginalMember(owner = "client!dm", name = "j", descriptor = "Lclient!na;")
public static final JagString SPACE = JagString.parse(" ");
@OriginalMember(owner = "client!vh", name = "c", descriptor = "Lclient!na;")
public static final JagString COLON = JagString.parse(":");
@OriginalMember(owner = "client!ee", name = "a", descriptor = "Lclient!na;")
public static final JagString TIMEZONE = JagString.parse(" GMT");
@OriginalMember(owner = "client!km", name = "tc", descriptor = "Lclient!na;") @OriginalMember(owner = "client!km", name = "tc", descriptor = "Lclient!na;")
private static final JagString DEC = JagString.parse("Dec"); private static final JagString DEC = JagString.parse("Dec");
@ -104,6 +94,6 @@ public final class DateUtil {
@Pc(36) int local36 = calendar.get(Calendar.HOUR_OF_DAY); @Pc(36) int local36 = calendar.get(Calendar.HOUR_OF_DAY);
@Pc(40) int local40 = calendar.get(Calendar.MINUTE); @Pc(40) int local40 = calendar.get(Calendar.MINUTE);
@Pc(44) int local44 = calendar.get(Calendar.SECOND); @Pc(44) int local44 = calendar.get(Calendar.SECOND);
return JagString.concatenate(new JagString[]{DAYS[local13 - 1], aClass100_461, JagString.parseInt(local17 / 10), JagString.parseInt(local17 % 10), aClass100_1089, MONTHS[local21], aClass100_1089, JagString.parseInt(local32), SPACE, JagString.parseInt(local36 / 10), JagString.parseInt(local36 % 10), COLON, JagString.parseInt(local40 / 10), JagString.parseInt(local40 % 10), COLON, JagString.parseInt(local44 / 10), JagString.parseInt(local44 % 10), TIMEZONE}); return JagString.concatenate(new JagString[]{DAYS[local13 - 1], JagString.aClass100_461, JagString.parseInt(local17 / 10), JagString.parseInt(local17 % 10), JagString.aClass100_1089, MONTHS[local21], JagString.aClass100_1089, JagString.parseInt(local32), JagString.SPACE, JagString.parseInt(local36 / 10), JagString.parseInt(local36 % 10), JagString.COLON, JagString.parseInt(local40 / 10), JagString.parseInt(local40 % 10), JagString.COLON, JagString.parseInt(local44 / 10), JagString.parseInt(local44 % 10), JagString.TIMEZONE});
} }
} }

View file

@ -75,7 +75,7 @@ public final class DisplayMode {
} }
@OriginalMember(owner = "client!pm", name = "a", descriptor = "(ZIZIZII)V") @OriginalMember(owner = "client!pm", name = "a", descriptor = "(ZIZIZII)V")
public static void setWindowMode(@OriginalArg(0) boolean arg0, @OriginalArg(1) int arg1, @OriginalArg(2) boolean arg2, @OriginalArg(3) int arg3, @OriginalArg(5) int arg4, @OriginalArg(6) int arg5) { public static void setWindowMode(@OriginalArg(0) boolean arg0, @OriginalArg(1) int arg1, @OriginalArg(2) boolean arg2, @OriginalArg(3) int mode, @OriginalArg(5) int arg4, @OriginalArg(6) int arg5) {
if (arg2) { if (arg2) {
GlRenderer.quit(); GlRenderer.quit();
} }
@ -92,7 +92,7 @@ public final class DisplayMode {
} }
} }
if (arg1 == 3 && GameShell.fullScreenFrame == null) { if (arg1 == 3 && GameShell.fullScreenFrame == null) {
setWindowMode(true, Preferences.favoriteWorlds, true, arg3, -1, -1); setWindowMode(true, Preferences.favoriteWorlds, true, mode, -1, -1);
return; return;
} }
@Pc(85) Container local85; @Pc(85) Container local85;
@ -146,7 +146,7 @@ public final class DisplayMode {
GameShell.canvas.setLocation(GameShell.leftMargin, GameShell.topMargin); GameShell.canvas.setLocation(GameShell.leftMargin, GameShell.topMargin);
} }
} }
if (arg1 == 0 && arg3 > 0) { if (arg1 == 0 && mode > 0) {
GlRenderer.createAndDestroyContext(GameShell.canvas); GlRenderer.createAndDestroyContext(GameShell.canvas);
} }
if (arg2 && arg1 > 0) { if (arg2 && arg1 > 0) {
@ -167,7 +167,7 @@ public final class DisplayMode {
} catch (@Pc(277) Exception local277) { } catch (@Pc(277) Exception local277) {
} }
GameShell.method2704(); GameShell.method2704();
if (arg3 == 0) { if (mode == 0) {
SoftwareRaster.frameBuffer = FrameBuffer.create(503, 765, GameShell.canvas); SoftwareRaster.frameBuffer = FrameBuffer.create(503, 765, GameShell.canvas);
} else { } else {
SoftwareRaster.frameBuffer = null; SoftwareRaster.frameBuffer = null;
@ -185,10 +185,10 @@ public final class DisplayMode {
} }
} }
if (!GlRenderer.enabled && arg1 > 0) { if (!GlRenderer.enabled && arg1 > 0) {
setWindowMode(true, 0, true, arg3, -1, -1); setWindowMode(true, 0, true, mode, -1, -1);
return; return;
} }
if (arg1 > 0 && arg3 == 0) { if (arg1 > 0 && mode == 0) {
GameShell.thread.setPriority(5); GameShell.thread.setPriority(5);
SoftwareRaster.frameBuffer = null; SoftwareRaster.frameBuffer = null;
SoftwareModel.method4580(); SoftwareModel.method4580();
@ -197,7 +197,7 @@ public final class DisplayMode {
Rasteriser.setBrightness(0.7F); Rasteriser.setBrightness(0.7F);
} }
LoginManager.method4637(); LoginManager.method4637();
} else if (arg1 == 0 && arg3 > 0) { } else if (arg1 == 0 && mode > 0) {
GameShell.thread.setPriority(1); GameShell.thread.setPriority(1);
SoftwareRaster.frameBuffer = FrameBuffer.create(503, 765, GameShell.canvas); SoftwareRaster.frameBuffer = FrameBuffer.create(503, 765, GameShell.canvas);
SoftwareModel.method4583(); SoftwareModel.method4583();

View file

@ -19,13 +19,39 @@ public final class JagString implements StringInterface {
@OriginalMember(owner = "client!pi", name = "Q", descriptor = "Lclient!na;") @OriginalMember(owner = "client!pi", name = "Q", descriptor = "Lclient!na;")
public static final JagString aClass100_853 = parse("null"); public static final JagString aClass100_853 = parse("null");
@OriginalMember(owner = "client!t", name = "C", descriptor = "Lclient!na;") @OriginalMember(owner = "client!t", name = "C", descriptor = "Lclient!na;")
public static final JagString aClass100_994 = parse(")3"); public static final JagString PERIOD = parse(")3");
@OriginalMember(owner = "client!vk", name = "a", descriptor = "[I") @OriginalMember(owner = "client!vk", name = "a", descriptor = "[I")
public static final int[] anIntArray471 = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 73, 74, 76, 78, 83, 84, 85, 86, 91, 92, 93, 94, 95, 97, 103, 104, 105, 106, 107, 108, 113, 114, 115, 116, 118, 119, 120, 121, 122, 123, 124, 125, 133, 134, 136, 138, 143, 144, 145, 146, 151, 152, 153, 154, 155, 157, 163, 164, 165, 166, 168, 169, 174, 175, 176, 177, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 97, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 157, 215, 216, 117, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 66, 66, 66, 66, 66, 66, 65, 75, 79, 79, 79, 79, 87, 87, 87, 87, 77, 96, 98, 98, 98, 98, 98, 250, 251, 109, 109, 109, 109, 117, 252, 167, 126, 126, 126, 126, 126, 126, 125, 135, 139, 139, 139, 139, 147, 147, 147, 147, 137, 156, 158, 158, 158, 158, 158, 253, 254, 170, 170, 170, 170, 178, 255, 178}; public static final int[] anIntArray471 = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 73, 74, 76, 78, 83, 84, 85, 86, 91, 92, 93, 94, 95, 97, 103, 104, 105, 106, 107, 108, 113, 114, 115, 116, 118, 119, 120, 121, 122, 123, 124, 125, 133, 134, 136, 138, 143, 144, 145, 146, 151, 152, 153, 154, 155, 157, 163, 164, 165, 166, 168, 169, 174, 175, 176, 177, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 97, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 157, 215, 216, 117, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 66, 66, 66, 66, 66, 66, 65, 75, 79, 79, 79, 79, 87, 87, 87, 87, 77, 96, 98, 98, 98, 98, 98, 250, 251, 109, 109, 109, 109, 117, 252, 167, 126, 126, 126, 126, 126, 126, 125, 135, 139, 139, 139, 139, 147, 147, 147, 147, 137, 156, 158, 158, 158, 158, 158, 253, 254, 170, 170, 170, 170, 178, 255, 178};
@OriginalMember(owner = "client!sh", name = "e", descriptor = "Lclient!na;") @OriginalMember(owner = "client!sh", name = "e", descriptor = "Lclient!na;")
public static final JagString aClass100_967 = parse(""); public static final JagString aClass100_967 = parse("");
@OriginalMember(owner = "client!dm", name = "n", descriptor = "Lclient!na;") @OriginalMember(owner = "client!dm", name = "n", descriptor = "Lclient!na;")
public static final JagString PERCENT_SIGN = parse("(U"); public static final JagString PERCENT_SIGN = parse("(U");
@OriginalMember(owner = "client!wa", name = "pb", descriptor = "Lclient!na;")
public static final JagString aClass100_556 = parse("<br>");
@OriginalMember(owner = "client!ed", name = "H", descriptor = "Lclient!na;")
public static final JagString aClass100_375 = parse("<)4col> x");
@OriginalMember(owner = "client!je", name = "db", descriptor = "Lclient!na;")
public static final JagString aClass100_589 = parse(" <col=ffffff>");
@OriginalMember(owner = "client!uf", name = "s", descriptor = "Lclient!na;")
public static final JagString aClass100_1043 = parse(" <col=00ff80>");
@OriginalMember(owner = "client!wj", name = "b", descriptor = "Lclient!na;")
public static final JagString aClass100_1101 = parse(" <col=ffff00>");
@OriginalMember(owner = "client!mi", name = "R", descriptor = "Lclient!na;")
public static final JagString aClass100_760 = parse(")1");
@OriginalMember(owner = "client!sj", name = "w", descriptor = "Lclient!na;")
public static final JagString aClass100_978 = parse("<)4col>");
@OriginalMember(owner = "client!jb", name = "c", descriptor = "Lclient!na;")
public static final JagString aClass100_583 = parse("(Y<)4col>");
@OriginalMember(owner = "client!fn", name = "Z", descriptor = "Lclient!na;")
public static final JagString aClass100_461 = parse(")1 ");
@OriginalMember(owner = "client!wb", name = "a", descriptor = "Lclient!na;")
public static final JagString aClass100_1089 = parse(")2");
@OriginalMember(owner = "client!dm", name = "j", descriptor = "Lclient!na;")
public static final JagString SPACE = parse(" ");
@OriginalMember(owner = "client!vh", name = "c", descriptor = "Lclient!na;")
public static final JagString COLON = parse(":");
@OriginalMember(owner = "client!ee", name = "a", descriptor = "Lclient!na;")
public static final JagString TIMEZONE = parse(" GMT");
@OriginalMember(owner = "client!li", name = "w", descriptor = "Lclient!sc;") @OriginalMember(owner = "client!li", name = "w", descriptor = "Lclient!sc;")
public static HashTable aClass133_13; public static HashTable aClass133_13;
@OriginalMember(owner = "client!na", name = "T", descriptor = "[B") @OriginalMember(owner = "client!na", name = "T", descriptor = "[B")
@ -203,7 +229,7 @@ public final class JagString implements StringInterface {
@OriginalMember(owner = "client!oi", name = "a", descriptor = "(II)Lclient!na;") @OriginalMember(owner = "client!oi", name = "a", descriptor = "(II)Lclient!na;")
public static JagString formatIp(@OriginalArg(0) int arg0) { public static JagString formatIp(@OriginalArg(0) int arg0) {
return concatenate(new JagString[]{parseInt(arg0 >> 24 & 0xFF), aClass100_994, parseInt(arg0 >> 16 & 0xFF), aClass100_994, parseInt(arg0 >> 8 & 0xFF), aClass100_994, parseInt(arg0 & 0xFF)}); return concatenate(new JagString[]{parseInt(arg0 >> 24 & 0xFF), PERIOD, parseInt(arg0 >> 16 & 0xFF), PERIOD, parseInt(arg0 >> 8 & 0xFF), PERIOD, parseInt(arg0 & 0xFF)});
} }
@OriginalMember(owner = "client!nb", name = "a", descriptor = "(II)Lclient!na;") @OriginalMember(owner = "client!nb", name = "a", descriptor = "(II)Lclient!na;")
@ -215,18 +241,21 @@ public final class JagString implements StringInterface {
return str; return str;
} }
/**
* @return A JagString consisting of the actual bytes in the provided string.
*/
@OriginalMember(owner = "client!sj", name = "a", descriptor = "(Ljava/lang/String;I)Lclient!na;") @OriginalMember(owner = "client!sj", name = "a", descriptor = "(Ljava/lang/String;I)Lclient!na;")
public static JagString method3952(@OriginalArg(0) String arg0) { public static JagString of(@OriginalArg(0) String string) {
@Pc(14) byte[] local14 = arg0.getBytes(StandardCharsets.ISO_8859_1); @Pc(14) byte[] bytes = string.getBytes(StandardCharsets.ISO_8859_1);
@Pc(23) JagString local23 = new JagString(); @Pc(23) JagString js = new JagString();
local23.chars = local14; js.chars = bytes;
local23.length = 0; js.length = 0;
for (@Pc(31) int local31 = 0; local31 < local14.length; local31++) { for (@Pc(31) int i = 0; i < bytes.length; i++) {
if (local14[local31] != 0) { if (bytes[i] != 0) {
local14[local23.length++] = local14[local31]; bytes[js.length++] = bytes[i];
} }
} }
return local23; return js;
} }
@OriginalMember(owner = "client!gn", name = "a", descriptor = "(BI)Lclient!na;") @OriginalMember(owner = "client!gn", name = "a", descriptor = "(BI)Lclient!na;")
@ -983,7 +1012,7 @@ public final class JagString implements StringInterface {
public final JagString fromParameters(@OriginalArg(1) Applet arg0) { public final JagString fromParameters(@OriginalArg(1) Applet arg0) {
@Pc(19) String local19 = new String(this.chars, 0, this.length); @Pc(19) String local19 = new String(this.chars, 0, this.length);
@Pc(23) String local23 = arg0.getParameter(local19); @Pc(23) String local23 = arg0.getParameter(local19);
return local23 == null ? null : method3952(local23); return local23 == null ? null : of(local23);
} }
@OriginalMember(owner = "client!na", name = "d", descriptor = "(Z)I") @OriginalMember(owner = "client!na", name = "d", descriptor = "(Z)I")

View file

@ -3,6 +3,7 @@ package rt4;
import org.openrs2.deob.annotation.OriginalArg; import org.openrs2.deob.annotation.OriginalArg;
import org.openrs2.deob.annotation.OriginalMember; import org.openrs2.deob.annotation.OriginalMember;
import org.openrs2.deob.annotation.Pc; import org.openrs2.deob.annotation.Pc;
import plugin.PluginRepository;
import java.io.IOException; import java.io.IOException;
import java.net.Socket; import java.net.Socket;
@ -690,6 +691,7 @@ public class LoginManager {
Protocol.verifyId = 0; Protocol.verifyId = 0;
VarpDomain.reset(); VarpDomain.reset();
InterfaceList.method1596(true); InterfaceList.method1596(true);
PluginRepository.OnLogout();
} }
@OriginalMember(owner = "client!k", name = "a", descriptor = "(IIIIZIZ)V") @OriginalMember(owner = "client!k", name = "a", descriptor = "(IIIIZIZ)V")

View file

@ -3,6 +3,7 @@ package rt4;
import org.openrs2.deob.annotation.OriginalArg; import org.openrs2.deob.annotation.OriginalArg;
import org.openrs2.deob.annotation.OriginalMember; import org.openrs2.deob.annotation.OriginalMember;
import org.openrs2.deob.annotation.Pc; import org.openrs2.deob.annotation.Pc;
import plugin.PluginRepository;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@ -967,7 +968,7 @@ public class Protocol {
} else if (opcode == ServerProt.MESSAGE_GAME) { } else if (opcode == ServerProt.MESSAGE_GAME) {
@Pc(245) JagString message = inboundBuffer.gjstr(); @Pc(245) JagString message = inboundBuffer.gjstr();
if (message.endsWith(TRADEREQ)) { if (message.endsWith(TRADEREQ)) {
JagString name = message.substring(message.indexOf(DateUtil.COLON), 0); JagString name = message.substring(message.indexOf(JagString.COLON), 0);
long name37 = name.encode37(); long name37 = name.encode37();
boolean ignored = false; boolean ignored = false;
for (int i = 0; i < IgnoreList.size; i++) { for (int i = 0; i < IgnoreList.size; i++) {
@ -980,7 +981,7 @@ public class Protocol {
Chat.add(name, 4, LocalizedText.TRADEREQ); Chat.add(name, 4, LocalizedText.TRADEREQ);
} }
} else if (message.endsWith(CHALREQ)) { } else if (message.endsWith(CHALREQ)) {
JagString name = message.substring(message.indexOf(DateUtil.COLON), 0); JagString name = message.substring(message.indexOf(JagString.COLON), 0);
long name37 = name.encode37(); long name37 = name.encode37();
boolean ignored = false; boolean ignored = false;
for (int i = 0; i < IgnoreList.size; i++) { for (int i = 0; i < IgnoreList.size; i++) {
@ -990,11 +991,11 @@ public class Protocol {
} }
} }
if (!ignored && Player.inTutorialIsland == 0) { if (!ignored && Player.inTutorialIsland == 0) {
JagString local506 = message.substring(message.length() - 9, message.indexOf(DateUtil.COLON) + 1); JagString local506 = message.substring(message.length() - 9, message.indexOf(JagString.COLON) + 1);
Chat.add(name, 8, local506); Chat.add(name, 8, local506);
} }
} else if (message.endsWith(ASSISTREQ)) { } else if (message.endsWith(ASSISTREQ)) {
JagString name = message.substring(message.indexOf(DateUtil.COLON), 0); JagString name = message.substring(message.indexOf(JagString.COLON), 0);
long name37 = name.encode37(); long name37 = name.encode37();
boolean ignored = false; boolean ignored = false;
for (int i = 0; i < IgnoreList.size; i++) { for (int i = 0; i < IgnoreList.size; i++) {
@ -1020,7 +1021,7 @@ public class Protocol {
Chat.add(JagString.EMPTY, 13, name); Chat.add(JagString.EMPTY, 13, name);
} }
} else if (message.endsWith(DUELSTAKE)) { } else if (message.endsWith(DUELSTAKE)) {
JagString name = message.substring(message.indexOf(DateUtil.COLON), 0); JagString name = message.substring(message.indexOf(JagString.COLON), 0);
long name37 = name.encode37(); long name37 = name.encode37();
boolean ignored = false; boolean ignored = false;
for (int i = 0; i < IgnoreList.size; i++) { for (int i = 0; i < IgnoreList.size; i++) {
@ -1033,7 +1034,7 @@ public class Protocol {
Chat.add(name, 14, JagString.EMPTY); Chat.add(name, 14, JagString.EMPTY);
} }
} else if (message.endsWith(DUELFRIEND)) { } else if (message.endsWith(DUELFRIEND)) {
JagString name = message.substring(message.indexOf(DateUtil.COLON), 0); JagString name = message.substring(message.indexOf(JagString.COLON), 0);
long name37 = name.encode37(); long name37 = name.encode37();
boolean ignored = false; boolean ignored = false;
for (int local277 = 0; local277 < IgnoreList.size; local277++) { for (int local277 = 0; local277 < IgnoreList.size; local277++) {
@ -1046,7 +1047,7 @@ public class Protocol {
Chat.add(name, 15, JagString.EMPTY); Chat.add(name, 15, JagString.EMPTY);
} }
} else if (message.endsWith(aClass100_916)) { } else if (message.endsWith(aClass100_916)) {
JagString name = message.substring(message.indexOf(DateUtil.COLON), 0); JagString name = message.substring(message.indexOf(JagString.COLON), 0);
long name37 = name.encode37(); long name37 = name.encode37();
boolean ignored = false; boolean ignored = false;
for (int i = 0; i < IgnoreList.size; i++) { for (int i = 0; i < IgnoreList.size; i++) {
@ -1059,7 +1060,7 @@ public class Protocol {
Chat.add(name, 16, JagString.EMPTY); Chat.add(name, 16, JagString.EMPTY);
} }
} else if (message.endsWith(aClass100_770)) { } else if (message.endsWith(aClass100_770)) {
JagString name = message.substring(message.indexOf(DateUtil.COLON), 0); JagString name = message.substring(message.indexOf(JagString.COLON), 0);
long name37 = name.encode37(); long name37 = name.encode37();
boolean ignored = false; boolean ignored = false;
for (int i = 0; i < IgnoreList.size; i++) { for (int i = 0; i < IgnoreList.size; i++) {
@ -1069,7 +1070,7 @@ public class Protocol {
} }
} }
if (!ignored && Player.inTutorialIsland == 0) { if (!ignored && Player.inTutorialIsland == 0) {
JagString local506 = message.substring(message.length() - 9, message.indexOf(DateUtil.COLON) + 1); JagString local506 = message.substring(message.length() - 9, message.indexOf(JagString.COLON) + 1);
Chat.add(name, 21, local506); Chat.add(name, 21, local506);
} }
} else { } else {
@ -1459,6 +1460,7 @@ public class Protocol {
PlayerSkillXpTable.baseLevels[skill] = i + 2; PlayerSkillXpTable.baseLevels[skill] = i + 2;
} }
} }
PluginRepository.OnXPUpdate(skill, xp);
PlayerSkillXpTable.updatedStats[PlayerSkillXpTable.updatedStatsWriterIndex++ & 0x1F] = skill; PlayerSkillXpTable.updatedStats[PlayerSkillXpTable.updatedStatsWriterIndex++ & 0x1F] = skill;
opcode = -1; opcode = -1;
return true; return true;

View file

@ -776,7 +776,7 @@ public final class client extends GameShell {
} else if (gameState == 30) { } else if (gameState == 30) {
LoginManager.method1841(); LoginManager.method1841();
} else if (gameState == 40) { } else if (gameState == 40) {
Fonts.drawTextOnScreen(false, JagString.concatenate(new JagString[]{LocalizedText.CONLOST, Cs1ScriptRunner.aClass100_556, LocalizedText.ATTEMPT_TO_REESTABLISH})); Fonts.drawTextOnScreen(false, JagString.concatenate(new JagString[]{LocalizedText.CONLOST, JagString.aClass100_556, LocalizedText.ATTEMPT_TO_REESTABLISH}));
} }
if (GlRenderer.enabled && gameState != 0) { if (GlRenderer.enabled && gameState != 0) {
GlRenderer.swapBuffers(); GlRenderer.swapBuffers();
@ -1020,7 +1020,7 @@ public final class client extends GameShell {
} }
mainLoadPrimaryText = LocalizedText.GAME0_LOADING; mainLoadPrimaryText = LocalizedText.GAME0_LOADING;
if (modeWhere != 0) { if (modeWhere != 0) {
Cheat.displayFps = true; //Cheat.displayFps = true;
} }
} }

View file

@ -1,5 +1,6 @@
plugins { plugins {
id 'java' id 'java'
id 'org.jetbrains.kotlin.jvm' version '1.4.10'
} }
version 'unspecified' version 'unspecified'
@ -15,6 +16,7 @@ dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
implementation(rootProject.project("client")) implementation(rootProject.project("client"))
compile 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10'
} }
test { test {
@ -63,4 +65,6 @@ task buildPlugins(type: Copy, dependsOn: classes) {
def pluginsPath = rootProject.project("client").projectDir.absolutePath + File.separator + "plugins" def pluginsPath = rootProject.project("client").projectDir.absolutePath + File.separator + "plugins"
from "build/classes/java/main" from "build/classes/java/main"
into pluginsPath into pluginsPath
from "build/classes/kotlin/main"
into pluginsPath
} }

View file

@ -8,7 +8,7 @@ import java.util.ArrayList;
import java.util.Date; import java.util.Date;
public class plugin extends Plugin { public class plugin extends Plugin {
boolean isEnabled; boolean isEnabled = false;
int MAX_VISIBLE_UPDATES = 5; int MAX_VISIBLE_UPDATES = 5;

View file

@ -0,0 +1,171 @@
package XPDropPlugin;
import plugin.Plugin
import plugin.api.*
import java.awt.Color
import kotlin.math.ceil
/**
* Displays some simple XP drops.
* @author Ceikry
*/
class plugin : Plugin() {
private val displayTimeout = 10000L // 10 seconds
private val drawStart = 175
private val drawPadding = 25
private val drawClear = 60
private val lastXp = IntArray(24)
private var totalXp = 0
private val activeGains = ArrayList<XPGain>()
private var lastGain = 0L
override fun Draw(deltaTime: Long) {
if (System.currentTimeMillis() - lastGain >= displayTimeout && activeGains.isEmpty())
return
drawTotalXPBox()
val removeList = ArrayList<XPGain>()
var posX = API.GetWindowDimensions().width / 2
if (API.GetWindowMode() == WindowMode.FIXED)
posX += 60
for(gain in activeGains) {
gain.currentPos -= ceil(deltaTime / 20.0).toInt()
if (gain.currentPos <= drawClear) {
removeList.add(gain)
totalXp += gain.xp
} else if (gain.currentPos <= drawStart){
val sprite = API.GetSprite(getSpriteArchive(gain.skill))
sprite?.render(posX - 25, gain.currentPos - 20)
API.DrawText(
FontType.SMALL,
FontColor.fromColor(Color.WHITE),
TextModifier.LEFT,
addCommas(gain.xp.toString()),
posX,
gain.currentPos
)
}
}
activeGains.removeAll(removeList.toSet())
}
override fun OnXPUpdate(skill: Int, xp: Int) {
if (xp == lastXp[skill]) return
val gain = xp - lastXp[skill]
if (gain <= 0) return
lastXp[skill] = xp
val currentTail = try {
activeGains.last().currentPos
} catch (e: Exception) {
drawStart - drawPadding
}
activeGains.add(XPGain(skill, gain, currentTail + drawPadding))
lastGain = System.currentTimeMillis()
}
override fun OnLogout() {
lastGain = 0L
for (i in 0 until 24) lastXp[i] = 0
totalXp = 0
activeGains.clear()
}
private fun drawTotalXPBox() {
var posX = API.GetWindowDimensions().width / 2
val posY = API.GetWindowDimensions().height / 4
if (API.GetWindowMode() == WindowMode.FIXED)
posX += 60
API.ClipRect(0, 0, posX * 2, posY * 4)
val horizontal = API.GetSprite(822)
val horizontalTop = API.GetSprite(820)
val tlCorner = API.GetSprite(824)
val blCorner = API.GetSprite(826)
val trCorner = API.GetSprite(825)
val brCorner = API.GetSprite(827)
val bg = API.GetSprite(657)
bg?.render(posX - 77, 10)
API.FillRect(posX - 75, 5, 140, 30, 0, 64)
blCorner?.render(posX - 77, 10)
tlCorner?.render(posX - 77, 5)
trCorner?.render(posX + 41, 5)
brCorner?.render(posX + 41, 10)
horizontalTop?.render(posX - 45, -8)
horizontal?.render(posX - 45, 22)
horizontalTop?.render(posX - 15, -8)
horizontal?.render(posX - 15, 22)
horizontalTop?.render(posX + 9, -8)
horizontal?.render(posX + 9, 22)
API.DrawText(
FontType.SMALL,
FontColor.fromColor(Color.WHITE),
TextModifier.LEFT,
"Total Xp: ${addCommas(totalXp.toString())}",
posX - 65,
28
)
}
data class XPGain(val skill: Int, val xp: Int, var currentPos: Int)
fun addCommas(num: String): String{
var newString = ""
if(num.length > 9){
return "Lots!"
}
var counter = 1
num.reversed().forEach {
if(counter % 3 == 0 && counter != num.length){
newString += "$it,"
} else {
newString += it
}
counter++
}
return newString.reversed()
}
fun getSpriteArchive(skillId: Int): Int{
return when(skillId) {
0 -> 197
1 -> 199
2 -> 198
3 -> 203
4 -> 200
5 -> 201
6 -> 202
7 -> 212
8 -> 214
9 -> 208
10 -> 211
11 -> 213
12 -> 207
13 -> 210
14 -> 209
15 -> 205
16 -> 204
17 -> 206
18 -> 216
19 -> 217
20 -> 215
21 -> 220
22 -> 221
23 -> 222
else -> 222
}
}
}

View file

@ -0,0 +1,3 @@
AUTHOR='Ceikry'
DESCRIPTION='Displays some pretty awesome XP drops :)'
VERSION=-1.1