Implement new compiling methods to work with current client system

* Use included scripts to update client from remote github repo
 * Hide patcher debug messages, only shows actually patched methods now
 * Add spotless support to openrsc client subproject (automatic when building)
    * this isn't required to pass pipeline right now
 * Add patcher automatic spotless apply (required for pipeline)
 * Remove create zip cache for now
 * update resource folder path
 * update cache sprites in assets
 * always replace our jar when compiling (for now)
       - our method of task (not copy specific task) does not respect MD5 hash checking, so we can't check versions here (yet)
 * Move resources for client into main/java/bot folder for easier access
 * always copyJar AFTER jar is finished running
 * update release to include cache and exclude run files
 * turn back on cache generation but include cache with main repo
 - this is more for a fall back if cache gets removed, and for server and world switching in the future!!!
 * include zipcache in the repo,
This commit is contained in:
Kaila_Btw committed 2024-01-03 21:45:51 -05:00
1 parent fd49f71b00
commit bfbb5aec94
50 files changed
+800 -294

No files matched your search

+6 -10
View File
@@ -60,18 +60,14 @@ tasks.named('jar') {
'Build-Jdk' : "${System.properties['java.version']}",
)
}
// FTBFS: Set duplicate handling strategy for module-info.class.
duplicatesStrategy(DuplicatesStrategy.EXCLUDE)
}
tasks.register('copyJar') {
// Final JAR
group 'build'
description 'copy app.jar to main dir'
inputs.file "${project(':app').getBuildDir()}/libs/app.jar"
outputs.file "Idlersc.jar"
description 'copy app.jar to main dir and rename to IdleRSC.jar'
dependsOn('build')
doLast {
copy {
@@ -81,19 +77,19 @@ tasks.register('copyJar') {
into '../'
}
}
//File appJar = new File(project(':app').getBuildDir(), "libs/${project(':app').getName()}.jar")
// from("${project(':app').getBuildDir()}/libs/app.jar")
// into "."
}
tasks.named('testClasses') {
finalizedBy('copyJar')
}
tasks.named('build') {
finalizedBy('copyJar')
}
// Add additional files to clean task
tasks.named('clean') {
delete 'src/main/resources'
delete '../IdleRSC.jar'
}
// Create resources before processResources runs
+1 -1
View File
@@ -18,7 +18,7 @@ final class AuthFrame extends JFrame {
private Color backgroundColor = Main.getColorCode(1, 0);
private Color textColor = Main.getColorCode(0, 0);
private boolean loadSettings = false;
private final String resourceLocation = "src/main/resources/";
private final String resourceLocation = "app/src/main/java/bot/res/";
private static final Dimension fieldSize = new Dimension(100, 25);
private final Window parent;
private JPasswordField password;
+24 -24
View File
@@ -18,7 +18,7 @@ public final class EntryFrame extends JFrame {
private static String account = "";
private final Choice accountChoice;
private String themeName = "RuneDark Theme";
private final String resourceLocation = "src/main/resources/";
private final String resourceLocation = "app/src/main/java/bot/res/";
private boolean okie = false;
// todo add theme select to cli
@@ -26,21 +26,6 @@ public final class EntryFrame extends JFrame {
return account;
}
private String getStringProperty(final String name, String propertyName) {
if (name == null || propertyName == null) {
System.out.println("Error accessing string property");
}
final Properties p = new Properties();
final File file = Paths.get("accounts").resolve(name + ".properties").toFile();
try (final FileInputStream stream = new FileInputStream(file)) {
p.load(stream);
return p.getProperty(propertyName, " ");
} catch (final Throwable t) {
System.out.println("Error loading account " + name + ": " + t);
}
return "";
}
private void loadAccounts() {
try {
final File dir = Paths.get("accounts").toFile();
@@ -75,14 +60,14 @@ public final class EntryFrame extends JFrame {
new ImageIcon(resourceLocation + "icons/welcome.icon.png")
.getImage()
.getScaledInstance(230, 30, java.awt.Image.SCALE_SMOOTH);
Image okImage =
new ImageIcon(resourceLocation + "icons/ok.icon.png")
.getImage()
.getScaledInstance(120, 26, java.awt.Image.SCALE_SMOOTH);
Image cancelImg =
new ImageIcon(resourceLocation + "icons/cancel2.icon.png")
.getImage()
.getScaledInstance(120, 26, java.awt.Image.SCALE_SMOOTH);
// Image okImage =
// new ImageIcon(resourceLocation + "icons/ok.icon.png")
// .getImage()
// .getScaledInstance(120, 26, java.awt.Image.SCALE_SMOOTH);
// Image cancelImg =
// new ImageIcon(resourceLocation + "icons/cancel2.icon.png")
// .getImage()
// .getScaledInstance(120, 26, java.awt.Image.SCALE_SMOOTH);
// ImageIcon icon = new ImageIcon("res/ui/present_edit.png"); // Christmas mode
// ImageIcon icon = new ImageIcon("res/ui/scales.png"); // Red
@@ -283,6 +268,21 @@ public final class EntryFrame extends JFrame {
dispose();
}
private String getStringProperty(final String name, String propertyName) {
if (name == null || propertyName == null) {
System.out.println("Error accessing string property");
}
final Properties p = new Properties();
final File file = Paths.get("accounts").resolve(name + ".properties").toFile();
try (final FileInputStream stream = new FileInputStream(file)) {
p.load(stream);
return p.getProperty(propertyName, " ");
} catch (final Throwable t) {
System.out.println("Error loading account " + name + ": " + t);
}
return "";
}
@Override
public void setVisible(final boolean visible) {
if (visible) {
+93 -86
View File
@@ -12,6 +12,8 @@ import compatibility.apos.Script;
import controller.Controller;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.MalformedURLException;
@@ -38,6 +40,7 @@ import orsc.OpenRSC;
import orsc.mudclient;
import reflector.Reflector;
import scripting.idlescript.IdleScript;
import utils.Extractor;
import utils.Version;
/**
@@ -263,7 +266,7 @@ public class Main {
}
config.absorb(parseResult);
// handleCache(config);
handleCache(config);
Reflector reflector = new Reflector(); // start up our reflector helper
OpenRSC client = reflector.createClient(); // start up our client jar
@@ -946,92 +949,96 @@ public class Main {
};
}
// /** Checks if the user has made a Cache/ folder. If not, spawns a wizard to create the folder.
// */
// private static void handleCache(Config config) {
// final int COLESLAW_PORT = 43599;
// final int URANIUM_PORT = 43601;
// // Does the directory exist?
// File cacheDirectory = new File("Cache/");
//
// if (cacheDirectory.exists()) return;
//
// // If --init-cache argument is used, bypass the GUI
// if (!config.getInitCache().isEmpty()) {
// if (config.getInitCache().equals("uranium")) {
// // Create Uranium cache
// createCache(URANIUM_PORT);
// return;
// } else if (config.getInitCache().equals("coleslaw")) {
// // Create Coleslaw cache
// createCache(COLESLAW_PORT);
// return;
// } else {
// System.out.println("Server (" + config.getInitCache() + ") is not known.");
// }
// }
//
// JFrame cacheFrame = new JFrame("Cache Setup");
// JLabel cacheLabel = new JLabel("First setup: you must select either Uranium or Coleslaw.");
// JButton uraniumButton = new JButton("Uranium (2018 RSC)");
// JButton coleslawButton = new JButton("Coleslaw (modified RSC, new content)");
//
// uraniumButton.addActionListener(
// e -> {
// // Create Uranium cache
// createCache(URANIUM_PORT);
// });
//
// coleslawButton.addActionListener(
// e -> {
// // Create Coleslaw cache
// createCache(COLESLAW_PORT);
// });
//
// cacheFrame.setLayout(new GridLayout(0, 1));
// cacheFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
// cacheFrame.add(cacheLabel);
// cacheFrame.add(uraniumButton);
// cacheFrame.add(coleslawButton);
//
// cacheFrame.pack();
// cacheFrame.setLocationRelativeTo(null);
// cacheFrame.setVisible(true);
// cacheFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//
// while (!cacheDirectory.exists()) {
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// cacheDirectory = new File("Cache/");
// }
// cacheFrame.setVisible(false);
// cacheFrame.dispose();
// }
/** Checks if the user has made a Cache/ folder. If not, spawns a wizard to create the folder. */
private static void handleCache(Config config) {
final int COLESLAW_PORT = 43599;
final int URANIUM_PORT = 43601;
// Does the directory exist?
File cacheDirectory = new File("Cache/");
// private static void createCache(int ServerPort) {
// // Create Cache directory
// File dir = new File("." + File.separator + "Cache");
// dir.mkdirs();
//
// // Copy embedded cache to cache directory
// try {
// Extractor.extractZipResource("/cache/ZipCache.zip", dir.toPath());
// } catch (IOException ignored) {
// System.out.print(ignored);
// }
//
// // Add port to client cache
// try {
// FileWriter portFile = new FileWriter("Cache/port.txt");
// portFile.write(Integer.toString(43599));
// portFile.close();
// } catch (IOException ignored) {
// System.out.print(ignored);
// }
// }
if (cacheDirectory.exists()) return;
// If --init-cache argument is used, bypass the GUI
if (!config.getInitCache().isEmpty()) {
if (config.getInitCache().equals("uranium")) {
// Create Uranium cache
createCache(URANIUM_PORT);
return;
} else if (config.getInitCache().equals("coleslaw")) {
// Create Coleslaw cache
createCache(COLESLAW_PORT);
return;
} else {
System.out.println("Server (" + config.getInitCache() + ") is not known.");
}
} else {
createCache(COLESLAW_PORT);
return;
}
JFrame cacheFrame = new JFrame("Cache Setup");
JLabel cacheLabel = new JLabel("First setup: you must select either Uranium or Coleslaw.");
JButton uraniumButton = new JButton("Uranium (2018 RSC)");
JButton coleslawButton = new JButton("Coleslaw (modified RSC, new content)");
uraniumButton.addActionListener(
e -> {
// Create Uranium cache
createCache(URANIUM_PORT);
});
coleslawButton.addActionListener(
e -> {
// Create Coleslaw cache
createCache(COLESLAW_PORT);
});
cacheFrame.setLayout(new GridLayout(0, 1));
cacheFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
cacheFrame.add(cacheLabel);
cacheFrame.add(uraniumButton);
cacheFrame.add(coleslawButton);
cacheFrame.pack();
cacheFrame.setLocationRelativeTo(null);
cacheFrame.setVisible(true);
cacheFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
while (!cacheDirectory.exists()) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
cacheDirectory = new File("Cache/");
}
cacheFrame.setVisible(false);
cacheFrame.dispose();
}
private static void createCache(int ServerPort) {
// Create Cache directory
File dir = new File("." + File.separator + "Cache");
dir.mkdirs();
// Copy embedded cache to cache directory
try {
Extractor.extractZipResource("/cache/ZipCache.zip", dir.toPath());
} catch (IOException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
// Add port to client cache
try {
FileWriter portFile = new FileWriter("Cache/port.txt");
portFile.write(Integer.toString(43599));
portFile.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
}
private static void copyDirectory(
String sourceDirectoryLocation, String destinationDirectoryLocation) {
File renamed without changes.
+53
View File
@@ -0,0 +1,53 @@
70a77a7b18554b81941b23e966b76561 ./config.txt
f900366006fb6f98b73a07c265694e53 ./OpenRSC.jar
4ee4ae8bf5c68343effce65d6697ed71 ./openrsc.apk
59f8d97492fdb1286018ec89b0755657 ./Open_RSC_Client_dev.jar
b8419160170a41ae01abab13a3b887df ./ip.txt
2bc77ee6aff6405a4233e55c87138d8c ./port.txt
e7db55346a3c9e1e2dc4156a5080e3e3 ./audio/spellfail.wav
a35f59926c22a2763a898509ac46ac05 ./audio/chisel.wav
e975b69136d8cea9eafd1f7dad2f6e92 ./audio/spellok.wav
1a6bd03dc01873ca5a2a3e51c6f13b12 ./audio/combat2b.wav
98395590acfc5a09ca6838d2c73846ca ./audio/foundgem.wav
3ba2c9d80d3876bbd53e03a16ad415bb ./audio/potato.wav
9c48528aa1856071bddd96f1ccf0280d ./audio/sounds.mem
4e5da6ef24f2f1d51d6cab1d38b40e17 ./audio/prayeroff.wav
67d5e5731f6fee2bd0825f1f886ac7b1 ./audio/recharge.wav
2987aa4c8fa1d396ace73b71eda3118d ./audio/closedoor.wav
9f266ba9ec03a5f6d25c27434b447e6d ./audio/retreat.wav
5eca4d35fc8ee3ea435560da0eca6c6d ./audio/anvil.wav
eeaafe253ccb7f566fc2d30c03915842 ./audio/cooking.wav
821a71555b8e0924784ad07b02e63582 ./audio/death.wav
6d8f9ccb2338ec9b5579da52cfd51195 ./audio/outofammo.wav
a2237aa906d418df12f801a67948710b ./audio/secretdoor.wav
19f3c3b2d2dc7d0a8bb190c2c4d1c8fd ./audio/prayeron.wav
e2721d63e3df7b55e081ee71c66e56c3 ./audio/underattack.wav
8f3b3864c52cf51814fdf0fa0b2b741b ./audio/advance.wav
bbe470bcd82a2e2dc605760d7d0ffaa5 ./audio/takeobject.wav
ef610914a731786b42bbce9bb622d3a0 ./audio/combat1b.wav
da1e22c96fb52e7f72dd0464e833b4d2 ./audio/filljug.wav
7b3039a8bd7120135d50679ea5d8f792 ./audio/combat3a.wav
652c31cb123c1a7260827294ebaa80ab ./audio/mine.wav
b88a5f4a16ed18b0665b459723fd2211 ./audio/dropobject.wav
06da45374b5113d1aea98a72c9699539 ./audio/combat1a.wav
6be1531321281f9099b3184f938f1715 ./audio/eat.wav
9fab30ff683e4933115549efcce1aa16 ./audio/shoot.wav
55ef3d424e79626e32748b9032ed48df ./audio/combat2a.wav
347fc00ecee0aad4a75909599fc4b21c ./audio/mix.wav
6fabaf1726a553115835427a7f3ae269 ./audio/victory.wav
7da40aec7309e78fdc338cc1ea809711 ./audio/opendoor.wav
5ffadf2eebd5da8e852351193455af02 ./audio/coins.wav
82e2da66cecbcf84002461ca47cdb37d ./audio/click.wav
532df52e741613540730be1ca109a424 ./audio/prospect.wav
3493216d321637c2c56237ce3c161ae9 ./audio/fish.wav
daa945fd3476cb088b7822ad44a000ac ./audio/mechanical.wav
2bdc3e524ce56419c10079f05b74786e ./audio/combat3b.wav
d41d8cd98f00b204e9800998ecf8427e ./uid.dat
3bbc851bd8a0aff7dc4a01ca327b30bc ./video/Authentic_Sprites.orsc
f868a8fb9266f219edd7f47ef0028a6b ./video/Custom_Landscape.orsc
1a8c3f966fc4259a6f3d6ff32cebd6a8 ./video/models.orsc
c95ded5d48c3a78c5a267e0301160367 ./video/spritepacks/Menus.osar
6cdb4549a7813f54a3473564a3231399 ./video/Authentic_Landscape.orsc
8ccf8b4697c432ccdcd84be3979b91b3 ./video/Custom_Sprites.osar
4445d7d9c1535a6f47a09ef33c02c15f ./video/library.orsc
8101c301d8ad141b92842f6a1e4d295c ./Open_RSC_Client.jar
Binary file not shown.
Binary file not shown.
+30
View File
@@ -0,0 +1,30 @@
## Cache
This contains all the models, sprites, landscapes, sounds required for the
Open RSC client. The cache can be refreshed when `make update-cache` is
invoked in the root of the repository.
It is found [here][1] in the core repository.
## Map
This can be considered the "walkability" of the entire Runescape game, and
features heavily in all of the path walker algorithms present in the bot
codebase.
In order to view the data, run `hexdump -C data`. A small snippet is shown
below:
```shell
002e7650 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 01 |................|
002e7660 01 01 01 01 00 01 00 01 01 01 01 01 01 01 01 01 |................|
002e7670 00 01 00 01 01 01 00 01 01 01 01 01 00 01 01 01 |................|
002e7680 01 00 01 01 00 00 00 01 01 01 01 01 01 01 01 00 |................|
002e7690 01 01 00 01 01 01 01 00 01 01 00 01 00 00 01 01 |................|
002e76a0 00 00 00 00 00 01 01 00 00 01 00 01 01 01 01 00 |................|
002e76b0 00 01 01 00 00 01 01 01 01 00 01 01 01 01 00 00 |................|
002e76c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
```
[0]: https://gitlab.com/open-runescape-classic/core
[1]: https://gitlab.com/open-runescape-classic/core/-/tree/develop/Client_Base/Cache
+1
View File
@@ -0,0 +1 @@
0
+1
View File
@@ -0,0 +1 @@
game.openrsc.com
+12
View File
@@ -0,0 +1,12 @@
#---open runescape classic launcher config---
preferred_client_preservation=winrune
preferred_client_openpk=openrsc
show_prerelease_servers=false
preferred_client_coleslaw=idlersc
preferred_client_2001scape=mudclient38
undecorated_window=true
preferred_client_cabbage=openrsc
show_bot_buttons=true
auto_update=false
first_run=false
preferred_client_uranium=winrune
+1
View File
@@ -0,0 +1 @@
43599
View File
Whitespace-only changes.
Binary file not shown.
+7 -10
View File
@@ -22,7 +22,7 @@ tasks.register('run', JavaExec) {
tasks.register('buildPatchedClient', JavaExec) {
group 'build'
description 'Create patched client jar archive.'
dependsOn ':client:build', ':patcher:build'
dependsOn ':client:build', ':patcher:build', ':patcher:spotlessApply'
File patcherJar = new File(project(':patcher').getBuildDir(), "libs/${project(':patcher').getName()}.jar")
File clientJar = new File(project(':client').getBuildDir(), "libs/${project(':client').getName()}.jar")
@@ -41,8 +41,9 @@ tasks.register('createClientCache', Zip) {
description 'Create client cache for inclusion in the jar archive.'
archiveFileName = 'ZipCache.zip'
destinationDirectory = project(':app').file('src/main/resources/cache/')
from 'assets/cache/'
from('assets/cache/')
include '**/*'
//Thread.sleep(300)
}
tasks.register('copyMapData', Copy) {
@@ -62,16 +63,12 @@ tasks.register('prepareRelease', Copy) {
rename 'app.jar', "${rootProject.name}.jar"
}
// documentation
// documentation and cache
from ("${rootProject.projectDir}") {
include 'doc/*'
include 'doc/'
include 'README.md', 'LICENSE'
exclude 'doc/run_*'
}
// run_* scripts
from ("${rootProject.projectDir}/doc") {
include 'run_*'
include 'accounts/username.properties'
include 'Cache/'
}
into "build/${releaseName()}"
+10
View File
@@ -1,12 +1,18 @@
plugins {
// Facilitates Java compilation
id 'java'
// For formatting source-code
// alias(libs.plugins.spotless)
// Ensure jars are reproducible
id 'reproducible-archives'
// Bundle all dependencies (a.k.a. create a fat jar)
id 'bundle-dependencies'
}
// Tasks not related to build are split out into their own gradle scripts
// in order to keep build.gradle as compact as possible.
//apply from: "$project.rootDir/spotless.gradle"
// Required for patcher, as the asm dependency is unable to automatically
// infer the bytecode version.
java {
@@ -23,6 +29,10 @@ dependencies {
implementation libs.discord.rpc
}
//tasks.named('build') {
// dependsOn(':client:spotlessApply')
//}
tasks.named('jar') {
// Define entry point for application
manifest {
@@ -51,7 +51,7 @@ public class EntityHandler {
public static NPCDef getNpcDef(int id) {
if (id < 0 || id >= npcs.size()) {
return null;
return npcs.get(825); //Default NPC is Ana (not in a barrel)
}
return npcs.get(id);
}
@@ -67,15 +67,16 @@ public class EntityHandler {
newId = (newId + 1) * -1;
noted = true;
}
if (id >= items.size()) {
return items.get(1544); //Default Item is Unobtanium
}
return findItem(newId, noted);
}
public static ItemDef getItemDef(int id, boolean isNote) {
if (id < 0) {
return null;
if (id < 0 || id >= items.size()) {
return items.get(1544); //Default Item is Unobtanium
}
return findItem(id, isNote);
}
@@ -174,7 +175,7 @@ public class EntityHandler {
if (objects.get(i).id == id)
return objects.get(i);
}
return null;
return objects.get(4); // Default Object is tree stump
}
return objects.get(id);
}
@@ -1288,7 +1289,11 @@ public class EntityHandler {
npcs.add(new NPCDef("Kortan", "He helps run the adventurers store", shopOption, 15, 22, 22, 6, false, sprites, 16761440, 2, 8409120, 15523536, 155, 230, 6, 6, 5, i++));
sprites = new int[]{0, 1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1};
npcs.add(new NPCDef("zoo keeper", "He looks after Ardougne city zoo", "", 20, 20, 20, 20, true, sprites, 16752704, 187, 187, 15523536, 160, 220, 6, 6, 5, i++));
sprites = new int[]{6, 1, 2, -1, 122, -1, 84, -1, -1, -1, -1, 68};
if (Config.S_PRIDE_MONTH) {
sprites = new int[]{6, 1, 2, -1, 122, -1, 84, -1, -1, -1, -1, 509};
} else {
sprites = new int[]{6, 1, 2, -1, 122, -1, 84, -1, -1, -1, -1, 68};
}
npcs.add(new NPCDef("Make over mage", "He can change how I look", "", 0, 0, 3, 0, false, sprites, 3158064, 16763952, 15609986, 13415270, 145, 220, 6, 6, 5, i++));
sprites = new int[]{0, 1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1};
npcs.add(new NPCDef("Bartender", "I could get a beer off him", "", 0, 0, 3, 0, false, sprites, 1, 8409120, 8409120, 15523536, 145, 220, 6, 6, 5, i++));
@@ -2250,12 +2255,12 @@ public class EntityHandler {
npcs.add(new NPCDef("Subscription Vendor", "Exchange your subscription token to subscription time", "", 0, 0, 3, 0, false, sprites, 16761440, 143190, 143190, 15523536, 145, 230, 6, 6, 5, i++));
sprites = new int[]{241, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
npcs.add(new NPCDef("Gaia", "The earth queen with a rotten heart", "", 78, 79, 79, 80, true, sprites, 0, 0, 0, 0, 275, 262, 11, 11, 30, i++));
sprites = new int[]{0, 318, 319, -1, -1, -1, -1, -1, -1, -1, -1, -1};
npcs.add(new NPCDef("Iron Man", "An Iron Man", "Armour", 0, 0, 0, 0, false, sprites, 6751590, 0, 14, 13415270, 145, 220, 6, 6, 5, i++));
sprites = new int[]{0, 321, 322, -1, -1, -1, -1, -1, -1, -1, -1, -1};
npcs.add(new NPCDef("Ultimate Iron Man", "An Ultimate Iron Man", "Armour", 0, 0, 0, 0, false, sprites, 11167296, 8, 14, 13415270, 145, 220, 6, 6, 5, i++));
sprites = new int[]{323, 324, 325, -1, -1, -1, -1, -1, -1, -1, -1, -1};
npcs.add(new NPCDef("Hardcore Iron Man", "A Hardcore Iron Man", "Armour", 0, 0, 0, 0, false, sprites, 11167296, 8, 14, 13415270, 145, 220, 6, 6, 5, i++));
sprites = new int[]{0, -1, -1, -1, -1, -1, 318, 319, -1, -1, -1, -1};
npcs.add(new NPCDef("Ironman", "An Ironman", "Armour", 0, 0, 0, 0, false, sprites, 6751590, 0, 14, 13415270, 145, 220, 6, 6, 5, i++));
sprites = new int[]{3, -1, -1, -1, -1, -1, 535, 538, -1, -1, -1, -1};
npcs.add(new NPCDef("Ultimate Ironman", "An Ultimate Ironman", "Armour", 0, 0, 0, 0, false, sprites, 11167296, 8, 14, 13415270, 145, 220, 6, 6, 5, i++));
sprites = new int[]{0, -1, -1, -1, -1, 323, 324, 325, -1, -1, -1, -1};
npcs.add(new NPCDef("Hardcore Ironman", "A Hardcore Ironman", "Armour", 0, 0, 0, 0, false, sprites, 11167296, 8, 14, 13415270, 145, 220, 6, 6, 5, i++));
sprites = new int[]{309, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
npcs.add(new NPCDef("Greatwood", "A scary hard slamming tree", "", 255, 245, 400, 300, true, sprites, 0, 0, 0, 0, 345, 410, 11, 11, 30, i++));
sprites = new int[]{6, 1, 2, -1, -1, 77, 76, 81, -1, -1, -1, -1};
@@ -2303,6 +2308,28 @@ public class EntityHandler {
npcs.add(new NPCDef("Kresh", "He's kind of like an onion", "", 123, 123, 123, 123, false, sprites, 0, 0xFFFFFF, 0x802415, 0xb5ff1d, 160, 220, 6, 6, 5, i++));
sprites = new int[]{3, 1, 2, -1, -1, -1, -1, -1, 46, -1, 10, 519};
npcs.add(new NPCDef("Lily", "She has a green thumb", "", 1, 1, 10, 1, false, sprites, 0xEEBB70, 0x006600, 0x663300, 15523536, 145, 220, 6, 6, 5, i++));
sprites = new int[]{5, 1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1};
npcs.add(new NPCDef("Peter Skippin", "Shut up, Meg", "", 20, 20, 20, 20, false, sprites, 11167296, 0xFFFFFF, 0x014E00, 15523536, 145, 220, 6, 6, 5, i++));
sprites = new int[]{0, -1, 2, -1, -1, -1, 531, -1, -1, -1, -1, -1};
npcs.add(new NPCDef("Mortimer", "A not-so-wealthy tradesman", "", 11, 8, 7, 11, false, sprites, 15921906, 2, 0x5C5C5C, 15523536, 145, 220, 6, 6, 5, i++));
sprites = new int[]{0, -1, 2, -1, -1, -1, 532, -1, -1, -1, -1, -1};
npcs.add(new NPCDef("Randolph", "A not-so-wealthy tradesman", "", 11, 8, 7, 11, false, sprites, 15921906, 2, 0x303030, 15523536, 145, 220, 6, 6, 5, i++));
sprites = new int[]{3, 1, 2, -1, -1, -1, 213, 214, -1, -1, -1, -1};
npcs.add(new NPCDef("Ana (not in a barrel)", "I should update my client.", "", 17, 15, 16, 18, false, sprites, 16760880, 8409120, 8409120, 10056486, 120, 220, 6, 6, 5, i++));
sprites = new int[]{533, 139, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
npcs.add(new NPCDef("Biggum Flodrot", "Biggum Flodrot, goblin hero", "", 99, 99, 99, 99, false, sprites, 0, 0, 0, 0, 219, 206, 9, 8, 5, i++));
sprites = new int[]{133, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
npcs.add(new NPCDef("Spookie", "A spooky, scary skeleton!", "", 0, 0, 10, 1, false, sprites, 0, 0, 0, 0, 216, 234, 11, 11, 5, i++));
npcs.add(new NPCDef("Scarie", "A spooky, scary skeleton!", "", 0, 0, 10, 1, false, sprites, 0, 0, 0, 0, 216, 234, 11, 11, 5, i++));
// head, shirt, pants, shield, weapon, hat, body, legs, gloves, boots, amulet, cape
sprites = new int[]{0, 1, 2, -1, 109, -1, -1, -1, -1, -1, -1, -1};
npcs.add(new NPCDef("Todd Sandyman", "Some of the children call him \"The White Ogre\"", "", 0, 0, 3, 0, false, sprites, 16753488, 0xFFFFFF, 0x663300, 15523536, 145, 220, 6, 6, 5, i++));
sprites = new int[]{137, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
npcs.add(new NPCDef("Praeteritum", "The ghost of Christmas past", "", 15, 15, 5, 15, false, sprites, 0, 0, 0, 0, 201, 243, 9, 9, 5, i++));
sprites = new int[]{137, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
npcs.add(new NPCDef("Praesens", "The ghost of Christmas present", "", 15, 15, 5, 15, false, sprites, 0, 0, 0, 0, 201, 243, 9, 9, 5, i++));
sprites = new int[]{137, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
npcs.add(new NPCDef("Futurum", "The ghost of Christmas future", "", 15, 15, 5, 15, false, sprites, 0, 0, 0, 0, 201, 243, 9, 9, 5, i++));
if (Config.S_WANT_CUSTOM_SPRITES) {
// Ranael
@@ -2601,11 +2628,11 @@ public class EntityHandler {
items.add(new ItemDef("arrow shafts", "I need to attach feathers to these", "", 1, 121, "items:121", true, false, 0, 0, true, false, false, 280));
items.add(new ItemDef("Woad Leaf", "slightly bluish leaves", "", 1, 122, "items:122", true, false, 0, 0, false, false, false, 281));
items.add(new ItemDef("Orangedye", "A little bottle of dye", "", 5, 104, "items:104", false, false, 0, 16755200, false, false, true, 282));
items.add(new ItemDef("Gold ring", "A valuable ring", "", 350, 123, "items:123", false, false, 0, 16763980, false, false, true, 283));
items.add(new ItemDef("Sapphire ring", "A valuable ring", "", 900, 123, "items:123", false, false, 0, 19711, false, false, true, 284));
items.add(new ItemDef("Emerald ring", "A valuable ring", "", 1275, 123, "items:123", false, false, 0, 3394611, false, false, true, 285));
items.add(new ItemDef("Ruby ring", "A valuable ring", "", 2025, 123, "items:123", false, false, 0, 16724736, false, false, true, 286));
items.add(new ItemDef("Diamond ring", "A valuable ring", "", 3525, 123, "items:123", false, false, 0, 0, false, false, true, 287));
items.add(new ItemDef("Gold ring", "A valuable ring", "", 350, 123, "items:123", false, Config.S_WANT_CUSTOM_SPRITES, Config.S_WANT_CUSTOM_SPRITES ? 1200 : 0, 16763980, false, false, true, 283));
items.add(new ItemDef("Sapphire ring", "A valuable ring", "", 900, 123, "items:123", false, Config.S_WANT_CUSTOM_SPRITES, Config.S_WANT_CUSTOM_SPRITES ? 1200 : 0, 19711, false, false, true, 284));
items.add(new ItemDef("Emerald ring", "A valuable ring", "", 1275, 123, "items:123", false, Config.S_WANT_CUSTOM_SPRITES, Config.S_WANT_CUSTOM_SPRITES ? 1200 : 0, 3394611, false, false, true, 285));
items.add(new ItemDef("Ruby ring", "A valuable ring", "", 2025, 123, "items:123", false, Config.S_WANT_CUSTOM_SPRITES, Config.S_WANT_CUSTOM_SPRITES ? 1200 : 0, 16724736, false, false, true, 286));
items.add(new ItemDef("Diamond ring", "A valuable ring", "", 3525, 123, "items:123", false, Config.S_WANT_CUSTOM_SPRITES, Config.S_WANT_CUSTOM_SPRITES ? 1200 : 0, 0, false, false, true, 287));
items.add(new ItemDef("Gold necklace", "I wonder if this is valuable", "", 450, 57, "items:57", false, true, 1024, 16763980, false, false, true, 288));
items.add(new ItemDef("Sapphire necklace", "I wonder if this is valuable", "", 1050, 57, "items:57", false, true, 1024, 19711, false, false, true, 289));
items.add(new ItemDef("Emerald necklace", "I wonder if this is valuable", "", 1425, 57, "items:57", false, true, 1024, 3394611, false, false, true, 290));
@@ -2861,7 +2888,7 @@ public class EntityHandler {
items.add(new ItemDef("magnet", "A very attractive magnet", "", 3, 184, "items:184", false, false, 0, 0, true, true, false, 540));
items.add(new ItemDef("Grey wolf fur", "This would make warm clothing", "", 50, 68, "items:68", false, false, 0, 15658734, true, false, true, 541));
items.add(new ItemDef("uncut dragonstone", "this would be worth more cut", "", 1000, 73, "items:73", false, false, 0, 12255487, true, false, true, 542));
items.add(new ItemDef("Dragonstone ring", "A valuable ring", "", 17625, 123, "items:123", false, false, 0, 12255487, true, false, true, 543));
items.add(new ItemDef("Dragonstone ring", "A valuable ring", "", 17625, 123, "items:123", false, Config.S_WANT_CUSTOM_SPRITES, Config.S_WANT_CUSTOM_SPRITES ? 1200 : 0, 12255487, true, false, true, 543));
items.add(new ItemDef("Dragonstone necklace", "I wonder if this is valuable", "", 18375, 57, "items:57", false, true, 1024, 12255487, true, false, true, 544));
items.add(new ItemDef("Raw Shark", "I should try cooking this", "", 300, 185, "items:185", false, false, 0, 5263488, true, false, true, 545));
items.add(new ItemDef("Shark", "I'd better be careful eating this!", "Eat", 300, 185, "items:185", false, false, 0, 11558912, true, false, true, 546));
@@ -3751,7 +3778,7 @@ public class EntityHandler {
items.add(new ItemDef("Ring of wealth", "An enchanted ring.", "", 17625, -1, "items:502", false, true, 1200, 12255487, true, false, true, 1318));
items.add(new ItemDef("Ring of avarice", "An enchanted ring.", "", 17625, -1, "items:503", false, true, 1200, 12255487, true, false, true, 1319));
items.add(new ItemDef("Dwarven ring", "An enchanted ring.", "Check,Break", 400, -1, "items:503", false, true, 1200, 16777124, true, false, true, 1320));
items.add(new ItemDef("Opal ring", "A valuable ring", "", 1050, -1, "items:123", false, false, 0, 16777124, false, false, true, 1321));
items.add(new ItemDef("Opal ring", "A valuable ring", "", 1050, -1, "items:123", false, Config.S_WANT_CUSTOM_SPRITES, Config.S_WANT_CUSTOM_SPRITES ? 1200 : 0, 16777124, false, false, true, 1321));
// Wolf masks
items.add(new ItemDef("White wolf mask", "Awoooo", "", 1, 86, "items:509", false, true, 32, 16777215, 16777215, false, false, true, 1322));
@@ -3892,7 +3919,7 @@ public class EntityHandler {
items.add(new ItemDef("Dragon Plate Mail Body", "Provides excellent protection", "", 5000000, -1, "items:498", false, true, 322, 0, false, false, true, 1427));
items.add(new ItemDef("Dragon Plate Mail Top", "Armour designed for females", "", 5000000, -1, "items:500", false, true, 322, 0, false, false, true, 1428));
items.add(new ItemDef("Dragon Plate Mail Legs", "These look pretty heavy", "", 5000000, -1, "items:499", false, true, 644, 0, false, false, true, 1429));
items.add(new ItemDef("Dragon Plated Skirt", "Designer leg protection", "", 5000000, -1, "items:88", false, true, 640, 16711748, false, false, true, 1430));
items.add(new ItemDef("Dragon Plated Skirt", "Designer leg protection", "", 5000000, -1, "items:88", false, true, 640, 0x960018, false, false, true, 1430));
items.add(new ItemDef("White CTF Flag", "White Capture the flag banner", "", 1, -1, "items:554", false, true, 16, 0, false, false, true, 1431));
items.add(new ItemDef("Guthix CTF Flag", "Guthix capture the flag banner", "", 1, -1, "items:554", false, true, 16, 4246592, false, false, true, 1432));
@@ -3997,7 +4024,7 @@ public class EntityHandler {
// Halloween 2022
items.add(new ItemDef("halloween mask", "aaaarrrghhh ... i'm a monster", "", 15, 284, "items:284", false, true, 32, 16711935, false, false, true, 1515));
items.add(new ItemDef("Cape of Inclusion", "A colourful cape made from many different pieces of cloth.", "", 3, -1, "items:pridecape", false, true, 2048, 0xFFFFFF, false, false, true, 1516));
items.add(new ItemDef("Cape of Inclusion", "A colourful cape made from many different pieces of cloth.", "", 3, -1, "items:pridecape", false, true, 2048, 0xFFFFFF, false, true, false, 1516));
items.add(new ItemDef("halloween mask", "aaaarrrghhh ... i'm a monster", "", 15, 284, "items:284", false, true, 32, 4, false, false, true, 1517));
// Rest of the skillcapes
@@ -4025,6 +4052,78 @@ public class EntityHandler {
items.add(new ItemDef("Rune Chain Mail Top", "A series of connected metal rings", "", 50000, -1, "items:595", false, true, 64, 65535, false, false, true, 1536));
items.add(new ItemDef("Dragon Scale Mail Top", "A dragon chain mail reinforced with dragon scales", "", 1500000, -1, "items:596", false, true, 64, 0x0000FF, true, false, true, 1537));
// Custom leather making
items.add(new ItemDef("Animal fat", "Thick and gelatinous", "", 0, -1, "items:animalfat", false, false, 0, 0, false, false, true, 1538));
items.add(new ItemDef("Treated hide", "I should use this on a fire to dry it", "", 1, -1, "items:treatedhide", false, false, 0, 0, false, false, true, 1539));
items.add(new ItemDef("lean bear meat", "I need to cook this first", "", 1, 60, "items:60", false, false, 0, 0xE57C2B, false, false, true, 1540));
items.add(new ItemDef("lean rat meat", "I need to cook this first", "", 1, 60, "items:60", false, false, 0, 0xE57C2B, false, false, true, 1541));
items.add(new ItemDef("lean beef", "I need to cook this first", "", 1, 60, "items:60", false, false, 0, 0xE57C2B, false, false, true, 1542));
items.add(new ItemDef("Rune stone certificate", "Each certificate exchangable at Varrock for 5 rune stone", "", 10, 180, "items:180", true, false, 0, 0, false, false, false, 1543));
items.add(new ItemDef("Unobtanium", "I should update my client.", "", 17, 70, "items:70", false, false, 0, 0xCC4CFF, false, false, true, 1544));
items.add(new ItemDef("Unobtanium", "I should update my client.", "", 17, 70, "items:70", true, false, 0, 0xCC4CFF, false, false, false, 1545));
items.add(new ItemDef("stat restoration Potion certificate", "Each certificate exchangable at Varrock for 5 stat restore potions", "", 10, 180, "items:180", true, false, 0, 0, false, false, false, 1546));
items.add(new ItemDef("giant carp certificate", "Each certificate exchangable at Varrock for 5 giant carp", "", 10, 180, "items:180", true, false, 0, 0, false, false, false, 1547));
items.add(new ItemDef("Lava eel certificate", "Each certificate exchangable at Varrock for 5 lava eels", "", 10, 180, "items:180", true, false, 0, 0, false, false, false, 1548));
items.add(new ItemDef("Poison antidote certificate", "Each certificate exchangable at Varrock for 5 poison antidote potions", "", 10, 180, "items:180", true, false, 0, 0, false, false, false, 1549));
items.add(new ItemDef("Manta ray certificate", "Each certificate exchangable at Varrock for 5 manta rays", "", 10, 180, "items:180", true, false, 0, 0, false, false, false, 1550));
items.add(new ItemDef("Sea turtle certificate", "Each certificate exchangable at Varrock for 5 sea turtles", "", 10, 180, "items:180", true, false, 0, 0, false, false, false, 1551));
items.add(new ItemDef("Cure poison Potion certificate", "Each certificate exchangable at Varrock for 5 cure poison potions", "", 10, 180, "items:180", true, false, 0, 0, false, false, false, 1552));
items.add(new ItemDef("Biggum Flodrot", "Biggum Flodrot, goblin hero", "Talk", 0, -1, "items:597", false, false, 0, 0, true, true, false, 1553));
// Ironman plate tops
items.add(new ItemDef("Ironman plate top", "Take it off and what are you?", "", 560, -1, "items:130", false, true, 322, 11189164, false, true, true, 1554));
items.add(new ItemDef("Ultimate ironman plate top", "Take it off and what are you?", "", 560, -1, "items:130", false, true, 322, 16768685, false, true, true, 1555));
items.add(new ItemDef("Hardcore ironman plate top", "Take it off and what are you?", "", 560, -1, "items:130", false, true, 322, 10027084, false, true, true, 1556));
// Ironman plated skirts
items.add(new ItemDef("Ironman plated skirt", "Take it off and what are you?", "", 280, -1, "items:88", false, true, 644, 0x6F7A70, false, true, true, 1557));
items.add(new ItemDef("Ultimate ironman plated skirt", "Take it off and what are you?", "", 280, -1, "items:88", false, true, 644, 0xA69070, false, true, true, 1558));
items.add(new ItemDef("Hardcore ironman plated skirt", "Take it off and what are you?", "", 280, -1, "items:88", false, true, 644, 0x640031, false, true, true, 1559));
// Halloween 2023
items.add(new ItemDef("Bonecrusher", "A contraption that crushes bones to dust", "", 0, -1, "items:598", false, false, 0, 0, false, true, false, 1560));
items.add(new ItemDef("Chipped pestle and mortar", "The apothecary's old pestle & mortar", "", 4, 147, "items:147", false, false, 0, 0, false, true, false, 1561));
items.add(new ItemDef("aluminium bar", "this looks malleable", "", 150, 79, "items:79", false, false, 0, 0xFFFFFF, false, true, true, 1562));
items.add(new ItemDef("aluminium cog", "A piece of machinery", "", 150, -1, "items:599", false, false, 0, 0, false, true, true, 1563));
items.add(new ItemDef("Wooden box", "A box made of wood", "", 25, -1, "items:600", false, false, 0, 0xFFFFFF, false, true, true, 1564));
items.add(new ItemDef("Ring of Skull", "Imbued with the powers of a bonafide skeleton", "", 0, -1, "items:601", false, true, 1200, 0, false, true, false, 1565));
items.add(new ItemDef("halloween mask", "aaaarrrghhh ... i'm a monster", "", 15, 284, "items:602", false, true, 32, 65280, false, false, true, 1566));
items.add(new ItemDef("Spookie's Bones", "Better do something about these", "", 1, 20, "items:20", false, false, 0, 0, false, true, true, 1567));
items.add(new ItemDef("Scarie's Bones", "Better do something about these", "", 1, 20, "items:20", false, false, 0, 0, false, true, true, 1568));
items.add(new ItemDef("Lily's Pumpkin", "A pumpkin harvested from Lily's field", "eat", 30, 149, "items:149", false, false, 0, 0, false, false, true, 1569));
items.add(new ItemDef("Uncooked Lily's pumpkin pie", "I need to cook this first", "", 1, 112, "items:603", false, false, 0, 16633518, false, false, true, 1570));
items.add(new ItemDef("Lily's pumpkin pie", "Mmm a pie made with Lily's pumpkins", "eat", 30, 112, "items:604", false, false, 0, 16633518, false, false, true, 1571));
items.add(new ItemDef("Half a Lily's pumpkin pie", "Mmm a pie made with Lily's pumpkins", "eat", 5, 113, "items:605", false, false, 0, 16633518, false, false, true, 1572));
// Christmas 2023
items.add(new ItemDef("Duke Horacio's Journal", "This is a journal not a diary", "read", 1, 28, "items:28", false, false, 0, 0xFF0000, false, true, false, 1573));
items.add(new ItemDef("parchment", "I can write on this", "write", 1, 244, "items:244", false, false, 0, 14540253, false, true, false, 1574));
items.add(new ItemDef("Apology letter", "A heartfelt apology letter", "read", 1, 244, "items:244", false, false, 0, 14540253, false, true, false, 1575));
items.add(new ItemDef("Christmas sweater", "Knitted with love!", "", 5, 87, "items:christmassweater", false, true, 64, 0x820101, false, true, false, 1576));
items.add(new ItemDef("Christmas sweater", "Knitted with love!", "", 5, 87, "items:christmassweater", false, true, 64, 0xc3c90e, false, true, false, 1577));
items.add(new ItemDef("Christmas sweater", "Knitted with love!", "", 5, 87, "items:christmassweater", false, true, 64, 0x012c82, false, true, false, 1578));
items.add(new ItemDef("Christmas sweater", "Knitted with love!", "", 5, 87, "items:christmassweater", false, true, 64, 0x6804b5, false, true, false, 1579));
items.add(new ItemDef("Christmas sweater", "Knitted with love!", "", 5, 87, "items:christmassweater", false, true, 64, 0xcf7602, false, true, false, 1580));
items.add(new ItemDef("Christmas sweater", "Knitted with love!", "", 5, 87, "items:christmassweater", false, true, 64, 0x106105, false, true, false, 1581));
items.add(new ItemDef("Party Hat", "Party!!!", "", 2, 189, "items:189", false, true, 32, 1, false, false, true, 1582));
items.add(new ItemDef("Santa's hat", "It's a santa claus' hat", "", 160, -1, "items:pinksantahat", false, true, 32, 0, false, false, true, 1583));
items.add(new ItemDef("Christmas sweater", "Knitted with love!", "", 5, 87, "items:christmassweater", false, true, 64, 0x820101, false, true, false, 1584));
items.add(new ItemDef("Christmas sweater", "Knitted with love!", "", 5, 87, "items:christmassweater", false, true, 64, 0xc3c90e, false, true, false, 1585));
items.add(new ItemDef("Christmas sweater", "Knitted with love!", "", 5, 87, "items:christmassweater", false, true, 64, 0x012c82, false, true, false, 1586));
items.add(new ItemDef("Christmas sweater", "Knitted with love!", "", 5, 87, "items:christmassweater", false, true, 64, 0x6804b5, false, true, false, 1587));
items.add(new ItemDef("Christmas sweater", "Knitted with love!", "", 5, 87, "items:christmassweater", false, true, 64, 0xcf7602, false, true, false, 1588));
items.add(new ItemDef("Christmas sweater", "Knitted with love!", "", 5, 87, "items:christmassweater", false, true, 64, 0x106105, false, true, false, 1589));
// Custom certificate names
if (Config.S_WANT_BANK_NOTES && !Config.S_WANT_CERT_AS_NOTES) {
for (int i : new int[]{1543, 1546, 1547, 1548, 1549, 1550, 1551, 1552}) {
items.get(i).name = items.get(i).getName() + " (market)";
}
}
// Add muddy herb sprite
items.get(165).spriteLocation = "items:588";
@@ -4720,6 +4819,39 @@ public class EntityHandler {
animations.add(new AnimationDef("fchainmail", "equipment", 65535, 0, true, false, 0));//528 rune
animations.add(new AnimationDef("fchainmail", "equipment", 3158064, 0, true, false, 0));//529 black
animations.add(new AnimationDef("fdragonscalemail", "equipment", 0, 0, true, false, 0));//530
animations.add(new AnimationDef("mortimertorso", "equipment", 0, 0, true, false, 0));//531
animations.add(new AnimationDef("randolphtorso", "equipment", 0, 0, true, false, 0));//532
animations.add(new AnimationDef("biggum", "npc", 0xFFFFFF, 0, true, false, 0));//533
// Ironman plate tops
animations.add(new AnimationDef("fplatemailtop", "equipment", 11189164, 0, true, false, 0)); //534 - ironman plate top
animations.add(new AnimationDef("fplatemailtop", "equipment", 16768685, 0, true, false, 0)); //535 - ultimate ironman plate top
animations.add(new AnimationDef("fplatemailtop", "equipment", 10027084, 0, true, false, 0)); //536 - hc ironman plate top
// Ironman plated skirts
animations.add(new AnimationDef("armorskirt", "equipment", 11189164, 0, true, false, 0));//537 - ironman plated skirt
animations.add(new AnimationDef("armorskirt", "equipment", 16768685, 0, true, false, 0));//538 - ultimate ironman palted skirt
animations.add(new AnimationDef("armorskirt", "equipment", 10027084, 0, true, false, 0));//539 - hc ironman plated skirt
// Halloween 2023
animations.add(new AnimationDef("halloweenmask_pink", "equipment", 0, 0, true, false, 0));//540 - pink halloween mask
animations.add(new AnimationDef("skeletonmorph", "npc", 16777215, 0, true, false, 0));//541
// Christmas 2023
animations.add(new AnimationDef("christmassweater", "equipment", 0x820101, 0, true, false, 0));//542 - red
animations.add(new AnimationDef("christmassweater", "equipment", 0xc3c90e, 0, true, false, 0));//543 - yellow
animations.add(new AnimationDef("christmassweater", "equipment", 0x012c82, 0, true, false, 0));//544 - blue
animations.add(new AnimationDef("christmassweater", "equipment", 0x6804b5, 0, true, false, 0));//545 - purple
animations.add(new AnimationDef("christmassweater", "equipment", 0xcf7602, 0, true, false, 0));//546 - orange
animations.add(new AnimationDef("christmassweater", "equipment", 0x106105, 0, true, false, 0));//547 - green
animations.add(new AnimationDef("partyhat", "equipment", 0x1a1a1a, 0, true, false, 0));//548 - black party hat
animations.add(new AnimationDef("pinksantahat", "equipment", 0, 0, true, false, 0));//549 - pink santa hat
animations.add(new AnimationDef("fchristmassweater", "equipment", 0x820101, 0, true, false, 0));//550 - red
animations.add(new AnimationDef("fchristmassweater", "equipment", 0xc3c90e, 0, true, false, 0));//551 - yellow
animations.add(new AnimationDef("fchristmassweater", "equipment", 0x012c82, 0, true, false, 0));//552 - blue
animations.add(new AnimationDef("fchristmassweater", "equipment", 0x6804b5, 0, true, false, 0));//553 - purple
animations.add(new AnimationDef("fchristmassweater", "equipment", 0xcf7602, 0, true, false, 0));//554 - orange
animations.add(new AnimationDef("fchristmassweater", "equipment", 0x106105, 0, true, false, 0));//555 - green
}
}
@@ -6666,7 +6798,7 @@ public class EntityHandler {
objects.add(new GameObjectDef("Boulder", "A large boulder blocking the way", "WalkTo", "Smash to pieces", 1, 2, 2, 0, "cave bolder", i++));
objects.add(new GameObjectDef("Damaged Earth", "Disturbed earth - it will heal itself in time", "WalkTo", "Examine", 0, 1, 1, 0, "dugupsoil1", i++));
objects.add(new GameObjectDef("Ladder", "it's a ladder leading upwards", "Climb-Up", "Examine", 1, 1, 1, 0, "ladder", i++));
objects.add(new GameObjectDef("Ladder", "it's a ladder leading downwards", "Climb-Down", "Examine", 1, 1, 1, 0, "ladderdown", i++));
objects.add(new GameObjectDef("Ladder", "it's a ladder leading downwards", "Climb-Down", "Examine", 1, 1, 1, 0, "ladderdown", i++)); //1188
objects.add(new GameObjectDef("Vine", "A creepy creeper", "Grab", "Examine", 0, 1, 1, 0, "vinejunction", i++));
//Runecraft Objects
@@ -6761,7 +6893,7 @@ public class EntityHandler {
objects.add(new GameObjectDef("Depleted corn plant", "A plant that got its produce taken away", "WalkTo", "Examine", 0, 1, 1, 0, "depletedcorn", ++i));
objects.add(new GameObjectDef("Snape Grass", "Some interesting snape grass growing here", "Clip", "Examine", 1, 1, 1, 0, "snapegrass", ++i));
objects.add(new GameObjectDef("Herb", "I wonder what herb is around", "Clip", "Examine", 1, 1, 1, 0, "herb", ++i));
objects.add(new GameObjectDef("Pumpkin", "A pumpkin of autumn", "Collect", "Examine", 0, 1, 1, 0, "pumpkin", ++i));
objects.add(new GameObjectDef("Pumpkin", "A pumpkin of autumn", "Harvest", "Examine", 0, 1, 1, 0, "pumpkin", ++i));
objects.add(new GameObjectDef("Soil Mound", "A pile of very good soil", "WalkTo", "Examine", 1, 1, 1, 0, "soilmound", ++i));
objects.add(new GameObjectDef("Barrel of water", "A barrel filled with filtered water", "WalkTo", "Examine", 1, 1, 1, 0, "barrelwater", ++i));
objects.add(new GameObjectDef("Compost Bin", "A bin of compost", "Open", "Examine", 1, 1, 1, 0, "compostbin", ++i));
@@ -38,7 +38,6 @@ public final class AuctionHouse {
private boolean visible = false;
private int selectedFilter;
private String[] resources = {"log", "bones", "pickaxe", "dough"};
private int orderingBy = 0;
private Comparator<AuctionItem> auctionComparator = (o1, o2) -> {
if (orderingBy == 0) { /* price down */
@@ -668,41 +667,49 @@ public final class AuctionHouse {
continue;
} else if (selectedFilter == 2 && ((24 & def.wearableID) != 0 || !def.isWieldable()) && !itemName.contains("shield")) {
continue;
} else if (selectedFilter == 3) {
} else if (selectedFilter == 3) { // Consumable
commandFilter = new String[]{"drink", "eat"};
nameFilter = new String[]{"raw"};
} else if (selectedFilter == 4) {
nameFilter = new String[]{"-rune", "arrow", "bolt"};
} else if (selectedFilter == 5) {
nameFilter = new String[]{"uncut", "sapphire", "emerald", "ruby", "diamond", "dragonstone"};
} else if (selectedFilter == 4) { // Projectile
nameFilter = new String[]{"-rune", "arrow", "bolt", "rune stone"};
} else if (selectedFilter == 5) { // Jewelry
nameFilter = new String[]{"uncut", "sapphire", "emerald", "ruby", "diamond", "dragonstone", "crown"};
exactNameFilter = new String[]{"opal", "jade", "amulet of accuracy", "gold amulet", "brass necklace",
"gold necklace", "holy symbol of saradomin", "unblessed holy symbol", "ring of wealth",
"ring of avarice", "ring of recoil", "ring of forging", "ring of splendor", "dwarven ring"};
} else if (selectedFilter == 6) {
"ring of avarice", "ring of recoil", "ring of forging", "ring of splendor",
"dwarven ring", "ring of life"};
} else if (selectedFilter == 6) { // Ore and Bar
nameFilter = new String[]{" ore", "coal", "bar", "clay"};
exactNameFilter = new String[]{"gold", "silver", "silver certificate", "gold certificate"};
} else if (selectedFilter == 7) {
} else if (selectedFilter == 7) { // Herblaw
commandFilter = new String[]{"identify"};
nameFilter = new String[]{"unfinished", "vial", "weed", "ground", "root", "scale"};
exactNameFilter = new String[]{"Guam Leaf", "Marrentill", "Tarromin", "Harralander", "Irit leaf",
"Avantoe", "Kwuarm", "Cadantine", "Torstol", "Pestle and mortar", "Eye of newt", "Jangerberries",
"Red spiders eggs", "White berries", "Snape grass", "Wine of zamorak"};
} else if (selectedFilter == 8) {
nameFilter = new String[]{"halloween", "bunny", "party", "pumpkin", "easter", "scythe", "cracker"};
exactNameFilter = new String[]{"Disc of returning", "santa's hat"};
nameFilter = new String[]{"unfinished", "vial", "weed", "ground", "root", "wine of",
"dragonfruit", "coconut"};
exactNameFilter = new String[]{"guam Leaf", "marrentill", "tarromin", "harralander", "irit leaf",
"avantoe", "kwuarm", "cadantine", "torstol", "pestle and mortar", "eye of newt", "jangerberries",
"red spiders eggs", "white berries", "snape grass", "blue dragon scale", "fish oil",
"unicorn horn", "grapes"};
} else if (selectedFilter == 8) { // Rare
nameFilter = new String[]{"halloween", "christmas", "bunny", "party", "easter", "scythe", "cracker",
"santa's", "mask", "antlers"};
exactNameFilter = new String[]{"disc of returning", "pumpkin", "present", "rubber chicken cap",
"half full wine jug", "rune spear", "star cookie", "cane cookie", "glass of milk", "tree cookie"};
}
if (selectedFilter == 9) {
nameFilter = resources;
if (selectedFilter == 9) { // Misc
nameFilter = new String[]{"log", "bones", "pickaxe", "dough", "bead", "key", "mould",
"hatchet", "watering can"};
exactNameFilter = new String[]{
"fur", "leather", "wool", "bow string", "flax", "cow hide",
"knife", "egg", "bucket", "milk", "flour", "skull", "grain",
"needle", "thread", "holy", "water", "cadavaberries",
"pot", "jug", "grapes", "shears", "tinderbox",
"pot", "bowl", "pie dish", "jug", "grapes", "shears", "tinderbox",
"chisel", "hammer", "ashes", "apron", "chef's hat", "skirt", "silk",
"flier", "garlic", "redberries", "rope", "bad wine", "cape",
"flier", "garlic", "redberries", "rope", "bad wine", "cape", "mixing bowl",
"eye of newt", "lobster pot", "net", "fishing rod", "fly fishing rod", "harpoon",
"fishing bait", "feather"
};
"fishing bait", "feather", "hand shovel", "herb clippers", "fruit picker",
"redberry pie", "broken shield", "king black dragon scale", "chipped dragon scale",
"dragon metal chain", "bronze axe", "iron axe", "steel axe", "black axe", "mithril axe",
"adamantite axe", "rune axe" };
}
boolean skip = true;
@@ -45,6 +45,7 @@ public final class CustomBankInterface extends BankInterface {
private int x, y;
private int[] bankItemSelector = {0, 0, 40, 80, 120, 160, 200};
private BankTabShow bankTabShow = BankTabShow.FIRST_ITEM_IN_TAB;
private long totalWealth;
public CustomBankInterface(mudclient mc) {
super(mc);
@@ -107,7 +108,8 @@ public final class CustomBankInterface extends BankInterface {
mc.getSurface().drawBoxAlpha(x, y + 21, width, 309, colour, 160);
mc.getSurface().drawBoxBorder(x, width, y, 331, 0x000000);
drawString("The Bank of " + Config.SERVER_NAME, x + 196, y + 15, 1, 0xFFFFFF);
int wealthLength = String.valueOf(totalWealth).length();
drawString("Total wealth: " + this.totalWealth + " gp", x + (196 - (4 * wealthLength)), y + 15, 1, 0xFFFF00);
int j3 = 0xFFFFFF;
if (mc.getMouseX() > x + 415 && mc.getMouseY() >= y && mc.getMouseX() < x + width && mc.getMouseY() < y + 12 + 9) {
@@ -1425,6 +1427,26 @@ public final class CustomBankInterface extends BankInterface {
}
}
/**
* Calculate the value of the player's tradeable items
*/
public void calculateWealth() {
long totalWealth = 0;
for (BankItem item : bankItems) {
// Get the item's definition
ItemDef itemDef = item.getItem().getItemDef();
int amount = item.getItem().getAmount();
if (itemDef == null) continue;
if (!itemDef.untradeable) {
totalWealth += (itemDef.getBasePrice() * amount);
}
}
this.totalWealth = totalWealth;
}
public static class Preset {
public Item[] inventory;
public Item[] equipment;
@@ -10,7 +10,7 @@ public final class ExperienceConfigInterface {
public Panel experienceConfig;
public int experienceConfigScroll;
public boolean selectSkillMenu = false;
int width = 350, height = 195;
int width = 350, height = 225;
private boolean visible = false;
private mudclient mc;
private int panelColour, textColour, bordColour, lineColour;
@@ -143,29 +143,41 @@ public final class ExperienceConfigInterface {
Config.C_EXPERIENCE_COUNTER_COLOR = 4;
}
});
this.drawButton(x + 145, y + 135, 50, 20, "@pin@Pink", 2, Config.C_EXPERIENCE_COUNTER_COLOR == 5 ? true : false, new ButtonHandler() {
@Override
void handle() {
Config.C_EXPERIENCE_COUNTER_COLOR = 5;
}
});
this.drawButton(x + 205, y + 135, 50, 20, "@mag@Magenta", 2, Config.C_EXPERIENCE_COUNTER_COLOR == 6 ? true : false, new ButtonHandler() {
@Override
void handle() {
Config.C_EXPERIENCE_COUNTER_COLOR = 6;
}
});
this.drawString("Speed: ", x + 10, y + 150, 3, textColour);
this.drawButton(x + 105, y + 135, 50, 20, "Slow", 2, Config.C_EXPERIENCE_DROP_SPEED == 0 ? true : false, new ButtonHandler() {
this.drawString("Speed: ", x + 10, y + 180, 3, textColour);
this.drawButton(x + 105, y + 165, 50, 20, "Slow", 2, Config.C_EXPERIENCE_DROP_SPEED == 0 ? true : false, new ButtonHandler() {
@Override
void handle() {
Config.C_EXPERIENCE_DROP_SPEED = 0;
}
});
this.drawButton(x + 175, y + 135, 50, 20, "Medium", 2, Config.C_EXPERIENCE_DROP_SPEED == 1 ? true : false, new ButtonHandler() {
this.drawButton(x + 175, y + 165, 50, 20, "Medium", 2, Config.C_EXPERIENCE_DROP_SPEED == 1 ? true : false, new ButtonHandler() {
@Override
void handle() {
Config.C_EXPERIENCE_DROP_SPEED = 1;
}
});
this.drawButton(x + 245, y + 135, 50, 20, "Fast", 2, Config.C_EXPERIENCE_DROP_SPEED == 2 ? true : false, new ButtonHandler() {
this.drawButton(x + 245, y + 165, 50, 20, "Fast", 2, Config.C_EXPERIENCE_DROP_SPEED == 2 ? true : false, new ButtonHandler() {
@Override
void handle() {
Config.C_EXPERIENCE_DROP_SPEED = 2;
}
});
this.drawString("Controls: ", x + 10, y + 180, 3, textColour);
this.drawButton(x + 135, y + 165, 50, 20, "Reset", 2, false, new ButtonHandler() {
this.drawString("Controls: ", x + 10, y + 210, 3, textColour);
this.drawButton(x + 135, y + 195, 50, 20, "Reset", 2, false, new ButtonHandler() {
@Override
void handle() {
long time = System.currentTimeMillis();
@@ -182,7 +194,7 @@ public final class ExperienceConfigInterface {
}
});
this.drawButton(x + 200, y + 165, 60, 20, "Submenu", 2, Config.C_EXPERIENCE_CONFIG_SUBMENU, new ButtonHandler() {
this.drawButton(x + 200, y + 195, 60, 20, "Submenu", 2, Config.C_EXPERIENCE_CONFIG_SUBMENU, new ButtonHandler() {
@Override
void handle() {
Config.C_EXPERIENCE_CONFIG_SUBMENU = Config.C_EXPERIENCE_CONFIG_SUBMENU == false ? true : false;
@@ -15,19 +15,19 @@ public final class IronManInterface {
private boolean deactivationMenu = false;
private boolean visible;
private mudclient mc;
private String[] ironManTitle = {"Standard Iron Man", "Hardcore Iron Man", "Ultimate Iron Man", "None"};
private String[] ironManTitle = {"Standard Ironman", "Hardcore Ironman", "Ultimate Ironman", "None"};
private String[] ironManDescription =
{
"An Iron Man cannot trade, stake, receive PK loot, scavenge dropped items, nor play certain multiplayer minigames.",
"In addition to the standard Iron Man rules, a Hardcore Iron Man only has 1 life. A dangerous death will result in being downgraded to a standard Iron Man.",
"In addition to the standard Iron Man rules, an Ultimate Iron Man cannot use banks, nor retain any items on death in dangerous areas.",
"- No Iron Man restrictions will apply to this account."
"An Ironman cannot trade, stake, receive PK loot, scavenge dropped items, nor play certain multiplayer minigames.",
"In addition to the standard Ironman rules, a Hardcore Ironman only has 1 life. A dangerous death will result in being downgraded to a standard Ironman.",
"In addition to the standard Ironman rules, an Ultimate Ironman cannot use banks, nor retain any items on death in dangerous areas.",
"- No Ironman restrictions will apply to this account."
};
private String[] restrictionTitle = {"PIN", "Permanent"};
private String[] restrictionDesc =
{
"You must enter your Bank Pin to request that Iron Man restrictions be removed.",
"- The Iron Man restrictions can never be removed."
"You must enter your Bank Pin to request that Ironman restrictions be removed.",
"- The Ironman restrictions can never be removed."
};
private int[] order = {3, 0, 2, 1};
private int[] selectMode = {1, 3, 2, 0};
@@ -78,14 +78,14 @@ public final class IronManInterface {
graphics.drawBoxAlpha(x, y, width, height, 0x483E33, 255);
graphics.drawLineHoriz(x, y + 24, width, 0x2A2926);
graphics.drawBoxBorder(x, width, y, height, 0x2A2926);
graphics.drawColoredStringCentered(mc.getGameWidth() / 2, "Iron Man Setup", 0xFF981F, 0, 3, y + 17);
graphics.drawColoredStringCentered(mc.getGameWidth() / 2, "Ironman Setup", 0xFF981F, 0, 3, y + 17);
//content box
graphics.drawBoxAlpha(x + 5, y + 29, 380, 185, 0x534A3F, 255);
graphics.drawBoxBorder(x + 5, 380, y + 29, 185, 0x777775);
graphics.drawLineHoriz(x + 5, y + 48, 380, 0x777775);
graphics.drawLineHoriz(x + 5, y + 49, 380, 0x777775);
graphics.drawColoredStringCentered(mc.getGameWidth() / 2 - 46, "Iron Man Mode", 0xFFFFFF, 0, 2, y + 43);
graphics.drawColoredStringCentered(mc.getGameWidth() / 2 - 46, "Ironman Mode", 0xFFFFFF, 0, 2, y + 43);
//deactivation box
@@ -163,7 +163,7 @@ public final class IronManInterface {
}
}
drawClickBox(graphics, drawBoxX + 5, drawBoxY + 58, 250, 222, 34, " Deactivation settings", titleY - 3, "Set restrictions on deactivating or downgrading your Iron Man status.", descX - 5, descY + 10, new ButtonHandler() {
drawClickBox(graphics, drawBoxX + 5, drawBoxY + 58, 250, 222, 34, " Deactivation settings", titleY - 3, "Set restrictions on deactivating or downgrading your Ironman status.", descX - 5, descY + 10, new ButtonHandler() {
@Override
void handle() {
if (getIronManMode() >= 1 && getIronManMode() <= 3) {
@@ -300,16 +300,19 @@ public final class SkillGuideInterface {
skillMenuEntries.add(new SkillMenuItem(546, "", "Shark - Heals 20"));
skillMenuEntries.add(new SkillMenuItem(1193, "", "Sea Turtle - Heals 20"));
skillMenuEntries.add(new SkillMenuItem(1191, "", "Manta Ray - Heals 20"));
} else if (curTab == 1) { // Pies
skillMenuEntries.add(new SkillMenuItem(258, "", "Redberry Pie - Heals 6 (3 per slice)"));
skillMenuEntries.add(new SkillMenuItem(259, "", "Meat Pie - Heals 8 (4 per slice)"));
skillMenuEntries.add(new SkillMenuItem(257, "", "Apple Pie - Heals 10 (5 per slice)"));
} else if (curTab == 1) { // Pizzas
skillMenuEntries.add(new SkillMenuItem(325, "", "Plain Pizza - Heals 11"));
skillMenuEntries.add(new SkillMenuItem(326, "", "Meat Pizza - Heals 14 (7 per slice)"));
skillMenuEntries.add(new SkillMenuItem(327, "", "Anchovie Pizza - Heals 16 (8 per slice)"));
skillMenuEntries.add(new SkillMenuItem(750, "", "Pineapple Pizza - Heals 20 (10 per slice)"));
} else if (curTab == 2) { // Pies
skillMenuEntries.add(new SkillMenuItem(258, "", "Redberry Pie - Heals 6 (3 per slice)"));
skillMenuEntries.add(new SkillMenuItem(259, "", "Meat Pie - Heals 8 (4 per slice)"));
skillMenuEntries.add(new SkillMenuItem(257, "", "Apple Pie - Heals 10 (5 per slice)"));
skillMenuEntries.add(new SkillMenuItem(1571, "", "Lily's pumpkin pie - Heals 12 (6 per slice)"));
skillMenuEntries.add(new SkillMenuItem(1490, "", "Pumkpin pie - Heals 24 (12 per slice)"));
} else if (curTab == 2) { // Produce
skillMenuEntries.add(new SkillMenuItem(1492, "", "White pumkpin pie - Heals 24 (12 per slice)"));
} else if (curTab == 3) { // Produce
skillMenuEntries.add(new SkillMenuItem(18, "", "Cabbage - Heals 1"));
if (harvesting) skillMenuEntries.add(new SkillMenuItem(1352, "", "Red Cabbage - Heals 1"));
skillMenuEntries.add(new SkillMenuItem(765, "", "Dwellberries - Heals 1"));
@@ -334,9 +337,10 @@ public final class SkillGuideInterface {
skillMenuEntries.add(new SkillMenuItem(1245, "", "Edible seaweed - Heals 4"));
if (harvesting) skillMenuEntries.add(new SkillMenuItem(1348, "", "red apple - Heals 4"));
if (harvesting) skillMenuEntries.add(new SkillMenuItem(1353, "", "Corn - Heals 6"));
if (harvesting) skillMenuEntries.add(new SkillMenuItem(1569, "", "Lily's Pumpkin - Heals 7"));
if (harvesting) skillMenuEntries.add(new SkillMenuItem(1350, "", "papaya - Heals 8"));
if (harvesting) skillMenuEntries.add(new SkillMenuItem(1354, "", "White Pumpkin - Heals 10"));
} else if (curTab == 3) { // Gnome Food
} else if (curTab == 4) { // Gnome Food
skillMenuEntries.add(new SkillMenuItem(897, "", "King worm - Heals 2"));
skillMenuEntries.add(new SkillMenuItem(896, "", "Toad legs - Heals 3"));
skillMenuEntries.add(new SkillMenuItem(911, "", "Choc crunchies - Heals 7"));
@@ -352,7 +356,7 @@ public final class SkillGuideInterface {
skillMenuEntries.add(new SkillMenuItem(909, "", "Worm hole - Heals 12"));
skillMenuEntries.add(new SkillMenuItem(907, "", "Chocolate bomb - Heals 15"));
skillMenuEntries.add(new SkillMenuItem(910, "", "Tangled toads legs - Heals 15"));
} else if (curTab == 4) { // Drinks
} else if (curTab == 5) { // Drinks
skillMenuEntries.add(new SkillMenuItem(193, "", "Beer - Heals 1"));
skillMenuEntries.add(new SkillMenuItem(269, "", "Dwarven Stout - Heals 1"));
skillMenuEntries.add(new SkillMenuItem(830, "", "Greenmans ale - Heals 1"));
@@ -374,7 +378,7 @@ public final class SkillGuideInterface {
skillMenuEntries.add(new SkillMenuItem(879, "", "pineapple punch - Heals 9"));
skillMenuEntries.add(new SkillMenuItem(142, "", "wine - Heals 11"));
skillMenuEntries.add(new SkillMenuItem(737, "", "Poison chalice - ???"));
} else if (curTab == 5) { // Other
} else if (curTab == 6) { // Other
if (runecraft) skillMenuEntries.add(new SkillMenuItem(1410, "", "Fish oil - 50% chance to heal 1"));
if (harvesting) skillMenuEntries.add(new SkillMenuItem(1459, "", "Sweetened Slices - Heals 1 or 2"));
if (harvesting) skillMenuEntries.add(new SkillMenuItem(1460, "", "Sweetened Chunks - Heals 1 or 2"));
@@ -553,6 +557,9 @@ public final class SkillGuideInterface {
skillMenuEntries.add(new SkillMenuItem(258, "10", "Redberry Pie"));
skillMenuEntries.add(new SkillMenuItem(259, "20", "Meat Pie"));
skillMenuEntries.add(new SkillMenuItem(257, "30", "Apple Pie"));
if (harvesting) skillMenuEntries.add(new SkillMenuItem(1571, "40", "Lily's pumpkin pie"));
if (Config.S_WANT_CUSTOM_SPRITES) skillMenuEntries.add(new SkillMenuItem(1490, "80", "Pumpkin pie"));
if (harvesting) skillMenuEntries.add(new SkillMenuItem(1492, "80", "White pumpkin pie"));
} else if (curTab == 3) {
skillMenuEntries.add(new SkillMenuItem(346, "25", "Stew"));
skillMenuEntries.add(new SkillMenuItem(709, "60", "Curry"));
@@ -601,7 +608,6 @@ public final class SkillGuideInterface {
} else if (curTab == 1) {
skillMenuEntries.add(new SkillMenuItem(405, "1", "All axes"));
} else if (curTab == 2) {
skillMenuEntries.add(new SkillMenuItem(88, "", "Woodcutting Guild (Coming soon)"));
if (Config.S_WANT_CUSTOM_SPRITES) {
skillMenuEntries.add(new SkillMenuItem(1525, "99", "Woodcutting Cape"));
}
@@ -791,6 +797,7 @@ public final class SkillGuideInterface {
skillMenuEntries.add(new SkillMenuItem(108, "7", "Bronze Full Helms - 2 Bars"));
skillMenuEntries.add(new SkillMenuItem(1076, "7", "Bronze Throwing Knives - 1 Bar makes 2"));
skillMenuEntries.add(new SkillMenuItem(124, "8", "Bronze Square Shields - 2 Bars"));
skillMenuEntries.add(new SkillMenuItem(1418, "9", "Bronze Chaim Mail Legs - 2 Bars"));
skillMenuEntries.add(new SkillMenuItem(205, "10", "Bronze Battleaxes - 3 Bars"));
skillMenuEntries.add(new SkillMenuItem(113, "11", "Bronze Chainbodies - 3 Bars"));
skillMenuEntries.add(new SkillMenuItem(128, "12", "Bronze Kiteshields - 3 Bars"));
@@ -811,6 +818,7 @@ public final class SkillGuideInterface {
skillMenuEntries.add(new SkillMenuItem(6, "22", "Iron Full Helms - 2 Bars"));
skillMenuEntries.add(new SkillMenuItem(1075, "22", "Iron Throwing Knives - 1 Bar makes 2"));
skillMenuEntries.add(new SkillMenuItem(3, "23", "Iron Square Shields - 2 Bars"));
skillMenuEntries.add(new SkillMenuItem(1419, "23", "Iron Chain Mail Legs - 2 Bars"));
skillMenuEntries.add(new SkillMenuItem(89, "25", "Iron Battleaxes - 3 Bars"));
skillMenuEntries.add(new SkillMenuItem(7, "26", "Iron Chainbodies - 3 Bars"));
skillMenuEntries.add(new SkillMenuItem(2, "27", "Iron Kiteshields - 3 Bars"));
@@ -833,6 +841,7 @@ public final class SkillGuideInterface {
skillMenuEntries.add(new SkillMenuItem(109, "37", "Steel Full Helms - 2 Bars"));
skillMenuEntries.add(new SkillMenuItem(1077, "37", "Steel Throwing Knives - 1 Bar makes 2"));
skillMenuEntries.add(new SkillMenuItem(125, "38", "Steel Square Shields - 2 Bars"));
skillMenuEntries.add(new SkillMenuItem(1420, "39", "Steel Chain Mail Legs - 2 Bars"));
skillMenuEntries.add(new SkillMenuItem(90, "40", "Steel Battleaxes - 3 Bars"));
skillMenuEntries.add(new SkillMenuItem(114, "41", "Steel Chainbodies - 3 Bars"));
skillMenuEntries.add(new SkillMenuItem(129, "42", "Steel Kiteshields - 3 Bars"));
@@ -853,6 +862,7 @@ public final class SkillGuideInterface {
skillMenuEntries.add(new SkillMenuItem(110, "57", "Mithril Full Helms - 2 Bars"));
skillMenuEntries.add(new SkillMenuItem(1078, "57", "Mithril Throwing Knives - 1 Bar makes 2"));
skillMenuEntries.add(new SkillMenuItem(126, "58", "Mithril Square Shields - 2 Bars"));
skillMenuEntries.add(new SkillMenuItem(1421, "59", "Mithril Chain Mail Legs - 2 Bars"));
skillMenuEntries.add(new SkillMenuItem(91, "60", "Mithril Battleaxes - 3 Bars"));
skillMenuEntries.add(new SkillMenuItem(115, "61", "Mithril Chainbodies - 3 Bars"));
skillMenuEntries.add(new SkillMenuItem(130, "62", "Mithril Kiteshields - 3 Bars"));
@@ -869,10 +879,11 @@ public final class SkillGuideInterface {
skillMenuEntries.add(new SkillMenuItem(1066, "74", "Adamantite Dart Tips - 1 Bar makes 7"));
skillMenuEntries.add(new SkillMenuItem(86, "75", "Adamant Scimitars - 2 Bars"));
skillMenuEntries.add(new SkillMenuItem(673, "75", "Adamant Arrowheads - 1 Bar makes 10"));
skillMenuEntries.add(new SkillMenuItem(71, "76", "Adamant Longswords - 2 Bars"));
skillMenuEntries.add(new SkillMenuItem(74, "76", "Adamant Longswords - 2 Bars"));
skillMenuEntries.add(new SkillMenuItem(111, "77", "Adamant Full Helms - 2 Bars"));
skillMenuEntries.add(new SkillMenuItem(1079, "77", "Adamant Throwing Knives - 1 Bar makes 2"));
skillMenuEntries.add(new SkillMenuItem(127, "78", "Adamant Square Shields - 2 Bars"));
skillMenuEntries.add(new SkillMenuItem(1422, "79", "Adamant Chain Mail Legs - 2 Bars"));
skillMenuEntries.add(new SkillMenuItem(92, "80", "Adamant Battleaxes - 3 Bars"));
skillMenuEntries.add(new SkillMenuItem(116, "81", "Adamant Chainbodies - 3 Bars"));
skillMenuEntries.add(new SkillMenuItem(131, "82", "Adamant Kiteshields - 3 Bars"));
@@ -893,6 +904,7 @@ public final class SkillGuideInterface {
skillMenuEntries.add(new SkillMenuItem(112, "92", "Rune Full Helms - 2 Bars"));
skillMenuEntries.add(new SkillMenuItem(1080, "92", "Rune Throwing Knives - 1 Bar makes 2"));
skillMenuEntries.add(new SkillMenuItem(403, "93", "Rune Square Shields - 2 Bars"));
skillMenuEntries.add(new SkillMenuItem(1423, "94", "Rune Chain Mail Legs - 2 Bars"));
skillMenuEntries.add(new SkillMenuItem(93, "95", "Rune Battleaxes - 3 Bars"));
skillMenuEntries.add(new SkillMenuItem(400, "96", "Rune Chainbodies - 3 Bars"));
skillMenuEntries.add(new SkillMenuItem(404, "97", "Rune Kiteshields - 3 Bars"));
@@ -3,9 +3,9 @@ package com.openrsc.interfaces.misc.clan;
import orsc.mudclient;
public class Clan {
public String[] username = new String[25];
public int[] clanRank = new int[25];
public int[] onlineClanMember = new int[25];
public String[] username = new String[200];
public int[] clanRank = new int[200];
public int[] onlineClanMember = new int[200];
public boolean[] allowed = new boolean[2];
private boolean inClan;
private String clanName;
+5 -3
View File
@@ -18,7 +18,7 @@ public class Config {
public static String WELCOME_TEXT = "You need a members account to use this server";
public static String SERVER_IP = null; // Modify this to override "Cache/ip.txt"
public static int SERVER_PORT; // Modify SERVER_IP above to override "Cache/port.txt" with this value
public static final int CLIENT_VERSION = 10009;
public static final int CLIENT_VERSION = 10069;
private static final int CACHE_VERSION = 4;
public static boolean MEMBER_WORLD = false;
public static boolean DISPLAY_LOGO_SPRITE = false;
@@ -35,7 +35,8 @@ public class Config {
/* Configurable: */
public static boolean C_EXPERIENCE_DROPS = false;
public static boolean C_NPC_KC = false;
public static boolean C_TOTAL_NPC_KC = false;
public static boolean C_RECENT_NPC_KC = false;
public static boolean C_BATCH_PROGRESS_BAR = false;
public static boolean C_HIDE_ROOFS = false;
public static boolean C_HIDE_FOG = false;
@@ -89,7 +90,7 @@ public class Config {
public static boolean S_WANT_EQUIPMENT_TAB = false;
public static boolean S_WANT_BANK_PRESETS = false;
public static boolean S_WANT_LEFTCLICK_WEBS = false;
public static boolean S_NPC_KILL_MESSAGES = false;
public static boolean S_NPC_KILL_COUNTERS = false;
// if you change these, and the config file,
// they will also change the options menu to
// 2-tabs (3 on android). (Not enough room for
@@ -146,6 +147,7 @@ public class Config {
public static boolean S_WANT_OPENPK_PRESETS = false;
public static boolean S_DISABLE_MINIMAP_ROTATION = true;
public static boolean S_ALLOW_BEARDED_LADIES = false;
public static boolean S_PRIDE_MONTH = false;
public static void set(String key, Object value) {
prop.setProperty(key, value.toString());
+25
View File
@@ -12,6 +12,9 @@ import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
/**
* The class used to initialise and set user status on Discord.
*/
public class Discord {
public static DiscordEventHandlers discord;
@@ -26,6 +29,11 @@ public class Discord {
private static ScheduledFuture scheduled;
private static String lastUpdate = "Open source RSC MMO";
/**
* Write whether or not Discord is currently in use. This prevents race conditions when multiple clients are
* initialised at the same time.
* @param inuse Status to set.
*/
public static void setInUse(final boolean inuse) {
try {
Files.write(Paths.get(Config.F_CACHE_DIR + File.separator + "discord_inuse.txt"), (inuse ? "1" : "0").getBytes());
@@ -33,6 +41,10 @@ public class Discord {
}
}
/**
* Get lockfile status.
* @return True if Discord is already initialised.
*/
public static boolean getInUse() {
try {
final String read = Files.readAllLines(Paths.get(Config.F_CACHE_DIR + File.separator + "discord_inuse.txt")).get(0);
@@ -43,6 +55,9 @@ public class Discord {
return false;
}
/**
* Task to check for Discord presence.
*/
static class PresenceCheck implements Runnable {
public void run() {
// discord natives not in use and have not started discord
@@ -70,6 +85,9 @@ public class Discord {
}
}
/**
* Initialize an instance of Discord.
*/
public static void InitalizeDiscord() {
// users may (likely) have multiple instances of the game open at once
// so we have to run a timer task to only have one initialized at a time
@@ -79,6 +97,9 @@ public class Discord {
scheduled = scheduledExecutorService.scheduleAtFixedRate(presenceTask, 0L, 15L, TimeUnit.SECONDS);
}
/**
* Task to update Discord status.
*/
static class DiscordUpdate implements Runnable {
public void run() {
DiscordRPC.discordRunCallbacks();
@@ -91,6 +112,10 @@ public class Discord {
}
}
/**
* Set status message on Discord.
* @param update Message content.
*/
public static void setLastUpdate(String update) {
lastUpdate = update;
}
+30
View File
@@ -708,6 +708,36 @@ public class ORSCApplet extends Applet implements MouseListener, MouseMotionList
return "../OpenRSC/";
}
@Override
public Sprite getBattery(int level) {
// This would be needed to be implemented if was desired to display Battery Status Icon
return null;
}
@Override
public int getBatteryPercent() {
// This would be needed to be implemented if was desired to display Battery Percent
return 100;
}
@Override
public boolean getBatteryCharging() {
// This would be needed to be implemented if was desired to display Battery Charging
return false;
}
@Override
public Sprite getConnectivity(int level) {
// This would be needed to be implemented if was desired to display Network Connectivity Status Icon
return null;
}
@Override
public String getConnectivityText() {
// This would be needed to be implemented if was desired to display Network Connectivity Status Text
return null;
}
@Override
public void resized() {
imageProducer.setDimensions(mudclient.getSurface().width2, mudclient.getSurface().height2);
+29 -9
View File
@@ -428,8 +428,11 @@ public class PacketHandler {
}
// Kills2
else if (opcode == 147)
mc.setStatKills2(packetsIncoming.getShort());
else if (opcode == 147) {
mc.setStatKills2(packetsIncoming.get32());
mc.setLastNpcKilledId(packetsIncoming.get32());
mc.setStatKills3(packetsIncoming.get32());
}
else if (opcode == 148) // Set OpenPK Points
mc.setPoints(packetsIncoming.getLong(0));
@@ -939,10 +942,10 @@ public class PacketHandler {
int wantDecanting, wantCertsToBank, wantCustomRankDisplay, wantRightClickBank, wantPlayerCommands;
int getFPS, wantEmail, wantRegistrationLimit, allowResize, lenientContactDetails, wantFatigue, wantCustomSprites;
int fishingSpotsDepletable, improvedItemObjectNames, wantRunecraft, wantCustomLandscape, wantEquipmentTab;
int wantBankPresets, wantParties, miningRocksExtended, movePerFrame, wantLeftclickWebs, npcKillMessages;
int wantBankPresets, wantParties, miningRocksExtended, movePerFrame, wantLeftclickWebs, npcKillCounters;
int wantCustomUI, wantGlobalFriend, characterCreationMode, skillingExpRate, wantHarvesting, hideLoginBox;
int globalFriendChat, wantRightClickTrade, featuresSleep, wantExtendedCatsBehavior, wantCertAsNotes, wantOpenPkPoints, openPkPointsToGpRatio, wantOpenPkPresets;
int disableMinimapRotation, allowBeardedLadies;
int disableMinimapRotation, allowBeardedLadies, prideMonth;
String logoSpriteID;
@@ -1014,7 +1017,7 @@ public class PacketHandler {
miningRocksExtended = this.getClientStream().getUnsignedByte(); //65
movePerFrame = this.getClientStream().getByte(); //66
wantLeftclickWebs = this.getClientStream().getByte(); //67
npcKillMessages = this.getClientStream().getByte(); //68
npcKillCounters = this.getClientStream().getByte(); //68
wantCustomUI = this.getClientStream().getUnsignedByte(); //69
wantGlobalFriend = this.getClientStream().getUnsignedByte(); //70
characterCreationMode = this.getClientStream().getUnsignedByte(); //71
@@ -1032,6 +1035,7 @@ public class PacketHandler {
showUndergroundFlickerToggle = this.getClientStream().getUnsignedByte(); // 83
disableMinimapRotation = this.getClientStream().getUnsignedByte(); // 84
allowBeardedLadies = this.getClientStream().getUnsignedByte(); // 85
prideMonth = this.getClientStream().getUnsignedByte(); // 86
} else {
serverName = packetsIncoming.readString(); // 1
serverNameWelcome = packetsIncoming.readString(); // 2
@@ -1100,7 +1104,7 @@ public class PacketHandler {
miningRocksExtended = packetsIncoming.getUnsignedByte(); //65
movePerFrame = packetsIncoming.getByte(); //66
wantLeftclickWebs = packetsIncoming.getByte(); //67
npcKillMessages = packetsIncoming.getByte(); //68
npcKillCounters = packetsIncoming.getByte(); //68
wantCustomUI = packetsIncoming.getUnsignedByte(); //69
wantGlobalFriend = packetsIncoming.getUnsignedByte(); //70
characterCreationMode = packetsIncoming.getUnsignedByte(); //71
@@ -1118,6 +1122,7 @@ public class PacketHandler {
showUndergroundFlickerToggle = packetsIncoming.getUnsignedByte(); // 83
disableMinimapRotation = packetsIncoming.getUnsignedByte(); // 84
allowBeardedLadies = packetsIncoming.getUnsignedByte(); // 85
prideMonth = packetsIncoming.getUnsignedByte(); // 86
}
if (Config.DEBUG) {
@@ -1189,7 +1194,7 @@ public class PacketHandler {
"\nS_MINING_ROCKS_EXTENDED " + miningRocksExtended + // 65
"\nC_MOVE_PER_FRAME " + movePerFrame + // 66
"\nS_WANT_LEFTCLICK_WEBS " + wantLeftclickWebs + // 67
"\nS_NPC_KILL_MESSAGES " + npcKillMessages + // 68
"\nS_NPC_KILL_COUNTERS " + npcKillCounters + // 68
"\nS_WANT_CUSTOM_UI " + wantCustomUI + // 69
"\nS_WANT_GLOBAL_FRIEND" + wantGlobalFriend + // 70
"\nS_CHARACTER_CREATION_MODE" + characterCreationMode + // 71
@@ -1206,7 +1211,8 @@ public class PacketHandler {
"\nS_WANT_OPENPK_PRESETS " + wantOpenPkPresets + // 82
"\nS_SHOW_UNDERGROUND_FLICKER_TOGGLE " + showUndergroundFlickerToggle + // 83
"\nS_DISABLE_MINIMAP_ROTATION " + disableMinimapRotation + // 84
"\nS_ALLOW_BEARDED_LADIES " + allowBeardedLadies // 85
"\nS_ALLOW_BEARDED_LADIES " + allowBeardedLadies + // 85
"\nS_PRIDE_MONTH " + prideMonth // 86
);
}
@@ -1281,7 +1287,7 @@ public class PacketHandler {
props.setProperty("S_MINING_ROCKS_EXTENDED", miningRocksExtended == 1 ? "true" : "false"); //65
props.setProperty("C_MOVE_PER_FRAME", String.valueOf(movePerFrame)); //66
props.setProperty("S_WANT_LEFTCLICK_WEBS", wantLeftclickWebs == 1 ? "true" : "false"); //67
props.setProperty("S_NPC_KILL_MESSAGES", npcKillMessages == 1 ? "true" : "false"); //68
props.setProperty("S_NPC_KILL_COUNTERS", npcKillCounters == 1 ? "true" : "false"); //68
props.setProperty("S_WANT_CUSTOM_UI", wantCustomUI == 1 ? "true" : "false"); //69
props.setProperty("S_WANT_GLOBAL_FRIEND", wantGlobalFriend == 1 ? "true" : "false"); //70
props.setProperty("S_CHARACTER_CREATION_MODE", Integer.toString(characterCreationMode)); //71
@@ -1299,6 +1305,7 @@ public class PacketHandler {
props.setProperty("S_SHOW_UNDERGROUND_FLICKER_TOGGLE", showUndergroundFlickerToggle == 1 ? "true" : "false"); // 83
props.setProperty("S_DISABLE_MINIMAP_ROTATION", disableMinimapRotation == 1 ? "true" : "false"); // 84
props.setProperty("S_ALLOW_BEARDED_LADIES", allowBeardedLadies == 1 ? "true" : "false"); // 85
props.setProperty("S_PRIDE_MONTH", prideMonth == 1 ? "true" : "false"); // 86
Config.updateServerConfiguration(props);
mc.authenticSettings = !(
@@ -2124,6 +2131,8 @@ public class PacketHandler {
mc.setHideLoginBox(packetsIncoming.getUnsignedByte() == 1); // 40
mc.setBlockGlobalFriend(packetsIncoming.getUnsignedByte() == 1); // 41
mc.setOptionHideUndergroundFlicker(packetsIncoming.getUnsignedByte() == 1); // 42
mc.setStatusBar(packetsIncoming.getUnsignedByte()); // 43
mc.setShowRecentNPCKC(packetsIncoming.getUnsignedByte() == 1); // 44
}
private void togglePrayer(int length) {
@@ -2173,6 +2182,10 @@ public class PacketHandler {
mc.getBank().addBank(slot, packetsIncoming.getShort(), packetsIncoming.get32());
}
if (Config.S_WANT_CUSTOM_BANKS) {
mc.getBank().calculateWealth();
}
// Discord update
Discord.setLastUpdate("Banking");
}
@@ -2271,6 +2284,9 @@ public class PacketHandler {
int item = packetsIncoming.getShort();
int itemCount = packetsIncoming.get32();
mc.getBank().updateBank(slot, item, itemCount);
if (Config.S_WANT_CUSTOM_BANKS) {
mc.getBank().calculateWealth();
}
}
private void updateExperience() {
@@ -2699,6 +2715,10 @@ public class PacketHandler {
player.colourTop = packetsIncoming.getUnsignedByte();
player.colourBottom = packetsIncoming.getUnsignedByte();
player.colourSkin = packetsIncoming.getUnsignedByte();
if (Config.S_WANT_CUSTOM_SPRITES && player == mc.getLocalPlayer()) {
// Change mum's skin color to match the player's
EntityHandler.getNpcDef(812).skinColour = mc.getPlayerSkinColors()[player.colourSkin];
}
player.level = packetsIncoming.getUnsignedByte();
player.skullVisible = packetsIncoming.getUnsignedByte();
if (packetsIncoming.getByte() == 1) {
@@ -1575,6 +1575,8 @@ public class GraphicsController {
color = 0x44eadf;
} else if (key.equalsIgnoreCase("cla")) {
color = 0x7CADDA;
} else if (key.equalsIgnoreCase("pin")) {
color = 0xFF8ED9;
}
i += 4;
} else {
+169 -55
View File
@@ -621,6 +621,8 @@ public final class mudclient implements Runnable {
private int statFatigue = 0;
private int statFatigueAuthentic = 0;
private int statKills2 = 0;
private int lastNpcKilledId = -1;
private int statKills3 = 0;
private int expShared = 0;
private int petFatigue = 0;
private long openPkPoints = 0;
@@ -5335,9 +5337,20 @@ public final class mudclient implements Runnable {
this.getSurface().drawString(
"Prayer: " + this.playerStatCurrent[5] + "@gre@/@whi@" + this.playerStatBase[5], 7, i, 0xffffff, 1);
i += 14;
if (C_NPC_KC) {
if (C_TOTAL_NPC_KC) {
this.getSurface().drawString(
"Kills: " + this.statKills2 + "@whi@", 7, i, 0xffffff, 1);
"Kills: " + getStatKills2() + "@whi@", 7, i, 0xffffff, 1);
i += 14;
}
if (C_RECENT_NPC_KC) {
if (getLastNpcKilledId() != -1) {
this.getSurface().drawString(
"Last NPC Kills: " + getStatKills3() + "@whi@", 7, i, 0xffffff, 1);
} else {
this.getSurface().drawString(
"Last NPC Kills: None@whi@", 7, i, 0xffffff, 1);
}
i += 14;
}
if (Config.S_WANT_FATIGUE) {
i += 14;
@@ -5388,6 +5401,25 @@ public final class mudclient implements Runnable {
}
}
}
if (osConfig.C_STATUS_BAR == 0) { // icons + text
this.getSurface().drawSprite(clientPort.getBattery(0), uiX - 50, 10);
this.getSurface().drawColoredStringCentered(uiX - 40, clientPort.getBatteryPercent() + "%", 0xffffff, 0, 2, 10);
this.getSurface().drawSprite(clientPort.getConnectivity(0), uiX - 30, 10);
} else if (osConfig.C_STATUS_BAR == 1) { // icons only
this.getSurface().drawSprite(clientPort.getBattery(0), uiX - 50, 10);
this.getSurface().drawSprite(clientPort.getConnectivity(0), uiX - 30, 10);
} else if (osConfig.C_STATUS_BAR == 2) { // text only
this.getSurface().drawColoredStringCentered(uiX - 50, "BAT:", 0xffff00, 0, 2, 15);
this.getSurface().drawColoredStringCentered(uiX - 50, clientPort.getBatteryPercent() + "%", 0xffffff, 0, 2, 30);
if (clientPort.getBatteryCharging()) {
this.getSurface().drawColoredStringCentered(uiX - 50, "(C)", 0xffffff, 0, 2, 45);
}
this.getSurface().drawColoredStringCentered(uiX - 20, "NET:", 0xffff00, 0, 2, 15);
this.getSurface().drawColoredStringCentered(uiX - 20, clientPort.getConnectivityText(), 0xffffff, 0, 2, 30);
}
}
if (isAndroid() && Config.S_WANT_PLAYER_COMMANDS) { // on screen buttons for various player chat commands
@@ -7065,15 +7097,31 @@ public final class mudclient implements Runnable {
}
}
private int getExperienceCounterColor() {
switch (C_EXPERIENCE_COUNTER_COLOR) {
case 1:
return 0xFFFF00; // Yellow
case 2:
return 0xFF0000; // Red
case 3:
return 0x0000FF; // Blue
case 4:
return 0x00FF00; // Green
case 5:
return 0xFF8ED9; // Pink
case 6:
return 0xFF00FF; // Magenta
default:
return 0xFFFFFF; // White
}
}
private void drawExperienceCounter(int skill) {
if (!S_EXPERIENCE_COUNTER_TOGGLE) return;
if (selectedSkill >= 0) {
skill = selectedSkill;
}
int textColor = C_EXPERIENCE_COUNTER_COLOR == 0 ? 0xFFFFFF :
C_EXPERIENCE_COUNTER_COLOR == 1 ? 0xFFFF00 :
C_EXPERIENCE_COUNTER_COLOR == 2 ? 0xFF0000 :
C_EXPERIENCE_COUNTER_COLOR == 3 ? 0x0000FF : 0x00FF00;
int textColor = getExperienceCounterColor();
long totalXp = 0;
long timePassed = 0;
if (C_EXPERIENCE_COUNTER_MODE == 1 || skill < 0) {
@@ -9417,13 +9465,20 @@ public final class mudclient implements Runnable {
}
// npc kill count messages
if (S_NPC_KILL_MESSAGES) {
if (!C_NPC_KC) {
if (S_NPC_KILL_COUNTERS) {
if (!C_TOTAL_NPC_KC) {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Show NPC killcount - @red@Off", 38, null, null);
"@whi@Total NPC Killcounter - @red@Off", 38, null, null);
} else {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Show NPC killcount - @gre@On", 38, null, null);
"@whi@Total NPC Killcounter - @gre@On", 38, null, null);
}
if (!C_RECENT_NPC_KC) {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Last NPC Killcounter - @red@Off", 44, null, null);
} else {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Last NPC Killcounter - @gre@On", 44, null, null);
}
}
// show roof
@@ -9607,120 +9662,135 @@ public final class mudclient implements Runnable {
int index = 0;
this.getSurface().drawString("Android options", 3 + baseX, y, 0, 1);
// Status Bar
if (osConfig.C_STATUS_BAR == 0) {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Show Status Bar - @gre@Icons & Text", 0, null, null);
} else if (osConfig.C_STATUS_BAR == 1) {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Show Status Bar - @gr1@Icons", 0, null, null);
} else if (osConfig.C_STATUS_BAR == 2) {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Show Status Bar - @yel@Text", 0, null, null);
} else if (osConfig.C_STATUS_BAR == 3) {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Show Status Bar - @red@None", 0, null, null);
}
// Color changing long press timer option
// -> red
if (osConfig.C_LONG_PRESS_TIMER < 3) { // 1-2
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Hold-time for Menu - @red@" + (osConfig.C_LONG_PRESS_TIMER), 0, null, null);
"@whi@Hold-time for Menu - @red@" + (osConfig.C_LONG_PRESS_TIMER), 1, null, null);
}
// -> light red
if (osConfig.C_LONG_PRESS_TIMER > 2 && osConfig.C_LONG_PRESS_TIMER < 5) { // 3-4
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Hold-time for Menu - @lre@" + (osConfig.C_LONG_PRESS_TIMER), 0, null, null);
"@whi@Hold-time for Menu - @lre@" + (osConfig.C_LONG_PRESS_TIMER), 1, null, null);
}
// -> green
if (osConfig.C_LONG_PRESS_TIMER > 4 && osConfig.C_LONG_PRESS_TIMER < 9) { // 5-8
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Hold-time for Menu - @gre@" + (osConfig.C_LONG_PRESS_TIMER), 0, null, null);
"@whi@Hold-time for Menu - @gre@" + (osConfig.C_LONG_PRESS_TIMER), 1, null, null);
}
// -> light red
if (osConfig.C_LONG_PRESS_TIMER > 8 && osConfig.C_LONG_PRESS_TIMER < 11) { // 9-10
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Hold-time for Menu - @lre@" + (osConfig.C_LONG_PRESS_TIMER), 0, null, null);
"@whi@Hold-time for Menu - @lre@" + (osConfig.C_LONG_PRESS_TIMER), 1, null, null);
}
// -> red
if (osConfig.C_LONG_PRESS_TIMER > 10) { // 11
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Hold-time for Menu - @red@" + (osConfig.C_LONG_PRESS_TIMER), 0, null, null);
"@whi@Hold-time for Menu - @red@" + (osConfig.C_LONG_PRESS_TIMER), 1, null, null);
}
// Color changing font size toggle
// -> light red
if (osConfig.C_MENU_SIZE < 3) { // 1-2
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Font Size - @lre@" + (osConfig.C_MENU_SIZE), 1, null, null);
"@whi@Font Size - @lre@" + (osConfig.C_MENU_SIZE), 2, null, null);
}
// -> green
if (osConfig.C_MENU_SIZE > 2 && osConfig.C_MENU_SIZE < 5) { // 3-4
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Font Size - @gre@" + (osConfig.C_MENU_SIZE), 1, null, null);
"@whi@Font Size - @gre@" + (osConfig.C_MENU_SIZE), 2, null, null);
}
// -> light red
if (osConfig.C_MENU_SIZE > 4 && osConfig.C_MENU_SIZE < 7) { // 5-6
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Font Size - @lre@" + (osConfig.C_MENU_SIZE), 1, null, null);
"@whi@Font Size - @lre@" + (osConfig.C_MENU_SIZE), 2, null, null);
}
// menu size
if (osConfig.C_MENU_SIZE == 7) { // 7
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Font Size - @red@" + (osConfig.C_MENU_SIZE), 1, null, null);
"@whi@Font Size - @red@" + (osConfig.C_MENU_SIZE), 2, null, null);
}
// hold and choose
if (!osConfig.C_HOLD_AND_CHOOSE) {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Hold and Choose - @red@Off", 2, null, null);
"@whi@Hold and Choose - @red@Off", 3, null, null);
} else {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Hold and Choose - @gre@On", 2, null, null);
"@whi@Hold and Choose - @gre@On", 3, null, null);
}
// swipe to scroll
if (osConfig.C_SWIPE_TO_SCROLL_MODE == 0) {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Swipe to Scroll - @red@Unset", 3, null, null);
"@whi@Swipe to Scroll - @red@Unset", 4, null, null);
} else if (osConfig.C_SWIPE_TO_SCROLL_MODE == 1) {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Swipe to Scroll - @yel@Normal", 3, null, null);
"@whi@Swipe to Scroll - @yel@Normal", 4, null, null);
} else if (osConfig.C_SWIPE_TO_SCROLL_MODE == 2) {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Swipe to Scroll - @gre@Invert", 3, null, null);
"@whi@Swipe to Scroll - @gre@Invert", 4, null, null);
}
// swipe to zoom
if (osConfig.C_SWIPE_TO_ZOOM_MODE == 0) {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Swipe to Zoom - @red@Unset", 4, null, null);
"@whi@Swipe to Zoom - @red@Unset", 5, null, null);
} else if (osConfig.C_SWIPE_TO_ZOOM_MODE == 1) {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Swipe to Zoom - @yel@Normal", 4, null, null);
"@whi@Swipe to Zoom - @yel@Normal", 5, null, null);
} else if (osConfig.C_SWIPE_TO_ZOOM_MODE == 2) {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Swipe to Zoom - @gre@Invert", 4, null, null);
"@whi@Swipe to Zoom - @gre@Invert", 5, null, null);
}
// swipe to rotate
if (osConfig.C_SWIPE_TO_ROTATE_MODE == 0) {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Swipe to Rotate - @red@Unset", 5, null, null);
"@whi@Swipe to Rotate - @red@Unset", 6, null, null);
} else if (osConfig.C_SWIPE_TO_ROTATE_MODE == 1) {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Swipe to Rotate - @yel@Normal", 5, null, null);
"@whi@Swipe to Rotate - @yel@Normal", 6, null, null);
} else if (osConfig.C_SWIPE_TO_ROTATE_MODE == 2) {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Swipe to Rotate - @gre@Invert", 5, null, null);
"@whi@Swipe to Rotate - @gre@Invert", 6, null, null);
}
// volume to rotate
if (osConfig.C_VOLUME_FUNCTION == 0) {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Volume buttons - @red@Rotate", 6, null, null);
"@whi@Volume buttons - @red@Rotate", 7, null, null);
} else if (osConfig.C_VOLUME_FUNCTION == 1) {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Volume buttons - @yel@Zoom", 6, null, null);
"@whi@Volume buttons - @yel@Zoom", 7, null, null);
} else if (osConfig.C_VOLUME_FUNCTION == 2) {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Volume buttons - @gre@Volume", 6, null, null);
"@whi@Volume buttons - @gre@Volume", 7, null, null);
}
// inventory close
if (!osConfig.C_ANDROID_INV_TOGGLE) {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Close inventory with menu - @red@Off", 7, null, null);
"@whi@Close inventory with menu - @red@Off", 8, null, null);
} else {
this.panelSettings.setListEntry(this.controlSettingPanel, index++,
"@whi@Close inventory with menu - @gre@On", 7, null, null);
"@whi@Close inventory with menu - @gre@On", 8, null, null);
}
// logout text
@@ -9974,12 +10044,21 @@ public final class mudclient implements Runnable {
}
// npc killcount shows
if (settingIndex == 38 && this.mouseButtonClick == 1 && S_NPC_KILL_MESSAGES) {
C_NPC_KC = !C_NPC_KC;
this.packetHandler.getClientStream().newPacket(111);
this.packetHandler.getClientStream().bufferBits.putByte(38);
this.packetHandler.getClientStream().bufferBits.putByte(C_NPC_KC ? 1 : 0);
this.packetHandler.getClientStream().finishPacket();
if (S_NPC_KILL_COUNTERS) {
if (settingIndex == 38 && this.mouseButtonClick == 1) {
C_TOTAL_NPC_KC = !C_TOTAL_NPC_KC;
this.packetHandler.getClientStream().newPacket(111);
this.packetHandler.getClientStream().bufferBits.putByte(38);
this.packetHandler.getClientStream().bufferBits.putByte(C_TOTAL_NPC_KC ? 1 : 0);
this.packetHandler.getClientStream().finishPacket();
}
if (settingIndex == 44 && this.mouseButtonClick == 1) {
C_RECENT_NPC_KC = !C_RECENT_NPC_KC;
this.packetHandler.getClientStream().newPacket(111);
this.packetHandler.getClientStream().bufferBits.putByte(44);
this.packetHandler.getClientStream().bufferBits.putByte(C_RECENT_NPC_KC ? 1 : 0);
this.packetHandler.getClientStream().finishPacket();
}
}
}
@@ -10162,8 +10241,17 @@ public final class mudclient implements Runnable {
// android menu tab
private void handleAndroidSettingsClicks(short var5, int var6, int yFromTopDistance) {
// hold to right click delay control
// status bar control
if (this.panelSettings.getControlSelectedListIndex(this.controlSettingPanel) == 0 && this.mouseButtonClick == 1) {
osConfig.C_STATUS_BAR = ++osConfig.C_STATUS_BAR % 4;
this.packetHandler.getClientStream().newPacket(111);
this.packetHandler.getClientStream().bufferBits.putByte(43);
this.packetHandler.getClientStream().bufferBits.putByte(osConfig.C_STATUS_BAR);
this.packetHandler.getClientStream().finishPacket();
}
// hold to right click delay control
if (this.panelSettings.getControlSelectedListIndex(this.controlSettingPanel) == 1 && this.mouseButtonClick == 1) {
osConfig.C_LONG_PRESS_TIMER++;
if (osConfig.C_LONG_PRESS_TIMER == 13)
osConfig.C_LONG_PRESS_TIMER = 1;
@@ -10174,7 +10262,7 @@ public final class mudclient implements Runnable {
}
// font size control
if (this.panelSettings.getControlSelectedListIndex(this.controlSettingPanel) == 1 && this.mouseButtonClick == 1) {
if (this.panelSettings.getControlSelectedListIndex(this.controlSettingPanel) == 2 && this.mouseButtonClick == 1) {
osConfig.C_MENU_SIZE++;
if (osConfig.C_MENU_SIZE == 8)
osConfig.C_MENU_SIZE = 1;
@@ -10188,7 +10276,7 @@ public final class mudclient implements Runnable {
}
// hold to right click toggle
if (this.panelSettings.getControlSelectedListIndex(this.controlSettingPanel) == 2 && this.mouseButtonClick == 1) {
if (this.panelSettings.getControlSelectedListIndex(this.controlSettingPanel) == 3 && this.mouseButtonClick == 1) {
osConfig.C_HOLD_AND_CHOOSE = !osConfig.C_HOLD_AND_CHOOSE;
this.packetHandler.getClientStream().newPacket(111);
this.packetHandler.getClientStream().bufferBits.putByte(21);
@@ -10197,7 +10285,7 @@ public final class mudclient implements Runnable {
}
// swipe scroll control
if (this.panelSettings.getControlSelectedListIndex(this.controlSettingPanel) == 3 && this.mouseButtonClick == 1) {
if (this.panelSettings.getControlSelectedListIndex(this.controlSettingPanel) == 4 && this.mouseButtonClick == 1) {
osConfig.C_SWIPE_TO_SCROLL_MODE = ++osConfig.C_SWIPE_TO_SCROLL_MODE%3;
this.packetHandler.getClientStream().newPacket(111);
this.packetHandler.getClientStream().bufferBits.putByte(18);
@@ -10206,7 +10294,7 @@ public final class mudclient implements Runnable {
}
// swipe camera zoom control
if (this.panelSettings.getControlSelectedListIndex(this.controlSettingPanel) == 4 && this.mouseButtonClick == 1) {
if (this.panelSettings.getControlSelectedListIndex(this.controlSettingPanel) == 5 && this.mouseButtonClick == 1) {
osConfig.C_SWIPE_TO_ZOOM_MODE = ++osConfig.C_SWIPE_TO_ZOOM_MODE%3;
this.packetHandler.getClientStream().newPacket(111);
this.packetHandler.getClientStream().bufferBits.putByte(22);
@@ -10215,7 +10303,7 @@ public final class mudclient implements Runnable {
}
// swipe camera rotation control
if (this.panelSettings.getControlSelectedListIndex(this.controlSettingPanel) == 5 && this.mouseButtonClick == 1) {
if (this.panelSettings.getControlSelectedListIndex(this.controlSettingPanel) == 6 && this.mouseButtonClick == 1) {
osConfig.C_SWIPE_TO_ROTATE_MODE = ++osConfig.C_SWIPE_TO_ROTATE_MODE%3;
this.packetHandler.getClientStream().newPacket(111);
this.packetHandler.getClientStream().bufferBits.putByte(17);
@@ -10224,7 +10312,7 @@ public final class mudclient implements Runnable {
}
// volume button function control (rotate, zoom, volume)
if (this.panelSettings.getControlSelectedListIndex(this.controlSettingPanel) == 6 && this.mouseButtonClick == 1) {
if (this.panelSettings.getControlSelectedListIndex(this.controlSettingPanel) == 7 && this.mouseButtonClick == 1) {
osConfig.C_VOLUME_FUNCTION = ++osConfig.C_VOLUME_FUNCTION %3;
this.packetHandler.getClientStream().newPacket(111);
this.packetHandler.getClientStream().bufferBits.putByte(16);
@@ -10233,7 +10321,7 @@ public final class mudclient implements Runnable {
}
// android inventory toggle
if (this.panelSettings.getControlSelectedListIndex(this.controlSettingPanel) == 7 && this.mouseButtonClick == 1) {
if (this.panelSettings.getControlSelectedListIndex(this.controlSettingPanel) == 8 && this.mouseButtonClick == 1) {
osConfig.C_ANDROID_INV_TOGGLE = !osConfig.C_ANDROID_INV_TOGGLE;
this.packetHandler.getClientStream().newPacket(111);
this.packetHandler.getClientStream().bufferBits.putByte(37);
@@ -16287,6 +16375,26 @@ public final class mudclient implements Runnable {
this.statKills2 = kills2;
}
public int getStatKills3() {
return this.statKills3;
}
public void setStatKills3(int kills3) {
if (DEBUG)
System.out.println("Kills3: " + kills3);
this.statKills3 = kills3;
}
public int getLastNpcKilledId() {
return this.lastNpcKilledId;
}
public void setLastNpcKilledId(int lastNpcKilledId) {
if (DEBUG)
System.out.println("Last Npc Killed Id: " + lastNpcKilledId);
this.lastNpcKilledId = lastNpcKilledId;
}
public int getPetFatigue() {
return this.petFatigue;
}
@@ -16634,10 +16742,7 @@ public final class mudclient implements Runnable {
drawExperienceCounter(xpdrop.skill);
}
int textColor = C_EXPERIENCE_COUNTER_COLOR == 0 ? 0xFFFFFF :
C_EXPERIENCE_COUNTER_COLOR == 1 ? 0xFFFF00 :
C_EXPERIENCE_COUNTER_COLOR == 2 ? 0xFF0000 :
C_EXPERIENCE_COUNTER_COLOR == 3 ? 0x0000FF : 0x00FF00;
int textColor = getExperienceCounterColor();
if (!xpdrop.levelUp) {
if (textColor == 0xFFFFFF) {
@@ -17227,7 +17332,7 @@ public final class mudclient implements Runnable {
return playerClothingColors;
}
private int[] getPlayerSkinColors() {
public int[] getPlayerSkinColors() {
return playerSkinColors;
}
@@ -17373,6 +17478,7 @@ public final class mudclient implements Runnable {
skillGuideChosenTabs.add("Armour");
} else if (skillGuideChosen.equalsIgnoreCase("Hits")) {
skillGuideChosenTabs.add("Fish");
skillGuideChosenTabs.add("Pizzas");
skillGuideChosenTabs.add("Pies");
skillGuideChosenTabs.add("Produce");
skillGuideChosenTabs.add("Gnome Food");
@@ -17713,6 +17819,10 @@ public final class mudclient implements Runnable {
osConfig.C_MENU_SIZE = i;
}
public void setStatusBar(int i) {
osConfig.C_STATUS_BAR = i;
}
public void setHoldAndChoose(boolean b) {
osConfig.C_HOLD_AND_CHOOSE = b;
}
@@ -17776,7 +17886,11 @@ public final class mudclient implements Runnable {
}
public void setShowNPCKC(boolean b) {
C_NPC_KC = b;
C_TOTAL_NPC_KC = b;
}
public void setShowRecentNPCKC(boolean b) {
C_RECENT_NPC_KC = b;
}
public void setHideNameTag(boolean b) {
@@ -7,6 +7,7 @@ import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
@@ -38,6 +39,16 @@ public interface ClientPort {
String getCacheLocation();
Sprite getBattery(int level);
int getBatteryPercent();
boolean getBatteryCharging();
Sprite getConnectivity(int level);
String getConnectivityText();
void resized();
Sprite getSpriteFromByteArray(ByteArrayInputStream byteArrayInputStream);
+2 -1
View File
@@ -6,8 +6,9 @@ public class osConfig {
public static final String DL_URL = "game.openrsc.com"; // needs to be set as public for the Android client to use
public static final String ANDROID_DOWNLOAD_PATH = "https://" + DL_URL + "/downloads/";
public static final String CACHE_URL = "https://" + DL_URL + "/downloads/";
public static final int ANDROID_CLIENT_VERSION = 144; // Important! Depends on web server android_version.txt to check for an updated version
public static final int ANDROID_CLIENT_VERSION = 143; // Important! Depends on web server android_version.txt to check for an updated version
public static boolean F_SHOWING_KEYBOARD = false;
public static int C_STATUS_BAR = 0; // default to icons and text
public static boolean C_HOLD_AND_CHOOSE = true;
public static int C_LONG_PRESS_TIMER = 5; // default hold timer setting
public static int C_MENU_SIZE = 3; // default font choice
+1 -1
View File
@@ -1,3 +1,3 @@
#!/usr/bin/env bash
java -jar IdleRSC.jar --username "username" --password "password"
java -jar IdleRSC.jar
-3
View File
@@ -1,3 +0,0 @@
#!/usr/bin/env bash
java -jar IdleRSC.jar --username "username" --password "password"
@@ -30,50 +30,61 @@ public class MasterAdapter extends ClassVisitor {
int access, String name, String desc, String signature, String[] exceptions) {
MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
System.out.print("Visiting Method: " + className + "." + name + " " + desc);
String result = "";
// to show debug messages, uncomment this println
// todo debug mode
// System.out.print("Visiting Method: " + className + "." + name + " " + desc);
if (name.equals("drawUi") && desc.equals("(I)V")) {
System.out.println(" (Passing to DrawAdapter...)");
result = " (Passing to DrawAdapter...)";
mv = new DrawAdapter(mv);
} else if (name.equals("showMessage")
&& desc.equals(
"(ZLjava/lang/String;Ljava/lang/String;Lorsc/enumerations/MessageType;ILjava/lang/String;Ljava/lang/String;)V")) {
System.out.println(" (Passing to MessageAdapter...)");
result = " (Passing to MessageAdapter...)";
mv = new MessageAdapter(mv);
} else if (name.equals("updateNPCAppearances")) {
System.out.println(" (Passing to DamageAdapter...)");
result = " (Passing to DamageAdapter...)";
mv = new NPCDamageAdapter(mv);
} else if (name.equals("drawNearbyPlayers")) {
System.out.println(" (Passing to PlayerDamageAdapter...)");
result = " (Passing to PlayerDamageAdapter...)";
mv = new PlayerDamageAdapter(mv);
} else if (name.equals("sendCommandString")) {
System.out.println(" (Passing to CommandAdapter...)");
result = " (Passing to CommandAdapter...)";
mv = new CommandAdapter(mv);
} else if (name.equals("draw")
&& desc.equals("()V")
&& className.equals(
"orsc/mudclient")) { // we don't want to patch ORSCApplet's draw() method.
System.out.println(" (Passing to GraphicsAdapter...)");
result = " (Passing to GraphicsAdapter...)";
mv = new GraphicsAdapter(mv);
} else if (name.equals("showSleepScreen")) {
System.out.println(" (Passing to SleepAdapter...)");
result = " (Passing to SleepAdapter...)";
mv = new SleepAdapter(mv);
} else if (name.equals("setFatigueSleeping")) {
System.out.println(" (Passing to FatigueAdapter...)");
result = " (Passing to FatigueAdapter...)";
mv = new FatigueAdapter(mv);
} else if (name.equals("keyPressed")) {
System.out.println(" (Passing to KeyAdapter...)");
result = " (Passing to KeyAdapter...)";
mv = new KeyAdapter(mv);
} else if (name.equals("mouseWheelMoved")) {
System.out.println(" (Passing to ZoomAdapter...)");
result = " (Passing to ZoomAdapter...)";
mv = new ZoomAdapter(mv);
} else if (name.equals("logChat") && className.equals("orsc/mudclient")) {
System.out.println(" (Passing to LogChatAdapter...");
result = " (Passing to LogChatAdapter...";
mv = new LogChatAdapter(mv);
// } else if(name.equals("drawPlayer")) { //draws hp over player heads
// System.out.println(" (Passing to DrawPlayerAdapter...)");
// mv = new DrawPlayerAdapter(mv);
} else {
System.out.println(" (Skipped -- no patching needed)");
result = " (Skipped -- no patching needed)";
}
// to show debug messages, uncomment this println
// todo debug mode
// System.out.println(result);
return mv;
}
}