Merge remote-tracking branch 'upstream/master' into 2009-merge

This commit is contained in:
Owain van Brakel
2019-10-03 01:59:47 +02:00
17 changed files with 663 additions and 176 deletions

View File

@@ -32,7 +32,7 @@ ext {
apacheCommonsCompress = '1.19' apacheCommonsCompress = '1.19'
apacheCommonsCsv = '1.7' apacheCommonsCsv = '1.7'
apacheCommonsText = '1.8' apacheCommonsText = '1.8'
asm = '7.1' asm = '7.2'
commonsCli = '1.4' commonsCli = '1.4'
discord = '1.1' discord = '1.1'
fernflower = '07082019' fernflower = '07082019'
@@ -43,7 +43,7 @@ ext {
h2 = '1.4.199' h2 = '1.4.199'
hamcrest = '2.1' hamcrest = '2.1'
httpcore = '4.4.12' httpcore = '4.4.12'
httpmime = '4.5.9' httpmime = '4.5.10'
javassist = '3.25.0-GA' javassist = '3.25.0-GA'
javax = '1.3.2' javax = '1.3.2'
javaxInject = '1' javaxInject = '1'
@@ -59,15 +59,15 @@ ext {
jupiter = '5.5.2' jupiter = '5.5.2'
logback = '1.2.3' logback = '1.2.3'
lombok = '1.18.10' lombok = '1.18.10'
mapstruct = '1.3.0.Final' mapstruct = '1.3.1.Final'
mariadbJdbc = '2.4.4' mariadbJdbc = '2.4.4'
mavenPluginAnnotations = '3.6.0' mavenPluginAnnotations = '3.6.0'
mavenPluginApi = '3.6.2' mavenPluginApi = '3.6.2'
minio = '6.0.11' minio = '6.0.11'
mockito = '3.0.0' mockito = '3.1.0'
mongodbDriverSync = '3.11.0' mongodbDriverSync = '3.11.0'
mysqlConnectorJava = '8.0.17' mysqlConnectorJava = '8.0.17'
netty = '4.1.39.Final' netty = '4.1.42.Final'
okhttp3 = '4.2.0' okhttp3 = '4.2.0'
orangeExtensions = '1.0' orangeExtensions = '1.0'
petitparser = '2.2.0' petitparser = '2.2.0'
@@ -77,7 +77,7 @@ ext {
scribejava = '6.8.1' scribejava = '6.8.1'
sisu = '0.3.3' sisu = '0.3.3'
slf4j = '1.7.28' slf4j = '1.7.28'
springJdbc = '5.1.9.RELEASE' springJdbc = '5.2.0.RELEASE'
springboot = '2.1.8.RELEASE' springboot = '2.1.8.RELEASE'
sql2o = '1.6.0' sql2o = '1.6.0'
substance = '8.0.02' substance = '8.0.02'

View File

@@ -1,4 +1,8 @@
import org.apache.tools.ant.filters.ReplaceTokens import org.apache.tools.ant.filters.ReplaceTokens
import org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler
import java.nio.file.Files
import java.nio.file.Paths
import java.util.zip.ZipFile
plugins { plugins {
id "com.github.hauner.jarTest" version "1.0.1" id "com.github.hauner.jarTest" version "1.0.1"
@@ -6,6 +10,30 @@ plugins {
description = 'Deobfuscator' description = 'Deobfuscator'
def deobfuscatedJar = "${rootPath}/runescape-client/build/libs/rs-client-${project.version}.jar"
def unzipFile(String file, String dest)
{
def zipFile = new ZipFile(file)
zipFile.entries().each { it ->
def path = Paths.get(dest + File.separator + it.name)
if (it.directory)
{
Files.createDirectories(path)
}
else
{
def parentDir = path.getParent()
if (!Files.exists(parentDir))
{
Files.createDirectories(parentDir)
}
Files.copy(zipFile.getInputStream(it), path)
}
}
}
configurations { configurations {
deobjars deobjars
} }
@@ -48,3 +76,42 @@ processTestResources {
]) ])
} }
} }
task gamepackUpdate {
dependsOn ":deobfuscator:build"
dependsOn ":rs-client:build"
doLast {
def path = sourceSets.main.runtimeClasspath
def loader = new URLClassLoader(path.collect { f -> f.toURI().toURL() } as URL[])
def downloader = loader.loadClass('net.runelite.gamepack.Downloader')
def clientVersion = loader.loadClass('net.runelite.deob.clientver.ClientVersionMain')
def deob = loader.loadClass('net.runelite.deob.Deob')
def mappings = loader.loadClass('net.runelite.deob.updater.UpdateMappings')
String gamepack = downloader.gamepack()
int version = clientVersion.version(gamepack)
String gamepackVersion = gamepack.replace("gamepack.jar", "gamepack-" + version + ".jar")
String gamepackDeob = gamepack.replace("gamepack.jar", "gamepack-" + version + "-deob.jar")
String gamepackMappings = gamepack.replace("gamepack.jar", "gamepack-" + version + "-updated-mappings.jar")
String gamepackMappingsDecomp = gamepackMappings.replace(".jar", "-decomp")
String gamepackMappingsFern = gamepackMappingsDecomp + File.separator + gamepackMappings.split("/gamepack/")[1]
if (version == -1 || version == rsversion)
{
return
}
deob.main(gamepackVersion, gamepackDeob)
mappings.main(deobfuscatedJar, gamepackDeob, gamepackMappings)
new File(gamepackMappingsDecomp).mkdirs()
ConsoleDecompiler.main(gamepackMappings, gamepackMappingsDecomp)
unzipFile(gamepackMappingsFern, gamepackMappingsDecomp)
new File(gamepackMappingsFern).delete()
loader.close()
}
}

View File

