Merge pull request #3011 from Owain94/upstream-nomixins-2207
project: Merge upstream
This commit is contained in:
@@ -25,9 +25,9 @@
|
|||||||
|
|
||||||
object ProjectVersions {
|
object ProjectVersions {
|
||||||
const val launcherVersion = "2.2.0"
|
const val launcherVersion = "2.2.0"
|
||||||
const val rlVersion = "1.7.15"
|
const val rlVersion = "1.7.17"
|
||||||
|
|
||||||
const val openosrsVersion = "4.9.5"
|
const val openosrsVersion = "4.9.6"
|
||||||
|
|
||||||
const val rsversion = 197
|
const val rsversion = 197
|
||||||
const val cacheversion = 165
|
const val cacheversion = 165
|
||||||
|
|||||||
@@ -25,10 +25,13 @@
|
|||||||
package net.runelite.http.api.chat;
|
package net.runelite.http.api.chat;
|
||||||
|
|
||||||
import com.google.gson.JsonParseException;
|
import com.google.gson.JsonParseException;
|
||||||
|
import com.google.gson.reflect.TypeToken;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Set;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import net.runelite.http.api.RuneLiteAPI;
|
import net.runelite.http.api.RuneLiteAPI;
|
||||||
import okhttp3.HttpUrl;
|
import okhttp3.HttpUrl;
|
||||||
@@ -362,4 +365,54 @@ public class ChatClient
|
|||||||
throw new IOException(ex);
|
throw new IOException(ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean submitPetList(String username, Collection<Integer> petList) throws IOException
|
||||||
|
{
|
||||||
|
HttpUrl url = RuneLiteAPI.getApiBase().newBuilder()
|
||||||
|
.addPathSegment("chat")
|
||||||
|
.addPathSegment("pets")
|
||||||
|
.addQueryParameter("name", username)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
Request request = new Request.Builder()
|
||||||
|
.post(RequestBody.create(RuneLiteAPI.JSON, RuneLiteAPI.GSON.toJson(petList)))
|
||||||
|
.url(url)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
try (Response response = client.newCall(request).execute())
|
||||||
|
{
|
||||||
|
return response.isSuccessful();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<Integer> getPetList(String username) throws IOException
|
||||||
|
{
|
||||||
|
HttpUrl url = RuneLiteAPI.getApiBase().newBuilder()
|
||||||
|
.addPathSegment("chat")
|
||||||
|
.addPathSegment("pets")
|
||||||
|
.addQueryParameter("name", username)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
Request request = new Request.Builder()
|
||||||
|
.url(url)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
try (Response response = client.newCall(request).execute())
|
||||||
|
{
|
||||||
|
if (!response.isSuccessful())
|
||||||
|
{
|
||||||
|
throw new IOException("Unable to look up pet list!");
|
||||||
|
}
|
||||||
|
|
||||||
|
InputStream in = response.body().byteStream();
|
||||||
|
// CHECKSTYLE:OFF
|
||||||
|
return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in, StandardCharsets.UTF_8),
|
||||||
|
new TypeToken<Set<Integer>>(){}.getType());
|
||||||
|
// CHECKSTYLE:ON
|
||||||
|
}
|
||||||
|
catch (JsonParseException ex)
|
||||||
|
{
|
||||||
|
throw new IOException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -204,6 +204,7 @@ public final class AnimationID
|
|||||||
public static final int LEAGUE_HOME_TELEPORT_4 = 8803;
|
public static final int LEAGUE_HOME_TELEPORT_4 = 8803;
|
||||||
public static final int LEAGUE_HOME_TELEPORT_5 = 8805;
|
public static final int LEAGUE_HOME_TELEPORT_5 = 8805;
|
||||||
public static final int LEAGUE_HOME_TELEPORT_6 = 8807;
|
public static final int LEAGUE_HOME_TELEPORT_6 = 8807;
|
||||||
|
public static final int RAID_LIGHT_ANIMATION = 3101;
|
||||||
|
|
||||||
public static final int CONSTRUCTION = 3676;
|
public static final int CONSTRUCTION = 3676;
|
||||||
public static final int CONSTRUCTION_IMCANDO = 8912;
|
public static final int CONSTRUCTION_IMCANDO = 8912;
|
||||||
|
|||||||
@@ -1078,6 +1078,35 @@ public interface Client extends GameEngine
|
|||||||
*/
|
*/
|
||||||
List<GraphicsObject> getGraphicsObjects();
|
List<GraphicsObject> getGraphicsObjects();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a RuneLiteObject, which is a modified {@link GraphicsObject}
|
||||||
|
*/
|
||||||
|
RuneLiteObject createRuneLiteObject();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads a model from the cache
|
||||||
|
*
|
||||||
|
* @param id the ID of the model
|
||||||
|
*/
|
||||||
|
Model loadModel(int id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads a model from the cache and also recolors it
|
||||||
|
*
|
||||||
|
* @param id the ID of the model
|
||||||
|
* @param colorToFind array of hsl color values to find in the model to replace
|
||||||
|
* @param colorToReplace array of hsl color values to replace in the model
|
||||||
|
*/
|
||||||
|
Model loadModel(int id, short[] colorToFind, short[] colorToReplace);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads an animation from the cache
|
||||||
|
*
|
||||||
|
* @param id the ID of the animation. Any int is allowed, but implementations in the client
|
||||||
|
* should be defined in {@link AnimationID}
|
||||||
|
*/
|
||||||
|
Sequence loadAnimation(int id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the music volume
|
* Gets the music volume
|
||||||
* @return volume 0-255 inclusive
|
* @return volume 0-255 inclusive
|
||||||
|
|||||||
@@ -81,6 +81,27 @@ public class Constants
|
|||||||
public static final int MAX_Z = 4;
|
public static final int MAX_Z = 4;
|
||||||
|
|
||||||
public static final int TILE_FLAG_BRIDGE = 2;
|
public static final int TILE_FLAG_BRIDGE = 2;
|
||||||
|
public static final int TILE_FLAG_UNDER_ROOF = 4;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag for roof removal to remove the roofs above the player's current position.
|
||||||
|
*/
|
||||||
|
public static final int ROOF_FLAG_POSITION = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag for roof removal to remove the roofs above the currently hovered tile.
|
||||||
|
*/
|
||||||
|
public static final int ROOF_FLAG_HOVERED = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag for roof removal to remove the roofs above the player's destination tile.
|
||||||
|
*/
|
||||||
|
public static final int ROOF_FLAG_DESTINATION = 4;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag for roof removal to remove the roofs that are above any tile between the camera and the player.
|
||||||
|
*/
|
||||||
|
public static final int ROOF_FLAG_BETWEEN = 8;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The height of the overworld, in tiles. Coordinates above this are in caves and other such zones.
|
* The height of the overworld, in tiles. Coordinates above this are in caves and other such zones.
|
||||||
|
|||||||
@@ -11988,5 +11988,39 @@ public final class ItemID
|
|||||||
public static final int BOW_OF_FAERDHINEN_C_25892 = 25892;
|
public static final int BOW_OF_FAERDHINEN_C_25892 = 25892;
|
||||||
public static final int BOW_OF_FAERDHINEN_C_25894 = 25894;
|
public static final int BOW_OF_FAERDHINEN_C_25894 = 25894;
|
||||||
public static final int BOW_OF_FAERDHINEN_C_25896 = 25896;
|
public static final int BOW_OF_FAERDHINEN_C_25896 = 25896;
|
||||||
|
public static final int TZTOK_SLAYER_HELMET = 25898;
|
||||||
|
public static final int TZTOK_SLAYER_HELMET_I = 25900;
|
||||||
|
public static final int TZTOK_SLAYER_HELMET_I_25902 = 25902;
|
||||||
|
public static final int VAMPYRIC_SLAYER_HELMET = 25904;
|
||||||
|
public static final int VAMPYRIC_SLAYER_HELMET_I = 25906;
|
||||||
|
public static final int VAMPYRIC_SLAYER_HELMET_I_25908 = 25908;
|
||||||
|
public static final int TZKAL_SLAYER_HELMET = 25910;
|
||||||
|
public static final int TZKAL_SLAYER_HELMET_I = 25912;
|
||||||
|
public static final int TZKAL_SLAYER_HELMET_I_25914 = 25914;
|
||||||
|
public static final int DRAGON_HUNTER_CROSSBOW_T = 25916;
|
||||||
|
public static final int DRAGON_HUNTER_CROSSBOW_B = 25918;
|
||||||
|
public static final int ANTIQUE_LAMP_25920 = 25920;
|
||||||
|
public static final int ANTIQUE_LAMP_25921 = 25921;
|
||||||
|
public static final int ANTIQUE_LAMP_25922 = 25922;
|
||||||
|
public static final int ANTIQUE_LAMP_25923 = 25923;
|
||||||
|
public static final int ANTIQUE_LAMP_25924 = 25924;
|
||||||
|
public static final int ANTIQUE_LAMP_25925 = 25925;
|
||||||
|
public static final int GHOMMALS_HILT_1 = 25926;
|
||||||
|
public static final int GHOMMALS_HILT_2 = 25928;
|
||||||
|
public static final int GHOMMALS_HILT_3 = 25930;
|
||||||
|
public static final int GHOMMALS_HILT_4 = 25932;
|
||||||
|
public static final int GHOMMALS_HILT_5 = 25934;
|
||||||
|
public static final int GHOMMALS_HILT_6 = 25936;
|
||||||
|
public static final int ANIM_OFFHAND = 25938;
|
||||||
|
public static final int ANIM_OFFHAND_25941 = 25941;
|
||||||
|
public static final int ANIM_OFFHAND_25944 = 25944;
|
||||||
|
public static final int ANIM_OFFHAND_25947 = 25947;
|
||||||
|
public static final int ANIM_OFFHAND_25950 = 25950;
|
||||||
|
public static final int ANIM_OFFHAND_25953 = 25953;
|
||||||
|
public static final int COMBAT_ACHIEVEMENTS = 25956;
|
||||||
|
public static final int CORRUPTED_PADDLEFISH = 25958;
|
||||||
|
public static final int CORRUPTED_ESCAPE_CRYSTAL = 25959;
|
||||||
|
public static final int CRYSTAL_PADDLEFISH = 25960;
|
||||||
|
public static final int ESCAPE_CRYSTAL = 25961;
|
||||||
/* This file is automatically generated. Do not edit. */
|
/* This file is automatically generated. Do not edit. */
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019 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.awt.Color;
|
||||||
|
|
||||||
|
public final class JagexColor
|
||||||
|
{
|
||||||
|
public static short packHSL(int hue, int saturation, int luminance)
|
||||||
|
{
|
||||||
|
return (short) ((short) (hue & 63) << 10
|
||||||
|
| (short) (saturation & 7) << 7
|
||||||
|
| (short) (luminance & 127));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static short rgbToHSL(int rgb, double brightness)
|
||||||
|
{
|
||||||
|
if (rgb == 1)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
brightness = 1.D / brightness;
|
||||||
|
|
||||||
|
double r = (double) (rgb >> 16 & 255) / 256.0D;
|
||||||
|
double g = (double) (rgb >> 8 & 255) / 256.0D;
|
||||||
|
double b = (double) (rgb & 255) / 256.0D;
|
||||||
|
|
||||||
|
r = Math.pow(r, brightness);
|
||||||
|
g = Math.pow(g, brightness);
|
||||||
|
b = Math.pow(b, brightness);
|
||||||
|
|
||||||
|
float[] hsv = Color.RGBtoHSB((int) (r * 256.D), (int) (g * 256.D), (int) (b * 256.D), null);
|
||||||
|
double hue = hsv[0];
|
||||||
|
double luminance = hsv[2] - ((hsv[2] * hsv[1]) / 2.F);
|
||||||
|
double saturation = (hsv[2] - luminance) / Math.min(luminance, 1 - luminance);
|
||||||
|
|
||||||
|
return packHSL((int) (Math.ceil(hue * 64.D) % 63.D),
|
||||||
|
(int) Math.ceil(saturation * 7.D),
|
||||||
|
(int) Math.ceil(luminance * 127.D));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9425,5 +9425,6 @@ public final class NpcID
|
|||||||
public static final int SRARACHA_11158 = 11158;
|
public static final int SRARACHA_11158 = 11158;
|
||||||
public static final int SRARACHA_11159 = 11159;
|
public static final int SRARACHA_11159 = 11159;
|
||||||
public static final int SRARACHA_11160 = 11160;
|
public static final int SRARACHA_11160 = 11160;
|
||||||
|
public static final int DUSTY_ALIV = 11161;
|
||||||
/* This file is automatically generated. Do not edit. */
|
/* This file is automatically generated. Do not edit. */
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13699,5 +13699,35 @@ public final class NullItemID
|
|||||||
public static final int NULL_25893 = 25893;
|
public static final int NULL_25893 = 25893;
|
||||||
public static final int NULL_25895 = 25895;
|
public static final int NULL_25895 = 25895;
|
||||||
public static final int NULL_25897 = 25897;
|
public static final int NULL_25897 = 25897;
|
||||||
|
public static final int NULL_25899 = 25899;
|
||||||
|
public static final int NULL_25901 = 25901;
|
||||||
|
public static final int NULL_25903 = 25903;
|
||||||
|
public static final int NULL_25905 = 25905;
|
||||||
|
public static final int NULL_25907 = 25907;
|
||||||
|
public static final int NULL_25909 = 25909;
|
||||||
|
public static final int NULL_25911 = 25911;
|
||||||
|
public static final int NULL_25913 = 25913;
|
||||||
|
public static final int NULL_25915 = 25915;
|
||||||
|
public static final int NULL_25917 = 25917;
|
||||||
|
public static final int NULL_25919 = 25919;
|
||||||
|
public static final int NULL_25927 = 25927;
|
||||||
|
public static final int NULL_25929 = 25929;
|
||||||
|
public static final int NULL_25931 = 25931;
|
||||||
|
public static final int NULL_25933 = 25933;
|
||||||
|
public static final int NULL_25935 = 25935;
|
||||||
|
public static final int NULL_25937 = 25937;
|
||||||
|
public static final int NULL_25939 = 25939;
|
||||||
|
public static final int NULL_25940 = 25940;
|
||||||
|
public static final int NULL_25942 = 25942;
|
||||||
|
public static final int NULL_25943 = 25943;
|
||||||
|
public static final int NULL_25945 = 25945;
|
||||||
|
public static final int NULL_25946 = 25946;
|
||||||
|
public static final int NULL_25948 = 25948;
|
||||||
|
public static final int NULL_25949 = 25949;
|
||||||
|
public static final int NULL_25951 = 25951;
|
||||||
|
public static final int NULL_25952 = 25952;
|
||||||
|
public static final int NULL_25954 = 25954;
|
||||||
|
public static final int NULL_25955 = 25955;
|
||||||
|
public static final int NULL_25957 = 25957;
|
||||||
/* This file is automatically generated. Do not edit. */
|
/* This file is automatically generated. Do not edit. */
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20726,5 +20726,24 @@ public final class NullObjectID
|
|||||||
public static final int NULL_42484 = 42484;
|
public static final int NULL_42484 = 42484;
|
||||||
public static final int NULL_42485 = 42485;
|
public static final int NULL_42485 = 42485;
|
||||||
public static final int NULL_42486 = 42486;
|
public static final int NULL_42486 = 42486;
|
||||||
|
public static final int NULL_42488 = 42488;
|
||||||
|
public static final int NULL_42489 = 42489;
|
||||||
|
public static final int NULL_42490 = 42490;
|
||||||
|
public static final int NULL_42491 = 42491;
|
||||||
|
public static final int NULL_42492 = 42492;
|
||||||
|
public static final int NULL_42493 = 42493;
|
||||||
|
public static final int NULL_42494 = 42494;
|
||||||
|
public static final int NULL_42495 = 42495;
|
||||||
|
public static final int NULL_42496 = 42496;
|
||||||
|
public static final int NULL_42497 = 42497;
|
||||||
|
public static final int NULL_42498 = 42498;
|
||||||
|
public static final int NULL_42499 = 42499;
|
||||||
|
public static final int NULL_42500 = 42500;
|
||||||
|
public static final int NULL_42501 = 42501;
|
||||||
|
public static final int NULL_42502 = 42502;
|
||||||
|
public static final int NULL_42503 = 42503;
|
||||||
|
public static final int NULL_42504 = 42504;
|
||||||
|
public static final int NULL_42505 = 42505;
|
||||||
|
public static final int NULL_42514 = 42514;
|
||||||
/* This file is automatically generated. Do not edit. */
|
/* This file is automatically generated. Do not edit. */
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21747,5 +21747,13 @@ public final class ObjectID
|
|||||||
public static final int YEW_42427 = 42427;
|
public static final int YEW_42427 = 42427;
|
||||||
public static final int GRANDFATHER_CLOCK_42428 = 42428;
|
public static final int GRANDFATHER_CLOCK_42428 = 42428;
|
||||||
public static final int LADDER_42487 = 42487;
|
public static final int LADDER_42487 = 42487;
|
||||||
|
public static final int TUNNEL_42506 = 42506;
|
||||||
|
public static final int TUNNEL_42507 = 42507;
|
||||||
|
public static final int ROCKS_42508 = 42508;
|
||||||
|
public static final int ROCKS_42509 = 42509;
|
||||||
|
public static final int ROCKS_42510 = 42510;
|
||||||
|
public static final int ROCKS_42511 = 42511;
|
||||||
|
public static final int ROCKS_42512 = 42512;
|
||||||
|
public static final int ROCKS_42513 = 42513;
|
||||||
/* This file is automatically generated. Do not edit. */
|
/* This file is automatically generated. Do not edit. */
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,12 +30,13 @@ import lombok.RequiredArgsConstructor;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public enum Quest
|
public enum Quest
|
||||||
{
|
{
|
||||||
|
//Free Quests
|
||||||
BLACK_KNIGHTS_FORTRESS(299, "Black Knights' Fortress"),
|
BLACK_KNIGHTS_FORTRESS(299, "Black Knights' Fortress"),
|
||||||
COOKS_ASSISTANT(300, "Cook's Assistant"),
|
COOKS_ASSISTANT(300, "Cook's Assistant"),
|
||||||
THE_CORSAIR_CURSE(301, "The Corsair Curse"),
|
THE_CORSAIR_CURSE(301, "The Corsair Curse"),
|
||||||
DEMON_SLAYER(302, "Demon Slayer"),
|
DEMON_SLAYER(302, "Demon Slayer"),
|
||||||
DORICS_QUEST(303, "Doric's Quest"),
|
DORICS_QUEST(3138, "Doric's Quest"),
|
||||||
DRAGON_SLAYER_I(304, "Dragon Slayer I"),
|
DRAGON_SLAYER_I(3139, "Dragon Slayer I"),
|
||||||
ERNEST_THE_CHICKEN(305, "Ernest the Chicken"),
|
ERNEST_THE_CHICKEN(305, "Ernest the Chicken"),
|
||||||
GOBLIN_DIPLOMACY(306, "Goblin Diplomacy"),
|
GOBLIN_DIPLOMACY(306, "Goblin Diplomacy"),
|
||||||
IMP_CATCHER(307, "Imp Catcher"),
|
IMP_CATCHER(307, "Imp Catcher"),
|
||||||
@@ -50,7 +51,7 @@ public enum Quest
|
|||||||
SHIELD_OF_ARRAV(316, "Shield of Arrav"),
|
SHIELD_OF_ARRAV(316, "Shield of Arrav"),
|
||||||
VAMPYRE_SLAYER(1278, "Vampyre Slayer"),
|
VAMPYRE_SLAYER(1278, "Vampyre Slayer"),
|
||||||
WITCHS_POTION(318, "Witch's Potion"),
|
WITCHS_POTION(318, "Witch's Potion"),
|
||||||
X_MARKS_THE_SPOT(550, "X Marks the Spot"),
|
X_MARKS_THE_SPOT(3155, "X Marks the Spot"),
|
||||||
BELOW_ICE_MOUNTAIN(2874, "Below Ice Mountain"),
|
BELOW_ICE_MOUNTAIN(2874, "Below Ice Mountain"),
|
||||||
|
|
||||||
//Members' Quests
|
//Members' Quests
|
||||||
@@ -89,7 +90,7 @@ public enum Quest
|
|||||||
FIGHT_ARENA(363, "Fight Arena"),
|
FIGHT_ARENA(363, "Fight Arena"),
|
||||||
FISHING_CONTEST(364, "Fishing Contest"),
|
FISHING_CONTEST(364, "Fishing Contest"),
|
||||||
FORGETTABLE_TALE(365, "Forgettable Tale..."),
|
FORGETTABLE_TALE(365, "Forgettable Tale..."),
|
||||||
BONE_VOYAGE(366, "Bone Voyage"),
|
BONE_VOYAGE(3135, "Bone Voyage"),
|
||||||
THE_FREMENNIK_ISLES(367, "The Fremennik Isles"),
|
THE_FREMENNIK_ISLES(367, "The Fremennik Isles"),
|
||||||
THE_FREMENNIK_TRIALS(368, "The Fremennik Trials"),
|
THE_FREMENNIK_TRIALS(368, "The Fremennik Trials"),
|
||||||
GARDEN_OF_TRANQUILLITY(369, "Garden of Tranquillity"),
|
GARDEN_OF_TRANQUILLITY(369, "Garden of Tranquillity"),
|
||||||
@@ -103,7 +104,7 @@ public enum Quest
|
|||||||
THE_HAND_IN_THE_SAND(377, "The Hand in the Sand"),
|
THE_HAND_IN_THE_SAND(377, "The Hand in the Sand"),
|
||||||
HAUNTED_MINE(378, "Haunted Mine"),
|
HAUNTED_MINE(378, "Haunted Mine"),
|
||||||
HAZEEL_CULT(379, "Hazeel Cult"),
|
HAZEEL_CULT(379, "Hazeel Cult"),
|
||||||
HEROES_QUEST(380, "Heroes' Quest"),
|
HEROES_QUEST(3142, "Heroes' Quest"),
|
||||||
HOLY_GRAIL(381, "Holy Grail"),
|
HOLY_GRAIL(381, "Holy Grail"),
|
||||||
HORROR_FROM_THE_DEEP(382, "Horror from the Deep"),
|
HORROR_FROM_THE_DEEP(382, "Horror from the Deep"),
|
||||||
ICTHLARINS_LITTLE_HELPER(383, "Icthlarin's Little Helper"),
|
ICTHLARINS_LITTLE_HELPER(383, "Icthlarin's Little Helper"),
|
||||||
@@ -111,7 +112,7 @@ public enum Quest
|
|||||||
IN_SEARCH_OF_THE_MYREQUE(385, "In Search of the Myreque"),
|
IN_SEARCH_OF_THE_MYREQUE(385, "In Search of the Myreque"),
|
||||||
JUNGLE_POTION(386, "Jungle Potion"),
|
JUNGLE_POTION(386, "Jungle Potion"),
|
||||||
KINGS_RANSOM(387, "King's Ransom"),
|
KINGS_RANSOM(387, "King's Ransom"),
|
||||||
LEGENDS_QUEST(388, "Legends' Quest"),
|
LEGENDS_QUEST(3145, "Legends' Quest"),
|
||||||
LOST_CITY(389, "Lost City"),
|
LOST_CITY(389, "Lost City"),
|
||||||
THE_LOST_TRIBE(390, "The Lost Tribe"),
|
THE_LOST_TRIBE(390, "The Lost Tribe"),
|
||||||
LUNAR_DIPLOMACY(391, "Lunar Diplomacy"),
|
LUNAR_DIPLOMACY(391, "Lunar Diplomacy"),
|
||||||
@@ -122,18 +123,18 @@ public enum Quest
|
|||||||
MONKEY_MADNESS_II(396, "Monkey Madness II"),
|
MONKEY_MADNESS_II(396, "Monkey Madness II"),
|
||||||
MONKS_FRIEND(397, "Monk's Friend"),
|
MONKS_FRIEND(397, "Monk's Friend"),
|
||||||
MOUNTAIN_DAUGHTER(398, "Mountain Daughter"),
|
MOUNTAIN_DAUGHTER(398, "Mountain Daughter"),
|
||||||
MOURNINGS_END_PART_I(399, "Mourning's End Part I"),
|
MOURNINGS_END_PART_I(3147, "Mourning's End Part I"),
|
||||||
MOURNINGS_END_PART_II(400, "Mourning's End Part II"),
|
MOURNINGS_END_PART_II(3148, "Mourning's End Part II"),
|
||||||
MURDER_MYSTERY(401, "Murder Mystery"),
|
MURDER_MYSTERY(401, "Murder Mystery"),
|
||||||
MY_ARMS_BIG_ADVENTURE(402, "My Arm's Big Adventure"),
|
MY_ARMS_BIG_ADVENTURE(402, "My Arm's Big Adventure"),
|
||||||
NATURE_SPIRIT(403, "Nature Spirit"),
|
NATURE_SPIRIT(403, "Nature Spirit"),
|
||||||
OBSERVATORY_QUEST(404, "Observatory Quest"),
|
OBSERVATORY_QUEST(3149, "Observatory Quest"),
|
||||||
OLAFS_QUEST(405, "Olaf's Quest"),
|
OLAFS_QUEST(3150, "Olaf's Quest"),
|
||||||
ONE_SMALL_FAVOUR(406, "One Small Favour"),
|
ONE_SMALL_FAVOUR(406, "One Small Favour"),
|
||||||
PLAGUE_CITY(407, "Plague City"),
|
PLAGUE_CITY(407, "Plague City"),
|
||||||
PRIEST_IN_PERIL(408, "Priest in Peril"),
|
PRIEST_IN_PERIL(408, "Priest in Peril"),
|
||||||
THE_QUEEN_OF_THIEVES(409, "The Queen of Thieves"),
|
THE_QUEEN_OF_THIEVES(409, "The Queen of Thieves"),
|
||||||
RAG_AND_BONE_MAN_I(410, "Rag and Bone Man I"),
|
RAG_AND_BONE_MAN_I(3152, "Rag and Bone Man I"),
|
||||||
RAG_AND_BONE_MAN_II(411, "Rag and Bone Man II"),
|
RAG_AND_BONE_MAN_II(411, "Rag and Bone Man II"),
|
||||||
RATCATCHERS(412, "Ratcatchers"),
|
RATCATCHERS(412, "Ratcatchers"),
|
||||||
RECIPE_FOR_DISASTER(413, "Recipe for Disaster"),
|
RECIPE_FOR_DISASTER(413, "Recipe for Disaster"),
|
||||||
@@ -166,37 +167,37 @@ public enum Quest
|
|||||||
TROLL_ROMANCE(440, "Troll Romance"),
|
TROLL_ROMANCE(440, "Troll Romance"),
|
||||||
TROLL_STRONGHOLD(441, "Troll Stronghold"),
|
TROLL_STRONGHOLD(441, "Troll Stronghold"),
|
||||||
UNDERGROUND_PASS(442, "Underground Pass"),
|
UNDERGROUND_PASS(442, "Underground Pass"),
|
||||||
CLIENT_OF_KOUREND(443, "Client of Kourend"),
|
CLIENT_OF_KOUREND(3136, "Client of Kourend"),
|
||||||
WANTED(444, "Wanted!"),
|
WANTED(444, "Wanted!"),
|
||||||
WATCHTOWER(445, "Watchtower"),
|
WATCHTOWER(445, "Watchtower"),
|
||||||
WATERFALL_QUEST(446, "Waterfall Quest"),
|
WATERFALL_QUEST(3154, "Waterfall Quest"),
|
||||||
WHAT_LIES_BELOW(447, "What Lies Below"),
|
WHAT_LIES_BELOW(447, "What Lies Below"),
|
||||||
WITCHS_HOUSE(448, "Witch's House"),
|
WITCHS_HOUSE(448, "Witch's House"),
|
||||||
ZOGRE_FLESH_EATERS(449, "Zogre Flesh Eaters"),
|
ZOGRE_FLESH_EATERS(449, "Zogre Flesh Eaters"),
|
||||||
THE_ASCENT_OF_ARCEUUS(542, "The Ascent of Arceuus"),
|
THE_ASCENT_OF_ARCEUUS(542, "The Ascent of Arceuus"),
|
||||||
THE_FORSAKEN_TOWER(543, "The Forsaken Tower"),
|
THE_FORSAKEN_TOWER(543, "The Forsaken Tower"),
|
||||||
SONG_OF_THE_ELVES(603, "Song of the Elves"),
|
SONG_OF_THE_ELVES(603, "Song of the Elves"),
|
||||||
THE_FREMENNIK_EXILES(718, "The Fremennik Exiles"),
|
THE_FREMENNIK_EXILES(3141, "The Fremennik Exiles"),
|
||||||
SINS_OF_THE_FATHER(1276, "Sins of the Father"),
|
SINS_OF_THE_FATHER(1276, "Sins of the Father"),
|
||||||
A_PORCINE_OF_INTEREST(1690, "A Porcine of Interest"),
|
A_PORCINE_OF_INTEREST(3151, "A Porcine of Interest"),
|
||||||
GETTING_AHEAD(752, "Getting Ahead"),
|
GETTING_AHEAD(752, "Getting Ahead"),
|
||||||
A_KINGDOM_DIVIDED(2971, "A Kingdom Divided"),
|
A_KINGDOM_DIVIDED(2971, "A Kingdom Divided"),
|
||||||
A_NIGHT_AT_THE_THEATRE(949, "A Night at the Theatre"),
|
A_NIGHT_AT_THE_THEATRE(949, "A Night at the Theatre"),
|
||||||
|
|
||||||
//Miniquests
|
//Miniquests
|
||||||
ENTER_THE_ABYSS(319, "Enter the Abyss"),
|
ENTER_THE_ABYSS(3140, "Enter the Abyss"),
|
||||||
ARCHITECTURAL_ALLIANCE(320, "Architectural Alliance"),
|
ARCHITECTURAL_ALLIANCE(320, "Architectural Alliance"),
|
||||||
BEAR_YOUR_SOUL(321, "Bear Your Soul"),
|
BEAR_YOUR_SOUL(1275, "Bear Your Soul"),
|
||||||
ALFRED_GRIMHANDS_BARCRAWL(322, "Alfred Grimhand's Barcrawl"),
|
ALFRED_GRIMHANDS_BARCRAWL(322, "Alfred Grimhand's Barcrawl"),
|
||||||
CURSE_OF_THE_EMPTY_LORD(323, "Curse of the Empty Lord"),
|
CURSE_OF_THE_EMPTY_LORD(3137, "Curse of the Empty Lord"),
|
||||||
ENCHANTED_KEY(324, "Enchanted Key"),
|
THE_ENCHANTED_KEY(324, "The Enchanted Key"),
|
||||||
THE_GENERALS_SHADOW(325, "The General's Shadow"),
|
THE_GENERALS_SHADOW(325, "The General's Shadow"),
|
||||||
SKIPPY_AND_THE_MOGRES(326, "Skippy and the Mogres"),
|
SKIPPY_AND_THE_MOGRES(3153, "Skippy and the Mogres"),
|
||||||
THE_MAGE_ARENA(327, "The Mage Arena"),
|
MAGE_ARENA_I(3146, "Mage Arena I"),
|
||||||
LAIR_OF_TARN_RAZORLOR(328, "Lair of Tarn Razorlor"),
|
LAIR_OF_TARN_RAZORLOR(3144, "Lair of Tarn Razorlor"),
|
||||||
FAMILY_PEST(329, "Family Pest"),
|
FAMILY_PEST(329, "Family Pest"),
|
||||||
THE_MAGE_ARENA_II(330, "The Mage Arena II"),
|
MAGE_ARENA_II(330, "Mage Arena II"),
|
||||||
IN_SEARCH_OF_KNOWLEDGE(602, "In Search of Knowledge"),
|
IN_SEARCH_OF_KNOWLEDGE(3143, "In Search of Knowledge"),
|
||||||
DADDYS_HOME(1688, "Daddy's Home");
|
DADDYS_HOME(1688, "Daddy's Home");
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
|
|||||||
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2021, Trevor <https://github.com/Trevor159>
|
||||||
|
* Copyright (c) 2021 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 net.runelite.api.coords.LocalPoint;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a modified {@link GraphicsObject}
|
||||||
|
*/
|
||||||
|
public interface RuneLiteObject extends GraphicsObject
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Sets the model of the RuneLiteObject
|
||||||
|
*/
|
||||||
|
void setModel(Model model);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the animation of the RuneLiteObject
|
||||||
|
* If animation is null model will be static
|
||||||
|
*/
|
||||||
|
void setAnimation(Sequence animation);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets whether the animation of the RuneLiteObject should loop when the animation ends.
|
||||||
|
* If this is false the object will despawn when the animation ends.
|
||||||
|
* Does nothing if the animation is null.
|
||||||
|
*/
|
||||||
|
void setShouldLoop(boolean shouldLoop);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the location in the scene for the RuneLiteObject
|
||||||
|
*/
|
||||||
|
void setLocation(LocalPoint point, int plane);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the state of the RuneLiteObject
|
||||||
|
* Set to true to spawn the object
|
||||||
|
* Set to false to despawn the object
|
||||||
|
*/
|
||||||
|
void setActive(boolean active);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the state of the RuneLiteObject
|
||||||
|
*
|
||||||
|
* @return true if the RuneLiteObject is added to the scene
|
||||||
|
*/
|
||||||
|
boolean isActive();
|
||||||
|
}
|
||||||
@@ -70,4 +70,8 @@ public interface Scene
|
|||||||
* @param gameObject
|
* @param gameObject
|
||||||
*/
|
*/
|
||||||
void removeGameObject(GameObject gameObject);
|
void removeGameObject(GameObject gameObject);
|
||||||
|
|
||||||
|
void generateHouses();
|
||||||
|
|
||||||
|
void setRoofRemovalMode(int flags);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2021, Trevor <https://github.com/Trevor159>
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents an animation of a renderable
|
||||||
|
*/
|
||||||
|
public interface Sequence
|
||||||
|
{
|
||||||
|
}
|
||||||
@@ -324,7 +324,7 @@ public enum Varbits
|
|||||||
*/
|
*/
|
||||||
FIRE_PIT_GIANT_MOLE(6532),
|
FIRE_PIT_GIANT_MOLE(6532),
|
||||||
FIRE_PIT_LUMBRIDGE_SWAMP(6533),
|
FIRE_PIT_LUMBRIDGE_SWAMP(6533),
|
||||||
FIRE_PIT_MOS_LE_HARMLESS(6544),
|
FIRE_PIT_MOS_LE_HARMLESS(6534),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Theatre of Blood 1=In Party, 2=Inside/Spectator, 3=Dead Spectating
|
* Theatre of Blood 1=In Party, 2=Inside/Spectator, 3=Dead Spectating
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ public class WidgetID
|
|||||||
public static final int BA_DEFENDER_GROUP_ID = 487;
|
public static final int BA_DEFENDER_GROUP_ID = 487;
|
||||||
public static final int BA_HEALER_GROUP_ID = 488;
|
public static final int BA_HEALER_GROUP_ID = 488;
|
||||||
public static final int BA_REWARD_GROUP_ID = 497;
|
public static final int BA_REWARD_GROUP_ID = 497;
|
||||||
|
public static final int BA_TEAM_GROUP_ID = 256;
|
||||||
public static final int LEVEL_UP_GROUP_ID = 233;
|
public static final int LEVEL_UP_GROUP_ID = 233;
|
||||||
public static final int DIALOG_SPRITE_GROUP_ID = 193;
|
public static final int DIALOG_SPRITE_GROUP_ID = 193;
|
||||||
public static final int QUEST_COMPLETED_GROUP_ID = 153;
|
public static final int QUEST_COMPLETED_GROUP_ID = 153;
|
||||||
@@ -152,6 +153,7 @@ public class WidgetID
|
|||||||
public static final int LMS_GROUP_ID = 333;
|
public static final int LMS_GROUP_ID = 333;
|
||||||
public static final int LMS_INGAME_GROUP_ID = 328;
|
public static final int LMS_INGAME_GROUP_ID = 328;
|
||||||
public static final int ADVENTURE_LOG_ID = 187;
|
public static final int ADVENTURE_LOG_ID = 187;
|
||||||
|
public static final int COLLECTION_LOG_ID = 621;
|
||||||
public static final int GENERIC_SCROLL_GROUP_ID = 625;
|
public static final int GENERIC_SCROLL_GROUP_ID = 625;
|
||||||
public static final int GAUNTLET_TIMER_GROUP_ID = 637;
|
public static final int GAUNTLET_TIMER_GROUP_ID = 637;
|
||||||
public static final int HALLOWED_SEPULCHRE_TIMER_GROUP_ID = 668;
|
public static final int HALLOWED_SEPULCHRE_TIMER_GROUP_ID = 668;
|
||||||
@@ -684,12 +686,15 @@ public class WidgetID
|
|||||||
|
|
||||||
static class HLR
|
static class HLR
|
||||||
{
|
{
|
||||||
|
static final int TEAMMATES = 13;
|
||||||
static final int TEAMMATE1 = 18;
|
static final int TEAMMATE1 = 18;
|
||||||
static final int TEAMMATE2 = 22;
|
static final int TEAMMATE2 = 22;
|
||||||
static final int TEAMMATE3 = 26;
|
static final int TEAMMATE3 = 26;
|
||||||
static final int TEAMMATE4 = 30;
|
static final int TEAMMATE4 = 30;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static final int TEAM = 2;
|
||||||
|
|
||||||
static final int ROLE_SPRITE = 10;
|
static final int ROLE_SPRITE = 10;
|
||||||
static final int ROLE = 11;
|
static final int ROLE = 11;
|
||||||
|
|
||||||
@@ -954,6 +959,15 @@ public class WidgetID
|
|||||||
static final int CONTAINER = 0;
|
static final int CONTAINER = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static class CollectionLog
|
||||||
|
{
|
||||||
|
static final int CONTAINER = 0;
|
||||||
|
static final int TABS = 3;
|
||||||
|
static final int ENTRY = 17;
|
||||||
|
static final int ENTRY_HEADER = 19;
|
||||||
|
static final int ENTRY_ITEMS = 36;
|
||||||
|
}
|
||||||
|
|
||||||
static class GenericScroll
|
static class GenericScroll
|
||||||
{
|
{
|
||||||
static final int TEXT = 7;
|
static final int TEXT = 7;
|
||||||
|
|||||||
@@ -373,9 +373,12 @@ public enum WidgetInfo
|
|||||||
CHATBOX_TAB_CLAN(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.TAB_CLAN),
|
CHATBOX_TAB_CLAN(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.TAB_CLAN),
|
||||||
CHATBOX_TAB_TRADE(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.TAB_TRADE),
|
CHATBOX_TAB_TRADE(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.TAB_TRADE),
|
||||||
|
|
||||||
|
BA_TEAM(WidgetID.BA_TEAM_GROUP_ID, WidgetID.BarbarianAssault.TEAM),
|
||||||
|
|
||||||
BA_HEAL_ROLE_TEXT(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.ROLE),
|
BA_HEAL_ROLE_TEXT(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.ROLE),
|
||||||
BA_HEAL_ROLE_SPRITE(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.ROLE_SPRITE),
|
BA_HEAL_ROLE_SPRITE(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.ROLE_SPRITE),
|
||||||
|
|
||||||
|
BA_HEAL_TEAMMATES(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.HLR.TEAMMATES),
|
||||||
BA_HEAL_TEAMMATE1(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.HLR.TEAMMATE1),
|
BA_HEAL_TEAMMATE1(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.HLR.TEAMMATE1),
|
||||||
BA_HEAL_TEAMMATE2(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.HLR.TEAMMATE2),
|
BA_HEAL_TEAMMATE2(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.HLR.TEAMMATE2),
|
||||||
BA_HEAL_TEAMMATE3(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.HLR.TEAMMATE3),
|
BA_HEAL_TEAMMATE3(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.HLR.TEAMMATE3),
|
||||||
@@ -479,6 +482,13 @@ public enum WidgetInfo
|
|||||||
|
|
||||||
ADVENTURE_LOG(WidgetID.ADVENTURE_LOG_ID, WidgetID.AdventureLog.CONTAINER),
|
ADVENTURE_LOG(WidgetID.ADVENTURE_LOG_ID, WidgetID.AdventureLog.CONTAINER),
|
||||||
|
|
||||||
|
COLLECTION_LOG(WidgetID.COLLECTION_LOG_ID, WidgetID.CollectionLog.CONTAINER),
|
||||||
|
|
||||||
|
COLLECTION_LOG_TABS(WidgetID.COLLECTION_LOG_ID, WidgetID.CollectionLog.TABS),
|
||||||
|
COLLECTION_LOG_ENTRY(WidgetID.COLLECTION_LOG_ID, WidgetID.CollectionLog.ENTRY),
|
||||||
|
COLLECTION_LOG_ENTRY_HEADER(WidgetID.COLLECTION_LOG_ID, WidgetID.CollectionLog.ENTRY_HEADER),
|
||||||
|
COLLECTION_LOG_ENTRY_ITEMS(WidgetID.COLLECTION_LOG_ID, WidgetID.CollectionLog.ENTRY_ITEMS),
|
||||||
|
|
||||||
GENERIC_SCROLL_TEXT(WidgetID.GENERIC_SCROLL_GROUP_ID, WidgetID.GenericScroll.TEXT),
|
GENERIC_SCROLL_TEXT(WidgetID.GENERIC_SCROLL_GROUP_ID, WidgetID.GenericScroll.TEXT),
|
||||||
|
|
||||||
WORLD_SWITCHER_LIST(WidgetID.WORLD_SWITCHER_GROUP_ID, WidgetID.WorldSwitcher.WORLD_LIST),
|
WORLD_SWITCHER_LIST(WidgetID.WORLD_SWITCHER_GROUP_ID, WidgetID.WorldSwitcher.WORLD_LIST),
|
||||||
|
|||||||
@@ -0,0 +1,428 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
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.
|
||||||
|
-->
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>net.runelite</groupId>
|
||||||
|
<artifactId>runelite-parent</artifactId>
|
||||||
|
<version>1.7.18-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>client</artifactId>
|
||||||
|
<name>RuneLite Client</name>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<jarsigner.skip>true</jarsigner.skip>
|
||||||
|
<pmd.skip>true</pmd.skip>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ch.qos.logback</groupId>
|
||||||
|
<artifactId>logback-classic</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.sf.jopt-simple</groupId>
|
||||||
|
<artifactId>jopt-simple</artifactId>
|
||||||
|
<version>5.0.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.guava</groupId>
|
||||||
|
<artifactId>guava</artifactId>
|
||||||
|
<exclusions>
|
||||||
|
<!--
|
||||||
|
compile time annotations for static analysis in Guava
|
||||||
|
https://github.com/google/guava/wiki/UseGuavaInYourBuild#what-about-guavas-own-dependencies
|
||||||
|
-->
|
||||||
|
<exclusion>
|
||||||
|
<groupId>com.google.code.findbugs</groupId>
|
||||||
|
<artifactId>jsr305</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>com.google.errorprone</groupId>
|
||||||
|
<artifactId>error_prone_annotations</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>com.google.j2objc</groupId>
|
||||||
|
<artifactId>j2objc-annotations</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>animal-sniffer-annotations</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.inject</groupId>
|
||||||
|
<artifactId>guice</artifactId>
|
||||||
|
<classifier>no_aop</classifier>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.code.gson</groupId>
|
||||||
|
<artifactId>gson</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite.pushingpixels</groupId>
|
||||||
|
<artifactId>substance</artifactId>
|
||||||
|
<version>8.0.02</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite.pushingpixels</groupId>
|
||||||
|
<artifactId>trident</artifactId>
|
||||||
|
<version>1.5.00</version>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-text</artifactId>
|
||||||
|
<version>1.2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite.jogl</groupId>
|
||||||
|
<artifactId>jogl-all</artifactId>
|
||||||
|
<version>2.4.0-rc-20200429</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite.jogl</groupId>
|
||||||
|
<artifactId>jogl-all</artifactId>
|
||||||
|
<version>2.4.0-rc-20200429</version>
|
||||||
|
<classifier>natives-windows-amd64</classifier>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite.jogl</groupId>
|
||||||
|
<artifactId>jogl-all</artifactId>
|
||||||
|
<version>2.4.0-rc-20200429</version>
|
||||||
|
<classifier>natives-windows-i586</classifier>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite.jogl</groupId>
|
||||||
|
<artifactId>jogl-all</artifactId>
|
||||||
|
<version>2.4.0-rc-20200429</version>
|
||||||
|
<classifier>natives-linux-amd64</classifier>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite.jogl</groupId>
|
||||||
|
<artifactId>jogl-all-natives-macosx</artifactId>
|
||||||
|
<version>2.4.0-rc-20210117</version>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite.gluegen</groupId>
|
||||||
|
<artifactId>gluegen-rt</artifactId>
|
||||||
|
<version>2.4.0-rc-20200429</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite.gluegen</groupId>
|
||||||
|
<artifactId>gluegen-rt</artifactId>
|
||||||
|
<version>2.4.0-rc-20200429</version>
|
||||||
|
<classifier>natives-windows-amd64</classifier>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite.gluegen</groupId>
|
||||||
|
<artifactId>gluegen-rt</artifactId>
|
||||||
|
<version>2.4.0-rc-20200429</version>
|
||||||
|
<classifier>natives-windows-i586</classifier>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite.gluegen</groupId>
|
||||||
|
<artifactId>gluegen-rt</artifactId>
|
||||||
|
<version>2.4.0-rc-20200429</version>
|
||||||
|
<classifier>natives-linux-amd64</classifier>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite.gluegen</groupId>
|
||||||
|
<artifactId>gluegen-rt-natives-macosx</artifactId>
|
||||||
|
<version>2.4.0-rc-20210117</version>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite.jocl</groupId>
|
||||||
|
<artifactId>jocl</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite.jocl</groupId>
|
||||||
|
<artifactId>jocl</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
<classifier>macos-x64</classifier>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite.jocl</groupId>
|
||||||
|
<artifactId>jocl</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
<classifier>macos-arm64</classifier>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite</groupId>
|
||||||
|
<artifactId>archive-patcher</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- net.runelite:discord also has this -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.java.dev.jna</groupId>
|
||||||
|
<artifactId>jna</artifactId>
|
||||||
|
<version>4.5.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.java.dev.jna</groupId>
|
||||||
|
<artifactId>jna-platform</artifactId>
|
||||||
|
<version>4.5.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.code.findbugs</groupId>
|
||||||
|
<artifactId>jsr305</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite</groupId>
|
||||||
|
<artifactId>runelite-api</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite</groupId>
|
||||||
|
<artifactId>jshell</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite</groupId>
|
||||||
|
<artifactId>client-patch</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite</groupId>
|
||||||
|
<artifactId>http-api</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite</groupId>
|
||||||
|
<artifactId>discord</artifactId>
|
||||||
|
<version>1.4</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.runelite</groupId>
|
||||||
|
<artifactId>orange-extensions</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.12</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.hamcrest</groupId>
|
||||||
|
<artifactId>hamcrest-library</artifactId>
|
||||||
|
<version>1.3</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mockito</groupId>
|
||||||
|
<artifactId>mockito-core</artifactId>
|
||||||
|
<version>3.1.0</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.inject.extensions</groupId>
|
||||||
|
<artifactId>guice-testlib</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.inject.extensions</groupId>
|
||||||
|
<artifactId>guice-grapher</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.squareup.okhttp3</groupId>
|
||||||
|
<artifactId>mockwebserver</artifactId>
|
||||||
|
<version>3.7.0</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>src/main/resources</directory>
|
||||||
|
<excludes>
|
||||||
|
<exclude>logback.xml</exclude>
|
||||||
|
</excludes>
|
||||||
|
<filtering>true</filtering>
|
||||||
|
</resource>
|
||||||
|
<resource>
|
||||||
|
<directory>src/main/resources</directory>
|
||||||
|
<includes>
|
||||||
|
<include>logback.xml</include>
|
||||||
|
</includes>
|
||||||
|
<filtering>false</filtering>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
|
<version>3.0.2</version>
|
||||||
|
<configuration>
|
||||||
|
<nonFilteredFileExtensions>
|
||||||
|
<nonFilteredFileExtension>ttf</nonFilteredFileExtension>
|
||||||
|
<nonFilteredFileExtension>png</nonFilteredFileExtension>
|
||||||
|
<nonFilteredFileExtension>gif</nonFilteredFileExtension>
|
||||||
|
<nonFilteredFileExtension>wav</nonFilteredFileExtension>
|
||||||
|
</nonFilteredFileExtensions>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
|
<version>3.2.1</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>shade</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<shadedArtifactAttached>true</shadedArtifactAttached>
|
||||||
|
<shadedClassifierName>shaded</shadedClassifierName>
|
||||||
|
|
||||||
|
<transformers>
|
||||||
|
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
|
||||||
|
<mainClass>net.runelite.client.RuneLite</mainClass>
|
||||||
|
</transformer>
|
||||||
|
</transformers>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<!-- Strip jar before signing -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>io.github.zlika</groupId>
|
||||||
|
<artifactId>reproducible-build-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-jarsigner-plugin</artifactId>
|
||||||
|
<version>1.4</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>sign</id>
|
||||||
|
<goals>
|
||||||
|
<goal>sign</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<skip>${jarsigner.skip}</skip>
|
||||||
|
<keystore>${jarsigner.keystore}</keystore>
|
||||||
|
<alias>${jarsigner.alias}</alias>
|
||||||
|
<storepass>${jarsigner.storepass}</storepass>
|
||||||
|
<keypass>${jarsigner.keypass}</keypass>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>net.runelite</groupId>
|
||||||
|
<artifactId>script-assembler-plugin</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>assemble</id>
|
||||||
|
<goals>
|
||||||
|
<goal>assemble</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<scriptDirectory>src/main/scripts</scriptDirectory>
|
||||||
|
<outputDirectory>${project.build.outputDirectory}/runelite</outputDirectory>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>build-index</id>
|
||||||
|
<goals>
|
||||||
|
<goal>build-index</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<archiveOverlayDirectory>${project.build.outputDirectory}/runelite</archiveOverlayDirectory>
|
||||||
|
<indexFile>${project.build.outputDirectory}/runelite/index</indexFile>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-pmd-plugin</artifactId>
|
||||||
|
<version>3.13.0</version>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.sourceforge.pmd</groupId>
|
||||||
|
<artifactId>pmd-core</artifactId>
|
||||||
|
<version>6.29.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.sourceforge.pmd</groupId>
|
||||||
|
<artifactId>pmd-java</artifactId>
|
||||||
|
<version>6.29.0</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<configuration>
|
||||||
|
<failOnViolation>true</failOnViolation>
|
||||||
|
<printFailingErrors>true</printFailingErrors>
|
||||||
|
<rulesets>
|
||||||
|
<ruleset>${basedir}/pmd-ruleset.xml</ruleset>
|
||||||
|
</rulesets>
|
||||||
|
<linkXRef>false</linkXRef>
|
||||||
|
<analysisCache>true</analysisCache>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>check</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
||||||
@@ -275,13 +275,14 @@ public enum ItemMapping
|
|||||||
ITEM_CRYSTAL_AXE(DRAGON_AXE, CRYSTAL_AXE, CRYSTAL_AXE_INACTIVE),
|
ITEM_CRYSTAL_AXE(DRAGON_AXE, CRYSTAL_AXE, CRYSTAL_AXE_INACTIVE),
|
||||||
ITEM_CRYSTAL_HARPOON(DRAGON_HARPOON, CRYSTAL_HARPOON, CRYSTAL_HARPOON_INACTIVE),
|
ITEM_CRYSTAL_HARPOON(DRAGON_HARPOON, CRYSTAL_HARPOON, CRYSTAL_HARPOON_INACTIVE),
|
||||||
ITEM_CRYSTAL_PICKAXE(DRAGON_PICKAXE, CRYSTAL_PICKAXE, CRYSTAL_PICKAXE_INACTIVE),
|
ITEM_CRYSTAL_PICKAXE(DRAGON_PICKAXE, CRYSTAL_PICKAXE, CRYSTAL_PICKAXE_INACTIVE),
|
||||||
ITEM_BLADE_OF_SAELDOR(BLADE_OF_SAELDOR_INACTIVE, BLADE_OF_SAELDOR, BLADE_OF_SAELDOR_C),
|
ITEM_BLADE_OF_SAELDOR(BLADE_OF_SAELDOR_INACTIVE, BLADE_OF_SAELDOR, BLADE_OF_SAELDOR_C, BLADE_OF_SAELDOR_C_25870, BLADE_OF_SAELDOR_C_25872, BLADE_OF_SAELDOR_C_25874, BLADE_OF_SAELDOR_C_25876, BLADE_OF_SAELDOR_C_25878, BLADE_OF_SAELDOR_C_25880, BLADE_OF_SAELDOR_C_25882),
|
||||||
ITEM_CRYSTAL_BOW(CRYSTAL_WEAPON_SEED, CRYSTAL_BOW, CRYSTAL_BOW_24123, CRYSTAL_BOW_INACTIVE),
|
ITEM_CRYSTAL_BOW(CRYSTAL_WEAPON_SEED, CRYSTAL_BOW, CRYSTAL_BOW_24123, CRYSTAL_BOW_INACTIVE),
|
||||||
ITEM_CRYSTAL_HALBERD(CRYSTAL_WEAPON_SEED, CRYSTAL_HALBERD, CRYSTAL_HALBERD_24125, CRYSTAL_HALBERD_INACTIVE),
|
ITEM_CRYSTAL_HALBERD(CRYSTAL_WEAPON_SEED, CRYSTAL_HALBERD, CRYSTAL_HALBERD_24125, CRYSTAL_HALBERD_INACTIVE),
|
||||||
ITEM_CRYSTAL_SHIELD(CRYSTAL_WEAPON_SEED, CRYSTAL_SHIELD, CRYSTAL_SHIELD_24127, CRYSTAL_SHIELD_INACTIVE),
|
ITEM_CRYSTAL_SHIELD(CRYSTAL_WEAPON_SEED, CRYSTAL_SHIELD, CRYSTAL_SHIELD_24127, CRYSTAL_SHIELD_INACTIVE),
|
||||||
ITEM_CRYSTAL_HELMET(CRYSTAL_ARMOUR_SEED, CRYSTAL_HELM, CRYSTAL_HELM_INACTIVE),
|
ITEM_CRYSTAL_HELMET(CRYSTAL_ARMOUR_SEED, CRYSTAL_HELM, CRYSTAL_HELM_INACTIVE),
|
||||||
ITEM_CRYSTAL_LEGS(CRYSTAL_ARMOUR_SEED, 2L, CRYSTAL_LEGS, CRYSTAL_LEGS_INACTIVE),
|
ITEM_CRYSTAL_LEGS(CRYSTAL_ARMOUR_SEED, 2L, CRYSTAL_LEGS, CRYSTAL_LEGS_INACTIVE),
|
||||||
ITEM_CRYSTAL_BODY(CRYSTAL_ARMOUR_SEED, 3L, CRYSTAL_BODY, CRYSTAL_BODY_INACTIVE),
|
ITEM_CRYSTAL_BODY(CRYSTAL_ARMOUR_SEED, 3L, CRYSTAL_BODY, CRYSTAL_BODY_INACTIVE),
|
||||||
|
ITEM_BOW_OF_FAERDHINEN(BOW_OF_FAERDHINEN_INACTIVE, BOW_OF_FAERDHINEN, BOW_OF_FAERDHINEN_C, BOW_OF_FAERDHINEN_C_25884, BOW_OF_FAERDHINEN_C_25886, BOW_OF_FAERDHINEN_C_25888, BOW_OF_FAERDHINEN_C_25890, BOW_OF_FAERDHINEN_C_25892, BOW_OF_FAERDHINEN_C_25894, BOW_OF_FAERDHINEN_C_25896),
|
||||||
|
|
||||||
// Bird nests
|
// Bird nests
|
||||||
ITEM_BIRD_NEST(BIRD_NEST_5075, BIRD_NEST, BIRD_NEST_5071, BIRD_NEST_5072, BIRD_NEST_5073, BIRD_NEST_5074, BIRD_NEST_7413, BIRD_NEST_13653, BIRD_NEST_22798, BIRD_NEST_22800, CLUE_NEST_EASY, CLUE_NEST_MEDIUM, CLUE_NEST_HARD, CLUE_NEST_ELITE),
|
ITEM_BIRD_NEST(BIRD_NEST_5075, BIRD_NEST, BIRD_NEST_5071, BIRD_NEST_5072, BIRD_NEST_5073, BIRD_NEST_5074, BIRD_NEST_7413, BIRD_NEST_13653, BIRD_NEST_22798, BIRD_NEST_22800, CLUE_NEST_EASY, CLUE_NEST_MEDIUM, CLUE_NEST_HARD, CLUE_NEST_ELITE),
|
||||||
|
|||||||
+1
-1
@@ -81,7 +81,7 @@ public class DesertDiaryRequirement extends GenericDiaryRequirement
|
|||||||
new QuestRequirement(Quest.DREAM_MENTOR));
|
new QuestRequirement(Quest.DREAM_MENTOR));
|
||||||
add("Complete a lap of the Pollnivneach agility course.",
|
add("Complete a lap of the Pollnivneach agility course.",
|
||||||
new SkillRequirement(Skill.AGILITY, 70));
|
new SkillRequirement(Skill.AGILITY, 70));
|
||||||
add("Slay a Dust Devil with a Slayer helmet equipped.",
|
add("Slay a Dust Devil in the desert cave with a Slayer helmet equipped.",
|
||||||
new SkillRequirement(Skill.SLAYER, 65),
|
new SkillRequirement(Skill.SLAYER, 65),
|
||||||
new SkillRequirement(Skill.DEFENCE, 10),
|
new SkillRequirement(Skill.DEFENCE, 10),
|
||||||
new SkillRequirement(Skill.CRAFTING, 55),
|
new SkillRequirement(Skill.CRAFTING, 55),
|
||||||
|
|||||||
+1
-1
@@ -70,7 +70,7 @@ public class WildernessDiaryRequirement extends GenericDiaryRequirement
|
|||||||
// HARD
|
// HARD
|
||||||
add("Cast one of the 3 God spells against another player in the Wilderness.",
|
add("Cast one of the 3 God spells against another player in the Wilderness.",
|
||||||
new SkillRequirement(Skill.MAGIC, 60),
|
new SkillRequirement(Skill.MAGIC, 60),
|
||||||
new QuestRequirement(Quest.THE_MAGE_ARENA));
|
new QuestRequirement(Quest.MAGE_ARENA_I));
|
||||||
add("Charge an Air Orb.",
|
add("Charge an Air Orb.",
|
||||||
new SkillRequirement(Skill.MAGIC, 66));
|
new SkillRequirement(Skill.MAGIC, 66));
|
||||||
add("Catch a Black Salamander in the Wilderness.",
|
add("Catch a Black Salamander in the Wilderness.",
|
||||||
|
|||||||
+13
-1
@@ -179,6 +179,18 @@ public interface ChatCommandsConfig extends Config
|
|||||||
|
|
||||||
@ConfigItem(
|
@ConfigItem(
|
||||||
position = 13,
|
position = 13,
|
||||||
|
keyName = "pets",
|
||||||
|
name = "Pets Command",
|
||||||
|
description = "Configures whether the player pet list command is enabled<br> !pets<br>" +
|
||||||
|
" Note: Update your pet list by looking at the All Pets tab in the Collection Log"
|
||||||
|
)
|
||||||
|
default boolean pets()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
position = 20,
|
||||||
keyName = "clearSingleWord",
|
keyName = "clearSingleWord",
|
||||||
name = "Clear Single Word",
|
name = "Clear Single Word",
|
||||||
description = "Enable hot key to clear single word at a time"
|
description = "Enable hot key to clear single word at a time"
|
||||||
@@ -189,7 +201,7 @@ public interface ChatCommandsConfig extends Config
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ConfigItem(
|
@ConfigItem(
|
||||||
position = 14,
|
position = 21,
|
||||||
keyName = "clearEntireChatBox",
|
keyName = "clearEntireChatBox",
|
||||||
name = "Clear Chat Box",
|
name = "Clear Chat Box",
|
||||||
description = "Enable hotkey to clear entire chat box"
|
description = "Enable hotkey to clear entire chat box"
|
||||||
|
|||||||
+246
@@ -28,14 +28,23 @@ package net.runelite.client.plugins.chatcommands;
|
|||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.JsonSyntaxException;
|
||||||
|
import com.google.gson.reflect.TypeToken;
|
||||||
import com.google.inject.Provides;
|
import com.google.inject.Provides;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import lombok.Value;
|
import lombok.Value;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -43,6 +52,7 @@ import net.runelite.api.ChatMessageType;
|
|||||||
import net.runelite.api.Client;
|
import net.runelite.api.Client;
|
||||||
import net.runelite.api.Experience;
|
import net.runelite.api.Experience;
|
||||||
import net.runelite.api.IconID;
|
import net.runelite.api.IconID;
|
||||||
|
import net.runelite.api.IndexedSprite;
|
||||||
import net.runelite.api.ItemComposition;
|
import net.runelite.api.ItemComposition;
|
||||||
import net.runelite.api.MessageNode;
|
import net.runelite.api.MessageNode;
|
||||||
import net.runelite.api.Player;
|
import net.runelite.api.Player;
|
||||||
@@ -57,9 +67,11 @@ import net.runelite.api.events.WidgetLoaded;
|
|||||||
import net.runelite.api.vars.AccountType;
|
import net.runelite.api.vars.AccountType;
|
||||||
import net.runelite.api.widgets.Widget;
|
import net.runelite.api.widgets.Widget;
|
||||||
import static net.runelite.api.widgets.WidgetID.ADVENTURE_LOG_ID;
|
import static net.runelite.api.widgets.WidgetID.ADVENTURE_LOG_ID;
|
||||||
|
import static net.runelite.api.widgets.WidgetID.COLLECTION_LOG_ID;
|
||||||
import static net.runelite.api.widgets.WidgetID.GENERIC_SCROLL_GROUP_ID;
|
import static net.runelite.api.widgets.WidgetID.GENERIC_SCROLL_GROUP_ID;
|
||||||
import static net.runelite.api.widgets.WidgetID.KILL_LOGS_GROUP_ID;
|
import static net.runelite.api.widgets.WidgetID.KILL_LOGS_GROUP_ID;
|
||||||
import net.runelite.api.widgets.WidgetInfo;
|
import net.runelite.api.widgets.WidgetInfo;
|
||||||
|
import net.runelite.client.callback.ClientThread;
|
||||||
import net.runelite.client.chat.ChatColorType;
|
import net.runelite.client.chat.ChatColorType;
|
||||||
import net.runelite.client.chat.ChatCommandManager;
|
import net.runelite.client.chat.ChatCommandManager;
|
||||||
import net.runelite.client.chat.ChatMessageBuilder;
|
import net.runelite.client.chat.ChatMessageBuilder;
|
||||||
@@ -72,6 +84,7 @@ import net.runelite.client.game.ItemManager;
|
|||||||
import net.runelite.client.input.KeyManager;
|
import net.runelite.client.input.KeyManager;
|
||||||
import net.runelite.client.plugins.Plugin;
|
import net.runelite.client.plugins.Plugin;
|
||||||
import net.runelite.client.plugins.PluginDescriptor;
|
import net.runelite.client.plugins.PluginDescriptor;
|
||||||
|
import net.runelite.client.util.ImageUtil;
|
||||||
import net.runelite.client.util.QuantityFormatter;
|
import net.runelite.client.util.QuantityFormatter;
|
||||||
import net.runelite.client.util.Text;
|
import net.runelite.client.util.Text;
|
||||||
import net.runelite.http.api.chat.ChatClient;
|
import net.runelite.http.api.chat.ChatClient;
|
||||||
@@ -112,6 +125,7 @@ public class ChatCommandsPlugin extends Plugin
|
|||||||
"(?:<br>Overall time: <col=ff0000>(?<otime>[0-9:]+(?:\\.[0-9]+)?)</col>(?: \\(new personal best\\)|. Personal best: (?<opb>[0-9:]+(?:\\.[0-9]+)?)))?");
|
"(?:<br>Overall time: <col=ff0000>(?<otime>[0-9:]+(?:\\.[0-9]+)?)</col>(?: \\(new personal best\\)|. Personal best: (?<opb>[0-9:]+(?:\\.[0-9]+)?)))?");
|
||||||
private static final Pattern HS_KC_FLOOR_PATTERN = Pattern.compile("You have completed Floor (\\d) of the Hallowed Sepulchre! Total completions: <col=ff0000>([0-9,]+)</col>\\.");
|
private static final Pattern HS_KC_FLOOR_PATTERN = Pattern.compile("You have completed Floor (\\d) of the Hallowed Sepulchre! Total completions: <col=ff0000>([0-9,]+)</col>\\.");
|
||||||
private static final Pattern HS_KC_GHC_PATTERN = Pattern.compile("You have opened the Grand Hallowed Coffin <col=ff0000>([0-9,]+)</col> times?!");
|
private static final Pattern HS_KC_GHC_PATTERN = Pattern.compile("You have opened the Grand Hallowed Coffin <col=ff0000>([0-9,]+)</col> times?!");
|
||||||
|
private static final Pattern COLLECTION_LOG_ITEM_PATTERN = Pattern.compile("New item added to your collection log: (.*)");
|
||||||
|
|
||||||
private static final String TOTAL_LEVEL_COMMAND_STRING = "!total";
|
private static final String TOTAL_LEVEL_COMMAND_STRING = "!total";
|
||||||
private static final String PRICE_COMMAND_STRING = "!price";
|
private static final String PRICE_COMMAND_STRING = "!price";
|
||||||
@@ -128,9 +142,11 @@ public class ChatCommandsPlugin extends Plugin
|
|||||||
private static final String DUEL_ARENA_COMMAND = "!duels";
|
private static final String DUEL_ARENA_COMMAND = "!duels";
|
||||||
private static final String LEAGUE_POINTS_COMMAND = "!lp";
|
private static final String LEAGUE_POINTS_COMMAND = "!lp";
|
||||||
private static final String SOUL_WARS_ZEAL_COMMAND = "!sw";
|
private static final String SOUL_WARS_ZEAL_COMMAND = "!sw";
|
||||||
|
private static final String PET_LIST_COMMAND = "!pets";
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
static final int ADV_LOG_EXPLOITS_TEXT_INDEX = 1;
|
static final int ADV_LOG_EXPLOITS_TEXT_INDEX = 1;
|
||||||
|
static final int COL_LOG_ENTRY_HEADER_TITLE_INDEX = 0;
|
||||||
|
|
||||||
private static final Map<String, String> KILLCOUNT_RENAMES = ImmutableMap.of(
|
private static final Map<String, String> KILLCOUNT_RENAMES = ImmutableMap.of(
|
||||||
"Barrows chest", "Barrows Chests"
|
"Barrows chest", "Barrows Chests"
|
||||||
@@ -139,15 +155,20 @@ public class ChatCommandsPlugin extends Plugin
|
|||||||
private boolean bossLogLoaded;
|
private boolean bossLogLoaded;
|
||||||
private boolean advLogLoaded;
|
private boolean advLogLoaded;
|
||||||
private boolean scrollInterfaceLoaded;
|
private boolean scrollInterfaceLoaded;
|
||||||
|
private boolean collectionLogLoaded;
|
||||||
private String pohOwner;
|
private String pohOwner;
|
||||||
private HiscoreEndpoint hiscoreEndpoint; // hiscore endpoint for current player
|
private HiscoreEndpoint hiscoreEndpoint; // hiscore endpoint for current player
|
||||||
private String lastBossKill;
|
private String lastBossKill;
|
||||||
private int lastBossTime = -1;
|
private int lastBossTime = -1;
|
||||||
private double lastPb = -1;
|
private double lastPb = -1;
|
||||||
|
private int modIconIdx = -1;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private Client client;
|
private Client client;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ClientThread clientThread;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private ChatCommandsConfig config;
|
private ChatCommandsConfig config;
|
||||||
|
|
||||||
@@ -181,6 +202,9 @@ public class ChatCommandsPlugin extends Plugin
|
|||||||
@Inject
|
@Inject
|
||||||
private RuneLiteConfig runeLiteConfig;
|
private RuneLiteConfig runeLiteConfig;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private Gson gson;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startUp()
|
public void startUp()
|
||||||
{
|
{
|
||||||
@@ -201,6 +225,9 @@ public class ChatCommandsPlugin extends Plugin
|
|||||||
chatCommandManager.registerCommandAsync(GC_COMMAND_STRING, this::gambleCountLookup, this::gambleCountSubmit);
|
chatCommandManager.registerCommandAsync(GC_COMMAND_STRING, this::gambleCountLookup, this::gambleCountSubmit);
|
||||||
chatCommandManager.registerCommandAsync(DUEL_ARENA_COMMAND, this::duelArenaLookup, this::duelArenaSubmit);
|
chatCommandManager.registerCommandAsync(DUEL_ARENA_COMMAND, this::duelArenaLookup, this::duelArenaSubmit);
|
||||||
chatCommandManager.registerCommandAsync(SOUL_WARS_ZEAL_COMMAND, this::soulWarsZealLookup);
|
chatCommandManager.registerCommandAsync(SOUL_WARS_ZEAL_COMMAND, this::soulWarsZealLookup);
|
||||||
|
chatCommandManager.registerCommandAsync(PET_LIST_COMMAND, this::petListLookup, this::petListSubmit);
|
||||||
|
|
||||||
|
clientThread.invoke(this::loadPetIcons);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -226,6 +253,7 @@ public class ChatCommandsPlugin extends Plugin
|
|||||||
chatCommandManager.unregisterCommand(GC_COMMAND_STRING);
|
chatCommandManager.unregisterCommand(GC_COMMAND_STRING);
|
||||||
chatCommandManager.unregisterCommand(DUEL_ARENA_COMMAND);
|
chatCommandManager.unregisterCommand(DUEL_ARENA_COMMAND);
|
||||||
chatCommandManager.unregisterCommand(SOUL_WARS_ZEAL_COMMAND);
|
chatCommandManager.unregisterCommand(SOUL_WARS_ZEAL_COMMAND);
|
||||||
|
chatCommandManager.unregisterCommand(PET_LIST_COMMAND);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@@ -272,6 +300,69 @@ public class ChatCommandsPlugin extends Plugin
|
|||||||
return personalBest == null ? 0 : personalBest;
|
return personalBest == null ? 0 : personalBest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void loadPetIcons()
|
||||||
|
{
|
||||||
|
final IndexedSprite[] modIcons = client.getModIcons();
|
||||||
|
if (modIconIdx != -1 || modIcons == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Pet[] pets = Pet.values();
|
||||||
|
final IndexedSprite[] newModIcons = Arrays.copyOf(modIcons, modIcons.length + pets.length);
|
||||||
|
modIconIdx = modIcons.length;
|
||||||
|
|
||||||
|
for (int i = 0; i < pets.length; i++)
|
||||||
|
{
|
||||||
|
final Pet pet = pets[i];
|
||||||
|
|
||||||
|
final BufferedImage image = ImageUtil.resizeImage(itemManager.getImage(pet.getIconID()), 18, 16);
|
||||||
|
final IndexedSprite sprite = ImageUtil.getImageIndexedSprite(image, client);
|
||||||
|
newModIcons[modIconIdx + i] = sprite;
|
||||||
|
}
|
||||||
|
|
||||||
|
client.setModIcons(newModIcons);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the list of owned pets for the local player
|
||||||
|
*
|
||||||
|
* @param petList The total list of owned pets for the local player
|
||||||
|
*/
|
||||||
|
private void setPetList(List<Pet> petList)
|
||||||
|
{
|
||||||
|
if (petList == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
configManager.setRSProfileConfiguration("chatcommands", "pets",
|
||||||
|
gson.toJson(petList));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Looks up the list of owned pets for the local player
|
||||||
|
*/
|
||||||
|
private List<Pet> getPetList()
|
||||||
|
{
|
||||||
|
String petListJson = configManager.getRSProfileConfiguration("chatcommands", "pets",
|
||||||
|
String.class);
|
||||||
|
|
||||||
|
List<Pet> petList;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// CHECKSTYLE:OFF
|
||||||
|
petList = gson.fromJson(petListJson, new TypeToken<List<Pet>>(){}.getType());
|
||||||
|
// CHECKSTYLE:ON
|
||||||
|
}
|
||||||
|
catch (JsonSyntaxException ex)
|
||||||
|
{
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
return petList != null ? petList : Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void onChatMessage(ChatMessage chatMessage)
|
public void onChatMessage(ChatMessage chatMessage)
|
||||||
{
|
{
|
||||||
@@ -431,6 +522,24 @@ public class ChatCommandsPlugin extends Plugin
|
|||||||
lastBossKill = null;
|
lastBossKill = null;
|
||||||
lastBossTime = -1;
|
lastBossTime = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
matcher = COLLECTION_LOG_ITEM_PATTERN.matcher(message);
|
||||||
|
if (matcher.find())
|
||||||
|
{
|
||||||
|
String item = matcher.group(1);
|
||||||
|
Pet pet = Pet.findPet(item);
|
||||||
|
|
||||||
|
if (pet != null)
|
||||||
|
{
|
||||||
|
List<Pet> petList = new ArrayList<>(getPetList());
|
||||||
|
if (!petList.contains(pet))
|
||||||
|
{
|
||||||
|
log.debug("New pet added: {}", pet);
|
||||||
|
petList.add(pet);
|
||||||
|
setPetList(petList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
@@ -490,6 +599,39 @@ public class ChatCommandsPlugin extends Plugin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (collectionLogLoaded && (pohOwner == null || pohOwner.equals(client.getLocalPlayer().getName())))
|
||||||
|
{
|
||||||
|
collectionLogLoaded = false;
|
||||||
|
|
||||||
|
Widget collectionLogEntryHeader = client.getWidget(WidgetInfo.COLLECTION_LOG_ENTRY_HEADER);
|
||||||
|
if (collectionLogEntryHeader != null && collectionLogEntryHeader.getChildren() != null)
|
||||||
|
{
|
||||||
|
Widget entryTitle = collectionLogEntryHeader.getChild(COL_LOG_ENTRY_HEADER_TITLE_INDEX);
|
||||||
|
// Make sure that the player is looking in the All Pets tab of the collection log
|
||||||
|
if (entryTitle.getText().equals("All Pets"))
|
||||||
|
{
|
||||||
|
Widget collectionLogEntryItems = client.getWidget(WidgetInfo.COLLECTION_LOG_ENTRY_ITEMS);
|
||||||
|
if (collectionLogEntryItems != null && collectionLogEntryItems.getChildren() != null)
|
||||||
|
{
|
||||||
|
List<Pet> petList = new ArrayList<>();
|
||||||
|
for (Widget child : collectionLogEntryItems.getChildren())
|
||||||
|
{
|
||||||
|
if (child.getOpacity() == 0)
|
||||||
|
{
|
||||||
|
Pet pet = Pet.findPet(Text.removeTags(child.getName()));
|
||||||
|
if (pet != null)
|
||||||
|
{
|
||||||
|
petList.add(pet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setPetList(petList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (bossLogLoaded && (pohOwner == null || pohOwner.equals(client.getLocalPlayer().getName())))
|
if (bossLogLoaded && (pohOwner == null || pohOwner.equals(client.getLocalPlayer().getName())))
|
||||||
{
|
{
|
||||||
bossLogLoaded = false;
|
bossLogLoaded = false;
|
||||||
@@ -566,6 +708,9 @@ public class ChatCommandsPlugin extends Plugin
|
|||||||
case ADVENTURE_LOG_ID:
|
case ADVENTURE_LOG_ID:
|
||||||
advLogLoaded = true;
|
advLogLoaded = true;
|
||||||
break;
|
break;
|
||||||
|
case COLLECTION_LOG_ID:
|
||||||
|
collectionLogLoaded = true;
|
||||||
|
break;
|
||||||
case KILL_LOGS_GROUP_ID:
|
case KILL_LOGS_GROUP_ID:
|
||||||
bossLogLoaded = true;
|
bossLogLoaded = true;
|
||||||
break;
|
break;
|
||||||
@@ -583,6 +728,10 @@ public class ChatCommandsPlugin extends Plugin
|
|||||||
case LOADING:
|
case LOADING:
|
||||||
case HOPPING:
|
case HOPPING:
|
||||||
pohOwner = null;
|
pohOwner = null;
|
||||||
|
break;
|
||||||
|
case LOGGED_IN:
|
||||||
|
loadPetIcons();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -999,6 +1148,103 @@ public class ChatCommandsPlugin extends Plugin
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Looks up the pet list for the player who triggered !pets
|
||||||
|
*
|
||||||
|
* @param chatMessage The chat message containing the command.
|
||||||
|
* @param message The chat message in string format
|
||||||
|
* <p>
|
||||||
|
*/
|
||||||
|
private void petListLookup(ChatMessage chatMessage, String message)
|
||||||
|
{
|
||||||
|
if (!config.pets())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ChatMessageType type = chatMessage.getType();
|
||||||
|
|
||||||
|
final String player;
|
||||||
|
if (type.equals(ChatMessageType.PRIVATECHATOUT))
|
||||||
|
{
|
||||||
|
player = client.getLocalPlayer().getName();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
player = Text.sanitize(chatMessage.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<Integer> playerPetList;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
playerPetList = chatClient.getPetList(player);
|
||||||
|
}
|
||||||
|
catch (IOException ex)
|
||||||
|
{
|
||||||
|
log.debug("unable to lookup pet list", ex);
|
||||||
|
|
||||||
|
if (player.equals(client.getLocalPlayer().getName()))
|
||||||
|
{
|
||||||
|
String response = "Open the 'All Pets' tab in the Collection Log to update your pet list";
|
||||||
|
log.debug("Setting response {}", response);
|
||||||
|
final MessageNode messageNode = chatMessage.getMessageNode();
|
||||||
|
messageNode.setValue(response);
|
||||||
|
client.refreshChat();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ChatMessageBuilder responseBuilder = new ChatMessageBuilder().append("Pets: ")
|
||||||
|
.append("(" + playerPetList.size() + ")");
|
||||||
|
|
||||||
|
// Append pets that the player owns
|
||||||
|
Pet[] pets = Pet.values();
|
||||||
|
for (Pet pet : pets)
|
||||||
|
{
|
||||||
|
if (playerPetList.contains(pet.getIconID()))
|
||||||
|
{
|
||||||
|
responseBuilder.append(" ").img(modIconIdx + pet.ordinal());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String response = responseBuilder.build();
|
||||||
|
|
||||||
|
log.debug("Setting response {}", response);
|
||||||
|
final MessageNode messageNode = chatMessage.getMessageNode();
|
||||||
|
messageNode.setValue(response);
|
||||||
|
client.refreshChat();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Submits the pet list for the local player
|
||||||
|
*
|
||||||
|
* @param chatInput The chat message containing the command.
|
||||||
|
* @param value The chat message
|
||||||
|
*/
|
||||||
|
private boolean petListSubmit(ChatInput chatInput, String value)
|
||||||
|
{
|
||||||
|
final String playerName = client.getLocalPlayer().getName();
|
||||||
|
|
||||||
|
executor.execute(() ->
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
List<Integer> petList = getPetList().stream().map(Pet::getIconID).collect(Collectors.toList());
|
||||||
|
chatClient.submitPetList(playerName, petList);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
log.warn("unable to submit pet list", ex);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
chatInput.resume();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Looks up the item price and changes the original message to the
|
* Looks up the item price and changes the original message to the
|
||||||
* response.
|
* response.
|
||||||
|
|||||||
@@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2021, Illya Myshakov <https://github.com/IllyaMyshakov>
|
||||||
|
* 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.chatcommands;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import net.runelite.api.ItemID;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Getter
|
||||||
|
enum Pet
|
||||||
|
{
|
||||||
|
ABYSSAL_ORPHAN("Abyssal orphan", ItemID.ABYSSAL_ORPHAN),
|
||||||
|
IKKLE_HYDRA("Ikkle hydra", ItemID.IKKLE_HYDRA),
|
||||||
|
CALLISTO_CUB("Callisto cub", ItemID.CALLISTO_CUB),
|
||||||
|
HELLPUPPY("Hellpuppy", ItemID.HELLPUPPY),
|
||||||
|
PET_CHAOS_ELEMENTAL("Pet chaos elemental", ItemID.PET_CHAOS_ELEMENTAL),
|
||||||
|
PET_ZILYANA("Pet zilyana", ItemID.PET_ZILYANA),
|
||||||
|
PET_DARK_CORE("Pet dark core", ItemID.PET_DARK_CORE),
|
||||||
|
PET_DAGANNOTH_PRIME("Pet dagannoth prime", ItemID.PET_DAGANNOTH_PRIME),
|
||||||
|
PET_DAGANNOTH_SUPREME("Pet dagannoth supreme", ItemID.PET_DAGANNOTH_SUPREME),
|
||||||
|
PET_DAGANNOTH_REX("Pet dagannoth rex", ItemID.PET_DAGANNOTH_REX),
|
||||||
|
TZREKJAD("Tzrek-jad", ItemID.TZREKJAD),
|
||||||
|
PET_GENERAL_GRAARDOR("Pet general graardor", ItemID.PET_GENERAL_GRAARDOR),
|
||||||
|
BABY_MOLE("Baby mole", ItemID.BABY_MOLE),
|
||||||
|
NOON("Noon", ItemID.NOON),
|
||||||
|
JALNIBREK("Jal-nib-rek", ItemID.JALNIBREK),
|
||||||
|
KALPHITE_PRINCESS("Kalphite princess", ItemID.KALPHITE_PRINCESS),
|
||||||
|
PRINCE_BLACK_DRAGON("Prince black dragon", ItemID.PRINCE_BLACK_DRAGON),
|
||||||
|
PET_KRAKEN("Pet kraken", ItemID.PET_KRAKEN),
|
||||||
|
PET_KREEARRA("Pet kree'arra", ItemID.PET_KREEARRA),
|
||||||
|
PET_KRIL_TSUTSAROTH("Pet k'ril tsutsaroth", ItemID.PET_KRIL_TSUTSAROTH),
|
||||||
|
SCORPIAS_OFFSPRING("Scorpia's offspring", ItemID.SCORPIAS_OFFSPRING),
|
||||||
|
SKOTOS("Skotos", ItemID.SKOTOS),
|
||||||
|
PET_SMOKE_DEVIL("Pet smoke devil", ItemID.PET_SMOKE_DEVIL),
|
||||||
|
VENENATIS_SPIDERLING("Venenatis spiderling", ItemID.VENENATIS_SPIDERLING),
|
||||||
|
VETION_JR("Vet'ion jr.", ItemID.VETION_JR),
|
||||||
|
VORKI("Vorki", ItemID.VORKI),
|
||||||
|
PHOENIX("Phoenix", ItemID.PHOENIX),
|
||||||
|
PET_SNAKELING("Pet snakeling", ItemID.PET_SNAKELING),
|
||||||
|
OLMLET("Olmlet", ItemID.OLMLET),
|
||||||
|
LIL_ZIK("Lil' zik", ItemID.LIL_ZIK),
|
||||||
|
BLOODHOUND("Bloodhound", ItemID.BLOODHOUND),
|
||||||
|
PET_PENANCE_QUEEN("Pet penance queen", ItemID.PET_PENANCE_QUEEN),
|
||||||
|
HERON("Heron", ItemID.HERON),
|
||||||
|
ROCK_GOLEM("Rock golem", ItemID.ROCK_GOLEM),
|
||||||
|
BEAVER("Beaver", ItemID.BEAVER),
|
||||||
|
BABY_CHINCHOMPA("Baby chinchompa", ItemID.BABY_CHINCHOMPA),
|
||||||
|
GIANT_SQUIRREL("Giant squirrel", ItemID.GIANT_SQUIRREL),
|
||||||
|
TANGLEROOT("Tangleroot", ItemID.TANGLEROOT),
|
||||||
|
ROCKY("Rocky", ItemID.ROCKY),
|
||||||
|
RIFT_GUARDIAN("Rift guardian", ItemID.RIFT_GUARDIAN),
|
||||||
|
HERBI("Herbi", ItemID.HERBI),
|
||||||
|
CHOMPY_CHICK("Chompy chick", ItemID.CHOMPY_CHICK),
|
||||||
|
SRARACHA("Sraracha", ItemID.SRARACHA),
|
||||||
|
SMOLCANO("Smolcano", ItemID.SMOLCANO),
|
||||||
|
YOUNGLLEF("Youngllef", ItemID.YOUNGLLEF),
|
||||||
|
LITTLE_NIGHTMARE("Little nightmare", ItemID.LITTLE_NIGHTMARE),
|
||||||
|
LIL_CREATOR("Lil' creator", ItemID.LIL_CREATOR),
|
||||||
|
TINY_TEMPOR("Tiny tempor", ItemID.TINY_TEMPOR);
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
private final Integer iconID;
|
||||||
|
|
||||||
|
static Pet findPet(String petName)
|
||||||
|
{
|
||||||
|
for (Pet pet : values())
|
||||||
|
{
|
||||||
|
if (pet.name.equals(petName))
|
||||||
|
{
|
||||||
|
return pet;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
+3
-3
@@ -207,8 +207,8 @@ public class CoordinateClue extends ClueScroll implements TextClueScroll, Locati
|
|||||||
.put(new WorldPoint(2484, 4016, 0), new CoordinateClueInfo("Northeast corner of the Island of Stone.", ARMADYLEAN_OR_BANDOSIAN_GUARD))
|
.put(new WorldPoint(2484, 4016, 0), new CoordinateClueInfo("Northeast corner of the Island of Stone.", ARMADYLEAN_OR_BANDOSIAN_GUARD))
|
||||||
.put(new WorldPoint(2222, 3331, 0), new CoordinateClueInfo("Prifddinas, west of the Tower of Voices", ARMADYLEAN_OR_BANDOSIAN_GUARD))
|
.put(new WorldPoint(2222, 3331, 0), new CoordinateClueInfo("Prifddinas, west of the Tower of Voices", ARMADYLEAN_OR_BANDOSIAN_GUARD))
|
||||||
.put(new WorldPoint(3560, 3987, 0), new CoordinateClueInfo("Lithkren. Digsite pendant teleport if unlocked, otherwise take rowboat from west of Mushroom Meadow Mushtree.", ARMADYLEAN_OR_BANDOSIAN_GUARD))
|
.put(new WorldPoint(3560, 3987, 0), new CoordinateClueInfo("Lithkren. Digsite pendant teleport if unlocked, otherwise take rowboat from west of Mushroom Meadow Mushtree.", ARMADYLEAN_OR_BANDOSIAN_GUARD))
|
||||||
.put(new WorldPoint(2318, 2954, 0), new CoordinateClueInfo("North-east corner of the Isle of Souls.", ARMADYLEAN_OR_BANDOSIAN_GUARD))
|
.put(new WorldPoint(2318, 2954, 0), new CoordinateClueInfo("North-east corner of the Isle of Souls.", BANDOSIAN_GUARD))
|
||||||
.put(new WorldPoint(2094, 2889, 0), new CoordinateClueInfo("West side of the Isle of Souls.", ARMADYLEAN_OR_BANDOSIAN_GUARD))
|
.put(new WorldPoint(2094, 2889, 0), new CoordinateClueInfo("West side of the Isle of Souls.", ARMADYLEAN_GUARD))
|
||||||
.put(new WorldPoint(1451, 3509, 0), new CoordinateClueInfo("Ruins of Morra.", ARMADYLEAN_OR_BANDOSIAN_GUARD))
|
.put(new WorldPoint(1451, 3509, 0), new CoordinateClueInfo("Ruins of Morra.", ARMADYLEAN_OR_BANDOSIAN_GUARD))
|
||||||
// Master
|
// Master
|
||||||
.put(new WorldPoint(2178, 3209, 0), new CoordinateClueInfo("South of Iorwerth Camp.", BRASSICAN_MAGE))
|
.put(new WorldPoint(2178, 3209, 0), new CoordinateClueInfo("South of Iorwerth Camp.", BRASSICAN_MAGE))
|
||||||
@@ -237,7 +237,7 @@ public class CoordinateClue extends ClueScroll implements TextClueScroll, Locati
|
|||||||
.put(new WorldPoint(3188, 3939, 0), new CoordinateClueInfo("Wilderness. Resource Area.", BRASSICAN_MAGE))
|
.put(new WorldPoint(3188, 3939, 0), new CoordinateClueInfo("Wilderness. Resource Area.", BRASSICAN_MAGE))
|
||||||
.put(new WorldPoint(3304, 3941, 0), new CoordinateClueInfo("Wilderness. East of Rogues' Castle.", ANCIENT_WIZARDS))
|
.put(new WorldPoint(3304, 3941, 0), new CoordinateClueInfo("Wilderness. East of Rogues' Castle.", ANCIENT_WIZARDS))
|
||||||
.put(new WorldPoint(2994, 3961, 0), new CoordinateClueInfo("Wilderness. Inside Agility Training Area.", BRASSICAN_MAGE))
|
.put(new WorldPoint(2994, 3961, 0), new CoordinateClueInfo("Wilderness. Inside Agility Training Area.", BRASSICAN_MAGE))
|
||||||
.put(new WorldPoint(1770, 3417, 0), new CoordinateClueInfo("Crabclaw Isle", ANCIENT_WIZARDS))
|
.put(new WorldPoint(1769, 3418, 0), new CoordinateClueInfo("Crabclaw Isle", ANCIENT_WIZARDS))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
private final String text;
|
private final String text;
|
||||||
|
|||||||
+1
-1
@@ -327,7 +327,7 @@ public class CrypticClue extends ClueScroll implements TextClueScroll, NpcClueSc
|
|||||||
new CrypticClue("Elvish onions.", new WorldPoint(3303, 6092, 0), "Dig in the onion patch east of the Prifddinas allotments."),
|
new CrypticClue("Elvish onions.", new WorldPoint(3303, 6092, 0), "Dig in the onion patch east of the Prifddinas allotments."),
|
||||||
new CrypticClue("Dig by the Giant's Den entrance, looking out over Lake Molch.", new WorldPoint(1418, 3591, 0), "South-east of Lake Molch in Zeah, outside the cave entrance."),
|
new CrypticClue("Dig by the Giant's Den entrance, looking out over Lake Molch.", new WorldPoint(1418, 3591, 0), "South-east of Lake Molch in Zeah, outside the cave entrance."),
|
||||||
new CrypticClue("Search the crates in the fruit store just east of the Hosidius town centre.", CRATES_27533, new WorldPoint(1798, 3612, 0), "Search the crates in the back room of the Hosidius fruit store."),
|
new CrypticClue("Search the crates in the fruit store just east of the Hosidius town centre.", CRATES_27533, new WorldPoint(1798, 3612, 0), "Search the crates in the back room of the Hosidius fruit store."),
|
||||||
new CrypticClue("A graceful man of many colours, his crates must be full of many delights.", "Hill Giant", CRATE_42067, new WorldPoint(1506, 3591, 2), "Kill any Hill Giant for a medium key. Then search the crate on the top floor of Osten's clothing shop in Shayzien."),
|
new CrypticClue("A graceful man of many colours, his crates must be full of many delights.", "Hill Giant", CRATE_42067, new WorldPoint(1506, 3590, 2), "Kill any Hill Giant for a medium key. Then search the crate on the top floor of Osten's clothing shop in Shayzien."),
|
||||||
new CrypticClue("Search the basket of apples in an orchard, south of the unknown grave surrounded by white roses.", APPLE_BASKET, new WorldPoint(1718, 3626, 0), "Search the middle apple basket in the apple orchard north of Hosidius."),
|
new CrypticClue("Search the basket of apples in an orchard, south of the unknown grave surrounded by white roses.", APPLE_BASKET, new WorldPoint(1718, 3626, 0), "Search the middle apple basket in the apple orchard north of Hosidius."),
|
||||||
new CrypticClue("Dig in the lair of red wings, within the temple of the Sun and Moon.", new WorldPoint(1820, 9935, 0), "Forthos Dungeon. In the center of the red dragons.")
|
new CrypticClue("Dig in the lair of red wings, within the temple of the Sun and Moon.", new WorldPoint(1820, 9935, 0), "Forthos Dungeon. In the center of the red dragons.")
|
||||||
);
|
);
|
||||||
|
|||||||
+5
-1
@@ -41,8 +41,12 @@ public enum Enemy
|
|||||||
ZAMORAK_WIZARD("Zamorak Wizard"),
|
ZAMORAK_WIZARD("Zamorak Wizard"),
|
||||||
//appears for hard clue coordinate steps not in the wilderness
|
//appears for hard clue coordinate steps not in the wilderness
|
||||||
SARADOMIN_WIZARD("Saradomin Wizard"),
|
SARADOMIN_WIZARD("Saradomin Wizard"),
|
||||||
//appears for elite clue coordinate steps all areas
|
//appears for elite clue coordinate steps in most areas
|
||||||
ARMADYLEAN_OR_BANDOSIAN_GUARD("Armadylean OR Bandosian Guard"),
|
ARMADYLEAN_OR_BANDOSIAN_GUARD("Armadylean OR Bandosian Guard"),
|
||||||
|
//appears for elite clue coordinate steps on the west side of the Isle of Souls
|
||||||
|
ARMADYLEAN_GUARD("Armadylean Guard"),
|
||||||
|
//appears for elite clue coordinate steps on the east side of the Isle of Souls
|
||||||
|
BANDOSIAN_GUARD("Bandosian Guard"),
|
||||||
//appears for master clue coordinate and hot cold clues when single-way combat
|
//appears for master clue coordinate and hot cold clues when single-way combat
|
||||||
BRASSICAN_MAGE("Brassican Mage"),
|
BRASSICAN_MAGE("Brassican Mage"),
|
||||||
//appears for master clue coordinate and hot cold clues when multi-way combat
|
//appears for master clue coordinate and hot cold clues when multi-way combat
|
||||||
|
|||||||
-2
@@ -27,7 +27,6 @@ package net.runelite.client.plugins.crowdsourcing;
|
|||||||
|
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.time.temporal.ChronoUnit;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import net.runelite.client.eventbus.EventBus;
|
import net.runelite.client.eventbus.EventBus;
|
||||||
import net.runelite.client.plugins.Plugin;
|
import net.runelite.client.plugins.Plugin;
|
||||||
import net.runelite.client.plugins.PluginDescriptor;
|
import net.runelite.client.plugins.PluginDescriptor;
|
||||||
@@ -40,7 +39,6 @@ import net.runelite.client.plugins.crowdsourcing.woodcutting.CrowdsourcingWoodcu
|
|||||||
import net.runelite.client.plugins.crowdsourcing.zmi.CrowdsourcingZMI;
|
import net.runelite.client.plugins.crowdsourcing.zmi.CrowdsourcingZMI;
|
||||||
import net.runelite.client.task.Schedule;
|
import net.runelite.client.task.Schedule;
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
@PluginDescriptor(
|
@PluginDescriptor(
|
||||||
name = "OSRS Wiki Crowdsourcing",
|
name = "OSRS Wiki Crowdsourcing",
|
||||||
description = "Send data to the wiki to help figure out skilling success rates, burn rates, more. See osrs.wiki/RS:CROWD"
|
description = "Send data to the wiki to help figure out skilling success rates, burn rates, more. See osrs.wiki/RS:CROWD"
|
||||||
|
|||||||
+47
-1
@@ -56,6 +56,7 @@ import net.runelite.api.Tile;
|
|||||||
import net.runelite.api.TileItem;
|
import net.runelite.api.TileItem;
|
||||||
import net.runelite.api.TileObject;
|
import net.runelite.api.TileObject;
|
||||||
import net.runelite.api.coords.LocalPoint;
|
import net.runelite.api.coords.LocalPoint;
|
||||||
|
import net.runelite.api.coords.WorldPoint;
|
||||||
import net.runelite.api.widgets.Widget;
|
import net.runelite.api.widgets.Widget;
|
||||||
import net.runelite.api.widgets.WidgetInfo;
|
import net.runelite.api.widgets.WidgetInfo;
|
||||||
import net.runelite.api.widgets.WidgetItem;
|
import net.runelite.api.widgets.WidgetItem;
|
||||||
@@ -134,9 +135,50 @@ class DevToolsOverlay extends Overlay
|
|||||||
renderGraphicsObjects(graphics);
|
renderGraphicsObjects(graphics);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (plugin.getRoofs().isActive())
|
||||||
|
{
|
||||||
|
renderRoofs(graphics);
|
||||||
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void renderRoofs(Graphics2D graphics)
|
||||||
|
{
|
||||||
|
Scene scene = client.getScene();
|
||||||
|
Tile[][][] tiles = scene.getTiles();
|
||||||
|
byte[][][] settings = client.getTileSettings();
|
||||||
|
int z = client.getPlane();
|
||||||
|
String text = "R";
|
||||||
|
|
||||||
|
for (int x = 0; x < Constants.SCENE_SIZE; ++x)
|
||||||
|
{
|
||||||
|
for (int y = 0; y < Constants.SCENE_SIZE; ++y)
|
||||||
|
{
|
||||||
|
Tile tile = tiles[z][x][y];
|
||||||
|
|
||||||
|
if (tile == null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int flag = settings[z][x][y];
|
||||||
|
if ((flag & Constants.TILE_FLAG_UNDER_ROOF) == 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Point loc = Perspective.getCanvasTextLocation(client, graphics, tile.getLocalLocation(), text, z);
|
||||||
|
if (loc == null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
OverlayUtil.renderTextLocation(graphics, loc, text, Color.RED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void renderPlayers(Graphics2D graphics)
|
private void renderPlayers(Graphics2D graphics)
|
||||||
{
|
{
|
||||||
List<Player> players = client.getPlayers();
|
List<Player> players = client.getPlayers();
|
||||||
@@ -248,7 +290,11 @@ class DevToolsOverlay extends Overlay
|
|||||||
Polygon poly = Perspective.getCanvasTilePoly(client, tile.getLocalLocation());
|
Polygon poly = Perspective.getCanvasTilePoly(client, tile.getLocalLocation());
|
||||||
if (poly != null && poly.contains(client.getMouseCanvasPosition().getX(), client.getMouseCanvasPosition().getY()))
|
if (poly != null && poly.contains(client.getMouseCanvasPosition().getX(), client.getMouseCanvasPosition().getY()))
|
||||||
{
|
{
|
||||||
toolTipManager.add(new Tooltip("World Location: " + tile.getWorldLocation().getX() + ", " + tile.getWorldLocation().getY() + ", " + client.getPlane()));
|
WorldPoint worldLocation = tile.getWorldLocation();
|
||||||
|
String tooltip = String.format("World location: %d, %d, %d</br>" +
|
||||||
|
"Region ID: %d location: %d, %d", worldLocation.getX(), worldLocation.getY(), worldLocation.getPlane(),
|
||||||
|
worldLocation.getRegionID(), worldLocation.getRegionX(), worldLocation.getRegionY());
|
||||||
|
toolTipManager.add(new Tooltip(tooltip));
|
||||||
OverlayUtil.renderPolygon(graphics, poly, GREEN);
|
OverlayUtil.renderPolygon(graphics, poly, GREEN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -180,6 +180,8 @@ class DevToolsPanel extends PluginPanel
|
|||||||
disconnectBtn.addActionListener(e -> clientThread.invoke(() -> client.setGameState(GameState.CONNECTION_LOST)));
|
disconnectBtn.addActionListener(e -> clientThread.invoke(() -> client.setGameState(GameState.CONNECTION_LOST)));
|
||||||
container.add(disconnectBtn);
|
container.add(disconnectBtn);
|
||||||
|
|
||||||
|
container.add(plugin.getRoofs());
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ShellFrame sf = plugin.getInjector().getInstance(ShellFrame.class);
|
ShellFrame sf = plugin.getInjector().getInstance(ShellFrame.class);
|
||||||
|
|||||||
@@ -145,6 +145,7 @@ public class DevToolsPlugin extends Plugin
|
|||||||
private DevToolsButton soundEffects;
|
private DevToolsButton soundEffects;
|
||||||
private DevToolsButton scriptInspector;
|
private DevToolsButton scriptInspector;
|
||||||
private DevToolsButton inventoryInspector;
|
private DevToolsButton inventoryInspector;
|
||||||
|
private DevToolsButton roofs;
|
||||||
private DevToolsButton shell;
|
private DevToolsButton shell;
|
||||||
private NavigationButton navButton;
|
private NavigationButton navButton;
|
||||||
|
|
||||||
@@ -191,6 +192,7 @@ public class DevToolsPlugin extends Plugin
|
|||||||
soundEffects = new DevToolsButton("Sound Effects");
|
soundEffects = new DevToolsButton("Sound Effects");
|
||||||
scriptInspector = new DevToolsButton("Script Inspector");
|
scriptInspector = new DevToolsButton("Script Inspector");
|
||||||
inventoryInspector = new DevToolsButton("Inventory Inspector");
|
inventoryInspector = new DevToolsButton("Inventory Inspector");
|
||||||
|
roofs = new DevToolsButton("Roofs");
|
||||||
shell = new DevToolsButton("Shell");
|
shell = new DevToolsButton("Shell");
|
||||||
|
|
||||||
overlayManager.add(overlay);
|
overlayManager.add(overlay);
|
||||||
|
|||||||
@@ -45,7 +45,6 @@ import javax.swing.JScrollPane;
|
|||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
import javax.swing.border.CompoundBorder;
|
import javax.swing.border.CompoundBorder;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import net.runelite.api.Client;
|
import net.runelite.api.Client;
|
||||||
import net.runelite.api.IndexDataBase;
|
import net.runelite.api.IndexDataBase;
|
||||||
import net.runelite.api.VarClientInt;
|
import net.runelite.api.VarClientInt;
|
||||||
@@ -63,7 +62,6 @@ import net.runelite.client.ui.ColorScheme;
|
|||||||
import net.runelite.client.ui.DynamicGridLayout;
|
import net.runelite.client.ui.DynamicGridLayout;
|
||||||
import net.runelite.client.ui.FontManager;
|
import net.runelite.client.ui.FontManager;
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
class VarInspector extends DevToolsFrame
|
class VarInspector extends DevToolsFrame
|
||||||
{
|
{
|
||||||
@Getter
|
@Getter
|
||||||
|
|||||||
+2
-1
@@ -289,7 +289,8 @@ enum DiscordGameEventType
|
|||||||
MG_CLAN_WARS("Clan Wars", DiscordAreaType.MINIGAMES, 12621, 12622, 12623, 13130, 13131, 13133, 13134, 13135, 13386, 13387, 13390, 13641, 13642, 13643, 13644, 13645, 13646, 13647, 13899, 13900, 14155, 14156),
|
MG_CLAN_WARS("Clan Wars", DiscordAreaType.MINIGAMES, 12621, 12622, 12623, 13130, 13131, 13133, 13134, 13135, 13386, 13387, 13390, 13641, 13642, 13643, 13644, 13645, 13646, 13647, 13899, 13900, 14155, 14156),
|
||||||
MG_DUEL_ARENA("Duel Arena", DiscordAreaType.MINIGAMES, 13362, 13363),
|
MG_DUEL_ARENA("Duel Arena", DiscordAreaType.MINIGAMES, 13362, 13363),
|
||||||
MG_FISHING_TRAWLER("Fishing Trawler", DiscordAreaType.MINIGAMES, 7499),
|
MG_FISHING_TRAWLER("Fishing Trawler", DiscordAreaType.MINIGAMES, 7499),
|
||||||
MG_GAUNTLET("The Gauntlet", DiscordAreaType.MINIGAMES, 12127, 7512, 7768),
|
MG_GAUNTLET("The Gauntlet", DiscordAreaType.MINIGAMES, 12127, 7512),
|
||||||
|
MG_CORRUPTED_GAUNTLET("Corrupted Gauntlet", DiscordAreaType.MINIGAMES, 7768),
|
||||||
MG_HALLOWED_SEPULCHRE("Hallowed Sepulchre", DiscordAreaType.MINIGAMES, 8797, 9051, 9052, 9053, 9054, 9309, 9563, 9565, 9821, 10074, 10075, 10077),
|
MG_HALLOWED_SEPULCHRE("Hallowed Sepulchre", DiscordAreaType.MINIGAMES, 8797, 9051, 9052, 9053, 9054, 9309, 9563, 9565, 9821, 10074, 10075, 10077),
|
||||||
MG_INFERNO("The Inferno", DiscordAreaType.MINIGAMES, 9043),
|
MG_INFERNO("The Inferno", DiscordAreaType.MINIGAMES, 9043),
|
||||||
MG_KELDAGRIM_RAT_PITS("Keldagrim Rat Pits", DiscordAreaType.MINIGAMES, 7753),
|
MG_KELDAGRIM_RAT_PITS("Keldagrim Rat Pits", DiscordAreaType.MINIGAMES, 7753),
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ import javax.annotation.Nonnull;
|
|||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.Value;
|
|
||||||
import net.runelite.api.coords.WorldPoint;
|
import net.runelite.api.coords.WorldPoint;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@@ -66,11 +65,4 @@ class GroundItem
|
|||||||
{
|
{
|
||||||
return lootType != LootType.UNKNOWN;
|
return lootType != LootType.UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Value
|
|
||||||
static class GroundItemKey
|
|
||||||
{
|
|
||||||
private int itemId;
|
|
||||||
private WorldPoint location;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+22
@@ -403,4 +403,26 @@ public interface GroundItemsConfig extends Config
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
keyName = "showLootbeamForHighlighted",
|
||||||
|
name = "Highlighted item lootbeams",
|
||||||
|
description = "Configures lootbeams to show for all highlighted items.",
|
||||||
|
position = 30
|
||||||
|
)
|
||||||
|
default boolean showLootbeamForHighlighted()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
keyName = "showLootbeamTier",
|
||||||
|
name = "Lootbeam tier",
|
||||||
|
description = "Configures which price tiers will trigger a lootbeam",
|
||||||
|
position = 31
|
||||||
|
)
|
||||||
|
default HighlightTier showLootbeamTier()
|
||||||
|
{
|
||||||
|
return HighlightTier.HIGH;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-1
@@ -49,6 +49,7 @@ import net.runelite.api.coords.WorldPoint;
|
|||||||
import static net.runelite.client.plugins.grounditems.GroundItemsPlugin.MAX_QUANTITY;
|
import static net.runelite.client.plugins.grounditems.GroundItemsPlugin.MAX_QUANTITY;
|
||||||
import net.runelite.client.plugins.grounditems.config.DespawnTimerMode;
|
import net.runelite.client.plugins.grounditems.config.DespawnTimerMode;
|
||||||
import static net.runelite.client.plugins.grounditems.config.ItemHighlightMode.MENU;
|
import static net.runelite.client.plugins.grounditems.config.ItemHighlightMode.MENU;
|
||||||
|
import static net.runelite.client.plugins.grounditems.config.ItemHighlightMode.NONE;
|
||||||
import net.runelite.client.plugins.grounditems.config.PriceDisplayMode;
|
import net.runelite.client.plugins.grounditems.config.PriceDisplayMode;
|
||||||
import net.runelite.client.ui.overlay.Overlay;
|
import net.runelite.client.ui.overlay.Overlay;
|
||||||
import net.runelite.client.ui.overlay.OverlayLayer;
|
import net.runelite.client.ui.overlay.OverlayLayer;
|
||||||
@@ -107,7 +108,8 @@ public class GroundItemsOverlay extends Overlay
|
|||||||
@Override
|
@Override
|
||||||
public Dimension render(Graphics2D graphics)
|
public Dimension render(Graphics2D graphics)
|
||||||
{
|
{
|
||||||
final boolean dontShowOverlay = (config.itemHighlightMode() == MENU || plugin.isHideAll()) && !plugin.isHotKeyPressed();
|
final boolean dontShowOverlay = (config.itemHighlightMode() == MENU || config.itemHighlightMode() == NONE
|
||||||
|
|| plugin.isHideAll()) && !plugin.isHotKeyPressed();
|
||||||
|
|
||||||
if (dontShowOverlay && !config.highlightTiles())
|
if (dontShowOverlay && !config.highlightTiles())
|
||||||
{
|
{
|
||||||
|
|||||||
+130
-16
@@ -28,7 +28,9 @@ package net.runelite.client.plugins.grounditems;
|
|||||||
import com.google.common.cache.CacheBuilder;
|
import com.google.common.cache.CacheBuilder;
|
||||||
import com.google.common.cache.LoadingCache;
|
import com.google.common.cache.LoadingCache;
|
||||||
import com.google.common.collect.EvictingQueue;
|
import com.google.common.collect.EvictingQueue;
|
||||||
|
import com.google.common.collect.HashBasedTable;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.google.common.collect.Table;
|
||||||
import com.google.inject.Provides;
|
import com.google.inject.Provides;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Rectangle;
|
import java.awt.Rectangle;
|
||||||
@@ -38,7 +40,7 @@ import java.time.Instant;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Queue;
|
import java.util.Queue;
|
||||||
@@ -71,6 +73,7 @@ import net.runelite.api.events.ItemSpawned;
|
|||||||
import net.runelite.api.events.MenuEntryAdded;
|
import net.runelite.api.events.MenuEntryAdded;
|
||||||
import net.runelite.api.events.MenuOptionClicked;
|
import net.runelite.api.events.MenuOptionClicked;
|
||||||
import net.runelite.client.Notifier;
|
import net.runelite.client.Notifier;
|
||||||
|
import net.runelite.client.callback.ClientThread;
|
||||||
import net.runelite.client.config.ConfigManager;
|
import net.runelite.client.config.ConfigManager;
|
||||||
import net.runelite.client.eventbus.Subscribe;
|
import net.runelite.client.eventbus.Subscribe;
|
||||||
import net.runelite.client.events.ConfigChanged;
|
import net.runelite.client.events.ConfigChanged;
|
||||||
@@ -83,7 +86,7 @@ import net.runelite.client.input.MouseManager;
|
|||||||
import net.runelite.client.plugins.Plugin;
|
import net.runelite.client.plugins.Plugin;
|
||||||
import net.runelite.client.plugins.PluginDescriptor;
|
import net.runelite.client.plugins.PluginDescriptor;
|
||||||
import net.runelite.client.plugins.grounditems.config.HighlightTier;
|
import net.runelite.client.plugins.grounditems.config.HighlightTier;
|
||||||
import static net.runelite.client.plugins.grounditems.config.ItemHighlightMode.OVERLAY;
|
import net.runelite.client.plugins.grounditems.config.ItemHighlightMode;
|
||||||
import net.runelite.client.plugins.grounditems.config.MenuHighlightMode;
|
import net.runelite.client.plugins.grounditems.config.MenuHighlightMode;
|
||||||
import static net.runelite.client.plugins.grounditems.config.MenuHighlightMode.BOTH;
|
import static net.runelite.client.plugins.grounditems.config.MenuHighlightMode.BOTH;
|
||||||
import static net.runelite.client.plugins.grounditems.config.MenuHighlightMode.NAME;
|
import static net.runelite.client.plugins.grounditems.config.MenuHighlightMode.NAME;
|
||||||
@@ -158,6 +161,9 @@ public class GroundItemsPlugin extends Plugin
|
|||||||
@Inject
|
@Inject
|
||||||
private Client client;
|
private Client client;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ClientThread clientThread;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private ItemManager itemManager;
|
private ItemManager itemManager;
|
||||||
|
|
||||||
@@ -177,12 +183,13 @@ public class GroundItemsPlugin extends Plugin
|
|||||||
private ScheduledExecutorService executor;
|
private ScheduledExecutorService executor;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private final Map<GroundItem.GroundItemKey, GroundItem> collectedGroundItems = new LinkedHashMap<>();
|
private final Table<WorldPoint, Integer, GroundItem> collectedGroundItems = HashBasedTable.create();
|
||||||
private List<PriceHighlight> priceChecks = ImmutableList.of();
|
private List<PriceHighlight> priceChecks = ImmutableList.of();
|
||||||
private LoadingCache<NamedQuantity, Boolean> highlightedItems;
|
private LoadingCache<NamedQuantity, Boolean> highlightedItems;
|
||||||
private LoadingCache<NamedQuantity, Boolean> hiddenItems;
|
private LoadingCache<NamedQuantity, Boolean> hiddenItems;
|
||||||
private final Queue<Integer> droppedItemQueue = EvictingQueue.create(16); // recently dropped items
|
private final Queue<Integer> droppedItemQueue = EvictingQueue.create(16); // recently dropped items
|
||||||
private int lastUsedItem;
|
private int lastUsedItem;
|
||||||
|
private final Map<WorldPoint, Lootbeam> lootbeams = new HashMap<>();
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
GroundItemsConfig provideConfig(ConfigManager configManager)
|
GroundItemsConfig provideConfig(ConfigManager configManager)
|
||||||
@@ -213,6 +220,7 @@ public class GroundItemsPlugin extends Plugin
|
|||||||
hiddenItemList = null;
|
hiddenItemList = null;
|
||||||
highlightedItemsList = null;
|
highlightedItemsList = null;
|
||||||
collectedGroundItems.clear();
|
collectedGroundItems.clear();
|
||||||
|
clientThread.invokeLater(this::removeAllLootbeams);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
@@ -230,6 +238,7 @@ public class GroundItemsPlugin extends Plugin
|
|||||||
if (event.getGameState() == GameState.LOADING)
|
if (event.getGameState() == GameState.LOADING)
|
||||||
{
|
{
|
||||||
collectedGroundItems.clear();
|
collectedGroundItems.clear();
|
||||||
|
lootbeams.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -240,19 +249,23 @@ public class GroundItemsPlugin extends Plugin
|
|||||||
Tile tile = itemSpawned.getTile();
|
Tile tile = itemSpawned.getTile();
|
||||||
|
|
||||||
GroundItem groundItem = buildGroundItem(tile, item);
|
GroundItem groundItem = buildGroundItem(tile, item);
|
||||||
|
GroundItem existing = collectedGroundItems.get(tile.getWorldLocation(), item.getId());
|
||||||
GroundItem.GroundItemKey groundItemKey = new GroundItem.GroundItemKey(item.getId(), tile.getWorldLocation());
|
|
||||||
GroundItem existing = collectedGroundItems.putIfAbsent(groundItemKey, groundItem);
|
|
||||||
if (existing != null)
|
if (existing != null)
|
||||||
{
|
{
|
||||||
existing.setQuantity(existing.getQuantity() + groundItem.getQuantity());
|
existing.setQuantity(existing.getQuantity() + groundItem.getQuantity());
|
||||||
// The spawn time remains set at the oldest spawn
|
// The spawn time remains set at the oldest spawn
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
collectedGroundItems.put(tile.getWorldLocation(), item.getId(), groundItem);
|
||||||
|
}
|
||||||
|
|
||||||
if (!config.onlyShowLoot())
|
if (!config.onlyShowLoot())
|
||||||
{
|
{
|
||||||
notifyHighlightedItem(groundItem);
|
notifyHighlightedItem(groundItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleLootbeam(tile.getWorldLocation());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
@@ -261,8 +274,7 @@ public class GroundItemsPlugin extends Plugin
|
|||||||
TileItem item = itemDespawned.getItem();
|
TileItem item = itemDespawned.getItem();
|
||||||
Tile tile = itemDespawned.getTile();
|
Tile tile = itemDespawned.getTile();
|
||||||
|
|
||||||
GroundItem.GroundItemKey groundItemKey = new GroundItem.GroundItemKey(item.getId(), tile.getWorldLocation());
|
GroundItem groundItem = collectedGroundItems.get(tile.getWorldLocation(), item.getId());
|
||||||
GroundItem groundItem = collectedGroundItems.get(groundItemKey);
|
|
||||||
if (groundItem == null)
|
if (groundItem == null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
@@ -270,7 +282,7 @@ public class GroundItemsPlugin extends Plugin
|
|||||||
|
|
||||||
if (groundItem.getQuantity() <= item.getQuantity())
|
if (groundItem.getQuantity() <= item.getQuantity())
|
||||||
{
|
{
|
||||||
collectedGroundItems.remove(groundItemKey);
|
collectedGroundItems.remove(tile.getWorldLocation(), item.getId());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -280,6 +292,8 @@ public class GroundItemsPlugin extends Plugin
|
|||||||
// time
|
// time
|
||||||
groundItem.setSpawnTime(null);
|
groundItem.setSpawnTime(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleLootbeam(tile.getWorldLocation());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
@@ -291,12 +305,13 @@ public class GroundItemsPlugin extends Plugin
|
|||||||
int newQuantity = itemQuantityChanged.getNewQuantity();
|
int newQuantity = itemQuantityChanged.getNewQuantity();
|
||||||
|
|
||||||
int diff = newQuantity - oldQuantity;
|
int diff = newQuantity - oldQuantity;
|
||||||
GroundItem.GroundItemKey groundItemKey = new GroundItem.GroundItemKey(item.getId(), tile.getWorldLocation());
|
GroundItem groundItem = collectedGroundItems.get(tile.getWorldLocation(), item.getId());
|
||||||
GroundItem groundItem = collectedGroundItems.get(groundItemKey);
|
|
||||||
if (groundItem != null)
|
if (groundItem != null)
|
||||||
{
|
{
|
||||||
groundItem.setQuantity(groundItem.getQuantity() + diff);
|
groundItem.setQuantity(groundItem.getQuantity() + diff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleLootbeam(tile.getWorldLocation());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
@@ -366,8 +381,7 @@ public class GroundItemsPlugin extends Plugin
|
|||||||
for (ItemStack itemStack : items)
|
for (ItemStack itemStack : items)
|
||||||
{
|
{
|
||||||
WorldPoint location = WorldPoint.fromLocal(client, itemStack.getLocation());
|
WorldPoint location = WorldPoint.fromLocal(client, itemStack.getLocation());
|
||||||
GroundItem.GroundItemKey groundItemKey = new GroundItem.GroundItemKey(itemStack.getId(), location);
|
GroundItem groundItem = collectedGroundItems.get(location, itemStack.getId());
|
||||||
GroundItem groundItem = collectedGroundItems.get(groundItemKey);
|
|
||||||
if (groundItem != null)
|
if (groundItem != null)
|
||||||
{
|
{
|
||||||
groundItem.setLootType(lootType);
|
groundItem.setLootType(lootType);
|
||||||
@@ -460,12 +474,14 @@ public class GroundItemsPlugin extends Plugin
|
|||||||
}
|
}
|
||||||
|
|
||||||
priceChecks = priceCheckBuilder.build();
|
priceChecks = priceCheckBuilder.build();
|
||||||
|
|
||||||
|
clientThread.invokeLater(this::handleLootbeams);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void onMenuEntryAdded(MenuEntryAdded event)
|
public void onMenuEntryAdded(MenuEntryAdded event)
|
||||||
{
|
{
|
||||||
if (config.itemHighlightMode() != OVERLAY)
|
if (config.itemHighlightMode() == ItemHighlightMode.MENU || config.itemHighlightMode() == ItemHighlightMode.BOTH)
|
||||||
{
|
{
|
||||||
final boolean telegrabEntry = event.getOption().equals("Cast") && event.getTarget().startsWith(TELEGRAB_TEXT) && event.getType() == CAST_ON_ITEM;
|
final boolean telegrabEntry = event.getOption().equals("Cast") && event.getTarget().startsWith(TELEGRAB_TEXT) && event.getType() == CAST_ON_ITEM;
|
||||||
if (!(event.getOption().equals("Take") && event.getType() == THIRD_OPTION) && !telegrabEntry)
|
if (!(event.getOption().equals("Take") && event.getType() == THIRD_OPTION) && !telegrabEntry)
|
||||||
@@ -481,8 +497,7 @@ public class GroundItemsPlugin extends Plugin
|
|||||||
MenuEntry lastEntry = menuEntries[menuEntries.length - 1];
|
MenuEntry lastEntry = menuEntries[menuEntries.length - 1];
|
||||||
|
|
||||||
final WorldPoint worldPoint = WorldPoint.fromScene(client, sceneX, sceneY, client.getPlane());
|
final WorldPoint worldPoint = WorldPoint.fromScene(client, sceneX, sceneY, client.getPlane());
|
||||||
GroundItem.GroundItemKey groundItemKey = new GroundItem.GroundItemKey(itemId, worldPoint);
|
GroundItem groundItem = collectedGroundItems.get(worldPoint, itemId);
|
||||||
GroundItem groundItem = collectedGroundItems.get(groundItemKey);
|
|
||||||
int quantity = groundItem.getQuantity();
|
int quantity = groundItem.getQuantity();
|
||||||
|
|
||||||
final int gePrice = groundItem.getGePrice();
|
final int gePrice = groundItem.getGePrice();
|
||||||
@@ -705,4 +720,103 @@ public class GroundItemsPlugin extends Plugin
|
|||||||
lastUsedItem = clickedItem.getId();
|
lastUsedItem = clickedItem.getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void handleLootbeam(WorldPoint worldPoint)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Return and remove the lootbeam from this location if lootbeam are disabled
|
||||||
|
* Lootbeam can be at this location if the config was just changed
|
||||||
|
*/
|
||||||
|
if (!(config.showLootbeamForHighlighted() || config.showLootbeamTier() != HighlightTier.OFF))
|
||||||
|
{
|
||||||
|
removeLootbeam(worldPoint);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int price = -1;
|
||||||
|
Collection<GroundItem> groundItems = collectedGroundItems.row(worldPoint).values();
|
||||||
|
for (GroundItem groundItem : groundItems)
|
||||||
|
{
|
||||||
|
if ((config.onlyShowLoot() && !groundItem.isMine()))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* highlighted items have the highest priority so if an item is highlighted at this location
|
||||||
|
* we can early return
|
||||||
|
*/
|
||||||
|
NamedQuantity item = new NamedQuantity(groundItem);
|
||||||
|
if (config.showLootbeamForHighlighted()
|
||||||
|
&& TRUE.equals(highlightedItems.getUnchecked(item)))
|
||||||
|
{
|
||||||
|
addLootbeam(worldPoint, config.highlightedColor());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Explicit hide takes priority over implicit highlight
|
||||||
|
if (TRUE.equals(hiddenItems.getUnchecked(item)))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int itemPrice = getValueByMode(groundItem.getGePrice(), groundItem.getHaPrice());
|
||||||
|
price = Math.max(itemPrice, price);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config.showLootbeamTier() != HighlightTier.OFF)
|
||||||
|
{
|
||||||
|
for (PriceHighlight highlight : priceChecks)
|
||||||
|
{
|
||||||
|
if (price > highlight.getPrice() && price > config.showLootbeamTier().getValueFromTier(config))
|
||||||
|
{
|
||||||
|
addLootbeam(worldPoint, highlight.color);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
removeLootbeam(worldPoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleLootbeams()
|
||||||
|
{
|
||||||
|
for (WorldPoint worldPoint : collectedGroundItems.rowKeySet())
|
||||||
|
{
|
||||||
|
handleLootbeam(worldPoint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void removeAllLootbeams()
|
||||||
|
{
|
||||||
|
for (Lootbeam lootbeam : lootbeams.values())
|
||||||
|
{
|
||||||
|
lootbeam.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
lootbeams.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addLootbeam(WorldPoint worldPoint, Color color)
|
||||||
|
{
|
||||||
|
Lootbeam lootbeam = lootbeams.get(worldPoint);
|
||||||
|
if (lootbeam == null)
|
||||||
|
{
|
||||||
|
lootbeam = new Lootbeam(client, worldPoint, color);
|
||||||
|
lootbeams.put(worldPoint, lootbeam);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lootbeam.setColor(color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void removeLootbeam(WorldPoint worldPoint)
|
||||||
|
{
|
||||||
|
Lootbeam lootbeam = lootbeams.remove(worldPoint);
|
||||||
|
if (lootbeam != null)
|
||||||
|
{
|
||||||
|
lootbeam.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2021, Trevor <https://github.com/Trevor159>
|
||||||
|
* 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.grounditems;
|
||||||
|
|
||||||
|
import net.runelite.api.AnimationID;
|
||||||
|
import net.runelite.api.Client;
|
||||||
|
import net.runelite.api.JagexColor;
|
||||||
|
import net.runelite.api.RuneLiteObject;
|
||||||
|
import net.runelite.api.coords.LocalPoint;
|
||||||
|
import net.runelite.api.coords.WorldPoint;
|
||||||
|
import java.awt.Color;
|
||||||
|
|
||||||
|
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 Color color;
|
||||||
|
|
||||||
|
public Lootbeam(Client client, WorldPoint worldPoint, Color color)
|
||||||
|
{
|
||||||
|
this.client = client;
|
||||||
|
runeLiteObject = client.createRuneLiteObject();
|
||||||
|
|
||||||
|
setColor(color);
|
||||||
|
runeLiteObject.setAnimation(client.loadAnimation(AnimationID.RAID_LIGHT_ANIMATION));
|
||||||
|
runeLiteObject.setShouldLoop(true);
|
||||||
|
|
||||||
|
LocalPoint lp = LocalPoint.fromWorld(client, worldPoint);
|
||||||
|
runeLiteObject.setLocation(lp, client.getPlane());
|
||||||
|
|
||||||
|
runeLiteObject.setActive(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setColor(Color color)
|
||||||
|
{
|
||||||
|
if (this.color != null && this.color.equals(color))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.color = color;
|
||||||
|
runeLiteObject.setModel(client.loadModel(
|
||||||
|
RAID_LIGHT_MODEL,
|
||||||
|
new short[]{RAID_LIGHT_FIND_COLOR},
|
||||||
|
new short[]{JagexColor.rgbToHSL(color.getRGB(), 1.0d)}
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void remove()
|
||||||
|
{
|
||||||
|
runeLiteObject.setActive(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+1
@@ -31,6 +31,7 @@ import lombok.RequiredArgsConstructor;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public enum ItemHighlightMode
|
public enum ItemHighlightMode
|
||||||
{
|
{
|
||||||
|
NONE("None"),
|
||||||
OVERLAY("Overlay"),
|
OVERLAY("Overlay"),
|
||||||
MENU("Right-click menu"),
|
MENU("Right-click menu"),
|
||||||
BOTH("Both");
|
BOTH("Both");
|
||||||
|
|||||||
+38
-14
@@ -26,6 +26,8 @@ package net.runelite.client.plugins.itemidentification;
|
|||||||
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
import net.runelite.api.ItemID;
|
import net.runelite.api.ItemID;
|
||||||
|
|
||||||
enum ItemIdentification
|
enum ItemIdentification
|
||||||
@@ -364,7 +366,25 @@ enum ItemIdentification
|
|||||||
|
|
||||||
TARGET_TELEPORT(Type.TABLET, "Target", "TRG", ItemID.TARGET_TELEPORT),
|
TARGET_TELEPORT(Type.TABLET, "Target", "TRG", ItemID.TARGET_TELEPORT),
|
||||||
VOLCANIC_MINE_TELEPORT(Type.TABLET, "V.Mine", "VM", ItemID.VOLCANIC_MINE_TELEPORT),
|
VOLCANIC_MINE_TELEPORT(Type.TABLET, "V.Mine", "VM", ItemID.VOLCANIC_MINE_TELEPORT),
|
||||||
WILDERNESS_CRABS_TELEPORT(Type.TABLET, "W.Crab", "CRAB", ItemID.WILDERNESS_CRABS_TELEPORT);
|
WILDERNESS_CRABS_TELEPORT(Type.TABLET, "W.Crab", "CRAB", ItemID.WILDERNESS_CRABS_TELEPORT),
|
||||||
|
|
||||||
|
// Scrolls
|
||||||
|
NARDAH_TELEPORT(Type.SCROLL, "Nardah", "NAR", ItemID.NARDAH_TELEPORT),
|
||||||
|
DIGSITE_TELEPORT(Type.SCROLL, "Digsite", "DIG", ItemID.DIGSITE_TELEPORT),
|
||||||
|
FELDIP_HILLS_TELEPORT(Type.SCROLL, "F.Hills", "F.H", ItemID.FELDIP_HILLS_TELEPORT),
|
||||||
|
LUNAR_ISLE_TELEPORT(Type.SCROLL, "L.Isle", "L.I", ItemID.LUNAR_ISLE_TELEPORT),
|
||||||
|
MORTTON_TELEPORT(Type.SCROLL, "Mort'ton", "MORT", ItemID.MORTTON_TELEPORT),
|
||||||
|
PEST_CONTROL_TELEPORT(Type.SCROLL, "P.Cont", "PEST", ItemID.PEST_CONTROL_TELEPORT),
|
||||||
|
PISCATORIS_TELEPORT(Type.SCROLL, "Pisca", "PISC", ItemID.PISCATORIS_TELEPORT),
|
||||||
|
TAI_BWO_WANNAI_TELEPORT(Type.SCROLL, "TaiBwo", "TAI", ItemID.TAI_BWO_WANNAI_TELEPORT),
|
||||||
|
IORWERTH_CAMP_TELEPORT(Type.SCROLL, "Iorwerth", "IOR", ItemID.IORWERTH_CAMP_TELEPORT),
|
||||||
|
MOS_LEHARMLESS_TELEPORT(Type.SCROLL, "M.LeHarm", "M.L", ItemID.MOS_LEHARMLESS_TELEPORT),
|
||||||
|
LUMBERYARD_TELEPORT(Type.SCROLL, "Lumber", "LUMB", ItemID.LUMBERYARD_TELEPORT),
|
||||||
|
|
||||||
|
ZUL_ANDRA_TELEPORT(Type.SCROLL, "Zul-andra", "ZUL", ItemID.ZULANDRA_TELEPORT),
|
||||||
|
KEY_MASTER_TELEPORT(Type.SCROLL, "Key master", "KEY", ItemID.KEY_MASTER_TELEPORT),
|
||||||
|
REVENANT_CAVE_TELEPORT(Type.SCROLL, "Rev cave", "REV", ItemID.REVENANT_CAVE_TELEPORT),
|
||||||
|
WATSON_TELEPORT(Type.SCROLL, "Watson", "WATS", ItemID.WATSON_TELEPORT);
|
||||||
|
|
||||||
final Type type;
|
final Type type;
|
||||||
final String medName;
|
final String medName;
|
||||||
@@ -401,20 +421,24 @@ enum ItemIdentification
|
|||||||
return itemIdentifications.get(id);
|
return itemIdentifications.get(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
enum Type
|
enum Type
|
||||||
{
|
{
|
||||||
SEED,
|
SEED(ItemIdentificationConfig::showSeeds),
|
||||||
SACK,
|
SACK(ItemIdentificationConfig::showSacks),
|
||||||
HERB,
|
HERB(ItemIdentificationConfig::showHerbs),
|
||||||
LOGS,
|
LOGS(ItemIdentificationConfig::showLogs),
|
||||||
PLANK,
|
PLANK(ItemIdentificationConfig::showPlanks),
|
||||||
SAPLING,
|
SAPLING(ItemIdentificationConfig::showSaplings),
|
||||||
COMPOST,
|
COMPOST(ItemIdentificationConfig::showComposts),
|
||||||
ORE,
|
ORE(ItemIdentificationConfig::showOres),
|
||||||
BAR,
|
BAR(ItemIdentificationConfig::showBars),
|
||||||
GEM,
|
GEM(ItemIdentificationConfig::showGems),
|
||||||
POTION,
|
POTION(ItemIdentificationConfig::showPotions),
|
||||||
IMPLING_JAR,
|
IMPLING_JAR(ItemIdentificationConfig::showImplingJars),
|
||||||
TABLET
|
TABLET(ItemIdentificationConfig::showTablets),
|
||||||
|
SCROLL(ItemIdentificationConfig::showTeleportScrolls);
|
||||||
|
|
||||||
|
final Predicate<ItemIdentificationConfig> enabled;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+11
@@ -203,4 +203,15 @@ public interface ItemIdentificationConfig extends Config
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
keyName = "showTeleportScrolls",
|
||||||
|
name = "Teleport Scrolls",
|
||||||
|
description = "Show identification on teleport scrolls",
|
||||||
|
section = identificationSection
|
||||||
|
)
|
||||||
|
default boolean showTeleportScrolls()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-83
@@ -58,93 +58,11 @@ class ItemIdentificationOverlay extends WidgetItemOverlay
|
|||||||
public void renderItemOverlay(Graphics2D graphics, int itemId, WidgetItem widgetItem)
|
public void renderItemOverlay(Graphics2D graphics, int itemId, WidgetItem widgetItem)
|
||||||
{
|
{
|
||||||
ItemIdentification iden = findItemIdentification(itemId);
|
ItemIdentification iden = findItemIdentification(itemId);
|
||||||
if (iden == null)
|
if (iden == null || !iden.type.enabled.test(config))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (iden.type)
|
|
||||||
{
|
|
||||||
case SEED:
|
|
||||||
if (!config.showSeeds())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SACK:
|
|
||||||
if (!config.showSacks())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case HERB:
|
|
||||||
if (!config.showHerbs())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case LOGS:
|
|
||||||
if (!config.showLogs())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case PLANK:
|
|
||||||
if (!config.showPlanks())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SAPLING:
|
|
||||||
if (!config.showSaplings())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case COMPOST:
|
|
||||||
if (!config.showComposts())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ORE:
|
|
||||||
if (!config.showOres())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case BAR:
|
|
||||||
if (!config.showBars())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GEM:
|
|
||||||
if (!config.showGems())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case POTION:
|
|
||||||
if (!config.showPotions())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case IMPLING_JAR:
|
|
||||||
if (!config.showImplingJars())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case TABLET:
|
|
||||||
if (!config.showTablets())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
graphics.setFont(FontManager.getRunescapeSmallFont());
|
graphics.setFont(FontManager.getRunescapeSmallFont());
|
||||||
renderText(graphics, widgetItem.getCanvasBounds(), iden);
|
renderText(graphics, widgetItem.getCanvasBounds(), iden);
|
||||||
}
|
}
|
||||||
|
|||||||
+2
@@ -247,6 +247,8 @@ public class MenuEntrySwapperPlugin extends Plugin
|
|||||||
swap("inspect", "trapdoor", "travel", config::swapTravel);
|
swap("inspect", "trapdoor", "travel", config::swapTravel);
|
||||||
swap("board", "travel cart", "pay-fare", config::swapTravel);
|
swap("board", "travel cart", "pay-fare", config::swapTravel);
|
||||||
|
|
||||||
|
swap("board", "sacrificial boat", "quick-board", config::swapQuick);
|
||||||
|
|
||||||
swap("cage", "harpoon", config::swapHarpoon);
|
swap("cage", "harpoon", config::swapHarpoon);
|
||||||
swap("big net", "harpoon", config::swapHarpoon);
|
swap("big net", "harpoon", config::swapHarpoon);
|
||||||
swap("net", "harpoon", config::swapHarpoon);
|
swap("net", "harpoon", config::swapHarpoon);
|
||||||
|
|||||||
@@ -25,7 +25,10 @@
|
|||||||
package net.runelite.client.plugins.mining;
|
package net.runelite.client.plugins.mining;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import static net.runelite.api.AnimationID.MINING_3A_PICKAXE;
|
import static net.runelite.api.AnimationID.MINING_3A_PICKAXE;
|
||||||
import static net.runelite.api.AnimationID.MINING_ADAMANT_PICKAXE;
|
import static net.runelite.api.AnimationID.MINING_ADAMANT_PICKAXE;
|
||||||
@@ -135,4 +138,11 @@ enum Pickaxe
|
|||||||
{
|
{
|
||||||
return PICKAXE_ANIM_IDS.get(animId);
|
return PICKAXE_ANIM_IDS.get(animId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Set<Integer> all()
|
||||||
|
{
|
||||||
|
return Arrays.stream(values())
|
||||||
|
.map(pickaxe -> pickaxe.itemId)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ import lombok.AllArgsConstructor;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import net.runelite.api.Actor;
|
import net.runelite.api.Actor;
|
||||||
import net.runelite.api.Client;
|
import net.runelite.api.Client;
|
||||||
import net.runelite.api.GameState;
|
import net.runelite.api.GameState;
|
||||||
@@ -86,7 +85,6 @@ import net.runelite.client.plugins.PluginDescriptor;
|
|||||||
import net.runelite.client.ui.overlay.tooltip.Tooltip;
|
import net.runelite.client.ui.overlay.tooltip.Tooltip;
|
||||||
import net.runelite.client.ui.overlay.tooltip.TooltipManager;
|
import net.runelite.client.ui.overlay.tooltip.TooltipManager;
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
@PluginDescriptor(
|
@PluginDescriptor(
|
||||||
name = "Music",
|
name = "Music",
|
||||||
description = "Adds search and filter for the music list, and additional volume control",
|
description = "Adds search and filter for the music list, and additional volume control",
|
||||||
@@ -863,7 +861,8 @@ public class MusicPlugin extends Plugin
|
|||||||
public void updateVar()
|
public void updateVar()
|
||||||
{
|
{
|
||||||
int val = getValue();
|
int val = getValue();
|
||||||
client.getVarps()[this.var.getId()] = val * 100 / this.max;
|
int varVal = Math.round((float) val / (max / 100.f));
|
||||||
|
client.getVarps()[this.var.getId()] = varVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void shutDown()
|
public void shutDown()
|
||||||
|
|||||||
+11
@@ -37,6 +37,7 @@ import java.time.temporal.ChronoUnit;
|
|||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import net.runelite.api.Client;
|
import net.runelite.api.Client;
|
||||||
|
import net.runelite.api.Constants;
|
||||||
import net.runelite.api.GameState;
|
import net.runelite.api.GameState;
|
||||||
import net.runelite.api.events.GameStateChanged;
|
import net.runelite.api.events.GameStateChanged;
|
||||||
import net.runelite.api.events.GameTick;
|
import net.runelite.api.events.GameTick;
|
||||||
@@ -49,6 +50,7 @@ import net.runelite.client.events.ConfigChanged;
|
|||||||
import net.runelite.client.plugins.Plugin;
|
import net.runelite.client.plugins.Plugin;
|
||||||
import net.runelite.client.plugins.PluginDescriptor;
|
import net.runelite.client.plugins.PluginDescriptor;
|
||||||
import net.runelite.client.task.Schedule;
|
import net.runelite.client.task.Schedule;
|
||||||
|
import org.apache.commons.lang3.time.DurationFormatUtils;
|
||||||
|
|
||||||
@PluginDescriptor(
|
@PluginDescriptor(
|
||||||
name = "Report Button",
|
name = "Report Button",
|
||||||
@@ -180,6 +182,9 @@ public class ReportButtonPlugin extends Plugin
|
|||||||
case LOGIN_TIME:
|
case LOGIN_TIME:
|
||||||
reportButton.setText(getLoginTime());
|
reportButton.setText(getLoginTime());
|
||||||
break;
|
break;
|
||||||
|
case IDLE_TIME:
|
||||||
|
reportButton.setText(getIdleTime());
|
||||||
|
break;
|
||||||
case DATE:
|
case DATE:
|
||||||
reportButton.setText(getDate());
|
reportButton.setText(getDate());
|
||||||
break;
|
break;
|
||||||
@@ -192,6 +197,12 @@ public class ReportButtonPlugin extends Plugin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getIdleTime()
|
||||||
|
{
|
||||||
|
long lastActivity = Long.min(client.getMouseIdleTicks(), client.getKeyboardIdleTicks());
|
||||||
|
return DurationFormatUtils.formatDuration(lastActivity * Constants.CLIENT_TICK_LENGTH, "mm:ss");
|
||||||
|
}
|
||||||
|
|
||||||
private String getLoginTime()
|
private String getLoginTime()
|
||||||
{
|
{
|
||||||
if (loginTime == null)
|
if (loginTime == null)
|
||||||
|
|||||||
+2
-1
@@ -32,7 +32,8 @@ public enum TimeStyle
|
|||||||
UTC("UTC Time"),
|
UTC("UTC Time"),
|
||||||
JAGEX("Jagex HQ Time"),
|
JAGEX("Jagex HQ Time"),
|
||||||
LOCAL_TIME("Local Time"),
|
LOCAL_TIME("Local Time"),
|
||||||
GAME_TICKS("Game Ticks");
|
GAME_TICKS("Game Ticks"),
|
||||||
|
IDLE_TIME("Idle Time");
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
||||||
|
|||||||
+75
@@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2021, Hydrox6 <ikada@protonmail.ch>
|
||||||
|
* 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.roofremoval;
|
||||||
|
|
||||||
|
import net.runelite.client.config.Config;
|
||||||
|
import net.runelite.client.config.ConfigGroup;
|
||||||
|
import net.runelite.client.config.ConfigItem;
|
||||||
|
|
||||||
|
@ConfigGroup(RoofRemovalConfig.CONFIG_GROUP)
|
||||||
|
public interface RoofRemovalConfig extends Config
|
||||||
|
{
|
||||||
|
String CONFIG_GROUP = "roofremoval";
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
keyName = "removePosition",
|
||||||
|
name = "Player's position",
|
||||||
|
description = "Remove roofs above the player's position"
|
||||||
|
)
|
||||||
|
default boolean removePosition()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
keyName = "removeHovered",
|
||||||
|
name = "Hovered tile",
|
||||||
|
description = "Remove roofs above the hovered tile"
|
||||||
|
)
|
||||||
|
default boolean removeHovered()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
keyName = "removeDestination",
|
||||||
|
name = "Destination tile",
|
||||||
|
description = "Remove roofs above the destination tile"
|
||||||
|
)
|
||||||
|
default boolean removeDestination()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
keyName = "removeBetween",
|
||||||
|
name = "Between camera & player",
|
||||||
|
description = "Remove roofs between the camera and the player at low camera angles"
|
||||||
|
)
|
||||||
|
default boolean removeBetween()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
+267
@@ -0,0 +1,267 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2021 Hydrox6 <ikada@protonmail.ch>
|
||||||
|
* 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.roofremoval;
|
||||||
|
|
||||||
|
import com.google.common.base.Stopwatch;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.reflect.TypeToken;
|
||||||
|
import com.google.inject.Provides;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import net.runelite.api.Client;
|
||||||
|
import net.runelite.api.Constants;
|
||||||
|
import static net.runelite.api.Constants.ROOF_FLAG_BETWEEN;
|
||||||
|
import static net.runelite.api.Constants.ROOF_FLAG_DESTINATION;
|
||||||
|
import static net.runelite.api.Constants.ROOF_FLAG_HOVERED;
|
||||||
|
import static net.runelite.api.Constants.ROOF_FLAG_POSITION;
|
||||||
|
import net.runelite.api.GameState;
|
||||||
|
import net.runelite.api.Tile;
|
||||||
|
import net.runelite.api.events.GameStateChanged;
|
||||||
|
import net.runelite.client.callback.ClientThread;
|
||||||
|
import net.runelite.client.config.ConfigManager;
|
||||||
|
import net.runelite.client.eventbus.Subscribe;
|
||||||
|
import net.runelite.client.events.ConfigChanged;
|
||||||
|
import net.runelite.client.plugins.Plugin;
|
||||||
|
import net.runelite.client.plugins.PluginDescriptor;
|
||||||
|
|
||||||
|
@PluginDescriptor(
|
||||||
|
name = "Roof Removal",
|
||||||
|
description = "Remove only the needed roofs above your player, hovered tile, or destination",
|
||||||
|
enabledByDefault = false
|
||||||
|
)
|
||||||
|
@Slf4j
|
||||||
|
public class RoofRemovalPlugin extends Plugin
|
||||||
|
{
|
||||||
|
private static class FlaggedArea
|
||||||
|
{
|
||||||
|
int rx1;
|
||||||
|
int ry1;
|
||||||
|
int rx2;
|
||||||
|
int ry2;
|
||||||
|
int z1;
|
||||||
|
int z2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private Client client;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ClientThread clientThread;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private Gson gson;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private RoofRemovalConfig config;
|
||||||
|
|
||||||
|
private final Map<Integer, long[]> overrides = new HashMap<>();
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
RoofRemovalConfig getConfig(ConfigManager configManager)
|
||||||
|
{
|
||||||
|
return configManager.getConfig(RoofRemovalConfig.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startUp() throws IOException
|
||||||
|
{
|
||||||
|
loadRoofOverrides();
|
||||||
|
clientThread.invoke(() ->
|
||||||
|
{
|
||||||
|
if (client.getGameState() == GameState.LOGGED_IN)
|
||||||
|
{
|
||||||
|
performRoofRemoval();
|
||||||
|
}
|
||||||
|
client.getScene().setRoofRemovalMode(buildRoofRemovalFlags());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void shutDown()
|
||||||
|
{
|
||||||
|
overrides.clear();
|
||||||
|
clientThread.invoke(() ->
|
||||||
|
{
|
||||||
|
client.getScene().setRoofRemovalMode(0);
|
||||||
|
// Reload the scene to clear roof flag overrides
|
||||||
|
if (client.getGameState() == GameState.LOGGED_IN)
|
||||||
|
{
|
||||||
|
client.setGameState(GameState.LOADING);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onGameStateChanged(GameStateChanged e)
|
||||||
|
{
|
||||||
|
if (e.getGameState() == GameState.LOGGED_IN)
|
||||||
|
{
|
||||||
|
performRoofRemoval();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onConfigChanged(ConfigChanged e)
|
||||||
|
{
|
||||||
|
if (!e.getGroup().equals(RoofRemovalConfig.CONFIG_GROUP))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
client.getScene().setRoofRemovalMode(buildRoofRemovalFlags());
|
||||||
|
}
|
||||||
|
|
||||||
|
private int buildRoofRemovalFlags()
|
||||||
|
{
|
||||||
|
int roofRemovalMode = 0;
|
||||||
|
if (config.removePosition())
|
||||||
|
{
|
||||||
|
roofRemovalMode |= ROOF_FLAG_POSITION;
|
||||||
|
}
|
||||||
|
if (config.removeHovered())
|
||||||
|
{
|
||||||
|
roofRemovalMode |= ROOF_FLAG_HOVERED;
|
||||||
|
}
|
||||||
|
if (config.removeDestination())
|
||||||
|
{
|
||||||
|
roofRemovalMode |= ROOF_FLAG_DESTINATION;
|
||||||
|
}
|
||||||
|
if (config.removeBetween())
|
||||||
|
{
|
||||||
|
roofRemovalMode |= ROOF_FLAG_BETWEEN;
|
||||||
|
}
|
||||||
|
return roofRemovalMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void performRoofRemoval()
|
||||||
|
{
|
||||||
|
assert client.isClientThread();
|
||||||
|
applyRoofOverrides();
|
||||||
|
|
||||||
|
Stopwatch sw = Stopwatch.createStarted();
|
||||||
|
client.getScene().generateHouses();
|
||||||
|
log.debug("House generation duration: {}", sw.stop());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadRoofOverrides() throws IOException
|
||||||
|
{
|
||||||
|
try (InputStream in = getClass().getResourceAsStream("overrides.jsonc"))
|
||||||
|
{
|
||||||
|
final InputStreamReader data = new InputStreamReader(in, StandardCharsets.UTF_8);
|
||||||
|
//CHECKSTYLE:OFF
|
||||||
|
final Type type = new TypeToken<Map<Integer, List<FlaggedArea>>>() {}.getType();
|
||||||
|
//CHECKSTYLE:ON
|
||||||
|
Map<Integer, List<FlaggedArea>> parsed = gson.fromJson(data, type);
|
||||||
|
overrides.clear();
|
||||||
|
for (Map.Entry<Integer, List<FlaggedArea>> entry : parsed.entrySet())
|
||||||
|
{
|
||||||
|
for (FlaggedArea fla : entry.getValue())
|
||||||
|
{
|
||||||
|
for (int z = fla.z1; z <= fla.z2; z++)
|
||||||
|
{
|
||||||
|
// Given that each region is 64x64, and the override data is a boolean, one of the axis can be stored as
|
||||||
|
// bits in a long. This removes the need for a boolean[64][64] and an extra array lookup in favour of
|
||||||
|
// a bitwise &, and results in a consistently smaller amount of memory required to store the overrides.
|
||||||
|
int packedRegion = entry.getKey() << 2 | z;
|
||||||
|
long[] regionData = overrides.computeIfAbsent(packedRegion, k -> new long[Constants.REGION_SIZE]);
|
||||||
|
for (int y = fla.ry1; y <= fla.ry2; y++)
|
||||||
|
{
|
||||||
|
long row = regionData[y];
|
||||||
|
for (int x = fla.rx1; x <= fla.rx2; x++)
|
||||||
|
{
|
||||||
|
row |= (1L << x);
|
||||||
|
}
|
||||||
|
regionData[y] = row;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void applyRoofOverrides()
|
||||||
|
{
|
||||||
|
Stopwatch sw = Stopwatch.createStarted();
|
||||||
|
boolean regionsHaveOverrides = false;
|
||||||
|
|
||||||
|
outer:
|
||||||
|
for (int regionID : client.getMapRegions())
|
||||||
|
{
|
||||||
|
for (int z = 0; z < Constants.MAX_Z; z++)
|
||||||
|
{
|
||||||
|
if (overrides.containsKey(regionID << 2 | z))
|
||||||
|
{
|
||||||
|
regionsHaveOverrides = true;
|
||||||
|
break outer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!regionsHaveOverrides)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Tile[][][] tiles = client.getScene().getTiles();
|
||||||
|
byte[][][] settings = client.getTileSettings();
|
||||||
|
|
||||||
|
for (int z = 0; z < Constants.MAX_Z; z++)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < Constants.SCENE_SIZE; x++)
|
||||||
|
{
|
||||||
|
for (int y = 0; y < Constants.SCENE_SIZE; y++)
|
||||||
|
{
|
||||||
|
Tile tile = tiles[z][x][y];
|
||||||
|
if (tile == null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int regionID = tile.getWorldLocation().getRegionID() << 2 | z;
|
||||||
|
if (!overrides.containsKey(regionID))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rx = tile.getWorldLocation().getRegionX();
|
||||||
|
int ry = tile.getWorldLocation().getRegionY();
|
||||||
|
long[] region = overrides.get(regionID);
|
||||||
|
if ((region[ry] & (1L << rx)) != 0)
|
||||||
|
{
|
||||||
|
settings[z][x][y] |= Constants.TILE_FLAG_UNDER_ROOF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log.debug("Roof override duration: {}", sw.stop());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -520,12 +520,12 @@ public class SlayerPlugin extends Plugin
|
|||||||
log.debug("Slayer xp change delta: {}, killed npcs: {}", delta, taggedNpcsDiedPrevTick);
|
log.debug("Slayer xp change delta: {}, killed npcs: {}", delta, taggedNpcsDiedPrevTick);
|
||||||
|
|
||||||
final Task task = Task.getTask(taskName);
|
final Task task = Task.getTask(taskName);
|
||||||
if (task != null && task.getExpectedKillExp() > 0)
|
if (task != null && task.getMinimumKillXp() > 0)
|
||||||
{
|
{
|
||||||
// Only decrement a kill if the xp drop matches the expected drop. This is just for Tzhaar tasks.
|
// Only decrement a kill if the xp drop is above the minimum threshold. This is for Tzhaar and Sire tasks.
|
||||||
if (task.getExpectedKillExp() == delta)
|
if (delta >= task.getMinimumKillXp())
|
||||||
{
|
{
|
||||||
killed(1);
|
killed(max(taggedNpcsDiedPrevTick, 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -39,8 +39,12 @@ enum Task
|
|||||||
{
|
{
|
||||||
//<editor-fold desc="Enums">
|
//<editor-fold desc="Enums">
|
||||||
ABERRANT_SPECTRES("Aberrant spectres", ItemID.ABERRANT_SPECTRE, "Spectre"),
|
ABERRANT_SPECTRES("Aberrant spectres", ItemID.ABERRANT_SPECTRE, "Spectre"),
|
||||||
ABYSSAL_DEMONS("Abyssal demons", ItemID.ABYSSAL_DEMON),
|
// Abyssal demon - 150 xp
|
||||||
ABYSSAL_SIRE("Abyssal Sire", ItemID.ABYSSAL_ORPHAN),
|
// Greater abyssal demon - 4200 xp
|
||||||
|
// Abyssal sire - 450 xp
|
||||||
|
// Use 51 for minimum xp to avoid a kill triggering from killing the sire vents
|
||||||
|
ABYSSAL_DEMONS("Abyssal demons", ItemID.ABYSSAL_DEMON, 51),
|
||||||
|
ABYSSAL_SIRE("Abyssal Sire", ItemID.ABYSSAL_ORPHAN, 51),
|
||||||
ADAMANT_DRAGONS("Adamant dragons", ItemID.ADAMANT_DRAGON_MASK),
|
ADAMANT_DRAGONS("Adamant dragons", ItemID.ADAMANT_DRAGON_MASK),
|
||||||
ALCHEMICAL_HYDRA("Alchemical Hydra", ItemID.IKKLE_HYDRA),
|
ALCHEMICAL_HYDRA("Alchemical Hydra", ItemID.IKKLE_HYDRA),
|
||||||
ANKOU("Ankou", ItemID.ANKOU_MASK),
|
ANKOU("Ankou", ItemID.ANKOU_MASK),
|
||||||
@@ -238,7 +242,7 @@ enum Task
|
|||||||
private final String[] targetNames;
|
private final String[] targetNames;
|
||||||
private final int weaknessThreshold;
|
private final int weaknessThreshold;
|
||||||
private final int weaknessItem;
|
private final int weaknessItem;
|
||||||
private final int expectedKillExp;
|
private final int minimumKillXp;
|
||||||
|
|
||||||
static
|
static
|
||||||
{
|
{
|
||||||
@@ -260,7 +264,7 @@ enum Task
|
|||||||
this.weaknessThreshold = -1;
|
this.weaknessThreshold = -1;
|
||||||
this.weaknessItem = -1;
|
this.weaknessItem = -1;
|
||||||
this.targetNames = targetNames;
|
this.targetNames = targetNames;
|
||||||
this.expectedKillExp = 0;
|
this.minimumKillXp = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Task(String name, int itemSpriteId, int weaknessThreshold, int weaknessItem, String... targetNames)
|
Task(String name, int itemSpriteId, int weaknessThreshold, int weaknessItem, String... targetNames)
|
||||||
@@ -271,10 +275,10 @@ enum Task
|
|||||||
this.weaknessThreshold = weaknessThreshold;
|
this.weaknessThreshold = weaknessThreshold;
|
||||||
this.weaknessItem = weaknessItem;
|
this.weaknessItem = weaknessItem;
|
||||||
this.targetNames = targetNames;
|
this.targetNames = targetNames;
|
||||||
this.expectedKillExp = 0;
|
this.minimumKillXp = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Task(String name, int itemSpriteId, int expectedKillExp)
|
Task(String name, int itemSpriteId, int minimumKillXp)
|
||||||
{
|
{
|
||||||
Preconditions.checkArgument(itemSpriteId >= 0);
|
Preconditions.checkArgument(itemSpriteId >= 0);
|
||||||
this.name = name;
|
this.name = name;
|
||||||
@@ -282,7 +286,7 @@ enum Task
|
|||||||
this.weaknessThreshold = -1;
|
this.weaknessThreshold = -1;
|
||||||
this.weaknessItem = -1;
|
this.weaknessItem = -1;
|
||||||
this.targetNames = new String[0];
|
this.targetNames = new String[0];
|
||||||
this.expectedKillExp = expectedKillExp;
|
this.minimumKillXp = minimumKillXp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
|
|||||||
+15
-1
@@ -27,11 +27,14 @@ package net.runelite.client.plugins.statusbars;
|
|||||||
import net.runelite.client.config.Config;
|
import net.runelite.client.config.Config;
|
||||||
import net.runelite.client.config.ConfigGroup;
|
import net.runelite.client.config.ConfigGroup;
|
||||||
import net.runelite.client.config.ConfigItem;
|
import net.runelite.client.config.ConfigItem;
|
||||||
|
import net.runelite.client.config.Units;
|
||||||
import net.runelite.client.plugins.statusbars.config.BarMode;
|
import net.runelite.client.plugins.statusbars.config.BarMode;
|
||||||
|
|
||||||
@ConfigGroup("statusbars")
|
@ConfigGroup(StatusBarsConfig.GROUP)
|
||||||
public interface StatusBarsConfig extends Config
|
public interface StatusBarsConfig extends Config
|
||||||
{
|
{
|
||||||
|
String GROUP = "statusbars";
|
||||||
|
|
||||||
@ConfigItem(
|
@ConfigItem(
|
||||||
keyName = "enableCounter",
|
keyName = "enableCounter",
|
||||||
name = "Show counters",
|
name = "Show counters",
|
||||||
@@ -81,4 +84,15 @@ public interface StatusBarsConfig extends Config
|
|||||||
{
|
{
|
||||||
return BarMode.PRAYER;
|
return BarMode.PRAYER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
keyName = "hideAfterCombatDelay",
|
||||||
|
name = "Hide after combat delay",
|
||||||
|
description = "Amount of ticks before hiding status bars after no longer in combat. 0 = always show status bars."
|
||||||
|
)
|
||||||
|
@Units(Units.TICKS)
|
||||||
|
default int hideAfterCombatDelay()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-1
@@ -80,6 +80,7 @@ class StatusBarsOverlay extends Overlay
|
|||||||
private static final int MAX_RUN_ENERGY_VALUE = 100;
|
private static final int MAX_RUN_ENERGY_VALUE = 100;
|
||||||
|
|
||||||
private final Client client;
|
private final Client client;
|
||||||
|
private final StatusBarsPlugin plugin;
|
||||||
private final StatusBarsConfig config;
|
private final StatusBarsConfig config;
|
||||||
private final ItemStatChangesService itemStatService;
|
private final ItemStatChangesService itemStatService;
|
||||||
private final SpriteManager spriteManager;
|
private final SpriteManager spriteManager;
|
||||||
@@ -94,11 +95,12 @@ class StatusBarsOverlay extends Overlay
|
|||||||
private final Map<BarMode, BarRenderer> barRenderers = new EnumMap<>(BarMode.class);
|
private final Map<BarMode, BarRenderer> barRenderers = new EnumMap<>(BarMode.class);
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private StatusBarsOverlay(Client client, StatusBarsConfig config, SkillIconManager skillIconManager, ItemStatChangesService itemstatservice, SpriteManager spriteManager)
|
private StatusBarsOverlay(Client client, StatusBarsPlugin plugin, StatusBarsConfig config, SkillIconManager skillIconManager, ItemStatChangesService itemstatservice, SpriteManager spriteManager)
|
||||||
{
|
{
|
||||||
setPosition(OverlayPosition.DYNAMIC);
|
setPosition(OverlayPosition.DYNAMIC);
|
||||||
setLayer(OverlayLayer.ABOVE_WIDGETS);
|
setLayer(OverlayLayer.ABOVE_WIDGETS);
|
||||||
this.client = client;
|
this.client = client;
|
||||||
|
this.plugin = plugin;
|
||||||
this.config = config;
|
this.config = config;
|
||||||
this.itemStatService = itemstatservice;
|
this.itemStatService = itemstatservice;
|
||||||
this.spriteManager = spriteManager;
|
this.spriteManager = spriteManager;
|
||||||
@@ -216,6 +218,11 @@ class StatusBarsOverlay extends Overlay
|
|||||||
@Override
|
@Override
|
||||||
public Dimension render(Graphics2D g)
|
public Dimension render(Graphics2D g)
|
||||||
{
|
{
|
||||||
|
if (!plugin.isBarsDisplayed())
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
Viewport curViewport = null;
|
Viewport curViewport = null;
|
||||||
Widget curWidget = null;
|
Widget curWidget = null;
|
||||||
|
|
||||||
|
|||||||
+69
@@ -26,12 +26,24 @@ package net.runelite.client.plugins.statusbars;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import com.google.inject.Provides;
|
import com.google.inject.Provides;
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.Getter;
|
||||||
|
import net.runelite.api.Actor;
|
||||||
|
import net.runelite.api.Client;
|
||||||
|
import net.runelite.api.NPC;
|
||||||
|
import net.runelite.api.Player;
|
||||||
|
import net.runelite.api.Varbits;
|
||||||
|
import net.runelite.api.events.GameTick;
|
||||||
|
import net.runelite.client.callback.ClientThread;
|
||||||
import net.runelite.client.config.ConfigManager;
|
import net.runelite.client.config.ConfigManager;
|
||||||
|
import net.runelite.client.eventbus.Subscribe;
|
||||||
|
import net.runelite.client.events.ConfigChanged;
|
||||||
import net.runelite.client.plugins.Plugin;
|
import net.runelite.client.plugins.Plugin;
|
||||||
import net.runelite.client.plugins.PluginDependency;
|
import net.runelite.client.plugins.PluginDependency;
|
||||||
import net.runelite.client.plugins.PluginDescriptor;
|
import net.runelite.client.plugins.PluginDescriptor;
|
||||||
import net.runelite.client.plugins.itemstats.ItemStatPlugin;
|
import net.runelite.client.plugins.itemstats.ItemStatPlugin;
|
||||||
import net.runelite.client.ui.overlay.OverlayManager;
|
import net.runelite.client.ui.overlay.OverlayManager;
|
||||||
|
import org.apache.commons.lang3.ArrayUtils;
|
||||||
|
|
||||||
@PluginDescriptor(
|
@PluginDescriptor(
|
||||||
name = "Status Bars",
|
name = "Status Bars",
|
||||||
@@ -47,9 +59,24 @@ public class StatusBarsPlugin extends Plugin
|
|||||||
@Inject
|
@Inject
|
||||||
private OverlayManager overlayManager;
|
private OverlayManager overlayManager;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private Client client;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private StatusBarsConfig config;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ClientThread clientThread;
|
||||||
|
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
|
private boolean barsDisplayed;
|
||||||
|
|
||||||
|
private int lastCombatActionTickCount;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void startUp() throws Exception
|
protected void startUp() throws Exception
|
||||||
{
|
{
|
||||||
|
clientThread.invokeLater(this::checkStatusBars);
|
||||||
overlayManager.add(overlay);
|
overlayManager.add(overlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,6 +84,7 @@ public class StatusBarsPlugin extends Plugin
|
|||||||
protected void shutDown() throws Exception
|
protected void shutDown() throws Exception
|
||||||
{
|
{
|
||||||
overlayManager.remove(overlay);
|
overlayManager.remove(overlay);
|
||||||
|
barsDisplayed = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@@ -64,4 +92,45 @@ public class StatusBarsPlugin extends Plugin
|
|||||||
{
|
{
|
||||||
return configManager.getConfig(StatusBarsConfig.class);
|
return configManager.getConfig(StatusBarsConfig.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onGameTick(GameTick gameTick)
|
||||||
|
{
|
||||||
|
checkStatusBars();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onConfigChanged(ConfigChanged event)
|
||||||
|
{
|
||||||
|
if (StatusBarsConfig.GROUP.equals(event.getGroup()) && event.getKey().equals("hideAfterCombatDelay"))
|
||||||
|
{
|
||||||
|
clientThread.invokeLater(this::checkStatusBars);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkStatusBars()
|
||||||
|
{
|
||||||
|
final Player localPlayer = client.getLocalPlayer();
|
||||||
|
if (localPlayer == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Actor interacting = localPlayer.getInteracting();
|
||||||
|
|
||||||
|
if (config.hideAfterCombatDelay() == 0)
|
||||||
|
{
|
||||||
|
barsDisplayed = true;
|
||||||
|
}
|
||||||
|
else if ((interacting instanceof NPC && ArrayUtils.contains(((NPC) interacting).getComposition().getActions(), "Attack"))
|
||||||
|
|| (interacting instanceof Player && client.getVar(Varbits.PVP_SPEC_ORB) == 1))
|
||||||
|
{
|
||||||
|
lastCombatActionTickCount = client.getTickCount();
|
||||||
|
barsDisplayed = true;
|
||||||
|
}
|
||||||
|
else if (client.getTickCount() - lastCombatActionTickCount >= config.hideAfterCombatDelay())
|
||||||
|
{
|
||||||
|
barsDisplayed = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ enum GameTimer
|
|||||||
EXANTIFIRE(ItemID.EXTENDED_ANTIFIRE4, GameTimerImageType.ITEM, "Extended antifire", 12, ChronoUnit.MINUTES),
|
EXANTIFIRE(ItemID.EXTENDED_ANTIFIRE4, GameTimerImageType.ITEM, "Extended antifire", 12, ChronoUnit.MINUTES),
|
||||||
OVERLOAD(ItemID.OVERLOAD_4, GameTimerImageType.ITEM, "Overload", 5, ChronoUnit.MINUTES, true),
|
OVERLOAD(ItemID.OVERLOAD_4, GameTimerImageType.ITEM, "Overload", 5, ChronoUnit.MINUTES, true),
|
||||||
CANNON(ItemID.CANNON_BARRELS, GameTimerImageType.ITEM, "Cannon", 25, ChronoUnit.MINUTES),
|
CANNON(ItemID.CANNON_BARRELS, GameTimerImageType.ITEM, "Cannon", 25, ChronoUnit.MINUTES),
|
||||||
|
CANNON_REPAIR(ItemID.TOOLKIT, GameTimerImageType.ITEM, "Broken Cannon", 10, ChronoUnit.MINUTES),
|
||||||
MAGICIMBUE(SpriteID.SPELL_MAGIC_IMBUE, GameTimerImageType.SPRITE, "Magic imbue", 21, GAME_TICKS),
|
MAGICIMBUE(SpriteID.SPELL_MAGIC_IMBUE, GameTimerImageType.SPRITE, "Magic imbue", 21, GAME_TICKS),
|
||||||
SUPERANTIFIRE(ItemID.SUPER_ANTIFIRE_POTION4, GameTimerImageType.ITEM, "Super antifire", 3, ChronoUnit.MINUTES),
|
SUPERANTIFIRE(ItemID.SUPER_ANTIFIRE_POTION4, GameTimerImageType.ITEM, "Super antifire", 3, ChronoUnit.MINUTES),
|
||||||
BIND(SpriteID.SPELL_BIND, GameTimerImageType.SPRITE, "Bind", GraphicID.BIND, 8, GAME_TICKS, true),
|
BIND(SpriteID.SPELL_BIND, GameTimerImageType.SPRITE, "Bind", GraphicID.BIND, 8, GAME_TICKS, true),
|
||||||
@@ -85,7 +86,9 @@ enum GameTimer
|
|||||||
RESURRECT_THRALL_COOLDOWN(SpriteID.SPELL_RESURRECT_SUPERIOR_SKELETON_DISABLED, GameTimerImageType.SPRITE, "Resurrect thrall cooldown", 12, GAME_TICKS),
|
RESURRECT_THRALL_COOLDOWN(SpriteID.SPELL_RESURRECT_SUPERIOR_SKELETON_DISABLED, GameTimerImageType.SPRITE, "Resurrect thrall cooldown", 12, GAME_TICKS),
|
||||||
WARD_OF_ARCEUUS_COOLDOWN(SpriteID.SPELL_WARD_OF_ARCEUUS_DISABLED, GameTimerImageType.SPRITE, "Ward of Arceuus cooldown", 30, ChronoUnit.SECONDS),
|
WARD_OF_ARCEUUS_COOLDOWN(SpriteID.SPELL_WARD_OF_ARCEUUS_DISABLED, GameTimerImageType.SPRITE, "Ward of Arceuus cooldown", 30, ChronoUnit.SECONDS),
|
||||||
DEATH_CHARGE_COOLDOWN(SpriteID.SPELL_DEATH_CHARGE_DISABLED, GameTimerImageType.SPRITE, "Death charge cooldown", 60, ChronoUnit.SECONDS),
|
DEATH_CHARGE_COOLDOWN(SpriteID.SPELL_DEATH_CHARGE_DISABLED, GameTimerImageType.SPRITE, "Death charge cooldown", 60, ChronoUnit.SECONDS),
|
||||||
CORRUPTION_COOLDOWN(SpriteID.SPELL_GREATER_CORRUPTION_DISABLED, GameTimerImageType.SPRITE, "Corruption cooldown", 30, ChronoUnit.SECONDS);
|
CORRUPTION_COOLDOWN(SpriteID.SPELL_GREATER_CORRUPTION_DISABLED, GameTimerImageType.SPRITE, "Corruption cooldown", 30, ChronoUnit.SECONDS),
|
||||||
|
PICKPOCKET_STUN(SpriteID.SKILL_THIEVING, GameTimerImageType.SPRITE, "Stunned", true)
|
||||||
|
;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private final Duration duration;
|
private final Duration duration;
|
||||||
|
|||||||
@@ -283,4 +283,14 @@ public interface TimersConfig extends Config
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
keyName = "showPickpocketStun",
|
||||||
|
name = "Pickpocket stun timer",
|
||||||
|
description = "Configures whether pickpocket stun timer is displayed"
|
||||||
|
)
|
||||||
|
default boolean showPickpocketStun()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+39
-10
@@ -55,7 +55,6 @@ import net.runelite.api.Varbits;
|
|||||||
import net.runelite.api.coords.WorldPoint;
|
import net.runelite.api.coords.WorldPoint;
|
||||||
import net.runelite.api.events.ActorDeath;
|
import net.runelite.api.events.ActorDeath;
|
||||||
import net.runelite.api.events.AnimationChanged;
|
import net.runelite.api.events.AnimationChanged;
|
||||||
import net.runelite.api.events.StatChanged;
|
|
||||||
import net.runelite.api.events.ChatMessage;
|
import net.runelite.api.events.ChatMessage;
|
||||||
import net.runelite.api.events.GameStateChanged;
|
import net.runelite.api.events.GameStateChanged;
|
||||||
import net.runelite.api.events.GameTick;
|
import net.runelite.api.events.GameTick;
|
||||||
@@ -63,6 +62,7 @@ import net.runelite.api.events.GraphicChanged;
|
|||||||
import net.runelite.api.events.ItemContainerChanged;
|
import net.runelite.api.events.ItemContainerChanged;
|
||||||
import net.runelite.api.events.MenuOptionClicked;
|
import net.runelite.api.events.MenuOptionClicked;
|
||||||
import net.runelite.api.events.NpcDespawned;
|
import net.runelite.api.events.NpcDespawned;
|
||||||
|
import net.runelite.api.events.StatChanged;
|
||||||
import net.runelite.api.events.VarbitChanged;
|
import net.runelite.api.events.VarbitChanged;
|
||||||
import net.runelite.api.widgets.Widget;
|
import net.runelite.api.widgets.Widget;
|
||||||
import static net.runelite.api.widgets.WidgetInfo.PVP_WORLD_SAFE_ZONE;
|
import static net.runelite.api.widgets.WidgetInfo.PVP_WORLD_SAFE_ZONE;
|
||||||
@@ -82,7 +82,7 @@ import org.apache.commons.lang3.ArrayUtils;
|
|||||||
@PluginDescriptor(
|
@PluginDescriptor(
|
||||||
name = "Timers",
|
name = "Timers",
|
||||||
description = "Show various timers in an infobox",
|
description = "Show various timers in an infobox",
|
||||||
tags = {"combat", "items", "magic", "potions", "prayer", "overlay", "abyssal", "sire", "inferno", "fight", "caves", "cape", "timer", "tzhaar"}
|
tags = {"combat", "items", "magic", "potions", "prayer", "overlay", "abyssal", "sire", "inferno", "fight", "caves", "cape", "timer", "tzhaar", "thieving", "pickpocket"}
|
||||||
)
|
)
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class TimersPlugin extends Plugin
|
public class TimersPlugin extends Plugin
|
||||||
@@ -90,10 +90,14 @@ public class TimersPlugin extends Plugin
|
|||||||
private static final String ABYSSAL_SIRE_STUN_MESSAGE = "The Sire has been disorientated temporarily.";
|
private static final String ABYSSAL_SIRE_STUN_MESSAGE = "The Sire has been disorientated temporarily.";
|
||||||
private static final String ANTIFIRE_DRINK_MESSAGE = "You drink some of your antifire potion.";
|
private static final String ANTIFIRE_DRINK_MESSAGE = "You drink some of your antifire potion.";
|
||||||
private static final String ANTIFIRE_EXPIRED_MESSAGE = "<col=7f007f>Your antifire potion has expired.</col>";
|
private static final String ANTIFIRE_EXPIRED_MESSAGE = "<col=7f007f>Your antifire potion has expired.</col>";
|
||||||
|
private static final String CANNON_BASE_MESSAGE = "You place the cannon base on the ground.";
|
||||||
|
private static final String CANNON_STAND_MESSAGE = "You add the stand.";
|
||||||
|
private static final String CANNON_BARRELS_MESSAGE = "You add the barrels.";
|
||||||
private static final String CANNON_FURNACE_MESSAGE = "You add the furnace.";
|
private static final String CANNON_FURNACE_MESSAGE = "You add the furnace.";
|
||||||
private static final String CANNON_PICKUP_MESSAGE = "You pick up the cannon. It's really heavy.";
|
private static final String CANNON_PICKUP_MESSAGE = "You pick up the cannon. It's really heavy.";
|
||||||
private static final String CANNON_REPAIR_MESSAGE = "You repair your cannon, restoring it to working order.";
|
private static final String CANNON_REPAIR_MESSAGE = "You repair your cannon, restoring it to working order.";
|
||||||
private static final String CANNON_DESTROYED_MESSAGE = "Your cannon has been destroyed!";
|
private static final String CANNON_DESTROYED_MESSAGE = "Your cannon has been destroyed!";
|
||||||
|
private static final String CANNON_BROKEN_MESSAGE = "<col=ef1020>Your cannon has broken!";
|
||||||
private static final String CHARGE_EXPIRED_MESSAGE = "<col=ef1020>Your magical charge fades away.</col>";
|
private static final String CHARGE_EXPIRED_MESSAGE = "<col=ef1020>Your magical charge fades away.</col>";
|
||||||
private static final String CHARGE_MESSAGE = "<col=ef1020>You feel charged with magic power.</col>";
|
private static final String CHARGE_MESSAGE = "<col=ef1020>You feel charged with magic power.</col>";
|
||||||
private static final String EXTENDED_ANTIFIRE_DRINK_MESSAGE = "You drink some of your extended antifire potion.";
|
private static final String EXTENDED_ANTIFIRE_DRINK_MESSAGE = "You drink some of your extended antifire potion.";
|
||||||
@@ -122,6 +126,7 @@ public class TimersPlugin extends Plugin
|
|||||||
private static final String RESURRECT_THRALL_DISAPPEAR_MESSAGE_START = ">Your ";
|
private static final String RESURRECT_THRALL_DISAPPEAR_MESSAGE_START = ">Your ";
|
||||||
private static final String RESURRECT_THRALL_DISAPPEAR_MESSAGE_END = " thrall returns to the grave.</col>";
|
private static final String RESURRECT_THRALL_DISAPPEAR_MESSAGE_END = " thrall returns to the grave.</col>";
|
||||||
private static final String WARD_OF_ARCEUUS_MESSAGE = ">Your defence against Arceuus magic has been strengthened.</col>";
|
private static final String WARD_OF_ARCEUUS_MESSAGE = ">Your defence against Arceuus magic has been strengthened.</col>";
|
||||||
|
private static final String PICKPOCKET_FAILURE_MESSAGE = "You fail to pick the ";
|
||||||
|
|
||||||
private static final Pattern TELEBLOCK_PATTERN = Pattern.compile("A Tele Block spell has been cast on you(?: by .+)?\\. It will expire in (?<mins>\\d+) minutes?(?:, (?<secs>\\d+) seconds?)?\\.");
|
private static final Pattern TELEBLOCK_PATTERN = Pattern.compile("A Tele Block spell has been cast on you(?: by .+)?\\. It will expire in (?<mins>\\d+) minutes?(?:, (?<secs>\\d+) seconds?)?\\.");
|
||||||
private static final Pattern DIVINE_POTION_PATTERN = Pattern.compile("You drink some of your divine (.+) potion\\.");
|
private static final Pattern DIVINE_POTION_PATTERN = Pattern.compile("You drink some of your divine (.+) potion\\.");
|
||||||
@@ -498,6 +503,18 @@ public class TimersPlugin extends Plugin
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (message.contains(PICKPOCKET_FAILURE_MESSAGE) && config.showPickpocketStun() && message.contains("pocket"))
|
||||||
|
{
|
||||||
|
if (message.contains("hero") || message.contains("elf"))
|
||||||
|
{
|
||||||
|
createGameTimer(PICKPOCKET_STUN, Duration.ofSeconds(6));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
createGameTimer(PICKPOCKET_STUN, Duration.ofSeconds(5));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (message.equals(ABYSSAL_SIRE_STUN_MESSAGE) && config.showAbyssalSireStun())
|
if (message.equals(ABYSSAL_SIRE_STUN_MESSAGE) && config.showAbyssalSireStun())
|
||||||
{
|
{
|
||||||
createGameTimer(ABYSSAL_SIRE_STUN);
|
createGameTimer(ABYSSAL_SIRE_STUN);
|
||||||
@@ -559,15 +576,27 @@ public class TimersPlugin extends Plugin
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config.showCannon() && (message.equals(CANNON_FURNACE_MESSAGE) || message.contains(CANNON_REPAIR_MESSAGE)))
|
if (config.showCannon())
|
||||||
{
|
{
|
||||||
TimerTimer cannonTimer = createGameTimer(CANNON);
|
if (message.equals(CANNON_BASE_MESSAGE) || message.equals(CANNON_STAND_MESSAGE)
|
||||||
cannonTimer.setTooltip(cannonTimer.getTooltip() + " - World " + client.getWorld());
|
|| message.equals(CANNON_BARRELS_MESSAGE) || message.equals(CANNON_FURNACE_MESSAGE)
|
||||||
}
|
|| message.contains(CANNON_REPAIR_MESSAGE))
|
||||||
|
{
|
||||||
if (config.showCannon() && (message.equals(CANNON_PICKUP_MESSAGE) || message.equals(CANNON_DESTROYED_MESSAGE)))
|
removeGameTimer(CANNON_REPAIR);
|
||||||
{
|
TimerTimer cannonTimer = createGameTimer(CANNON);
|
||||||
removeGameTimer(CANNON);
|
cannonTimer.setTooltip(cannonTimer.getTooltip() + " - World " + client.getWorld());
|
||||||
|
}
|
||||||
|
else if (message.equals(CANNON_BROKEN_MESSAGE))
|
||||||
|
{
|
||||||
|
removeGameTimer(CANNON);
|
||||||
|
TimerTimer cannonTimer = createGameTimer(CANNON_REPAIR);
|
||||||
|
cannonTimer.setTooltip(cannonTimer.getTooltip() + " - World " + client.getWorld());
|
||||||
|
}
|
||||||
|
else if (message.equals(CANNON_PICKUP_MESSAGE) || message.equals(CANNON_DESTROYED_MESSAGE))
|
||||||
|
{
|
||||||
|
removeGameTimer(CANNON);
|
||||||
|
removeGameTimer(CANNON_REPAIR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config.showMagicImbue() && message.equals(MAGIC_IMBUE_MESSAGE))
|
if (config.showMagicImbue() && message.equals(MAGIC_IMBUE_MESSAGE))
|
||||||
|
|||||||
+47
-10
@@ -31,10 +31,10 @@ import java.time.Instant;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import net.runelite.api.ItemID;
|
import net.runelite.api.ItemID;
|
||||||
import net.runelite.client.game.ItemManager;
|
import net.runelite.client.game.ItemManager;
|
||||||
import net.runelite.client.plugins.timetracking.clocks.ClockManager;
|
import net.runelite.client.plugins.timetracking.clocks.ClockManager;
|
||||||
|
import net.runelite.client.plugins.timetracking.farming.CropState;
|
||||||
import net.runelite.client.plugins.timetracking.farming.FarmingContractManager;
|
import net.runelite.client.plugins.timetracking.farming.FarmingContractManager;
|
||||||
import net.runelite.client.plugins.timetracking.farming.FarmingTracker;
|
import net.runelite.client.plugins.timetracking.farming.FarmingTracker;
|
||||||
import net.runelite.client.plugins.timetracking.hunter.BirdHouseTracker;
|
import net.runelite.client.plugins.timetracking.hunter.BirdHouseTracker;
|
||||||
@@ -124,14 +124,13 @@ class OverviewTabPanel extends TabContentPanel
|
|||||||
}
|
}
|
||||||
|
|
||||||
farmingOverviews.forEach((patchType, panel) ->
|
farmingOverviews.forEach((patchType, panel) ->
|
||||||
updateItemPanel(panel, farmingTracker.getSummary(patchType), farmingTracker.getCompletionTime(patchType), null));
|
updateItemPanel(panel, farmingTracker.getSummary(patchType), farmingTracker.getCompletionTime(patchType)));
|
||||||
|
|
||||||
updateItemPanel(birdHouseOverview, birdHouseTracker.getSummary(), birdHouseTracker.getCompletionTime(), null);
|
updateItemPanel(birdHouseOverview, birdHouseTracker.getSummary(), birdHouseTracker.getCompletionTime());
|
||||||
updateItemPanel(farmingContractOverview, farmingContractManager.getSummary(), farmingContractManager.getCompletionTime(),
|
updateContractPanel();
|
||||||
farmingContractManager.getContractName());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateItemPanel(OverviewItemPanel panel, SummaryState summary, long completionTime, @Nullable String farmingContract)
|
private void updateItemPanel(OverviewItemPanel panel, SummaryState summary, long completionTime)
|
||||||
{
|
{
|
||||||
switch (summary)
|
switch (summary)
|
||||||
{
|
{
|
||||||
@@ -151,10 +150,7 @@ class OverviewTabPanel extends TabContentPanel
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case EMPTY:
|
case EMPTY:
|
||||||
panel.updateStatus(farmingContract == null ? "Empty" : farmingContract, Color.GRAY);
|
panel.updateStatus("Empty", Color.GRAY);
|
||||||
break;
|
|
||||||
case OCCUPIED:
|
|
||||||
panel.updateStatus(farmingContract == null ? "" : farmingContract, Color.RED);
|
|
||||||
break;
|
break;
|
||||||
case UNKNOWN:
|
case UNKNOWN:
|
||||||
default:
|
default:
|
||||||
@@ -162,4 +158,45 @@ class OverviewTabPanel extends TabContentPanel
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateContractPanel()
|
||||||
|
{
|
||||||
|
switch (farmingContractManager.getSummary())
|
||||||
|
{
|
||||||
|
case COMPLETED:
|
||||||
|
case IN_PROGRESS:
|
||||||
|
switch (farmingContractManager.getContractCropState())
|
||||||
|
{
|
||||||
|
case HARVESTABLE:
|
||||||
|
case GROWING:
|
||||||
|
long duration = farmingContractManager.getCompletionTime() - Instant.now().getEpochSecond();
|
||||||
|
|
||||||
|
if (duration <= 0)
|
||||||
|
{
|
||||||
|
farmingContractOverview.updateStatus("Ready", ColorScheme.PROGRESS_COMPLETE_COLOR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
farmingContractOverview.updateStatus("Ready " + getFormattedEstimate(duration, config.timeFormatMode()), Color.GRAY);
|
||||||
|
return;
|
||||||
|
case DISEASED:
|
||||||
|
farmingContractOverview.updateStatus("Diseased", CropState.DISEASED.getColor());
|
||||||
|
return;
|
||||||
|
case DEAD:
|
||||||
|
farmingContractOverview.updateStatus("Dead", CropState.DEAD.getColor());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// fallthrough
|
||||||
|
case UNKNOWN:
|
||||||
|
default:
|
||||||
|
farmingContractOverview.updateStatus("Unknown", Color.GRAY);
|
||||||
|
return;
|
||||||
|
case EMPTY:
|
||||||
|
farmingContractOverview.updateStatus(farmingContractManager.getContractName(), Color.GRAY);
|
||||||
|
return;
|
||||||
|
case OCCUPIED:
|
||||||
|
farmingContractOverview.updateStatus(farmingContractManager.getContractName(), Color.RED);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+20
-9
@@ -24,13 +24,16 @@
|
|||||||
*/
|
*/
|
||||||
package net.runelite.client.plugins.timetracking;
|
package net.runelite.client.plugins.timetracking;
|
||||||
|
|
||||||
|
import java.time.DateTimeException;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.time.format.TextStyle;
|
import java.time.format.TextStyle;
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.time.temporal.ChronoUnit;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
public abstract class TabContentPanel extends JPanel
|
public abstract class TabContentPanel extends JPanel
|
||||||
{
|
{
|
||||||
private static final DateTimeFormatter DATETIME_FORMATTER_24H = DateTimeFormatter.ofPattern("HH:mm");
|
private static final DateTimeFormatter DATETIME_FORMATTER_24H = DateTimeFormatter.ofPattern("HH:mm");
|
||||||
@@ -72,17 +75,25 @@ public abstract class TabContentPanel extends JPanel
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
StringBuilder sb = new StringBuilder();
|
try
|
||||||
LocalDateTime endTime = LocalDateTime.now().plus(remainingSeconds, ChronoUnit.SECONDS);
|
|
||||||
LocalDateTime currentTime = LocalDateTime.now();
|
|
||||||
if (endTime.getDayOfWeek() != currentTime.getDayOfWeek())
|
|
||||||
{
|
{
|
||||||
sb.append(endTime.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.getDefault())).append(" ");
|
StringBuilder sb = new StringBuilder();
|
||||||
}
|
LocalDateTime endTime = LocalDateTime.now().plus(remainingSeconds, ChronoUnit.SECONDS);
|
||||||
sb.append("at ");
|
LocalDateTime currentTime = LocalDateTime.now();
|
||||||
sb.append(formatter.format(endTime));
|
if (endTime.getDayOfWeek() != currentTime.getDayOfWeek())
|
||||||
|
{
|
||||||
|
sb.append(endTime.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.getDefault())).append(" ");
|
||||||
|
}
|
||||||
|
sb.append("at ");
|
||||||
|
sb.append(formatter.format(endTime));
|
||||||
|
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
|
}
|
||||||
|
catch (DateTimeException e)
|
||||||
|
{
|
||||||
|
log.warn("error formatting absolute time: now + {}", remainingSeconds, e);
|
||||||
|
return "Invalid";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
-2
@@ -35,7 +35,6 @@ import javax.swing.JPanel;
|
|||||||
import javax.swing.JToggleButton;
|
import javax.swing.JToggleButton;
|
||||||
import javax.swing.border.EmptyBorder;
|
import javax.swing.border.EmptyBorder;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import net.runelite.api.Constants;
|
import net.runelite.api.Constants;
|
||||||
import net.runelite.client.ui.ColorScheme;
|
import net.runelite.client.ui.ColorScheme;
|
||||||
import net.runelite.client.ui.FontManager;
|
import net.runelite.client.ui.FontManager;
|
||||||
@@ -44,7 +43,6 @@ import net.runelite.client.ui.components.shadowlabel.JShadowedLabel;
|
|||||||
import net.runelite.client.util.ImageUtil;
|
import net.runelite.client.util.ImageUtil;
|
||||||
import net.runelite.client.util.SwingUtil;
|
import net.runelite.client.util.SwingUtil;
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
@Getter
|
@Getter
|
||||||
public class TimeablePanel<T> extends JPanel
|
public class TimeablePanel<T> extends JPanel
|
||||||
{
|
{
|
||||||
|
|||||||
-2
@@ -35,7 +35,6 @@ import java.util.Set;
|
|||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JToggleButton;
|
import javax.swing.JToggleButton;
|
||||||
import javax.swing.border.EmptyBorder;
|
import javax.swing.border.EmptyBorder;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import net.runelite.api.ItemID;
|
import net.runelite.api.ItemID;
|
||||||
import net.runelite.client.config.ConfigManager;
|
import net.runelite.client.config.ConfigManager;
|
||||||
import net.runelite.client.game.ItemManager;
|
import net.runelite.client.game.ItemManager;
|
||||||
@@ -45,7 +44,6 @@ import net.runelite.client.plugins.timetracking.TimeablePanel;
|
|||||||
import net.runelite.client.ui.ColorScheme;
|
import net.runelite.client.ui.ColorScheme;
|
||||||
import net.runelite.client.ui.FontManager;
|
import net.runelite.client.ui.FontManager;
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
public class FarmingTabPanel extends TabContentPanel
|
public class FarmingTabPanel extends TabContentPanel
|
||||||
{
|
{
|
||||||
private final FarmingTracker farmingTracker;
|
private final FarmingTracker farmingTracker;
|
||||||
|
|||||||
+1
-1
@@ -90,7 +90,7 @@ public class CustomScrollBarUI extends BasicScrollBarUI
|
|||||||
{
|
{
|
||||||
JScrollBar bar = (JScrollBar) c;
|
JScrollBar bar = (JScrollBar) c;
|
||||||
bar.setUnitIncrement(16);
|
bar.setUnitIncrement(16);
|
||||||
bar.setPreferredSize(new Dimension(7, 0));
|
bar.setPreferredSize(new Dimension(7, 7));
|
||||||
return new CustomScrollBarUI();
|
return new CustomScrollBarUI();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -69,7 +69,9 @@ public class WidgetOverlay extends Overlay
|
|||||||
new WidgetOverlay(client, WidgetInfo.MULTICOMBAT_FIXED, OverlayPosition.BOTTOM_RIGHT),
|
new WidgetOverlay(client, WidgetInfo.MULTICOMBAT_FIXED, OverlayPosition.BOTTOM_RIGHT),
|
||||||
new WidgetOverlay(client, WidgetInfo.MULTICOMBAT_RESIZEABLE_MODERN, OverlayPosition.CANVAS_TOP_RIGHT),
|
new WidgetOverlay(client, WidgetInfo.MULTICOMBAT_RESIZEABLE_MODERN, OverlayPosition.CANVAS_TOP_RIGHT),
|
||||||
new WidgetOverlay(client, WidgetInfo.MULTICOMBAT_RESIZEABLE_CLASSIC, OverlayPosition.CANVAS_TOP_RIGHT),
|
new WidgetOverlay(client, WidgetInfo.MULTICOMBAT_RESIZEABLE_CLASSIC, OverlayPosition.CANVAS_TOP_RIGHT),
|
||||||
new WidgetOverlay(client, WidgetInfo.TEMPOROSS_STATUS_INDICATOR, OverlayPosition.TOP_LEFT)
|
new WidgetOverlay(client, WidgetInfo.TEMPOROSS_STATUS_INDICATOR, OverlayPosition.TOP_LEFT),
|
||||||
|
new WidgetOverlay(client, WidgetInfo.BA_HEAL_TEAMMATES, OverlayPosition.BOTTOM_LEFT),
|
||||||
|
new WidgetOverlay(client, WidgetInfo.BA_TEAM, OverlayPosition.TOP_RIGHT)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+8
-8
@@ -450,7 +450,7 @@ public class ModelOutlineRenderer
|
|||||||
{
|
{
|
||||||
y3 = clipY2;
|
y3 = clipY2;
|
||||||
}
|
}
|
||||||
if (y1 == y3 || y3 < 0)
|
if (y1 == y3 || y3 < clipY1)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -459,16 +459,16 @@ public class ModelOutlineRenderer
|
|||||||
x2 <<= 14;
|
x2 <<= 14;
|
||||||
x3 = x1;
|
x3 = x1;
|
||||||
|
|
||||||
if (y1 < 0)
|
if (y1 < clipY1)
|
||||||
{
|
{
|
||||||
x3 -= y1 * slope3;
|
x3 -= (y1 - clipY1) * slope3;
|
||||||
x1 -= y1 * slope1;
|
x1 -= (y1 - clipY1) * slope1;
|
||||||
y1 = 0;
|
y1 = clipY1;
|
||||||
}
|
}
|
||||||
if (y2 < 0)
|
if (y2 < clipY1)
|
||||||
{
|
{
|
||||||
x2 -= slope2 * y2;
|
x2 -= (y2 - clipY1) * slope2;
|
||||||
y2 = 0;
|
y2 = clipY1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pixelY = y1;
|
int pixelY = y1;
|
||||||
|
|||||||
+1
-1
@@ -130,7 +130,7 @@ public class WorldMapOverlay extends Overlay
|
|||||||
Area currentClip = null;
|
Area currentClip = null;
|
||||||
|
|
||||||
Point mousePos = client.getMouseCanvasPosition();
|
Point mousePos = client.getMouseCanvasPosition();
|
||||||
if (!canvasViewArea.contains(mousePos.getX(), mousePos.getY()))
|
if (!mapViewArea.contains(mousePos.getX(), mousePos.getY()))
|
||||||
{
|
{
|
||||||
mousePos = null;
|
mousePos = null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3765,7 +3765,13 @@
|
|||||||
23072,
|
23072,
|
||||||
23082,
|
23082,
|
||||||
25753,
|
25753,
|
||||||
25820
|
25820,
|
||||||
|
25920,
|
||||||
|
25921,
|
||||||
|
25922,
|
||||||
|
25923,
|
||||||
|
25924,
|
||||||
|
25925
|
||||||
],
|
],
|
||||||
"herb tea mix": [
|
"herb tea mix": [
|
||||||
4464,
|
4464,
|
||||||
@@ -7528,7 +7534,16 @@
|
|||||||
25185,
|
25185,
|
||||||
25187,
|
25187,
|
||||||
25189,
|
25189,
|
||||||
25191
|
25191,
|
||||||
|
25898,
|
||||||
|
25900,
|
||||||
|
25902,
|
||||||
|
25904,
|
||||||
|
25906,
|
||||||
|
25908,
|
||||||
|
25910,
|
||||||
|
25912,
|
||||||
|
25914
|
||||||
],
|
],
|
||||||
"slayer ring": [
|
"slayer ring": [
|
||||||
11866,
|
11866,
|
||||||
@@ -8641,6 +8656,11 @@
|
|||||||
21009,
|
21009,
|
||||||
21206
|
21206
|
||||||
],
|
],
|
||||||
|
"dragon hunter crossbow": [
|
||||||
|
21012,
|
||||||
|
25916,
|
||||||
|
25918
|
||||||
|
],
|
||||||
"ancestral hat": [
|
"ancestral hat": [
|
||||||
21018,
|
21018,
|
||||||
25518
|
25518
|
||||||
@@ -9884,5 +9904,21 @@
|
|||||||
25892,
|
25892,
|
||||||
25894,
|
25894,
|
||||||
25896
|
25896
|
||||||
|
],
|
||||||
|
"ghommals hilt": [
|
||||||
|
25926,
|
||||||
|
25928,
|
||||||
|
25930,
|
||||||
|
25932,
|
||||||
|
25934,
|
||||||
|
25936
|
||||||
|
],
|
||||||
|
"anim offhand": [
|
||||||
|
25938,
|
||||||
|
25941,
|
||||||
|
25944,
|
||||||
|
25947,
|
||||||
|
25950,
|
||||||
|
25953
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
+2417
File diff suppressed because it is too large
Load Diff
+6
@@ -162,6 +162,12 @@
|
|||||||
"name": "Silver Stall",
|
"name": "Silver Stall",
|
||||||
"xp": 54
|
"xp": 54
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"level": 50,
|
||||||
|
"icon": 5560,
|
||||||
|
"name": "Wall Safe",
|
||||||
|
"xp": 70
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"level": 53,
|
"level": 53,
|
||||||
"icon": 4625,
|
"icon": 4625,
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
2FE66C1A3B63EEF10142A955C927054613F59A34C4A929C8AC79DBE0F1B06C30
|
9D5F23C8B25B79FF2B23F6AE449EDF74645E808B67ECF0E389B626966E86B1BD
|
||||||
@@ -565,7 +565,7 @@ LABEL441:
|
|||||||
if_icmpeq LABEL445
|
if_icmpeq LABEL445
|
||||||
jump LABEL490
|
jump LABEL490
|
||||||
LABEL445:
|
LABEL445:
|
||||||
iconst 40697935
|
iconst 40697936
|
||||||
iconst 1
|
iconst 1
|
||||||
cc_find
|
cc_find
|
||||||
iconst 1
|
iconst 1
|
||||||
|
|||||||
+2
@@ -111,6 +111,8 @@ public class GroundItemsPluginTest
|
|||||||
|
|
||||||
when(client.getLocalPlayer()).thenReturn(mock(Player.class));
|
when(client.getLocalPlayer()).thenReturn(mock(Player.class));
|
||||||
when(config.getHiddenItems()).thenReturn("");
|
when(config.getHiddenItems()).thenReturn("");
|
||||||
|
when(config.showLootbeamForHighlighted()).thenReturn(false);
|
||||||
|
when(config.showLootbeamTier()).thenReturn(HighlightTier.OFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -32,13 +32,11 @@ import javax.swing.text.JTextComponent;
|
|||||||
import jdk.jshell.JShell;
|
import jdk.jshell.JShell;
|
||||||
import jdk.jshell.SourceCodeAnalysis;
|
import jdk.jshell.SourceCodeAnalysis;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.fife.ui.autocomplete.BasicCompletion;
|
import org.fife.ui.autocomplete.BasicCompletion;
|
||||||
import org.fife.ui.autocomplete.Completion;
|
import org.fife.ui.autocomplete.Completion;
|
||||||
import org.fife.ui.autocomplete.CompletionProviderBase;
|
import org.fife.ui.autocomplete.CompletionProviderBase;
|
||||||
import org.fife.ui.autocomplete.ParameterizedCompletion;
|
import org.fife.ui.autocomplete.ParameterizedCompletion;
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class JShellAutocompleteProvider extends CompletionProviderBase
|
public class JShellAutocompleteProvider extends CompletionProviderBase
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ import javax.swing.JTextArea;
|
|||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
import javax.swing.text.BadLocationException;
|
import javax.swing.text.BadLocationException;
|
||||||
import javax.swing.text.Segment;
|
import javax.swing.text.Segment;
|
||||||
|
import jdk.jshell.DeclarationSnippet;
|
||||||
import jdk.jshell.Diag;
|
import jdk.jshell.Diag;
|
||||||
import jdk.jshell.JShell;
|
import jdk.jshell.JShell;
|
||||||
import jdk.jshell.Snippet;
|
import jdk.jshell.Snippet;
|
||||||
@@ -185,7 +186,6 @@ public abstract class ShellPanel extends JPanel
|
|||||||
}
|
}
|
||||||
|
|
||||||
console.setFont(codeFont);
|
console.setFont(codeFont);
|
||||||
console.setFocusable(false);
|
|
||||||
console.setEditable(false);
|
console.setEditable(false);
|
||||||
console.setOpaque(false); // this turns off the hover effect for some reason
|
console.setOpaque(false); // this turns off the hover effect for some reason
|
||||||
|
|
||||||
@@ -316,11 +316,13 @@ public abstract class ShellPanel extends JPanel
|
|||||||
{
|
{
|
||||||
Snippet snip = ev.snippet();
|
Snippet snip = ev.snippet();
|
||||||
offsets.put("#" + snip.id(), thisOffset);
|
offsets.put("#" + snip.id(), thisOffset);
|
||||||
if (ev.status() != Snippet.Status.VALID && ev.status() != Snippet.Status.RECOVERABLE_DEFINED)
|
if (ev.status() != Snippet.Status.VALID)
|
||||||
{
|
{
|
||||||
|
boolean handled = false;
|
||||||
var diags = shell.diagnostics(snip).collect(Collectors.toList());
|
var diags = shell.diagnostics(snip).collect(Collectors.toList());
|
||||||
for (var diag : diags)
|
for (var diag : diags)
|
||||||
{
|
{
|
||||||
|
handled = true;
|
||||||
String msg = toStringDiagnostic(src, thisOffset, diag);
|
String msg = toStringDiagnostic(src, thisOffset, diag);
|
||||||
if (isUserCode)
|
if (isUserCode)
|
||||||
{
|
{
|
||||||
@@ -332,11 +334,23 @@ public abstract class ShellPanel extends JPanel
|
|||||||
throw new RuntimeException("prelude error: " + msg);
|
throw new RuntimeException("prelude error: " + msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (diags.isEmpty())
|
if (snip instanceof DeclarationSnippet)
|
||||||
|
{
|
||||||
|
var unresolved = shell.unresolvedDependencies((DeclarationSnippet) snip).collect(Collectors.toList());
|
||||||
|
for (var ident : unresolved)
|
||||||
|
{
|
||||||
|
handled = true;
|
||||||
|
logToConsole("Unresolved symbol: " + ident);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!handled)
|
||||||
{
|
{
|
||||||
logToConsole("bad snippet" + ev.status());
|
logToConsole("bad snippet" + ev.status());
|
||||||
}
|
}
|
||||||
break evaluation;
|
if (ev.status() != Snippet.Status.RECOVERABLE_DEFINED)
|
||||||
|
{
|
||||||
|
break evaluation;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (ev.exception() != null)
|
if (ev.exception() != null)
|
||||||
{
|
{
|
||||||
@@ -419,18 +433,23 @@ public abstract class ShellPanel extends JPanel
|
|||||||
|
|
||||||
private void cleanup()
|
private void cleanup()
|
||||||
{
|
{
|
||||||
for (var c : cleanup)
|
var todo = new ArrayList<>(cleanup);
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
c.run();
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
shellLogger.error("Cleanup threw:", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cleanup.clear();
|
cleanup.clear();
|
||||||
|
|
||||||
|
invokeOnClientThread(() ->
|
||||||
|
{
|
||||||
|
for (var c : todo)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
c.run();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
shellLogger.error("Cleanup threw:", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract void invokeOnClientThread(Runnable r);
|
protected abstract void invokeOnClientThread(Runnable r);
|
||||||
|
|||||||
Reference in New Issue
Block a user