Merge pull request #3114 from open-osrs/🥲🔫

This commit is contained in:
Owain van Brakel
2022-01-20 00:40:36 +01:00
committed by GitHub
104 changed files with 3620 additions and 1340 deletions
+2 -2
View File
@@ -25,9 +25,9 @@
object ProjectVersions {
const val launcherVersion = "2.2.0"
const val rlVersion = "1.8.9"
const val rlVersion = "1.8.10"
const val openosrsVersion = "4.18.2"
const val openosrsVersion = "4.19.0"
const val rsversion = 202
const val cacheversion = 165
+14 -14
View File
@@ -24,8 +24,8 @@
*/
package net.runelite.cache.util;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import net.runelite.cache.io.InputStream;
import net.runelite.cache.io.OutputStream;
public class Xtea
{
@@ -42,13 +42,13 @@ public class Xtea
public byte[] encrypt(byte[] data, int len)
{
ByteBuf buf = Unpooled.wrappedBuffer(data, 0, len);
ByteBuf out = Unpooled.buffer(len);
InputStream in = new InputStream(data);
OutputStream out = new OutputStream(len);
int numBlocks = len / 8;
for (int block = 0; block < numBlocks; ++block)
{
int v0 = buf.readInt();
int v1 = buf.readInt();
int v0 = in.readInt();
int v1 = in.readInt();
int sum = 0;
for (int i = 0; i < ROUNDS; ++i)
{
@@ -59,19 +59,19 @@ public class Xtea
out.writeInt(v0);
out.writeInt(v1);
}
out.writeBytes(buf);
return out.array();
out.writeBytes(in.getRemaining());
return out.flip();
}
public byte[] decrypt(byte[] data, int len)
{
ByteBuf buf = Unpooled.wrappedBuffer(data, 0, len);
ByteBuf out = Unpooled.buffer(len);
InputStream in = new InputStream(data);
OutputStream out = new OutputStream(len);
int numBlocks = len / 8;
for (int block = 0; block < numBlocks; ++block)
{
int v0 = buf.readInt();
int v1 = buf.readInt();
int v0 = in.readInt();
int v1 = in.readInt();
int sum = GOLDEN_RATIO * ROUNDS;
for (int i = 0; i < ROUNDS; ++i)
{
@@ -82,7 +82,7 @@ public class Xtea
out.writeInt(v0);
out.writeInt(v1);
}
out.writeBytes(buf);
return out.array();
out.writeBytes(in.getRemaining());
return out.flip();
}
}
@@ -35,11 +35,12 @@ import org.objectweb.asm.Opcodes;
public class CopyRuneLiteClasses extends AbstractInjector
{
private static final List<String> RUNELITE_OBJECTS = List.of(
"RuneLiteObject",
"RuneLiteClanMember",
"RuneLiteIterableLinkDeque",
"RuneLiteIterableNodeDeque",
"RuneLiteIterableNodeHashTable",
"RuneLiteMenuEntry"
"RuneLiteMenuEntry",
"RuneLiteObject"
);
public CopyRuneLiteClasses(InjectData inject)
@@ -280,6 +280,18 @@ public interface Actor extends Renderable, Locatable
*/
void setGraphic(int graphic);
/**
* Get the height of the graphic/spotanim on the actor
* @return
*/
int getGraphicHeight();
/**
* Set the height of the graphic/spotanim on the actor
* @param height
*/
void setGraphicHeight(int height);
/**
* Get the frame of the currently playing spotanim
*
@@ -205,6 +205,7 @@ public final class AnimationID
public static final int LEAGUE_HOME_TELEPORT_5 = 8805;
public static final int LEAGUE_HOME_TELEPORT_6 = 8807;
public static final int RAID_LIGHT_ANIMATION = 3101;
public static final int LOOTBEAM_ANIMATION = 9260;
public static final int CONSTRUCTION = 3676;
public static final int CONSTRUCTION_IMCANDO = 8912;
@@ -173,9 +173,9 @@ public enum ChatMessageType
*/
CLAN_CREATION_INVITATION(109),
/**
* Clan wars challenge for clans rather than FCs
* Challenge offer for the clan tab
*/
CLAN_CLAN_WARS_CHALLENGE(110),
CHALREQ_CLANCHAT(110),
CLAN_GIM_FORM_GROUP(111),
CLAN_GIM_GROUP_WITH(112),
@@ -468,6 +468,11 @@ public interface Client extends GameEngine
*/
IndexDataBase getIndexConfig();
/**
* Gets an index by id
*/
IndexDataBase getIndex(int id);
/**
* Returns the x-axis base coordinate.
* <p>
@@ -1103,19 +1108,39 @@ public interface Client extends GameEngine
@Nullable
LocalPoint getLocalDestinationLocation();
/**
* Create a projectile.
* @param id projectile/spotanim id
* @param plane plane the projectile is on
* @param startX local x coordinate the projectile starts at
* @param startY local y coordinate the projectile starts at
* @param startZ local z coordinate the projectile starts at - includes tile height
* @param startCycle cycle the project starts
* @param endCycle cycle the projectile ends
* @param slope
* @param startHeight start height of projectile - excludes tile height
* @param endHeight end height of projectile - excludes tile height
* @param target optional actor target
* @param targetX target x - if an actor target is supplied should be the target x
* @param targetY taret y - if an actor target is supplied should be the target y
* @return the new projectile
*/
Projectile createProjectile(int id, int plane, int startX, int startY, int startZ, int startCycle, int endCycle,
int slope, int startHeight, int endHeight, @Nullable Actor target, int targetX, int targetY);
/**
* Gets a list of all projectiles currently spawned.
*
* @return all projectiles
*/
List<Projectile> getProjectiles();
Deque<Projectile> getProjectiles();
/**
* Gets a list of all graphics objects currently drawn.
*
* @return all graphics objects
*/
List<GraphicsObject> getGraphicsObjects();
Deque<GraphicsObject> getGraphicsObjects();
/**
* Creates a RuneLiteObject, which is a modified {@link GraphicsObject}
@@ -1123,7 +1148,26 @@ public interface Client extends GameEngine
RuneLiteObject createRuneLiteObject();
/**
* Loads a model from the cache
* Loads an unlit model from the cache. The returned model shares
* data such as faces, face colors, face transparencies, and vertex points with
* other models. If you want to mutate these you MUST call the relevant {@code cloneX}
* method.
*
* @see ModelData#cloneColors()
*
* @param id the ID of the model
* @return the model or null if it is loading or nonexistent
*/
@Nullable
ModelData loadModelData(int id);
ModelData mergeModels(ModelData[] models, int length);
ModelData mergeModels(ModelData ...models);
/**
* Loads and lights a model from the cache
*
* This is equivalent to {@code loadModelData(id).light()}
*
* @param id the ID of the model
* @return the model or null if it is loading or nonexistent
@@ -29,6 +29,12 @@ package net.runelite.api;
*/
public interface Deque<T> extends Iterable<T>
{
/**
* Add a new element to the end of the deque
* @param t the element
*/
void addLast(T t);
/**
* clear the deque
*/
@@ -28,9 +28,11 @@ package net.runelite.api;
public final class GraphicID
{
public static final int WINE_MAKE = 47;
public static final int CANNONBALL = 53;
public static final int SPLASH = 85;
public static final int GREY_BUBBLE_TELEPORT = 86;
public static final int TELEPORT = 111;
public static final int TELEKINETIC_SPELL = 143;
public static final int ENTANGLE = 179;
public static final int SNARE = 180;
public static final int BIND = 181;
@@ -54,8 +56,93 @@ public final class GraphicID
public static final int OLM_LIGHTNING = 1356;
public static final int OLM_TELEPORT = 1359;
public static final int OLM_HEAL = 1363;
public static final int GRANITE_CANNONBALL = 1443;
public static final int OLM_CRYSTAL = 1447;
public static final int XERIC_TELEPORT = 1612;
public static final int HYDRA_LIGHTNING = 1666;
public static final int GRAPHICS_OBJECT_ROCKFALL = 1727;
public static final int ZALCANO_PROJECTILE_FIREBALL = 1728;
public static final int LIZARDMAN_SHAMAN_AOE = 1293;
public static final int CRAZY_ARCHAEOLOGIST_AOE = 1260;
public static final int ICE_DEMON_RANGED_AOE = 1324;
public static final int ICE_DEMON_ICE_BARRAGE_AOE = 366;
public static final int VASA_AWAKEN_AOE = 1327;
public static final int VASA_RANGED_AOE = 1329;
public static final int TEKTON_METEOR_AOE = 660;
public static final int OLM_FALLING_CRYSTAL = 1357;
public static final int OLM_BURNING = 1349;
public static final int OLM_FALLING_CRYSTAL_TRAIL = 1352;
public static final int OLM_ACID_TRAIL = 1354;
public static final int OLM_FIRE_LINE = 1347;
public static final int OLM_MAGE_ATTACK = 1339;
public static final int OLM_RANGE_ATTACK = 1340;
public static final int VORKATH_BOMB_AOE = 1481;
public static final int VORKATH_POISON_POOL_AOE = 1483;
public static final int VORKATH_TICK_FIRE_AOE = 1482;
public static final int VORKATH_SPAWN_AOE = 1484;
public static final int ADDY_DRAG_POISON = 1486;
public static final int GALVEK_MINE = 1495;
public static final int GALVEK_BOMB = 1491;
public static final int DAWN_FREEZE = 1445;
public static final int DUSK_CEILING = 1435;
public static final int VETION_LIGHTNING = 280;
public static final int CHAOS_FANATIC_AOE = 551;
public static final int CORPOREAL_BEAST_AOE = 315;
public static final int CORPOREAL_BEAST_DARK_CORE_AOE = 319;
public static final int WINTERTODT_SNOW_FALL_AOE = 1310;
public static final int DEMONIC_GORILLA_RANGED = 1302;
public static final int DEMONIC_GORILLA_MAGIC = 1304;
public static final int DEMONIC_GORILLA_BOULDER = 856;
public static final int XARPUS_ACID = 1555;
public static final int VERZIK_PURPLE_SPAWN = 1586;
public static final int CERB_FIRE = 1247;
public static final int DERWEN_HEALING_BALL = 1512;
public static final int JUSTICIAR_LEASH = 1515;
public static final int MAGE_ARENA_BOSS_FREEZE = 368;
/**
* missing: superior dark beast
*/
public static final int MARBLE_GARGOYLE_AOE = 1453;
/**
* non AOE, regular projectiles
*/
public static final int VORKATH_DRAGONBREATH = 393;
public static final int VORKATH_RANGED = 1477;
public static final int VORKATH_MAGIC = 1479;
public static final int VORKATH_PRAYER_DISABLE = 1471;
public static final int VORKATH_VENOM = 1470;
public static final int VORKATH_ICE = 395;
public static final int SOTETSEG_BOMB = 1604;
public static final int SOTETSEG_RANGE = 1607;
public static final int SOTETSEG_MAGE = 1606;
public static final int HYDRA_MAGIC = 1662;
public static final int HYDRA_RANGED = 1663;
public static final int HYDRA_POISON = 1644;
public static final int HYDRA_LIGHTNING = 1664;
public static final int HYDRA_LIGHTNING_2 = 1665;
public static final int DRAKE_BREATH = 1637;
public static final int HUNLLEF_MAGE_ATTACK = 1707;
public static final int HUNLLEF_CORRUPTED_MAGE_ATTACK = 1708;
public static final int HUNLLEF_RANGE_ATTACK = 1711;
public static final int HUNLLEF_CORRUPTED_RANGE_ATTACK = 1712;
public static final int HUNLLEF_PRAYER_ATTACK = 1713;
public static final int HUNLLEF_CORRUPTED_PRAYER_ATTACK = 1714;
public static final int PORAZDIR_ENERGY_BALL = 1514;
}
@@ -72,4 +72,10 @@ public interface GraphicsObject extends Renderable
* @return
*/
boolean finished();
/**
* Set if this spotanim is done animating. If finished, the spotanim will despawn next frame.
* @param finished
*/
void setFinished(boolean finished);
}
@@ -49,9 +49,9 @@ public interface IndexDataBase
int[][] getFileIds();
byte[] getFile(int groupId, int fileId);
int getGroupFileCount(int groupId);
int[] getFileCounts();
byte[] loadData(int archiveID, int fileID);
}
@@ -12284,5 +12284,69 @@ public final class ItemID
public static final int BLOOD_ESSENCE = 26390;
public static final int BLOOD_ESSENCE_ACTIVE = 26392;
public static final int BANDOSIAN_COMPONENTS = 26394;
public static final int CABBAGE_26417 = 26417;
public static final int CABBAGE_26419 = 26419;
public static final int SHATTERED_RELICS_VARIETY_ORNAMENT_KIT = 26421;
public static final int SHATTERED_BANNER = 26424;
public static final int SHATTERED_HOOD_T1 = 26427;
public static final int SHATTERED_TOP_T1 = 26430;
public static final int SHATTERED_TROUSERS_T1 = 26433;
public static final int SHATTERED_BOOTS_T1 = 26436;
public static final int SHATTERED_HOOD_T2 = 26439;
public static final int SHATTERED_TOP_T2 = 26442;
public static final int SHATTERED_TROUSERS_T2 = 26445;
public static final int SHATTERED_BOOTS_T2 = 26448;
public static final int SHATTERED_HOOD_T3 = 26451;
public static final int SHATTERED_TOP_T3 = 26454;
public static final int SHATTERED_TROUSERS_T3 = 26457;
public static final int SHATTERED_BOOTS_T3 = 26460;
public static final int VOID_KNIGHT_TOP_OR = 26463;
public static final int VOID_KNIGHT_ROBE_OR = 26465;
public static final int VOID_KNIGHT_GLOVES_OR = 26467;
public static final int ELITE_VOID_TOP_OR = 26469;
public static final int ELITE_VOID_ROBE_OR = 26471;
public static final int VOID_MAGE_HELM_OR = 26473;
public static final int VOID_RANGER_HELM_OR = 26475;
public static final int VOID_MELEE_HELM_OR = 26477;
public static final int SHATTERED_RELICS_VOID_ORNAMENT_KIT = 26479;
public static final int ABYSSAL_WHIP_OR = 26482;
public static final int ABYSSAL_TENTACLE_OR = 26484;
public static final int RUNE_CROSSBOW_OR = 26486;
public static final int BOOK_OF_BALANCE_OR = 26488;
public static final int BOOK_OF_DARKNESS_OR = 26490;
public static final int BOOK_OF_LAW_OR = 26492;
public static final int BOOK_OF_WAR_OR = 26494;
public static final int HOLY_BOOK_OR = 26496;
public static final int UNHOLY_BOOK_OR = 26498;
public static final int SHATTERED_TELEPORT_SCROLL = 26500;
public static final int SHATTERED_RELICS_BRONZE_TROPHY = 26503;
public static final int SHATTERED_RELICS_IRON_TROPHY = 26505;
public static final int SHATTERED_RELICS_STEEL_TROPHY = 26507;
public static final int SHATTERED_RELICS_MITHRIL_TROPHY = 26509;
public static final int SHATTERED_RELICS_ADAMANT_TROPHY = 26511;
public static final int SHATTERED_RELICS_RUNE_TROPHY = 26513;
public static final int SHATTERED_RELICS_DRAGON_TROPHY = 26515;
public static final int SHATTERED_CANE = 26517;
public static final int CANNON_BASE_OR = 26520;
public static final int CANNON_STAND_OR = 26522;
public static final int CANNON_BARRELS_OR = 26524;
public static final int CANNON_FURNACE_OR = 26526;
public static final int SHATTERED_CANNON_ORNAMENT_KIT = 26528;
public static final int MYSTIC_HAT_OR = 26531;
public static final int MYSTIC_ROBE_TOP_OR = 26533;
public static final int MYSTIC_ROBE_BOTTOM_OR = 26535;
public static final int MYSTIC_GLOVES_OR = 26537;
public static final int MYSTIC_BOOTS_OR = 26539;
public static final int SHATTERED_RELICS_MYSTIC_ORNAMENT_KIT = 26541;
public static final int UNIDENTIFIED_FRAGMENT_HARVESTING = 26544;
public static final int UNIDENTIFIED_FRAGMENT_PRODUCTION = 26545;
public static final int UNIDENTIFIED_FRAGMENT_SKILLING = 26546;
public static final int UNIDENTIFIED_FRAGMENT_COMBAT = 26547;
public static final int UNIDENTIFIED_FRAGMENT_MISC = 26548;
public static final int PORTABLE_WAYSTONE = 26549;
public static final int ARCANE_GRIMOIRE = 26551;
public static final int SHATTERED_RELIC_HUNTER_T1_ARMOUR_SET = 26554;
public static final int SHATTERED_RELIC_HUNTER_T2_ARMOUR_SET = 26557;
public static final int SHATTERED_RELIC_HUNTER_T3_ARMOUR_SET = 26560;
/* This file is automatically generated. Do not edit. */
}
@@ -28,11 +28,35 @@ import java.awt.Color;
public final class JagexColor
{
public static final int HUE_MAX = 63;
public static final int SATURATION_MAX = 7;
public static final int LUMINANCE_MAX = 127;
public static short packHSL(int hue, int saturation, int luminance)
{
return (short) ((short) (hue & 63) << 10
| (short) (saturation & 7) << 7
| (short) (luminance & 127));
return (short) ((short) (hue & HUE_MAX) << 10
| (short) (saturation & SATURATION_MAX) << 7
| (short) (luminance & LUMINANCE_MAX));
}
public static int unpackHue(short hsl)
{
return hsl >> 10 & HUE_MAX;
}
public static int unpackSaturation(short hsl)
{
return hsl >> 7 & SATURATION_MAX;
}
public static int unpackLuminance(short hsl)
{
return hsl & LUMINANCE_MAX;
}
public static String formatHSL(short hsl)
{
return String.format("%02Xh%Xs%02Xl", unpackHue(hsl), unpackSaturation(hsl), unpackLuminance(hsl));
}
public static short rgbToHSL(int rgb, double brightness)
@@ -0,0 +1,91 @@
/*
* Copyright (c) 2022 Abex
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.api;
import java.util.List;
import net.runelite.api.model.Triangle;
import net.runelite.api.model.Vertex;
/**
* A {@link Model} or {@link ModelData}
*/
public interface Mesh<T extends Mesh<T>>
{
/**
* Gets a list of all vertices of the model.
*
* @return the vertices
*/
List<Vertex> getVertices();
/**
* Gets a list of all triangles of the model.
*
* @return the triangle
*/
List<Triangle> getTriangles();
int getVerticesCount();
int[] getVerticesX();
int[] getVerticesY();
int[] getVerticesZ();
int getFaceCount();
int[] getFaceIndices1();
int[] getFaceIndices2();
int[] getFaceIndices3();
byte[] getFaceTransparencies();
short[] getFaceTextures();
/**
* Rotates this model 90 degrees around the vertical axis.
* {@link ModelData#cloneVertices()} should be called before calling this method
*/
T rotateY90Ccw();
/**
* Rotates this model 180 degrees around the vertical axis.
* {@link ModelData#cloneVertices()} should be called before calling this method
*/
T rotateY180Ccw();
/**
* Rotates this model 270 degrees around the vertical axis.
* {@link ModelData#cloneVertices()} should be called before calling this method
*/
T rotateY270Ccw();
/**
* Offsets this model by the passed amount (1/128ths of a tile).
* {@link ModelData#cloneVertices()} should be called before calling this method
*/
T translate(int x, int y, int z);
/**
* Resizes this model by the passed amount (1/128ths).
* {@link ModelData#cloneVertices()} should be called before calling this method
*/
T scale(int x, int y, int z);
}
@@ -24,53 +24,17 @@
*/
package net.runelite.api;
import net.runelite.api.model.Triangle;
import net.runelite.api.model.Vertex;
import java.util.List;
/**
* Represents the model of an object.
*/
public interface Model extends Renderable
public interface Model extends Mesh, Renderable
{
/**
* Gets a list of all vertices of the model.
*
* @return the vertices
*/
List<Vertex> getVertices();
/**
* Gets a list of all triangles of the model.
*
* @return the triangle
*/
List<Triangle> getTriangles();
int getVerticesCount();
int[] getVerticesX();
int[] getVerticesY();
int[] getVerticesZ();
int getFaceCount();
int[] getFaceIndices1();
int[] getFaceIndices2();
int[] getFaceIndices3();
int[] getFaceColors1();
int[] getFaceColors2();
int[] getFaceColors3();
byte[] getFaceTransparencies();
int getSceneId();
void setSceneId(int sceneId);
@@ -88,8 +52,6 @@ public interface Model extends Renderable
int getRadius();
short[] getFaceTextures();
float[] getFaceTextureUVCoordinates();
void calculateExtreme(int orientation);
@@ -0,0 +1,98 @@
/*
* Copyright (c) 2022 Abex
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.api;
/**
* An unlit model
*/
public interface ModelData extends Mesh<ModelData>, Renderable
{
int DEFAULT_AMBIENT = 64;
int DEFAULT_CONTRAST = 768;
int DEFAULT_X = -50;
int DEFAULT_Y = -10;
int DEFAULT_Z = -50;
/**
* Gets colors as Jagex HSL
*
* @see JagexColor
*/
short[] getFaceColors();
/**
* Lights a model.
*
* The produced model shares verticies, face transparencies, face indicies, and textures with
* the underlying ModelData. If any of these may be mutated the corresponding {@code cloneX}
* method should be called before {@code light}ing
*/
Model light(int ambient, int contrast, int x, int y, int z);
/**
* Lights a model with default values
*
* @see #light(int, int, int, int, int)
*/
Model light();
/**
* Applies a recolor using Jagex's HSL format. You should call {@link #cloneColors()} ()} before calling
* this method
*/
ModelData recolor(short colorToReplace, short colorToReplaceWith);
/**
* Applies a retexture, changing texture ids. You should call {@link #cloneTextures()} before calling
* this method
*/
ModelData retexture(short find, short replace);
/**
* Shallow-copies a model. Does not copy any arrays, which are still shared with this object.
*/
ModelData shallowCopy();
/**
* Clones {@link #getVerticesX()}, {@link #getVerticesY()}, and {@link #getVerticesZ()} so
* they can be safely mutated
*/
ModelData cloneVertices();
/**
* Clones {@link #getFaceColors()} so they can be safely mutated
*/
ModelData cloneColors();
/**
* Clones {@link #getFaceTextures()} so they can be safely mutated
*/
ModelData cloneTextures();
/**
* Clones {@link #getFaceTransparencies()} so they can be safely mutated
*/
ModelData cloneTransparencies();
}
@@ -9477,31 +9477,9 @@ public final class NpcID
public static final int REGENT = 11229;
public static final int GROUP_STORAGE_TUTOR = 11230;
public static final int GROUP_IRON_TUTOR = 11231;
public static final int TINY_SNOWBALL = 11232;
public static final int MINI_SNOWBALL = 11233;
public static final int LITTLE_SNOWBALL = 11234;
public static final int SMALL_SNOWBALL = 11235;
public static final int NORMAL_SNOWBALL = 11236;
public static final int BIG_SNOWBALL = 11237;
public static final int LARGE_SNOWBALL = 11238;
public static final int HUGE_SNOWBALL = 11239;
public static final int HUMONGOUS_SNOWBALL = 11240;
public static final int BUOY = 11241;
public static final int GURL = 11242;
public static final int BUOY_11243 = 11243;
public static final int GURL_11244 = 11244;
public static final int HERQUIN_11245 = 11245;
public static final int CECILIA_11247 = 11247;
public static final int LARRY_11248 = 11248;
public static final int SANTAS_THRONE = 11249;
public static final int SANTA = 11250;
public static final int WAYNE_11251 = 11251;
public static final int WYSON_THE_GARDENER_11252 = 11252;
public static final int HAIRDRESSER_11254 = 11254;
public static final int SIR_VYVIN_11255 = 11255;
public static final int XI_PLZPETDOGZ_XIX = 11259;
public static final int DRAKE_11260 = 11260;
public static final int DUCK_11261 = 11261;
public static final int THE_SAGE = 11232;
public static final int LEAGUE_TUTOR = 11233;
public static final int LEAGUES_ASSISTANT_11234 = 11234;
public static final int NEXLING = 11276;
public static final int NEXLING_11277 = 11277;
public static final int NEX = 11278;
@@ -9521,5 +9499,6 @@ public final class NpcID
public static final int SPIRITUAL_MAGE_11292 = 11292;
public static final int BLOOD_REAVER = 11293;
public static final int BLOOD_REAVER_11294 = 11294;
public static final int GULL_11297 = 11297;
/* This file is automatically generated. Do not edit. */
}
@@ -13901,5 +13901,108 @@ public final class NullItemID
public static final int NULL_26391 = 26391;
public static final int NULL_26393 = 26393;
public static final int NULL_26395 = 26395;
public static final int NULL_26396 = 26396;
public static final int NULL_26397 = 26397;
public static final int NULL_26398 = 26398;
public static final int NULL_26399 = 26399;
public static final int NULL_26400 = 26400;
public static final int NULL_26401 = 26401;
public static final int NULL_26402 = 26402;
public static final int NULL_26403 = 26403;
public static final int NULL_26404 = 26404;
public static final int NULL_26405 = 26405;
public static final int NULL_26406 = 26406;
public static final int NULL_26407 = 26407;
public static final int NULL_26408 = 26408;
public static final int NULL_26409 = 26409;
public static final int NULL_26410 = 26410;
public static final int NULL_26411 = 26411;
public static final int NULL_26412 = 26412;
public static final int NULL_26413 = 26413;
public static final int NULL_26414 = 26414;
public static final int NULL_26415 = 26415;
public static final int NULL_26416 = 26416;
public static final int NULL_26418 = 26418;
public static final int NULL_26420 = 26420;
public static final int NULL_26422 = 26422;
public static final int NULL_26423 = 26423;
public static final int NULL_26425 = 26425;
public static final int NULL_26426 = 26426;
public static final int NULL_26428 = 26428;
public static final int NULL_26429 = 26429;
public static final int NULL_26431 = 26431;
public static final int NULL_26432 = 26432;
public static final int NULL_26434 = 26434;
public static final int NULL_26435 = 26435;
public static final int NULL_26437 = 26437;
public static final int NULL_26438 = 26438;
public static final int NULL_26440 = 26440;
public static final int NULL_26441 = 26441;
public static final int NULL_26443 = 26443;
public static final int NULL_26444 = 26444;
public static final int NULL_26446 = 26446;
public static final int NULL_26447 = 26447;
public static final int NULL_26449 = 26449;
public static final int NULL_26450 = 26450;
public static final int NULL_26452 = 26452;
public static final int NULL_26453 = 26453;
public static final int NULL_26455 = 26455;
public static final int NULL_26456 = 26456;
public static final int NULL_26458 = 26458;
public static final int NULL_26459 = 26459;
public static final int NULL_26461 = 26461;
public static final int NULL_26462 = 26462;
public static final int NULL_26464 = 26464;
public static final int NULL_26466 = 26466;
public static final int NULL_26468 = 26468;
public static final int NULL_26470 = 26470;
public static final int NULL_26472 = 26472;
public static final int NULL_26474 = 26474;
public static final int NULL_26476 = 26476;
public static final int NULL_26478 = 26478;
public static final int NULL_26480 = 26480;
public static final int NULL_26481 = 26481;
public static final int NULL_26483 = 26483;
public static final int NULL_26485 = 26485;
public static final int NULL_26487 = 26487;
public static final int NULL_26489 = 26489;
public static final int NULL_26491 = 26491;
public static final int NULL_26493 = 26493;
public static final int NULL_26495 = 26495;
public static final int NULL_26497 = 26497;
public static final int NULL_26499 = 26499;
public static final int NULL_26501 = 26501;
public static final int NULL_26502 = 26502;
public static final int NULL_26504 = 26504;
public static final int NULL_26506 = 26506;
public static final int NULL_26508 = 26508;
public static final int NULL_26510 = 26510;
public static final int NULL_26512 = 26512;
public static final int NULL_26514 = 26514;
public static final int NULL_26516 = 26516;
public static final int NULL_26518 = 26518;
public static final int NULL_26519 = 26519;
public static final int NULL_26521 = 26521;
public static final int NULL_26523 = 26523;
public static final int NULL_26525 = 26525;
public static final int NULL_26527 = 26527;
public static final int NULL_26529 = 26529;
public static final int NULL_26530 = 26530;
public static final int NULL_26532 = 26532;
public static final int NULL_26534 = 26534;
public static final int NULL_26536 = 26536;
public static final int NULL_26538 = 26538;
public static final int NULL_26540 = 26540;
public static final int NULL_26542 = 26542;
public static final int NULL_26543 = 26543;
public static final int NULL_26550 = 26550;
public static final int NULL_26552 = 26552;
public static final int NULL_26553 = 26553;
public static final int NULL_26555 = 26555;
public static final int NULL_26556 = 26556;
public static final int NULL_26558 = 26558;
public static final int NULL_26559 = 26559;
public static final int NULL_26561 = 26561;
public static final int NULL_26562 = 26562;
/* This file is automatically generated. Do not edit. */
}
@@ -1738,25 +1738,12 @@ public final class NullNpcID
public static final int NULL_11222 = 11222;
public static final int NULL_11223 = 11223;
public static final int NULL_11224 = 11224;
public static final int NULL_11246 = 11246;
public static final int NULL_11235 = 11235;
public static final int NULL_11236 = 11236;
public static final int NULL_11253 = 11253;
public static final int NULL_11256 = 11256;
public static final int NULL_11257 = 11257;
public static final int NULL_11258 = 11258;
public static final int NULL_11262 = 11262;
public static final int NULL_11263 = 11263;
public static final int NULL_11264 = 11264;
public static final int NULL_11265 = 11265;
public static final int NULL_11266 = 11266;
public static final int NULL_11267 = 11267;
public static final int NULL_11268 = 11268;
public static final int NULL_11269 = 11269;
public static final int NULL_11270 = 11270;
public static final int NULL_11271 = 11271;
public static final int NULL_11272 = 11272;
public static final int NULL_11273 = 11273;
public static final int NULL_11274 = 11274;
public static final int NULL_11275 = 11275;
public static final int NULL_11295 = 11295;
public static final int NULL_11296 = 11296;
/* This file is automatically generated. Do not edit. */
@@ -21006,18 +21006,7 @@ public final class NullObjectID
public static final int NULL_42849 = 42849;
public static final int NULL_42850 = 42850;
public static final int NULL_42851 = 42851;
public static final int NULL_42873 = 42873;
public static final int NULL_42874 = 42874;
public static final int NULL_42875 = 42875;
public static final int NULL_42876 = 42876;
public static final int NULL_42877 = 42877;
public static final int NULL_42882 = 42882;
public static final int NULL_42883 = 42883;
public static final int NULL_42884 = 42884;
public static final int NULL_42893 = 42893;
public static final int NULL_42894 = 42894;
public static final int NULL_42896 = 42896;
public static final int NULL_42897 = 42897;
public static final int NULL_42853 = 42853;
public static final int NULL_42898 = 42898;
public static final int NULL_42899 = 42899;
public static final int NULL_42900 = 42900;
@@ -21040,12 +21029,6 @@ public final class NullObjectID
public static final int NULL_42919 = 42919;
public static final int NULL_42920 = 42920;
public static final int NULL_42921 = 42921;
public static final int NULL_42922 = 42922;
public static final int NULL_42923 = 42923;
public static final int NULL_42924 = 42924;
public static final int NULL_42925 = 42925;
public static final int NULL_42926 = 42926;
public static final int NULL_42927 = 42927;
public static final int NULL_42945 = 42945;
public static final int NULL_42946 = 42946;
public static final int NULL_42947 = 42947;
@@ -21068,5 +21051,60 @@ public final class NullObjectID
public static final int NULL_42964 = 42964;
public static final int NULL_42967 = 42967;
public static final int NULL_42968 = 42968;
public static final int NULL_42991 = 42991;
public static final int NULL_43000 = 43000;
public static final int NULL_43001 = 43001;
public static final int NULL_43002 = 43002;
public static final int NULL_43032 = 43032;
public static final int NULL_43033 = 43033;
public static final int NULL_43034 = 43034;
public static final int NULL_43035 = 43035;
public static final int NULL_43036 = 43036;
public static final int NULL_43037 = 43037;
public static final int NULL_43038 = 43038;
public static final int NULL_43039 = 43039;
public static final int NULL_43040 = 43040;
public static final int NULL_43041 = 43041;
public static final int NULL_43042 = 43042;
public static final int NULL_43043 = 43043;
public static final int NULL_43044 = 43044;
public static final int NULL_43045 = 43045;
public static final int NULL_43046 = 43046;
public static final int NULL_43047 = 43047;
public static final int NULL_43048 = 43048;
public static final int NULL_43049 = 43049;
public static final int NULL_43050 = 43050;
public static final int NULL_43051 = 43051;
public static final int NULL_43052 = 43052;
public static final int NULL_43053 = 43053;
public static final int NULL_43054 = 43054;
public static final int NULL_43055 = 43055;
public static final int NULL_43056 = 43056;
public static final int NULL_43057 = 43057;
public static final int NULL_43058 = 43058;
public static final int NULL_43059 = 43059;
public static final int NULL_43060 = 43060;
public static final int NULL_43061 = 43061;
public static final int NULL_43062 = 43062;
public static final int NULL_43063 = 43063;
public static final int NULL_43064 = 43064;
public static final int NULL_43065 = 43065;
public static final int NULL_43066 = 43066;
public static final int NULL_43067 = 43067;
public static final int NULL_43068 = 43068;
public static final int NULL_43069 = 43069;
public static final int NULL_43070 = 43070;
public static final int NULL_43071 = 43071;
public static final int NULL_43072 = 43072;
public static final int NULL_43073 = 43073;
public static final int NULL_43074 = 43074;
public static final int NULL_43075 = 43075;
public static final int NULL_43076 = 43076;
public static final int NULL_43077 = 43077;
public static final int NULL_43078 = 43078;
public static final int NULL_43079 = 43079;
public static final int NULL_43082 = 43082;
public static final int NULL_43083 = 43083;
public static final int NULL_43084 = 43084;
/* This file is automatically generated. Do not edit. */
}
@@ -21832,49 +21832,66 @@ public final class ObjectID
public static final int FROZEN_DOOR = 42840;
public static final int FROZEN_DOOR_42841 = 42841;
public static final int GOLD_SINK_42852 = 42852;
public static final int SIGN_42853 = 42853;
public static final int SCUFFED_SNOW = 42854;
public static final int SNOWMAN = 42855;
public static final int SNOWMAN_42856 = 42856;
public static final int SNOWMAN_42857 = 42857;
public static final int SNOWMAN_42858 = 42858;
public static final int SNOWMAN_42859 = 42859;
public static final int SNOWMAN_42860 = 42860;
public static final int SNOWMAN_42861 = 42861;
public static final int SNOWMAN_42862 = 42862;
public static final int SNOWMAN_42863 = 42863;
public static final int SNOWMAN_42864 = 42864;
public static final int SPADE_42865 = 42865;
public static final int PILE_OF_SNOW = 42866;
public static final int BUSH_42867 = 42867;
public static final int PILE_OF_SNOW_42868 = 42868;
public static final int PILE_OF_SNOW_42869 = 42869;
public static final int CHRISTMAS_TREE = 42870;
public static final int CHRISTMAS_TREE_42871 = 42871;
public static final int CHRISTMAS_TREE_42872 = 42872;
public static final int PRESENTS = 42878;
public static final int PRESENTS_42879 = 42879;
public static final int PRESENTS_42880 = 42880;
public static final int PRESENTS_42881 = 42881;
public static final int POTTED_TREE = 42885;
public static final int POTTED_TREE_42886 = 42886;
public static final int MARKET_STALL_42887 = 42887;
public static final int MARKET_STALL_42888 = 42888;
public static final int MARKET_STALL_42889 = 42889;
public static final int MARKET_STALL_42890 = 42890;
public static final int MARKET_STALL_42891 = 42891;
public static final int MARKET_STALL_42892 = 42892;
public static final int ROBIN = 42895;
public static final int CHEST_42854 = 42854;
public static final int DOOR_42855 = 42855;
public static final int ANCIENT_PLAQUE = 42856;
public static final int SCOREBOARD_42857 = 42857;
public static final int CHEST_42858 = 42858;
public static final int ANCIENT_FORGE = 42859;
public static final int ANVIL_42860 = 42860;
public static final int TROPHY_PEDESTAL_42861 = 42861;
public static final int TROPHY_PEDESTAL_42862 = 42862;
public static final int TROPHY_PEDESTAL_42863 = 42863;
public static final int TROPHY_PEDESTAL_42864 = 42864;
public static final int TROPHY_PEDESTAL_42865 = 42865;
public static final int TROPHY_PEDESTAL_42866 = 42866;
public static final int TROPHY_PEDESTAL_42867 = 42867;
public static final int ORNATE_TROPHY_PEDESTAL_42868 = 42868;
public static final int ORNATE_TROPHY_PEDESTAL_42869 = 42869;
public static final int ORNATE_TROPHY_PEDESTAL_42870 = 42870;
public static final int ORNATE_TROPHY_PEDESTAL_42871 = 42871;
public static final int ORNATE_TROPHY_PEDESTAL_42872 = 42872;
public static final int ORNATE_TROPHY_PEDESTAL_42873 = 42873;
public static final int ORNATE_TROPHY_PEDESTAL_42874 = 42874;
public static final int TROPHY_PEDESTAL_42875 = 42875;
public static final int TROPHY_PEDESTAL_42876 = 42876;
public static final int TROPHY_PEDESTAL_42877 = 42877;
public static final int TROPHY_PEDESTAL_42878 = 42878;
public static final int TROPHY_PEDESTAL_42879 = 42879;
public static final int TROPHY_PEDESTAL_42880 = 42880;
public static final int TROPHY_PEDESTAL_42881 = 42881;
public static final int ORNATE_TROPHY_PEDESTAL_42882 = 42882;
public static final int ORNATE_TROPHY_PEDESTAL_42883 = 42883;
public static final int ORNATE_TROPHY_PEDESTAL_42884 = 42884;
public static final int ORNATE_TROPHY_PEDESTAL_42885 = 42885;
public static final int ORNATE_TROPHY_PEDESTAL_42886 = 42886;
public static final int ORNATE_TROPHY_PEDESTAL_42887 = 42887;
public static final int ORNATE_TROPHY_PEDESTAL_42888 = 42888;
public static final int TROPHY_PEDESTAL_42889 = 42889;
public static final int TROPHY_PEDESTAL_42890 = 42890;
public static final int TROPHY_PEDESTAL_42891 = 42891;
public static final int TROPHY_PEDESTAL_42892 = 42892;
public static final int TROPHY_PEDESTAL_42893 = 42893;
public static final int TROPHY_PEDESTAL_42894 = 42894;
public static final int TROPHY_PEDESTAL_42895 = 42895;
public static final int ORNATE_TROPHY_PEDESTAL_42896 = 42896;
public static final int ORNATE_TROPHY_PEDESTAL_42897 = 42897;
public static final int DEAD_TREE_42907 = 42907;
public static final int DEAD_OAK_42908 = 42908;
public static final int SANTAS_SLEIGH = 42928;
public static final int SANTAS_THRONE = 42929;
public static final int SANTAS_SACK = 42930;
public static final int ORNATE_TROPHY_PEDESTAL_42922 = 42922;
public static final int ORNATE_TROPHY_PEDESTAL_42923 = 42923;
public static final int ORNATE_TROPHY_PEDESTAL_42924 = 42924;
public static final int ORNATE_TROPHY_PEDESTAL_42925 = 42925;
public static final int ORNATE_TROPHY_PEDESTAL_42926 = 42926;
public static final int BANNER_STAND_42927 = 42927;
public static final int ORNATE_BANNER_STAND_42928 = 42928;
public static final int OAK_OUTFIT_STAND_42929 = 42929;
public static final int OAK_OUTFIT_STAND_42930 = 42930;
public static final int FROZEN_DOOR_42931 = 42931;
public static final int FROZEN_DOOR_42932 = 42932;
public static final int DOOR_42933 = 42933;
public static final int DOOR_42934 = 42934;
public static final int ANCIENT_PLAQUE = 42935;
public static final int ANCIENT_PLAQUE_42935 = 42935;
public static final int SCOREBOARD_42936 = 42936;
public static final int ANCIENT_BARRIER = 42937;
public static final int ANCIENT_BARRIER_42938 = 42938;
@@ -21885,7 +21902,67 @@ public final class ObjectID
public static final int STALAGMITE_42943 = 42943;
public static final int STALAGMITE_42944 = 42944;
public static final int ALTAR_42965 = 42965;
public static final int ANCIENT_FORGE = 42966;
public static final int ANCIENT_FORGE_42966 = 42966;
public static final int BROKEN_CROSSBOW_42969 = 42969;
public static final int OAK_OUTFIT_STAND_42970 = 42970;
public static final int MAHOGANY_OUTFIT_STAND_42971 = 42971;
public static final int MAHOGANY_OUTFIT_STAND_42972 = 42972;
public static final int MAHOGANY_OUTFIT_STAND_42973 = 42973;
public static final int LOCK_42974 = 42974;
public static final int LOCK_42975 = 42975;
public static final int LOCK_42976 = 42976;
public static final int LOCK_42977 = 42977;
public static final int LOCK_42978 = 42978;
public static final int LOCK_42979 = 42979;
public static final int LOCK_42980 = 42980;
public static final int LOCK_42981 = 42981;
public static final int LOCK_42982 = 42982;
public static final int LOCK_42983 = 42983;
public static final int LOCK_42984 = 42984;
public static final int LOCK_42985 = 42985;
public static final int LOCK_42986 = 42986;
public static final int LOCK_42987 = 42987;
public static final int REPLACE_ME = 42988;
public static final int REPLACE_ME_42989 = 42989;
public static final int REPLACE_ME_42990 = 42990;
public static final int RUNESTONE_BASALT = 42992;
public static final int RUNESTONE_BASALT_42993 = 42993;
public static final int RUNESTONE_BASALT_42994 = 42994;
public static final int RUNESTONE_BASALT_42995 = 42995;
public static final int RUNESTONE_BASALT_42996 = 42996;
public static final int RUNESTONE_BASALT_42997 = 42997;
public static final int RUNESTONE_BASALT_42998 = 42998;
public static final int BOAT_42999 = 42999;
public static final int LUMBRIDGE_WAYSTONE = 43003;
public static final int LUMBRIDGE_WAYSTONE_43004 = 43004;
public static final int FALADOR_WAYSTONE = 43005;
public static final int FALADOR_WAYSTONE_43006 = 43006;
public static final int VARROCK_WAYSTONE = 43007;
public static final int VARROCK_WAYSTONE_43008 = 43008;
public static final int AL_KHARID_WAYSTONE = 43009;
public static final int AL_KHARID_WAYSTONE_43010 = 43010;
public static final int CATHERBY_WAYSTONE = 43011;
public static final int CATHERBY_WAYSTONE_43012 = 43012;
public static final int ARDOUGNE_WAYSTONE = 43013;
public static final int ARDOUGNE_WAYSTONE_43014 = 43014;
public static final int BRIMHAVEN_WAYSTONE = 43015;
public static final int BRIMHAVEN_WAYSTONE_43016 = 43016;
public static final int RELLEKKA_WAYSTONE = 43017;
public static final int RELLEKKA_WAYSTONE_43018 = 43018;
public static final int FEROX_ENCLAVE_WAYSTONE = 43019;
public static final int FEROX_ENCLAVE_WAYSTONE_43020 = 43020;
public static final int CANIFIS_WAYSTONE = 43021;
public static final int CANIFIS_WAYSTONE_43022 = 43022;
public static final int PRIFDDINAS_WAYSTONE = 43023;
public static final int PRIFDDINAS_WAYSTONE_43024 = 43024;
public static final int KOUREND_WAYSTONE = 43025;
public static final int KOUREND_WAYSTONE_43026 = 43026;
public static final int DWARF_MULTICANNON_43027 = 43027;
public static final int BROKEN_MULTICANNON_43028 = 43028;
public static final int CANNON_BASE_43029 = 43029;
public static final int CANNON_STAND_43030 = 43030;
public static final int CANNON_BARRELS_43031 = 43031;
public static final int RUNESTONE_BASALT_43080 = 43080;
public static final int RUNESTONE_BASALT_43081 = 43081;
/* This file is automatically generated. Do not edit. */
}
@@ -24,6 +24,8 @@
*/
package net.runelite.api;
import net.runelite.api.coords.LocalPoint;
/**
* Represents a projectile entity. (ie. cannonball, arrow)
*/
@@ -33,7 +35,7 @@ public interface Projectile extends Renderable
* Gets the ID of the projectile.
*
* @return the projectile ID
* @see ProjectileID
* @see GraphicID
*/
int getId();
@@ -44,6 +46,14 @@ public interface Projectile extends Renderable
*/
Actor getInteracting();
/**
* Get the target point of the projectile. For projectiles with an actor target,
* this is updated each frame to the actor position.
*
* @return
*/
LocalPoint getTarget();
/**
* Gets the original x-axis coordinate that this projectile started from.
*
@@ -84,7 +94,7 @@ public interface Projectile extends Renderable
*
* @return the start game cycle
*/
int getStartMovementCycle();
int getStartCycle();
/**
* Gets the game cycle that the projectile will reach its target at.
@@ -93,6 +103,15 @@ public interface Projectile extends Renderable
*/
int getEndCycle();
/**
* Sets the game cycle the projectile will reach its target at. The
* projectile automatically despawns after this time, and setting the
* end cycle to a time in the past is an effective way of removing the
* projectile.
* @param cycle
*/
void setEndCycle(int cycle);
/**
* Gets the remaining game cycles until the projectile reaches its
* target and despawns.
@@ -29,6 +29,7 @@ package net.runelite.api;
* <p>
* Note: This class is not complete and may be missing mapped IDs.
*/
@Deprecated
public final class ProjectileID
{
public static final int CANNONBALL = 53;
@@ -37,12 +37,6 @@ public interface TileItem extends Renderable
int getQuantity();
/**
* Time in game ticks when the item spawned (relative to us)
* @return
*/
int getSpawnTime();
/**
* @return the tile this item is on
*/
@@ -205,7 +205,38 @@ public enum VarPlayer
/**
* {@link NpcID} for the HP HUD
*/
HP_HUD_NPC_ID(1683);
HP_HUD_NPC_ID(1683),
/**
* Colors for chat messages
*/
SETTINGS_OPAQUE_CHAT_PUBLIC(2992),
SETTINGS_OPAQUE_CHAT_PRIVATE(2993),
SETTINGS_OPAQUE_CHAT_AUTO(2994),
SETTINGS_OPAQUE_CHAT_BROADCAST(2995),
SETTINGS_OPAQUE_CHAT_FRIEND(2996),
SETTINGS_OPAQUE_CHAT_CLAN(2997),
SETTINGS_OPAQUE_CHAT_GUEST_CLAN(3060),
SETTINGS_OPAQUE_CHAT_CLAN_BROADCAST(3192),
SETTINGS_OPAQUE_CHAT_IRON_GROUP_CHAT(3191),
SETTINGS_OPAQUE_CHAT_IRON_GROUP_BROADCAST(3193),
SETTINGS_OPAQUE_CHAT_TRADE_REQUEST(2998),
SETTINGS_OPAQUE_CHAT_CHALLENGE_REQUEST(2999),
SETTINGS_TRANSPARENT_CHAT_PUBLIC(3000),
SETTINGS_TRANSPARENT_CHAT_PRIVATE(3001),
SETTINGS_TRANSPARENT_CHAT_AUTO(3002),
SETTINGS_TRANSPARENT_CHAT_BROADCAST(3003),
SETTINGS_TRANSPARENT_CHAT_FRIEND(3004),
SETTINGS_TRANSPARENT_CHAT_CLAN(3005),
SETTINGS_TRANSPARENT_CHAT_GUEST_CLAN(3061),
SETTINGS_TRANSPARENT_CHAT_CLAN_BROADCAST(3195),
SETTINGS_TRANSPARENT_CHAT_IRON_GROUP_CHAT(3194),
SETTINGS_TRANSPARENT_CHAT_IRON_GROUP_BROADCAST(3196),
SETTINGS_TRANSPARENT_CHAT_TRADE_REQUEST(3006),
SETTINGS_TRANSPARENT_CHAT_CHALLENGE_REQUEST(3007),
;
private final int id;
}
@@ -24,21 +24,18 @@
*/
package net.runelite.api.clan;
import lombok.Value;
/**
* A member of a clan.
*/
@Value
public class ClanMember
public interface ClanMember
{
/**
* The clan member's name
*/
String name;
String getName();
/**
* The clan member's rank
*/
ClanRank rank;
ClanRank getRank();
}
@@ -185,6 +185,7 @@ public final class WidgetID
public static final int GRAVESTONE_GROUP_ID = 672;
public static final int POH_TREASURE_CHEST_INVENTORY_GROUP_ID = 674;
public static final int GROUP_IRON_GROUP_ID = 726;
public static final int GROUP_STORAGE_INVENTORY_GROUP_ID = 725;
public static final int GROUP_STORAGE_GROUP_ID = 724;
static class WorldMap
@@ -841,23 +842,23 @@ public final class WidgetID
public static class StandardSpellBook
{
static final int LUMBRIDGE_HOME_TELEPORT = 5;
public static final int KOUREND_HOME_TELEPORT = 4;
static final int LUMBRIDGE_HOME_TELEPORT = 6;
static final int KOUREND_HOME_TELEPORT = 4;
}
static class AncientSpellBook
{
static final int EDGEVILLE_HOME_TELEPORT = 99;
static final int EDGEVILLE_HOME_TELEPORT = 100;
}
static class LunarSpellBook
{
static final int LUNAR_HOME_TELEPORT = 100;
static final int LUNAR_HOME_TELEPORT = 101;
}
static class ArceuusSpellBook
{
static final int ARCEUUS_HOME_TELEPORT = 144;
static final int ARCEUUS_HOME_TELEPORT = 145;
}
static class Pvp
@@ -1093,198 +1094,198 @@ public final class WidgetID
static class SpellBook
{
static final int FILTERED_SPELLS_BOUNDS = 3;
static final int TOOLTIP = 189;
static final int TOOLTIP = 190;
// NORMAL SPELLS
static final int LUMBRIDGE_HOME_TELEPORT = 5;
static final int WIND_STRIKE = 6;
static final int CONFUSE = 7;
static final int ENCHANT_CROSSBOW_BOLT = 8;
static final int WATER_STRIKE = 9;
static final int LVL_1_ENCHANT = 10;
static final int EARTH_STRIKE = 11;
static final int WEAKEN = 12;
static final int FIRE_STRIKE = 13;
static final int BONES_TO_BANANAS = 14;
static final int WIND_BOLT = 15;
static final int CURSE = 16;
static final int BIND = 17;
static final int LOW_LEVEL_ALCHEMY = 18;
static final int WATER_BOLT = 19;
static final int VARROCK_TELEPORT = 20;
static final int LVL_2_ENCHANT = 21;
static final int EARTH_BOLT = 22;
static final int LUMBRIDGE_TELEPORT = 23;
static final int TELEKINETIC_GRAB = 24;
static final int FIRE_BOLT = 25;
static final int FALADOR_TELEPORT = 26;
static final int CRUMBLE_UNDEAD = 27;
static final int TELEPORT_TO_HOUSE = 28;
static final int WIND_BLAST = 29;
static final int SUPERHEAT_ITEM = 30;
static final int CAMELOT_TELEPORT = 31;
static final int WATER_BLAST = 32;
static final int LVL_3_ENCHANT = 33;
static final int IBAN_BLAST = 34;
static final int SNARE = 35;
static final int MAGIC_DART = 36;
static final int ARDOUGNE_TELEPORT = 37;
static final int EARTH_BLAST = 38;
static final int HIGH_LEVEL_ALCHEMY = 39;
static final int CHARGE_WATER_ORB = 40;
static final int LVL_4_ENCHANT = 41;
static final int WATCHTOWER_TELEPORT = 42;
static final int FIRE_BLAST = 43;
static final int CHARGE_EARTH_ORB = 44;
static final int BONES_TO_PEACHES = 45;
static final int SARADOMIN_STRIKE = 46;
static final int CLAWS_OF_GUTHIX = 47;
static final int FLAMES_OF_ZAMORAK = 48;
static final int TROLLHEIM_TELEPORT = 49;
static final int WIND_WAVE = 50;
static final int CHARGE_FIRE_ORB = 51;
static final int TELEPORT_TO_APE_ATOLL = 52;
static final int WATER_WAVE = 53;
static final int CHARGE_AIR_ORB = 54;
static final int VULNERABILITY = 55;
static final int LVL_5_ENCHANT = 56;
static final int TELEPORT_TO_KOUREND = 57;
static final int EARTH_WAVE = 58;
static final int ENFEEBLE = 59;
static final int TELEOTHER_LUMBRIDGE = 60;
static final int FIRE_WAVE = 61;
static final int ENTANGLE = 62;
static final int STUN = 63;
static final int CHARGE = 64;
static final int WIND_SURGE = 65;
static final int TELEOTHER_FALADOR = 66;
static final int WATER_SURGE = 67;
static final int TELE_BLOCK = 68;
static final int BOUNTY_TARGET_TELEPORT = 69;
static final int LVL_6_ENCHANT = 70;
static final int TELEOTHER_CAMELOT = 71;
static final int EARTH_SURGE = 72;
static final int LVL_7_ENCHANT = 73;
static final int FIRE_SURGE = 74;
static final int LUMBRIDGE_HOME_TELEPORT = 6;
static final int WIND_STRIKE = 7;
static final int CONFUSE = 8;
static final int ENCHANT_CROSSBOW_BOLT = 9;
static final int WATER_STRIKE = 10;
static final int LVL_1_ENCHANT = 11;
static final int EARTH_STRIKE = 12;
static final int WEAKEN = 13;
static final int FIRE_STRIKE = 14;
static final int BONES_TO_BANANAS = 15;
static final int WIND_BOLT = 16;
static final int CURSE = 17;
static final int BIND = 18;
static final int LOW_LEVEL_ALCHEMY = 19;
static final int WATER_BOLT = 20;
static final int VARROCK_TELEPORT = 21;
static final int LVL_2_ENCHANT = 22;
static final int EARTH_BOLT = 23;
static final int LUMBRIDGE_TELEPORT = 24;
static final int TELEKINETIC_GRAB = 25;
static final int FIRE_BOLT = 26;
static final int FALADOR_TELEPORT = 27;
static final int CRUMBLE_UNDEAD = 28;
static final int TELEPORT_TO_HOUSE = 29;
static final int WIND_BLAST = 30;
static final int SUPERHEAT_ITEM = 31;
static final int CAMELOT_TELEPORT = 32;
static final int WATER_BLAST = 33;
static final int LVL_3_ENCHANT = 34;
static final int IBAN_BLAST = 35;
static final int SNARE = 36;
static final int MAGIC_DART = 37;
static final int ARDOUGNE_TELEPORT = 38;
static final int EARTH_BLAST = 39;
static final int HIGH_LEVEL_ALCHEMY = 40;
static final int CHARGE_WATER_ORB = 41;
static final int LVL_4_ENCHANT = 42;
static final int WATCHTOWER_TELEPORT = 43;
static final int FIRE_BLAST = 44;
static final int CHARGE_EARTH_ORB = 45;
static final int BONES_TO_PEACHES = 46;
static final int SARADOMIN_STRIKE = 47;
static final int CLAWS_OF_GUTHIX = 48;
static final int FLAMES_OF_ZAMORAK = 49;
static final int TROLLHEIM_TELEPORT = 50;
static final int WIND_WAVE = 51;
static final int CHARGE_FIRE_ORB = 52;
static final int TELEPORT_TO_APE_ATOLL = 53;
static final int WATER_WAVE = 54;
static final int CHARGE_AIR_ORB = 55;
static final int VULNERABILITY = 56;
static final int LVL_5_ENCHANT = 57;
static final int TELEPORT_TO_KOUREND = 58;
static final int EARTH_WAVE = 59;
static final int ENFEEBLE = 60;
static final int TELEOTHER_LUMBRIDGE = 61;
static final int FIRE_WAVE = 62;
static final int ENTANGLE = 63;
static final int STUN = 64;
static final int CHARGE = 65;
static final int WIND_SURGE = 66;
static final int TELEOTHER_FALADOR = 67;
static final int WATER_SURGE = 68;
static final int TELE_BLOCK = 69;
static final int BOUNTY_TARGET_TELEPORT = 70;
static final int LVL_6_ENCHANT = 71;
static final int TELEOTHER_CAMELOT = 72;
static final int EARTH_SURGE = 73;
static final int LVL_7_ENCHANT = 74;
static final int FIRE_SURGE = 75;
// ANCIENT SPELLS
static final int ICE_RUSH = 75;
static final int ICE_BLITZ = 76;
static final int ICE_BURST = 77;
static final int ICE_BARRAGE = 78;
static final int BLOOD_RUSH = 79;
static final int BLOOD_BLITZ = 80;
static final int BLOOD_BURST = 81;
static final int BLOOD_BARRAGE = 82;
static final int SMOKE_RUSH = 83;
static final int SMOKE_BLITZ = 84;
static final int SMOKE_BURST = 85;
static final int SMOKE_BARRAGE = 86;
static final int SHADOW_RUSH = 87;
static final int SHADOW_BLITZ = 88;
static final int SHADOW_BURST = 89;
static final int SHADOW_BARRAGE = 90;
static final int PADDEWWA_TELEPORT = 91;
static final int SENNTISTEN_TELEPORT = 92;
static final int KHARYRLL_TELEPORT = 93;
static final int LASSAR_TELEPORT = 94;
static final int DAREEYAK_TELEPORT = 95;
static final int CARRALLANGER_TELEPORT = 96;
static final int ANNAKARL_TELEPORT = 97;
static final int GHORROCK_TELEPORT = 98;
static final int EDGEVILLE_HOME_TELEPORT = 99;
static final int ICE_RUSH = 76;
static final int ICE_BLITZ = 77;
static final int ICE_BURST = 78;
static final int ICE_BARRAGE = 79;
static final int BLOOD_RUSH = 80;
static final int BLOOD_BLITZ = 81;
static final int BLOOD_BURST = 82;
static final int BLOOD_BARRAGE = 83;
static final int SMOKE_RUSH = 84;
static final int SMOKE_BLITZ = 85;
static final int SMOKE_BURST = 86;
static final int SMOKE_BARRAGE = 87;
static final int SHADOW_RUSH = 88;
static final int SHADOW_BLITZ = 89;
static final int SHADOW_BURST = 90;
static final int SHADOW_BARRAGE = 91;
static final int PADDEWWA_TELEPORT = 92;
static final int SENNTISTEN_TELEPORT = 93;
static final int KHARYRLL_TELEPORT = 94;
static final int LASSAR_TELEPORT = 95;
static final int DAREEYAK_TELEPORT = 96;
static final int CARRALLANGER_TELEPORT = 97;
static final int ANNAKARL_TELEPORT = 98;
static final int GHORROCK_TELEPORT = 99;
static final int EDGEVILLE_HOME_TELEPORT = 100;
// LUNAR SPELLS
static final int LUNAR_HOME_TELEPORT = 100;
static final int BAKE_PIE = 101;
static final int CURE_PLANT = 102;
static final int MONSTER_EXAMINE = 103;
static final int NPC_CONTACT = 104;
static final int CURE_OTHER = 105;
static final int HUMIDIFY = 106;
static final int MOONCLAN_TELEPORT = 107;
static final int TELE_GROUP_MOONCLAN = 108;
static final int CURE_ME = 109;
static final int HUNTER_KIT = 110;
static final int WATERBIRTH_TELEPORT = 111;
static final int TELE_GROUP_WATERBIRTH = 112;
static final int CURE_GROUP = 113;
static final int STAT_SPY = 114;
static final int BARBARIAN_TELEPORT = 115;
static final int TELE_GROUP_BARBARIAN = 116;
static final int SUPERGLASS_MAKE = 117;
static final int TAN_LEATHER = 118;
static final int KHAZARD_TELEPORT = 119;
static final int TELE_GROUP_KHAZARD = 120;
static final int DREAM = 121;
static final int STRING_JEWELLERY = 122;
static final int STAT_RESTORE_POT_SHARE = 123;
static final int MAGIC_IMBUE = 124;
static final int FERTILE_SOIL = 125;
static final int BOOST_POTION_SHARE = 126;
static final int FISHING_GUILD_TELEPORT = 127;
static final int TELE_GROUP_FISHING_GUILD = 128;
static final int PLANK_MAKE = 129;
static final int CATHERBY_TELEPORT = 130;
static final int TELE_GROUP_CATHERBY = 131;
static final int RECHARGE_DRAGONSTONE = 132;
static final int ICE_PLATEAU_TELEPORT = 133;
static final int TELE_GROUP_ICE_PLATEAU = 134;
static final int ENERGY_TRANSFER = 135;
static final int HEAL_OTHER = 136;
static final int VENGEANCE_OTHER = 137;
static final int VENGEANCE = 138;
static final int HEAL_GROUP = 139;
static final int SPELLBOOK_SWAP = 140;
static final int GEOMANCY = 141;
static final int SPIN_FLAX = 142;
static final int OURANIA_TELEPORT = 143;
static final int LUNAR_HOME_TELEPORT = 101;
static final int BAKE_PIE = 102;
static final int CURE_PLANT = 103;
static final int MONSTER_EXAMINE = 104;
static final int NPC_CONTACT = 105;
static final int CURE_OTHER = 106;
static final int HUMIDIFY = 107;
static final int MOONCLAN_TELEPORT = 108;
static final int TELE_GROUP_MOONCLAN = 109;
static final int CURE_ME = 110;
static final int HUNTER_KIT = 111;
static final int WATERBIRTH_TELEPORT = 112;
static final int TELE_GROUP_WATERBIRTH = 113;
static final int CURE_GROUP = 114;
static final int STAT_SPY = 115;
static final int BARBARIAN_TELEPORT = 116;
static final int TELE_GROUP_BARBARIAN = 117;
static final int SUPERGLASS_MAKE = 118;
static final int TAN_LEATHER = 119;
static final int KHAZARD_TELEPORT = 120;
static final int TELE_GROUP_KHAZARD = 121;
static final int DREAM = 122;
static final int STRING_JEWELLERY = 123;
static final int STAT_RESTORE_POT_SHARE = 124;
static final int MAGIC_IMBUE = 125;
static final int FERTILE_SOIL = 126;
static final int BOOST_POTION_SHARE = 127;
static final int FISHING_GUILD_TELEPORT = 128;
static final int TELE_GROUP_FISHING_GUILD = 129;
static final int PLANK_MAKE = 130;
static final int CATHERBY_TELEPORT = 131;
static final int TELE_GROUP_CATHERBY = 132;
static final int RECHARGE_DRAGONSTONE = 133;
static final int ICE_PLATEAU_TELEPORT = 134;
static final int TELE_GROUP_ICE_PLATEAU = 135;
static final int ENERGY_TRANSFER = 136;
static final int HEAL_OTHER = 137;
static final int VENGEANCE_OTHER = 138;
static final int VENGEANCE = 139;
static final int HEAL_GROUP = 140;
static final int SPELLBOOK_SWAP = 141;
static final int GEOMANCY = 142;
static final int SPIN_FLAX = 143;
static final int OURANIA_TELEPORT = 144;
// ARCEUUS SPELLS
static final int ARCEUUS_HOME_TELEPORT = 144;
static final int BASIC_REANIMATION = 145;
static final int ARCEUUS_LIBRARY_TELEPORT = 146;
static final int ADEPT_REANIMATION = 147;
static final int EXPERT_REANIMATION = 148;
static final int MASTER_REANIMATION = 149;
static final int DRAYNOR_MANOR_TELEPORT = 150;
static final int MIND_ALTAR_TELEPORT = 152;
static final int RESPAWN_TELEPORT = 153;
static final int SALVE_GRAVEYARD_TELEPORT = 154;
static final int FENKENSTRAINS_CASTLE_TELEPORT = 155;
static final int WEST_ARDOUGNE_TELEPORT = 156;
static final int HARMONY_ISLAND_TELEPORT = 157;
static final int CEMETERY_TELEPORT = 158;
static final int RESURRECT_CROPS = 159;
static final int BARROWS_TELEPORT = 160;
static final int APE_ATOLL_TELEPORT = 161;
static final int BATTLEFRONT_TELEPORT = 162;
static final int INFERIOR_DEMONBANE = 163;
static final int SUPERIOR_DEMONBANE = 164;
static final int DARK_DEMONBANE = 165;
static final int MARK_OF_DARKNESS = 166;
static final int GHOSTLY_GRASP = 167;
static final int SKELETAL_GRASP = 168;
static final int UNDEAD_GRASP = 169;
static final int WARD_OF_ARCEUUS = 170;
static final int LESSER_CORRUPTION = 171;
static final int GREATER_CORRUPTION = 172;
static final int DEMONIC_OFFERING = 173;
static final int SINISTER_OFFERING = 174;
static final int DEGRIME = 175;
static final int SHADOW_VEIL = 176;
static final int VILE_VIGOUR = 177;
static final int DARK_LURE = 178;
static final int DEATH_CHARGE = 179;
static final int RESURRECT_LESSER_GHOST = 180;
static final int RESURRECT_LESSER_SKELETON = 181;
static final int RESURRECT_LESSER_ZOMBIE = 182;
static final int RESURRECT_SUPERIOR_GHOST = 183;
static final int RESURRECT_SUPERIOR_SKELETON = 184;
static final int RESURRECT_SUPERIOR_ZOMBIE = 185;
static final int RESURRECT_GREATER_GHOST = 186;
static final int RESURRECT_GREATER_SKELETON = 187;
static final int RESURRECT_GREATER_ZOMBIE = 188;
static final int ARCEUUS_HOME_TELEPORT = 145;
static final int BASIC_REANIMATION = 146;
static final int ARCEUUS_LIBRARY_TELEPORT = 147;
static final int ADEPT_REANIMATION = 148;
static final int EXPERT_REANIMATION = 149;
static final int MASTER_REANIMATION = 150;
static final int DRAYNOR_MANOR_TELEPORT = 151;
static final int MIND_ALTAR_TELEPORT = 153;
static final int RESPAWN_TELEPORT = 154;
static final int SALVE_GRAVEYARD_TELEPORT = 155;
static final int FENKENSTRAINS_CASTLE_TELEPORT = 156;
static final int WEST_ARDOUGNE_TELEPORT = 157;
static final int HARMONY_ISLAND_TELEPORT = 158;
static final int CEMETERY_TELEPORT = 159;
static final int RESURRECT_CROPS = 160;
static final int BARROWS_TELEPORT = 161;
static final int APE_ATOLL_TELEPORT = 162;
static final int BATTLEFRONT_TELEPORT = 163;
static final int INFERIOR_DEMONBANE = 164;
static final int SUPERIOR_DEMONBANE = 165;
static final int DARK_DEMONBANE = 166;
static final int MARK_OF_DARKNESS = 167;
static final int GHOSTLY_GRASP = 168;
static final int SKELETAL_GRASP = 169;
static final int UNDEAD_GRASP = 170;
static final int WARD_OF_ARCEUUS = 171;
static final int LESSER_CORRUPTION = 172;
static final int GREATER_CORRUPTION = 173;
static final int DEMONIC_OFFERING = 174;
static final int SINISTER_OFFERING = 175;
static final int DEGRIME = 176;
static final int SHADOW_VEIL = 177;
static final int VILE_VIGOUR = 178;
static final int DARK_LURE = 179;
static final int DEATH_CHARGE = 180;
static final int RESURRECT_LESSER_GHOST = 181;
static final int RESURRECT_LESSER_SKELETON = 182;
static final int RESURRECT_LESSER_ZOMBIE = 183;
static final int RESURRECT_SUPERIOR_GHOST = 184;
static final int RESURRECT_SUPERIOR_SKELETON = 185;
static final int RESURRECT_SUPERIOR_ZOMBIE = 186;
static final int RESURRECT_GREATER_GHOST = 187;
static final int RESURRECT_GREATER_SKELETON = 188;
static final int RESURRECT_GREATER_ZOMBIE = 189;
}
static class DialogSprite2
@@ -25,28 +25,26 @@
package net.runelite.client.chat;
import java.awt.Color;
import javax.annotation.Nullable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import net.runelite.api.VarPlayer;
@Data
@EqualsAndHashCode(exclude = {"color", "isDefault"})
public class ChatColor
@EqualsAndHashCode(exclude = {"color", "isDefault", "setting"})
@AllArgsConstructor
class ChatColor
{
private ChatColorType type;
private Color color;
private boolean transparent;
private boolean isDefault;
@Nullable
private VarPlayer setting; // varp for the in-game chat color setting
public ChatColor(ChatColorType type, Color color, boolean transparent)
{
this(type, color, transparent, false);
}
public ChatColor(ChatColorType type, Color color, boolean transparent, boolean isDefault)
{
this.type = type;
this.color = color;
this.transparent = transparent;
this.isDefault = isDefault;
this(type, color, transparent, false, null);
}
}
@@ -31,23 +31,19 @@ import com.google.common.collect.HashMultimap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Multimap;
import java.awt.Color;
import java.util.Arrays;
import java.util.Collection;
import java.util.Objects;
import java.util.Queue;
import java.util.Set;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicReference;
import javax.inject.Inject;
import javax.inject.Singleton;
import net.runelite.api.ChatMessageType;
import net.runelite.api.Client;
import net.runelite.api.MessageNode;
import net.runelite.api.Player;
import net.runelite.api.VarPlayer;
import net.runelite.api.Varbits;
import net.runelite.api.events.ResizeableChanged;
import net.runelite.api.events.ScriptCallbackEvent;
import net.runelite.api.events.VarbitChanged;
import net.runelite.client.callback.ClientThread;
import net.runelite.client.config.ChatColorConfig;
import net.runelite.client.eventbus.EventBus;
@@ -66,7 +62,6 @@ public class ChatMessageManager
private final Client client;
private final ChatColorConfig chatColorConfig;
private final ClientThread clientThread;
private int transparencyVarbit = -1;
private final Queue<QueuedMessage> queuedMessages = new ConcurrentLinkedQueue<>();
@Inject
@@ -83,40 +78,25 @@ public class ChatMessageManager
loadColors();
}
@Subscribe
public void onVarbitChanged(VarbitChanged event)
{
int setting = client.getVar(Varbits.TRANSPARENT_CHATBOX);
if (transparencyVarbit != setting)
{
transparencyVarbit = setting;
refreshAll();
}
}
@Subscribe
public void onResizeableChanged(ResizeableChanged event)
{
refreshAll();
}
@Subscribe
public void onConfigChanged(ConfigChanged event)
{
if (event.getGroup().equals("textrecolor"))
{
loadColors();
clientThread.invokeLater(this::refreshAll);
clientThread.invokeLater(client::refreshChat);
}
}
@VisibleForTesting
void colorChatMessage()
{
final int[] intStack = client.getIntStack();
final String[] stringStack = client.getStringStack();
final int size = client.getStringStackSize();
final int uid = client.getIntStack()[client.getIntStackSize() - 1];
final int isize = client.getIntStackSize();
final int uid = intStack[isize - 1];
final boolean splitpmbox = intStack[isize - 2] == 1;
final MessageNode messageNode = client.getMessages().get(uid);
assert messageNode != null : "chat message build for unknown message";
@@ -184,6 +164,12 @@ public class ChatMessageManager
stringStack[size - 4] = ColorUtil.wrapWithColorTag(channel, channelColor);
}
if (messageNode.getRuneLiteFormatMessage() != null)
{
stringStack[size - 2] = message = formatRuneLiteMessage(messageNode.getRuneLiteFormatMessage(),
chatMessageType, splitpmbox);
}
final Collection<ChatColor> chatColors = colorCache.get(chatMessageType);
for (ChatColor chatColor : chatColors)
{
@@ -311,6 +297,86 @@ public class ChatMessageManager
return null;
}
// get the variable holding the chat color from the settings, from script4484
private static VarPlayer getSettingsColor(ChatMessageType type, boolean transparent)
{
if (transparent)
{
switch (type)
{
case PUBLICCHAT:
case MODCHAT:
return VarPlayer.SETTINGS_TRANSPARENT_CHAT_PUBLIC;
case PRIVATECHATOUT:
case MODPRIVATECHAT:
case PRIVATECHAT:
case LOGINLOGOUTNOTIFICATION:
return VarPlayer.SETTINGS_TRANSPARENT_CHAT_PRIVATE;
case AUTOTYPER:
case MODAUTOTYPER:
return VarPlayer.SETTINGS_TRANSPARENT_CHAT_AUTO;
case BROADCAST:
return VarPlayer.SETTINGS_TRANSPARENT_CHAT_BROADCAST;
case FRIENDSCHAT:
return VarPlayer.SETTINGS_TRANSPARENT_CHAT_FRIEND;
case CLAN_CHAT:
return VarPlayer.SETTINGS_TRANSPARENT_CHAT_CLAN;
case TRADEREQ:
return VarPlayer.SETTINGS_TRANSPARENT_CHAT_TRADE_REQUEST;
case CHALREQ_TRADE:
case CHALREQ_FRIENDSCHAT:
case CHALREQ_CLANCHAT:
return VarPlayer.SETTINGS_TRANSPARENT_CHAT_CHALLENGE_REQUEST;
case CLAN_GUEST_CHAT:
return VarPlayer.SETTINGS_TRANSPARENT_CHAT_GUEST_CLAN;
case CLAN_GIM_CHAT:
return VarPlayer.SETTINGS_TRANSPARENT_CHAT_IRON_GROUP_CHAT;
case CLAN_MESSAGE:
return VarPlayer.SETTINGS_TRANSPARENT_CHAT_CLAN_BROADCAST;
case CLAN_GIM_MESSAGE:
return VarPlayer.SETTINGS_TRANSPARENT_CHAT_IRON_GROUP_BROADCAST;
}
}
else
{
switch (type)
{
case PUBLICCHAT:
case MODCHAT:
return VarPlayer.SETTINGS_OPAQUE_CHAT_PUBLIC;
case PRIVATECHATOUT:
case MODPRIVATECHAT:
case PRIVATECHAT:
case LOGINLOGOUTNOTIFICATION:
return VarPlayer.SETTINGS_OPAQUE_CHAT_PRIVATE;
case AUTOTYPER:
case MODAUTOTYPER:
return VarPlayer.SETTINGS_OPAQUE_CHAT_AUTO;
case BROADCAST:
return VarPlayer.SETTINGS_OPAQUE_CHAT_BROADCAST;
case FRIENDSCHAT:
return VarPlayer.SETTINGS_OPAQUE_CHAT_FRIEND;
case CLAN_CHAT:
return VarPlayer.SETTINGS_OPAQUE_CHAT_CLAN;
case TRADEREQ:
return VarPlayer.SETTINGS_OPAQUE_CHAT_TRADE_REQUEST;
case CHALREQ_TRADE:
case CHALREQ_FRIENDSCHAT:
case CHALREQ_CLANCHAT:
return VarPlayer.SETTINGS_OPAQUE_CHAT_CHALLENGE_REQUEST;
case CLAN_GUEST_CHAT:
return VarPlayer.SETTINGS_OPAQUE_CHAT_GUEST_CLAN;
case CLAN_GIM_CHAT:
return VarPlayer.SETTINGS_OPAQUE_CHAT_IRON_GROUP_CHAT;
case CLAN_MESSAGE:
return VarPlayer.SETTINGS_OPAQUE_CHAT_CLAN_BROADCAST;
case CLAN_GIM_MESSAGE:
return VarPlayer.SETTINGS_OPAQUE_CHAT_IRON_GROUP_BROADCAST;
}
}
return null;
}
/**
* Load all configured colors
*/
@@ -324,13 +390,13 @@ public class ChatMessageManager
Color defaultTransparent = getDefaultColor(chatMessageType, true);
if (defaultTransparent != null)
{
cacheColor(new ChatColor(ChatColorType.NORMAL, defaultTransparent, true, true), chatMessageType);
cacheColor(new ChatColor(ChatColorType.NORMAL, defaultTransparent, true, true, getSettingsColor(chatMessageType, true)), chatMessageType);
}
Color defaultOpaque = getDefaultColor(chatMessageType, false);
if (defaultOpaque != null)
{
cacheColor(new ChatColor(ChatColorType.NORMAL, defaultOpaque, false, true), chatMessageType);
cacheColor(new ChatColor(ChatColorType.NORMAL, defaultOpaque, false, true, getSettingsColor(chatMessageType, false)), chatMessageType);
}
}
@@ -744,13 +810,11 @@ public class ChatMessageManager
return;
}
final String formattedMessage = formatRuneLiteMessage(message.getRuneLiteFormattedMessage(), message.getType());
// this updates chat cycle
final MessageNode line = client.addChatMessage(
message.getType(),
MoreObjects.firstNonNull(message.getName(), ""),
MoreObjects.firstNonNull(formattedMessage, message.getValue()),
MoreObjects.firstNonNull(message.getRuneLiteFormattedMessage(), message.getValue()),
message.getSender());
// Update the message with RuneLite additions
@@ -763,55 +827,64 @@ public class ChatMessageManager
}
/**
* Rebuild the message node message from the RuneLite format message
* Rebuild the message node message from the RuneLite format message.
* DEPRECATED: no longer needs to be called.
*
* @param messageNode message node
*/
@Deprecated
public void update(final MessageNode messageNode)
{
String message = formatRuneLiteMessage(messageNode.getRuneLiteFormatMessage(), messageNode.getType());
if (message != null)
{
messageNode.setValue(message);
}
}
private String formatRuneLiteMessage(String runeLiteFormatMessage, ChatMessageType type)
@VisibleForTesting
String formatRuneLiteMessage(String runeLiteFormatMessage, ChatMessageType type, boolean pmbox)
{
if (Strings.isNullOrEmpty(runeLiteFormatMessage))
{
return null;
}
final boolean transparent = client.isResized() && transparencyVarbit != 0;
final boolean transparentChatbox = client.getVar(Varbits.TRANSPARENT_CHATBOX) != 0;
final boolean transparent = client.isResized() && transparentChatbox;
final Collection<ChatColor> chatColors = colorCache.get(type);
if (chatColors == null || chatColors.isEmpty())
for (ChatColor chatColor : chatColors)
{
return runeLiteFormatMessage;
if (chatColor.isTransparent() == transparent)
{
String colstr;
if (pmbox && chatColor.getType() == ChatColorType.NORMAL)
{
// The default ChatColors for private have the chatbox text color, not the split chat color,
// and the split chat color is set by widget color, so just use </col>. The in-game
// private chat color doesn't apply to split chat either so using that here also is incorrect.
//
// If we recolor the final message later we replace </col> with the desired color in
// colorChatMessage()
colstr = ColorUtil.CLOSING_COLOR_TAG;
}
else
{
Color color = chatColor.getColor();
VarPlayer varp = chatColor.getSetting();
if (varp != null)
{
// Apply configured color from game settings, if set
assert chatColor.isDefault();
int v = client.getVar(varp);
if (v != 0)
{
color = new Color(v - 1);
}
}
colstr = ColorUtil.colorTag(color);
}
// Replace custom formatting with actual colors
runeLiteFormatMessage = runeLiteFormatMessage.replaceAll(
"<col" + chatColor.getType().name() + ">",
colstr);
}
}
final AtomicReference<String> resultMessage = new AtomicReference<>(runeLiteFormatMessage);
// Replace custom formatting with actual colors
chatColors.stream()
.filter(chatColor -> chatColor.isTransparent() == transparent)
.forEach(chatColor ->
resultMessage.getAndUpdate(oldMessage -> oldMessage.replaceAll(
"<col" + chatColor.getType().name() + ">",
ColorUtil.colorTag(chatColor.getColor()))));
return resultMessage.get();
}
private void refreshAll()
{
client.getChatLineMap().values().stream()
.filter(Objects::nonNull)
.flatMap(clb -> Arrays.stream(clb.getLines()))
.filter(Objects::nonNull)
.forEach(this::update);
client.refreshChat();
return runeLiteFormatMessage;
}
}
@@ -37,6 +37,8 @@ import net.runelite.api.ChatMessageType;
import net.runelite.api.Client;
import net.runelite.api.GameObject;
import net.runelite.api.GameState;
import static net.runelite.api.GraphicID.CANNONBALL;
import static net.runelite.api.GraphicID.GRANITE_CANNONBALL;
import net.runelite.api.InventoryID;
import net.runelite.api.Item;
import net.runelite.api.ItemContainer;
@@ -46,8 +48,6 @@ import net.runelite.api.ObjectID;
import static net.runelite.api.ObjectID.CANNON_BASE;
import net.runelite.api.Player;
import net.runelite.api.Projectile;
import static net.runelite.api.ProjectileID.CANNONBALL;
import static net.runelite.api.ProjectileID.GRANITE_CANNONBALL;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldPoint;
import net.runelite.api.events.ChatMessage;
@@ -77,7 +77,6 @@ import net.runelite.client.chat.ChatClient;
import net.runelite.client.chat.ChatColorType;
import net.runelite.client.chat.ChatCommandManager;
import net.runelite.client.chat.ChatMessageBuilder;
import net.runelite.client.chat.ChatMessageManager;
import net.runelite.client.config.ConfigManager;
import net.runelite.client.config.RuneLiteConfig;
import net.runelite.client.eventbus.Subscribe;
@@ -175,9 +174,6 @@ public class ChatCommandsPlugin extends Plugin
@Inject
private ItemManager itemManager;
@Inject
private ChatMessageManager chatMessageManager;
@Inject
private ChatCommandManager chatCommandManager;
@@ -840,7 +836,6 @@ public class ChatCommandsPlugin extends Plugin
log.debug("Setting response {}", response);
final MessageNode messageNode = chatMessage.getMessageNode();
messageNode.setRuneLiteFormatMessage(response);
chatMessageManager.update(messageNode);
client.refreshChat();
}
@@ -930,7 +925,6 @@ public class ChatCommandsPlugin extends Plugin
log.debug("Setting response {}", response);
final MessageNode messageNode = chatMessage.getMessageNode();
messageNode.setRuneLiteFormatMessage(response);
chatMessageManager.update(messageNode);
client.refreshChat();
}
@@ -974,7 +968,6 @@ public class ChatCommandsPlugin extends Plugin
log.debug("Setting response {}", response);
final MessageNode messageNode = chatMessage.getMessageNode();
messageNode.setRuneLiteFormatMessage(response);
chatMessageManager.update(messageNode);
client.refreshChat();
}
@@ -1061,7 +1054,6 @@ public class ChatCommandsPlugin extends Plugin
log.debug("Setting response {}", response);
final MessageNode messageNode = chatMessage.getMessageNode();
messageNode.setRuneLiteFormatMessage(response);
chatMessageManager.update(messageNode);
client.refreshChat();
}
@@ -1137,7 +1129,6 @@ public class ChatCommandsPlugin extends Plugin
log.debug("Setting response {}", response);
final MessageNode messageNode = chatMessage.getMessageNode();
messageNode.setRuneLiteFormatMessage(response);
chatMessageManager.update(messageNode);
client.refreshChat();
}
@@ -1231,7 +1222,6 @@ public class ChatCommandsPlugin extends Plugin
log.debug("Setting response {}", response);
final MessageNode messageNode = chatMessage.getMessageNode();
messageNode.setRuneLiteFormatMessage(response);
chatMessageManager.update(messageNode);
client.refreshChat();
}
@@ -1321,7 +1311,6 @@ public class ChatCommandsPlugin extends Plugin
log.debug("Setting response {}", response);
messageNode.setRuneLiteFormatMessage(response);
chatMessageManager.update(messageNode);
client.refreshChat();
}
}
@@ -1403,7 +1392,6 @@ public class ChatCommandsPlugin extends Plugin
log.debug("Setting response {}", response);
final MessageNode messageNode = chatMessage.getMessageNode();
messageNode.setRuneLiteFormatMessage(response);
chatMessageManager.update(messageNode);
client.refreshChat();
}
catch (IOException ex)
@@ -1488,7 +1476,6 @@ public class ChatCommandsPlugin extends Plugin
log.debug("Setting response {}", response);
final MessageNode messageNode = chatMessage.getMessageNode();
messageNode.setRuneLiteFormatMessage(response);
chatMessageManager.update(messageNode);
client.refreshChat();
}
catch (IOException ex)
@@ -1616,7 +1603,6 @@ public class ChatCommandsPlugin extends Plugin
log.debug("Setting response {}", response);
final MessageNode messageNode = chatMessage.getMessageNode();
messageNode.setRuneLiteFormatMessage(response);
chatMessageManager.update(messageNode);
client.refreshChat();
}
catch (IOException ex)
@@ -1710,7 +1696,6 @@ public class ChatCommandsPlugin extends Plugin
log.debug("Setting response {}", response);
final MessageNode messageNode = chatMessage.getMessageNode();
messageNode.setRuneLiteFormatMessage(response);
chatMessageManager.update(messageNode);
client.refreshChat();
}
catch (IOException ex)
@@ -47,7 +47,6 @@ import net.runelite.api.events.ChatMessage;
import net.runelite.api.events.GameStateChanged;
import net.runelite.client.Notifier;
import net.runelite.client.chat.ChatColorType;
import net.runelite.client.chat.ChatMessageManager;
import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.events.ConfigChanged;
@@ -69,9 +68,6 @@ public class ChatNotificationsPlugin extends Plugin
@Inject
private ChatNotificationsConfig config;
@Inject
private ChatMessageManager chatMessageManager;
@Inject
private Notifier notifier;
@@ -243,12 +239,24 @@ public class ChatNotificationsPlugin extends Plugin
Matcher matcher = usernameMatcher.matcher(message);
if (matcher.find())
{
final int start = matcher.start();
final String username = client.getLocalPlayer().getName();
final String closeColor = MoreObjects.firstNonNull(getLastColor(message.substring(0, start)), "</col>");
final String replacement = "<col" + ChatColorType.HIGHLIGHT.name() + "><u>" + username + "</u>" + closeColor;
messageNode.setValue(matcher.replaceAll(replacement));
StringBuffer stringBuffer = new StringBuffer();
do
{
final int start = matcher.start(); // start not end, since username won't contain a col tag
final String closeColor = MoreObjects.firstNonNull(
getLastColor(message.substring(0, start)),
"<col" + ChatColorType.NORMAL + '>');
final String replacement = "<col" + ChatColorType.HIGHLIGHT.name() + "><u>" + username + "</u>" + closeColor;
matcher.appendReplacement(stringBuffer, replacement);
}
while (matcher.find());
matcher.appendTail(stringBuffer);
messageNode.setValue(stringBuffer.toString());
update = true;
if (config.notifyOnOwnName() && (chatMessage.getType() == ChatMessageType.PUBLICCHAT
|| chatMessage.getType() == ChatMessageType.PRIVATECHAT
|| chatMessage.getType() == ChatMessageType.FRIENDSCHAT
@@ -279,26 +287,16 @@ public class ChatNotificationsPlugin extends Plugin
do
{
String value = matcher.group();
// Determine the ending color by:
// 1) use the color from value if it has one
// 2) use the last color from stringBuffer + <content between last match and current match>
// To do #2 we just search for the last col tag after calling appendReplacement
String endColor = getLastColor(value);
final int end = matcher.end();
// Determine the ending color by finding the last color tag up to and
// including the match.
final String closeColor = MoreObjects.firstNonNull(
getLastColor(nodeValue.substring(0, end)),
"<col" + ChatColorType.NORMAL + '>');
// Strip color tags from the highlighted region so that it remains highlighted correctly
value = stripColor(value);
final String value = stripColor(matcher.group());
matcher.appendReplacement(stringBuffer, "<col" + ChatColorType.HIGHLIGHT + '>' + value);
if (endColor == null)
{
endColor = getLastColor(stringBuffer.toString());
}
// Append end color
stringBuffer.append(endColor == null ? "<col" + ChatColorType.NORMAL + ">" : endColor);
matcher.appendReplacement(stringBuffer, "<col" + ChatColorType.HIGHLIGHT + '>' + value + closeColor);
update = true;
matchesHighlight = true;
@@ -322,7 +320,6 @@ public class ChatNotificationsPlugin extends Plugin
if (update)
{
messageNode.setRuneLiteFormatMessage(messageNode.getValue());
chatMessageManager.update(messageNode);
}
}
@@ -24,11 +24,12 @@
*/
package net.runelite.client.plugins.cluescrolls.clues;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableList;
import java.awt.Color;
import java.awt.Graphics2D;
import java.util.Set;
import java.util.List;
import javax.annotation.Nullable;
import lombok.Builder;
import lombok.Getter;
import net.runelite.api.NPC;
import net.runelite.api.ObjectID;
@@ -46,111 +47,728 @@ import net.runelite.client.ui.overlay.components.PanelComponent;
import net.runelite.client.ui.overlay.components.TitleComponent;
@Getter
@Builder
public class AnagramClue extends ClueScroll implements TextClueScroll, NpcClueScroll, ObjectClueScroll
{
private static final String ANAGRAM_TEXT = "This anagram reveals who to speak to next: ";
private static final String ANAGRAM_TEXT_BEGINNER = "The anagram reveals who to speak to next: ";
private static final Set<AnagramClue> CLUES = ImmutableSet.of(
new AnagramClue("A BAKER", "Baraek", new WorldPoint(3217, 3434, 0), "Varrock square", "How many stalls are there in Varrock Square?", "5"),
new AnagramClue("A BASIC ANTI POT", "Captain Tobias", new WorldPoint(3026, 3216, 0), "Port Sarim", "How many ships are there docked at Port Sarim currently?", "6"),
new AnagramClue("A ELF KNOWS", "Snowflake", new WorldPoint(2872, 3934, 0), "Weiss"),
new AnagramClue("A HEART", "Aretha", new WorldPoint(1814, 3851, 0), "Soul altar", "32 - 5x = 22, what is x?", "2"),
new AnagramClue("AHA JAR", "Jaraah", new WorldPoint(3359, 3276, 0), "Duel Arena hospital"),
new AnagramClue("ARC O LINE", "Caroline", new WorldPoint(2715, 3302, 0), "North Witchaven next to the row boat", "How many fishermen are there on the fishing platform?", "11"),
new AnagramClue("ARE COL", "Oracle", new WorldPoint(3013, 3501, 0), "Ice Mountain West of Edgeville", "If x is 15 and y is 3 what is 3x + y?", "48"),
new AnagramClue("ARMCHAIR THE PELT", "Charlie the Tramp", new WorldPoint(3209, 3392, 0), "South entrance of Varrock", "How many coins would I have if I have 0 coins and attempt to buy 10 loaves of bread for 3 coins each?", "0"),
new AnagramClue("AT HERG", "Regath", new WorldPoint(1719, 3723, 0), "General Store, Arceuus, Zeah", "What is -5 to the power of 2?", "25"),
new AnagramClue("A BAS", "Saba", new WorldPoint(2858, 3577, 0), "Death Plateau"),
new AnagramClue("AREA CHEF TREK", "Father Aereck", new WorldPoint(3243, 3208, 0), "Lumbridge Church", "How many gravestones are in the church graveyard?", "19 or 20"),
new AnagramClue("BAIL TRIMS", "Brimstail", new WorldPoint(2402, 3419, 0), "West of Stronghold Slayer Cave"),
new AnagramClue("BAKER CLIMB", "Brambickle", new WorldPoint(2783, 3861, 0), "Trollweiss mountain"),
new AnagramClue("BLUE GRIM GUIDED", "Lumbridge Guide", new WorldPoint(3238, 3220, 0), "Lumbridge"),
new AnagramClue("BY LOOK", "Bolkoy", new WorldPoint(2529, 3162, 0), "Tree Gnome Village general store", "How many flowers are there in the clearing below this platform?", "13"),
new AnagramClue("CALAMARI MADE MUD", "Madame Caldarium", new WorldPoint(2553, 2868, 0), "Corsair Cove", "What is 3(5-3)?", "6"),
new AnagramClue("CAR IF ICES", "Sacrifice", new WorldPoint(2209, 3056, 0), "Zul-Andra"),
new AnagramClue("CAREER IN MOON", "Oneiromancer", new WorldPoint(2150, 3866, 0), "Astral altar", "How many Suqah inhabit Lunar isle?", "25"),
new AnagramClue("CLASH ION", "Nicholas", new WorldPoint(1841, 3803, 0), "North of Port Piscarilius fishing shop", "How many windows are in Tynan's shop?", "4"),
new AnagramClue("C ON GAME HOC", "Gnome Coach", new WorldPoint(2395, 3486, 0), "Gnome Ball course", "How many gnomes on the Gnome ball field have red patches on their uniforms?", "6"),
new AnagramClue("COOL NERD", "Old crone", new WorldPoint(3462, 3557, 0), "East of the Slayer Tower", "What is the combined combat level of each species that live in Slayer tower?", "619"),
new AnagramClue("COPPER ORE CRYPTS", "Prospector Percy", new WorldPoint(3061, 3377, 0), "Motherlode Mine", "During a party, everyone shook hands with everybody else. There were 66 handshakes. How many people were at the party?", "12"),
new AnagramClue("DARN DRAKE", "Daer Krand", new WorldPoint(3728, 3302, 0), "Sisterhood Sanctuary (Slepe Dungeon, northeast of Nightmare Arena)"),
new AnagramClue("DED WAR", "Edward", new WorldPoint(3284, 3943, 0), "Inside Rogue's Castle"),
new AnagramClue("DEKAGRAM", "Dark mage", new WorldPoint(3039, 4835, 0), "Centre of the Abyss", "How many rifts are found here in the abyss?", "13"),
new AnagramClue("DO SAY MORE", "Doomsayer", new WorldPoint(3230, 3230, 0), "East of Lumbridge Castle", "What is 40 divided by 1/2 plus 15?", "95"),
new AnagramClue("DIM THARN", "Mandrith", new WorldPoint(3182, 3946, 0), "Wilderness Resource Area"),
new AnagramClue("DR HITMAN", "Mandrith", new WorldPoint(3182, 3946, 0), "Wilderness Resource Area", "How many scorpions live under the pit?", "28"),
new AnagramClue("DR WARDEN FUNK", "Drunken Dwarf", new WorldPoint(2913, 10221, 0), "East Side of Keldagrim"),
new AnagramClue("DRAGONS LAMENT", "Strange Old Man", new WorldPoint(3564, 3288, 0), "Barrows", "One pipe fills a barrel in 1 hour while another pipe can fill the same barrel in 2 hours. How many minutes will it take to fill the tank if both pipes are used?", "40"),
new AnagramClue("DT RUN B", "Brundt the Chieftain", new WorldPoint(2658, 3670, 0), "Rellekka, main hall", "How many people are waiting for the next bard to perform?", "4"),
new AnagramClue("DUO PLUG", "Dugopul", new WorldPoint(2803, 2744, 0), "Graveyard on Ape Atoll"),
new AnagramClue("EEK ZERO OP", "Zoo keeper", new WorldPoint(2613, 3269, 0), "Ardougne Zoo", "How many animals in total are there in the zoo?", "40"),
new AnagramClue("EL OW", "Lowe", new WorldPoint(3233, 3423, 0), "Varrock archery store"),
new AnagramClue("FORLUN", "Runolf", new WorldPoint(2512, 10256, 0), "Miscellania & Etceteria Dungeon"),
new AnagramClue("GOBLIN KERN", "King Bolren", new WorldPoint(2541, 3170, 0), "Tree Gnome Village"),
new AnagramClue("GOT A BOY", "Gabooty", new WorldPoint(2790, 3066, 0), "Centre of Tai Bwo Wannai", "How many buildings are in the village?", "11"),
new AnagramClue("GOBLETS ODD TOES", "Otto Godblessed", new WorldPoint(2501, 3487, 0), "Otto's Grotto", "How many types of dragon are there beneath the whirlpool's cavern?", "2"),
new AnagramClue("HALT US", "Luthas", new WorldPoint(2938, 3152, 0), "Banana plantation, Karamja"),
new AnagramClue("HEORIC", "Eohric", new WorldPoint(2900, 3565, 0), "Top floor of Burthorpe Castle", "King Arthur and Merlin sit down at the Round Table with 8 knights. How many degrees does each get?", "36"),
new AnagramClue("HIS PHOR", "Horphis", new WorldPoint(1639, 3812, 0), "Arceuus Library, Zeah", "On a scale of 1-10, how helpful is Logosia?", "1"),
new AnagramClue("I AM SIR", "Marisi", new WorldPoint(1737, 3557, 0), "Allotment patch, South of Hosidius chapel", "How many cities form the Kingdom of Great Kourend?", "5"),
new AnagramClue("ICY FE", "Fycie", new WorldPoint(2630, 2997, 0), "East Feldip Hills"),
new AnagramClue("I DOOM ICON INN", "Dominic Onion", new WorldPoint(2609, 3116, 0), "Nightmare Zone", "How many reward points does a herb box cost?", "9,500"),
new AnagramClue("I EVEN", "Nieve", new WorldPoint(2432, 3422, 0), "The slayer master in Gnome Stronghold", "How many farming patches are there in Gnome stronghold?", "2"),
new AnagramClue("IM N ZEZIM", "Immenizz", new WorldPoint(2592, 4324, 0), "The Imp inside Puro-Puro"),
new AnagramClue("KAY SIR", "Sir Kay", new WorldPoint(2760, 3496, 0), "The courtyard in Camelot Castle", "How many fountains are there within the grounds of Camelot castle?", "6"),
new AnagramClue("LEAKEY", "Kaylee", new WorldPoint(2957, 3370, 0), "Rising Sun Inn in Falador", "How many chairs are there in the Rising Sun?", "18"),
new AnagramClue("LARK IN DOG", "King Roald", new WorldPoint(3220, 3476, 0), "Ground floor of Varrock castle", "How many bookcases are there in the palace library?", "24"),
new AnagramClue("LOW LAG", "Gallow", new WorldPoint(1805, 3566, 0), "Vinery in the Great Kourend", "How many vine patches can you find in this vinery?", "12"),
new AnagramClue("LADDER MEMO GUV", "Guard Vemmeldo", new WorldPoint(2447, 3418, 1), "Gnome Stronghold Bank", "How many magic trees can you find inside the Gnome Stronghold?", "3"),
new AnagramClue("MAL IN TAU", "Luminata", new WorldPoint(3508, 3237, 0), "Near Burgh de Rott entrance"),
new AnagramClue("MACHETE CLAM", "Cam the Camel", new WorldPoint(3300, 3231, 0), "Outside Duel Arena", "How many items can carry water in Gielinor?", "6"),
new AnagramClue("ME IF", "Femi", new WorldPoint(2461, 3382, 0), "Gates of Tree Gnome Stronghold"),
new AnagramClue("MOLD LA RAN", "Old Man Ral", new WorldPoint(3602, 3209, 0), "Meiyerditch"),
new AnagramClue("MOTHERBOARD", "Brother Omad", new WorldPoint(2606, 3211, 0), "Monastery south of Ardougne", "What is the next number? 12, 13, 15, 17, 111, 113, 117, 119, 123....?", "129"),
new AnagramClue("MUS KIL READER", "Radimus Erkle", new WorldPoint(2726, 3368, 0), "Legends' Guild"),
new AnagramClue("MY MANGLE LAL", "Lammy Langle", new WorldPoint(1688, 3540, 0), "Hosidius spirit tree patch"),
new AnagramClue("NO OWNER", "Oronwen", new WorldPoint(1162, 3178, 0), "Lletya Seamstress shop in Lletya", "What is the minimum amount of quest points required to reach Lletya?", "20"),
new AnagramClue("NOD MED", "Edmond", new WorldPoint(2566, 3332, 0), "Behind the most NW house in East Ardougne", "How many pigeon cages are there around the back of Jerico's house?", "3"),
new AnagramClue("O BIRDZ A ZANY EN PC", "Cap'n Izzy No-Beard", new WorldPoint(2807, 3191, 0), "Brimhaven Agility Arena", "How many Banana Trees are there in the plantation?", "33"),
new AnagramClue("OK CO", "Cook", new WorldPoint(3207, 3214, 0), "Ground floor of Lumbridge Castle", "How many cannons does Lumbridge Castle have?", "9"),
new AnagramClue("OUR OWN NEEDS", "Nurse Wooned", new WorldPoint(1511, 3619, 0), "Shayzien Infirmary", "How many wounded soldiers are there in the camp?", "16"),
new AnagramClue("PACINNG A TAIE", "Captain Ginea", new WorldPoint(1504, 3632, 0), "Tent east of Shayzien Encampment war tent", "1 soldier can deal with 6 lizardmen. How many soldiers do we need for an army of 678 lizardmen?", "113"),
new AnagramClue("PEAK REFLEX", "Flax keeper", new WorldPoint(2744, 3444, 0), "Flax field south of Seers Village", "If I have 1014 flax, and I spin a third of them into bowstring, how many flax do I have left?", "676"),
new AnagramClue("PEATY PERT", "Party Pete", new WorldPoint(3047, 3376, 0), "Falador Party Room"),
new AnagramClue("QUIT HORRIBLE TYRANT", "Brother Tranquility", new WorldPoint(3681, 2963, 0), "Mos Le'Harmless or Harmony Island", "If I have 49 bottles of rum to share between 7 pirates, how many would each pirate get?", "7"),
new AnagramClue("QUE SIR", "Squire", new WorldPoint(2975, 3343, 0), "Falador Castle Courtyard", "White knights are superior to black knights. 2 white knights can handle 3 black knights. How many knights do we need for an army of 981 black knights?", "654"),
new AnagramClue("R AK MI", "Karim", new WorldPoint(3273, 3181, 0), "Al Kharid Kebab shop", "I have 16 kebabs, I eat one myself and then share the rest equally between 3 friends. How many do they have each?", "5"),
new AnagramClue("RAT MAT WITHIN", "Martin Thwait", new WorldPoint(2906, 3537, 0), "Rogues' Den", "How many natural fires burn in Rogue's Den?", "2"),
new AnagramClue("RATAI", "Taria", new WorldPoint(2940, 3223, 0), "Rimmington bush patch", "How many buildings are there in Rimmington?", "7"),
new AnagramClue("R SLICER", "Clerris", new WorldPoint(1761, 3850, 0), "Arceuus mine, Zeah", "If I have 1,000 blood runes, and cast 131 ice barrage spells, how many blood runes do I have left?", "738"),
new AnagramClue("RIP MAUL", "Primula", new WorldPoint(2454, 2853, 1), "Myth's Guild, first floor"),
new AnagramClue("SAND NUT", "Dunstan", new WorldPoint(2919, 3574, 0), "Anvil in north east Burthorpe", "How much smithing experience does one receive for smelting a blurite bar?", "8"),
new AnagramClue("SLAM DUSTER GRAIL", "Guildmaster Lars", new WorldPoint(1649, 3498, 0), "Woodcutting guild, Zeah"),
new AnagramClue("SLIDE WOMAN", "Wise Old Man", new WorldPoint(3088, 3253, 0), "Draynor Village", "How many bookcases are in the Wise Old Man's house?", "28"),
new AnagramClue("SNAKES SO I SAIL", "Lisse Isaakson", new WorldPoint(2351, 3801, 0), "Neitiznot", "How many arctic logs are required to make a large fremennik round shield?", "2"),
new AnagramClue("TAMED ROCKS", "Dockmaster", new WorldPoint(1822, 3739, 0), "Port Piscarilius, NE of General store", "What is the cube root of 125?", "5"),
new AnagramClue("TEN WIGS ON", "Wingstone", new WorldPoint(3389, 2877, 0), "Between Nardah & Agility Pyramid"),
new AnagramClue("THICKNO", "Hickton", new WorldPoint(2822, 3442, 0), "Catherby fletching shop", "How many ranges are there in Catherby?", "2"),
new AnagramClue("TWENTY CURE IRON", "New Recruit Tony", new WorldPoint(1503, 3553, 0), "Shayzien Graveyard"),
new AnagramClue("UNLEASH NIGHT MIST", "Sigli the Huntsman", new WorldPoint(2660, 3654, 0), "Rellekka", "What is the combined slayer requirement of every monster in the slayer cave?", "302"),
new AnagramClue("VESTE", "Steve", new WorldPoint(2432, 3423, 0), "Upstairs Wyvern Area or Stronghold Slayer Cave", "How many farming patches are there in Gnome stronghold?", "2"),
new AnagramClue("VEIL VEDA", "Evil Dave", new WorldPoint(3079, 9892, 0), "Doris' basement, Edgeville", "What is 333 multiplied by 2?", "666"),
new AnagramClue("WOO AN EGG KIWI", "Awowogei", ObjectID.AWOWOGEI, new WorldPoint(2802, 2765, 0), "Ape Atoll", "If I have 303 bananas, and share them between 31 friends evenly, only handing out full bananas. How many will I have left over?", "24"),
new AnagramClue("MAJORS LAVA BADS AIR", "Ambassador Alvijar", new WorldPoint(2736, 5351, 1), "Dorgesh-Kaan, NE Middle Level", "Double the miles before the initial Dorgeshuun veteran.", "2505"),
new AnagramClue("AN EARL", "Ranael", new WorldPoint(3315, 3163, 0), "Al Kharid skirt shop"),
new AnagramClue("CARPET AHOY", "Apothecary", new WorldPoint(3195, 3404, 0), "Southwest Varrock"),
new AnagramClue("DISORDER", "Sedridor", new WorldPoint(3102, 9570, 0), "Wizards' Tower basement"),
new AnagramClue("I CORD", "Doric", new WorldPoint(2951, 3450, 0), "North of Falador"),
new AnagramClue("IN BAR", "Brian", new WorldPoint(3026, 3246, 0), "Port Sarim battleaxe shop"),
new AnagramClue("RAIN COVE", "Veronica", new WorldPoint(3110, 3330, 0), "Outside Draynor Manor"),
new AnagramClue("RUG DETER", "Gertrude", new WorldPoint(3151, 3412, 0), "West of Varrock, south of the Cooks' Guild"),
new AnagramClue("SIR SHARE RED", "Hairdresser", new WorldPoint(2944, 3381, 0), "Western Falador"),
new AnagramClue("TAUNT ROOF", "Fortunato", new WorldPoint(3080, 3250, 0), "Draynor Village Market"),
new AnagramClue("HICK JET", "Jethick", new WorldPoint(2541, 3305, 0), "West Ardougne", "How many graves are there in the city graveyard?", "38"),
new AnagramClue("RUE GO", "Goreu", new WorldPoint(2335, 3162, 0), "Lletya"),
new AnagramClue("BRUCIE CATNAP", "Captain Bruce", new WorldPoint(1520, 3558, 0), "Graveyard of Heroes"),
new AnagramClue("UESNKRL NRIEDDO", "Drunken soldier", new WorldPoint(1551, 3565, 0), "Shayzien pub", "If 13 Shayzien Soldiers kill 46 Lizardmen each in a day, how many Lizardmen have they killed in total in a single day?", "598")
private static final List<AnagramClue> CLUES = ImmutableList.of(
AnagramClue.builder()
.text("A BAKER")
.npc("Baraek")
.location(new WorldPoint(3217, 3434, 0))
.area("Varrock square")
.question("How many stalls are there in Varrock Square?")
.answer("5")
.build(),
AnagramClue.builder()
.text("A BASIC ANTI POT")
.npc("Captain Tobias")
.location(new WorldPoint(3026, 3216, 0))
.area("Port Sarim")
.question("How many ships are there docked at Port Sarim currently?")
.answer("6")
.build(),
AnagramClue.builder()
.text("A ELF KNOWS")
.npc("Snowflake")
.location(new WorldPoint(2872, 3934, 0))
.area("Weiss")
.build(),
AnagramClue.builder()
.text("A HEART")
.npc("Aretha")
.location(new WorldPoint(1814, 3851, 0))
.area("Soul altar")
.question("32 - 5x = 22, what is x?")
.answer("2")
.build(),
AnagramClue.builder()
.text("AHA JAR")
.npc("Jaraah")
.location(new WorldPoint(3359, 3276, 0))
.area("Duel Arena hospital")
.build(),
AnagramClue.builder()
.text("ARC O LINE")
.npc("Caroline")
.location(new WorldPoint(2715, 3302, 0))
.area("North Witchaven next to the row boat")
.question("How many fishermen are there on the fishing platform?")
.answer("11")
.build(),
AnagramClue.builder()
.text("ARE COL")
.npc("Oracle")
.location(new WorldPoint(3013, 3501, 0))
.area("Ice Mountain West of Edgeville")
.question("If x is 15 and y is 3 what is 3x + y?")
.answer("48")
.build(),
AnagramClue.builder()
.text("ARMCHAIR THE PELT")
.npc("Charlie the Tramp")
.location(new WorldPoint(3209, 3392, 0))
.area("South entrance of Varrock")
.question("How many coins would I have if I have 0 coins and attempt to buy 10 loaves of bread for 3 coins each?")
.answer("0")
.build(),
AnagramClue.builder()
.text("AT HERG")
.npc("Regath")
.location(new WorldPoint(1719, 3723, 0))
.area("General Store, Arceuus, Zeah")
.question("What is -5 to the power of 2?")
.answer("25")
.build(),
AnagramClue.builder()
.text("A BAS")
.npc("Saba")
.location(new WorldPoint(2858, 3577, 0))
.area("Death Plateau")
.build(),
AnagramClue.builder()
.text("AREA CHEF TREK")
.npc("Father Aereck")
.location(new WorldPoint(3243, 3208, 0))
.area("Lumbridge Church")
.question("How many gravestones are in the church graveyard?")
.answer("19 or 20")
.build(),
AnagramClue.builder()
.text("BAIL TRIMS")
.npc("Brimstail")
.location(new WorldPoint(2402, 3419, 0))
.area("West of Stronghold Slayer Cave")
.build(),
AnagramClue.builder()
.text("BAKER CLIMB")
.npc("Brambickle")
.location(new WorldPoint(2783, 3861, 0))
.area("Trollweiss mountain")
.build(),
AnagramClue.builder()
.text("BLUE GRIM GUIDED")
.npc("Lumbridge Guide")
.location(new WorldPoint(3238, 3220, 0))
.area("Lumbridge")
.build(),
AnagramClue.builder()
.text("BY LOOK")
.npc("Bolkoy")
.location(new WorldPoint(2529, 3162, 0))
.area("Tree Gnome Village general store")
.question("How many flowers are there in the clearing below this platform?")
.answer("13")
.build(),
AnagramClue.builder()
.text("CALAMARI MADE MUD")
.npc("Madame Caldarium")
.location(new WorldPoint(2553, 2868, 0))
.area("Corsair Cove")
.question("What is 3(5-3)?")
.answer("6")
.build(),
AnagramClue.builder()
.text("CAR IF ICES")
.npc("Sacrifice")
.location(new WorldPoint(2209, 3056, 0))
.area("Zul-Andra")
.build(),
AnagramClue.builder()
.text("CAREER IN MOON")
.npc("Oneiromancer")
.location(new WorldPoint(2150, 3866, 0))
.area("Astral altar")
.question("How many Suqah inhabit Lunar isle?")
.answer("25")
.build(),
AnagramClue.builder()
.text("CLASH ION")
.npc("Nicholas")
.location(new WorldPoint(1841, 3803, 0))
.area("North of Port Piscarilius fishing shop")
.question("How many windows are in Tynan's shop?")
.answer("4")
.build(),
AnagramClue.builder()
.text("C ON GAME HOC")
.npc("Gnome Coach")
.location(new WorldPoint(2395, 3486, 0))
.area("Gnome Ball course")
.question("How many gnomes on the Gnome ball field have red patches on their uniforms?")
.answer("6")
.build(),
AnagramClue.builder()
.text("COOL NERD")
.npc("Old crone")
.location(new WorldPoint(3462, 3557, 0))
.area("East of the Slayer Tower")
.question("What is the combined combat level of each species that live in Slayer tower?")
.answer("619")
.build(),
AnagramClue.builder()
.text("COPPER ORE CRYPTS")
.npc("Prospector Percy")
.location(new WorldPoint(3061, 3377, 0))
.area("Motherlode Mine")
.question("During a party, everyone shook hands with everybody else. There were 66 handshakes. How many people were at the party?")
.answer("12")
.build(),
AnagramClue.builder()
.text("DARN DRAKE")
.npc("Daer Krand")
.location(new WorldPoint(3728, 3302, 0))
.area("Sisterhood Sanctuary (Slepe Dungeon, northeast of Nightmare Arena)")
.build(),
AnagramClue.builder()
.text("DED WAR")
.npc("Edward")
.location(new WorldPoint(3284, 3943, 0))
.area("Inside Rogue's Castle")
.build(),
AnagramClue.builder()
.text("DEKAGRAM")
.npc("Dark mage")
.location(new WorldPoint(3039, 4835, 0))
.area("Centre of the Abyss")
.question("How many rifts are found here in the abyss?")
.answer("13")
.build(),
AnagramClue.builder()
.text("DO SAY MORE")
.npc("Doomsayer")
.location(new WorldPoint(3230, 3230, 0))
.area("East of Lumbridge Castle")
.question("What is 40 divided by 1/2 plus 15?")
.answer("95")
.build(),
AnagramClue.builder()
.text("DIM THARN")
.npc("Mandrith")
.location(new WorldPoint(3182, 3946, 0))
.area("Wilderness Resource Area")
.build(),
AnagramClue.builder()
.text("DR HITMAN")
.npc("Mandrith")
.location(new WorldPoint(3182, 3946, 0))
.area("Wilderness Resource Area")
.question("How many scorpions live under the pit?")
.answer("28")
.build(),
AnagramClue.builder()
.text("DR WARDEN FUNK")
.npc("Drunken Dwarf")
.location(new WorldPoint(2913, 10221, 0))
.area("East Side of Keldagrim")
.build(),
AnagramClue.builder()
.text("DRAGONS LAMENT")
.npc("Strange Old Man")
.location(new WorldPoint(3564, 3288, 0))
.area("Barrows")
.question("One pipe fills a barrel in 1 hour while another pipe can fill the same barrel in 2 hours. How many minutes will it take to fill the tank if both pipes are used?")
.answer("40")
.build(),
AnagramClue.builder()
.text("DT RUN B")
.npc("Brundt the Chieftain")
.location(new WorldPoint(2658, 3670, 0))
.area("Rellekka, main hall")
.question("How many people are waiting for the next bard to perform?")
.answer("4")
.build(),
AnagramClue.builder()
.text("DUO PLUG")
.npc("Dugopul")
.location(new WorldPoint(2803, 2744, 0))
.area("Graveyard on Ape Atoll")
.build(),
AnagramClue.builder()
.text("EEK ZERO OP")
.npc("Zoo keeper")
.location(new WorldPoint(2613, 3269, 0))
.area("Ardougne Zoo")
.question("How many animals in total are there in the zoo?")
.answer("40")
.build(),
AnagramClue.builder()
.text("EL OW")
.npc("Lowe")
.location(new WorldPoint(3233, 3423, 0))
.area("Varrock archery store")
.build(),
AnagramClue.builder()
.text("FORLUN")
.npc("Runolf")
.location(new WorldPoint(2512, 10256, 0))
.area("Miscellania & Etceteria Dungeon")
.build(),
AnagramClue.builder()
.text("GOBLIN KERN")
.npc("King Bolren")
.location(new WorldPoint(2541, 3170, 0))
.area("Tree Gnome Village")
.build(),
AnagramClue.builder()
.text("GOT A BOY")
.npc("Gabooty")
.location(new WorldPoint(2790, 3066, 0))
.area("Centre of Tai Bwo Wannai")
.question("How many buildings are in the village?")
.answer("11")
.build(),
AnagramClue.builder()
.text("GOBLETS ODD TOES")
.npc("Otto Godblessed")
.location(new WorldPoint(2501, 3487, 0))
.area("Otto's Grotto")
.question("How many types of dragon are there beneath the whirlpool's cavern?")
.answer("2")
.build(),
AnagramClue.builder()
.text("HALT US")
.npc("Luthas")
.location(new WorldPoint(2938, 3152, 0))
.area("Banana plantation, Karamja")
.build(),
AnagramClue.builder()
.text("HEORIC")
.npc("Eohric")
.location(new WorldPoint(2900, 3565, 0))
.area("Top floor of Burthorpe Castle")
.question("King Arthur and Merlin sit down at the Round Table with 8 knights. How many degrees does each get?")
.answer("36")
.build(),
AnagramClue.builder()
.text("HIS PHOR")
.npc("Horphis")
.location(new WorldPoint(1639, 3812, 0))
.area("Arceuus Library, Zeah")
.question("On a scale of 1-10, how helpful is Logosia?")
.answer("1")
.build(),
AnagramClue.builder()
.text("I AM SIR")
.npc("Marisi")
.location(new WorldPoint(1737, 3557, 0))
.area("Allotment patch, South of Hosidius chapel")
.question("How many cities form the Kingdom of Great Kourend?")
.answer("5")
.build(),
AnagramClue.builder()
.text("ICY FE")
.npc("Fycie")
.location(new WorldPoint(2630, 2997, 0))
.area("East Feldip Hills")
.build(),
AnagramClue.builder()
.text("I DOOM ICON INN")
.npc("Dominic Onion")
.location(new WorldPoint(2609, 3116, 0))
.area("Nightmare Zone")
.question("How many reward points does a herb box cost?")
.answer("9,500")
.build(),
AnagramClue.builder()
.text("I EVEN")
.npc("Nieve")
.location(new WorldPoint(2432, 3422, 0))
.area("The slayer master in Gnome Stronghold")
.question("How many farming patches are there in Gnome stronghold?")
.answer("2")
.build(),
AnagramClue.builder()
.text("IM N ZEZIM")
.npc("Immenizz")
.location(new WorldPoint(2592, 4324, 0))
.area("The Imp inside Puro-Puro")
.build(),
AnagramClue.builder()
.text("KAY SIR")
.npc("Sir Kay")
.location(new WorldPoint(2760, 3496, 0))
.area("The courtyard in Camelot Castle")
.question("How many fountains are there within the grounds of Camelot castle?")
.answer("6")
.build(),
AnagramClue.builder()
.text("LEAKEY")
.npc("Kaylee")
.location(new WorldPoint(2957, 3370, 0))
.area("Rising Sun Inn in Falador")
.question("How many chairs are there in the Rising Sun?")
.answer("18")
.build(),
AnagramClue.builder()
.text("LARK IN DOG")
.npc("King Roald")
.location(new WorldPoint(3220, 3476, 0))
.area("Ground floor of Varrock castle")
.question("How many bookcases are there in the palace library?")
.answer("24")
.build(),
AnagramClue.builder()
.text("LOW LAG")
.npc("Gallow")
.location(new WorldPoint(1805, 3566, 0))
.area("Vinery in the Great Kourend")
.question("How many vine patches can you find in this vinery?")
.answer("12")
.build(),
AnagramClue.builder()
.text("LADDER MEMO GUV")
.npc("Guard Vemmeldo")
.location(new WorldPoint(2447, 3418, 1))
.area("Gnome Stronghold Bank")
.question("How many magic trees can you find inside the Gnome Stronghold?")
.answer("3")
.build(),
AnagramClue.builder()
.text("MAL IN TAU")
.npc("Luminata")
.location(new WorldPoint(3508, 3237, 0))
.area("Near Burgh de Rott entrance")
.build(),
AnagramClue.builder()
.text("MACHETE CLAM")
.npc("Cam the Camel")
.location(new WorldPoint(3300, 3231, 0))
.area("Outside Duel Arena")
.question("How many items can carry water in Gielinor?")
.answer("6")
.build(),
AnagramClue.builder()
.text("ME IF")
.npc("Femi")
.location(new WorldPoint(2461, 3382, 0))
.area("Gates of Tree Gnome Stronghold")
.build(),
AnagramClue.builder()
.text("MOLD LA RAN")
.npc("Old Man Ral")
.location(new WorldPoint(3602, 3209, 0))
.area("Meiyerditch")
.build(),
AnagramClue.builder()
.text("MOTHERBOARD")
.npc("Brother Omad")
.location(new WorldPoint(2606, 3211, 0))
.area("Monastery south of Ardougne")
.question("What is the next number? 12, 13, 15, 17, 111, 113, 117, 119, 123....?")
.answer("129")
.build(),
AnagramClue.builder()
.text("MUS KIL READER")
.npc("Radimus Erkle")
.location(new WorldPoint(2726, 3368, 0))
.area("Legends' Guild")
.build(),
AnagramClue.builder()
.text("MY MANGLE LAL")
.npc("Lammy Langle")
.location(new WorldPoint(1688, 3540, 0))
.area("Hosidius spirit tree patch")
.build(),
AnagramClue.builder()
.text("NO OWNER")
.npc("Oronwen")
.location(new WorldPoint(1162, 3178, 0))
.area("Lletya Seamstress shop in Lletya")
.question("What is the minimum amount of quest points required to reach Lletya?")
.answer("20")
.build(),
AnagramClue.builder()
.text("NOD MED")
.npc("Edmond")
.location(new WorldPoint(2566, 3332, 0))
.area("Behind the most NW house in East Ardougne")
.question("How many pigeon cages are there around the back of Jerico's house?")
.answer("3")
.build(),
AnagramClue.builder()
.text("O BIRDZ A ZANY EN PC")
.npc("Cap'n Izzy No-Beard")
.location(new WorldPoint(2807, 3191, 0))
.area("Brimhaven Agility Arena")
.question("How many Banana Trees are there in the plantation?")
.answer("33")
.build(),
AnagramClue.builder()
.text("OK CO")
.npc("Cook")
.location(new WorldPoint(3207, 3214, 0))
.area("Ground floor of Lumbridge Castle")
.question("How many cannons does Lumbridge Castle have?")
.answer("9")
.build(),
AnagramClue.builder()
.text("OUR OWN NEEDS")
.npc("Nurse Wooned")
.location(new WorldPoint(1511, 3619, 0))
.area("Shayzien Infirmary")
.question("How many wounded soldiers are there in the camp?")
.answer("16")
.build(),
AnagramClue.builder()
.text("PACINNG A TAIE")
.npc("Captain Ginea")
.location(new WorldPoint(1504, 3632, 0))
.area("Tent east of Shayzien Encampment war tent")
.question("1 soldier can deal with 6 lizardmen. How many soldiers do we need for an army of 678 lizardmen?")
.answer("113")
.build(),
AnagramClue.builder()
.text("PEAK REFLEX")
.npc("Flax keeper")
.location(new WorldPoint(2744, 3444, 0))
.area("Flax field south of Seers Village")
.question("If I have 1014 flax, and I spin a third of them into bowstring, how many flax do I have left?")
.answer("676")
.build(),
AnagramClue.builder()
.text("PEATY PERT")
.npc("Party Pete")
.location(new WorldPoint(3047, 3376, 0))
.area("Falador Party Room")
.build(),
AnagramClue.builder()
.text("QUIT HORRIBLE TYRANT")
.npc("Brother Tranquility")
.location(new WorldPoint(3681, 2963, 0))
.area("Mos Le'Harmless or Harmony Island")
.question("If I have 49 bottles of rum to share between 7 pirates, how many would each pirate get?")
.answer("7")
.build(),
AnagramClue.builder()
.text("QUE SIR")
.npc("Squire")
.location(new WorldPoint(2975, 3343, 0))
.area("Falador Castle Courtyard")
.question("White knights are superior to black knights. 2 white knights can handle 3 black knights. How many knights do we need for an army of 981 black knights?")
.answer("654")
.build(),
AnagramClue.builder()
.text("R AK MI")
.npc("Karim")
.location(new WorldPoint(3273, 3181, 0))
.area("Al Kharid Kebab shop")
.question("I have 16 kebabs, I eat one myself and then share the rest equally between 3 friends. How many do they have each?")
.answer("5")
.build(),
AnagramClue.builder()
.text("RAT MAT WITHIN")
.npc("Martin Thwait")
.location(new WorldPoint(2906, 3537, 0))
.area("Rogues' Den")
.question("How many natural fires burn in Rogue's Den?")
.answer("2")
.build(),
AnagramClue.builder()
.text("RATAI")
.npc("Taria")
.location(new WorldPoint(2940, 3223, 0))
.area("Rimmington bush patch")
.question("How many buildings are there in Rimmington?")
.answer("7")
.build(),
AnagramClue.builder()
.text("R SLICER")
.npc("Clerris")
.location(new WorldPoint(1761, 3850, 0))
.area("Arceuus mine, Zeah")
.question("If I have 1,000 blood runes, and cast 131 ice barrage spells, how many blood runes do I have left?")
.answer("738")
.build(),
AnagramClue.builder()
.text("RIP MAUL")
.npc("Primula")
.location(new WorldPoint(2454, 2853, 1))
.area("Myth's Guild, first floor")
.build(),
AnagramClue.builder()
.text("SAND NUT")
.npc("Dunstan")
.location(new WorldPoint(2919, 3574, 0))
.area("Anvil in north east Burthorpe")
.question("How much smithing experience does one receive for smelting a blurite bar?")
.answer("8")
.build(),
AnagramClue.builder()
.text("SLAM DUSTER GRAIL")
.npc("Guildmaster Lars")
.location(new WorldPoint(1649, 3498, 0))
.area("Woodcutting guild, Zeah")
.build(),
AnagramClue.builder()
.text("SLIDE WOMAN")
.npc("Wise Old Man")
.location(new WorldPoint(3088, 3253, 0))
.area("Draynor Village")
.question("How many bookcases are in the Wise Old Man's house?")
.answer("28")
.build(),
AnagramClue.builder()
.text("SNAKES SO I SAIL")
.npc("Lisse Isaakson")
.location(new WorldPoint(2351, 3801, 0))
.area("Neitiznot")
.question("How many arctic logs are required to make a large fremennik round shield?")
.answer("2")
.build(),
AnagramClue.builder()
.text("TAMED ROCKS")
.npc("Dockmaster")
.location(new WorldPoint(1822, 3739, 0))
.area("Port Piscarilius, NE of General store")
.question("What is the cube root of 125?")
.answer("5")
.build(),
AnagramClue.builder()
.text("TEN WIGS ON")
.npc("Wingstone")
.location(new WorldPoint(3389, 2877, 0))
.area("Between Nardah & Agility Pyramid")
.build(),
AnagramClue.builder()
.text("THICKNO")
.npc("Hickton")
.location(new WorldPoint(2822, 3442, 0))
.area("Catherby fletching shop")
.question("How many ranges are there in Catherby?")
.answer("2")
.build(),
AnagramClue.builder()
.text("TWENTY CURE IRON")
.npc("New Recruit Tony")
.location(new WorldPoint(1503, 3553, 0))
.area("Shayzien Graveyard")
.build(),
AnagramClue.builder()
.text("UNLEASH NIGHT MIST")
.npc("Sigli the Huntsman")
.location(new WorldPoint(2660, 3654, 0))
.area("Rellekka")
.question("What is the combined slayer requirement of every monster in the slayer cave?")
.answer("302")
.build(),
AnagramClue.builder()
.text("VESTE")
.npc("Steve")
.location(new WorldPoint(2432, 3423, 0))
.area("Upstairs Wyvern Area or Stronghold Slayer Cave")
.question("How many farming patches are there in Gnome stronghold?")
.answer("2")
.build(),
AnagramClue.builder()
.text("VEIL VEDA")
.npc("Evil Dave")
.location(new WorldPoint(3079, 9892, 0))
.area("Doris' basement, Edgeville")
.question("What is 333 multiplied by 2?")
.answer("666")
.build(),
AnagramClue.builder()
.text("WOO AN EGG KIWI")
.npc("Awowogei")
.objectId(ObjectID.AWOWOGEI)
.location(new WorldPoint(2802, 2765, 0))
.area("Ape Atoll")
.question("If I have 303 bananas, and share them between 31 friends evenly, only handing out full bananas. How many will I have left over?")
.answer("24")
.build(),
AnagramClue.builder()
.text("MAJORS LAVA BADS AIR")
.npc("Ambassador Alvijar")
.location(new WorldPoint(2736, 5351, 1))
.area("Dorgesh-Kaan, NE Middle Level")
.question("Double the miles before the initial Dorgeshuun veteran.")
.answer("2505")
.build(),
AnagramClue.builder()
.text("AN EARL")
.npc("Ranael")
.location(new WorldPoint(3315, 3163, 0))
.area("Al Kharid skirt shop")
.build(),
AnagramClue.builder()
.text("CARPET AHOY")
.npc("Apothecary")
.location(new WorldPoint(3195, 3404, 0))
.area("Southwest Varrock")
.build(),
AnagramClue.builder()
.text("DISORDER")
.npc("Sedridor")
.location(new WorldPoint(3102, 9570, 0))
.area("Wizards' Tower basement")
.build(),
AnagramClue.builder()
.text("I CORD")
.npc("Doric")
.location(new WorldPoint(2951, 3450, 0))
.area("North of Falador")
.build(),
AnagramClue.builder()
.text("IN BAR")
.npc("Brian")
.location(new WorldPoint(3026, 3246, 0))
.area("Port Sarim battleaxe shop")
.build(),
AnagramClue.builder()
.text("RAIN COVE")
.npc("Veronica")
.location(new WorldPoint(3110, 3330, 0))
.area("Outside Draynor Manor")
.build(),
AnagramClue.builder()
.text("RUG DETER")
.npc("Gertrude")
.location(new WorldPoint(3151, 3412, 0))
.area("West of Varrock, south of the Cooks' Guild")
.build(),
AnagramClue.builder()
.text("SIR SHARE RED")
.npc("Hairdresser")
.location(new WorldPoint(2944, 3381, 0))
.area("Western Falador")
.build(),
AnagramClue.builder()
.text("TAUNT ROOF")
.npc("Fortunato")
.location(new WorldPoint(3080, 3250, 0))
.area("Draynor Village Market")
.build(),
AnagramClue.builder()
.text("HICK JET")
.npc("Jethick")
.location(new WorldPoint(2541, 3305, 0))
.area("West Ardougne")
.question("How many graves are there in the city graveyard?")
.answer("38")
.build(),
AnagramClue.builder()
.text("RUE GO")
.npc("Goreu")
.location(new WorldPoint(2335, 3162, 0))
.area("Lletya")
.build(),
AnagramClue.builder()
.text("BRUCIE CATNAP")
.npc("Captain Bruce")
.location(new WorldPoint(1520, 3558, 0))
.area("Graveyard of Heroes")
.build(),
AnagramClue.builder()
.text("UESNKRL NRIEDDO")
.npc("Drunken soldier")
.location(new WorldPoint(1551, 3565, 0))
.area("Shayzien pub")
.question("If 13 Shayzien Soldiers kill 46 Lizardmen each in a day, how many Lizardmen have they killed in total in a single day?")
.answer("598")
.build()
);
private final String text;
@@ -161,29 +779,8 @@ public class AnagramClue extends ClueScroll implements TextClueScroll, NpcClueSc
private final String question;
@Nullable
private final String answer;
private int objectId;
private AnagramClue(String text, String npc, WorldPoint location, String area)
{
this(text, npc, location, area, null, null);
}
private AnagramClue(String text, String npc, WorldPoint location, String area, @Nullable String question, @Nullable String answer)
{
this.text = text;
this.npc = npc;
this.location = location;
this.area = area;
this.question = question;
this.answer = answer;
this.objectId = -1;
}
private AnagramClue(String text, String npc, int objectId, WorldPoint location, String area, String question, String answer)
{
this(text, npc, location, area, question, answer);
this.objectId = objectId;
}
@Builder.Default
private final int objectId = -1;
@Override
public void makeOverlayHint(PanelComponent panelComponent, ClueScrollPlugin plugin)
@@ -261,12 +858,12 @@ public class AnagramClue extends ClueScroll implements TextClueScroll, NpcClueSc
@Override
public String[] getNpcs()
{
return new String[] {npc};
return new String[]{npc};
}
@Override
public int[] getObjectIds()
{
return new int[] {objectId};
return new int[]{objectId};
}
}
@@ -24,10 +24,10 @@
*/
package net.runelite.client.plugins.cluescrolls.clues;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableList;
import java.awt.Color;
import java.awt.Graphics2D;
import java.util.Set;
import java.util.List;
import javax.annotation.Nullable;
import lombok.Getter;
import net.runelite.api.NPC;
@@ -43,7 +43,7 @@ import net.runelite.client.ui.overlay.components.TitleComponent;
@Getter
public class CipherClue extends ClueScroll implements TextClueScroll, NpcClueScroll, LocationClueScroll
{
private static final Set<CipherClue> CLUES = ImmutableSet.of(
private static final List<CipherClue> CLUES = ImmutableList.of(
new CipherClue("BMJ UIF LFCBC TFMMFS", "Ali the Kebab seller", new WorldPoint(3354, 2974, 0), "Pollnivneach", "How many coins would you need to purchase 133 kebabs from me?", "399"),
new CipherClue("GUHCHO", "Drezel", new WorldPoint(3440, 9895, 0), "Paterdomus", "Please solve this for x: 7x - 28=21", "7"),
new CipherClue("HQNM LZM STSNQ", "Iron Man tutor", new WorldPoint(3227, 3227, 0), "Outside Lumbridge castle", "How many snakeskins are needed in order to craft 44 boots, 29 vambraces and 34 bandanas?", "666"),
@@ -24,10 +24,10 @@
*/
package net.runelite.client.plugins.cluescrolls.clues;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableList;
import java.awt.Color;
import java.awt.Graphics2D;
import java.util.Set;
import java.util.List;
import javax.annotation.Nullable;
import lombok.Getter;
import net.runelite.api.NPC;
@@ -51,7 +51,7 @@ import net.runelite.client.ui.overlay.components.TitleComponent;
@Getter
public class CrypticClue extends ClueScroll implements TextClueScroll, NpcClueScroll, ObjectClueScroll
{
public static final Set<CrypticClue> CLUES = ImmutableSet.of(
public static final List<CrypticClue> CLUES = ImmutableList.of(
new CrypticClue("Show this to Sherlock.", "Sherlock", new WorldPoint(2733, 3415, 0), "Sherlock is located to the east of the Sorcerer's tower in Seers' Village."),
new CrypticClue("Talk to the bartender of the Rusty Anchor in Port Sarim.", "Bartender", new WorldPoint(3045, 3256, 0), "The Rusty Anchor is located in the north of Port Sarim."),
new CrypticClue("The keeper of Melzars... Spare? Skeleton? Anar?", "Oziach", new WorldPoint(3068, 3516, 0), "Speak to Oziach in Edgeville."),
@@ -24,11 +24,11 @@
*/
package net.runelite.client.plugins.cluescrolls.clues;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableList;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.util.Set;
import java.util.List;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import lombok.Getter;
@@ -100,7 +100,7 @@ public class EmoteClue extends ClueScroll implements TextClueScroll, LocationClu
item(TZKAL_SLAYER_HELMET_I_25914)
);
private static final Set<EmoteClue> CLUES = ImmutableSet.of(
private static final List<EmoteClue> CLUES = ImmutableList.of(
new EmoteClue("Beckon on the east coast of the Kharazi Jungle. Beware of double agents! Equip any vestment stole and a heraldic rune shield.", "Kharazi Jungle", NORTHEAST_CORNER_OF_THE_KHARAZI_JUNGLE, new WorldPoint(2954, 2933, 0), DOUBLE_AGENT_108, BECKON, any("Any stole", item(GUTHIX_STOLE), item(SARADOMIN_STOLE), item(ZAMORAK_STOLE), item(ARMADYL_STOLE), item(BANDOS_STOLE), item(ANCIENT_STOLE)), any("Any heraldic rune shield", item(RUNE_SHIELD_H1), item(RUNE_SHIELD_H2), item(RUNE_SHIELD_H3), item(RUNE_SHIELD_H4), item(RUNE_SHIELD_H5))),
new EmoteClue("Cheer in the Barbarian Agility Arena. Headbang before you talk to me. Equip a steel platebody, maple shortbow and a Wilderness cape.", "Barbarian Outpost", BARBARIAN_OUTPOST_OBSTACLE_COURSE, new WorldPoint(2552, 3556, 0), CHEER, HEADBANG, item(STEEL_PLATEBODY), item(MAPLE_SHORTBOW), range("Any team cape", TEAM1_CAPE, TEAM50_CAPE)),
new EmoteClue("Bow upstairs in the Edgeville Monastery. Equip a completed prayer book.", "Edgeville Monastery", SOUTHEAST_CORNER_OF_THE_MONASTERY, new WorldPoint(3056, 3484, 1), BOW, any("Any god book", item(HOLY_BOOK), item(BOOK_OF_BALANCE), item(UNHOLY_BOOK), item(BOOK_OF_LAW), item(BOOK_OF_WAR), item(BOOK_OF_DARKNESS))),
@@ -24,10 +24,10 @@
*/
package net.runelite.client.plugins.cluescrolls.clues;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableList;
import java.awt.Color;
import java.awt.Graphics2D;
import java.util.Set;
import java.util.List;
import lombok.Getter;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldPoint;
@@ -41,7 +41,7 @@ import net.runelite.client.ui.overlay.components.TitleComponent;
@Getter
public class FairyRingClue extends ClueScroll implements TextClueScroll, LocationClueScroll
{
private static final Set<FairyRingClue> CLUES = ImmutableSet.of(
private static final List<FairyRingClue> CLUES = ImmutableList.of(
new FairyRingClue("A I R 2 3 3 1", new WorldPoint(2702, 3246, 0)),
new FairyRingClue("A I Q 0 4 4 0", new WorldPoint(3000, 3110, 0)),
new FairyRingClue("A L P 1 1 4 0", new WorldPoint(2504, 3633, 0)),
@@ -24,10 +24,10 @@
*/
package net.runelite.client.plugins.cluescrolls.clues;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableList;
import java.awt.Color;
import java.awt.Graphics2D;
import java.util.Set;
import java.util.List;
import lombok.Getter;
import static net.runelite.api.ItemID.*;
import net.runelite.api.ObjectComposition;
@@ -58,7 +58,7 @@ public class MapClue extends ClueScroll implements ObjectClueScroll
public static final String WIZARDS_TOWER_DIS = "On the south side of the Wizard's Tower (DIS)";
public static final String SOUTH_OF_DRAYNOR_BANK = "South of Draynor Village Bank";
private static final Set<MapClue> CLUES = ImmutableSet.of(
private static final List<MapClue> CLUES = ImmutableList.of(
new MapClue(CLUE_SCROLL_EASY_12179, new WorldPoint(3300, 3291, 0), "Al Kharid mine"),
new MapClue(CLUE_SCROLL_EASY_2713, new WorldPoint(3166, 3361, 0), CHAMPIONS_GUILD),
new MapClue(CLUE_SCROLL_EASY_2716, new WorldPoint(3290, 3374, 0), VARROCK_EAST_MINE),
@@ -24,12 +24,11 @@
*/
package net.runelite.client.plugins.cluescrolls.clues;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableList;
import java.awt.Color;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@@ -129,7 +128,7 @@ public class SkillChallengeClue extends ClueScroll implements NpcClueScroll, Nam
item(ItemID.IMCANDO_HAMMER)
);
private static final Set<SkillChallengeClue> CLUES = ImmutableSet.of(
private static final List<SkillChallengeClue> CLUES = ImmutableList.of(
// Charlie Tasks
new SkillChallengeClue("Cook a Pike", "i need to cook charlie a pike.", "i need to take the cooked pike to charlie.", item(ItemID.PIKE), item(ItemID.RAW_PIKE)),
new SkillChallengeClue("Cook a Trout", "i need to cook charlie a trout.", "i need to take the cooked trout to charlie.", item(ItemID.TROUT), item(ItemID.RAW_TROUT)),
@@ -427,9 +427,7 @@ class DevToolsOverlay extends Overlay
private void renderProjectiles(Graphics2D graphics)
{
List<Projectile> projectiles = client.getProjectiles();
for (Projectile projectile : projectiles)
for (Projectile projectile : client.getProjectiles())
{
int projectileId = projectile.getId();
String text = "(ID: " + projectileId + ")";
@@ -446,9 +444,7 @@ class DevToolsOverlay extends Overlay
private void renderGraphicsObjects(Graphics2D graphics)
{
List<GraphicsObject> graphicsObjects = client.getGraphicsObjects();
for (GraphicsObject graphicsObject : graphicsObjects)
for (GraphicsObject graphicsObject : client.getGraphicsObjects())
{
LocalPoint lp = graphicsObject.getLocation();
Polygon poly = Perspective.getCanvasTilePoly(client, lp);
@@ -233,8 +233,10 @@ public class DiscordPlugin extends Plugin
return;
}
CharMatcher matcher = CharMatcher.anyOf("abcdef0123456789");
if (!matcher.matchesAllOf(event.getUserId()) || !matcher.matchesAllOf(event.getAvatarId()))
final CharMatcher matcher = CharMatcher.anyOf("abcdef0123456789");
// animated avatars contain a_ as prefix so we need to get rid of that first to check against matcher
if (!matcher.matchesAllOf(event.getUserId()) || !matcher.matchesAllOf(event.getAvatarId().replace("a_", "")))
{
// userid is actually a snowflake, but the matcher is sufficient
return;
@@ -83,6 +83,7 @@ public class DpsCounterPlugin extends Plugin
KREEARRA, KREEARRA_6492,
KRIL_TSUTSAROTH, KRIL_TSUTSAROTH_6495,
THE_MIMIC, THE_MIMIC_8633,
NEX, NEX_11279, NEX_11280, NEX_11281, NEX_11282,
THE_NIGHTMARE, THE_NIGHTMARE_9426, THE_NIGHTMARE_9427, THE_NIGHTMARE_9428, THE_NIGHTMARE_9429, THE_NIGHTMARE_9430, THE_NIGHTMARE_9431, THE_NIGHTMARE_9432, THE_NIGHTMARE_9433,
OBOR,
SARACHNIS,
@@ -131,6 +131,17 @@ public interface GroundItemsConfig extends Config
{
return false;
}
@ConfigItem(
keyName = "deprioritizeHiddenItems",
name = "Deprioritize Menu Hidden Items",
description = "Depriotizies the menu options for items which are hidden, requiring a right click to pick up.",
position = 5
)
default boolean deprioritizeHiddenItems()
{
return false;
}
@ConfigItem(
keyName = "highlightTiles",
@@ -425,4 +436,15 @@ public interface GroundItemsConfig extends Config
{
return HighlightTier.HIGH;
}
@ConfigItem(
keyName = "lootbeamStyle",
name = "Lootbeam Style",
description = "Style of lootbeam to use",
position = 32
)
default Lootbeam.Style lootbeamStyle()
{
return Lootbeam.Style.MODERN;
}
}
@@ -99,7 +99,7 @@ import net.runelite.client.util.Text;
@PluginDescriptor(
name = "Ground Items",
description = "Highlight ground items and/or show price information",
tags = {"grand", "exchange", "high", "alchemy", "prices", "highlight", "overlay"}
tags = {"grand", "exchange", "high", "alchemy", "prices", "highlight", "overlay", "lootbeam"}
)
public class GroundItemsPlugin extends Plugin
{
@@ -116,8 +116,6 @@ public class GroundItemsPlugin extends Plugin
// ItemID for coins
private static final int COINS = ItemID.COINS_995;
private static final String TELEGRAB_TEXT = ColorUtil.wrapWithColorTag("Telekinetic Grab", Color.GREEN) + ColorUtil.prependColorTag(" -> ", Color.WHITE);
@Getter(AccessLevel.PACKAGE)
@Setter(AccessLevel.PACKAGE)
private Map.Entry<Rectangle, GroundItem> textBoxBounds;
@@ -481,14 +479,11 @@ public class GroundItemsPlugin extends Plugin
@Subscribe
public void onMenuEntryAdded(MenuEntryAdded event)
{
if (config.itemHighlightMode() == ItemHighlightMode.MENU || config.itemHighlightMode() == ItemHighlightMode.BOTH)
MenuAction type = MenuAction.of(event.getType());
if (type == MenuAction.GROUND_ITEM_FIRST_OPTION || type == MenuAction.GROUND_ITEM_SECOND_OPTION ||
type == MenuAction.GROUND_ITEM_THIRD_OPTION || type == MenuAction.GROUND_ITEM_FOURTH_OPTION ||
type == MenuAction.GROUND_ITEM_FIFTH_OPTION || type == MenuAction.SPELL_CAST_ON_GROUND_ITEM)
{
final boolean telegrabEntry = event.getOption().equals("Cast") && event.getTarget().startsWith(TELEGRAB_TEXT) && event.getType() == MenuAction.SPELL_CAST_ON_GROUND_ITEM.getId();
if (!(event.getOption().equals("Take") && event.getType() == MenuAction.GROUND_ITEM_THIRD_OPTION.getId()) && !telegrabEntry)
{
return;
}
final int itemId = event.getIdentifier();
final int sceneX = event.getActionParam0();
final int sceneY = event.getActionParam1();
@@ -507,33 +502,24 @@ public class GroundItemsPlugin extends Plugin
final Color color = getItemColor(highlighted, hidden);
final boolean canBeRecolored = highlighted != null || (hidden != null && config.recolorMenuHiddenItems());
if (color != null && canBeRecolored && !color.equals(config.defaultColor()))
if ((config.itemHighlightMode() == ItemHighlightMode.MENU || config.itemHighlightMode() == ItemHighlightMode.BOTH) &&
(color != null && canBeRecolored && !color.equals(config.defaultColor())))
{
final MenuHighlightMode mode = config.menuHighlightMode();
if (mode == BOTH || mode == OPTION)
{
final String optionText = telegrabEntry ? "Cast" : "Take";
lastEntry.setOption(ColorUtil.prependColorTag(optionText, color));
lastEntry.setOption(ColorUtil.prependColorTag(lastEntry.getOption(), color));
}
if (mode == BOTH || mode == NAME)
{
// <col=ff9040>Logs
// <col=00ff00>Telekinetic Grab</col><col=ffffff> -> <col=ff9040>Logs
String target = lastEntry.getTarget();
if (telegrabEntry)
{
target = target.substring(TELEGRAB_TEXT.length());
}
target = ColorUtil.prependColorTag(target.substring(target.indexOf('>') + 1), color);
if (telegrabEntry)
{
target = TELEGRAB_TEXT + target;
}
lastEntry.setTarget(target);
int i = target.lastIndexOf('>');
lastEntry.setTarget(target.substring(0, i - 11) + ColorUtil.colorTag(color) + target.substring(i + 1));
}
}
@@ -541,6 +527,11 @@ public class GroundItemsPlugin extends Plugin
{
lastEntry.setTarget(lastEntry.getTarget() + " (" + quantity + ")");
}
if (hidden != null && highlighted == null && config.deprioritizeHiddenItems())
{
lastEntry.setDeprioritized(true);
}
}
}
@@ -800,12 +791,13 @@ public class GroundItemsPlugin extends Plugin
Lootbeam lootbeam = lootbeams.get(worldPoint);
if (lootbeam == null)
{
lootbeam = new Lootbeam(client, clientThread, worldPoint, color);
lootbeam = new Lootbeam(client, clientThread, worldPoint, color, config.lootbeamStyle());
lootbeams.put(worldPoint, lootbeam);
}
else
{
lootbeam.setColor(color);
lootbeam.setStyle(config.lootbeamStyle());
}
}
@@ -24,10 +24,14 @@
*/
package net.runelite.client.plugins.grounditems;
import java.util.function.Function;
import lombok.RequiredArgsConstructor;
import net.runelite.api.Animation;
import net.runelite.api.AnimationID;
import net.runelite.api.Client;
import net.runelite.api.JagexColor;
import net.runelite.api.Model;
import net.runelite.api.ModelData;
import net.runelite.api.RuneLiteObject;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldPoint;
@@ -36,22 +40,58 @@ import net.runelite.client.callback.ClientThread;
class Lootbeam
{
private static final int RAID_LIGHT_MODEL = 5809;
private static final short RAID_LIGHT_FIND_COLOR = 6371;
private final RuneLiteObject runeLiteObject;
private final Client client;
private final ClientThread clientThread;
private Color color;
private Style style;
public Lootbeam(Client client, ClientThread clientThread, WorldPoint worldPoint, Color color)
@RequiredArgsConstructor
public enum Style
{
LIGHT(l -> l.client.loadModel(
5809,
new short[]{6371},
new short[]{JagexColor.rgbToHSL(l.color.getRGB(), 1.0d)}
), anim(AnimationID.RAID_LIGHT_ANIMATION)),
MODERN(l ->
{
ModelData md = l.client.loadModelData(43330);
if (md == null)
{
return null;
}
short hsl = JagexColor.rgbToHSL(l.color.getRGB(), 1.0d);
int hue = JagexColor.unpackHue(hsl);
int sat = Math.min(JagexColor.unpackSaturation(hsl) + 1, JagexColor.SATURATION_MAX);
int lum = JagexColor.unpackLuminance(hsl);
return md.cloneColors()
.recolor((short) 26432, JagexColor.packHSL(hue, sat, Math.min(lum + 12, JagexColor.LUMINANCE_MAX)))
.recolor((short) 26584, JagexColor.packHSL(hue, sat - 1, Math.max(lum - 12, 0)))
.light(75, 1875, ModelData.DEFAULT_X, ModelData.DEFAULT_Y, ModelData.DEFAULT_Z);
}, anim(AnimationID.LOOTBEAM_ANIMATION)),
;
private final Function<Lootbeam, Model> modelSupplier;
private final Function<Lootbeam, Animation> animationSupplier;
}
private static Function<Lootbeam, Animation> anim(int id)
{
return b -> b.client.loadAnimation(id);
}
public Lootbeam(Client client, ClientThread clientThread, WorldPoint worldPoint, Color color, Style style)
{
this.client = client;
this.clientThread = clientThread;
runeLiteObject = client.createRuneLiteObject();
setColor(color);
runeLiteObject.setAnimation(client.loadAnimation(AnimationID.RAID_LIGHT_ANIMATION));
this.color = color;
this.style = style;
update();
runeLiteObject.setShouldLoop(true);
LocalPoint lp = LocalPoint.fromWorld(client, worldPoint);
@@ -68,19 +108,34 @@ class Lootbeam
}
this.color = color;
update();
}
public void setStyle(Style style)
{
if (this.style == style)
{
return;
}
this.style = style;
update();
}
private void update()
{
clientThread.invoke(() ->
{
Model m = client.loadModel(
RAID_LIGHT_MODEL,
new short[]{RAID_LIGHT_FIND_COLOR},
new short[]{JagexColor.rgbToHSL(color.getRGB(), 1.0d)}
);
if (m == null)
Model model = style.modelSupplier.apply(this);
if (model == null)
{
return false;
}
runeLiteObject.setModel(m);
Animation anim = style.animationSupplier.apply(this);
runeLiteObject.setAnimation(anim);
runeLiteObject.setModel(model);
return true;
});
}
@@ -46,6 +46,7 @@ public interface ItemChargeConfig extends Config
String KEY_EXPEDITIOUS_BRACELET = "expeditiousBracelet";
String KEY_EXPLORERS_RING = "explorerRing";
String KEY_RING_OF_FORGING = "ringOfForging";
String KEY_BLOOD_ESSENCE = "bloodEssence";
@ConfigSection(
name = "Charge Settings",
@@ -415,4 +416,16 @@ public interface ItemChargeConfig extends Config
{
return true;
}
@ConfigItem(
keyName = "showBloodEssenceCharges",
name = "Blood Essence Charges",
description = "Show Blood Essence charges",
position = 30,
section = chargesSection
)
default boolean showBloodEssenceCharges()
{
return true;
}
}
@@ -130,6 +130,13 @@ public class ItemChargePlugin extends Plugin
"Your expeditious bracelet has (\\d{1,2}) charges? left\\."
);
private static final String EXPEDITIOUS_BRACELET_BREAK_TEXT = "Your Expeditious Bracelet has crumbled to dust.";
private static final Pattern BLOOD_ESSENCE_CHECK_PATTERN = Pattern.compile(
"Your blood essence has (\\d{1,4}) charges? remaining"
);
private static final Pattern BLOOD_ESSENCE_EXTRACT_PATTERN = Pattern.compile(
"You manage to extract power from the Blood Essence and craft (\\d{1,3}) extra runes?\\."
);
private static final String BLOOD_ESSENCE_ACTIVATE_TEXT = "You activate the blood essence.";
private static final int MAX_DODGY_CHARGES = 10;
private static final int MAX_BINDING_CHARGES = 16;
@@ -138,6 +145,7 @@ public class ItemChargePlugin extends Plugin
private static final int MAX_AMULET_OF_CHEMISTRY_CHARGES = 5;
private static final int MAX_AMULET_OF_BOUNTY_CHARGES = 10;
private static final int MAX_SLAYER_BRACELET_CHARGES = 30;
private static final int MAX_BLOOD_ESSENCE_CHARGES = 1000;
private int lastExplorerRingCharge = -1;
@@ -227,6 +235,8 @@ public class ItemChargePlugin extends Plugin
Matcher slaughterCheckMatcher = BRACELET_OF_SLAUGHTER_CHECK_PATTERN.matcher(message);
Matcher expeditiousActivateMatcher = EXPEDITIOUS_BRACELET_ACTIVATE_PATTERN.matcher(message);
Matcher expeditiousCheckMatcher = EXPEDITIOUS_BRACELET_CHECK_PATTERN.matcher(message);
Matcher bloodEssenceCheckMatcher = BLOOD_ESSENCE_CHECK_PATTERN.matcher(message);
Matcher bloodEssenceExtractMatcher = BLOOD_ESSENCE_EXTRACT_PATTERN.matcher(message);
if (config.recoilNotification() && message.contains(RING_OF_RECOIL_BREAK_MESSAGE))
{
@@ -413,6 +423,18 @@ public class ItemChargePlugin extends Plugin
{
updateExpeditiousBraceletCharges(Integer.parseInt(expeditiousCheckMatcher.group(1)));
}
else if (bloodEssenceCheckMatcher.find())
{
updateBloodEssenceCharges(Integer.parseInt(bloodEssenceCheckMatcher.group(1)));
}
else if (bloodEssenceExtractMatcher.find())
{
updateBloodEssenceCharges(getItemCharges(ItemChargeConfig.KEY_BLOOD_ESSENCE) - Integer.parseInt(bloodEssenceExtractMatcher.group(1)));
}
else if (message.contains(BLOOD_ESSENCE_ACTIVATE_TEXT))
{
updateBloodEssenceCharges(MAX_BLOOD_ESSENCE_CHARGES);
}
}
}
@@ -540,6 +562,12 @@ public class ItemChargePlugin extends Plugin
updateInfoboxes();
}
private void updateBloodEssenceCharges(final int value)
{
setItemCharges(ItemChargeConfig.KEY_BLOOD_ESSENCE, value);
updateInfoboxes();
}
private void checkDestroyWidget()
{
final int currentTick = client.getTickCount();
@@ -51,7 +51,8 @@ enum ItemChargeType
SACK(ItemChargeConfig::showSackCharges),
RING_OF_FORGING(ItemChargeConfig::showRingOfForgingCount),
POTION(ItemChargeConfig::showPotionDoseCount),
GUTHIX_REST(ItemChargeConfig::showGuthixRestDoses);
GUTHIX_REST(ItemChargeConfig::showGuthixRestDoses),
BLOOD_ESSENCE(ItemChargeConfig::showBloodEssenceCharges);
private final Predicate<ItemChargeConfig> enabled;
}
@@ -62,6 +62,10 @@ enum ItemWithCharge
ANTIDOTE_PP2(POTION, ANTIDOTE2_5956, 2),
ANTIDOTE_PP3(POTION, ANTIDOTE3_5954, 3),
ANTIDOTE_PP4(POTION, ANTIDOTE4_5952, 4),
ANCIENT_BR1(POTION, ANCIENT_BREW1, 1),
ANCIENT_BR2(POTION, ANCIENT_BREW2, 2),
ANCIENT_BR3(POTION, ANCIENT_BREW3, 3),
ANCIENT_BR4(POTION, ANCIENT_BREW4, 4),
ANTIFIRE1(POTION, ANTIFIRE_POTION1, 1),
ANTIFIRE2(POTION, ANTIFIRE_POTION2, 2),
ANTIFIRE3(POTION, ANTIFIRE_POTION3, 3),
@@ -46,7 +46,8 @@ enum ItemWithConfig
AMULET_OF_BOUNTY(ItemID.AMULET_OF_BOUNTY, ItemChargeConfig.KEY_AMULET_OF_BOUNTY, ItemChargeType.AMULET_OF_BOUNTY),
BRACELET_OF_SLAUGHTER(ItemID.BRACELET_OF_SLAUGHTER, ItemChargeConfig.KEY_BRACELET_OF_SLAUGHTER, ItemChargeType.BRACELET_OF_SLAUGHTER),
EXPEDITIOUS_BRACELET(ItemID.EXPEDITIOUS_BRACELET, ItemChargeConfig.KEY_EXPEDITIOUS_BRACELET, ItemChargeType.EXPEDITIOUS_BRACELET),
CHRONICLE(ItemID.CHRONICLE, ItemChargeConfig.KEY_CHRONICLE, ItemChargeType.TELEPORT);
CHRONICLE(ItemID.CHRONICLE, ItemChargeConfig.KEY_CHRONICLE, ItemChargeType.TELEPORT),
BLOOD_ESSENCE(ItemID.BLOOD_ESSENCE_ACTIVE, ItemChargeConfig.KEY_BLOOD_ESSENCE, ItemChargeType.BLOOD_ESSENCE);
private final int itemId;
private final String configKey;
@@ -293,6 +293,7 @@ enum ItemIdentification
ZAMORAK_BREW(Type.POTION, "ZammyBr", "Za", ItemID.ZAMORAK_BREW4, ItemID.ZAMORAK_BREW3, ItemID.ZAMORAK_BREW2, ItemID.ZAMORAK_BREW1),
SARADOMIN_BREW(Type.POTION, "SaraBr", "Sa", ItemID.SARADOMIN_BREW4, ItemID.SARADOMIN_BREW3, ItemID.SARADOMIN_BREW2, ItemID.SARADOMIN_BREW1),
ANCIENT_BREW(Type.POTION, "AncBr", "A.Br", ItemID.ANCIENT_BREW4, ItemID.ANCIENT_BREW3, ItemID.ANCIENT_BREW2, ItemID.ANCIENT_BREW1),
ANTIPOISON(Type.POTION, "AntiP", "AP", ItemID.ANTIPOISON4, ItemID.ANTIPOISON3, ItemID.ANTIPOISON2, ItemID.ANTIPOISON1),
SUPERANTIPOISON(Type.POTION, "S.AntiP", "S.AP", ItemID.SUPERANTIPOISON4, ItemID.SUPERANTIPOISON3, ItemID.SUPERANTIPOISON2, ItemID.SUPERANTIPOISON1),
@@ -44,6 +44,7 @@ public enum LoginScreenOverride
PRIFDDINAS("prifddinas.jpg"),
THEATRE_OF_BLOOD("tob.jpg"),
A_KINGDOM_DIVIDED("akd.jpg"),
NEX("nex.jpg"),
CUSTOM,
RANDOM;
@@ -787,6 +787,35 @@ public interface MenuEntrySwapperConfig extends Config
return false;
}
enum StairsMode
{
CLIMB,
CLIMB_UP,
CLIMB_DOWN,
}
@ConfigItem(
keyName = "swapStairsLeftClick",
name = "Stairs left-click",
description = "Swap this option when left-clicking stairs. Also works on ladders.",
section = objectSection
)
default StairsMode swapStairsLeftClick()
{
return StairsMode.CLIMB;
}
@ConfigItem(
keyName = "swapStairsShiftClick",
name = "Stairs shift-click",
description = "Swap this option when shift-clicking stairs. Also works on ladders.",
section = objectSection
)
default StairsMode swapStairsShiftClick()
{
return StairsMode.CLIMB;
}
@ConfigItem(
keyName = "swapTemporossLeave",
name = "Tempoross Leave",
@@ -416,6 +416,9 @@ public class MenuEntrySwapperPlugin extends Plugin
swap("eat", "guzzle", config::swapRockCake);
swap("travel", "dive", config::swapRowboatDive);
swap("climb", "climb-up", () -> (shiftModifier() ? config.swapStairsShiftClick() : config.swapStairsLeftClick()) == MenuEntrySwapperConfig.StairsMode.CLIMB_UP);
swap("climb", "climb-down", () -> (shiftModifier() ? config.swapStairsShiftClick() : config.swapStairsLeftClick()) == MenuEntrySwapperConfig.StairsMode.CLIMB_DOWN);
}
public Swap swap(String option, String swappedOption, Supplier<Boolean> enabled)
@@ -614,17 +617,19 @@ public class MenuEntrySwapperPlugin extends Plugin
final boolean isDepositBoxPlayerInventory = widgetGroupId == WidgetID.DEPOSIT_BOX_GROUP_ID;
final boolean isChambersOfXericStorageUnitPlayerInventory = widgetGroupId == WidgetID.CHAMBERS_OF_XERIC_STORAGE_UNIT_INVENTORY_GROUP_ID;
final boolean isGroupStoragePlayerInventory = widgetGroupId == WidgetID.GROUP_STORAGE_INVENTORY_GROUP_ID;
// Swap to shift-click deposit behavior
// Deposit- op 1 is the current withdraw amount 1/5/10/x for deposit box interface and chambers of xeric storage unit.
// Deposit- op 2 is the current withdraw amount 1/5/10/x for bank interface
if (shiftModifier() && config.bankDepositShiftClick() != ShiftDepositMode.OFF
&& menuEntryAdded.getType() == MenuAction.CC_OP.getId()
&& menuEntryAdded.getIdentifier() == (isDepositBoxPlayerInventory || isChambersOfXericStorageUnitPlayerInventory ? 1 : 2)
&& menuEntryAdded.getIdentifier() == (isDepositBoxPlayerInventory || isGroupStoragePlayerInventory || isChambersOfXericStorageUnitPlayerInventory ? 1 : 2)
&& (menuEntryAdded.getOption().startsWith("Deposit-") || menuEntryAdded.getOption().startsWith("Store") || menuEntryAdded.getOption().startsWith("Donate")))
{
ShiftDepositMode shiftDepositMode = config.bankDepositShiftClick();
final int opId = isDepositBoxPlayerInventory ? shiftDepositMode.getIdentifierDepositBox()
: isChambersOfXericStorageUnitPlayerInventory ? shiftDepositMode.getIdentifierChambersStorageUnit()
: isGroupStoragePlayerInventory ? shiftDepositMode.getIdentifierGroupStorage()
: shiftDepositMode.getIdentifier();
final MenuAction action = opId >= 6 ? MenuAction.CC_OP_LOW_PRIORITY : MenuAction.CC_OP;
bankModeSwap(action, opId);
@@ -31,17 +31,18 @@ import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public enum ShiftDepositMode
{
DEPOSIT_1("Deposit-1", 3, 2, 1),
DEPOSIT_5("Deposit-5", 4, 3, 2),
DEPOSIT_10("Deposit-10", 5, 4, 3),
DEPOSIT_X("Deposit-X", 6, 6, 5),
DEPOSIT_ALL("Deposit-All", 8, 5, 4),
EXTRA_OP("Eat/Wield/Etc.", 9, 9, 0),
OFF("Off", 0, 0, 0);
DEPOSIT_1("Deposit-1", 3, 2, 1, 1),
DEPOSIT_5("Deposit-5", 4, 3, 3, 2),
DEPOSIT_10("Deposit-10", 5, 4, 4, 3),
DEPOSIT_X("Deposit-X", 6, 6, 5, 5),
DEPOSIT_ALL("Deposit-All", 8, 5, 7, 4),
EXTRA_OP("Eat/Wield/Etc.", 9, 9, 0, 0),
OFF("Off", 0, 0, 0, 0);
private final String name;
private final int identifier;
private final int identifierDepositBox;
private final int identifierGroupStorage;
private final int identifierChambersStorageUnit;
@Override
@@ -830,7 +830,6 @@ public class RaidsPlugin extends Plugin
log.debug("Setting response {}", response);
final MessageNode messageNode = chatMessage.getMessageNode();
messageNode.setRuneLiteFormatMessage(response);
chatMessageManager.update(messageNode);
client.refreshChat();
}
@@ -94,6 +94,7 @@ public enum HerbloreAction implements ItemSkillAction
WEAPON_POISON_PLUS_PLUS(ItemID.WEAPON_POISON_5940, 82, 190),
EXTENDED_ANTIFIRE_3(ItemID.EXTENDED_ANTIFIRE3, 84, 82.5f),
EXTENDED_ANTIFIRE_4(ItemID.EXTENDED_ANTIFIRE4, 84, 110),
ANCIENT_BREW_4(ItemID.ANCIENT_BREW4, 85, 190),
DIVINE_BASTION_POTION_4(ItemID.DIVINE_BASTION_POTION4, 86, 2),
DIVINE_BATTLEMAGE_POTION_4(ItemID.DIVINE_BATTLEMAGE_POTION4, 86, 2),
ANTIVENOM_3(ItemID.ANTIVENOM3, 87, 90),
@@ -79,7 +79,6 @@ import net.runelite.client.chat.ChatClient;
import net.runelite.client.chat.ChatColorType;
import net.runelite.client.chat.ChatCommandManager;
import net.runelite.client.chat.ChatMessageBuilder;
import net.runelite.client.chat.ChatMessageManager;
import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.events.ChatInput;
@@ -161,9 +160,6 @@ public class SlayerPlugin extends Plugin
@Inject
private TargetWeaknessOverlay targetWeaknessOverlay;
@Inject
private ChatMessageManager chatMessageManager;
@Inject
private ChatCommandManager chatCommandManager;
@@ -875,7 +871,6 @@ public class SlayerPlugin extends Plugin
final MessageNode messageNode = chatMessage.getMessageNode();
messageNode.setRuneLiteFormatMessage(response);
chatMessageManager.update(messageNode);
client.refreshChat();
}
@@ -69,7 +69,6 @@ import net.runelite.api.events.GameTick;
import net.runelite.api.events.ItemContainerChanged;
import net.runelite.api.events.VarbitChanged;
import net.runelite.client.Notifier;
import net.runelite.client.chat.ChatMessageManager;
import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.plugins.Plugin;
@@ -105,9 +104,6 @@ public class WintertodtPlugin extends Plugin
@Inject
private WintertodtConfig config;
@Inject
private ChatMessageManager chatMessageManager;
@Getter(AccessLevel.PACKAGE)
private WintertodtActivity currentActivity = WintertodtActivity.IDLE;
@@ -314,7 +310,6 @@ public class WintertodtPlugin extends Plugin
// Recolor message for damage notification
messageNode.setRuneLiteFormatMessage(ColorUtil.wrapWithColorTag(messageNode.getValue(), config.damageNotificationColor()));
chatMessageManager.update(messageNode);
client.refreshChat();
// all actions except woodcutting and idle are interrupted from damage
@@ -144,7 +144,8 @@ enum MiningSiteLocation
LOVAKENGJ_SOUTH(new WorldPoint(1476, 3779, 0), new Rock(4, Ore.IRON), new Rock(6, Ore.COAL), new Rock(1, Ore.MITHRIL)),
LOVAKENGJ_SULPHUR_EAST(new WorldPoint(1445, 3870, 0), new Rock(3, Ore.VOLCANIC_SULPHUR)),
LOVAKENGJ_SULPHUR_WEST(new WorldPoint(1427, 3870, 0), new Rock(2, Ore.VOLCANIC_SULPHUR)),
LOVAKENGJ_WEST(new WorldPoint(1432, 3845, 0), true, new Rock(45, Ore.COAL), new Rock(80, Ore.LOVAKITE)),
LOVAKENGJ_WEST_1(new WorldPoint(1430, 3849, 0), new Rock(33, Ore.COAL), new Rock(58, Ore.LOVAKITE)),
LOVAKENGJ_WEST_2(new WorldPoint(1447, 3840, 0), new Rock(12, Ore.COAL), new Rock(22, Ore.LOVAKITE)),
LUMBRIDGE_SWAMP_EAST(new WorldPoint(3226, 3146, 0), new Rock(5, Ore.COPPER), new Rock(5, Ore.TIN)),
LUMBRIDGE_SWAMP_WEST(new WorldPoint(3148, 3149, 0),
new Rock(7, Ore.COAL), new Rock(5, Ore.MITHRIL), new Rock(2, Ore.ADAMANTITE)),
@@ -33,6 +33,7 @@ import net.runelite.api.Client;
import net.runelite.api.GameObject;
import net.runelite.api.GameState;
import static net.runelite.api.GraphicID.GRAPHICS_OBJECT_ROCKFALL;
import static net.runelite.api.GraphicID.ZALCANO_PROJECTILE_FIREBALL;
import net.runelite.api.GraphicsObject;
import net.runelite.api.Hitsplat;
import net.runelite.api.NPC;
@@ -40,7 +41,6 @@ import net.runelite.api.NpcID;
import static net.runelite.api.NpcID.ZALCANO;
import net.runelite.api.ObjectID;
import net.runelite.api.Projectile;
import static net.runelite.api.ProjectileID.ZALCANO_PROJECTILE_FIREBALL;
import net.runelite.api.VarPlayer;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldPoint;
@@ -168,7 +168,7 @@ public class ClientUI
this.clientThreadProvider = clientThreadProvider;
this.eventBus = eventBus;
this.safeMode = safeMode;
this.title = RuneLiteProperties.getTitle();
this.title = RuneLiteProperties.getTitle() + (safeMode ? " (safe mode)" : "");
}
@Subscribe
@@ -35,7 +35,7 @@ public class JagexColors
* Colors of chat text when displayed on an opaque background.
*/
public static final Color CHAT_PUBLIC_TEXT_OPAQUE_BACKGROUND = Color.BLUE;
public static final Color CHAT_PRIVATE_MESSAGE_TEXT_OPAQUE_BACKGROUND = Color.CYAN;
public static final Color CHAT_PRIVATE_MESSAGE_TEXT_OPAQUE_BACKGROUND = new Color(0x7F0000); // in chatbox, not split chat
public static final Color CHAT_FC_TEXT_OPAQUE_BACKGROUND = new Color(127, 0, 0);
public static final Color CHAT_FC_NAME_OPAQUE_BACKGROUND = Color.BLUE;
public static final Color CHAT_GAME_EXAMINE_TEXT_OPAQUE_BACKGROUND = Color.BLACK;
@@ -45,7 +45,7 @@ public class JagexColors
* Colors of chat text when displayed on a transparent background.
*/
public static final Color CHAT_PUBLIC_TEXT_TRANSPARENT_BACKGROUND = new Color(144, 144, 255);
public static final Color CHAT_PRIVATE_MESSAGE_TEXT_TRANSPARENT_BACKGROUND = Color.CYAN;
public static final Color CHAT_PRIVATE_MESSAGE_TEXT_TRANSPARENT_BACKGROUND = new Color(0xBF2020); // in chatbox, not split chat
public static final Color CHAT_FC_TEXT_TRANSPARENT_BACKGROUND = new Color(239, 80, 80);
public static final Color CHAT_FC_NAME_TRANSPARENT_BACKGROUND = new Color(144, 112, 255);
public static final Color CHAT_GAME_EXAMINE_TEXT_TRANSPARENT_BACKGROUND = Color.WHITE;
@@ -3,6 +3,22 @@
1,
4051
],
"cannon base": [
6,
26520
],
"cannon stand": [
8,
26522
],
"cannon barrels": [
10,
26524
],
"cannon furnace": [
12,
26526
],
"excalibur": [
35,
8280
@@ -2483,7 +2499,9 @@
24971,
24973,
24994,
24996
24996,
26417,
26419
],
"empty cup": [
1980,
@@ -3297,6 +3315,18 @@
12609,
12611
],
"holy book": [
3840,
26496
],
"unholy book": [
3842,
26498
],
"book of balance": [
3844,
26488
],
"games necklace": [
3853,
3855,
@@ -3499,34 +3529,39 @@
4099,
4109,
20562,
23047
23047,
26531
],
"mystic robe top": [
4091,
4101,
4111,
20425,
23050
23050,
26533
],
"mystic robe bottom": [
4093,
4103,
4113,
20426,
23053
23053,
26535
],
"mystic gloves": [
4095,
4105,
4115,
23056
23056,
26537
],
"mystic boots": [
4097,
4107,
4117,
20579,
23059
23059,
26539
],
"crawling hand": [
4133,
@@ -3542,7 +3577,8 @@
4178,
12773,
12774,
20405
20405,
26482
],
"granite maul": [
4153,
@@ -6124,12 +6160,14 @@
"void knight top": [
8839,
20465,
24177
24177,
26463
],
"void knight robe": [
8840,
20469,
24179
24179,
26465
],
"void knight mace": [
8841,
@@ -6139,7 +6177,8 @@
"void knight gloves": [
8842,
20475,
24182
24182,
26467
],
"bronze defender": [
8844,
@@ -6359,7 +6398,8 @@
],
"rune crossbow": [
9185,
23601
23601,
26486
],
"jade bolts": [
9237,
@@ -7260,17 +7300,20 @@
"void mage helm": [
11663,
20477,
24183
24183,
26473
],
"void ranger helm": [
11664,
20479,
24184
24184,
26475
],
"void melee helm": [
11665,
20481,
24185
24185,
26477
],
"void seal": [
11666,
@@ -7620,6 +7663,10 @@
19720,
23654
],
"abyssal tentacle": [
12006,
26484
],
"soft clay pack": [
12009,
12010,
@@ -7649,6 +7696,18 @@
12692,
25256
],
"book of war": [
12608,
26494
],
"book of law": [
12610,
26492
],
"book of darkness": [
12612,
26490
],
"bandos page": [
12613,
12614,
@@ -7999,12 +8058,14 @@
"elite void top": [
13072,
20467,
24178
24178,
26469
],
"elite void robe": [
13073,
20471,
24180
24180,
26471
],
"crystal halberd": [
13080,
@@ -10240,5 +10301,37 @@
"blood essence": [
26390,
26392
],
"shattered hood": [
26427,
26439,
26451
],
"shattered top": [
26430,
26442,
26454
],
"shattered trousers": [
26433,
26445,
26457
],
"shattered boots": [
26436,
26448,
26460
],
"unidentified fragment": [
26544,
26545,
26546,
26547,
26548
],
"shattered relic hunter armour set": [
26554,
26557,
26560
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

@@ -440,14 +440,16 @@ LABEL391:
if_icmpeq LABEL406
jump LABEL1751
LABEL406:
iconst 0 ; splitpmbox
iload 10 ; message uid
sload 17 ; message channel
sload 16 ; message name
sload 18 ; message
sload 21 ; message timestamp
sconst "chatMessageBuilding"
runelite_callback
runelite_callback
pop_int ; pop uid
pop_int ; splitpmbox
sstore 21 ; message timestamp
sstore 18 ; message
sstore 16 ; message name
@@ -413,14 +413,16 @@ CHAT_FILTER:
if_icmpeq LABEL369 ; Check if we are building this message
jump LABEL555
LABEL369:
iconst 1 ; splitpmbox
iload 12 ; message uid
sconst "" ; message channel
sload 1 ; message name
sload 0 ; message
sload 2 ; message timestamp
sconst "chatMessageBuilding"
runelite_callback
runelite_callback
pop_int ; uid
pop_int ; splitpmbox
sstore 2 ; message timestamp
sstore 0 ; message
sstore 1 ; message name
@@ -1 +1 @@
C85469C2529D794C523505679F14AA20E988513E8FBAF249E41F4760382B4BBB
49856301491D162091426F3F788EA13FDBE3E5BE758471537F5E7AB7A588066B
+132 -167
View File
@@ -12,259 +12,224 @@
iconst 105
iconst 83
iconst 681
get_varc_int 207
coordx
get_varc_int 953
enum
iload 0
if_icmpeq LABEL9
jump LABEL16
LABEL9:
get_varc_int 207
iconst 0
iconst 0
if_icmpeq LABEL8
jump LABEL13
LABEL8:
get_varc_int 960
iload 1
movecoord
set_varc_int 207
jump LABEL227
LABEL16:
add
set_varc_int 960
jump LABEL192
LABEL13:
iconst 105
iconst 83
iconst 681
get_varc_int 208
coordx
get_varc_int 954
enum
iload 0
if_icmpeq LABEL25
jump LABEL32
LABEL25:
get_varc_int 208
iconst 0
iconst 0
if_icmpeq LABEL21
jump LABEL26
LABEL21:
get_varc_int 961
iload 1
movecoord
set_varc_int 208
jump LABEL227
LABEL32:
add
set_varc_int 961
jump LABEL192
LABEL26:
iconst 105
iconst 83
iconst 681
get_varc_int 209
coordx
get_varc_int 955
enum
iload 0
if_icmpeq LABEL41
jump LABEL48
LABEL41:
get_varc_int 209
iconst 0
iconst 0
if_icmpeq LABEL34
jump LABEL39
LABEL34:
get_varc_int 962
iload 1
movecoord
set_varc_int 209
jump LABEL227
LABEL48:
add
set_varc_int 962
jump LABEL192
LABEL39:
iconst 105
iconst 83
iconst 681
get_varc_int 210
coordx
get_varc_int 956
enum
iload 0
if_icmpeq LABEL57
jump LABEL64
LABEL57:
get_varc_int 210
iconst 0
iconst 0
if_icmpeq LABEL47
jump LABEL52
LABEL47:
get_varc_int 963
iload 1
movecoord
set_varc_int 210
jump LABEL227
LABEL64:
add
set_varc_int 963
jump LABEL192
LABEL52:
iconst 105
iconst 83
iconst 681
get_varc_int 211
coordx
get_varc_int 957
enum
iload 0
if_icmpeq LABEL60
jump LABEL65
LABEL60:
get_varc_int 964
iload 1
add
set_varc_int 964
jump LABEL192
LABEL65:
iconst 105
iconst 83
iconst 681
get_varc_int 958
enum
iload 0
if_icmpeq LABEL73
jump LABEL80
jump LABEL78
LABEL73:
get_varc_int 211
iconst 0
iconst 0
get_varc_int 965
iload 1
movecoord
set_varc_int 211
jump LABEL227
LABEL80:
add
set_varc_int 965
jump LABEL192
LABEL78:
iconst 105
iconst 83
iconst 681
get_varc_int 212
coordx
get_varc_int 959
enum
iload 0
if_icmpeq LABEL89
jump LABEL96
LABEL89:
get_varc_int 212
iconst 0
iconst 0
if_icmpeq LABEL86
jump LABEL91
LABEL86:
get_varc_int 966
iload 1
movecoord
set_varc_int 212
jump LABEL227
LABEL96:
iconst 105
iconst 83
iconst 681
get_varc_int 213
coordx
enum
iload 0
if_icmpeq LABEL105
jump LABEL112
LABEL105:
get_varc_int 213
iconst 0
iconst 0
iload 1
movecoord
set_varc_int 213
jump LABEL227
LABEL112:
add
set_varc_int 966
jump LABEL192
LABEL91:
iload 0
iconst 3
if_icmpeq LABEL116
jump LABEL123
LABEL116:
if_icmpeq LABEL95
jump LABEL102
LABEL95:
iload 1
iconst 20000001
if_icmpeq LABEL120
jump LABEL123
LABEL120:
iconst 269500481
set_varc_int 207
jump LABEL227
LABEL123:
get_varc_int 207
if_icmpeq LABEL99
jump LABEL102
LABEL99:
iconst -10
set_varc_int 960
jump LABEL192
LABEL102:
get_varc_int 953
iconst -1
if_icmpeq LABEL127
jump LABEL138
LABEL127:
iconst 0
if_icmpeq LABEL106
jump LABEL115
LABEL106:
iconst 83
iconst 105
iconst 81
iload 0
enum
iconst 0
set_varc_int 953
iload 1
movecoord
set_varc_int 207
jump LABEL227
LABEL138:
get_varc_int 208
set_varc_int 960
jump LABEL192
LABEL115:
get_varc_int 954
iconst -1
if_icmpeq LABEL142
jump LABEL153
LABEL142:
iconst 0
if_icmpeq LABEL119
jump LABEL128
LABEL119:
iconst 83
iconst 105
iconst 81
iload 0
enum
iconst 0
set_varc_int 954
iload 1
movecoord
set_varc_int 208
jump LABEL227
LABEL153:
get_varc_int 209
set_varc_int 961
jump LABEL192
LABEL128:
get_varc_int 955
iconst -1
if_icmpeq LABEL157
jump LABEL168
LABEL157:
iconst 0
if_icmpeq LABEL132
jump LABEL141
LABEL132:
iconst 83
iconst 105
iconst 81
iload 0
enum
iconst 0
set_varc_int 955
iload 1
movecoord
set_varc_int 209
jump LABEL227
LABEL168:
get_varc_int 210
set_varc_int 962
jump LABEL192
LABEL141:
get_varc_int 956
iconst -1
if_icmpeq LABEL172
jump LABEL183
LABEL172:
iconst 0
if_icmpeq LABEL145
jump LABEL154
LABEL145:
iconst 83
iconst 105
iconst 81
iload 0
enum
iconst 0
set_varc_int 956
iload 1
movecoord
set_varc_int 210
jump LABEL227
LABEL183:
get_varc_int 211
set_varc_int 963
jump LABEL192
LABEL154:
get_varc_int 957
iconst -1
if_icmpeq LABEL187
jump LABEL198
LABEL187:
iconst 0
if_icmpeq LABEL158
jump LABEL167
LABEL158:
iconst 83
iconst 105
iconst 81
iload 0
enum
iconst 0
set_varc_int 957
iload 1
movecoord
set_varc_int 211
jump LABEL227
LABEL198:
get_varc_int 212
set_varc_int 964
jump LABEL192
LABEL167:
get_varc_int 958
iconst -1
if_icmpeq LABEL202
jump LABEL213
LABEL202:
iconst 0
if_icmpeq LABEL171
jump LABEL180
LABEL171:
iconst 83
iconst 105
iconst 81
iload 0
enum
iconst 0
set_varc_int 958
iload 1
movecoord
set_varc_int 212
jump LABEL227
LABEL213:
get_varc_int 213
set_varc_int 965
jump LABEL192
LABEL180:
get_varc_int 959
iconst -1
if_icmpeq LABEL217
jump LABEL227
LABEL217:
iconst 0
if_icmpeq LABEL184
jump LABEL192
LABEL184:
iconst 83
iconst 105
iconst 81
iload 0
enum
iconst 0
set_varc_int 959
iload 1
movecoord
set_varc_int 213
LABEL227:
set_varc_int 966
LABEL192:
return
@@ -1 +1 @@
A4641387DC1A542BDEB6F3728D23944F968EF2FD3EA2868B5B6AAF6961D0C6E0
6D7631FB41674C37039A83E08EF9D82B807CC0438AC68FDF5600B3547140298C
File diff suppressed because it is too large Load Diff
@@ -43,7 +43,6 @@ import org.junit.runner.RunWith;
import static org.mockito.ArgumentMatchers.anyLong;
import org.mockito.Mock;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.mockito.junit.MockitoJUnitRunner;
@@ -86,6 +85,7 @@ public class ChatMessageManagerTest
""
};
istack = new int[]{
0, // splitpmbox
1
};
when(client.getStringStack()).thenReturn(sstack);
@@ -183,12 +183,8 @@ public class ChatMessageManagerTest
.append("%)")
.build();
MessageNode messageNode = mock(MessageNode.class);
when(messageNode.getType()).thenReturn(ChatMessageType.FRIENDSCHATNOTIFICATION);
when(messageNode.getRuneLiteFormatMessage()).thenReturn(chatMessage);
String formattedMessage = chatMessageManager.formatRuneLiteMessage(chatMessage, ChatMessageType.FRIENDSCHATNOTIFICATION, false);
chatMessageManager.update(messageNode);
verify(messageNode).setValue("<col=000000>Total points: <col=ff0000>42<col=000000>, Personal points: <col=ff0000>43<col=000000> (<col=ff0000>44<col=000000>%)");
assertEquals("<col=000000>Total points: <col=ff0000>42<col=000000>, Personal points: <col=ff0000>43<col=000000> (<col=ff0000>44<col=000000>%)", formattedMessage);
}
}
@@ -51,7 +51,6 @@ import static net.runelite.api.widgets.WidgetID.DIARY_QUEST_GROUP_ID;
import net.runelite.api.widgets.WidgetInfo;
import net.runelite.client.chat.ChatClient;
import net.runelite.client.chat.ChatCommandManager;
import net.runelite.client.chat.ChatMessageManager;
import net.runelite.client.config.ChatColorConfig;
import net.runelite.client.config.ConfigManager;
import net.runelite.client.config.RuneLiteConfig;
@@ -105,10 +104,6 @@ public class ChatCommandsPluginTest
@Bind
HiscoreClient hiscoreClient;
@Mock
@Bind
ChatMessageManager chatMessageManager;
@Mock
@Bind
ChatClient chatClient;
@@ -37,14 +37,13 @@ import net.runelite.api.MessageNode;
import net.runelite.api.Player;
import net.runelite.api.events.ChatMessage;
import net.runelite.client.Notifier;
import net.runelite.client.chat.ChatMessageManager;
import net.runelite.client.util.Text;
import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import static org.mockito.ArgumentMatchers.any;
import org.mockito.Mock;
import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
@@ -63,10 +62,6 @@ public class ChatNotificationsPluginTest
@Bind
private ChatNotificationsConfig config;
@Mock
@Bind
private ChatMessageManager chatMessageManager;
@Mock
@Bind
private Notifier notifier;
@@ -307,7 +302,7 @@ public class ChatNotificationsPluginTest
ChatMessage chatMessage = new ChatMessage(messageNode, ChatMessageType.GAMEMESSAGE, "", "", "", 0);
chatNotificationsPlugin.onChatMessage(chatMessage);
verify(messageNode).setValue("<colHIGHLIGHT><u>Logic Knot</u></col> received a drop: Adamant longsword");
verify(messageNode).setValue("<colHIGHLIGHT><u>Logic Knot</u><colNORMAL> received a drop: Adamant longsword");
}
@Test
@@ -93,6 +93,10 @@ public class ItemChargePluginTest
private static final String ACTIVATE_EXPEDITIOUS_BRACELET = "Your expeditious bracelet helps you progress your slayer task faster. It has 11 charges left.";
private static final String BREAK_EXPEDITIOUS_BRACELET = "Your expeditious bracelet helps you progress your slayer task faster. <col=ff0000>It then crumbles to dust.</col>";
private static final String ACTIVATE_BLOOD_ESSENCE = "You activate the blood essence.";
private static final String EXTRACT_BLOOD_ESSENCE = "You manage to extract power from the Blood Essence and craft 67 extra runes.";
private static final String CHECK_BLOOD_ESSENCE = "Your blood essence has 56 charges remaining";
@Mock
@Bind
private Client client;
@@ -421,4 +425,29 @@ public class ItemChargePluginTest
itemChargePlugin.onChatMessage(chatMessage);
verify(configManager).setRSProfileConfiguration(ItemChargeConfig.GROUP, ItemChargeConfig.KEY_EXPEDITIOUS_BRACELET, 30);
}
@Test
public void testBloodEssenceActivate()
{
ChatMessage chatMessage = new ChatMessage(null, ChatMessageType.GAMEMESSAGE, "", ACTIVATE_BLOOD_ESSENCE, "", 0);
itemChargePlugin.onChatMessage(chatMessage);
verify(configManager).setRSProfileConfiguration(ItemChargeConfig.GROUP, ItemChargeConfig.KEY_BLOOD_ESSENCE, 1000);
}
@Test
public void testBloodEssenceExtract()
{
ChatMessage chatMessage = new ChatMessage(null, ChatMessageType.GAMEMESSAGE, "", EXTRACT_BLOOD_ESSENCE, "", 0);
when(configManager.getConfiguration(ItemChargeConfig.GROUP, ItemChargeConfig.KEY_BLOOD_ESSENCE, Integer.class)).thenReturn(1000);
itemChargePlugin.onChatMessage(chatMessage);
verify(configManager).setRSProfileConfiguration(ItemChargeConfig.GROUP, ItemChargeConfig.KEY_BLOOD_ESSENCE, 933);
}
@Test
public void testBloodEssenceCheck()
{
ChatMessage chatMessage = new ChatMessage(null, ChatMessageType.GAMEMESSAGE, "", CHECK_BLOOD_ESSENCE, "", 0);
itemChargePlugin.onChatMessage(chatMessage);
verify(configManager).setRSProfileConfiguration(ItemChargeConfig.GROUP, ItemChargeConfig.KEY_BLOOD_ESSENCE, 56);
}
}
@@ -54,7 +54,6 @@ import net.runelite.api.widgets.WidgetInfo;
import net.runelite.client.Notifier;
import net.runelite.client.chat.ChatClient;
import net.runelite.client.chat.ChatCommandManager;
import net.runelite.client.chat.ChatMessageManager;
import net.runelite.client.config.ConfigManager;
import net.runelite.client.game.ItemManager;
import net.runelite.client.game.npcoverlay.NpcOverlayService;
@@ -158,10 +157,6 @@ public class SlayerPluginTest
@Bind
Notifier notifier;
@Mock
@Bind
ChatMessageManager chatMessageManager;
@Mock
@Bind
ChatCommandManager chatCommandManager;
@@ -788,14 +783,15 @@ public class SlayerPluginTest
when(slayerConfig.taskCommand()).thenReturn(true);
when(chatClient.getTask(anyString())).thenReturn(task);
MessageNode messageNode = mock(MessageNode.class);
ChatMessage setMessage = new ChatMessage();
setMessage.setType(ChatMessageType.PUBLICCHAT);
setMessage.setName("Adam");
setMessage.setMessageNode(mock(MessageNode.class));
setMessage.setMessageNode(messageNode);
slayerPlugin.taskLookup(setMessage, "!task");
verify(chatMessageManager).update(any(MessageNode.class));
verify(messageNode).setRuneLiteFormatMessage(anyString());
}
@Test
@@ -810,14 +806,15 @@ public class SlayerPluginTest
when(slayerConfig.taskCommand()).thenReturn(true);
when(chatClient.getTask(anyString())).thenReturn(task);
MessageNode messageNode = mock(MessageNode.class);
ChatMessage chatMessage = new ChatMessage();
chatMessage.setType(ChatMessageType.PUBLICCHAT);
chatMessage.setName("Adam");
chatMessage.setMessageNode(mock(MessageNode.class));
chatMessage.setMessageNode(messageNode);
slayerPlugin.taskLookup(chatMessage, "!task");
verify(chatMessageManager, never()).update(any(MessageNode.class));
verify(messageNode, never()).setRuneLiteFormatMessage(anyString());
}
@Test
@@ -0,0 +1,150 @@
/*
* Copyright (c) 2019, Kusha Gharahi<kusha.me>
* Copyright (c) 2019, Adam <Adam@sigterm.info>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.wintertodt;
import com.google.inject.Guice;
import com.google.inject.testing.fieldbinder.Bind;
import com.google.inject.testing.fieldbinder.BoundFieldModule;
import javax.inject.Inject;
import net.runelite.api.Client;
import net.runelite.api.Varbits;
import net.runelite.api.events.VarbitChanged;
import net.runelite.client.Notifier;
import net.runelite.client.ui.overlay.OverlayManager;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class WintertodtPluginTest
{
@Inject
WintertodtPlugin wintertodtPlugin;
@Mock
@Bind
WintertodtConfig config;
@Mock
@Bind
WintertodtOverlay wintertodtOverlay;
@Mock
@Bind
OverlayManager overlayManager;
@Mock
@Bind
Notifier notifier;
@Mock
@Bind
Client client;
@Before
public void before()
{
Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this);
}
@Test
public void matchStartingNotification_shouldNotify_when15SecondsOptionSelected()
{
when(config.roundNotification()).thenReturn(15);
when(client.getVar(Varbits.WINTERTODT_TIMER)).thenReturn(35);
wintertodtPlugin.onVarbitChanged(new VarbitChanged());
//(15 * 50) / 30 = ~25
when(client.getVar(Varbits.WINTERTODT_TIMER)).thenReturn(25);
wintertodtPlugin.onVarbitChanged(new VarbitChanged());
verify(notifier, times(1)).notify("Wintertodt round is about to start");
}
@Test
public void matchStartingNotification_shouldNotify_when10SecondsOptionSelected()
{
when(config.roundNotification()).thenReturn(10);
when(client.getVar(Varbits.WINTERTODT_TIMER)).thenReturn(20);
wintertodtPlugin.onVarbitChanged(new VarbitChanged());
//(10 * 50) / 30 = ~16
when(client.getVar(Varbits.WINTERTODT_TIMER)).thenReturn(16);
wintertodtPlugin.onVarbitChanged(new VarbitChanged());
verify(notifier, times(1)).notify("Wintertodt round is about to start");
}
@Test
public void matchStartingNotification_shouldNotify_when5SecondsOptionSelected()
{
when(config.roundNotification()).thenReturn(5);
when(client.getVar(Varbits.WINTERTODT_TIMER)).thenReturn(10);
wintertodtPlugin.onVarbitChanged(new VarbitChanged());
//(5 * 50) / 30 = ~8
when(client.getVar(Varbits.WINTERTODT_TIMER)).thenReturn(8);
wintertodtPlugin.onVarbitChanged(new VarbitChanged());
verify(notifier, times(1)).notify("Wintertodt round is about to start");
}
@Test
public void matchStartingNotification_shouldNotifyOnce()
{
when(config.roundNotification()).thenReturn(5);
when(client.getVar(Varbits.WINTERTODT_TIMER)).thenReturn(0);
wintertodtPlugin.onVarbitChanged(new VarbitChanged());
when(client.getVar(Varbits.WINTERTODT_TIMER)).thenReturn(10);
wintertodtPlugin.onVarbitChanged(new VarbitChanged());
when(client.getVar(Varbits.WINTERTODT_TIMER)).thenReturn(8);
wintertodtPlugin.onVarbitChanged(new VarbitChanged());
when(client.getVar(Varbits.WINTERTODT_TIMER)).thenReturn(6);
wintertodtPlugin.onVarbitChanged(new VarbitChanged());
when(client.getVar(Varbits.WINTERTODT_TIMER)).thenReturn(5);
wintertodtPlugin.onVarbitChanged(new VarbitChanged());
when(client.getVar(Varbits.WINTERTODT_TIMER)).thenReturn(4);
wintertodtPlugin.onVarbitChanged(new VarbitChanged());
verify(notifier, times(1)).notify("Wintertodt round is about to start");
}
@Test
public void matchStartingNotification_shouldNotNotify_whenNoneOptionSelected()
{
when(config.roundNotification()).thenReturn(5);
when(client.getVar(Varbits.WINTERTODT_TIMER)).thenReturn(25);
wintertodtPlugin.onVarbitChanged(new VarbitChanged());
verify(notifier, times(0)).notify("Wintertodt round is about to start");
}
}
@@ -47,13 +47,11 @@ public abstract class RSClanSettingsMixin implements RSClanSettings
public List<ClanMember> getMembers()
{
int memberCount = getMemberCount();
String[] memberNames = getMemberNames();
byte[] memberRanks = getMemberRanks();
List<ClanMember> memberList = new ArrayList<>(memberCount);
for (int i = 0; i < memberCount; i++)
{
memberList.add(new ClanMember(memberNames[i], client.getClanRankFromRs(memberRanks[i])));
memberList.add((ClanMember) client.runeliteClanMember(this, i));
}
return memberList;
@@ -65,7 +63,6 @@ public abstract class RSClanSettingsMixin implements RSClanSettings
{
name = name.replace(" ", "\u00A0").toLowerCase();
String[] memberNames = getMemberNames();
byte[] memberRanks = getMemberRanks();
int[] sorted = getSortedMembers();
int i = 0;
@@ -82,7 +79,7 @@ public abstract class RSClanSettingsMixin implements RSClanSettings
}
else if (compare == 0)
{
return new ClanMember(memberName, client.getClanRankFromRs(memberRanks[tag]));
return (ClanMember) client.runeliteClanMember(this, memberIndex);
}
else
{
@@ -39,8 +39,10 @@ import java.util.Map;
import java.util.Set;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import net.runelite.api.Actor;
import net.runelite.api.Animation;
import net.runelite.api.ChatMessageType;
import net.runelite.api.Deque;
import net.runelite.api.EnumComposition;
import net.runelite.api.FriendContainer;
import net.runelite.api.GameState;
@@ -67,10 +69,10 @@ import static net.runelite.api.MenuAction.UNKNOWN;
import net.runelite.api.MenuEntry;
import net.runelite.api.MessageNode;
import net.runelite.api.Model;
import net.runelite.api.ModelData;
import net.runelite.api.NPC;
import net.runelite.api.NPCComposition;
import net.runelite.api.NameableContainer;
import net.runelite.api.Node;
import net.runelite.api.NodeCache;
import net.runelite.api.ObjectComposition;
import net.runelite.api.Perspective;
@@ -144,6 +146,7 @@ import net.runelite.rs.api.RSArchive;
import net.runelite.rs.api.RSChatChannel;
import net.runelite.rs.api.RSClanChannel;
import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSDualNode;
import net.runelite.rs.api.RSEnumComposition;
import net.runelite.rs.api.RSEvictingDualNodeHashTable;
import net.runelite.rs.api.RSFriendSystem;
@@ -158,6 +161,8 @@ import net.runelite.rs.api.RSNodeDeque;
import net.runelite.rs.api.RSNodeHashTable;
import net.runelite.rs.api.RSPacketBuffer;
import net.runelite.rs.api.RSPlayer;
import net.runelite.rs.api.RSProjectile;
import net.runelite.rs.api.RSRuneLiteClanMember;
import net.runelite.rs.api.RSRuneLiteMenuEntry;
import net.runelite.rs.api.RSScene;
import net.runelite.rs.api.RSScriptEvent;
@@ -289,6 +294,9 @@ public abstract class RSClientMixin implements RSClient
@Inject
public long delayNanoTime;
@Inject
public RSEvictingDualNodeHashTable tmpModelDataCache = newEvictingDualNodeHashTable(16);
@Inject
private List<String> outdatedScripts = new ArrayList<>();
@@ -1046,34 +1054,36 @@ public abstract class RSClientMixin implements RSClient
@Inject
@Override
public List<Projectile> getProjectiles()
public Projectile createProjectile(int id, int plane, int startX, int startY, int startZ, int startCycle, int endCycle, int slope, int startHeight, int endHeight, Actor target, int targetX, int targetY)
{
List<Projectile> projectiles = new ArrayList<Projectile>();
RSNodeDeque projectileDeque = this.getProjectilesDeque();
Node head = projectileDeque.getSentinel();
for (Node node = head.getNext(); node != head; node = node.getNext())
int targetIndex = 0;
if (target instanceof NPC)
{
projectiles.add((Projectile) node);
targetIndex = ((NPC) target).getIndex() + 1;
}
else if (target instanceof Player)
{
targetIndex = -(((Player) target).getPlayerId() + 1);
}
return projectiles;
RSProjectile projectile = client.newProjectile(id, plane, startX, startY, startZ, startCycle, endCycle, slope, startHeight, targetIndex, endHeight);
projectile.setDestination(targetX, targetY, Perspective.getTileHeight(client, new LocalPoint(targetX, targetY), client.getPlane()), startCycle + client.getGameCycle());
return projectile;
}
@Inject
@Override
public List<GraphicsObject> getGraphicsObjects()
public Deque<Projectile> getProjectiles()
{
List<GraphicsObject> graphicsObjects = new ArrayList<GraphicsObject>();
RSNodeDeque graphicsObjectDeque = this.getGraphicsObjectDeque();
Node head = graphicsObjectDeque.getSentinel();
return this.getProjectilesDeque();
}
for (Node node = head.getNext(); node != head; node = node.getNext())
{
graphicsObjects.add((GraphicsObject) node);
}
return graphicsObjects;
@Inject
@Override
public Deque<GraphicsObject> getGraphicsObjects()
{
return this.getGraphicsObjectDeque();
}
@Inject
@@ -1448,6 +1458,12 @@ public abstract class RSClientMixin implements RSClient
}
}
@Inject
public static RSRuneLiteClanMember runeLiteClanMember()
{
throw new NotImplementedException();
}
@FieldHook("friendsChat")
@Inject
public static void clanMemberManagerChanged(int idx)
@@ -2600,7 +2616,7 @@ public abstract class RSClientMixin implements RSClient
{
for (int i = 0; i < colorToFind.length; ++i)
{
modeldata.recolor(colorToFind[i], colorToReplace[i]);
modeldata.rs$recolor(colorToFind[i], colorToReplace[i]);
}
}
@@ -2780,5 +2796,45 @@ public abstract class RSClientMixin implements RSClient
check("Widget_cachedSpriteMasks", client.getSpriteMasksCache());
check("WorldMapElement_cachedSprites", client.getSpritesCache());
}
@Inject
@Override
public RSModelData mergeModels(ModelData[] var0, int var1)
{
return newModelData(var0, var1);
}
@Inject
@Override
public RSModelData mergeModels(ModelData... var0)
{
return newModelData(var0, var0.length);
}
@Inject
public IndexDataBase getIndex(int id)
{
return RSClientMixin.archives[id];
}
@Inject
@Override
public RSModelData loadModelData(int var0)
{
RSModelData modelData = (RSModelData) this.tmpModelDataCache.get(var0);
if (modelData == null)
{
modelData = getModelData(RSClientMixin.archives[7], var0, 0);
if (modelData == null)
{
return null;
}
this.tmpModelDataCache.put((RSDualNode) modelData, (long) var0);
}
return modelData.newModelData(modelData, true, true, true, true);
}
}
@@ -32,6 +32,23 @@ import net.runelite.rs.api.RSLinkDeque;
@Mixin(RSLinkDeque.class)
public abstract class RSLinkDequeMixin implements RSLinkDeque
{
@Inject
@Override
public void addLast(Object o)
{
RSLink var1 = (RSLink) o;
if (var1.getNext() != null)
{
var1.remove();
}
var1.setNext(this.getSentinel());
var1.setPrevious(this.getSentinel().getPrevious());
var1.getNext().setPrevious(var1);
var1.getPrevious().setNext(var1);
}
@Inject
@Override
public void clear()
@@ -24,12 +24,18 @@
*/
package net.runelite.mixins;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import net.runelite.api.Model;
import net.runelite.api.ModelData;
import net.runelite.api.mixins.Copy;
import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Replace;
import net.runelite.api.mixins.Shadow;
import net.runelite.api.model.Triangle;
import net.runelite.api.model.Vertex;
import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSModel;
import net.runelite.rs.api.RSModelData;
@@ -124,13 +130,13 @@ public abstract class RSModelDataMixin implements RSModelData
return;
}
final int[] vertexPositionsX = getVertexX();
final int[] vertexPositionsY = getVertexY();
final int[] vertexPositionsZ = getVertexZ();
final int[] vertexPositionsX = getVerticesX();
final int[] vertexPositionsY = getVerticesY();
final int[] vertexPositionsZ = getVerticesZ();
final int[] trianglePointsX = getTrianglePointsX();
final int[] trianglePointsY = getTrianglePointsY();
final int[] trianglePointsZ = getTrianglePointsZ();
final int[] trianglePointsX = getFaceIndices1();
final int[] trianglePointsY = getFaceIndices2();
final int[] trianglePointsZ = getFaceIndices3();
final short[] texTriangleX = getTexTriangleX();
final short[] texTriangleY = getTexTriangleY();
@@ -138,7 +144,7 @@ public abstract class RSModelDataMixin implements RSModelData
final byte[] textureCoords = getTextureCoords();
int faceCount = getTriangleFaceCount();
int faceCount = getFaceCount();
float[] faceTextureUCoordinates = new float[faceCount * 6];
for (int i = 0; i < faceCount; i++)
@@ -222,4 +228,215 @@ public abstract class RSModelDataMixin implements RSModelData
faceTextureUVCoordinates = faceTextureUCoordinates;
}
@Override
@Inject
public List<Vertex> getVertices()
{
int[] verticesX = getVerticesX();
int[] verticesY = getVerticesY();
int[] verticesZ = getVerticesZ();
List<Vertex> vertices = new ArrayList<Vertex>(getVerticesCount());
for (int i = 0; i < getVerticesCount(); ++i)
{
Vertex v = new Vertex(
verticesX[i],
verticesY[i],
verticesZ[i]
);
vertices.add(v);
}
return vertices;
}
@Override
@Inject
public List<Triangle> getTriangles()
{
int[] trianglesX = getFaceIndices1();
int[] trianglesY = getFaceIndices2();
int[] trianglesZ = getFaceIndices3();
List<Vertex> vertices = getVertices();
List<Triangle> triangles = new ArrayList<>(getFaceCount());
for (int i = 0; i < getFaceCount(); ++i)
{
int triangleX = trianglesX[i];
int triangleY = trianglesY[i];
int triangleZ = trianglesZ[i];
Triangle triangle = new Triangle(
vertices.get(triangleX),
vertices.get(triangleY),
vertices.get(triangleZ)
);
triangles.add(triangle);
}
return triangles;
}
@Inject
@Override
public RSModel light()
{
return this.toModel(ModelData.DEFAULT_AMBIENT, ModelData.DEFAULT_CONTRAST, ModelData.DEFAULT_X, ModelData.DEFAULT_Y, ModelData.DEFAULT_Z);
}
@Inject
@Override
public RSModel light(int var1, int var2, int var3, int var4, int var5)
{
return this.toModel(var1, var2, var3, var4, var5);
}
@Inject
@Override
public RSModelData recolor(short colorToReplace, short colorToReplaceWith)
{
this.rs$recolor(colorToReplace, colorToReplaceWith);
return this;
}
@Inject
@Override
public RSModelData retexture(short find, short replace)
{
this.rs$retexture(find, replace);
return this;
}
@Inject
@Override
public RSModelData cloneVertices()
{
int[] newVericesX = Arrays.copyOf(this.getVerticesX(), this.getVerticesX().length);
int[] newVericesY = Arrays.copyOf(this.getVerticesY(), this.getVerticesX().length);
int[] newVericesZ = Arrays.copyOf(this.getVerticesZ(), this.getVerticesX().length);
this.setVerticesX(newVericesX);
this.setVerticesY(newVericesY);
this.setVerticesZ(newVericesZ);
return this;
}
@Inject
@Override
public RSModelData cloneColors()
{
short[] newFaceColor = Arrays.copyOf(this.getFaceColors(), this.getFaceColors().length);
this.setFaceColors(newFaceColor);
return this;
}
@Inject
@Override
public RSModelData cloneTextures()
{
short[] newFaceColor = Arrays.copyOf(this.getFaceTextures(), this.getFaceTextures().length);
this.setFaceTextures(newFaceColor);
return this;
}
@Inject
@Override
public RSModelData cloneTransparencies()
{
byte[] newFaceColor = Arrays.copyOf(this.getFaceTransparencies(), this.getFaceTransparencies().length);
this.setFaceTransparencies(newFaceColor);
return this;
}
@Inject
@Override
public RSModelData rotateY90Ccw()
{
for (int var1 = 0; var1 < this.getVerticesCount(); ++var1)
{
int var2 = this.getVerticesX()[var1];
this.getVerticesX()[var1] = this.getVerticesZ()[var1];
this.getVerticesZ()[var1] = -var2;
}
this.invalidate();
return this;
}
@Inject
@Override
public RSModelData rotateY180Ccw()
{
for (int var1 = 0; var1 < this.getVerticesCount(); ++var1)
{
this.getVerticesX()[var1] = -this.getVerticesX()[var1];
this.getVerticesZ()[var1] = -this.getVerticesZ()[var1];
}
this.invalidate();
return this;
}
@Inject
@Override
public RSModelData rotateY270Ccw()
{
for (int var1 = 0; var1 < this.getVerticesCount(); ++var1)
{
int var2 = this.getVerticesZ()[var1];
this.getVerticesZ()[var1] = this.getVerticesX()[var1];
this.getVerticesX()[var1] = -var2;
}
this.invalidate();
return this;
}
@Inject
@Override
public RSModelData scale(int var1, int var2, int var3)
{
for (int i = 0; i < this.getVerticesCount(); ++i)
{
this.getVerticesX()[i] = this.getVerticesX()[i] * var1 / 128;
this.getVerticesY()[i] = this.getVerticesY()[i] * var2 / 128;
this.getVerticesZ()[i] = this.getVerticesZ()[i] * var3 / 128;
}
this.invalidate();
return this;
}
@Inject
@Override
public RSModelData translate(int var1, int var2, int var3)
{
for (int i = 0; i < this.getVerticesCount(); ++i)
{
int[] vertexX = this.getVerticesX();
int[] vertexY = this.getVerticesY();
int[] vertexZ = this.getVerticesZ();
vertexX[i] += var1;
vertexY[i] += var2;
vertexZ[i] += var3;
}
this.invalidate();
return this;
}
}
@@ -196,6 +196,51 @@ public abstract class RSModelMixin implements RSModel
rsModel.setFaceTextureUVCoordinates(rl$faceTextureUVCoordinates);
}
@Inject
@Override
public RSModel rotateY90Ccw()
{
this.rs$rotateY90Ccw();
return this;
}
@Inject
@Override
public RSModel rotateY180Ccw()
{
this.rs$rotateY180Ccw();
return this;
}
@Inject
@Override
public RSModel rotateY270Ccw()
{
this.rs$rotateY270Ccw();
return this;
}
@Inject
@Override
public RSModel scale(int var1, int var2, int var3)
{
this.rs$scale(var1, var2, var3);
return this;
}
@Inject
@Override
public RSModel translate(int var1, int var2, int var3)
{
this.rs$translate(var1, var2, var3);
return this;
}
@Inject
public void interpolateFrames(RSFrames frames, int frameId, RSFrames nextFrames, int nextFrameId, int interval, int intervalCount)
{
@@ -0,0 +1,51 @@
/*
* Copyright (c) 2016-2017, Adam <Adam@sigterm.info>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.mixins;
import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.Mixin;
import net.runelite.rs.api.RSNode;
import net.runelite.rs.api.RSNodeDeque;
@Mixin(RSNodeDeque.class)
public abstract class RSNodeDequeMixin implements RSNodeDeque
{
@Inject
@Override
public void addLast(Object o)
{
RSNode var1 = (RSNode) o;
if (var1.getNext() != null)
{
var1.unlink();
}
var1.setNext(this.getSentinel());
var1.setPrevious(this.getSentinel().getPrevious());
var1.getNext().setPrevious(var1);
var1.getPrevious().setNext(var1);
}
}
@@ -43,6 +43,12 @@ public abstract class RSProjectileMixin implements RSProjectile
@Shadow("client")
private static RSClient client;
@Inject
private int targetX;
@Inject
private int targetY;
@Inject
RSProjectileMixin()
{
@@ -90,6 +96,13 @@ public abstract class RSProjectileMixin implements RSProjectile
}
}
@Inject
@Override
public LocalPoint getTarget()
{
return new LocalPoint(this.targetX, this.targetY);
}
/**
* Called when a projectile is set to move towards a point. For
* projectiles that target the ground, like AoE projectiles from
@@ -104,6 +117,8 @@ public abstract class RSProjectileMixin implements RSProjectile
@MethodHook("setDestination")
public void projectileMoved(int targetX, int targetY, int targetZ, int cycle)
{
this.targetX = targetX;
this.targetY = targetY;
final LocalPoint position = new LocalPoint(targetX, targetY);
final ProjectileMoved projectileMoved = new ProjectileMoved();
projectileMoved.setProjectile(this);
@@ -125,30 +125,30 @@ public abstract class RSSequenceDefinitionMixin implements RSSequenceDefinition
rotation &= 3;
if (rotation == 1)
{
animatedModel.rotateY270Ccw();
animatedModel.rs$rotateY270Ccw();
}
else if (rotation == 2)
{
animatedModel.rotateY180Ccw();
animatedModel.rs$rotateY180Ccw();
}
else if (rotation == 3)
{
animatedModel.rotateY90Ccw();
animatedModel.rs$rotateY90Ccw();
}
animatedModel.interpolateFrames(frames, frameIdx, nextFrames, nextFrameIdx, interval,
getFrameLengths()[frame]);
// reapply rotation after animating
if (rotation == 1)
{
animatedModel.rotateY90Ccw();
animatedModel.rs$rotateY90Ccw();
}
else if (rotation == 2)
{
animatedModel.rotateY180Ccw();
animatedModel.rs$rotateY180Ccw();
}
else if (rotation == 3)
{
animatedModel.rotateY270Ccw();
animatedModel.rs$rotateY270Ccw();
}
return animatedModel;
}
@@ -21,10 +21,6 @@ public interface RSAbstractArchive extends IndexDataBase
@Override
int[][] getFileIds();
@Import("getFile")
@Override
byte[] getFile(int groupId, int fileId);
@Import("getGroupFileCount")
@Override
int getGroupFileCount(int groupId);
@@ -32,4 +28,8 @@ public interface RSAbstractArchive extends IndexDataBase
@Import("fileCounts")
@Override
int[] getFileCounts();
@Import("getFile")
@Override
byte[] loadData(int groupId, int fileId);
}
@@ -98,6 +98,14 @@ public interface RSActor extends RSRenderable, Actor
@Override
void setGraphic(int id);
@Import("spotAnimationHeight")
@Override
int getGraphicHeight();
@Import("spotAnimationHeight")
@Override
void setGraphicHeight(int id);
@Import("spotAnimationFrame")
int getSpotAnimFrame();
@@ -29,9 +29,11 @@ import java.util.Map;
import net.runelite.api.AmbientSoundEffect;
import net.runelite.api.Client;
import net.runelite.api.Deque;
import net.runelite.api.ModelData;
import net.runelite.api.SpritePixels;
import net.runelite.api.World;
import net.runelite.api.clan.ClanRank;
import net.runelite.api.clan.ClanSettings;
import net.runelite.api.widgets.Widget;
import net.runelite.mapping.Construct;
import net.runelite.mapping.Import;
@@ -1570,4 +1572,16 @@ public interface RSClient extends RSGameEngine, Client
@Construct
RSIterableNodeHashTable createIterableNodeHashTable(int size);
@Construct
RSRuneLiteClanMember runeliteClanMember(ClanSettings var1, int var2);
@Construct
RSProjectile newProjectile(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11);
@Construct
RSModelData newModelData(ModelData[] var1, int var2);
@Construct
RSEvictingDualNodeHashTable newEvictingDualNodeHashTable(int var1);
}
@@ -8,6 +8,9 @@ public interface RSEvictingDualNodeHashTable extends NodeCache
@Import("get")
RSDualNode get(long id);
@Import("put")
void put(RSDualNode var1, long var2);
@Import("dualNode")
RSDualNode getDualNode();
@@ -7,9 +7,18 @@ public interface RSLink
@Import("previous")
RSLink getPrevious();
@Import("previous")
void setPrevious(RSLink var1);
@Import("next")
RSLink next();
@Import("next")
RSLink getNext();
@Import("next")
void setNext(RSLink var1);
@Import("remove")
void remove();
}
@@ -110,13 +110,19 @@ public interface RSModel extends RSRenderable, Model
RSModel toSharedSpotAnimModel(boolean b);
@Import("rotateY90Ccw")
void rotateY90Ccw();
void rs$rotateY90Ccw();
@Import("rotateY180")
void rotateY180Ccw();
void rs$rotateY180Ccw();
@Import("rotateY270Ccw")
void rotateY270Ccw();
void rs$rotateY270Ccw();
@Import("scale")
void rs$scale(int var1, int var2, int var3);
@Import("offsetBy")
void rs$translate(int var1, int var2, int var3);
@Import("radius")
@Override
@@ -1,29 +1,40 @@
package net.runelite.rs.api;
import net.runelite.api.ModelData;
import net.runelite.mapping.Construct;
import net.runelite.mapping.Import;
public interface RSModelData extends RSRenderable
public interface RSModelData extends RSRenderable, ModelData
{
@Import("faceCount")
int getTriangleFaceCount();
int getFaceCount();
@Import("indices1")
int[] getTrianglePointsX();
int[] getFaceIndices1();
@Import("indices2")
int[] getTrianglePointsY();
int[] getFaceIndices2();
@Import("indices3")
int[] getTrianglePointsZ();
int[] getFaceIndices3();
@Import("verticesX")
int[] getVertexX();
int[] getVerticesX();
@Import("verticesX")
void setVerticesX(int[] var1);
@Import("verticesY")
int[] getVertexY();
int[] getVerticesY();
@Import("verticesY")
void setVerticesY(int[] var1);
@Import("verticesZ")
int[] getVertexZ();
int[] getVerticesZ();
@Import("verticesZ")
void setVerticesZ(int[] var1);
@Import("texTriangleX")
short[] getTexTriangleX();
@@ -37,6 +48,21 @@ public interface RSModelData extends RSRenderable
@Import("faceTextures")
short[] getFaceTextures();
@Import("faceTextures")
void setFaceTextures(short[] var1);
@Import("faceAlphas")
byte[] getFaceTransparencies();
@Import("faceAlphas")
void setFaceTransparencies(byte[] var1);
@Import("faceColors")
short[] getFaceColors();
@Import("faceColors")
void setFaceColors(short[] var1);
@Import("textureCoords")
byte[] getTextureCoords();
@@ -53,7 +79,10 @@ public interface RSModelData extends RSRenderable
RSVertexNormal[] getVertexVertices();
@Import("recolor")
void recolor(short var1, short var2);
void rs$recolor(short var1, short var2);
@Import("retexture")
void rs$retexture(short var1, short var2);
@Import("toModel")
RSModel toModel(int var1, int var2, int var3, int var4, int var5);
@@ -63,4 +92,13 @@ public interface RSModelData extends RSRenderable
@Import("contrast")
short getContrast();
@Import("invalidate")
void invalidate();
@Import("copyModelData")
RSModelData shallowCopy();
@Construct
RSModelData newModelData(ModelData var1, boolean var2, boolean var3, boolean var4, boolean var5);
}
@@ -33,14 +33,20 @@ public interface RSNode extends Node
@Override
RSNode getNext();
@Import("key")
@Override
long getHash();
@Import("previous")
void setNext(RSNode var1);
@Import("next")
@Override
RSNode getPrevious();
@Import("next")
void setPrevious(RSNode var1);
@Import("key")
@Override
long getHash();
@Import("remove")
void unlink();
@@ -44,6 +44,9 @@ public interface RSNodeDeque extends Deque
@Import("addFirst")
void addFirst(RSNode val);
@Import("addLast")
void addLast(RSNode val);
@Import("removeLast")
RSNode removeLast();
@@ -62,12 +62,16 @@ public interface RSProjectile extends RSRenderable, Projectile
@Import("cycleStart")
@Override
int getStartMovementCycle();
int getStartCycle();
@Import("cycleEnd")
@Override
int getEndCycle();
@Import("cycleEnd")
@Override
void setEndCycle(int cycle);
@Import("slope")
@Override
int getSlope();
@@ -103,4 +107,7 @@ public interface RSProjectile extends RSRenderable, Projectile
@Import("speedZ")
@Override
double getVelocityZ();
@Import("setDestination")
void setDestination(int targetX, int targetY, int targetZ, int cycle);
}
@@ -0,0 +1,11 @@
package net.runelite.rs.api;
import net.runelite.api.MenuEntry;
import net.runelite.api.clan.ClanRank;
public interface RSRuneLiteClanMember extends MenuEntry
{
ClanRank getRank();
String getName();
}
+2 -1
View File
@@ -233,7 +233,8 @@ public abstract class Actor extends Renderable {
@ObfuscatedGetter(
intValue = -2034554825
)
int field1131;
@Export("spotAnimationHeight")
int spotAnimationHeight;
@ObfuscatedName("bo")
@ObfuscatedGetter(
intValue = -873586319
@@ -358,7 +358,7 @@ public class GrandExchangeOfferOwnWorldComparator implements Comparator {
if ((var5 & 2) != 0) {
var15.spotAnimation = var1.method7403();
var6 = var1.method7412();
var15.field1131 = var6 >> 16;
var15.spotAnimationHeight = var6 >> 16;
var15.field1130 = (var6 & 65535) + Client.cycle;
var15.spotAnimationFrame = 0;
var15.spotAnimationFrameCycle = 0;
@@ -1640,7 +1640,8 @@ public class ModelData extends Renderable {
@ObfuscatedSignature(
descriptor = "()Lge;"
)
public ModelData method3751() {
@Export("copyModelData")
public ModelData copyModelData() {
ModelData var1 = new ModelData();
if (this.faceRenderTypes != null) {
var1.faceRenderTypes = new byte[this.faceCount];
+1 -1
View File
@@ -118,7 +118,7 @@ public final class NPC extends Actor {
if (super.spotAnimation != -1 && super.spotAnimationFrame != -1) {
Model var4 = AccessFile.SpotAnimationDefinition_get(super.spotAnimation).getModel(super.spotAnimationFrame);
if (var4 != null) {
var4.offsetBy(0, -super.field1131, 0);
var4.offsetBy(0, -super.spotAnimationHeight, 0);
Model[] var5 = new Model[]{var3, var4};
var3 = new Model(var5, 2);
}

Some files were not shown because too many files have changed in this diff Show More