@@ -49,6 +49,7 @@ public class VReturn extends Instruction implements ReturnInstruction
public InstructionContext execute(Frame frame) public InstructionContext execute(Frame frame)
{ {
InstructionContext ins = new InstructionContext(this, frame); InstructionContext ins = new InstructionContext(this, frame);
frame.stop(); frame.stop();

View File

@@ -30,8 +30,6 @@ import java.io.IOException;
import net.runelite.asm.ClassGroup; import net.runelite.asm.ClassGroup;
import net.runelite.asm.execution.Execution; import net.runelite.asm.execution.Execution;
import net.runelite.deob.deobfuscators.CastNull; import net.runelite.deob.deobfuscators.CastNull;
import net.runelite.deob.deobfuscators.StaticShouldBeInstance;
import net.runelite.deob.deobfuscators.constparam.ConstantParameter;
import net.runelite.deob.deobfuscators.EnumDeobfuscator; import net.runelite.deob.deobfuscators.EnumDeobfuscator;
import net.runelite.deob.deobfuscators.FieldInliner; import net.runelite.deob.deobfuscators.FieldInliner;
import net.runelite.deob.deobfuscators.IllegalStateExceptions; import net.runelite.deob.deobfuscators.IllegalStateExceptions;
@@ -39,6 +37,7 @@ import net.runelite.deob.deobfuscators.Lvt;
import net.runelite.deob.deobfuscators.Order; import net.runelite.deob.deobfuscators.Order;
import net.runelite.deob.deobfuscators.RenameUnique; import net.runelite.deob.deobfuscators.RenameUnique;
import net.runelite.deob.deobfuscators.RuntimeExceptions; import net.runelite.deob.deobfuscators.RuntimeExceptions;
import net.runelite.deob.deobfuscators.StaticShouldBeInstance;
import net.runelite.deob.deobfuscators.UnreachedCode; import net.runelite.deob.deobfuscators.UnreachedCode;
import net.runelite.deob.deobfuscators.UnusedClass; import net.runelite.deob.deobfuscators.UnusedClass;
import net.runelite.deob.deobfuscators.UnusedFields; import net.runelite.deob.deobfuscators.UnusedFields;
@@ -49,6 +48,7 @@ import net.runelite.deob.deobfuscators.arithmetic.MultiplicationDeobfuscator;
import net.runelite.deob.deobfuscators.arithmetic.MultiplyOneDeobfuscator; import net.runelite.deob.deobfuscators.arithmetic.MultiplyOneDeobfuscator;
import net.runelite.deob.deobfuscators.arithmetic.MultiplyZeroDeobfuscator; import net.runelite.deob.deobfuscators.arithmetic.MultiplyZeroDeobfuscator;
import net.runelite.deob.deobfuscators.cfg.ControlFlowDeobfuscator; import net.runelite.deob.deobfuscators.cfg.ControlFlowDeobfuscator;
import net.runelite.deob.deobfuscators.constparam.ConstantParameter;
import net.runelite.deob.deobfuscators.exprargorder.ExprArgOrder; import net.runelite.deob.deobfuscators.exprargorder.ExprArgOrder;
import net.runelite.deob.deobfuscators.menuaction.MenuActionDeobfuscator; import net.runelite.deob.deobfuscators.menuaction.MenuActionDeobfuscator;
import net.runelite.deob.deobfuscators.transformers.ClientErrorTransformer; import net.runelite.deob.deobfuscators.transformers.ClientErrorTransformer;

View File

@@ -25,6 +25,7 @@
package net.runelite.deob.clientver; package net.runelite.deob.clientver;
import com.google.common.io.Files;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@@ -36,4 +37,24 @@ public class ClientVersionMain
ClientVersion cv = new ClientVersion(jar); ClientVersion cv = new ClientVersion(jar);
System.out.println(cv.getVersion()); System.out.println(cv.getVersion());
} }
public static int version(String loc)
{
File jar = new File(loc);
ClientVersion cv = new ClientVersion(jar);
try
{
int version = cv.getVersion();
Files.move(jar, new File(loc.replace("gamepack.jar", "gamepack-" + version + ".jar")));
return version;
}
catch (IOException e)
{
e.printStackTrace();
}
return -1;
}
} }

View File

@@ -96,7 +96,7 @@ public class UpdateMappings
JarUtil.loadJar(new File(args[0])), JarUtil.loadJar(new File(args[0])),
JarUtil.loadJar(new File(args[1])) JarUtil.loadJar(new File(args[1]))
); );
u.update(); u.update();
u.save(new File(args[2])); u.save(new File(args[2]));
} }
} }

View File

@@ -0,0 +1,166 @@
package net.runelite.gamepack;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class Checker
{
private static final String GAME_URL = "http://oldschool1.runescape.com/";
private static final Split[] splits = {
new Split("document.write('archive=", 1),
new Split(" ');", 0)
};
static String getGamePack()
{
URL url;
try
{
url = new URL(GAME_URL);
}
catch (MalformedURLException e)
{
e.printStackTrace();
return null;
}
String content;
try
{
content = getContent(url);
}
catch (IOException e)
{
e.printStackTrace();
return null;
}
for (Split split : splits)
{
String[] str = splitAtFirst(content, split.splitAt);
content = str[split.index];
}
return content;
}
private static String[] splitAtFirst(String subject, String splitAt)
{
if (subject == null || subject.length() == 0)
{
return new String[]{"", ""};
}
if (splitAt == null || splitAt.length() == 0)
{
return new String[]{subject, ""};
}
char[] subjectArray = subject.toCharArray();
char[] split = splitAt.toCharArray();
StringBuilder builder = null;
for (int i = 0; i < subjectArray.length; i++)
{
char c = subjectArray[i];
if (builder == null && c == split[0])
{
builder = new StringBuilder();
}
if (builder != null)
{
builder.append(c);
if (startsWith(splitAt, builder.toString()))
{
if (builder.length() == splitAt.length())
{
return new String[]{subject.substring(0, i - builder.length() + 1), subject.substring(i + 1)};
}
}
else
{
builder = null;
}
}
}
return new String[]{subject, ""};
}
private static boolean startsWith(String subject, String start)
{
if (subject == null || subject.length() == 0 || start == null || start.length() == 0 || start.length() > subject.length())
{
return false;
}
char[] c1 = subject.toCharArray();
char[] c2 = start.toCharArray();
for (int i = 0; i < c2.length; i++)
{
if (c1[i] != c2[i])
{
return false;
}
}
return true;
}
private static String getContent(URL url) throws IOException
{
BufferedReader rd = null;
try
{
URLConnection conn = url.openConnection();
if (conn instanceof HttpURLConnection)
{
((HttpURLConnection) conn).setInstanceFollowRedirects(false);
}
HttpURLConnection.setFollowRedirects(false);
rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = rd.readLine()) != null)
{
sb.append(line);
sb.append('\n');
}
return sb.toString();
}
finally
{
if (rd != null)
{
rd.close();
}
}
}
public static class Split
{
public int index;
String splitAt;
Split(String splitAt, int index)
{
this.splitAt = splitAt;
this.index = index;
}
}
}

View File

@@ -0,0 +1,61 @@
package net.runelite.gamepack;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
public class Downloader
{
private static final String REPLACE = "%archive%";
private static final String GAMEPACK_URL = "http://oldschool1.runescape.com/" + REPLACE;
private static String getGamepackUrl()
{
String archive = Checker.getGamePack();
return archive == null ? "" : GAMEPACK_URL.replace(REPLACE, archive);
}
public static String gamepack()
{
Path path = Paths.get(System.getProperty("user.home"), "gamepack");
final File folder = new File(String.valueOf(path));
if (!folder.exists())
{
folder.mkdir();
}
downloadLatest(folder);
return path + File.separator + "gamepack.jar";
}
private static void downloadLatest(File folder)
{
File output = new File(folder, "gamepack.jar");
try
{
URL url = new URL(getGamepackUrl());
final URLDownloader downloader = new URLDownloader(url, output);
downloader.download();
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}

View File

@@ -0,0 +1,35 @@
package net.runelite.gamepack;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.ReadableByteChannel;
class URLDownloader
{
private URL url;
private File output;
URLDownloader(URL url, File output)
{
this.url = url;
this.output = output;
}
void download() throws IOException
{
this.downloadFromURL();
}
private void downloadFromURL() throws IOException
{
ReadableByteChannel rbc = Channels.newChannel(url.openStream());
FileOutputStream fos = new FileOutputStream(output);
FileChannel channel = fos.getChannel();
channel.transferFrom(rbc, 0, Long.MAX_VALUE);
}
}

View File

@@ -56,9 +56,9 @@ import net.runelite.mapping.Import;
import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSClient;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import net.runelite.injector.raw.HidePlayerAttacks;
// import net.runelite.injector.raw.DrawMenu; // import net.runelite.injector.raw.DrawMenu;
// import net.runelite.injector.raw.HidePlayerAttacks;
public class Inject public class Inject
{ {
@@ -319,7 +319,7 @@ public class Inject
new RenderDraw(this).inject(); new RenderDraw(this).inject();
// new DrawMenu(this).inject(); // new DrawMenu(this).inject();
new Occluder(this).inject(); new Occluder(this).inject();
// new HidePlayerAttacks(this).inject(); new HidePlayerAttacks(this).inject();
} }
private java.lang.Class injectInterface(ClassFile cf, ClassFile other) private java.lang.Class injectInterface(ClassFile cf, ClassFile other)

View File

@@ -160,6 +160,7 @@ public class HidePlayerAttacks
// add option n such // add option n such
Instructions ins = addPlayerOptions.getCode().getInstructions(); Instructions ins = addPlayerOptions.getCode().getInstructions();
log.info(String.valueOf(ins.getInstructions().size()));
ListIterator<Instruction> iterator = ins.getInstructions().listIterator(); ListIterator<Instruction> iterator = ins.getInstructions().listIterator();
while (iterator.hasNext()) while (iterator.hasNext())
{ {
@@ -169,22 +170,18 @@ public class HidePlayerAttacks
continue; continue;
} }
i = iterator.next();
while (!(i instanceof BiPush) || (byte) ((BiPush) i).getConstant() != 8)
{
i = iterator.next();
}
i = iterator.next(); i = iterator.next();
if (!(i instanceof IAnd)) if (!(i instanceof IAnd))
{ {
throw new InjectionException("Yikes I didn't expect this"); continue;
/*log.info(i.getClass().getName() + i.getClass().getSuperclass() + i.getType().getName() +
i.getType().getInstructionClass() + i.getInstructions() + i.toString());
throw new InjectionException("Yikes I didn't expect this");**/
} }
i = iterator.next();
if (!(i instanceof IfICmpNe)) if (!(i instanceof IfICmpNe))
{ {
throw new InjectionException("Yikes I didn't expect this"); continue;
} }
Label target = ((IfICmpNe) i).getJumps().get(0); Label target = ((IfICmpNe) i).getJumps().get(0);

View File

@@ -217,9 +217,16 @@ public class CoxPlugin extends Plugin
{ {
for (Player player : client.getPlayers()) for (Player player : client.getPlayers())
{ {
if (player.getName().equals(tpMatcher.group(1))) final String rawPlayerName = player.getName();
if (rawPlayerName != null)
{ {
victims.add(new Victim(player, Victim.Type.TELEPORT)); final String fixedPlayerName = Text.sanitize(rawPlayerName);
if (fixedPlayerName.equals(tpMatcher.group(1)))
{
victims.add(new Victim(player, Victim.Type.TELEPORT));
}
} }
} }
} }

View File

@@ -76,16 +76,18 @@ public class ItemChargePlugin extends Plugin
{ {
private static final Pattern DODGY_CHECK_PATTERN = Pattern.compile( private static final Pattern DODGY_CHECK_PATTERN = Pattern.compile(
"Your dodgy necklace has (\\d+) charges? left\\."); "Your dodgy necklace has (\\d+) charges? left\\.");
private static final Pattern SLAUGHTER_CHECK_PATTERN = Pattern.compile( private static final String CHAT_BRACELET_SLAUGHTER = "Your bracelet of slaughter prevents your slayer";
private static final Pattern CHAT_BRACELET_SLAUGHTER_REGEX = Pattern.compile(
"Your bracelet of slaughter prevents your slayer count decreasing. It has (\\d{1,2}) charge[s]? left.");
private static final String CHAT_BRACELET_EXPEDITIOUS = "Your expeditious bracelet helps you progress your";
private static final Pattern CHAT_BRACELET_EXPEDITIOUS_REGEX = Pattern.compile(
"Your expeditious bracelet helps you progress your slayer (?:task )?faster. It has (\\d{1,2}) charge[s]? left.");
private static final Pattern CHAT_BRACELET_SLAUGHTER_CHARGE_REGEX = Pattern.compile(
"Your bracelet of slaughter has (\\d{1,2}) charge[s]? left."); "Your bracelet of slaughter has (\\d{1,2}) charge[s]? left.");
private static final Pattern EXPEDITIOUS_CHECK_PATTERN = Pattern.compile( private static final Pattern CHAT_BRACELET_EXPEDITIOUS_CHARGE_REGEX = Pattern.compile(
"Your expeditious bracelet has (\\d{1,2}) charge[s]? left."); "Your expeditious bracelet has (\\d{1,2}) charge[s]? left.");
private static final Pattern DODGY_PROTECT_PATTERN = Pattern.compile( private static final Pattern DODGY_PROTECT_PATTERN = Pattern.compile(
"Your dodgy necklace protects you\\..*It has (\\d+) charges? left\\."); "Your dodgy necklace protects you\\..*It has (\\d+) charges? left\\.");
private static final Pattern SLAUGHTER_ACTIVATE_PATTERN = Pattern.compile(
"Your bracelet of slaughter prevents your slayer count decreasing. It has (\\d{1,2}) charge[s]? left.");
private static final Pattern EXPEDITIOUS_ACTIVATE_PATTERN = Pattern.compile(
"Your expeditious bracelet helps you progress your slayer (?:task )?faster. It has (\\d{1,2}) charge[s]? left.");
private static final Pattern DODGY_BREAK_PATTERN = Pattern.compile( private static final Pattern DODGY_BREAK_PATTERN = Pattern.compile(
"Your dodgy necklace protects you\\..*It then crumbles to dust\\."); "Your dodgy necklace protects you\\..*It then crumbles to dust\\.");
private static final String RING_OF_RECOIL_BREAK_MESSAGE = "<col=7f007f>Your Ring of Recoil has shattered.</col>"; private static final String RING_OF_RECOIL_BREAK_MESSAGE = "<col=7f007f>Your Ring of Recoil has shattered.</col>";
@@ -331,11 +333,7 @@ public class ItemChargePlugin extends Plugin
{ {
String message = event.getMessage(); String message = event.getMessage();
Matcher dodgyCheckMatcher = DODGY_CHECK_PATTERN.matcher(message); Matcher dodgyCheckMatcher = DODGY_CHECK_PATTERN.matcher(message);
Matcher slaughterCheckMatcher = SLAUGHTER_CHECK_PATTERN.matcher(message);
Matcher expeditiousCheckMatcher = EXPEDITIOUS_CHECK_PATTERN.matcher(message);
Matcher dodgyProtectMatcher = DODGY_PROTECT_PATTERN.matcher(message); Matcher dodgyProtectMatcher = DODGY_PROTECT_PATTERN.matcher(message);
Matcher slaughterActivateMatcher = SLAUGHTER_ACTIVATE_PATTERN.matcher(message);
Matcher expeditiousActivateMatcher = EXPEDITIOUS_ACTIVATE_PATTERN.matcher(message);
Matcher dodgyBreakMatcher = DODGY_BREAK_PATTERN.matcher(message); Matcher dodgyBreakMatcher = DODGY_BREAK_PATTERN.matcher(message);
Matcher bindingNecklaceCheckMatcher = BINDING_CHECK_PATTERN.matcher(event.getMessage()); Matcher bindingNecklaceCheckMatcher = BINDING_CHECK_PATTERN.matcher(event.getMessage());
Matcher bindingNecklaceUsedMatcher = BINDING_USED_PATTERN.matcher(event.getMessage()); Matcher bindingNecklaceUsedMatcher = BINDING_USED_PATTERN.matcher(event.getMessage());
@@ -347,6 +345,10 @@ public class ItemChargePlugin extends Plugin
Matcher chronicleLastChargeMatcher = CHRONICLE_LAST_CHARGE_PATTERN.matcher(message); Matcher chronicleLastChargeMatcher = CHRONICLE_LAST_CHARGE_PATTERN.matcher(message);
Matcher chronicleOutOfChargesMatcher = CHRONICLE_OUT_OF_CHARGES_PATTERN.matcher(message); Matcher chronicleOutOfChargesMatcher = CHRONICLE_OUT_OF_CHARGES_PATTERN.matcher(message);
Matcher ringOfForgingCheckMatcher = RING_OF_FORGING_CHECK_PATTERN.matcher(message); Matcher ringOfForgingCheckMatcher = RING_OF_FORGING_CHECK_PATTERN.matcher(message);
Matcher slaughterMatcher = CHAT_BRACELET_SLAUGHTER_REGEX.matcher(Text.removeTags(message));
Matcher expeditiousMatcher = CHAT_BRACELET_EXPEDITIOUS_REGEX.matcher(Text.removeTags(message));
Matcher slaughterChargeMatcher = CHAT_BRACELET_SLAUGHTER_CHARGE_REGEX.matcher(Text.removeTags(message));
Matcher expeditiousChargeMatcher = CHAT_BRACELET_EXPEDITIOUS_CHARGE_REGEX.matcher(Text.removeTags(message));
if (event.getType() == ChatMessageType.GAMEMESSAGE || event.getType() == ChatMessageType.SPAM) if (event.getType() == ChatMessageType.GAMEMESSAGE || event.getType() == ChatMessageType.SPAM)
{ {
@@ -354,30 +356,30 @@ public class ItemChargePlugin extends Plugin
{ {
notifier.notify("Your Ring of Recoil has shattered"); notifier.notify("Your Ring of Recoil has shattered");
} }
else if (Text.removeTags(message).startsWith(CHAT_BRACELET_SLAUGHTER))
{
updateBraceletOfSlaughterCharges(slaughterMatcher.find() ? Integer.parseInt(slaughterMatcher.group(1)) : MAX_SLAUGHTER_CHARGES);
}
else if (Text.removeTags(message).startsWith(CHAT_BRACELET_EXPEDITIOUS))
{
updateExpeditiousCharges(expeditiousMatcher.find() ? Integer.parseInt(expeditiousMatcher.group(1)) : MAX_EXPEDITIOUS_CHARGES);
}
else if (slaughterChargeMatcher.find())
{
updateBraceletOfSlaughterCharges(Integer.parseInt(slaughterChargeMatcher.group(1)));
}
else if (expeditiousChargeMatcher.find())
{
updateExpeditiousCharges(Integer.parseInt(expeditiousChargeMatcher.group(1)));
}
else if (dodgyCheckMatcher.find()) else if (dodgyCheckMatcher.find())
{ {
updateDodgyNecklaceCharges(Integer.parseInt(dodgyCheckMatcher.group(1))); updateDodgyNecklaceCharges(Integer.parseInt(dodgyCheckMatcher.group(1)));
} }
else if (slaughterCheckMatcher.find())
{
updateBraceletOfSlaughterCharges(Integer.parseInt(slaughterCheckMatcher.group(1)));
}
else if (expeditiousCheckMatcher.find())
{
updateExpeditiousCharges(Integer.parseInt(expeditiousCheckMatcher.group(1)));
}
else if (dodgyProtectMatcher.find()) else if (dodgyProtectMatcher.find())
{ {
updateDodgyNecklaceCharges(Integer.parseInt(dodgyProtectMatcher.group(1))); updateDodgyNecklaceCharges(Integer.parseInt(dodgyProtectMatcher.group(1)));
} }
else if (slaughterActivateMatcher.find())
{
updateBraceletOfSlaughterCharges(Integer.parseInt(slaughterActivateMatcher.group(1)));
}
else if (expeditiousActivateMatcher.find())
{
updateExpeditiousCharges(Integer.parseInt(expeditiousActivateMatcher.group(1)));
}
else if (dodgyBreakMatcher.find()) else if (dodgyBreakMatcher.find())
{ {
if (this.dodgyNotification) if (this.dodgyNotification)
@@ -955,4 +957,4 @@ public class ItemChargePlugin extends Plugin
this.chronicle = config.chronicle(); this.chronicle = config.chronicle();
this.showSackCharges = config.showSackCharges(); this.showSackCharges = config.showSackCharges();
} }
} }

View File

@@ -31,7 +31,6 @@ import java.awt.Graphics2D;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -124,10 +123,12 @@ public class PlayerIndicatorsOverlay extends Overlay
{ {
if (clanManager.getRank(actor.getName()) != null) if (clanManager.getRank(actor.getName()) != null)
{ {
OverlayUtil.renderActorTextAndImage(graphics, actor, builtString, color, final BufferedImage clanRankImage = clanManager.getClanImage(clanManager.getRank(actor.getName()));
ImageUtil.resizeImage(Objects.requireNonNull(clanManager if (clanRankImage != null)
.getClanImage(clanManager.getRank(actor.getName()))), y, y), 0, ACTOR_HORIZONTAL_TEXT_MARGIN); {
return; OverlayUtil.renderActorTextAndImage(graphics, actor, builtString, color,
ImageUtil.resizeImage(clanRankImage, y, y), 0, ACTOR_HORIZONTAL_TEXT_MARGIN);
}
} }
} }

View File

@@ -393,8 +393,7 @@ public class SlayerPlugin extends Plugin
currentTask.setPaused(true); currentTask.setPaused(true);
break; break;
case LOGGED_IN: case LOGGED_IN:
if (loginTick && this.amount != -1 if (loginTick && this.amount != -1 && !this.taskName.isEmpty() && currentTask.getTaskName() == null)
&& !this.taskName.isEmpty())
{ {
setTask(this.taskName, this.amount, this.initialAmount, true, this.taskLocation, this.lastCertainAmount, false); setTask(this.taskName, this.amount, this.initialAmount, true, this.taskLocation, this.lastCertainAmount, false);
} }
@@ -753,6 +752,7 @@ public class SlayerPlugin extends Plugin
} }
final Task task = Task.getTask(taskName); final Task task = Task.getTask(taskName);
int delta = slayerExp - cachedXp;
// null tasks are technically valid, it only means they arent explicitly defined in the Task enum // null tasks are technically valid, it only means they arent explicitly defined in the Task enum
// allow them through so that if there is a task capture failure the counter will still work // allow them through so that if there is a task capture failure the counter will still work
@@ -762,7 +762,7 @@ public class SlayerPlugin extends Plugin
// to the expected exp gain for the task. // to the expected exp gain for the task.
if (taskKillExp == 0 || taskKillExp == slayerExp - cachedXp) if (taskKillExp == 0 || taskKillExp == slayerExp - cachedXp)
{ {
killedOne(); killedOne(delta);
} }
else else
{ {
@@ -780,9 +780,7 @@ public class SlayerPlugin extends Plugin
int killCount = estimateKillCount(potentialNPCs, gains); int killCount = estimateKillCount(potentialNPCs, gains);
for (int i = 0; i < killCount; i++) for (int i = 0; i < killCount; i++)
{ {
killedOne(); killedOne(delta);
int delta = slayerExp - cachedXp;
currentTask.setElapsedXp(currentTask.getElapsedXp() + delta);
} }
} }
@@ -822,25 +820,28 @@ public class SlayerPlugin extends Plugin
private void onConfigChanged(ConfigChanged event) private void onConfigChanged(ConfigChanged event)
{ {
if (!event.getGroup().equals("slayer") || !event.getKey().equals("infobox")) if (!event.getGroup().equals("slayer"))
{ {
return; return;
} }
updateConfig(); updateConfig();
if (this.showInfobox) if (event.getKey().equals("infobox"))
{ {
clientThread.invoke(this::addCounter); if (this.showInfobox)
} {
else clientThread.invoke(this::addCounter);
{ }
removeCounter(); else
{
removeCounter();
}
} }
} }
@VisibleForTesting @VisibleForTesting
private void killedOne() private void killedOne(int delta)
{ {
if (currentTask.getAmount() == 0) if (currentTask.getAmount() == 0)
{ {
@@ -849,6 +850,7 @@ public class SlayerPlugin extends Plugin
currentTask.setAmount(currentTask.getAmount() - 1); currentTask.setAmount(currentTask.getAmount() - 1);
currentTask.setElapsedKills(currentTask.getElapsedKills() + 1); currentTask.setElapsedKills(currentTask.getElapsedKills() + 1);
currentTask.setElapsedXp(currentTask.getElapsedXp() + delta);
if (doubleTroubleExtraKill()) if (doubleTroubleExtraKill())
{ {
currentTask.setAmount(currentTask.getAmount() - 1); currentTask.setAmount(currentTask.getAmount() - 1);
@@ -1208,31 +1210,13 @@ public class SlayerPlugin extends Plugin
client.refreshChat(); client.refreshChat();
} }
void pointsLookup(ChatMessage chatMessage, String message) private void pointsLookup(ChatMessage chatMessage, String message)
{ {
if (!this.pointsCommand) if (!this.pointsCommand)
{ {
return; return;
} }
ChatMessageType type = chatMessage.getType();
final String player;
if (type.equals(ChatMessageType.PRIVATECHATOUT))
{
player = client.getLocalPlayer().getName();
}
else
{
player = Text.removeTags(chatMessage.getName())
.replace('\u00A0', ' ');
}
if (Integer.toString(getPoints()) == null)
{
return;
}
String response = new ChatMessageBuilder() String response = new ChatMessageBuilder()
.append(ChatColorType.NORMAL) .append(ChatColorType.NORMAL)
.append("Slayer Points: ") .append("Slayer Points: ")
@@ -1313,7 +1297,7 @@ public class SlayerPlugin extends Plugin
return str.substring(0, 1).toUpperCase() + str.substring(1); return str.substring(0, 1).toUpperCase() + str.substring(1);
} }
void setPoints(int points) private void setPoints(int points)
{ {
this.points = points; this.points = points;
this.cachedPoints = points; this.cachedPoints = points;

View File

@@ -37,7 +37,7 @@ public class WildernessLocationsMapOverlay extends Overlay
{ {
setPosition(OverlayPosition.DYNAMIC); setPosition(OverlayPosition.DYNAMIC);
setPriority(OverlayPriority.HIGH); setPriority(OverlayPriority.HIGH);
setLayer(OverlayLayer.ALWAYS_ON_TOP); setLayer(OverlayLayer.ABOVE_MAP);
this.client = client; this.client = client;
this.plugin = plugin; this.plugin = plugin;
} }

View File

@@ -5801,16 +5801,7 @@
"combatLevel": 66, "combatLevel": 66,
"slayerLevel": 1, "slayerLevel": 1,
"attackSpeed": 15, "attackSpeed": 15,
"attackLevel": 90, "magic": 70
"strengthLevel": 90,
"defenceLevel": 90,
"rangeLevel": 1,
"magicLevel": 70,
"magic": 70,
"stabDef": 40,
"slashDef": 90,
"crushDef": 90,
"magicDef": 34
}, },
"800": { "800": {
"name": "Locust rider", "name": "Locust rider",
@@ -6958,18 +6949,6 @@
"rangeLevel": 1, "rangeLevel": 1,
"magicLevel": 1 "magicLevel": 1
}, },
"1038": {
"name": "Monkey",
"hitpoints": 6,
"combatLevel": 3,
"slayerLevel": 1,
"attackSpeed": 4,
"attackLevel": 2,
"strengthLevel": 3,
"defenceLevel": 2,
"rangeLevel": 1,
"magicLevel": 1
},
"1039": { "1039": {
"name": "Albino bat", "name": "Albino bat",
"hitpoints": 33, "hitpoints": 33,
@@ -8168,7 +8147,9 @@
"strengthLevel": 35, "strengthLevel": 35,
"defenceLevel": 35, "defenceLevel": 35,
"rangeLevel": 30, "rangeLevel": 30,
"magicLevel": 10 "magicLevel": 10,
"poisonImmune": true,
"venomImmune": true
}, },
"1369": { "1369": {
"name": "Air elemental", "name": "Air elemental",
@@ -11839,24 +11820,6 @@
"crushDef": 175, "crushDef": 175,
"rangeDef": 250 "rangeDef": 250
}, },
"2263": {
"name": "Bardur",
"hitpoints": 99,
"combatLevel": 94,
"attackSpeed": 6,
"attackLevel": 99,
"strengthLevel": 40,
"defenceLevel": 99,
"rangeLevel": 1,
"magicLevel": 1,
"stabDef": 150,
"slashDef": 150,
"crushDef": 150,
"rangeDef": 150,
"magicDef": 150,
"bonusAttack": 100,
"bonusStrength": 100
},
"2264": { "2264": {
"name": "Dagannoth fledgeling", "name": "Dagannoth fledgeling",
"hitpoints": 100, "hitpoints": 100,
@@ -13681,7 +13644,9 @@
"strengthLevel": 1, "strengthLevel": 1,
"defenceLevel": 1, "defenceLevel": 1,
"rangeLevel": 1, "rangeLevel": 1,
"magicLevel": 1 "magicLevel": 1,
"poisonImmune": true,
"venomImmune": true
}, },
"2791": { "2791": {
"name": "Cow", "name": "Cow",
@@ -13693,7 +13658,9 @@
"strengthLevel": 1, "strengthLevel": 1,
"defenceLevel": 1, "defenceLevel": 1,
"rangeLevel": 1, "rangeLevel": 1,
"magicLevel": 1 "magicLevel": 1,
"poisonImmune": true,
"venomImmune": true
}, },
"2792": { "2792": {
"name": "Cow calf", "name": "Cow calf",
@@ -13717,7 +13684,9 @@
"strengthLevel": 1, "strengthLevel": 1,
"defenceLevel": 1, "defenceLevel": 1,
"rangeLevel": 1, "rangeLevel": 1,
"magicLevel": 1 "magicLevel": 1,
"poisonImmune": true,
"venomImmune": true
}, },
"2794": { "2794": {
"name": "Cow calf", "name": "Cow calf",
@@ -13741,7 +13710,9 @@
"strengthLevel": 1, "strengthLevel": 1,
"defenceLevel": 1, "defenceLevel": 1,
"rangeLevel": 1, "rangeLevel": 1,
"magicLevel": 1 "magicLevel": 1,
"poisonImmune": true,
"venomImmune": true
}, },
"2801": { "2801": {
"name": "Cow calf", "name": "Cow calf",
@@ -16031,7 +16002,7 @@
"hitpoints": 20, "hitpoints": 20,
"combatLevel": 18, "combatLevel": 18,
"slayerLevel": 1, "slayerLevel": 1,
"attackSpeed": 6, "attackSpeed": 4,
"attackLevel": 12, "attackLevel": 12,
"strengthLevel": 16, "strengthLevel": 16,
"defenceLevel": 19, "defenceLevel": 19,
@@ -18716,26 +18687,6 @@
"rangeLevel": 1, "rangeLevel": 1,
"magicLevel": 1 "magicLevel": 1
}, },
"3897": {
"name": "Koschei the deathless",
"hitpoints": 79,
"attackSpeed": 4
},
"3898": {
"name": "Koschei the deathless",
"hitpoints": 79,
"attackSpeed": 4
},
"3899": {
"name": "Koschei the deathless",
"hitpoints": 79,
"attackSpeed": 4
},
"3900": {
"name": "Koschei the deathless",
"hitpoints": 79,
"attackSpeed": 4
},
"3901": { "3901": {
"name": "Fox", "name": "Fox",
"hitpoints": 30, "hitpoints": 30,
@@ -18877,18 +18828,6 @@
"magicLevel": 1, "magicLevel": 1,
"bonusStrength": 20 "bonusStrength": 20
}, },
"3942": {
"name": "Freygerd",
"hitpoints": 50,
"combatLevel": 48,
"attackSpeed": 4,
"attackLevel": 40,
"strengthLevel": 40,
"defenceLevel": 40,
"rangeLevel": 1,
"magicLevel": 1,
"bonusStrength": 20
},
"3943": { "3943": {
"name": "Lensa", "name": "Lensa",
"hitpoints": 50, "hitpoints": 50,
@@ -22127,7 +22066,7 @@
"hitpoints": 15, "hitpoints": 15,
"combatLevel": 13, "combatLevel": 13,
"slayerLevel": 1, "slayerLevel": 1,
"attackSpeed": 6, "attackSpeed": 4,
"attackLevel": 10, "attackLevel": 10,
"strengthLevel": 10, "strengthLevel": 10,
"defenceLevel": 12, "defenceLevel": 12,
@@ -25428,7 +25367,9 @@
"strengthLevel": 1, "strengthLevel": 1,
"defenceLevel": 1, "defenceLevel": 1,
"rangeLevel": 1, "rangeLevel": 1,
"magicLevel": 1 "magicLevel": 1,
"poisonImmune": true,
"venomImmune": true
}, },
"5848": { "5848": {
"name": "Tanglefoot", "name": "Tanglefoot",
@@ -27385,10 +27326,15 @@
}, },
"6340": { "6340": {
"name": "Cow (hard)", "name": "Cow (hard)",
"hitpoints": 8, "hitpoints": 160,
"combatLevel": 170, "combatLevel": 170,
"slayerLevel": 1, "slayerLevel": 1,
"attackSpeed": 4 "attackSpeed": 4,
"attackLevel": 200,
"strengthLevel": 200,
"defenceLevel": 1,
"rangeLevel": 1,
"magicLevel": 1
}, },
"6342": { "6342": {
"name": "Barrelchest", "name": "Barrelchest",
@@ -28249,7 +28195,9 @@
"strengthLevel": 1, "strengthLevel": 1,
"defenceLevel": 1, "defenceLevel": 1,
"rangeLevel": 1, "rangeLevel": 1,
"magicLevel": 1 "magicLevel": 1,
"poisonImmune": true,
"venomImmune": true
}, },
"6402": { "6402": {
"name": "Mosquito swarm", "name": "Mosquito swarm",
@@ -29533,7 +29481,7 @@
"hitpoints": 130, "hitpoints": 130,
"combatLevel": 80, "combatLevel": 80,
"slayerLevel": 1, "slayerLevel": 1,
"attackSpeed": 6, "attackSpeed": 4,
"attackLevel": 55, "attackLevel": 55,
"strengthLevel": 60, "strengthLevel": 60,
"defenceLevel": 50, "defenceLevel": 50,
@@ -35559,6 +35507,7 @@
"name": "Galvek", "name": "Galvek",
"hitpoints": 1200, "hitpoints": 1200,
"combatLevel": 608, "combatLevel": 608,
"attackSpeed": 6,
"attackLevel": 632, "attackLevel": 632,
"strengthLevel": 268, "strengthLevel": 268,
"defenceLevel": 188, "defenceLevel": 188,
@@ -35575,12 +35524,14 @@
"bonusRangeStrength": 6, "bonusRangeStrength": 6,
"bonusMagicDamage": 42, "bonusMagicDamage": 42,
"poisonImmune": true, "poisonImmune": true,
"venomImmune": true "venomImmune": true,
"dragon": true
}, },
"8095": { "8095": {
"name": "Galvek", "name": "Galvek",
"hitpoints": 1200, "hitpoints": 1200,
"combatLevel": 608, "combatLevel": 608,
"attackSpeed": 6,
"attackLevel": 632, "attackLevel": 632,
"strengthLevel": 268, "strengthLevel": 268,
"defenceLevel": 188, "defenceLevel": 188,
@@ -35597,7 +35548,8 @@
"bonusRangeStrength": 6, "bonusRangeStrength": 6,
"bonusMagicDamage": 42, "bonusMagicDamage": 42,
"poisonImmune": true, "poisonImmune": true,
"venomImmune": true "venomImmune": true,
"dragon": true
}, },
"8096": { "8096": {
"name": "Galvek", "name": "Galvek",
@@ -35753,6 +35705,7 @@
"name": "Galvek", "name": "Galvek",
"hitpoints": 1200, "hitpoints": 1200,
"combatLevel": 608, "combatLevel": 608,
"attackSpeed": 6,
"attackLevel": 632, "attackLevel": 632,
"strengthLevel": 268, "strengthLevel": 268,
"defenceLevel": 188, "defenceLevel": 188,
@@ -35769,7 +35722,8 @@
"bonusRangeStrength": 6, "bonusRangeStrength": 6,
"bonusMagicDamage": 42, "bonusMagicDamage": 42,
"poisonImmune": true, "poisonImmune": true,
"venomImmune": true "venomImmune": true,
"dragon": true
}, },
"8178": { "8178": {
"name": "Galvek", "name": "Galvek",
@@ -38227,5 +38181,196 @@
"bonusAttack": 14, "bonusAttack": 14,
"bonusStrength": 28, "bonusStrength": 28,
"bonusRangeStrength": 28 "bonusRangeStrength": 28
},
"9258": {
"name": "Basilisk Sentinel",
"hitpoints": 460,
"combatLevel": 351,
"slayerLevel": 40,
"attackSpeed": 4,
"attackLevel": 274,
"strengthLevel": 274,
"defenceLevel": 274,
"rangeLevel": 1,
"magicLevel": 274,
"stabDef": 40,
"slashDef": 40,
"magicDef": 40
},
"9282": {
"name": "Basilisk Youngling",
"hitpoints": 60,
"combatLevel": 57,
"slayerLevel": 40,
"attackSpeed": 4,
"attackLevel": 25,
"strengthLevel": 40,
"defenceLevel": 70,
"rangeLevel": 1,
"magicLevel": 1,
"stabDef": 20,
"slashDef": 20,
"magicDef": 20
},
"9287": {
"name": "Monstrous Basilisk",
"hitpoints": 170,
"combatLevel": 135,
"attackSpeed": 4,
"attackLevel": 88,
"strengthLevel": 98,
"defenceLevel": 130,
"rangeLevel": 1,
"magicLevel": 1,
"stabDef": 35,
"slashDef": 35,
"magicDef": 35,
"poisonImmune": true,
"venomImmune": true
},
"9288": {
"name": "Monstrous Basilisk",
"hitpoints": 170,
"combatLevel": 135,
"attackSpeed": 4,
"attackLevel": 88,
"strengthLevel": 98,
"defenceLevel": 130,
"rangeLevel": 1,
"magicLevel": 1,
"stabDef": 35,
"slashDef": 35,
"magicDef": 35,
"poisonImmune": true,
"venomImmune": true
},
"9289": {
"name": "The Jormungand",
"hitpoints": 600,
"combatLevel": 363,
"slayerLevel": 40,
"attackSpeed": 5,
"attackLevel": 180,
"strengthLevel": 180,
"defenceLevel": 180,
"rangeLevel": 180,
"magicLevel": 180,
"stabDef": 50,
"slashDef": 50,
"crushDef": 10,
"rangeDef": 50,
"magicDef": 50,
"bonusStrength": 12,
"bonusRangeStrength": 12,
"bonusMagicDamage": 12
},
"9290": {
"name": "The Jormungand",
"hitpoints": 600,
"combatLevel": 363,
"slayerLevel": 40,
"attackSpeed": 5,
"attackLevel": 180,
"strengthLevel": 180,
"defenceLevel": 180,
"rangeLevel": 180,
"magicLevel": 180,
"stabDef": 50,
"slashDef": 50,
"crushDef": 10,
"rangeDef": 50,
"magicDef": 50,
"bonusStrength": 12,
"bonusRangeStrength": 12,
"bonusMagicDamage": 12
},
"9291": {
"name": "The Jormungand",
"hitpoints": 600,
"combatLevel": 363,
"slayerLevel": 40,
"attackSpeed": 5,
"attackLevel": 180,
"strengthLevel": 180,
"defenceLevel": 180,
"rangeLevel": 180,
"magicLevel": 180,
"stabDef": 50,
"slashDef": 50,
"crushDef": 10,
"rangeDef": 50,
"magicDef": 50,
"bonusStrength": 12,
"bonusRangeStrength": 12,
"bonusMagicDamage": 12
},
"9292": {
"name": "The Jormungand",
"hitpoints": 600,
"combatLevel": 363,
"slayerLevel": 40,
"attackSpeed": 5,
"attackLevel": 180,
"strengthLevel": 180,
"defenceLevel": 180,
"rangeLevel": 180,
"magicLevel": 180,
"stabDef": 50,
"slashDef": 50,
"crushDef": 10,
"rangeDef": 50,
"magicDef": 50,
"bonusStrength": 12,
"bonusRangeStrength": 12,
"bonusMagicDamage": 12
},
"9293": {
"name": "Basilisk Knight",
"hitpoints": 200,
"combatLevel": 182,
"slayerLevel": 40,
"attackSpeed": 4,
"attackLevel": 150,
"strengthLevel": 150,
"defenceLevel": 150,
"rangeLevel": 1,
"magicLevel": 150,
"stabDef": 25,
"slashDef": 25,
"magicDef": 25
},
"9295": {
"name": "Typhor",
"hitpoints": 280,
"combatLevel": 194,
"slayerLevel": 40,
"attackSpeed": 4,
"attackLevel": 150,
"strengthLevel": 150,
"defenceLevel": 150,
"rangeLevel": 1,
"magicLevel": 150,
"stabDef": 25,
"slashDef": 25,
"magicDef": 25,
"poisonImmune": true,
"venomImmune": true
},
"9296": {
"name": "Typhor",
"hitpoints": 280,
"combatLevel": 194,
"slayerLevel": 40,
"attackSpeed": 4,
"attackLevel": 150,
"strengthLevel": 150,
"defenceLevel": 150,
"rangeLevel": 1,
"magicLevel": 150,
"stabDef": 25,
"slashDef": 25,
"magicDef": 25,
"poisonImmune": true,
"venomImmune": true
} }
} }