From 5362c51816674a0ef1a955ce3718a2e4e23e6976 Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Thu, 1 Apr 2021 09:54:38 +0100 Subject: [PATCH 01/77] interface styles: add HD healthbars for the rest of the healtbars --- .../main/java/net/runelite/api/SpriteID.java | 82 ++++++++++++- .../interfacestyles/HealthbarOverride.java | 112 +++++++++++++++--- .../2010/healthbar/back_30px.png | Bin 280 -> 0 bytes .../2010/healthbar/back_90px.png | Bin 305 -> 0 bytes .../2010/healthbar/blue_back_50px.png | Bin 0 -> 645 bytes .../2010/healthbar/blue_front_50px.png | Bin 0 -> 717 bytes .../2010/healthbar/cox_blue.png | Bin 0 -> 774 bytes .../2010/healthbar/cox_green.png | Bin 0 -> 768 bytes .../2010/healthbar/cox_red.png | Bin 0 -> 830 bytes .../2010/healthbar/cox_yellow.png | Bin 0 -> 791 bytes .../2010/healthbar/cyan_back_100px.png | Bin 0 -> 769 bytes .../2010/healthbar/cyan_back_120px.png | Bin 0 -> 797 bytes .../2010/healthbar/cyan_back_140px.png | Bin 0 -> 832 bytes .../2010/healthbar/cyan_back_160px.png | Bin 0 -> 849 bytes .../2010/healthbar/cyan_back_40px.png | Bin 0 -> 663 bytes .../2010/healthbar/cyan_back_50px.png | Bin 0 -> 694 bytes .../2010/healthbar/cyan_back_60px.png | Bin 0 -> 713 bytes .../2010/healthbar/cyan_back_70px.png | Bin 0 -> 716 bytes .../2010/healthbar/cyan_back_80px.png | Bin 0 -> 759 bytes .../2010/healthbar/cyan_front_100px.png | Bin 0 -> 802 bytes .../2010/healthbar/cyan_front_120px.png | Bin 0 -> 817 bytes .../2010/healthbar/cyan_front_140px.png | Bin 0 -> 828 bytes .../2010/healthbar/cyan_front_160px.png | Bin 0 -> 864 bytes .../2010/healthbar/cyan_front_40px.png | Bin 0 -> 687 bytes .../2010/healthbar/cyan_front_50px.png | Bin 0 -> 702 bytes .../2010/healthbar/cyan_front_60px.png | Bin 0 -> 721 bytes .../2010/healthbar/cyan_front_70px.png | Bin 0 -> 750 bytes .../2010/healthbar/cyan_front_80px.png | Bin 0 -> 767 bytes .../2010/healthbar/default_back_100px.png | Bin 0 -> 714 bytes .../2010/healthbar/default_back_120px.png | Bin 0 -> 733 bytes .../2010/healthbar/default_back_140px.png | Bin 0 -> 756 bytes .../2010/healthbar/default_back_160px.png | Bin 0 -> 769 bytes .../2010/healthbar/default_back_40px.png | Bin 0 -> 679 bytes .../2010/healthbar/default_back_50px.png | Bin 0 -> 695 bytes .../2010/healthbar/default_back_60px.png | Bin 0 -> 670 bytes .../2010/healthbar/default_back_70px.png | Bin 0 -> 705 bytes .../2010/healthbar/default_back_80px.png | Bin 0 -> 709 bytes .../2010/healthbar/default_front_100px.png | Bin 0 -> 768 bytes .../2010/healthbar/default_front_120px.png | Bin 0 -> 803 bytes .../2010/healthbar/default_front_140px.png | Bin 0 -> 842 bytes .../2010/healthbar/default_front_160px.png | Bin 0 -> 843 bytes .../2010/healthbar/default_front_40px.png | Bin 0 -> 683 bytes .../2010/healthbar/default_front_50px.png | Bin 0 -> 716 bytes .../2010/healthbar/default_front_60px.png | Bin 0 -> 710 bytes .../2010/healthbar/default_front_70px.png | Bin 0 -> 755 bytes .../2010/healthbar/default_front_80px.png | Bin 0 -> 771 bytes .../2010/healthbar/front_30px.png | Bin 371 -> 0 bytes .../2010/healthbar/front_90px.png | Bin 444 -> 0 bytes .../2010/healthbar/orange_back_100px.png | Bin 0 -> 799 bytes .../2010/healthbar/orange_back_120px.png | Bin 0 -> 823 bytes .../2010/healthbar/orange_back_140px.png | Bin 0 -> 848 bytes .../2010/healthbar/orange_back_160px.png | Bin 0 -> 871 bytes .../2010/healthbar/orange_back_40px.png | Bin 0 -> 699 bytes .../2010/healthbar/orange_back_50px.png | Bin 0 -> 731 bytes .../2010/healthbar/orange_back_60px.png | Bin 0 -> 724 bytes .../2010/healthbar/orange_back_70px.png | Bin 0 -> 766 bytes .../2010/healthbar/orange_back_80px.png | Bin 0 -> 781 bytes .../2010/healthbar/orange_front_100px.png | Bin 0 -> 818 bytes .../2010/healthbar/orange_front_120px.png | Bin 0 -> 831 bytes .../2010/healthbar/orange_front_140px.png | Bin 0 -> 868 bytes .../2010/healthbar/orange_front_160px.png | Bin 0 -> 886 bytes .../2010/healthbar/orange_front_40px.png | Bin 0 -> 706 bytes .../2010/healthbar/orange_front_50px.png | Bin 0 -> 753 bytes .../2010/healthbar/orange_front_60px.png | Bin 0 -> 745 bytes .../2010/healthbar/orange_front_70px.png | Bin 0 -> 764 bytes .../2010/healthbar/orange_front_80px.png | Bin 0 -> 790 bytes .../2010/healthbar/yellow_back_100px.png | Bin 0 -> 741 bytes .../2010/healthbar/yellow_back_120px.png | Bin 0 -> 768 bytes .../2010/healthbar/yellow_back_140px.png | Bin 0 -> 810 bytes .../2010/healthbar/yellow_back_160px.png | Bin 0 -> 824 bytes .../2010/healthbar/yellow_back_40px.png | Bin 0 -> 685 bytes .../2010/healthbar/yellow_back_50px.png | Bin 0 -> 668 bytes .../2010/healthbar/yellow_back_60px.png | Bin 0 -> 682 bytes .../2010/healthbar/yellow_back_70px.png | Bin 0 -> 724 bytes .../2010/healthbar/yellow_back_80px.png | Bin 0 -> 749 bytes .../2010/healthbar/yellow_front_100px.png | Bin 0 -> 791 bytes .../2010/healthbar/yellow_front_120px.png | Bin 0 -> 804 bytes .../2010/healthbar/yellow_front_140px.png | Bin 0 -> 832 bytes .../2010/healthbar/yellow_front_160px.png | Bin 0 -> 846 bytes .../2010/healthbar/yellow_front_40px.png | Bin 0 -> 686 bytes .../2010/healthbar/yellow_front_50px.png | Bin 0 -> 698 bytes .../2010/healthbar/yellow_front_60px.png | Bin 0 -> 712 bytes .../2010/healthbar/yellow_front_70px.png | Bin 0 -> 751 bytes .../2010/healthbar/yellow_front_80px.png | Bin 0 -> 775 bytes 84 files changed, 173 insertions(+), 21 deletions(-) delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/back_30px.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/back_90px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/blue_back_50px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/blue_front_50px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cox_blue.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cox_green.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cox_red.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cox_yellow.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_back_100px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_back_120px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_back_140px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_back_160px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_back_40px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_back_50px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_back_60px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_back_70px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_back_80px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_front_100px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_front_120px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_front_140px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_front_160px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_front_40px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_front_50px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_front_60px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_front_70px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_front_80px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_100px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_120px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_140px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_160px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_40px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_50px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_60px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_70px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_80px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_front_100px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_front_120px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_front_140px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_front_160px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_front_40px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_front_50px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_front_60px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_front_70px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_front_80px.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/front_30px.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/front_90px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_back_100px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_back_120px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_back_140px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_back_160px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_back_40px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_back_50px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_back_60px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_back_70px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_back_80px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_front_100px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_front_120px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_front_140px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_front_160px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_front_40px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_front_50px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_front_60px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_front_70px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_front_80px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_back_100px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_back_120px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_back_140px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_back_160px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_back_40px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_back_50px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_back_60px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_back_70px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_back_80px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_front_100px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_front_120px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_front_140px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_front_160px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_front_40px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_front_50px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_front_60px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_front_70px.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_front_80px.png diff --git a/runelite-api/src/main/java/net/runelite/api/SpriteID.java b/runelite-api/src/main/java/net/runelite/api/SpriteID.java index a69160b3c2..d085bb0674 100644 --- a/runelite-api/src/main/java/net/runelite/api/SpriteID.java +++ b/runelite-api/src/main/java/net/runelite/api/SpriteID.java @@ -1300,10 +1300,10 @@ public final class SpriteID public static final int UNKNOWN_WHITE_REFRESH_ARROWS = 1412; public static final int TAB_QUESTS_PURPLE_KOUREND_UNUSED = 1413; public static final int TAB_QUESTS_PURPLE_KOUREND = 1414; - public static final int UNKNOWN_GREEN_BAR = 1415; - public static final int UNKNOWN_BLUE_BAR = 1416; - public static final int UNKNOWN_YELLOW_BAR = 1417; - public static final int UNKNOWN_RED_BAR = 1418; + public static final int HEALTHBAR_COX_GREEN = 1415; + public static final int HEALTHBAR_COX_BLUE = 1416; + public static final int HEALTHBAR_COX_YELLOW = 1417; + public static final int HEALTHBAR_COX_RED = 1418; /* Unmapped: 1419 */ public static final int PRAYER_RIGOUR = 1420; public static final int PRAYER_AUGURY = 1421; @@ -1525,9 +1525,69 @@ public final class SpriteID public static final int HEALTHBAR_DEFAULT_BACK_140PX = 2189; public static final int HEALTHBAR_DEFAULT_FRONT_160PX = 2190; public static final int HEALTHBAR_DEFAULT_BACK_160PX = 2191; + /* Unmapped: 2192~2306 */ public static final int TAB_CLAN_CHAT = 2307; + /* Unmapped: 2308~2419 */ public static final int WIKI_DESELECTED = 2420; public static final int WIKI_SELECTED = 2421; + /* Unmapped: 2422~2430 */ + public static final int HEALTHBAR_DEFAULT_FRONT_40PX = 2431; + public static final int HEALTHBAR_DEFAULT_BACK_40PX = 2432; + public static final int HEALTHBAR_CYAN_FRONT_30PX = 2433; + public static final int HEALTHBAR_CYAN_BACK_30PX = 2434; + public static final int HEALTHBAR_CYAN_FRONT_40PX = 2435; + public static final int HEALTHBAR_CYAN_BACK_40PX = 2436; + public static final int HEALTHBAR_CYAN_FRONT_50PX = 2437; + public static final int HEALTHBAR_CYAN_BACK_50PX = 2438; + public static final int HEALTHBAR_CYAN_FRONT_60PX = 2439; + public static final int HEALTHBAR_CYAN_BACK_60PX = 2440; + public static final int HEALTHBAR_CYAN_FRONT_80PX = 2441; + public static final int HEALTHBAR_CYAN_BACK_80PX = 2442; + public static final int HEALTHBAR_CYAN_FRONT_100PX = 2443; + public static final int HEALTHBAR_CYAN_BACK_100PX = 2444; + public static final int HEALTHBAR_CYAN_FRONT_120PX = 2445; + public static final int HEALTHBAR_CYAN_BACK_120PX = 2446; + public static final int HEALTHBAR_CYAN_FRONT_140PX = 2447; + public static final int HEALTHBAR_CYAN_BACK_140PX = 2448; + public static final int HEALTHBAR_CYAN_FRONT_160PX = 2449; + public static final int HEALTHBAR_CYAN_BACK_160PX = 2450; + public static final int HEALTHBAR_ORANGE_FRONT_30PX = 2451; + public static final int HEALTHBAR_ORANGE_BACK_30PX = 2452; + public static final int HEALTHBAR_ORANGE_FRONT_40PX = 2453; + public static final int HEALTHBAR_ORANGE_BACK_40PX = 2454; + public static final int HEALTHBAR_ORANGE_FRONT_50PX = 2455; + public static final int HEALTHBAR_ORANGE_BACK_50PX = 2456; + public static final int HEALTHBAR_ORANGE_FRONT_60PX = 2457; + public static final int HEALTHBAR_ORANGE_BACK_60PX = 2458; + public static final int HEALTHBAR_ORANGE_FRONT_80PX = 2459; + public static final int HEALTHBAR_ORANGE_BACK_80PX = 2460; + public static final int HEALTHBAR_ORANGE_FRONT_100PX = 2461; + public static final int HEALTHBAR_ORANGE_BACK_100PX = 2462; + public static final int HEALTHBAR_ORANGE_FRONT_120PX = 2463; + public static final int HEALTHBAR_ORANGE_BACK_120PX = 2464; + public static final int HEALTHBAR_ORANGE_FRONT_140PX = 2465; + public static final int HEALTHBAR_ORANGE_BACK_140PX = 2466; + public static final int HEALTHBAR_ORANGE_FRONT_160PX = 2467; + public static final int HEALTHBAR_ORANGE_BACK_160PX = 2468; + public static final int HEALTHBAR_YELLOW_FRONT_30PX = 2469; + public static final int HEALTHBAR_YELLOW_BACK_30PX = 2470; + public static final int HEALTHBAR_YELLOW_FRONT_40PX = 2471; + public static final int HEALTHBAR_YELLOW_BACK_40PX = 2472; + public static final int HEALTHBAR_YELLOW_FRONT_50PX = 2473; + public static final int HEALTHBAR_YELLOW_BACK_50PX = 2474; + public static final int HEALTHBAR_YELLOW_FRONT_60PX = 2475; + public static final int HEALTHBAR_YELLOW_BACK_60PX = 2476; + public static final int HEALTHBAR_YELLOW_FRONT_80PX = 2477; + public static final int HEALTHBAR_YELLOW_BACK_80PX = 2478; + public static final int HEALTHBAR_YELLOW_FRONT_100PX = 2479; + public static final int HEALTHBAR_YELLOW_BACK_100PX = 2480; + public static final int HEALTHBAR_YELLOW_FRONT_120PX = 2481; + public static final int HEALTHBAR_YELLOW_BACK_120PX = 2482; + public static final int HEALTHBAR_YELLOW_FRONT_140PX = 2483; + public static final int HEALTHBAR_YELLOW_BACK_140PX = 2484; + public static final int HEALTHBAR_YELLOW_FRONT_160PX = 2485; + public static final int HEALTHBAR_YELLOW_BACK_160PX = 2486; + /* Unmapped: 2487~2824 */ public static final int FRIENDS_CHAT_RANK_SMILEY_FRIEND = 2825; public static final int FRIENDS_CHAT_RANK_CROWN_JAGEX_MODERATOR = 2826; public static final int FRIENDS_CHAT_RANK_KEY_CHANNEL_OWNER = 2827; @@ -1541,7 +1601,19 @@ public final class SpriteID public static final int SETTINGS_SLIDER_HANDLE_BLUE = 2858; public static final int SETTINGS_SLIDER_HANDLE_RED = 2859; public static final int SETTINGS_SLIDER_HANDLE_GREEN = 2860; - /* Unmapped: 2861~2980 */ + /* Unmapped: 2861~2966 */ + public static final int HEALTHBAR_BLUE_FRONT_50PX = 2967; + public static final int HEALTHBAR_BLUE_BACK_50PX = 2968; + /* Unmapped: 2968~2970 */ + public static final int HEALTHBAR_DEFAULT_FRONT_70PX = 2971; + public static final int HEALTHBAR_DEFAULT_BACK_70PX = 2972; + public static final int HEALTHBAR_CYAN_FRONT_70PX = 2973; + public static final int HEALTHBAR_CYAN_BACK_70PX = 2974; + public static final int HEALTHBAR_ORANGE_FRONT_70PX = 2975; + public static final int HEALTHBAR_ORANGE_BACK_70PX = 2976; + public static final int HEALTHBAR_YELLOW_FRONT_70PX = 2977; + public static final int HEALTHBAR_YELLOW_BACK_70PX = 2978; + /* Unmapped: 2979, 2980 */ public static final int SPELL_RESURRECT_SUPERIOR_SKELETON = 2981; /* Unmapped: 2982~2986 */ public static final int SPELL_RESURRECT_SUPERIOR_SKELETON_DISABLED = 2987; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/HealthbarOverride.java b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/HealthbarOverride.java index c0e844939a..bd888d7d73 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/HealthbarOverride.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/HealthbarOverride.java @@ -34,23 +34,103 @@ import net.runelite.client.game.SpriteOverride; @RequiredArgsConstructor enum HealthbarOverride implements SpriteOverride { - BACK_30PX(HEALTHBAR_DEFAULT_BACK_30PX, "back_30px.png"), - BACK_50PX(HEALTHBAR_DEFAULT_BACK_50PX, "back_30px.png"), - BACK_60PX(HEALTHBAR_DEFAULT_BACK_60PX, "back_30px.png"), - BACK_80PX(HEALTHBAR_DEFAULT_BACK_80PX, "back_90px.png"), - BACK_100PX(HEALTHBAR_DEFAULT_BACK_100PX, "back_90px.png"), - BACK_120PX(HEALTHBAR_DEFAULT_BACK_120PX, "back_90px.png"), - BACK_140PX(HEALTHBAR_DEFAULT_BACK_140PX, "back_90px.png"), - BACK_160PX(HEALTHBAR_DEFAULT_BACK_160PX, "back_90px.png"), + // Reusing the 40px image for the 30px bars is intentional, + // as a 30px HD bar is way too small and looks very wrong + DEFAULT_FRONT_30PX(HEALTHBAR_DEFAULT_FRONT_30PX, "default_front_40px.png"), + DEFAULT_FRONT_40PX(HEALTHBAR_DEFAULT_FRONT_40PX, "default_front_40px.png"), + DEFAULT_FRONT_50PX(HEALTHBAR_DEFAULT_FRONT_50PX, "default_front_50px.png"), + DEFAULT_FRONT_60PX(HEALTHBAR_DEFAULT_FRONT_60PX, "default_front_60px.png"), + DEFAULT_FRONT_70PX(HEALTHBAR_DEFAULT_FRONT_70PX, "default_front_70px.png"), + DEFAULT_FRONT_80PX(HEALTHBAR_DEFAULT_FRONT_80PX, "default_front_80px.png"), + DEFAULT_FRONT_100PX(HEALTHBAR_DEFAULT_FRONT_100PX, "default_front_100px.png"), + DEFAULT_FRONT_120PX(HEALTHBAR_DEFAULT_FRONT_120PX, "default_front_120px.png"), + DEFAULT_FRONT_140PX(HEALTHBAR_DEFAULT_FRONT_140PX, "default_front_140px.png"), + DEFAULT_FRONT_160PX(HEALTHBAR_DEFAULT_FRONT_160PX, "default_front_160px.png"), - FRONT_30PX(HEALTHBAR_DEFAULT_FRONT_30PX, "front_30px.png"), - FRONT_50PX(HEALTHBAR_DEFAULT_FRONT_50PX, "front_30px.png"), - FRONT_60PX(HEALTHBAR_DEFAULT_FRONT_60PX, "front_30px.png"), - FRONT_80PX(HEALTHBAR_DEFAULT_FRONT_80PX, "front_90px.png"), - FRONT_100PX(HEALTHBAR_DEFAULT_FRONT_100PX, "front_90px.png"), - FRONT_120PX(HEALTHBAR_DEFAULT_FRONT_120PX, "front_90px.png"), - FRONT_140PX(HEALTHBAR_DEFAULT_FRONT_140PX, "front_90px.png"), - FRONT_160PX(HEALTHBAR_DEFAULT_FRONT_160PX, "front_90px.png"); + DEFAULT_BACK_30PX(HEALTHBAR_DEFAULT_BACK_30PX, "default_back_40px.png"), + DEFAULT_BACK_40PX(HEALTHBAR_DEFAULT_BACK_40PX, "default_back_40px.png"), + DEFAULT_BACK_50PX(HEALTHBAR_DEFAULT_BACK_50PX, "default_back_50px.png"), + DEFAULT_BACK_60PX(HEALTHBAR_DEFAULT_BACK_60PX, "default_back_60px.png"), + DEFAULT_BACK_70PX(HEALTHBAR_DEFAULT_BACK_70PX, "default_back_70px.png"), + DEFAULT_BACK_80PX(HEALTHBAR_DEFAULT_BACK_80PX, "default_back_80px.png"), + DEFAULT_BACK_100PX(HEALTHBAR_DEFAULT_BACK_100PX, "default_back_100px.png"), + DEFAULT_BACK_120PX(HEALTHBAR_DEFAULT_BACK_120PX, "default_back_120px.png"), + DEFAULT_BACK_140PX(HEALTHBAR_DEFAULT_BACK_140PX, "default_back_140px.png"), + DEFAULT_BACK_160PX(HEALTHBAR_DEFAULT_BACK_160PX, "default_back_160px.png"), + + CYAN_FRONT_30PX(HEALTHBAR_CYAN_FRONT_30PX, "cyan_front_40px.png"), + CYAN_FRONT_40PX(HEALTHBAR_CYAN_FRONT_40PX, "cyan_front_40px.png"), + CYAN_FRONT_50PX(HEALTHBAR_CYAN_FRONT_50PX, "cyan_front_50px.png"), + CYAN_FRONT_60PX(HEALTHBAR_CYAN_FRONT_60PX, "cyan_front_60px.png"), + CYAN_FRONT_70PX(HEALTHBAR_CYAN_FRONT_70PX, "cyan_front_70px.png"), + CYAN_FRONT_80PX(HEALTHBAR_CYAN_FRONT_80PX, "cyan_front_80px.png"), + CYAN_FRONT_100PX(HEALTHBAR_CYAN_FRONT_100PX, "cyan_front_100px.png"), + CYAN_FRONT_120PX(HEALTHBAR_CYAN_FRONT_120PX, "cyan_front_120px.png"), + CYAN_FRONT_140PX(HEALTHBAR_CYAN_FRONT_140PX, "cyan_front_140px.png"), + CYAN_FRONT_160PX(HEALTHBAR_CYAN_FRONT_160PX, "cyan_front_160px.png"), + + CYAN_BACK_30PX(HEALTHBAR_CYAN_BACK_30PX, "cyan_back_40px.png"), + CYAN_BACK_40PX(HEALTHBAR_CYAN_BACK_40PX, "cyan_back_40px.png"), + CYAN_BACK_50PX(HEALTHBAR_CYAN_BACK_50PX, "cyan_back_50px.png"), + CYAN_BACK_60PX(HEALTHBAR_CYAN_BACK_60PX, "cyan_back_60px.png"), + CYAN_BACK_70PX(HEALTHBAR_CYAN_BACK_70PX, "cyan_back_70px.png"), + CYAN_BACK_80PX(HEALTHBAR_CYAN_BACK_80PX, "cyan_back_80px.png"), + CYAN_BACK_100PX(HEALTHBAR_CYAN_BACK_100PX, "cyan_back_100px.png"), + CYAN_BACK_120PX(HEALTHBAR_CYAN_BACK_120PX, "cyan_back_120px.png"), + CYAN_BACK_140PX(HEALTHBAR_CYAN_BACK_140PX, "cyan_back_140px.png"), + CYAN_BACK_160PX(HEALTHBAR_CYAN_BACK_160PX, "cyan_back_160px.png"), + + ORANGE_FRONT_30PX(HEALTHBAR_ORANGE_FRONT_30PX, "orange_front_40px.png"), + ORANGE_FRONT_40PX(HEALTHBAR_ORANGE_FRONT_40PX, "orange_front_40px.png"), + ORANGE_FRONT_50PX(HEALTHBAR_ORANGE_FRONT_50PX, "orange_front_50px.png"), + ORANGE_FRONT_60PX(HEALTHBAR_ORANGE_FRONT_60PX, "orange_front_60px.png"), + ORANGE_FRONT_70PX(HEALTHBAR_ORANGE_FRONT_70PX, "orange_front_70px.png"), + ORANGE_FRONT_80PX(HEALTHBAR_ORANGE_FRONT_80PX, "orange_front_80px.png"), + ORANGE_FRONT_100PX(HEALTHBAR_ORANGE_FRONT_100PX, "orange_front_100px.png"), + ORANGE_FRONT_120PX(HEALTHBAR_ORANGE_FRONT_120PX, "orange_front_120px.png"), + ORANGE_FRONT_140PX(HEALTHBAR_ORANGE_FRONT_140PX, "orange_front_140px.png"), + ORANGE_FRONT_160PX(HEALTHBAR_ORANGE_FRONT_160PX, "orange_front_160px.png"), + + ORANGE_BACK_30PX(HEALTHBAR_ORANGE_BACK_30PX, "orange_back_40px.png"), + ORANGE_BACK_40PX(HEALTHBAR_ORANGE_BACK_40PX, "orange_back_40px.png"), + ORANGE_BACK_50PX(HEALTHBAR_ORANGE_BACK_50PX, "orange_back_50px.png"), + ORANGE_BACK_60PX(HEALTHBAR_ORANGE_BACK_60PX, "orange_back_60px.png"), + ORANGE_BACK_70PX(HEALTHBAR_ORANGE_BACK_70PX, "orange_back_70px.png"), + ORANGE_BACK_80PX(HEALTHBAR_ORANGE_BACK_80PX, "orange_back_80px.png"), + ORANGE_BACK_100PX(HEALTHBAR_ORANGE_BACK_100PX, "orange_back_100px.png"), + ORANGE_BACK_120PX(HEALTHBAR_ORANGE_BACK_120PX, "orange_back_120px.png"), + ORANGE_BACK_140PX(HEALTHBAR_ORANGE_BACK_140PX, "orange_back_140px.png"), + ORANGE_BACK_160PX(HEALTHBAR_ORANGE_BACK_160PX, "orange_back_160px.png"), + + YELLOW_FRONT_30PX(HEALTHBAR_YELLOW_FRONT_30PX, "yellow_front_40px.png"), + YELLOW_FRONT_40PX(HEALTHBAR_YELLOW_FRONT_40PX, "yellow_front_40px.png"), + YELLOW_FRONT_50PX(HEALTHBAR_YELLOW_FRONT_50PX, "yellow_front_50px.png"), + YELLOW_FRONT_60PX(HEALTHBAR_YELLOW_FRONT_60PX, "yellow_front_60px.png"), + YELLOW_FRONT_70PX(HEALTHBAR_YELLOW_FRONT_70PX, "yellow_front_70px.png"), + YELLOW_FRONT_80PX(HEALTHBAR_YELLOW_FRONT_80PX, "yellow_front_80px.png"), + YELLOW_FRONT_100PX(HEALTHBAR_YELLOW_FRONT_100PX, "yellow_front_100px.png"), + YELLOW_FRONT_120PX(HEALTHBAR_YELLOW_FRONT_120PX, "yellow_front_120px.png"), + YELLOW_FRONT_140PX(HEALTHBAR_YELLOW_FRONT_140PX, "yellow_front_140px.png"), + YELLOW_FRONT_160PX(HEALTHBAR_YELLOW_FRONT_160PX, "yellow_front_160px.png"), + + YELLOW_BACK_30PX(HEALTHBAR_YELLOW_BACK_30PX, "yellow_back_40px.png"), + YELLOW_BACK_40PX(HEALTHBAR_YELLOW_BACK_40PX, "yellow_back_40px.png"), + YELLOW_BACK_50PX(HEALTHBAR_YELLOW_BACK_50PX, "yellow_back_50px.png"), + YELLOW_BACK_60PX(HEALTHBAR_YELLOW_BACK_60PX, "yellow_back_60px.png"), + YELLOW_BACK_70PX(HEALTHBAR_YELLOW_BACK_70PX, "yellow_back_70px.png"), + YELLOW_BACK_80PX(HEALTHBAR_YELLOW_BACK_80PX, "yellow_back_80px.png"), + YELLOW_BACK_100PX(HEALTHBAR_YELLOW_BACK_100PX, "yellow_back_100px.png"), + YELLOW_BACK_120PX(HEALTHBAR_YELLOW_BACK_120PX, "yellow_back_120px.png"), + YELLOW_BACK_140PX(HEALTHBAR_YELLOW_BACK_140PX, "yellow_back_140px.png"), + YELLOW_BACK_160PX(HEALTHBAR_YELLOW_BACK_160PX, "yellow_back_160px.png"), + + BLUE_FRONT_50PX(HEALTHBAR_BLUE_FRONT_50PX, "blue_front_50px.png"), + BLUE_BACK_50PX(HEALTHBAR_BLUE_BACK_50PX, "blue_back_50px.png"), + + COX_GREEN(HEALTHBAR_COX_GREEN, "cox_green.png"), + COX_BLUE(HEALTHBAR_COX_BLUE, "cox_blue.png"), + COX_YELLOW(HEALTHBAR_COX_YELLOW, "cox_yellow.png"), + COX_RED(HEALTHBAR_COX_RED, "cox_red.png"); @Getter private final int spriteId; diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/back_30px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/back_30px.png deleted file mode 100644 index 89e37c75bdf9a9282e3eea582bb93a94ab51222f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 280 zcmV+z0q6dSP) zjzKYt)q~hDzGO+r)5xA(gXCFU7@Hbohi@Vhqr{*iG!N!NaWNK*F968JxKax>a0DAG eWx!UlK&cH-+)zJJPHJf*;DU{ePy& z_W!jq+y6Jp9RFWPbNqiK$oc;^FW3L;yxji}GH}5I8ywKNXepQ2)Y?sC3dEMmV0aY+ z8&M>hmd6$WYp?`9u^2hK6B~(}Da0r# z+7YRY&PBt;cyJY&5kw12N-m@)j$mWOtPn>r?OGiGM_0004TX+uL$X=7sm z04R}lkv&VpP!xvWeuzaY9dr;8$xy|im7*YyT8A!0O08hkCAm#nAxXnciWFDD#i8IJ zy7)Et4|Ek=6$C*ML|ps>el1esxlN%(+7oWh!+Xzrxc6MZpVpaS2NQr{Iy{?7N~`%b zsrMa0_z=PvretPY3zwV7$JdpHU7yt?k^IMBNf)N8K$d+NINGa&E+T$?R_ndUV2O?s`RMUR2V4sdzX z(v$<>Y8M!Owq!0hqyR0yrU4%pz(5`tya)Q$y;(K)asCA4w&{uPfWsqTg6bn1f6HHI z@?&^Tt^fc432;bRa{vGjVE_ORVF9Q=r)dBH0J=#;K~y-)V`KmUF~$E3Lm9lf&&UY( zgqQ+C0w@e5AT%Qr8XpNWAjxA>1LZT~G6RLrgvSmn?tp^-r#C^I4EBheE<}`HoPmK) z6o-efSk8dQqYT(Qgk2n~qlr=X4=rV2fjgR$kAdOWcLs(xk8nDKWHy*) zfW`(N)FY`Q+Fb0OU}RxNN?LUOiC>PeHk7B*#U+h00000NkvXXu0mjf+|Ur- literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/blue_front_50px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/blue_front_50px.png new file mode 100644 index 0000000000000000000000000000000000000000..ce2c009f661b3e1bc90458af125b75a2accf6e6e GIT binary patch literal 717 zcmV;;0y6!HP)0004TX+uL$X=7sm z04R}lkv&VpP!xvWeuzaY9dr;8$xy|im7*YyT8A!0O08hkCAm#nAxXnciWFDD#i8IJ zy7)Et4|Ek=6$C*ML|ps>el1esxlN%(+7oWh!+Xzrxc6MZpVpaS2NQr{Iy{?7N~`%b zsrMa0_z=PvretPY3zwV7$JdpHU7yt?k^IMBNf)N8K$d+NINGa&E+T$?R_ndUV2O?s`RMUR2V4sdzX z(v$<>Y8M!Owq!0hqyR0yrU4%pz(5`tya)Q$y;(K)asCA4w&{uPfWsqTg6bn1f6HHI z@?&^Tt^fc432;bRa{vGjVE_ORVF9Q=r)dBH0Rl-xK~y-)V`KmUF~$E3Lm9lf&&UY# z1mom;NHYJy2tq^s2&R$5G1TCbW1x;17;1oIy&aeadj#f*Q0adRrXoyW_CKh4WcnY} zEI5r#43}PF%!A1jVIBx(i5t>67;r#y?7BXTH zgNS2_5z>Qj156AIgk%^Pp4|X5;T}2ufsMhA`vW`%K_S5iWPsR=@EG_HW`hi41dIP? zVET^;MG*f#R1RY4e=r+j7KD$QTK>ah7HkeQ*)T#~3bG%TlE7xdlNi*|-#@`qE%rPD zPmBLi+1SJg%7YUsG-#=4F3hRzUQmw=lTr%+=~_VvMuX*y00000NkvXXu0mjf4@xtE literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cox_blue.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cox_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..eeb85664f43af971cc243426e55a96289f4cd6cb GIT binary patch literal 774 zcmV+h1Nr=kP)e@h>d^1S0iD)V}yvrS!VCYnK_r4GvJTrbknIH1~c#4@##otKDiJI zJkv-w?esFB>5erSi$(c&eB9zw^=3%*`hQ=|(XwnfI{2D|$8^hfg(rlgYp$huOSnVN zYRke0!h^OPQ20{msR}@!o}TqBzOZ#aA;?J8gU|vV8yPwt~E_M{;|oTYrZb)V?<6BvjTF!QHP6~iH6A~=eXzMl-;k7EZqms5bSyssq<+}t#rh% z&x7{{Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^0003uNkl^4C%*%Z*Y-CxYb3~MVIIC4z*jv6 zktMRBxQ~SR%^+{&;>o?z_WlSL!e6eNR<=NZH59Ifz#0di5HU3;SbrkXzI(8 zxisD@X7SAx-JdT{TdxhQevMzVU&AI8qJvmjesqy2LM$#f!Uy4bCzoS0`p7x%u#P@H zbtG2K=ITR2fTVYj)d$zu{y+REs_e+p(cv7}iZe5HWdrhalXx=+KCM>noTG1^*^B1* yo=N$Jc4K2obW(BdgEV?2pP)e@h>d^1S0iD)V}yvrS!VCYnK_r4GvJTrbknIH1~c#4@##otKDiJI zJkv-w?esFB>5erSi$(c&eB9zw^=3%*`hQ=|(XwnfI{2D|$8^hfg(rlgYp$huOSnVN zYRke0!h^OPQ20{msR}nY2ef%B+Xqs~)#Wgc5jxnUIiS$1 z>MOt{FE|c~D^(aeFSG4&$auP5iaoo1e2V^Akeie9Fxl*!yPURyTrG;=EkufdvAIQ@ zB4F0X#FBzLWkUtQ869<2UW_r>y+RXXu89q0&ZQe@u$mfHW$Eqt%e|j%f+%Zt9{YxV z`q+ovR5wn*=%*(5lEOOP+=0Xn;eVCmqW?rPw6-tG?-X z$ifM-|D1Z?2pD4jIQM|dD7PJp-{G>r>+bcX#2mh|{?Av|H!vz>%07*qo IM6N<$g0dWj+5i9m literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cox_yellow.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cox_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..719e1c2b4dd8da46c3e692cfb6e003f03ca41860 GIT binary patch literal 791 zcmV+y1L*vTP)}Hb)$!6J2kYFp=SO^xP zjjzIgpsir5AP9;eV&fn1)ks+H7$G9bEVK9H%$&>28Sq83M$T; zB$C31!eK`aD14=Ky~59m(-nSK?99iez^8g@=|8OhVI$+@ga?H~xopw+J&(Fcn`te~ zN$ru@i%X1YB53FoStUz>A*q&RR@*oHBYEinHQd6Rv@?|Nh z-2dn4rbb69-PNB z`YxPrLidB6a1uX~U#2gWg4a_B#-ZZ|T9zwW{jPIz5A*BtMAxvl4+FBledQaaD`()g zhiKsd000SaNLh0L01sgR01sgSs6VG^0003_NklO>P{k+k z7u-4Z%GdS_5I?|`RRxFx7Z4RgA0%s!om48V;LvEL-OYII$=FUd$#Ptr3*$SO_ey#88gydvgPKI(K_nek+AOM@ThxEbqva1i)c2^%DAz7^+x*O9lIU z>wQ(v5TLQY(iviGiIB1V1;%F+NFk7lsC*ag?brjxIyl>wp38A_o6~gs%lcP;S>H%@ VVBt{916cq7002ovPDHLkV1l3|aIF9U literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_back_100px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_back_100px.png new file mode 100644 index 0000000000000000000000000000000000000000..7c2f99a2981f415ec88546e7b36c6d55731e1c3c GIT binary patch literal 769 zcmV+c1OEJpP)$(o0-8<*V#3ATcbMZiL| z@m2T_v=wX>1VIr*Z2SYh8VTziS4a?@W%hoYnRA&r1OBL?n@-&jnE8SokA$_k`30@v znE*kW7^fqtJJw_@7UkdZaf?sYn?cp<|9yXsmgTgggRfC|RJZJc@Pu%5tzaqM67JG- z$z|aK;Q?C?D152(l*dnsvmU=GwiEFw@T;C$wuVzRtmkY~xL-JA8b$r*JnAN`>HO@B z)S%2B9O6U>qmiP>3I+uRrRF8GzkNgBzG+s)qs!l-ge{INIq?pNT9mG7sTtAJ@)?v= z?!WVNG9$xY_tr4fKf3N~FEngJrR=(&hpt;Wg1`fu=d1oz$!Y9e^m0`T?L+$poL*G5 z)DE0&LifFuw3FXbK&C&FftM3#n}^P8XkPTP`dR1r4if9~L|3r82Ys@?ed!AT5@-sL z3U9#x000SaNLh0L01sgR01sgSs6VG^0003vNkl_A29-nTbURgdqTs zV!Gro;t`H4&hzDQIiJB_Z+IThO*NEjjraRB!+4B8_FY;00000NkvXXu0mjf$(o0-8<*V#3ATcbMZiL| z@m2T_v=wX>1VIr*Z2SYh8VTziS4a?@W%hoYnRA&r1OBL?n@-&jnE8SokA$_k`30@v znE*kW7^fqtJJw_@7UkdZaf?sYn?cp<|9yXsmgTgggRfC|RJZJc@Pu%5tzaqM67JG- z$z|aK;Q?C?D152(l*dnsvmU=GwiEFw@T;C$wuVzRtmkY~xL-JA8b$r*JnAN`>HO@B z)S%2B9O6U>qmiP>3I+uRrRF8GzkNgBzG+s)qs!l-ge{INIq?pNT9mG7sTtAJ@)?v= z?!WVNG9$xY_tr4fKf3N~FEngJrR=(&hpt;Wg1`fu=d1oz$!Y9e^m0`T?L+$poL*G5 z)DE0&LifFuw3FXbK&C&FftM3#n}^P8XkPTP`dR1r4if9~L|3r82Ys@?ed!AT5@-sL z3U9#x000SaNLh0L01sgR01sgSs6VG^00040Nklt&%%r3=T+D}BzW?){1p~+ncUqH9tt32BtYOOK#=rt zJL!=*k}!}R?_nVGy@!DmHz0GT#<2ahF>HT540K|8-0#IRkCPqGx9v{Wo6S#>r}6k~ zCi4CvpNCIHk}C_5R@pVhW1ynusvl_IsN&+J6##bL=@d8}2RQZ{Q{un;1I07_jIf`r zm|)%ShmQ((bU?H^UXEfe4CO=wS*rhuI!`**OF)atJD?m$ED={RtP(_LM|wz-^YALZ`|Uv-de{4K`3zk10YzrICZ b>|68~@MkUMNhRZp00000NkvXXu0mjfk|cKr literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_back_140px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_back_140px.png new file mode 100644 index 0000000000000000000000000000000000000000..a01935364a1717bd18eb576722b2a04808597921 GIT binary patch literal 832 zcmV-G1Hb%$(o0-8<*V#3ATcbMZiL| z@m2T_v=wX>1VIr*Z2SYh8VTziS4a?@W%hoYnRA&r1OBL?n@-&jnE8SokA$_k`30@v znE*kW7^fqtJJw_@7UkdZaf?sYn?cp<|9yXsmgTgggRfC|RJZJc@Pu%5tzaqM67JG- z$z|aK;Q?C?D152(l*dnsvmU=GwiEFw@T;C$wuVzRtmkY~xL-JA8b$r*JnAN`>HO@B z)S%2B9O6U>qmiP>3I+uRrRF8GzkNgBzG+s)qs!l-ge{INIq?pNT9mG7sTtAJ@)?v= z?!WVNG9$xY_tr4fKf3N~FEngJrR=(&hpt;Wg1`fu=d1oz$!Y9e^m0`T?L+$poL*G5 z)DE0&LifFuw3FXbK&C&FftM3#n}^P8XkPTP`dR1r4if9~L|3r82Ys@?ed!AT5@-sL z3U9#x000SaNLh0L01sgR01sgSs6VG^0004ZNkl|;VO_sauv#->t z$no%}=GX)NZiAo}({W}Kj*q~`f7*pLMm1htyCcu0#YQi?{Y|?|n8nNXI(S@{#lyYX z3}pz)C?EmBfCEzp!w9yG0S|r3hykd$G2N%opBgK~x~t0}ONa98JpZ0Q#f$dY5@+pv zKaQvJb~s#;W;y7tR;7G?mGACn040@%q)L!vHh3=yc!!-ij)Fw`*ljLB;3wClKMML)Lo+cI~m6Js11Np zU#Q^7-Z4gCNr(%vjN&85K{f81akTIeca@9mU)k3AD`}R-ucROOw=?0JXjC=;0000< KMNUMnLSTY{N{TlC literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_back_160px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_back_160px.png new file mode 100644 index 0000000000000000000000000000000000000000..3091fa2ba3cca587cd5ef01a9310ed247dd2356b GIT binary patch literal 849 zcmV-X1FrmuP)000LF1^@s6kJd(e0004RX+uL$X=7sm z04R}lkvmHRK@^3*B#Lhow2)x2MHCAKQ4qmKW059Eh!K1>$(o0-8<*V#3ATcbMZiL| z@m2T_v=wX>1VIr*Z2SYh8VTziS4a?@W%hoYnRA&r1OBL?n@-&jnE8SokA$_k`30@v znE*kW7^fqtJJw_@7UkdZaf?sYn?cp<|9yXsmgTgggRfC|RJZJc@Pu%5tzaqM67JG- z$z|aK;Q?C?D152(l*dnsvmU=GwiEFw@T;C$wuVzRtmkY~xL-JA8b$r*JnAN`>HO@B z)S%2B9O6U>qmiP>3I+uRrRF8GzkNgBzG+s)qs!l-ge{INIq?pNT9mG7sTtAJ@)?v= z?!WVNG9$xY_tr4fKf3N~FEngJrR=(&hpt;Wg1`fu=d1oz$!Y9e^m0`T?L+$poL*G5 z)DE0&LifFuw3FXbK&C&FftM3#n}^P8XkPTP`dR1r4if9~L|3r82Ys@?ed!AT5@-sL z3U9#x000SaNLh0L01sgR01sgSs6VG^0004qNkl{>2T zjznL=+u}gf5XD@AE~u1)tVT)mm~f>0kN4|vw_3dy;qh+Jd>+Enb9mYQWP&SQ1b0;+ z78Fj?sjtK~L%X}x8E_UpLYm+GXmlm2T|_Z_CtsAqole%uSDOK+;de3&wktr}Y@98a zU~;aat+7LtNtQ2CYX~zXEb>{XbgD>4Sq#~>Rqav(M}e<(s2aA)mX4#POns>(XSPPe zu7600000NkvXXu0mjfKevlO literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_back_40px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_back_40px.png new file mode 100644 index 0000000000000000000000000000000000000000..6e58e0e0ba5f876f55b3d7279f38dd70bed49c50 GIT binary patch literal 663 zcmV;I0%-k-P){Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^0002aNklOwRgn_9iMW^^2_nf!{i^E>9MD%x}V2+z(6iir|0+a4#woh~$ zU^p)1Nuh46VQ_Ap1#7T6HEy%pqS~yzHv%zxHjCKv?|3-Nf1bDexb?Vp-Dq;9msZ!n z^M$urcc$}G(6jkPo-0|-oDJGbw6f&C_yZsUD&+yG$+iFh002ovPDHLkV1f0004RX+uL$X=7sm z04R}lkvmHRK@^3*B#Lhow2)x2MHCAKQ4qmKW059Eh!K1>$(o0-8<*V#3ATcbMZiL| z@m2T_v=wX>1VIr*Z2SYh8VTziS4a?@W%hoYnRA&r1OBL?n@-&jnE8SokA$_k`30@v znE*kW7^fqtJJw_@7UkdZaf?sYn?cp<|9yXsmgTgggRfC|RJZJc@Pu%5tzaqM67JG- z$z|aK;Q?C?D152(l*dnsvmU=GwiEFw@T;C$wuVzRtmkY~xL-JA8b$r*JnAN`>HO@B z)S%2B9O6U>qmiP>3I+uRrRF8GzkNgBzG+s)qs!l-ge{INIq?pNT9mG7sTtAJ@)?v= z?!WVNG9$xY_tr4fKf3N~FEngJrR=(&hpt;Wg1`fu=d1oz$!Y9e^m0`T?L+$poL*G5 z)DE0&LifFuw3FXbK&C&FftM3#n}^P8XkPTP`dR1r4if9~L|3r82Ys@?ed!AT5@-sL z3U9#x000SaNLh0L01sgR01sgSs6VG^0002(Nkl$(o0-8<*V#3ATcbMZiL| z@m2T_v=wX>1VIr*Z2SYh8VTziS4a?@W%hoYnRA&r1OBL?n@-&jnE8SokA$_k`30@v znE*kW7^fqtJJw_@7UkdZaf?sYn?cp<|9yXsmgTgggRfC|RJZJc@Pu%5tzaqM67JG- z$z|aK;Q?C?D152(l*dnsvmU=GwiEFw@T;C$wuVzRtmkY~xL-JA8b$r*JnAN`>HO@B z)S%2B9O6U>qmiP>3I+uRrRF8GzkNgBzG+s)qs!l-ge{INIq?pNT9mG7sTtAJ@)?v= z?!WVNG9$xY_tr4fKf3N~FEngJrR=(&hpt;Wg1`fu=d1oz$!Y9e^m0`T?L+$poL*G5 z)DE0&LifFuw3FXbK&C&FftM3#n}^P8XkPTP`dR1r4if9~L|3r82Ys@?ed!AT5@-sL z3U9#x000SaNLh0L01sgR01sgSs6VG^00031Nkl{Ih0+vqP ze`N2R1aH?Gatz$Ap*^63w)1|6<(o0V+&xsySdbJM$@X(~OV;;!cLH2~LuWK_y*E!`+w#n$5%4>Y# zCShG}dBV~(#vl+NP?%_80to~X2oOQpW5U(+u?`bs;Y$hy_>tJz=9o!M&M+tDc`6G> vWk1+v$c?S4D`b)n7Xp=DH#T?Ae00000NkvXXu0mjf*5E{Y literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_back_70px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_back_70px.png new file mode 100644 index 0000000000000000000000000000000000000000..5104a6f92c8f870791c2ec53d59cf3ef6f348a18 GIT binary patch literal 716 zcmV;-0yF)IP)6wSfmLOVg#c$$(o0d$FiFs!B()b2v~?V zz6$?=wt}sKASi-}jeo#bBVoN`gak=unY|xp=3HjZfIXPevSy19vblm04)|S5(PfwO zl{SVMpaW-2Gxga}C`i-sb&pNeJFn{1d|$)SwU#h7u(b@nnk!q-ZVSNTP8s>&aVjYxP7?5d|LRmbr<*3w2+cwE?>%@no2^QfD2CvuAm zQio)YU=k*P9~W_otdpUDS87f&YwYv=`sT@tN0Yx!2}2wy(&F`qT9mE{sY%fj@?|Kg z-2dlkCMPGV-MjtJ`fOS6qu|_yO4+i$k1eZm0*)uR%+>sP$!Ypi^m0veA42aIoL|+n z_#Rwr!{DPHGh)AzL#92Mgts&3i9+8kbgoph`djDp0V137L^rU10AsShcl8IO3TNMn zpLsL@000SaNLh0L01sgR01sgSs6VG^00034Nkl>9*aLE(E#KMB8C^ro#{l!fzZ81k3QFejwUVR>dhSwk5!B!I=Mo znft^{BXw10O0UvKllSB`3KN%-D{U~@xiDbAgKWETqK1QJ&7#PGbu*yX?D|EG`G(8a zL1-!cbGT~1=9~L1_j#}3R#ja%YnNS~1H9hwX@6eWrz$Z9*TW|yG2)np;0)@dHT;eC zIUc7xYrgz&!BEo#1&VIWVSZh#7)9a|lk;eKJ}?sIDPfXC@F`x1<$kDQi2U@zm2b6v y#>D4~f}=BnX7c~tpN9BTJd{^aUcO4buhJI})iC6-tv2!i0000$(o0-8<*V#3ATcbMZiL| z@m2T_v=wX>1VIr*Z2SYh8VTziS4a?@W%hoYnRA&r1OBL?n@-&jnE8SokA$_k`30@v znE*kW7^fqtJJw_@7UkdZaf?sYn?cp<|9yXsmgTgggRfC|RJZJc@Pu%5tzaqM67JG- z$z|aK;Q?C?D152(l*dnsvmU=GwiEFw@T;C$wuVzRtmkY~xL-JA8b$r*JnAN`>HO@B z)S%2B9O6U>qmiP>3I+uRrRF8GzkNgBzG+s)qs!l-ge{INIq?pNT9mG7sTtAJ@)?v= z?!WVNG9$xY_tr4fKf3N~FEngJrR=(&hpt;Wg1`fu=d1oz$!Y9e^m0`T?L+$poL*G5 z)DE0&LifFuw3FXbK&C&FftM3#n}^P8XkPTP`dR1r4if9~L|3r82Ys@?ed!AT5@-sL z3U9#x000SaNLh0L01sgR01sgSs6VG^0003lNkl{Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^00045NklcE181S=Dd z$HXhJ_6fQmG4M>VR0zS0)TOHGBQ|IIV!OdfD#6f;6ra!MyYGHthhXXUhH;|5rsJ1fK7gZgd54#b{}EIfJ>l8UT*!gAkrGIgLw7 z#?$aUeKDyu9%YZJ{nGj)6y+>P7dz}XJ7DwXAd!6-k+&nuD6+=Mew;U6p6HP11ioWi z$t0on-3aG+r3W|v&3*y5?1RS6KJ`7=58}?TcW^VrX0B7hjPq+ezQ4NNu^`*ID@rUL zs}APaCZQ7zBF!2&tISMYw6q}=sVjvKSQ%ma-t3w&bBE!oSr)qb^7j;F*^DVd043f g{PdUgZ~n5r0c@7kGEF)dd;kCd07*qoM6N<$f)S)}ng9R* literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_front_120px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_front_120px.png new file mode 100644 index 0000000000000000000000000000000000000000..a6b33121834372c5fdea3ac9165704491133eb1d GIT binary patch literal 817 zcmV-11J3-3P){Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^0004KNklOZ;ZJfk;j?cjeGvS=0_J>`B`s8*6%*OTKynlzkP@Lko-78KOqby4C!G6 zw!LrRXA0rg^8y{Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^0004VNklGFFm-Z$1)61+lDw>$ z9a;G4hG?~njWAJf5#u*vR{7wc;`;lTxV<-5Ll{GrgDlP$^mBGmPL@r;(~Gfd7_{Lg z@$)(#7pGyr(6Szv=ZJps`lBb!Nx!<<(r&XQ+PsPIY_1HYi!vGP@2v&fq=D}C6ZU>D zm7{JzB zFyBiCOtjV27eD~9YcKByU` zl|IP4$6EPBYZ#Yfs?Vr?V?^zhKAn2^AjmrZCCyU#m$V1aG1Wem`t5H30000000LF1^@s6kJd(e0004RX+uL$X=7sm z04R}lkvmHRK@^2Q6D8t<6k4b#1W~b25CyT+Sl9#!F@mpVcikjHHd%HPB-jcz7J`Ln z{Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^0004(Nkl)$B2A&C)6GAW}-GWZ=K_k*SwiD8l1BUvB_T0~oe?F%vQzxer)k$9vz7&Sw=pqiOFBwA`myXHioaB?N%hpajm%3a&CU2-Xb>5|VA=e|D zPpMwym1n@}GZ4N%A7%ez1a_ot(N9C$G4aEhED!7IF=CC3?W9^` qVxE=U=u{V1f|T=D@GO7y75o7j71uoyZ?if80000{Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^0002yNklw{sZWl5Ij0VSvF(OnigwEp8*zBq0c2^| zq%n)e)f=}zT5knfacpX-KrdDik=Tk+6YD($BTb^H4Pv@Hn7_Qp#EZ#FsEQJxc!1&p z#oDbG*jOU>dU70|MdHCH1N$&v!})o4=XrtO)QSwZN4{I)4;ccDfQ-?1jG}wAIj#ol z6|gopL#CcR^Hh=CA5&dFZ!e=ggYwsEF-I|MSalE9Vh(j@CWm-I%;4cv3!L~X{sV!> V&F=C?GARH6002ovPDHLkV1h!pEWQ8$ literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_front_50px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_front_50px.png new file mode 100644 index 0000000000000000000000000000000000000000..afb18fd6e0f0710b2b06f02b2ae786c2c040d371 GIT binary patch literal 702 zcmV;v0zv(WP)0004RX+uL$X=7sm z04R}lkvmHRK@^2Q6D8t<6k4b#1W~b25CyT+Sl9#!F@mpVcikjHHd%HPB-jcz7J`Ln z{Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^0002>Nkl0xy=)s2v5W}^oA938?v|8M~ znAA(lYiP>D{fAO85=ZzME~ k?)Nw5#%=dj$e;YRUOj2n8~a^BzyJUM07*qoM6N<$f|BMvp#T5? literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_front_60px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_front_60px.png new file mode 100644 index 0000000000000000000000000000000000000000..62e70d753887706c5ef0a968c02d21d923c078b3 GIT binary patch literal 721 zcmV;?0xtcDP){Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^00039Nkl00w=N zaPmXngte`aGyh)SrbfHvTD%ArvC7hMihMMw7Om)&ALM3EJQy`|5c9Z}TiusV*Fto! z*!Cd9>yZJEGZIytD6;mX8YV!5B^IL~c6p$N6LEFMVWqs}LM-V0MV?9+hEr@WN14qF ze)dJQw%o3UWjMB5X4x>SST4v8?66##n*m_+EDg;q2@l5S>=&dlITs5Kg~KnL4WB;6 zZV9%Z&l|tL-wK)W8%Fspu#daKy6)p7tu|KhpZ%rZY(m-}8OL$h00000NkvXXu0mjf D*||QQ literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_front_70px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/cyan_front_70px.png new file mode 100644 index 0000000000000000000000000000000000000000..6377980d44a1f7334234b203100628e9ae82d6f2 GIT binary patch literal 750 zcmV6wSfmLOVg#c$$(o0d$FiFs!B()b2v~?V zz6$?=wt}sKASi-}jeo#bBVoN`gak=unY|xp=3HjZfIXPevSy19vblm04)|S5(PfwO zl{SVMpaW-2Gxga}C`i-sb&pNeJFn{1d|$)SwU#h7u(b@nnk!q-ZVSNTP8s>&aVjYxP7?5d|LRmbr<*3w2+cwE?>%@no2^QfD2CvuAm zQio)YU=k*P9~W_otdpUDS87f&YwYv=`sT@tN0Yx!2}2wy(&F`qT9mE{sY%fj@?|Kg z-2dlkCMPGV-MjtJ`fOS6qu|_yO4+i$k1eZm0*)uR%+>sP$!Ypi^m0veA42aIoL|+n z_#Rwr!{DPHGh)AzL#92Mgts&3i9+8kbgoph`djDp0V137L^rU10AsShcl8IO3TNMn zpLsL@000SaNLh0L01sgR01sgSs6VG^0003cNkla3vR*b0!{wWz8l$H8sGn+b(^+ZE1#+=apCf>ZKjr{fcVSVI%_cdBR zJ{Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^0003tNklE z4rhfMMbaoyDwo4KXB=^(4-av(Ve?)XWQPeYaNZ+5FwXlXJz~zlV{!*}{&n3h x+HiE;7dOZuyBF@2v+nx`#f#$c6~6i_d;&ow)hma1QZN7j002ovPDHLkV1gZYTGRjl literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_100px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_100px.png new file mode 100644 index 0000000000000000000000000000000000000000..6ab3df10a97898e5df8905204a4fd6fed20d376f GIT binary patch literal 714 zcmV;*0yX`KP){Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^00032Nklo@_fw|78Cg(n+jAOoKea|iH1u-}%^rDFf=>Px#07*qoM6N<$f^xV(s{jB1 literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_120px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_120px.png new file mode 100644 index 0000000000000000000000000000000000000000..8805aec8c89729431d41fb38966b7cf9e0e53943 GIT binary patch literal 733 zcmV<30wVp1P){Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^0003LNkl8za zXtRhF5h+EHHb@gQb?B~x=Hc=FLQOhHy+`LuME6zp9&#eU zWl712(ed%*Z-f3If-#`(D|+dK(yS%4hH7O!b!IJ4)Wh^euT`yu?@vVH`hGKQGcqQx zzHsqFO{0!O{Wp&x`3=YR54Mr5;+_~R*>}9gsKXC>N_0r2zRsuU>7Jrr(Q_&EJRi{B P00000NkvXXu0mjfoc&G$ literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_140px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_140px.png new file mode 100644 index 0000000000000000000000000000000000000000..a8baa907670c8b049ae7caee9e8e8519da864d29 GIT binary patch literal 756 zcmV{Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^0003iNklmvZ3nclbV+mEYjzYJ~zG*6P>p)WTjuhrlm@jmV@ z*SGhzFk87SIVH57r$$36iP@MDvtV@&_&Emh%~~*?04E2+wQ71p`u$R?uh!^VnX^5e z6S^()dTFx8xu_ro2|C;#`quV}z+TviH_s7>x8dN;<-~Y8gohXGTJ9J=m|veGe157A z41D*-lKK9#giI0&fy-yhbDi5bC~#O5IAjjr)Oo+u5z5i}Z0|6>1SiqxSWH|m3_DGI m{7t|6neuBGzmlSHzmlHTPb~B#fxe&s0000000LF1^@s6kJd(e0004RX+uL$X=7sm z04R}lkvmHRK@^2Q6D8t<6k4b#1W~b25CyT+Sl9#!F@mpVcikjHHd%HPB-jcz7J`Ln z{Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^0003vNkl-G3~hh~y5t6)!f{3q z=}|m^8_(d{mCkqpS;$lbYCmadihMThLgH(Z_d-$yVD;MPDQ9uTHS@ZZ6@VDNZCU*` zp!tCIDlm|{irLwq`PeWuuiO=wp0}T?!_B-l%;1txPYpya)yGzY$>+?i2z1ur?1vrG zHFW(DD9g@$Ud0y5TEW!gi}vzkw*ZO_*5#_6KArJy&R|1FHTpv!8Tpv!qE zK28kG%0F!_b7_Eu`Q7*_SAKcpTX0-Uy#;>&K0Yz?r6?~I00000NkvXXu0mjfKoVZl literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_40px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_40px.png new file mode 100644 index 0000000000000000000000000000000000000000..82ad5b694b84a9d6ca7f73520a97e8ae51d01e57 GIT binary patch literal 679 zcmV;Y0$BZtP){Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^0002qNklGlQg98ttBft*XO&YDagmJt{lxU&TR*nxlP+ikpY5Fmdvs3 zC+hwI4>P#L3B0L#iibGd?y`!(y_#$M`0cVH$RH9i+Y33tB9>#R1%Xjbds7@{p{RAa zGCkIfm|WO#uKb9W9G#x8FpSg?1v0BNYeJvL9_x3-ekyWkLL=U|MgHBL5}f7`{YN17 zu&%xC`$UXX1j$PxGn1~Rn#I>0L}CU-j1eyN{^Hw7;*Zv`jykjci{JfVE9In33B3RS N002ovPDHLkV1mu^GZ+8> literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_50px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_50px.png new file mode 100644 index 0000000000000000000000000000000000000000..9fc51542a2d746c49d84602beba4a495b1a04ce5 GIT binary patch literal 695 zcmV;o0!aOdP)0004RX+uL$X=7sm z04R}lkvmHRK@^2Q6D8t<6k4b#1W~b25CyT+Sl9#!F@mpVcikjHHd%HPB-jcz7J`Ln z{Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^0002)NkllJopCBo^-|!$U&?vZJ;fM(W8b#HpzCI6bfN%TNN5VY^SCrWr%gtc1e;@G~Paf z>9Bz&w%GF!V996JDFj&ZeytL1ixFVIUv8aXYy0cX^=${)`5|f}wOJItA!IyzjIfsD zM>)>a;+*KB&vT*|;CxZIuj+1?QeMx}lpAOqA5V9J@B;QNc;9aTM!9Le@N||NYJ9F4 z>xz}RZ!Wwr9K{@QUO{6n9-7cm0|Pf5mkZg`DeMsEV&MP)002ovPDHLkV1gP~ISc>* literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_60px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_60px.png new file mode 100644 index 0000000000000000000000000000000000000000..981f42e08b1f449297e65fa9b6940c51806de555 GIT binary patch literal 670 zcmV;P0%84$P){Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^0002hNklhqcJ+;Q_7zmRHJ22!^g8!c$r?bFqRU6Tz z``k-SNhlod4?hURFh1hK`d~O-6XH~Mjj(gxao#Myv1RJse_QU33GPNB!U7QGl#L?F z5t~Jc2a(w8O7k5CE6A}P(}dh#a%fUNXPe5u&{_SZpV!MN?>@1Q$p8QV07*qoM6N<$ Ef)#NsT>t<8 literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_70px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_70px.png new file mode 100644 index 0000000000000000000000000000000000000000..e323ad98d4be90288a91785e31cb1c5bbb0cba6c GIT binary patch literal 705 zcmV;y0zUnTP)6wSfmLOVg#c$$(o0d$FiFs!B()b2v~?V zz6$?=wt}sKASi-}jeo#bBVoN`gak=unY|xp=3HjZfIXPevSy19vblm04)|S5(PfwO zl{SVMpaW-2Gxga}C`i-sb&pNeJFn{1d|$)SwU#h7u(b@nnk!q-ZVSNTP8s>&aVjYxP7?5d|LRmbr<*3w2+cwE?>%@no2^QfD2CvuAm zQio)YU=k*P9~W_otdpUDS87f&YwYv=`sT@tN0Yx!2}2wy(&F`qT9mE{sY%fj@?|Kg z-2dlkCMPGV-MjtJ`fOS6qu|_yO4+i$k1eZm0*)uR%+>sP$!Ypi^m0veA42aIoL|+n z_#Rwr!{DPHGh)AzL#92Mgts&3i9+8kbgoph`djDp0V137L^rU10AsShcl8IO3TNMn zpLsL@000SaNLh0L01sgR01sgSs6VG^0002^Nkl1p2C>u zAw7yGaN`+VyVAr9*o6&(@9T0)t5^OzY55TvZ@Qs6IE4sAzdin44w&qySj zdRPxTR(2Zp8mrzSW{=>Kn0`7JLz0hk<*^8Ia=G=m?fKGwtHNw_Q5qCj%}VH)Sm3Za zM`Cp3=?KBM;h4au%kdLFCC5{N>!NuUr!s%YT$)=5>~D8FF@cdMTiOnW@yEWu!wb1I zA&#=V<8zPMLw|RoRIxoKSg*h?Eu({%jGx?ifVpw^B0g=SjIX~~yti8^cE%(fCh6!6 npKs{sW1d~jIR3ZN@K$;Nl|m@^%LTK)00000NkvXXu0mjfsP9Fd literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_80px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_back_80px.png new file mode 100644 index 0000000000000000000000000000000000000000..132068a3572a825460744251f6c99571a86cfbd0 GIT binary patch literal 709 zcmV;$0y_PPP){Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^0002|Nkl0Y(vFffQ4R3h#z3ET@LAGsO3Ygo+?bLRNws`Bd8wgYn zqQ2vRBG{Gn4IX+Q7lY9)nzut7L3b-@HYoLJ5q6`WNgP9c##~nt- zoOivPb~ui-Hu{TBXizysy5n=g@$;pC`>N@SSlMDNCEbF6FPe3quYbXeFNF+FhQy&9~MTNv-1zt@#$7eha?{Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^0003uNkl^4C%*%Z*Y-CxYb3~MVIIC4z*jv6 zktMRBxQ~SR%^+{&;>o?z_WlSL!e6eNR<=NZH59Ifz#0di5HU3;SbrkXzI(8 zxisD@X7SAx-JdT{TdxhQevMzVU&AI8qJvmjesqy2LM$#f!Uy4bCzoS0`p7x%u#P@H zbtG2K=ITR2fTVYj)d$zu{y+REs_e+p(cv7}iZe5HWdrhalXx=+KCM>noTG1^*^B1* yo=N$Jc4K2obW(BdgEV?2p{Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^00046Nkl0?A4E~N%!Pd?Ul&KPr z#@;vR15{lqhK{^JpQIBKV(5Yx`!hiYr+1ecER*;Wgg`<>f;e}!zc2oXNr7q%;cyw} zH>M~G7I*XveBEx}Ip;sM{r|O@*@o~5%sX*nw&D(*=hX2B$-}meS6cB{y!g2m_;KPF zgD!C05h7~?8J!gea6*8<_*D<`!-> z?t8%d%-d}~tskYZebvIF#nAk`Lv7dv{%2BRAWu~)zJbHt22H#Y@l1Z1`?q3pbf`rw#r++#z000LF1^@s6kJd(e0004RX+uL$X=7sm z04R}lkvmHRK@^2Q6D8t<6k4b#1W~b25CyT+Sl9#!F@mpVcikjHHd%HPB-jcz7J`Ln z{Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^0004jNkl7b?nDkMIQ zofUm>#-$mA++SjaMCq-j0UrH}pIF_Gb>;5Ei#?U-n z`{;E>3&-d$WzJA9g`FJ%PcPN`tXAn;F1%xPL~9b*j>8D^V;pJB311A>v000LF1^@s6kJd(e0004RX+uL$X=7sm z04R}lkvmHRK@^2Q6D8t<6k4b#1W~b25CyT+Sl9#!F@mpVcikjHHd%HPB-jcz7J`Ln z{Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^0004kNkl7b?nDkMHF zJ%7LlAR0tL$sh0~R7i+|CZgm~B^0;#k&Di&+4G%=U3rW6a^9WYogJO+0+n4tFxg~d z+Y5@qi*IoYd>yy%i?pw;z0J?|RezLSnUFPL7z5fD^8Tren3=5S(Z~J)czWhMc3t zUu92k&GqL7nAIv=17}BoTLJ48Z$t>OdH}iriR_1@XpGoiY8_fM);{YIBxi1qo&6-% zveP~-9HYKIeRkDS*~JO){MxK%UZwA)@J`huT9d#|8%9{@<49pn_%LDw#`3TjXAx+` zIE(ZIjQ_+qOL)Qu?_y%@$m?UARnulR%s+MB5@1-O|NbZsz5U=3TxGa=06z6mE@ZgE zk6`P*MBaB&)=4>Y>g$<5C+8?VXYw<2_U(Us!+z4rq2U%_7Hd(+3+WaE7W{{h2T Vz&7hlH{}2T002ovPDHLkV1fgdhj{=1 literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_front_40px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_front_40px.png new file mode 100644 index 0000000000000000000000000000000000000000..f60fc0d35f6e8420c91320d78febaad552c65574 GIT binary patch literal 683 zcmV;c0#yBpP){Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^0002uNkln?RtBc0dqVanmJm z>uH{I>B6AzA}21({g`VlT4_`Q=UbhOIzX#!M9PNLIQOtD$1C)c?M@mW3m{Y~V_?{o z1y3NBo|p#01X<2J{u2wQCWkMY0004RX+uL$X=7sm z04R}lkvmHRK@^2Q6D8t<6k4b#1W~b25CyT+Sl9#!F@mpVcikjHHd%HPB-jcz7J`Ln z{Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^00034NklL})Q~AQTH8f_&VTDK5r;6zermNTWVEnGw+>Wm77JR)uwI|AWPJVwdp=pfzr~U+ zRtB$SxwZN-1|n0<4d^t~ge!2n+6@wyv|#wD-KK;~^S`ch1#q91UJF=lERN`icB+83 z!(jl^3Tag;u2a;lSdF{GzSaRha`-$yk2Bcgw44v>5JGmfbQ^|q;3!|ORU$GldqW)O y*$KZ+dA7%8{Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^0002}Nkl|dCLSonW&h~ra-Pam=B$Z?076a&M>TM&P-z+&?O(4%rl$^AbPjjZ`El>PTV4nCCq z7s)}t{*$lwFNJo4z{lsnNM%M!(jeKAISdT%|081eA5vcUhXrF3XJEju2Se^3VS7k* s12%DxXMfFrc^Fno|AR&;)9@~(0XkOIEMPw#k^lez07*qoM6N<$f-W068~^|S literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_front_70px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/default_front_70px.png new file mode 100644 index 0000000000000000000000000000000000000000..cc9991e260a75ca2ebf5d8d682a3244536a5c37f GIT binary patch literal 755 zcmV6wSfmLOVg#c$$(o0d$FiFs!B()b2v~?V zz6$?=wt}sKASi-}jeo#bBVoN`gak=unY|xp=3HjZfIXPevSy19vblm04)|S5(PfwO zl{SVMpaW-2Gxga}C`i-sb&pNeJFn{1d|$)SwU#h7u(b@nnk!q-ZVSNTP8s>&aVjYxP7?5d|LRmbr<*3w2+cwE?>%@no2^QfD2CvuAm zQio)YU=k*P9~W_otdpUDS87f&YwYv=`sT@tN0Yx!2}2wy(&F`qT9mE{sY%fj@?|Kg z-2dlkCMPGV-MjtJ`fOS6qu|_yO4+i$k1eZm0*)uR%+>sP$!Ypi^m0veA42aIoL|+n z_#Rwr!{DPHGh)AzL#92Mgts&3i9+8kbgoph`djDp0V137L^rU10AsShcl8IO3TNMn zpLsL@000SaNLh0L01sgR01sgSs6VG^0003hNkl9-yBvmAof(B8BP#s9On>&0f)~of2kTS7!^4Ytd8IRU>hN?Y*@!ziP z9a$!(OqamnG0ZbNUuyo2JgR%kMJ7+;)VEh1ddspLF3#-SZ z!OfTyAt4q(ci{bmuZdstHSxcGgnb_uKf)wyPky(7q&%HBFkb5aV=(dlVSt&zFP ll=F)iBd-!U{Pr&~Kmzk+SkioR3T`VJwu3FlW; zP2YoyE$Dc(HAgE+ewn^R0^ZJ`brITbp=r6CRb`#i2Z(RT6Wzf60Sw6g;K~p1#ApM; zJf-CT000SaNLh0L01sgR01sgSs6VG^0003xNkl0?A4F0Zw%0_2~(y3A( zjh#2(0Z60A$7yjDe>QD$7d%M96i9|LfvVD zs^a2JAAzqMFSj;)4HNU$#vioo3>zeT*arWETWSN%2ih+E+7xj9?3ueEFt`q&_ywcj zNDKxQNZPjOw2WGGkxc<66~ya;`RB~sP&K{0`SoW3^qVT~fyt;g-U0hva8$v_#xfG% z(LN;EZJXl7KIfaoQn;;o zbimc)Na}7YIV0!dig#FX0r?fC(0Nyv$F<8Vd;|#hIW~XZaL)h$002ovPDHLkV1iOs BVjBPe literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/front_30px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/front_30px.png deleted file mode 100644 index 54da07dc63ba699580c0886db5f74f202803dc15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 371 zcmV-(0gV2MP)e>2n5Bjegr_%SXu*@rQ4 z^gdL~Hw%K{9&9-V@!Ue7p>s|{Fo=!JN5)f6K=gp<&f^evPQ%!PYKo}Ql3VoC;)0vs&y14 RQx^aL002ovPDHLkV1mD$mqh>o diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/front_90px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/front_90px.png deleted file mode 100644 index b7cc3e38b7080584279e64d2f560ee1e07fc4cb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 444 zcmV;t0YmI4KwA4J8;2O;v5;Djv*9J3h}hi+i_AG8J&`>$g7 z@3j;^c16NA3mN{K%*DjIGZ_9WPsNX=CsQ9I0vkv)pM~H~AfA1h;s1);MK6X@IM<51|`7gz1T6|EC@yf^f8A2%Pu4E zLZBn&oJL>}ABK^|apB3p9MO3UVlIdcLB%?oDZ?N$So_cd8kVBb1D4ppMGs{3z{D1a$bpNl7Fz%k6Ts+!iyolJ z7$%P`kjV{b<<$)TWq?=|Smd!ygkX3;GpM6_669cz1B`ZJ$9g-+k7f0Z5XT^6xg`*+ zundAhY^j-~VUZcwF{qproeIH(%2Sv+bTeQ@00?tUfnZQdg#{!GgT#28Suw*y6H9zgJ~6<#B?mYu(%X% zc_ly(A;uX@>8?FFI~%9r_`1iZ>fMm))p%ds(Y~5?b?~(ckLk8k5S|c@uNQ2^+rnLX zHnl2zBph|*fWp^G*DCy?I8)&d#ZEFY1%A~toT*{0hV`st3J(ZJ%v@3bJCC|aFm27x zN$ru@i%WuOVuaBsvPO;qLsBittiEsf*Ed66Ji7dCN;u-kkQHxK)S`4vOEpAK%a^01 za{r&FYmAOmx(8#>{Ooz}ebBNC{jGEQ0Lcw`q8r#hfPUE@TKNGyplBwN zinXQy000SaNLh0L01sgR01sgSs6VG^00042NklZn?u|O z$~i)zM(N9P`&cz7cZ6J?Hp;7ub6n3R2|oYi07!tOU4N#6J-y-DhsPt)Npuiw{7eU` zwS%o=e_Om`v#ug3BeqY+XZTouQShBh@y zjxt6n)T&{%eOO*Uzv9{wQY|Y8@`R%Yx{TA8*I6 dtpD?s^#feBD)RW3PLTir002ovPDHLkV1i{YZt4I4 literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_back_120px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_back_120px.png new file mode 100644 index 0000000000000000000000000000000000000000..ff1aaf12f8693c4251381cc39cf56df56cdff466 GIT binary patch literal 823 zcmV-71IYY|P)28Suw*y6H9zgJ~6<#B?mYu(%X% zc_ly(A;uX@>8?FFI~%9r_`1iZ>fMm))p%ds(Y~5?b?~(ckLk8k5S|c@uNQ2^+rnLX zHnl2zBph|*fWp^G*DCy?I8)&d#ZEFY1%A~toT*{0hV`st3J(ZJ%v@3bJCC|aFm27x zN$ru@i%WuOVuaBsvPO;qLsBittiEsf*Ed66Ji7dCN;u-kkQHxK)S`4vOEpAK%a^01 za{r&FYmAOmx(8#>{Ooz}ebBNC{jGEQ0Lcw`q8r#hfPUE@TKNGyplBwN zinXQy000SaNLh0L01sgR01sgSs6VG^0004QNklwo4AgXxQNp= zC#{RdA&J4bJ`Bgn^?l>xT!GJzyz=7ggf5qhQ5SHK@V{3;_^?65LB*Pc&&a0lL;*|D z4NYUpJ>n<1XX03di8F~}m228Suw*y6H9zgJ~6<#B?mYu(%X% zc_ly(A;uX@>8?FFI~%9r_`1iZ>fMm))p%ds(Y~5?b?~(ckLk8k5S|c@uNQ2^+rnLX zHnl2zBph|*fWp^G*DCy?I8)&d#ZEFY1%A~toT*{0hV`st3J(ZJ%v@3bJCC|aFm27x zN$ru@i%WuOVuaBsvPO;qLsBittiEsf*Ed66Ji7dCN;u-kkQHxK)S`4vOEpAK%a^01 za{r&FYmAOmx(8#>{Ooz}ebBNC{jGEQ0Lcw`q8r#hfPUE@TKNGyplBwN zinXQy000SaNLh0L01sgR01sgSs6VG^0004pNkl~7B4Lz;N~7~8W>1NmFGOVl#0X(iVEOAT~n zS)BBoL3=@ak5LZXNkq`5M zBtF{*NG_7d1=)2~H7crUe_^@2uRmnJts2tIy8Vm!nS5@4^$sOYQNAo87}G?%UU{`8^V*+Egxk(T*!| z6BvSo50dEl$sv=Fu;VB@kUi3vl3cv_(Q9IC&N;bc>6vz*Q?Mb->$k{!CWJ7xZjxKH zTE8dFDO3Aop;HOYf1nV5(Udb!7Yg+?5rT000LF1^@s6kJd(e0004RX+uL$X=7sm z04R}lkvmHRK@^3*B#NSu6k3Q_q==#rK@`MNV__3SVgz4JcFiV2cC+jzNU#-bECdVD z##iA#&{nWj5ClaKvGEW1Y9y?8jF2G7EVK9H%$&>28Suw*y6H9zgJ~6<#B?mYu(%X% zc_ly(A;uX@>8?FFI~%9r_`1iZ>fMm))p%ds(Y~5?b?~(ckLk8k5S|c@uNQ2^+rnLX zHnl2zBph|*fWp^G*DCy?I8)&d#ZEFY1%A~toT*{0hV`st3J(ZJ%v@3bJCC|aFm27x zN$ru@i%WuOVuaBsvPO;qLsBittiEsf*Ed66Ji7dCN;u-kkQHxK)S`4vOEpAK%a^01 za{r&FYmAOmx(8#>{Ooz}ebBNC{jGEQ0Lcw`q8r#hfPUE@TKNGyplBwN zinXQy000SaNLh0L01sgR01sgSs6VG^0004=NklOJG4-B$@oI7|`ZL0kn^=AKlvn zuz72;l@rpxM!|9LWqUwoG98$4o!S5r*bARX?ym!CGzd%f%4eRE&!-LKU?9-0EtFhw zv?~F-f{EakhzLdY?g04kPBfoM$PW9Q?Z7?ooPK8$E6bVKw7Bu+sx2_JnGsRNcqL}B x=Wj2<-_75~_&KI+$(o0-8<*V#3ATcbMZiL| z@m2T_v=wX>1VIr*Z2SYh8VTziS4a?@W%hoYnRA&r1OBL?n@-&jnE8SokA$_k`30@v znE*kW7^fqtJJw_@7UkdZaf?sYn?cp<|9yXsmgTgggRfC|RJZJc@Pu%5tzaqM67JG- z$z|aK;Q?C?D152(l*dnsvmU=GwiEFw@T;C$wuVzRtmkY~xL-JA8b$r*JnAN`>HO@B z)S%2B9O6U>qmiP>3I+uRrRF8GzkNgBzG+s)qs!l-ge{INIq?pNT9mG7sTtAJ@)?v= z?!WVNG9$xY_tr4fKf3N~FEngJrR=(&hpt;Wg1`fu=d1oz$!Y9e^m0`T?L+$poL*G5 z)DE0&LifFuw3FXbK&C&FftM3#n}^P8XkPTP`dR1r4if9~L|3r82Ys@?ed!AT5@-sL z3U9#x000SaNLh0L01sgR01sgSs6VG^0002;Nklrt2q|XL))GTL`NYjUzDT+@Br* zXzjZuH^{S8lMJ0|lV}9@>;t=F!i|9)s!r%(yEzFpC2rJEvq#pL`4v`ndAzk}g6T8m zD<&&F*(+<3MXu3tZ-dGcRo6_lekSLX6njb21kW#kD1;ipLJV;yE!q|6Qs$>(eq5@j hY;(xXr`Gqs_zU1gD)J+6=HLJT002ovPDHLkV1f|BJ*xl! literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_back_50px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_back_50px.png new file mode 100644 index 0000000000000000000000000000000000000000..09521dc84b6d2d43d835f6ae3a03dbb86c524179 GIT binary patch literal 731 zcmV<10wn#3P)0004RX+uL$X=7sm z04R}lkvmHRK@^3*B#NSu6k3Q_q==#rK@`MNV__3SVgz4JcFiV2cC+jzNU#-bECdVD z##iA#&{nWj5ClaKvGEW1Y9y?8jF2G7EVK9H%$&>28Suw*y6H9zgJ~6<#B?mYu(%X% zc_ly(A;uX@>8?FFI~%9r_`1iZ>fMm))p%ds(Y~5?b?~(ckLk8k5S|c@uNQ2^+rnLX zHnl2zBph|*fWp^G*DCy?I8)&d#ZEFY1%A~toT*{0hV`st3J(ZJ%v@3bJCC|aFm27x zN$ru@i%WuOVuaBsvPO;qLsBittiEsf*Ed66Ji7dCN;u-kkQHxK)S`4vOEpAK%a^01 za{r&FYmAOmx(8#>{Ooz}ebBNC{jGEQ0Lcw`q8r#hfPUE@TKNGyplBwN zinXQy000SaNLh0L01sgR01sgSs6VG^0003JNkleIBBDKE8kS>WOrxuK2VVP7P$uQ5r_YaZs;F#NM)ryS{FUOVdR5XQEl1 zl2FM*XpF%t=6yN59iRdgZVH*=l^mFI^<};nBzYamp5J=^{O;nf^#?2;EArCbj@28Suw*y6H9zgJ~6<#B?mYu(%X% zc_ly(A;uX@>8?FFI~%9r_`1iZ>fMm))p%ds(Y~5?b?~(ckLk8k5S|c@uNQ2^+rnLX zHnl2zBph|*fWp^G*DCy?I8)&d#ZEFY1%A~toT*{0hV`st3J(ZJ%v@3bJCC|aFm27x zN$ru@i%WuOVuaBsvPO;qLsBittiEsf*Ed66Ji7dCN;u-kkQHxK)S`4vOEpAK%a^01 za{r&FYmAOmx(8#>{Ooz}ebBNC{jGEQ0Lcw`q8r#hfPUE@TKNGyplBwN zinXQy000SaNLh0L01sgR01sgSs6VG^0003CNkl z{CfVuA+W^pA@?{u5ImjGK6bXrM{v34>s%Y(+I(HAQ3)RRG&mUzXqsnw!HD_F1sb0M zxEfn9a$-5Jor7a0o+P*BX~S4vetyT|M9+JvL?^Za!?aK5`-@iFqOKrBhdFM#6wSfmLOVg#c$$(o0d$FiFs!B()b2v~?V zz6$?=wt}sKASi-}jeo#bBVoN`gak=unY|xp=3HjZfIXPevSy19vblm04)|S5(PfwO zl{SVMpaW-2Gxga}C`i-sb&pNeJFn{1d|$)SwU#h7u(b@nnk!q-ZVSNTP8s>&aVjYxP7?5d|LRmbr<*3w2+cwE?>%@no2^QfD2CvuAm zQio)YU=k*P9~W_otdpUDS87f&YwYv=`sT@tN0Yx!2}2wy(&F`qT9mE{sY%fj@?|Kg z-2dlkCMPGV-MjtJ`fOS6qu|_yO4+i$k1eZm0*)uR%+>sP$!Ypi^m0veA42aIoL|+n z_#Rwr!{DPHGh)AzL#92Mgts&3i9+8kbgoph`djDp0V137L^rU10AsShcl8IO3TNMn zpLsL@000SaNLh0L01sgR01sgSs6VG^0003sNklDmjL%(>5;934<&iy3Nqnz!{w4LDN9{lE=C zq?%PV8?$ddpmsGruzkC_SpV#D^08^0enzHOzP7=lxY8VY-t0Np9L|>8%5tEInZ8(X z{yL(!**Fl?eu3=Jh%sN(HkOz{J>He`pFSbS_9DNRIVw8?1g7ol@J-iqWyt9{5+=g| z{hV*Kc|V8-DjL|aEqy^9NH8`myCFo15jBeWP6;UH1BDt%JQAO_{qbT}PfYb&iJww3 zBp-@N6_HE@#_P3sk*Kbo;$VpUQk@Fv96)zJZibl86Vb3I9X7F+Y-ewwesHsljDiaO wq?n?*GKYT{o2oWe%xZTHeWdP)28Suw*y6H9zgJ~6<#B?mYu(%X% zc_ly(A;uX@>8?FFI~%9r_`1iZ>fMm))p%ds(Y~5?b?~(ckLk8k5S|c@uNQ2^+rnLX zHnl2zBph|*fWp^G*DCy?I8)&d#ZEFY1%A~toT*{0hV`st3J(ZJ%v@3bJCC|aFm27x zN$ru@i%WuOVuaBsvPO;qLsBittiEsf*Ed66Ji7dCN;u-kkQHxK)S`4vOEpAK%a^01 za{r&FYmAOmx(8#>{Ooz}ebBNC{jGEQ0Lcw`q8r#hfPUE@TKNGyplBwN zinXQy000SaNLh0L01sgR01sgSs6VG^0003*NklqJGB=!!Kmn*zx0~aXVD?*GCL$!+PmumY96li*30U# zbM<=yuTGuv`tqD^mJ4U_e>RZ^DD+erCf5gyhCX1lV|{$YRA4mpV`3vYdgg$kW`19P z(0zt1P28Suw*y6H9zgJ~6<#B?mYu(%X% zc_ly(A;uX@>8?FFI~%9r_`1iZ>fMm))p%ds(Y~5?b?~(ckLk8k5S|c@uNQ2^+rnLX zHnl2zBph|*fWp^G*DCy?I8)&d#ZEFY1%A~toT*{0hV`st3J(ZJ%v@3bJCC|aFm27x zN$ru@i%WuOVuaBsvPO;qLsBittiEsf*Ed66Ji7dCN;u-kkQHxK)S`4vOEpAK%a^01 za{r&FYmAOmx(8#>{Ooz}ebBNC{jGEQ0Lcw`q8r#hfPUE@TKNGyplBwN zinXQy000SaNLh0L01sgR01sgSs6VG^0004LNkl41ES(jkQdO8J>UvF~CFygw#l1laSt>f9_IXfT5>W^*Q$E&u5<-rgmM<7_?h| zzV2VayeYP!$TmcQ7dCi?xe3zMn*6TyP$&957^P%%9>+NE^&_(EJsMea&+Vp z-xBw3UERF*zkNZL^HZYgfSTC_?Vp^>vIR%vb?NEqVrYAOAB$Wpi3dmL;{76q#~DAt zQ@WSOyHJ$9jq-DHOjN&7(|&DIFhJbfcn9tI`WW4wQ~QyaF_s^fiyXY>aBwi>R&+aYjU%h3m0faTA`71~0ssI2007*qoM6N<$g3niiNdN!< literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_front_120px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_front_120px.png new file mode 100644 index 0000000000000000000000000000000000000000..546420b403f1cdb8b4344af22e99304ccb7e4684 GIT binary patch literal 831 zcmV-F1Hk-=P)28Suw*y6H9zgJ~6<#B?mYu(%X% zc_ly(A;uX@>8?FFI~%9r_`1iZ>fMm))p%ds(Y~5?b?~(ckLk8k5S|c@uNQ2^+rnLX zHnl2zBph|*fWp^G*DCy?I8)&d#ZEFY1%A~toT*{0hV`st3J(ZJ%v@3bJCC|aFm27x zN$ru@i%WuOVuaBsvPO;qLsBittiEsf*Ed66Ji7dCN;u-kkQHxK)S`4vOEpAK%a^01 za{r&FYmAOmx(8#>{Ooz}ebBNC{jGEQ0Lcw`q8r#hfPUE@TKNGyplBwN zinXQy000SaNLh0L01sgR01sgSs6VG^0004YNkl1Sr`OF&OL4|Xnq+Ou}R>zzk6^TEMTJ)8UMS8-6ZCT!m%z8mnpEJ zneA+7vUGq2C)T7j@@^M~NDs%0$DjIHCwO&#MO2(pHNU0F<&CHV?wp7mkrD{C7Mb(- zoP7QvzF|aNW39!=dwjk*~P#sssB;z=f2ZKI#qZQfwP(>aSr1-V} zF#JpLr}U@zhv?6buP;}@x5Mw7vtVw&!GFiJj!#rO{J4b?BnYPgT`zrnb{sl5nXl>M zK#DJ^qk~V{*tgo!%I_SOR)~V=*C6;rY#yFU3MoI{q7U~Ly#*BNr1``tALsx8002ov JPDHLkV1kFjg1Z0! literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_front_140px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_front_140px.png new file mode 100644 index 0000000000000000000000000000000000000000..28e3e7717731805a25899a214953ae60083ba784 GIT binary patch literal 868 zcmV-q1DpJbP)28Suw*y6H9zgJ~6<#B?mYu(%X% zc_ly(A;uX@>8?FFI~%9r_`1iZ>fMm))p%ds(Y~5?b?~(ckLk8k5S|c@uNQ2^+rnLX zHnl2zBph|*fWp^G*DCy?I8)&d#ZEFY1%A~toT*{0hV`st3J(ZJ%v@3bJCC|aFm27x zN$ru@i%WuOVuaBsvPO;qLsBittiEsf*Ed66Ji7dCN;u-kkQHxK)S`4vOEpAK%a^01 za{r&FYmAOmx(8#>{Ooz}ebBNC{jGEQ0Lcw`q8r#hfPUE@TKNGyplBwN zinXQy000SaNLh0L01sgR01sgSs6VG^0004-Nkl`+(D)` zwSo5d2Io4lEN{*P#i23)0v*-&dIa51-M76=8@&J#0Q{~VGi{W&Chm9|J}q@mxo>~ajiWCP@%`aqsaULZ~!bIsz$8#XIOgKi7 zb8zIZa9GkK`~QrcW8l}Zg!Qvyd3}25MYGope$7rq%6F;izYYv`!n}DG*$-j(IH@)M zeCTUDhGby4A&ijQm^je#*%2e=6=S%}T80?)b|S0K&sPRjkQ|0aKu%0IXv{ zcVS==f9&aKUBY})WME5=*KvMGJgB?*<33@yMIu*0wvajwt)0xra_u_TPW)V-*GIkS z_8n$(Eb;oOV+4c)IN$y(1ko3$=F<4_n8pXm9Y`TlF~ATL;|NkX81(}YT^>h$Kn}+d uzlXp$5mWe~MsM%St%Rnpq^ae8C4B>Cbfx)%@rCaI0000000LF1^@s6kJd(e0004RX+uL$X=7sm z04R}lkvmHRK@^3*B#NSu6k3Q_q==#rK@`MNV__3SVgz4JcFiV2cC+jzNU#-bECdVD z##iA#&{nWj5ClaKvGEW1Y9y?8jF2G7EVK9H%$&>28Suw*y6H9zgJ~6<#B?mYu(%X% zc_ly(A;uX@>8?FFI~%9r_`1iZ>fMm))p%ds(Y~5?b?~(ckLk8k5S|c@uNQ2^+rnLX zHnl2zBph|*fWp^G*DCy?I8)&d#ZEFY1%A~toT*{0hV`st3J(ZJ%v@3bJCC|aFm27x zN$ru@i%WuOVuaBsvPO;qLsBittiEsf*Ed66Ji7dCN;u-kkQHxK)S`4vOEpAK%a^01 za{r&FYmAOmx(8#>{Ooz}ebBNC{jGEQ0Lcw`q8r#hfPUE@TKNGyplBwN zinXQy000SaNLh0L01sgR01sgSs6VG^00054Nkli8?sP0lDEP?J zfu-?^(H!;g!FU_R5#a-jH#*6fkE`4F=GheB;_}3-*t2SWZo9{4q*f74K&+M-B?mGd zSWF0?%$O#Mc#uzOULA}WgaeslyvTlwC;TL4CQq#_pYDAT?zGC!*^ycKW>x*;U_t)J z0GzV%dI;dqizIa$z01I6xi-p{;BXn(Lcf9Y7dEaNZzOM;qrSX3_&K)vxUAVqU2>#r+}jrw=U=7^$m7Pksf4u0c9~ z2LZu=#9_?1b?x@t@^^mtd3CTku>2ix-G+7T1+5Z-Xb2u5+7(2>!gz6@7n{zP#uhI_ zp1s~6WAicFfP2UqO7MeT-Z)+i$(o0-8<*V#3ATcbMZiL| z@m2T_v=wX>1VIr*Z2SYh8VTziS4a?@W%hoYnRA&r1OBL?n@-&jnE8SokA$_k`30@v znE*kW7^fqtJJw_@7UkdZaf?sYn?cp<|9yXsmgTgggRfC|RJZJc@Pu%5tzaqM67JG- z$z|aK;Q?C?D152(l*dnsvmU=GwiEFw@T;C$wuVzRtmkY~xL-JA8b$r*JnAN`>HO@B z)S%2B9O6U>qmiP>3I+uRrRF8GzkNgBzG+s)qs!l-ge{INIq?pNT9mG7sTtAJ@)?v= z?!WVNG9$xY_tr4fKf3N~FEngJrR=(&hpt;Wg1`fu=d1oz$!Y9e^m0`T?L+$poL*G5 z)DE0&LifFuw3FXbK&C&FftM3#n}^P8XkPTP`dR1r4if9~L|3r82Ys@?ed!AT5@-sL z3U9#x000SaNLh0L01sgR01sgSs6VG^0002_Nkl_OB z8-SB$B$+u5C>#eACVJ)H#o`OkMV+RLi}Oz4a?%Hq2J-F*wcao&e7x*K9?Jn9lj7AH zibFk53YTN~O)Ny0004RX+uL$X=7sm z04R}lkvmHRK@^3*B#NSu6k3Q_q==#rK@`MNV__3SVgz4JcFiV2cC+jzNU#-bECdVD z##iA#&{nWj5ClaKvGEW1Y9y?8jF2G7EVK9H%$&>28Suw*y6H9zgJ~6<#B?mYu(%X% zc_ly(A;uX@>8?FFI~%9r_`1iZ>fMm))p%ds(Y~5?b?~(ckLk8k5S|c@uNQ2^+rnLX zHnl2zBph|*fWp^G*DCy?I8)&d#ZEFY1%A~toT*{0hV`st3J(ZJ%v@3bJCC|aFm27x zN$ru@i%WuOVuaBsvPO;qLsBittiEsf*Ed66Ji7dCN;u-kkQHxK)S`4vOEpAK%a^01 za{r&FYmAOmx(8#>{Ooz}ebBNC{jGEQ0Lcw`q8r#hfPUE@TKNGyplBwN zinXQy000SaNLh0L01sgR01sgSs6VG^0003fNklS5dH>iC`u7Lw0O4Q zGx#pjgU{frd9A0?vp#_b>7hL}2N4=}n%(UDY#PW}7sBjJzWHWm_e%)vdYTjC53lW> ziDZcN%LBN&NiUdLZQ4gG@wAtC#vsR2NcJU%_l*N1d|h1(apbjnJ0_b3SwG(c)is*= zBPNR_G8&oLSs}^367m4Pj5Cj8aKUZO4`Ftn8y)6KCi|V<0rde*`*h%-gv7xW2t}dj zlltzR%OS}@KR;-b)XOPq!Ev}c?eXK|=QdI3Ak+FAO?5KisZ5~Kf?R(uZnDtC;v|_( zMsRqjyvA#kaf)KX*J-Bh+BXvA1-r$V5Lok5@nGDlU&C}w1-BP$;Lj4;~kIqnnN-@00000NkvXXu0mjfkgs2Q literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_front_60px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_front_60px.png new file mode 100644 index 0000000000000000000000000000000000000000..aa973b078b739b609055924c02d7332005b3e51c GIT binary patch literal 745 zcmV28Suw*y6H9zgJ~6<#B?mYu(%X% zc_ly(A;uX@>8?FFI~%9r_`1iZ>fMm))p%ds(Y~5?b?~(ckLk8k5S|c@uNQ2^+rnLX zHnl2zBph|*fWp^G*DCy?I8)&d#ZEFY1%A~toT*{0hV`st3J(ZJ%v@3bJCC|aFm27x zN$ru@i%WuOVuaBsvPO;qLsBittiEsf*Ed66Ji7dCN;u-kkQHxK)S`4vOEpAK%a^01 za{r&FYmAOmx(8#>{Ooz}ebBNC{jGEQ0Lcw`q8r#hfPUE@TKNGyplBwN zinXQy000SaNLh0L01sgR01sgSs6VG^0003XNkl92Bipkx^XARYeypJ7b*6|rkk2!f zGR^MaUch2vgCrB0XcW6oW1)M*ZlQuPzAo8|<#_`G%Z6IAr%9g$j1UZ6Js2c$q&i(ZKm=f`*i%UO+T0wxQw5H@&}cEU4qjp@YRs5 zc0L)agfES&2jVh({yYpW#iK=UCk}s4?btRvF27L~S8sD^7v4WUy?B5%$2r215f8kb zc365jd3>sFj8$4I8~?ga?a_93xH;CIn2A$}@;2;!>)~WvvmeJ0p8wR!*haSRC1fe? b>o0u+H9(;GU*+jc00000NkvXXu0mjfy>wFB literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_front_70px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/orange_front_70px.png new file mode 100644 index 0000000000000000000000000000000000000000..7a0e8538814e72df4a34d650921e0bf58d2db8cc GIT binary patch literal 764 zcmV6wSfmLOVg#c$$(o0d$FiFs!B()b2v~?V zz6$?=wt}sKASi-}jeo#bBVoN`gak=unY|xp=3HjZfIXPevSy19vblm04)|S5(PfwO zl{SVMpaW-2Gxga}C`i-sb&pNeJFn{1d|$)SwU#h7u(b@nnk!q-ZVSNTP8s>&aVjYxP7?5d|LRmbr<*3w2+cwE?>%@no2^QfD2CvuAm zQio)YU=k*P9~W_otdpUDS87f&YwYv=`sT@tN0Yx!2}2wy(&F`qT9mE{sY%fj@?|Kg z-2dlkCMPGV-MjtJ`fOS6qu|_yO4+i$k1eZm0*)uR%+>sP$!Ypi^m0veA42aIoL|+n z_#Rwr!{DPHGh)AzL#92Mgts&3i9+8kbgoph`djDp0V137L^rU10AsShcl8IO3TNMn zpLsL@000SaNLh0L01sgR01sgSs6VG^0003qNklNoH&h=Fh5*H~df%LyZHM#?OB``Tk?{Qf$WT2 z{{)FAh~j(SBN~@@MDpakqFW~%G_Ln+-)m5036Mk5cRJS`Y=sVbmM%GY(seDyn~XeW6ntNgkkiT#s^J%n}fdT?{% uw#CS+%kLwR+aGIfz01H-J-28Suw*y6H9zgJ~6<#B?mYu(%X% zc_ly(A;uX@>8?FFI~%9r_`1iZ>fMm))p%ds(Y~5?b?~(ckLk8k5S|c@uNQ2^+rnLX zHnl2zBph|*fWp^G*DCy?I8)&d#ZEFY1%A~toT*{0hV`st3J(ZJ%v@3bJCC|aFm27x zN$ru@i%WuOVuaBsvPO;qLsBittiEsf*Ed66Ji7dCN;u-kkQHxK)S`4vOEpAK%a^01 za{r&FYmAOmx(8#>{Ooz}ebBNC{jGEQ0Lcw`q8r#hfPUE@TKNGyplBwN zinXQy000SaNLh0L01sgR01sgSs6VG^0003^Nkl+~MpU)RUJ#JUTIF8BV z`ICtvdE198a4}Dt%p4bBIXB<-abywGt;L*nT^S=!oMsh=kY|zOpD`dy8?OKC(#mWc z?YQ53hdB_qy}Ja8GgPY^oL*c*uz>89eYr_^P;Ug^*E7ZI;iuRdm-7MmkJqO};z^9} zXSM{&FI4rb05PG?7^MU~9f&*I!(-6E_LfwS@* zRk4TYVO?C+y0S{Tb^9kLSGsqa{)km7to3DUrgl37JD49ew02kuqPP8dqAA~jO&dFL zv$%6u#mYuc#y5_Ud033K83|Q#K|CA&Sln02zJt*=hcTuWVXPm^mcZj*_e@h>d^1S0l3CF+xO=S!VCYnK_r4GvJR|dd_Vafn2`eB%+bvd}<-s z^h|($x)`8G(_MQi9*geQe#YXw{JmT;Gz z)s}@1gu{*;Q20{m=?Xt7&Q$nKv6D zR%)-zK3oz+i4Y`BkrgZo3`@;RX0?4IKfW1O#iPsLri3Go3|aApMJ-BKL#ipdA)iG_ z<^DfU*Bl$IbZ?75UW*vJ4mj}6J5dX9t_INmZ5yv) z;bCaR$|#Ku6eb8RyXLI^U1mqyIGf_Imh=w-WX6|uB{x7FVRCoNU{^keFALOdUGN<)X+m` zQ-s>WjIW+oA2|Fm@Wuyx!QpdbLGb&6+`0^Yqi2vwOvo1|?mWLCO`ji97LuWw7?dS& z$@Gn@T0$ztEcDaTsUZe*_9lbTd26tCV(U$U=L>U?l3m5Ep$I7o^ONO(i+~8~A~qlR zXk*;q#$ulWXAkVQ1n-d8>1=Hu(A?GzSOm_8t23xxA1pSB1NyQFIi0&X&VN~d^q2Jp XHmV}-te8hb00000NkvXXu0mjf-PTHM literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_back_120px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_back_120px.png new file mode 100644 index 0000000000000000000000000000000000000000..fe4e25ff9ff543675986a80140790ede0770c808 GIT binary patch literal 768 zcmV+b1ONPqP)e@h>d^1S0l3CF+xO=S!VCYnK_r4GvJR|dd_Vafn2`eB%+bvd}<-s z^h|($x)`8G(_MQi9*geQe#YXw{JmT;Gz z)s}@1gu{*;Q20{m=?Xt7&Q$nKv6D zR%)-zK3oz+i4Y`BkrgZo3`@;RX0?4IKfW1O#iPsLri3Go3|aApMJ-BKL#ipdA)iG_ z<^DfU*Bl$IbZ?75UW*vJ4mj}6J5dX9t_I6ldn5@~Pj8h!GrFys@1}XTO{I}Q$Q$0I zu@~Ms@ORQ+-ex(^Z*cTbyb-}kQh$bzE}##1S%gJTkz;D?bJpKg8yvdc!J|MAEU3}f y1Iyq;?$S&>&Sr4KjJ*iCTyHGb`W3z0ujn7}dLr&K!Qfy30000e@h>d^1S0l3CF+xO=S!VCYnK_r4GvJR|dd_Vafn2`eB%+bvd}<-s z^h|($x)`8G(_MQi9*geQe#YXw{JmT;Gz z)s}@1gu{*;Q20{m=?Xt7&Q$nKv6D zR%)-zK3oz+i4Y`BkrgZo3`@;RX0?4IKfW1O#iPsLri3Go3|aApMJ-BKL#ipdA)iG_ z<^DfU*Bl$IbZ?75UW*vJ4mj}6J5dX9t_I)s7MTE({ z_zeyGs2AkLgFdeuL;DW<;CmPPAfn;1M|A?O>iQe1>d}j4HHxDX4m_U#muo7RHXy8x zPL_yRpeG3^bC{eg*)e7=z31?->r~7*)wJNZV9w#sVlLpk1hbXb>uuQkNia=Af3wg4 z+8U<{$=bBCF{Px;J*IB9K@@8Ie>hU`YjION_aDak_Rb}Q?3$A13*XFH@LNyFcW{?* o_ihgY#?v{-yL=@rX8lU~1HG9d?#UPde*gdg07*qoM6N<$f&;^D>Hq)$ literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_back_160px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_back_160px.png new file mode 100644 index 0000000000000000000000000000000000000000..ec2afdf392a9860960dcbc80b69749b5ddf7bd65 GIT binary patch literal 824 zcmV-81IPS{P)000LF1^@s6kJd(e0004RX+uL$X=7sm z04R}lkvmHRK@^3*B#Pn#3oTRxQ$(?dAPQosu}Bjn#0W-hHtTL8Y~r$;Ai-9!u?Sd* zHogk~fwqFJf*>e@h>d^1S0l3CF+xO=S!VCYnK_r4GvJR|dd_Vafn2`eB%+bvd}<-s z^h|($x)`8G(_MQi9*geQe#YXw{JmT;Gz z)s}@1gu{*;Q20{m=?Xt7&Q$nKv6D zR%)-zK3oz+i4Y`BkrgZo3`@;RX0?4IKfW1O#iPsLri3Go3|aApMJ-BKL#ipdA)iG_ z<^DfU*Bl$IbZ?75UW*vJ4mj}6J5dX9t_ITK09h9#@ct-ZeeG`^bvSIfq^UJ=b-EFppcgjx_HE$JxQn{@wrfmQn5@x$+@I3 zxLC(a#Xgbn zg-GW!(ROF4_7Z8U6H%RDg#7WqNA_D}`XX)9XPn@5e3)oTILGiO#*>__8_K|AorqO6 zEUd?F-{{B-@N^3A=-dM36t;McOwuWl*0fVR^c6QI_bPFX!M$P)p)u<}U`g_e5pnVEas8!IS;hSMV=~@FMPn`!U7<0000v>!8j&P@u zO|A$Z3x^yzpzw{-^%B1-&Xo95u@jF?fnW91GF7Zsv5|F5;X&a(GgmOm=TSEarmXon zsogSraEUQZ1Pz@6tK`TNmTF06wS7Z>z8TiUW60lT14kSgvf>SiT9B?OscF$u^5xi2 zx&P18O^*zhx(6fB_~LmV{m`@r#a++)Iq|&WDFmM3%BuL+B&V@2(RV9a-x0KL!Nqk& z)A!+W8@itCq?7!U0y6#SG`ycfTLL=npk=9)Re7DWM~H9A6WzkWAq>d=_T^tkUuY{3 zFzs#t000SaNLh0L01sgR01sgSs6VG^0002wNkl0004RX+uL$X=7sm z04R}lkvmHRK@^3*B#Pn#3oTRxQ$(?dAPQosu}Bjn#0W-hHtTL8Y~r$;Ai-9!u?Sd* zHogk~fwqFJf*>e@h>d^1S0l3CF+xO=S!VCYnK_r4GvJR|dd_Vafn2`eB%+bvd}<-s z^h|($x)`8G(_MQi9*geQe#YXw{JmT;Gz z)s}@1gu{*;Q20{m=?Xt7&Q$nKv6D zR%)-zK3oz+i4Y`BkrgZo3`@;RX0?4IKfW1O#iPsLri3Go3|aApMJ-BKL#ipdA)iG_ z<^DfU*Bl$IbZ?75UW*vJ4mj}6J5dX9t_IAObA$5+5xE~PC^x9)QV1UQe@Y@+P*X?$YC+3j(!-ID*;Kws^}BOhy`!)9@lsl zkw1->&!KZYwz~&g7E-Q5a8nW$%Txr@7C_bw3xsED4g1!H+|>FWx7(Sj>dse@h>d^1S0l3CF+xO=S!VCYnK_r4GvJR|dd_Vafn2`eB%+bvd}<-s z^h|($x)`8G(_MQi9*geQe#YXw{JmT;Gz z)s}@1gu{*;Q20{m=?Xt7&Q$nKv6D zR%)-zK3oz+i4Y`BkrgZo3`@;RX0?4IKfW1O#iPsLri3Go3|aApMJ-BKL#ipdA)iG_ z<^DfU*Bl$IbZ?75UW*vJ4mj}6J5dX9t_I?8MY_w??lJdo)ejF+Cn`tw%)8 zbbBfO8atB=YGSC5^!$#hx}qo^+VsNSfHIDz0nVkl9kSJ_joB1$Oboe5N<`y0#&wc- z?w7to&PI7LueLW_*N)`af6wSfmLOVg#c$$(o0d$FiFs!B()b2v~?V zz6$?=wt}sKASi-}jeo#bBVoN`gak=unY|xp=3HjZfIXPevSy19vblm04)|S5(PfwO zl{SVMpaW-2Gxga}C`i-sb&pNeJFn{1d|$)SwU#h7u(b@nnk!q-ZVSNTP8s>&aVjYxP7?5d|LRmbr<*3w2+cwE?>%@no2^QfD2CvuAm zQio)YU=k*P9~W_otdpUDS87f&YwYv=`sT@tN0Yx!2}2wy(&F`qT9mE{sY%fj@?|Kg z-2dlkCMPGV-MjtJ`fOS6qu|_yO4+i$k1eZm0*)uR%+>sP$!Ypi^m0veA42aIoL|+n z_#Rwr!{DPHGh)AzL#92Mgts&3i9+8kbgoph`djDp0V137L^rU10AsShcl8IO3TNMn zpLsL@000SaNLh0L01sgR01sgSs6VG^0003CNkl9HN&2QR zGDXU`B6RXujoE_YK1Z-(oP)j)OmTRAgpy<_32ZmEx*fK#RyZD{a?ui!bmZgQ)FbZt+j;$Gr0noF)o20 z%I{e4ju{jLe@h>d^1S0l3CF+xO=S!VCYnK_r4GvJR|dd_Vafn2`eB%+bvd}<-s z^h|($x)`8G(_MQi9*geQe#YXw{JmT;Gz z)s}@1gu{*;Q20{m=?Xt7&Q$nKv6D zR%)-zK3oz+i4Y`BkrgZo3`@;RX0?4IKfW1O#iPsLri3Go3|aApMJ-BKL#ipdA)iG_ z<^DfU*Bl$IbZ?75UW*vJ4mj}6J5dX9t_Ie?541Kov3EMz|{q0@& z8$0aBa2cEsaM`6jOe#rJH%@9wD&SU2QDi%Letzx;!P)y88q7A?PG=B_c&lYh5QW9v zP8?%lQOxP(&$;`|MlQ$mbzESO)8{$xvG9`f9tV-9$*sfF=Z1JR>?gw$``Z2ot-OGn zbqIcLfaQmXNKq^nKgMKl8Q=; z*NV6hMV*kSYv6Y;YB%k);CGoo_jE!}DUYcq*ow&%X$&KYQR?HF*kzoN`_A@<@YU-D ztg7@CwuqqA#{@D4xiLW!zkrj}=}Hb)$!6J2kYFp=SO^xP zjjzIgpsir5AP9;eV&fn1)ks+H7$G9bEVK9H%$&>28Sq83M$T; zB$C31!eK`aD14=Ky~59m(-nSK?99iez^8g@=|8OhVI$+@ga?H~xopw+J&(Fcn`te~ zN$ru@i%X1YB53FoStUz>A*q&RR@*oHBYEinHQd6Rv@?|Nh z-2dn4rbb69-PNB z`YxPrLidB6a1uX~U#2gWg4a_B#-ZZ|T9zwW{jPIz5A*BtMAxvl4+FBledQaaD`()g zhiKsd000SaNLh0L01sgR01sgSs6VG^0003_NklO>P{k+k z7u-4Z%GdS_5I?|`RRxFx7Z4RgA0%s!om48V;LvEL-OYII$=FUd$#Ptr3*$SO_ey#88gydvgPKI(K_nek+AOM@ThxEbqva1i)c2^%DAz7^+x*O9lIU z>wQ(v5TLQY(iviGiIB1V1;%F+NFk7lsC*ag?brjxIyl>wp38A_o6~gs%lcP;S>H%@ VVBt{916cq7002ovPDHLkV1l3|aIF9U literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_front_120px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_front_120px.png new file mode 100644 index 0000000000000000000000000000000000000000..84184c5125829431082af99b577594c028360c31 GIT binary patch literal 804 zcmV+<1Ka$GP)}Hb)$!6J2kYFp=SO^xP zjjzIgpsir5AP9;eV&fn1)ks+H7$G9bEVK9H%$&>28Sq83M$T; zB$C31!eK`aD14=Ky~59m(-nSK?99iez^8g@=|8OhVI$+@ga?H~xopw+J&(Fcn`te~ zN$ru@i%X1YB53FoStUz>A*q&RR@*oHBYEinHQd6Rv@?|Nh z-2dn4rbb69-PNB z`YxPrLidB6a1uX~U#2gWg4a_B#-ZZ|T9zwW{jPIz5A*BtMAxvl4+FBledQaaD`()g zhiKsd000SaNLh0L01sgR01sgSs6VG^00047NklnA&S43BY0EiI6T9UCkPN7t(eO_U#uU&X4t3r^7bL1>S zJn+I@a92N#tYj2tR+wB-=Ef>wCqgMkk_4)DNLK4AWm#?12*7Hsx7|e_^spN$12|WW z-DMwK4v)+}N19X3b)vqi}Sd|&wu;&C=vj)Y0Rw?rj*o}Hb)$!6J2kYFp=SO^xP zjjzIgpsir5AP9;eV&fn1)ks+H7$G9bEVK9H%$&>28Sq83M$T; zB$C31!eK`aD14=Ky~59m(-nSK?99iez^8g@=|8OhVI$+@ga?H~xopw+J&(Fcn`te~ zN$ru@i%X1YB53FoStUz>A*q&RR@*oHBYEinHQd6Rv@?|Nh z-2dn4rbb69-PNB z`YxPrLidB6a1uX~U#2gWg4a_B#-ZZ|T9zwW{jPIz5A*BtMAxvl4+FBledQaaD`()g zhiKsd000SaNLh0L01sgR01sgSs6VG^0004ZNkl*4L@d%HI}%SgZUzIXI+VoGcyV(6YLi7JSlBxD@SQcN{w zF77yZI+)>}OW^L@$<^w6^V|@oAFp~% z{nN(dL)DVzuvz>g%lfmnwJihI>1>2(cdOv$YhW9ZFhi zm+_^#B#o1}QkG&9#S&qIOV-Fo)${T7zS9q97(^dH^maKbs6H+A{MiOqk08^8A4E1m zI5X`NPk)vnsH!94!JC=l`3^bXr1wddY>iys&`@dqOPZzpFX;y!4q)N2eGi!c0000< KMNUMnLSTZ`$cmc) literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_front_160px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_front_160px.png new file mode 100644 index 0000000000000000000000000000000000000000..f92b467a9d96afde50b4e55d37e093ac25db2b69 GIT binary patch literal 846 zcmV-U1F`&xP)000LF1^@s6kJd(e0004RX+uL$X=7sm z04R}lkvmHRK@^2Q6D6Vs3l&5Jw}@g9K@`MNV__3SqJmMI>}Hb)$!6J2kYFp=SO^xP zjjzIgpsir5AP9;eV&fn1)ks+H7$G9bEVK9H%$&>28Sq83M$T; zB$C31!eK`aD14=Ky~59m(-nSK?99iez^8g@=|8OhVI$+@ga?H~xopw+J&(Fcn`te~ zN$ru@i%X1YB53FoStUz>A*q&RR@*oHBYEinHQd6Rv@?|Nh z-2dn4rbb69-PNB z`YxPrLidB6a1uX~U#2gWg4a_B#-ZZ|T9zwW{jPIz5A*BtMAxvl4+FBledQaaD`()g zhiKsd000SaNLh0L01sgR01sgSs6VG^0004nNklG zE$FFeIV~qZT!5Ac0ivJ*vEl&>2^)L<1bbm=GL4mZ;_q?(|Cu!Q9tZn|O)-gg+4!P;L3RWn~Q-}ja7y+_w?b!%I zsoI0OJ;NRF7KQ?HA2X&iJC|^cOtEKmG;3 Y0bYh+;ksM}^Z)<=07*qoM6N<$g3yMDpa1{> literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_front_40px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_front_40px.png new file mode 100644 index 0000000000000000000000000000000000000000..e8a703a298fe09d3ca1f1758b5aa232713169e59 GIT binary patch literal 686 zcmV;f0#W^mP)v>!8j&P@u zO|A$Z3x^yzpzw{-^%B1-&Xo95u@jF?fnW91GF7Zsv5|F5;X&a(GgmOm=TSEarmXon zsogSraEUQZ1Pz@6tK`TNmTF06wS7Z>z8TiUW60lT14kSgvf>SiT9B?OscF$u^5xi2 zx&P18O^*zhx(6fB_~LmV{m`@r#a++)Iq|&WDFmM3%BuL+B&V@2(RV9a-x0KL!Nqk& z)A!+W8@itCq?7!U0y6#SG`ycfTLL=npk=9)Re7DWM~H9A6WzkWAq>d=_T^tkUuY{3 zFzs#t000SaNLh0L01sgR01sgSs6VG^0002xNkljsnJ5krHY;-e|!k&DP6Fu%Moo7`g;%9q$AwwOP)U>vao zS1u>rPI81jHiyIK87HlC1|@Nv8I4)zi7CMa)2>kXhuJ55%Z<3@RkqoQcYVLbUw8&a U;jtzOEC2ui07*qoM6N<$f}{sHZvX%Q literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_front_50px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_front_50px.png new file mode 100644 index 0000000000000000000000000000000000000000..a3551cffa5157d7c0c58ef9e50146683f8dbdba6 GIT binary patch literal 698 zcmV;r0!96aP)0004RX+uL$X=7sm z04R}lkvmHRK@^2Q6D6Vs3l&5Jw}@g9K@`MNV__3SqJmMI>}Hb)$!6J2kYFp=SO^xP zjjzIgpsir5AP9;eV&fn1)ks+H7$G9bEVK9H%$&>28Sq83M$T; zB$C31!eK`aD14=Ky~59m(-nSK?99iez^8g@=|8OhVI$+@ga?H~xopw+J&(Fcn`te~ zN$ru@i%X1YB53FoStUz>A*q&RR@*oHBYEinHQd6Rv@?|Nh z-2dn4rbb69-PNB z`YxPrLidB6a1uX~U#2gWg4a_B#-ZZ|T9zwW{jPIz5A*BtMAxvl4+FBledQaaD`()g zhiKsd000SaNLh0L01sgR01sgSs6VG^0002-Nklmy+G=OwvxWTSb-4rUd$7yIe^rFJix23J3(C z_ElhJaSW@QIUV?6T_gV5gF5o9tv0&$wGc02F&|Qo4v|_&k3^36-SNEZIyYq3HgL&1 z9Tkh|`=k+3z6vU7?oPm+h4cOf(wK-nmf~eF&Ng}e<`bB)!5DNetQZzjoS!rq-J;V) zs3IpKM7)X8-^I literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_front_60px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_front_60px.png new file mode 100644 index 0000000000000000000000000000000000000000..9ea3aace6df66ede7cf13e9cd5cfe5db7faefba1 GIT binary patch literal 712 zcmV;(0yq7MP)}Hb)$!6J2kYFp=SO^xP zjjzIgpsir5AP9;eV&fn1)ks+H7$G9bEVK9H%$&>28Sq83M$T; zB$C31!eK`aD14=Ky~59m(-nSK?99iez^8g@=|8OhVI$+@ga?H~xopw+J&(Fcn`te~ zN$ru@i%X1YB53FoStUz>A*q&RR@*oHBYEinHQd6Rv@?|Nh z-2dn4rbb69-PNB z`YxPrLidB6a1uX~U#2gWg4a_B#-ZZ|T9zwW{jPIz5A*BtMAxvl4+FBledQaaD`()g zhiKsd000SaNLh0L01sgR01sgSs6VG^00030Nklr`U3F-UM-^H!Hc3e*0xD@n^s#qcA;cvvpdP`k{Tp78G~qn9ZxXEiruVdVv8W@ z`~-X=Ib^n<#vyzbYV(iCYb}rGv^!;-ng`+zA*a0sM82v`Y`%P@Ybw}^oko3huobeQ zeOAOJCaUWja8WqH88z~xzuy@rx@&_UvCn&qCnDE%*E=^!xXDv>I*aRko%4;;#zW5V z+*00006wSfmLOVg#c$$(o0d$FiFs!B()b2v~?V zz6$?=wt}sKASi-}jeo#bBVoN`gak=unY|xp=3HjZfIXPevSy19vblm04)|S5(PfwO zl{SVMpaW-2Gxga}C`i-sb&pNeJFn{1d|$)SwU#h7u(b@nnk!q-ZVSNTP8s>&aVjYxP7?5d|LRmbr<*3w2+cwE?>%@no2^QfD2CvuAm zQio)YU=k*P9~W_otdpUDS87f&YwYv=`sT@tN0Yx!2}2wy(&F`qT9mE{sY%fj@?|Kg z-2dlkCMPGV-MjtJ`fOS6qu|_yO4+i$k1eZm0*)uR%+>sP$!Ypi^m0veA42aIoL|+n z_#Rwr!{DPHGh)AzL#92Mgts&3i9+8kbgoph`djDp0V137L^rU10AsShcl8IO3TNMn zpLsL@000SaNLh0L01sgR01sgSs6VG^0003dNklA1DeFKowO=FV^xY3zq~llPU`4ti#dTF#`g0|&P7qS zn|BdH_~89^3c*9`dk>7I;3Hro4}_obBC@1CO1v<8cxXp%oxFwI6tB1CN7Ih2Fj17Z z>Y1Ksr_{5pWO&N)5m<`{4On*%mV{;<@vl$E;!NV?O_cMorZZKdBCK-|I;k#oPhCKH zTvdoP7BI;{?_=}egB8{f&I#N!Hjn8m=)d;jurT%afo3m%S@q-?2^&bU{Fn|xJu#Gd zht3HhO8fN1WPx*TFUDz~x~KDv;mSeYV|~AY{5{fmy^j5eSKTlkuX2)aj5&kiuxALi hT6^C;{z~P)(gkJ^U*T<(fo%W)002ovPDHLkV1ga>U6%j= literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_front_80px.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/yellow_front_80px.png new file mode 100644 index 0000000000000000000000000000000000000000..666be5f950302fde6f033ed609dbe56b09b4e68a GIT binary patch literal 775 zcmV+i1Ni)jP)}Hb)$!6J2kYFp=SO^xP zjjzIgpsir5AP9;eV&fn1)ks+H7$G9bEVK9H%$&>28Sq83M$T; zB$C31!eK`aD14=Ky~59m(-nSK?99iez^8g@=|8OhVI$+@ga?H~xopw+J&(Fcn`te~ zN$ru@i%X1YB53FoStUz>A*q&RR@*oHBYEinHQd6Rv@?|Nh z-2dn4rbb69-PNB z`YxPrLidB6a1uX~U#2gWg4a_B#-ZZ|T9zwW{jPIz5A*BtMAxvl4+FBledQaaD`()g zhiKsd000SaNLh0L01sgR01sgSs6VG^0003#NklFMd@?9A<3KBWLMkk1|;UqyiD@)m~~Q*Rh;u=_ z?dFL>UQYmOT>~NFfAIe!2I87^gV_BVjP`5Q@M{sO1DJF29`@{nA)U1Q?6yu`i|3c0 zW^M!w;ytb&WF$MKvb81*Sh8*(ub7it;}0BugC0(f*Tp&PT@-N~z+dq$r%EoeA`)mb zkO=ga9utj3i-xQgz+9+Q=KZ_1In@b-XVW7gM3w9#3*3(_AT@2 zr*caY$;_%iE?(fbaNL&L6IYkNsctEbp12q7d`xaE_CWROV5hWu0$}@$={bOTSrmA> zM&z->vW^Ei-SjuKdvcDaU6|@*?^%!atDoKQ75?8>_zKt`VBrZku0;R<002ovPDHLk FV1nKvaH#+Q literal 0 HcmV?d00001 From 9698fbf4b8ab3f94e287a0c102d9991bbf1ba1cd Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Tue, 18 May 2021 09:52:53 +0100 Subject: [PATCH 02/77] prayer: shorten hd prayer bar to fit with updated health bars --- .../net/runelite/client/plugins/prayer/back.png | Bin 358 -> 619 bytes .../runelite/client/plugins/prayer/front.png | Bin 437 -> 692 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/prayer/back.png b/runelite-client/src/main/resources/net/runelite/client/plugins/prayer/back.png index 76773682c47c50546ed95e9dbf9b84f8694869e7..f8e721d62f634450d4b04ce6297ed377be52878c 100644 GIT binary patch delta 608 zcmV-m0-ycn0_y~SiBL{Q4GJ0x0000DNk~Le0000e000072nGNE0D1%ujsO4wZ)rnA zP-$ah001bFb&h=G=mZKw;HZ`!hg(o%LC<{*uhu6xw z;w|A`Etg0M9|(^cazNorr6(Kwq&VB)H^oLQItzBy)0_Rp$zQDHjDqlpu&Xg}vs zH}Ry43-eNc`(+Md5+y_sFG(t_lBbMcYEd$4?F)SS<|v6rlfOe%qFvf1rNj$k47Aoi z4~*7P{7Owzj1fvH5JCWB3_>E{x~{-EhgvH*=cc-MrZY2>=;}C=T(*G*IWx|GL3R!V u%sC@*cYbRGws*c#GwNVU=^eZKFMa|bvoN^U+Rs`50000jgF)`5(6OkSwkshL#{{R1D*E!d+ z)oNY0r{Ytw()sRe5jcV%P;X>~i{ltE#uVq=k|c?f5W*`>(@R;FZSp)nD9h4IN_l^H zZwm=02nC?%wry3@Gd6-3yA@vD7w`x zUk5-@6c(6Wt*R<7C=TfR{rFwbS!Y0(eNf*LJPWLs(-qeGgb#FrMUkfDA4=S sTbK;&BhT%7$`J;IoLJ0W)e2fx8$TX}VYybcN07*qoM6N<$f*C`Lc>n+a diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/prayer/front.png b/runelite-client/src/main/resources/net/runelite/client/plugins/prayer/front.png index d8df9d8bfef197e3894f126cba8b3270edba2229..1d583bb5b23f0f8b6110d486f19215b2e052ad63 100644 GIT binary patch delta 682 zcmV;b0#*IB1GEKyiBL{Q4GJ0x0000DNk~Le0000e000072nGNE0D1%ujsO4wZ)rnA zP-$ah001bFb&h=G=mZKw;HZ`!hg(o%LC<{*uhu6xw z;w|A`Etg0M9|(^cazNorr6(Kwq&VB)H^oLQItzBy)0_Rp$zQDHjDqlpu&Xg}vs zH}Ry43-eNc`(+Md5+y_sFG(t_lBbMcYEd$4?F)SS<|v6rlfO2TuM}aq$CJ!QbF2uFe&4 z*HxiaAN zFeaY04;4Gkf?&7@j~xRV2vkT4M%Dvj?>_pUVJnag!Z3@M9715^lmWt14xr*DU`jy7 z)jJ@#Y}C=}bPu6pQal*D z=0Ahqs{agT6CoJxL0)x)gFuEB0`p-b4Ces(*bGC*Aj3g8e8qo;uw_6Rh<#_`$8Iwa z7?f|^aO5|TII>z;5`=jKgh4R|!!XZ*JqRmkK%RtQbUr1RkXbN!5KV2&z`y_i4SMRI ThDpvW00000NkvXXu0mjf@EM`l From 67751b72a9a1ad4dbe0c7eecf2749482c234283f Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Fri, 10 Sep 2021 02:33:06 +0100 Subject: [PATCH 03/77] cannon: make onChatMessage use if/else --- .../client/plugins/cannon/CannonPlugin.java | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java index 535a50b19a..77a246aeac 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java @@ -320,8 +320,7 @@ public class CannonPlugin extends Plugin } } } - - if (event.getMessage().contains("You pick up the cannon") + else if (event.getMessage().contains("You pick up the cannon") || event.getMessage().contains("Your cannon has decayed. Speak to Nulodion to get a new one!") || event.getMessage().contains("Your cannon has been destroyed!")) { @@ -329,8 +328,7 @@ public class CannonPlugin extends Plugin cballsLeft = 0; removeCounter(); } - - if (event.getMessage().startsWith("You load the cannon with")) + else if (event.getMessage().startsWith("You load the cannon with")) { Matcher m = NUMBER_PATTERN.matcher(event.getMessage()); if (m.find()) @@ -368,8 +366,7 @@ public class CannonPlugin extends Plugin cannonBallNotificationSent = false; } - - if (event.getMessage().contains("Your cannon is out of ammo!")) + else if (event.getMessage().contains("Your cannon is out of ammo!")) { skipProjectileCheckThisTick = true; @@ -383,8 +380,7 @@ public class CannonPlugin extends Plugin notifier.notify("Your cannon is out of ammo!"); } } - - if (event.getMessage().startsWith("Your cannon contains")) + else if (event.getMessage().startsWith("Your cannon contains")) { Matcher m = NUMBER_PATTERN.matcher(event.getMessage()); if (m.find()) @@ -392,8 +388,7 @@ public class CannonPlugin extends Plugin cballsLeft = Integer.parseInt(m.group()); } } - - if (event.getMessage().startsWith("You unload your cannon and receive Cannonball") + else if (event.getMessage().startsWith("You unload your cannon and receive Cannonball") || event.getMessage().startsWith("You unload your cannon and receive Granite cannonball")) { skipProjectileCheckThisTick = true; From e036742d9ea137948fbcd8ad73490a3584e30294 Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Fri, 10 Sep 2021 17:21:23 +0100 Subject: [PATCH 04/77] achievementdiary: correct spelling of shortcut Jagex changed this with the update on 09/09 --- .../achievementdiary/diaries/KaramjaDiaryRequirement.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KaramjaDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KaramjaDiaryRequirement.java index db04602d53..f549ee5bce 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KaramjaDiaryRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KaramjaDiaryRequirement.java @@ -109,7 +109,7 @@ public class KaramjaDiaryRequirement extends GenericDiaryRequirement new SkillRequirement(Skill.THIEVING, 50), new SkillRequirement(Skill.MINING, 52), new QuestRequirement(Quest.LEGENDS_QUEST)); - add("Use the crossbow short cut south of the volcano.", + add("Use the crossbow shortcut south of the volcano.", new SkillRequirement(Skill.AGILITY, 53), new SkillRequirement(Skill.RANGED, 42), new SkillRequirement(Skill.STRENGTH, 21)); From b24ccaa86a93bbb6a05302f0c977da8481788031 Mon Sep 17 00:00:00 2001 From: Arnaud Peralta Date: Tue, 14 Sep 2021 08:12:37 +0200 Subject: [PATCH 05/77] roof removal: Add Juliet house overrides (#14108) --- .../client/plugins/roofremoval/overrides.jsonc | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/roofremoval/overrides.jsonc b/runelite-client/src/main/resources/net/runelite/client/plugins/roofremoval/overrides.jsonc index 656c4ae4dc..43d2b5cc55 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/roofremoval/overrides.jsonc +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/roofremoval/overrides.jsonc @@ -3270,5 +3270,23 @@ "z1": 0, "z2": 0 } + ], + "12597": [ // Varrock West + { + "rx1": 19, + "ry1": 33, + "rx2": 25, + "ry2": 34, + "z1": 0, + "z2": 0 + }, + { + "rx1": 29, + "ry1": 38, + "rx2": 30, + "ry2": 44, + "z1": 0, + "z2": 0 + } ] } From 7d1eaa8ab48ac44b104f5735c583bb718cfcc529 Mon Sep 17 00:00:00 2001 From: Hablapatabla Date: Wed, 8 Sep 2021 22:42:41 -0700 Subject: [PATCH 06/77] roof removal: Add Barbarian village overrides --- .../client/plugins/roofremoval/overrides.jsonc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/roofremoval/overrides.jsonc b/runelite-client/src/main/resources/net/runelite/client/plugins/roofremoval/overrides.jsonc index 43d2b5cc55..f7a788b056 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/roofremoval/overrides.jsonc +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/roofremoval/overrides.jsonc @@ -3288,5 +3288,15 @@ "z1": 0, "z2": 0 } + ], + "12341": [ // Barbarian Village + { + "rx1": 22, + "ry1": 35, + "rx2": 27, + "ry2": 38, + "z1": 1, + "z2": 1 + } ] } From d58cecdb8d5a2d6958a5bcf1381805c6d64be7b8 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Mon, 13 Sep 2021 23:30:04 -0700 Subject: [PATCH 07/77] idle notifier: Support filling water vessels, Shades of Mort'ton LOOKING_INTO is a generic animation used for numerous activities, and was previously used as an intermediate animation in a test case. Now that it is used to trigger idle notifications, a dummy animation has been inserted to ensure the affected test case will not be broken in the same way in the future. Co-authored-by: Nick Wolff Co-authored-by: Arnaud Peralta --- runelite-api/src/main/java/net/runelite/api/AnimationID.java | 2 +- .../client/plugins/idlenotifier/IdleNotifierPlugin.java | 1 + .../client/plugins/idlenotifier/IdleNotifierPluginTest.java | 4 +++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/AnimationID.java b/runelite-api/src/main/java/net/runelite/api/AnimationID.java index fc8303ac04..0d4350fbcf 100644 --- a/runelite-api/src/main/java/net/runelite/api/AnimationID.java +++ b/runelite-api/src/main/java/net/runelite/api/AnimationID.java @@ -179,7 +179,7 @@ public final class AnimationID public static final int MAGIC_ENCHANTING_BOLTS = 4462; public static final int BURYING_BONES = 827; public static final int USING_GILDED_ALTAR = 3705; - public static final int LOOKING_INTO = 832; + public static final int LOOKING_INTO = 832; // Generic animation used for filling water vessels, Shades of Mort'ton, etc. public static final int DIG = 830; public static final int DEMONIC_GORILLA_MAGIC_ATTACK = 7225; public static final int DEMONIC_GORILLA_MELEE_ATTACK = 7226; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java index bfc455b405..987ecedabb 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java @@ -292,6 +292,7 @@ public class IdleNotifierPlugin extends Plugin case PISCARILIUS_CRANE_REPAIR: case HOME_MAKE_TABLET: case SAND_COLLECTION: + case LOOKING_INTO: resetTimers(); lastAnimation = animation; lastAnimating = Instant.now(); diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPluginTest.java index bb91fffcb8..481a507609 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPluginTest.java @@ -62,6 +62,8 @@ import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class IdleNotifierPluginTest { + private static final int UNKNOWN_ANIMATION = -2; + @Mock @Bind private Client client; @@ -153,7 +155,7 @@ public class IdleNotifierPluginTest animationChanged.setActor(player); plugin.onAnimationChanged(animationChanged); plugin.onGameTick(new GameTick()); - when(player.getAnimation()).thenReturn(AnimationID.LOOKING_INTO); + when(player.getAnimation()).thenReturn(UNKNOWN_ANIMATION); plugin.onAnimationChanged(animationChanged); plugin.onGameTick(new GameTick()); when(player.getAnimation()).thenReturn(AnimationID.IDLE); From 4bf15daaa13970b941b0e04bfdb2d91af86f0374 Mon Sep 17 00:00:00 2001 From: Arnaud Peralta Date: Tue, 14 Sep 2021 08:59:07 +0200 Subject: [PATCH 08/77] inventory tags: Show on gravestone collection interface (#14113) --- .../src/main/java/net/runelite/api/widgets/WidgetID.java | 1 + .../client/plugins/inventorytags/InventoryTagsOverlay.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java index 0e657a6e79..4794cf8cc3 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java @@ -168,6 +168,7 @@ public class WidgetID public static final int TEMPOROSS_GROUP_ID = 437; public static final int CLAN_GROUP_ID = 701; public static final int CLAN_GUEST_GROUP_ID = 702; + public static final int GRAVESTONE_GROUP_ID = 672; static class WorldMap { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsOverlay.java index 4b9e471fab..5714ff9f8a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsOverlay.java @@ -32,6 +32,7 @@ import java.awt.Image; import java.awt.Rectangle; import java.awt.image.BufferedImage; import javax.inject.Inject; +import static net.runelite.api.widgets.WidgetID.GRAVESTONE_GROUP_ID; import net.runelite.api.widgets.WidgetItem; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.WidgetItemOverlay; @@ -53,6 +54,7 @@ public class InventoryTagsOverlay extends WidgetItemOverlay this.config = config; showOnEquipment(); showOnInventory(); + showOnInterfaces(GRAVESTONE_GROUP_ID); fillCache = CacheBuilder.newBuilder() .concurrencyLevel(1) .maximumSize(32) From 639765d8e8519c1c17abbd073e301aeb08c192d0 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Tue, 14 Sep 2021 08:04:40 -0600 Subject: [PATCH 09/77] config: clarify plugin conflict list people thought that `Conflicts with GPU` meant that their hardware was unsupported, not that the plugins are mutually exclusive --- .../runelite/client/plugins/config/PluginToggleButton.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java index 637fa189a6..7996c97f4a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java @@ -73,13 +73,13 @@ class PluginToggleButton extends JToggleButton { if (conflicts != null && !conflicts.isEmpty()) { - StringBuilder sb = new StringBuilder("
Conflicts with "); + StringBuilder sb = new StringBuilder("
Plugin conflicts: "); for (int i = 0; i < conflicts.size() - 2; i++) { sb.append(conflicts.get(i)); sb.append(", "); } - if (conflicts.size() > 2) + if (conflicts.size() >= 2) { sb.append(conflicts.get(conflicts.size() - 2)); sb.append(" and "); From 4e0211b4905c0327938e96f0ac78cab228aa8b70 Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 14 Sep 2021 11:40:57 -0400 Subject: [PATCH 10/77] ground markers: add fill opacity config --- .../plugins/groundmarkers/GroundMarkerConfig.java | 10 ++++++++++ .../plugins/groundmarkers/GroundMarkerOverlay.java | 2 +- .../net/runelite/client/ui/overlay/OverlayUtil.java | 7 ++++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerConfig.java index c577f72f35..0882225d68 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerConfig.java @@ -98,4 +98,14 @@ public interface GroundMarkerConfig extends Config { return 2; } + + @ConfigItem( + keyName = "fillOpacity", + name = "Fill Opacity", + description = "Opacity of the tile fill color" + ) + default int fillOpacity() + { + return 50; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerOverlay.java index 266e89c9b5..ffe39109c8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerOverlay.java @@ -114,7 +114,7 @@ public class GroundMarkerOverlay extends Overlay Polygon poly = Perspective.getCanvasTilePoly(client, lp); if (poly != null) { - OverlayUtil.renderPolygon(graphics, poly, color, borderStroke); + OverlayUtil.renderPolygon(graphics, poly, color, new Color(0, 0, 0, config.fillOpacity()), borderStroke); } if (!Strings.isNullOrEmpty(label)) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java index 26497ab43d..df52467132 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java @@ -54,12 +54,17 @@ public class OverlayUtil } public static void renderPolygon(Graphics2D graphics, Shape poly, Color color, Stroke borderStroke) + { + renderPolygon(graphics, poly, color, new Color(0, 0, 0, 50), borderStroke); + } + + public static void renderPolygon(Graphics2D graphics, Shape poly, Color color, Color fillColor, Stroke borderStroke) { graphics.setColor(color); final Stroke originalStroke = graphics.getStroke(); graphics.setStroke(borderStroke); graphics.draw(poly); - graphics.setColor(new Color(0, 0, 0, 50)); + graphics.setColor(fillColor); graphics.fill(poly); graphics.setStroke(originalStroke); } From d056a0250831fd2bbdc1ca81c66d28a5a290ad93 Mon Sep 17 00:00:00 2001 From: Tal Skverer Date: Tue, 14 Sep 2021 18:34:59 +0300 Subject: [PATCH 11/77] cannon: Add Dagganoth spots in Jormungand prison --- .../java/net/runelite/client/plugins/cannon/CannonSpots.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonSpots.java b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonSpots.java index 50753d5bc4..6a27de84ec 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonSpots.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonSpots.java @@ -43,7 +43,7 @@ enum CannonSpots BLUE_DRAGON(new WorldPoint(1933, 8973, 1)), BRINE_RAT(new WorldPoint(2707, 10132, 0)), CAVE_HORROR(new WorldPoint(3785, 9460, 0)), - DAGGANOTH(new WorldPoint(2524, 10020, 0)), + DAGGANOTH(new WorldPoint(2524, 10020, 0), new WorldPoint(2478, 10443, 0), new WorldPoint(2420, 10425, 0)), DARK_BEAST(new WorldPoint(1992, 4655, 0)), DARK_WARRIOR(new WorldPoint(3030, 3632, 0)), DUST_DEVIL(new WorldPoint(3218, 9366, 0)), From d8c451a55dd952cef79ec79af5e814bde450d479 Mon Sep 17 00:00:00 2001 From: Tal Skverer Date: Tue, 14 Sep 2021 18:35:18 +0300 Subject: [PATCH 12/77] cannon: Increase max distance for cannon overlays --- .../net/runelite/client/plugins/cannon/CannonOverlay.java | 5 ++--- .../net/runelite/client/plugins/cannon/CannonPlugin.java | 1 + .../runelite/client/plugins/cannon/CannonSpotOverlay.java | 5 ++--- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonOverlay.java index 69e553da75..b2a4c7df36 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonOverlay.java @@ -39,11 +39,10 @@ import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.OverlayUtil; import net.runelite.client.ui.overlay.components.TextComponent; +import static net.runelite.client.plugins.cannon.CannonPlugin.MAX_OVERLAY_DISTANCE; class CannonOverlay extends Overlay { - private static final int MAX_DISTANCE = 2500; - private final Client client; private final CannonConfig config; private final CannonPlugin plugin; @@ -76,7 +75,7 @@ class CannonOverlay extends Overlay LocalPoint localLocation = client.getLocalPlayer().getLocalLocation(); - if (localLocation.distanceTo(cannonPoint) <= MAX_DISTANCE) + if (localLocation.distanceTo(cannonPoint) <= MAX_OVERLAY_DISTANCE) { Point cannonLoc = Perspective.getCanvasTextLocation(client, graphics, diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java index 535a50b19a..23202ff99e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java @@ -72,6 +72,7 @@ import net.runelite.client.ui.overlay.infobox.InfoBoxManager; public class CannonPlugin extends Plugin { private static final Pattern NUMBER_PATTERN = Pattern.compile("([0-9]+)"); + static final int MAX_OVERLAY_DISTANCE = 4100; static final int MAX_CBALLS = 30; private CannonCounter counter; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonSpotOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonSpotOverlay.java index b7774855b5..b58c4969aa 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonSpotOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonSpotOverlay.java @@ -43,11 +43,10 @@ import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayUtil; +import static net.runelite.client.plugins.cannon.CannonPlugin.MAX_OVERLAY_DISTANCE; class CannonSpotOverlay extends Overlay { - private static final int MAX_DISTANCE = 2350; - private final Client client; private final CannonPlugin plugin; private final CannonConfig config; @@ -87,7 +86,7 @@ class CannonSpotOverlay extends Overlay LocalPoint spotPoint = LocalPoint.fromWorld(client, spot); LocalPoint localLocation = client.getLocalPlayer().getLocalLocation(); - if (spotPoint != null && localLocation.distanceTo(spotPoint) <= MAX_DISTANCE) + if (spotPoint != null && localLocation.distanceTo(spotPoint) <= MAX_OVERLAY_DISTANCE) { renderCannonSpot(graphics, client, spotPoint, itemManager.getImage(CANNONBALL), Color.RED); } From 4f7d840754fcc93d47908b9b6951ac25e7551595 Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Fri, 10 Sep 2021 02:35:02 +0100 Subject: [PATCH 13/77] cannon: update cannon location when interacting with the player's cannon When interacting with another player's cannon, a completely different message is returned. Using this, if we ever get a normal cannon message after clicking on a cannon, we can be 100% certain that it is ours. --- .../client/plugins/cannon/CannonPlugin.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java index 77a246aeac..698fbefc21 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java @@ -41,17 +41,21 @@ import net.runelite.api.InventoryID; import net.runelite.api.Item; import net.runelite.api.ItemContainer; import net.runelite.api.ItemID; +import net.runelite.api.MenuAction; +import net.runelite.api.ObjectID; import static net.runelite.api.ObjectID.CANNON_BASE; import net.runelite.api.Player; import net.runelite.api.Projectile; import static net.runelite.api.ProjectileID.CANNONBALL; import static net.runelite.api.ProjectileID.GRANITE_CANNONBALL; +import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.GameObjectSpawned; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameTick; import net.runelite.api.events.ItemContainerChanged; +import net.runelite.api.events.MenuOptionClicked; import net.runelite.api.events.ProjectileMoved; import net.runelite.client.Notifier; import net.runelite.client.callback.ClientThread; @@ -77,6 +81,8 @@ public class CannonPlugin extends Plugin private CannonCounter counter; private boolean skipProjectileCheckThisTick; private boolean cannonBallNotificationSent; + private WorldPoint clickedCannonLocation; + private boolean firstCannonLoad; @Getter private int cballsLeft; @@ -257,6 +263,39 @@ public class CannonPlugin extends Plugin } } } + + @Subscribe + public void onMenuOptionClicked(MenuOptionClicked event) + { + if (cannonPosition != null || event.getId() != ObjectID.DWARF_MULTICANNON) + { + return; + } + + // Check if cannonballs are being used on the cannon + if (event.getMenuAction() == MenuAction.ITEM_USE_ON_GAME_OBJECT) + { + final int idx = event.getSelectedItemIndex(); + final ItemContainer items = client.getItemContainer(InventoryID.INVENTORY); + if (items == null) + { + return; + } + final Item item = items.getItem(idx); + if (item == null || (item.getId() != ItemID.CANNONBALL && item.getId() != ItemID.GRANITE_CANNONBALL)) + { + return; + } + } + // Check for the Fire option being selected on the cannon. + else if (event.getMenuAction() != MenuAction.GAME_OBJECT_FIRST_OPTION) + { + return; + } + + // Store the click location as a WorldPoint to avoid issues with scene loads + clickedCannonLocation = WorldPoint.fromScene(client, event.getParam0(), event.getParam1(), client.getPlane()); + } @Subscribe public void onProjectileMoved(ProjectileMoved event) @@ -302,6 +341,7 @@ public class CannonPlugin extends Plugin cannonPlaced = true; addCounter(); cballsLeft = 0; + firstCannonLoad = true; final ItemContainer inventory = client.getItemContainer(InventoryID.INVENTORY); if (inventory != null) @@ -327,9 +367,38 @@ public class CannonPlugin extends Plugin cannonPlaced = false; cballsLeft = 0; removeCounter(); + cannonPosition = null; } else if (event.getMessage().startsWith("You load the cannon with")) { + // Set the cannon's position and object if the player's animation was interrupted during setup + if (cannonPosition == null && clickedCannonLocation != null) + { + // There is a window of 1 tick where the player can add the furnace, click on another cannon, and then + // the initial cannon load message arrives. This can cause the client to confuse the other cannon with + // the player's, so ignore that first message when deciding the cannon's location. + if (firstCannonLoad) + { + firstCannonLoad = false; + } + else + { + LocalPoint lp = LocalPoint.fromWorld(client, clickedCannonLocation); + if (lp != null) + { + GameObject[] objects = client.getScene().getTiles()[client.getPlane()][lp.getSceneX()][lp.getSceneY()].getGameObjects(); + if (objects.length > 0 && client.getLocalPlayer().getWorldLocation().distanceTo(objects[0].getWorldLocation()) <= 2) + { + cannonPlaced = true; + cannonWorld = client.getWorld(); + cannon = objects[0]; + cannonPosition = cannon.getWorldLocation(); + } + } + } + clickedCannonLocation = null; + } + Matcher m = NUMBER_PATTERN.matcher(event.getMessage()); if (m.find()) { @@ -395,6 +464,10 @@ public class CannonPlugin extends Plugin cballsLeft = 0; } + else if (event.getMessage().equals("This isn't your cannon!") || event.getMessage().equals("This is not your cannon.")) + { + clickedCannonLocation = null; + } } @Subscribe From 006fd8c8649b3965f13eae57130e59c254440050 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Fri, 18 Sep 2020 17:03:24 -0700 Subject: [PATCH 14/77] widgets: Add POH treasure chest widget IDs --- .../src/main/java/net/runelite/api/widgets/WidgetID.java | 1 + .../src/main/java/net/runelite/api/widgets/WidgetInfo.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java index 4794cf8cc3..0bad099b02 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java @@ -169,6 +169,7 @@ public class WidgetID public static final int CLAN_GROUP_ID = 701; public static final int CLAN_GUEST_GROUP_ID = 702; public static final int GRAVESTONE_GROUP_ID = 672; + public static final int POH_TREASURE_CHEST_INVENTORY_GROUP_ID = 674; static class WorldMap { diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java index 1e20e0fdc6..513d9e345a 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java @@ -554,6 +554,8 @@ public enum WidgetInfo CLAN_MEMBER_LIST(WidgetID.CLAN_GROUP_ID, WidgetID.Clan.MEMBERS), CLAN_GUEST_MEMBER_LIST(WidgetID.CLAN_GUEST_GROUP_ID, WidgetID.ClanGuest.MEMBERS), + + POH_TREASURE_CHEST_INVENTORY_CONTAINER(WidgetID.POH_TREASURE_CHEST_INVENTORY_GROUP_ID, 0), ; private final int groupId; From b1d5fa32a4a544f8027e19594fc1df7ac9ecfbbb Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Fri, 18 Sep 2020 17:03:48 -0700 Subject: [PATCH 15/77] client: Support POH treasure chest inventory overlays --- .../net/runelite/client/plugins/examine/ExaminePlugin.java | 3 ++- .../client/plugins/itemprices/ItemPricesOverlay.java | 5 ++++- .../net/runelite/client/ui/overlay/WidgetItemOverlay.java | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java index bda2548479..8bcbd77d2f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java @@ -254,7 +254,8 @@ public class ExaminePlugin extends Plugin || WidgetID.SEED_VAULT_INVENTORY_GROUP_ID == widgetGroup || WidgetID.SEED_BOX_GROUP_ID == widgetGroup || WidgetID.PLAYER_TRADE_SCREEN_GROUP_ID == widgetGroup - || WidgetID.PLAYER_TRADE_INVENTORY_GROUP_ID == widgetGroup) + || WidgetID.PLAYER_TRADE_INVENTORY_GROUP_ID == widgetGroup + || WidgetID.POH_TREASURE_CHEST_INVENTORY_GROUP_ID == widgetGroup) { Widget widgetItem = widget.getChild(actionParam); if (widgetItem != null) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesOverlay.java index 887ed04199..ea33e614f8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesOverlay.java @@ -54,6 +54,7 @@ class ItemPricesOverlay extends Overlay private static final int EXPLORERS_RING_ITEM_WIDGETID = WidgetInfo.EXPLORERS_RING_ALCH_INVENTORY.getPackedId(); private static final int SEED_VAULT_ITEM_WIDGETID = WidgetInfo.SEED_VAULT_ITEM_CONTAINER.getPackedId(); private static final int SEED_VAULT_INVENTORY_ITEM_WIDGETID = WidgetInfo.SEED_VAULT_INVENTORY_ITEMS_CONTAINER.getPackedId(); + private static final int POH_TREASURE_CHEST_INVENTORY_ITEM_WIDGETID = WidgetInfo.POH_TREASURE_CHEST_INVENTORY_CONTAINER.getPackedId(); private final Client client; private final ItemPricesConfig config; @@ -118,6 +119,7 @@ class ItemPricesOverlay extends Overlay return null; } case WidgetID.INVENTORY_GROUP_ID: + case WidgetID.POH_TREASURE_CHEST_INVENTORY_GROUP_ID: if (config.hideInventory() && !(config.showWhileAlching() && isAlching)) { return null; @@ -155,7 +157,8 @@ class ItemPricesOverlay extends Overlay if (widgetId == INVENTORY_ITEM_WIDGETID || widgetId == BANK_INVENTORY_ITEM_WIDGETID || widgetId == EXPLORERS_RING_ITEM_WIDGETID || - widgetId == SEED_VAULT_INVENTORY_ITEM_WIDGETID) + widgetId == SEED_VAULT_INVENTORY_ITEM_WIDGETID || + widgetId == POH_TREASURE_CHEST_INVENTORY_ITEM_WIDGETID) { container = client.getItemContainer(InventoryID.INVENTORY); } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetItemOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetItemOverlay.java index 066c52402a..0233b3856a 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetItemOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetItemOverlay.java @@ -43,6 +43,7 @@ import static net.runelite.api.widgets.WidgetID.GUIDE_PRICES_INVENTORY_GROUP_ID; import static net.runelite.api.widgets.WidgetID.INVENTORY_GROUP_ID; import static net.runelite.api.widgets.WidgetID.PLAYER_TRADE_INVENTORY_GROUP_ID; import static net.runelite.api.widgets.WidgetID.PLAYER_TRADE_SCREEN_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.POH_TREASURE_CHEST_INVENTORY_GROUP_ID; import static net.runelite.api.widgets.WidgetID.SEED_VAULT_INVENTORY_GROUP_ID; import static net.runelite.api.widgets.WidgetID.SHOP_INVENTORY_GROUP_ID; import net.runelite.api.widgets.WidgetInfo; @@ -127,7 +128,8 @@ public abstract class WidgetItemOverlay extends Overlay DUEL_INVENTORY_GROUP_ID, DUEL_INVENTORY_OTHER_GROUP_ID, PLAYER_TRADE_SCREEN_GROUP_ID, - PLAYER_TRADE_INVENTORY_GROUP_ID); + PLAYER_TRADE_INVENTORY_GROUP_ID, + POH_TREASURE_CHEST_INVENTORY_GROUP_ID); } protected void showOnBank() From df231d1ff98ef53412db55efc016c29fc096b549 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 16 Sep 2021 12:55:04 -0400 Subject: [PATCH 16/77] xtea: skip unknown map regions The client will include keys 0,0,0,0 for unknown map regions, which should just be skipped over instead of failing the entire request --- .../runelite/http/service/xtea/XteaEntry.java | 75 +------------------ .../http/service/xtea/XteaService.java | 36 +++++---- 2 files changed, 26 insertions(+), 85 deletions(-) diff --git a/http-service/src/main/java/net/runelite/http/service/xtea/XteaEntry.java b/http-service/src/main/java/net/runelite/http/service/xtea/XteaEntry.java index e1e86d0bf7..c5e60b1119 100644 --- a/http-service/src/main/java/net/runelite/http/service/xtea/XteaEntry.java +++ b/http-service/src/main/java/net/runelite/http/service/xtea/XteaEntry.java @@ -25,8 +25,10 @@ package net.runelite.http.service.xtea; import java.time.Instant; +import lombok.Data; -public class XteaEntry +@Data +class XteaEntry { private int region; private Instant time; @@ -35,75 +37,4 @@ public class XteaEntry private int key2; private int key3; private int key4; - - public int getRegion() - { - return region; - } - - public void setRegion(int region) - { - this.region = region; - } - - public Instant getTime() - { - return time; - } - - public void setTime(Instant time) - { - this.time = time; - } - - public int getRev() - { - return rev; - } - - public void setRev(int rev) - { - this.rev = rev; - } - - public int getKey1() - { - return key1; - } - - public void setKey1(int key1) - { - this.key1 = key1; - } - - public int getKey2() - { - return key2; - } - - public void setKey2(int key2) - { - this.key2 = key2; - } - - public int getKey3() - { - return key3; - } - - public void setKey3(int key3) - { - this.key3 = key3; - } - - public int getKey4() - { - return key4; - } - - public void setKey4(int key4) - { - this.key4 = key4; - } - } diff --git a/http-service/src/main/java/net/runelite/http/service/xtea/XteaService.java b/http-service/src/main/java/net/runelite/http/service/xtea/XteaService.java index 61650b4e51..8a5d651b05 100644 --- a/http-service/src/main/java/net/runelite/http/service/xtea/XteaService.java +++ b/http-service/src/main/java/net/runelite/http/service/xtea/XteaService.java @@ -28,6 +28,7 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import java.io.IOException; import java.util.List; +import lombok.extern.slf4j.Slf4j; import net.runelite.cache.IndexType; import net.runelite.cache.fs.Container; import net.runelite.cache.util.Djb2; @@ -45,6 +46,7 @@ import org.sql2o.Query; import org.sql2o.Sql2o; @Service +@Slf4j public class XteaService { private static final String CREATE_SQL = "CREATE TABLE IF NOT EXISTS `xtea` (\n" @@ -101,6 +103,11 @@ public class XteaService int region = key.getRegion(); int[] keys = key.getKeys(); + if (keys.length != 4) + { + throw new IllegalArgumentException("Key length must be 4"); + } + XteaCache xteaCache = keyCache.getIfPresent(region); if (xteaCache == null || xteaCache.getKey1() != keys[0] @@ -136,11 +143,6 @@ public class XteaService XteaEntry xteaEntry = findLatestXtea(con, region); - if (keys.length != 4) - { - throw new IllegalArgumentException("Key length must be 4"); - } - // already have these? if (xteaEntry != null && xteaEntry.getKey1() == keys[0] @@ -151,7 +153,14 @@ public class XteaService continue; } - if (!checkKeys(cache, region, keys)) + ArchiveEntry archiveEntry = archiveForRegion(cache, region); + if (archiveEntry == null) + { + // the client sends 0,0,0,0 for non-existent regions, just ignore them + continue; + } + + if (!checkKeys(archiveEntry, keys)) { continue; } @@ -169,6 +178,8 @@ public class XteaService .addParameter("key3", keys[2]) .addParameter("key4", keys[3]) .addToBatch(); + + log.debug("Inserted keys for {}: {}, {}, {}, {}", region, keys[0], keys[1], keys[2], keys[3]); } if (query != null) @@ -202,7 +213,7 @@ public class XteaService } } - private boolean checkKeys(CacheEntry cache, int regionId, int[] keys) + private ArchiveEntry archiveForRegion(CacheEntry cache, int regionId) { int x = regionId >>> 8; int y = regionId & 0xFF; @@ -215,16 +226,15 @@ public class XteaService .toString(); int archiveNameHash = Djb2.hash(archiveName); - ArchiveEntry archiveEntry = cacheService.findArchiveForTypeAndName(cache, IndexType.MAPS, archiveNameHash); - if (archiveEntry == null) - { - throw new InternalServerErrorException("Unable to find archive for region"); - } + return cacheService.findArchiveForTypeAndName(cache, IndexType.MAPS, archiveNameHash); + } + private boolean checkKeys(ArchiveEntry archiveEntry, int[] keys) + { byte[] data = cacheService.getArchive(archiveEntry); if (data == null) { - throw new InternalServerErrorException("Unable to get archive data"); + throw new InternalServerErrorException("Unable to get archive data for archive " + archiveEntry.getArchiveId()); } try From 3c009c8f54791a4dafeee1dbefc665962835d396 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Tue, 14 Sep 2021 23:40:31 -0700 Subject: [PATCH 17/77] status bars: Fix left bar Y offset Due to an apparent typo, the wrong value was being referenced for the left bar's Y offset specifically for the resizable viewport with bottom line interfaces. This commit fixes this reference and the associated value. --- .../runelite/client/plugins/statusbars/StatusBarsOverlay.java | 2 +- .../java/net/runelite/client/plugins/statusbars/Viewport.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java index c406bf0d1f..4ef453d4e7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java @@ -251,7 +251,7 @@ class StatusBarsOverlay extends Overlay { height = RESIZED_BOTTOM_HEIGHT; offsetLeftBarX = (location.getX() + RESIZED_BOTTOM_OFFSET_X - offsetLeft.getX()); - offsetLeftBarY = (location.getY() - RESIZED_BOTTOM_OFFSET_Y - offsetRight.getY()); + offsetLeftBarY = (location.getY() - RESIZED_BOTTOM_OFFSET_Y - offsetLeft.getY()); offsetRightBarX = (location.getX() + RESIZED_BOTTOM_OFFSET_X - offsetRight.getX()); offsetRightBarY = (location.getY() - RESIZED_BOTTOM_OFFSET_Y - offsetRight.getY()); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/Viewport.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/Viewport.java index 8b32eb6723..e681645e69 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/Viewport.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/Viewport.java @@ -36,7 +36,7 @@ enum Viewport RESIZED_BOX(WidgetInfo.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX, WidgetInfo.RESIZABLE_VIEWPORT_INTERFACE_CONTAINER, new Point(20, -4), new Point(0, -4)), RESIZED_BOTTOM(WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_INTERFACE_CONTAINER, - new Point(61, 8), new Point(35, -12)), + new Point(61, -12), new Point(35, -12)), FIXED(WidgetInfo.FIXED_VIEWPORT, WidgetInfo.FIXED_VIEWPORT_INTERFACE_CONTAINER, new Point(20, -4), new Point(0, -4)), FIXED_BANK(WidgetInfo.BANK_CONTAINER, WidgetInfo.BANK_INVENTORY_ITEMS_CONTAINER, From 847c44c44c3fd012073e548b8ad468c1242ab047 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Thu, 16 Sep 2021 15:03:00 -0700 Subject: [PATCH 18/77] status bars: Clean up rendering code --- .../plugins/statusbars/BarRenderer.java | 48 +++++++++---------- .../plugins/statusbars/StatusBarsOverlay.java | 16 +++---- 2 files changed, 30 insertions(+), 34 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/BarRenderer.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/BarRenderer.java index 03cc2f326c..84c9c8ab44 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/BarRenderer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/BarRenderer.java @@ -39,15 +39,10 @@ class BarRenderer { private static final Color BACKGROUND = new Color(0, 0, 0, 150); private static final Color OVERHEAL_COLOR = new Color(216, 255, 139, 150); - private static final int OVERHEAL_OFFSET = 2; - private static final int HEAL_OFFSET = 3; - private static final int ICON_AND_COUNTER_OFFSET_X = -4; - private static final int ICON_AND_COUNTER_OFFSET_Y = 25; private static final int SKILL_ICON_HEIGHT = 35; private static final int COUNTER_ICON_HEIGHT = 18; - private static final int OFFSET = 2; private static final int WIDTH = 20; - private static final int PADDING = 1; + private static final int BORDER_SIZE = 1; private final Supplier maxValueSupplier; private final Supplier currentValueSupplier; private final Supplier healSupplier; @@ -80,14 +75,14 @@ class BarRenderer refreshSkills(); graphics.setColor(BACKGROUND); - graphics.drawRect(x, y, WIDTH - PADDING, height - PADDING); + graphics.drawRect(x, y, WIDTH - BORDER_SIZE, height - BORDER_SIZE); graphics.fillRect(x, y, WIDTH, height); graphics.setColor(fill); - graphics.fillRect(x + PADDING, - y + PADDING + (height - filledHeight), - WIDTH - PADDING * OFFSET, - filledHeight - PADDING * OFFSET); + graphics.fillRect(x + BORDER_SIZE, + y + BORDER_SIZE + (height - filledHeight), + WIDTH - BORDER_SIZE * 2, + filledHeight - BORDER_SIZE * 2); if (config.enableRestorationBars()) { @@ -107,7 +102,8 @@ class BarRenderer if (skillIconEnabled) { final Image icon = iconSupplier.get(); - graphics.drawImage(icon, x + ICON_AND_COUNTER_OFFSET_X + PADDING, y + ICON_AND_COUNTER_OFFSET_Y - icon.getWidth(null), null); + final int xDraw = x + (WIDTH / 2) - (icon.getWidth(null) / 2); + graphics.drawImage(icon, xDraw, y, null); } if (config.enableCounter()) @@ -115,12 +111,12 @@ class BarRenderer graphics.setFont(FontManager.getRunescapeSmallFont()); final String counterText = Integer.toString(currentValue); final int widthOfCounter = graphics.getFontMetrics().stringWidth(counterText); - final int centerText = (WIDTH - PADDING) / 2 - (widthOfCounter / 2); + final int centerText = (WIDTH / 2) - (widthOfCounter / 2); final int yOffset = skillIconEnabled ? SKILL_ICON_HEIGHT : COUNTER_ICON_HEIGHT; final TextComponent textComponent = new TextComponent(); textComponent.setText(counterText); - textComponent.setPosition(new Point(x + centerText + PADDING, y + yOffset)); + textComponent.setPosition(new Point(x + centerText, y + yOffset)); textComponent.render(graphics); } } @@ -136,26 +132,26 @@ class BarRenderer } final int filledCurrentHeight = getBarHeight(maxValue, currentValue, height); - int filledHeight = getBarHeight(maxValue, heal, height); + final int filledHealHeight = getBarHeight(maxValue, heal, height); + final int fillY, fillHeight; graphics.setColor(color); - if (filledHeight + filledCurrentHeight > height) + if (filledHealHeight + filledCurrentHeight > height) { - final int overHeal = filledHeight + filledCurrentHeight - height; - filledHeight = filledHeight - overHeal + OVERHEAL_OFFSET; graphics.setColor(OVERHEAL_COLOR); - graphics.fillRect(x + PADDING, - y - filledCurrentHeight + (height - filledHeight) + HEAL_OFFSET, - WIDTH - PADDING * OVERHEAL_OFFSET, - filledHeight - PADDING * OVERHEAL_OFFSET); + fillY = y + BORDER_SIZE; + fillHeight = height - filledCurrentHeight - BORDER_SIZE; } else { - graphics.fillRect(x + PADDING, - y - OVERHEAL_OFFSET - filledCurrentHeight + (height - filledHeight) + HEAL_OFFSET, - WIDTH - PADDING * OVERHEAL_OFFSET, - filledHeight + OVERHEAL_OFFSET - PADDING * OVERHEAL_OFFSET); + fillY = y + BORDER_SIZE + height - (filledCurrentHeight + filledHealHeight); + fillHeight = filledHealHeight; } + + graphics.fillRect(x + BORDER_SIZE, + fillY, + WIDTH - BORDER_SIZE * 2, + fillHeight); } private static int getBarHeight(int base, int current, int size) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java index 4ef453d4e7..b08a1d5331 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java @@ -73,7 +73,7 @@ class StatusBarsOverlay extends Overlay private static final int HEIGHT = 252; private static final int RESIZED_BOTTOM_HEIGHT = 272; private static final int IMAGE_SIZE = 17; - private static final int ICON_DIMENSIONS = 26; + private static final Dimension ICON_DIMENSIONS = new Dimension(26, 25); private static final int RESIZED_BOTTOM_OFFSET_Y = 12; private static final int RESIZED_BOTTOM_OFFSET_X = 10; private static final int MAX_SPECIAL_ATTACK_VALUE = 100; @@ -105,7 +105,7 @@ class StatusBarsOverlay extends Overlay this.itemStatService = itemstatservice; this.spriteManager = spriteManager; - prayerIcon = ImageUtil.resizeCanvas(ImageUtil.resizeImage(skillIconManager.getSkillImage(Skill.PRAYER, true), IMAGE_SIZE, IMAGE_SIZE), ICON_DIMENSIONS, ICON_DIMENSIONS); + prayerIcon = ImageUtil.resizeCanvas(ImageUtil.resizeImage(skillIconManager.getSkillImage(Skill.PRAYER, true), IMAGE_SIZE, IMAGE_SIZE), ICON_DIMENSIONS.width, ICON_DIMENSIONS.height); initRenderers(); } @@ -317,11 +317,11 @@ class StatusBarsOverlay extends Overlay return; } - heartIcon = ImageUtil.resizeCanvas(Objects.requireNonNull(spriteManager.getSprite(SpriteID.MINIMAP_ORB_HITPOINTS_ICON, 0)), ICON_DIMENSIONS, ICON_DIMENSIONS); - heartDisease = ImageUtil.resizeCanvas(ImageUtil.loadImageResource(AlternateSprites.class, AlternateSprites.DISEASE_HEART), ICON_DIMENSIONS, ICON_DIMENSIONS); - heartPoison = ImageUtil.resizeCanvas(ImageUtil.loadImageResource(AlternateSprites.class, AlternateSprites.POISON_HEART), ICON_DIMENSIONS, ICON_DIMENSIONS); - heartVenom = ImageUtil.resizeCanvas(ImageUtil.loadImageResource(AlternateSprites.class, AlternateSprites.VENOM_HEART), ICON_DIMENSIONS, ICON_DIMENSIONS); - energyIcon = ImageUtil.resizeCanvas(Objects.requireNonNull(spriteManager.getSprite(SpriteID.MINIMAP_ORB_WALK_ICON, 0)), ICON_DIMENSIONS, ICON_DIMENSIONS); - specialIcon = ImageUtil.resizeCanvas(Objects.requireNonNull(spriteManager.getSprite(SpriteID.MINIMAP_ORB_SPECIAL_ICON, 0)), ICON_DIMENSIONS, ICON_DIMENSIONS); + heartIcon = ImageUtil.resizeCanvas(Objects.requireNonNull(spriteManager.getSprite(SpriteID.MINIMAP_ORB_HITPOINTS_ICON, 0)), ICON_DIMENSIONS.width, ICON_DIMENSIONS.height); + heartDisease = ImageUtil.resizeCanvas(ImageUtil.loadImageResource(AlternateSprites.class, AlternateSprites.DISEASE_HEART), ICON_DIMENSIONS.width, ICON_DIMENSIONS.height); + heartPoison = ImageUtil.resizeCanvas(ImageUtil.loadImageResource(AlternateSprites.class, AlternateSprites.POISON_HEART), ICON_DIMENSIONS.width, ICON_DIMENSIONS.height); + heartVenom = ImageUtil.resizeCanvas(ImageUtil.loadImageResource(AlternateSprites.class, AlternateSprites.VENOM_HEART), ICON_DIMENSIONS.width, ICON_DIMENSIONS.height); + energyIcon = ImageUtil.resizeCanvas(Objects.requireNonNull(spriteManager.getSprite(SpriteID.MINIMAP_ORB_WALK_ICON, 0)), ICON_DIMENSIONS.width, ICON_DIMENSIONS.height); + specialIcon = ImageUtil.resizeCanvas(Objects.requireNonNull(spriteManager.getSprite(SpriteID.MINIMAP_ORB_SPECIAL_ICON, 0)), ICON_DIMENSIONS.width, ICON_DIMENSIONS.height); } } From d27f5f9a76eeeaa07265fc2b535d771149475ecb Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Tue, 22 Jun 2021 10:18:55 -0700 Subject: [PATCH 19/77] api: Add getMirrorPoint to WorldPoint API --- .../net/runelite/api/coords/WorldPoint.java | 33 ++++++++++ .../runelite/api/coords/WorldPointTest.java | 62 +++++++++++++++++++ .../plugins/cluescrolls/ClueScrollPlugin.java | 34 +--------- .../cluescrolls/clues/HotColdClue.java | 2 +- .../cluescrolls/ClueScrollPluginTest.java | 32 ---------- 5 files changed, 97 insertions(+), 66 deletions(-) create mode 100644 runelite-api/src/test/java/net/runelite/api/coords/WorldPointTest.java diff --git a/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java b/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java index 780c7c4494..6dfff72cd3 100644 --- a/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java +++ b/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java @@ -44,6 +44,14 @@ import net.runelite.api.Perspective; @Value public class WorldPoint { + private static final int[] REGION_MIRRORS = { + // Prifddinas + 12894, 8755, + 12895, 8756, + 13150, 9011, + 13151, 9012 + }; + /** * X-axis coordinate. */ @@ -373,4 +381,29 @@ public class WorldPoint { return position & (REGION_SIZE - 1); } + + /** + * Translate a coordinate either between overworld and real, or real and overworld + * + * @param worldPoint + * @param toOverworld whether to convert to overworld coordinates, or to real coordinates + * @return + */ + public static WorldPoint getMirrorPoint(WorldPoint worldPoint, boolean toOverworld) + { + int region = worldPoint.getRegionID(); + for (int i = 0; i < REGION_MIRRORS.length; i += 2) + { + int real = REGION_MIRRORS[i]; + int overworld = REGION_MIRRORS[i + 1]; + + // Test against what we are converting from + if (region == (toOverworld ? real : overworld)) + { + return fromRegion(toOverworld ? overworld : real, + worldPoint.getRegionX(), worldPoint.getRegionY(), worldPoint.getPlane()); + } + } + return worldPoint; + } } diff --git a/runelite-api/src/test/java/net/runelite/api/coords/WorldPointTest.java b/runelite-api/src/test/java/net/runelite/api/coords/WorldPointTest.java new file mode 100644 index 0000000000..397da68ca0 --- /dev/null +++ b/runelite-api/src/test/java/net/runelite/api/coords/WorldPointTest.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2021 Jordan Atwood + * 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.coords; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import org.junit.Test; + +public class WorldPointTest +{ + @Test + public void getGetMirrorPoint() + { + WorldPoint point, converted; + + // Zalcano's entrance portal + point = new WorldPoint(3282, 6058, 0); + converted = WorldPoint.getMirrorPoint(point, true); + assertNotEquals(point, converted); + + // Elven Crystal Chest, which is upstairs + point = new WorldPoint(3273, 6082, 2); + converted = WorldPoint.getMirrorPoint(point, true); + assertNotEquals(point, converted); + + // Around the area of the Elite coordinate clue + point = new WorldPoint(2185, 3280, 0); + // To overworld + converted = WorldPoint.getMirrorPoint(point, true); + assertEquals(point, converted); + // To real + converted = WorldPoint.getMirrorPoint(point, false); + assertNotEquals(point, converted); + + // Brugsen Bursen, Grand Exchange + point = new WorldPoint(3165, 3477, 0); + converted = WorldPoint.getMirrorPoint(point, false); + assertEquals(point, converted); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java index 81aa28c38e..7cb988874c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java @@ -142,13 +142,6 @@ public class ClueScrollPlugin extends Plugin private static final Color HIGHLIGHT_BORDER_COLOR = Color.ORANGE; private static final Color HIGHLIGHT_HOVER_BORDER_COLOR = HIGHLIGHT_BORDER_COLOR.darker(); private static final Color HIGHLIGHT_FILL_COLOR = new Color(0, 255, 0, 20); - private static final int[] REGION_MIRRORS = { - // Prifddinas - 12894, 8755, - 12895, 8756, - 13150, 9011, - 13151, 9012 - }; private static final String CLUE_TAG_NAME = "clue"; @Getter @@ -850,7 +843,7 @@ public class ClueScrollPlugin extends Plugin WorldPoint coordinate = coordinatesToWorldPoint(degX, minX, degY, minY); // Convert from overworld to real - WorldPoint mirrorPoint = getMirrorPoint(coordinate, false); + WorldPoint mirrorPoint = WorldPoint.getMirrorPoint(coordinate, false); // Use mirror point as mirrorLocation if there is one return new CoordinateClue(text, coordinate, coordinate == mirrorPoint ? null : mirrorPoint); } @@ -1132,31 +1125,6 @@ public class ClueScrollPlugin extends Plugin ); } - /** - * Translate a coordinate either between overworld and real, or real and overworld - * - * @param worldPoint - * @param toOverworld whether to convert to overworld coordinates, or to real coordinates - * @return - */ - public static WorldPoint getMirrorPoint(WorldPoint worldPoint, boolean toOverworld) - { - int region = worldPoint.getRegionID(); - for (int i = 0; i < REGION_MIRRORS.length; i += 2) - { - int real = REGION_MIRRORS[i]; - int overworld = REGION_MIRRORS[i + 1]; - - // Test against what we are converting from - if (region == (toOverworld ? real : overworld)) - { - return WorldPoint.fromRegion(toOverworld ? overworld : real, - worldPoint.getRegionX(), worldPoint.getRegionY(), worldPoint.getPlane()); - } - } - return worldPoint; - } - private boolean testClueTag(int itemId) { ClueScroll c = clue; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java index 24ab3264bf..aa2e397f99 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java @@ -307,7 +307,7 @@ public class HotColdClue extends ClueScroll implements LocationClueScroll, Locat } // Convert from real to overworld - final WorldPoint localWorld = ClueScrollPlugin.getMirrorPoint(plugin.getClient().getLocalPlayer().getWorldLocation(), true); + final WorldPoint localWorld = WorldPoint.getMirrorPoint(plugin.getClient().getLocalPlayer().getWorldLocation(), true); if (localWorld == null) { diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/cluescrolls/ClueScrollPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/cluescrolls/ClueScrollPluginTest.java index 59daa49af7..668e7fe837 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/cluescrolls/ClueScrollPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/cluescrolls/ClueScrollPluginTest.java @@ -45,8 +45,6 @@ import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.banktags.TagManager; import net.runelite.client.plugins.cluescrolls.clues.hotcold.HotColdLocation; import net.runelite.client.ui.overlay.OverlayManager; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import org.junit.Before; @@ -96,36 +94,6 @@ public class ClueScrollPluginTest Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); } - @Test - public void getGetMirrorPoint() - { - WorldPoint point, converted; - - // Zalcano's entrance portal - point = new WorldPoint(3282, 6058, 0); - converted = ClueScrollPlugin.getMirrorPoint(point, true); - assertNotEquals(point, converted); - - // Elven Crystal Chest, which is upstairs - point = new WorldPoint(3273, 6082, 2); - converted = ClueScrollPlugin.getMirrorPoint(point, true); - assertNotEquals(point, converted); - - // Around the area of the Elite coordinate clue - point = new WorldPoint(2185, 3280, 0); - // To overworld - converted = ClueScrollPlugin.getMirrorPoint(point, true); - assertEquals(point, converted); - // To real - converted = ClueScrollPlugin.getMirrorPoint(point, false); - assertNotEquals(point, converted); - - // Brugsen Bursen, Grand Exchange - point = new WorldPoint(3165, 3477, 0); - converted = ClueScrollPlugin.getMirrorPoint(point, false); - assertEquals(point, converted); - } - @Test public void testLocationHintArrowCleared() { From 763db213a28eeef341cba53f5a063cc30046faca Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Tue, 22 Jun 2021 10:21:15 -0700 Subject: [PATCH 20/77] skybox: Show surface color while in Prifddinas --- .../java/net/runelite/client/plugins/skybox/SkyboxPlugin.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skybox/SkyboxPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/skybox/SkyboxPlugin.java index ecb90c6dab..0d07857421 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skybox/SkyboxPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skybox/SkyboxPlugin.java @@ -34,6 +34,7 @@ import net.runelite.api.Constants; import net.runelite.api.GameState; import net.runelite.api.Player; import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.api.events.BeforeRender; import net.runelite.api.events.GameStateChanged; import net.runelite.client.config.ConfigManager; @@ -108,7 +109,7 @@ public class SkyboxPlugin extends Plugin return; } - Color overrideColor = player.getWorldLocation().getY() < Constants.OVERWORLD_MAX_Y + Color overrideColor = WorldPoint.getMirrorPoint(player.getWorldLocation(), true).getY() < Constants.OVERWORLD_MAX_Y ? config.customOverworldColor() : config.customOtherColor(); if (overrideColor != null) { From fc183c13afb91e7715e75e9d0205e380e409dccf Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 19 Sep 2021 15:44:49 -0400 Subject: [PATCH 21/77] xp tracker overlay: treat counter=off progressbar=off as hidden If the xptracker is shown, but both counter and progress bar set to off, the xp tracker layer is not actually hidden but only has hidden children. This causes the overlay renderer to layout things around the invisible xptracker. Avoid this by checking the vars for the xptracker to see if it is hidden or not. --- .../runelite/client/ui/overlay/WidgetOverlay.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java index 9435086d7c..6cdd78248c 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java @@ -204,6 +204,20 @@ public class WidgetOverlay extends Overlay this.overlayManager = overlayManager; } + @Override + public Dimension render(Graphics2D graphics) + { + // The xptracker component layer isn't hidden if the counter and process bar are both configured "Off", + // it just has its children hidden. + if (client.getVar(Varbits.EXPERIENCE_TRACKER_COUNTER) == 30 // Off + && client.getVar(Varbits.EXPERIENCE_TRACKER_PROGRESS_BAR) == 0) // Off + { + return null; + } + + return super.render(graphics); + } + /** * Get the overlay position of the xptracker based on the configured location in-game. * From c5d4c757f111abd07ca3bb188786bfbe42b91de5 Mon Sep 17 00:00:00 2001 From: Christian Bull <56417349+Christian-Bull@users.noreply.github.com> Date: Sun, 19 Sep 2021 16:44:08 -0400 Subject: [PATCH 22/77] agility shortcut: include grapple rocks in observatory shortcut Co-authored-by: christianbull-maxx --- .../src/main/java/net/runelite/client/game/AgilityShortcut.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/game/AgilityShortcut.java b/runelite-client/src/main/java/net/runelite/client/game/AgilityShortcut.java index 2bf8b26d53..1b13fdae2c 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/AgilityShortcut.java +++ b/runelite-client/src/main/java/net/runelite/client/game/AgilityShortcut.java @@ -100,7 +100,7 @@ public enum AgilityShortcut COAL_TRUCKS_LOG_BALANCE(20, "Log Balance", new WorldPoint(2598, 3475, 0), LOG_BALANCE_23274), GRAND_EXCHANGE_UNDERWALL_TUNNEL(21, "Underwall Tunnel", new WorldPoint(3139, 3515, 0), UNDERWALL_TUNNEL_16529, UNDERWALL_TUNNEL_16530), BRIMHAVEN_DUNGEON_PIPE(22, "Pipe Squeeze", new WorldPoint(2654, 9569, 0), PIPE_21728), - OBSERVATORY_SCALE_CLIFF(23, "Grapple Rocks", new WorldPoint(2447, 3155, 0), NULL_31849), + OBSERVATORY_SCALE_CLIFF(23, "Grapple Rocks", new WorldPoint(2447, 3155, 0), NULL_31849, NULL_31852), EAGLES_PEAK_ROCK_CLIMB(25, "Rock Climb", new WorldPoint(2320, 3499, 0), ROCKS_19849), FALADOR_UNDERWALL_TUNNEL(26, "Underwall Tunnel", new WorldPoint(2947, 3313, 0), UNDERWALL_TUNNEL, UNDERWALL_TUNNEL_16528), KOUREND_CATACOMBS_PILLAR_JUMP_NORTH(28, "Pillar Jump", new WorldPoint(1613, 10071, 0)), From 8345f6c7bd870b795e3df8a90cf26b51bc8b2b22 Mon Sep 17 00:00:00 2001 From: superiorser9 Date: Wed, 11 Aug 2021 14:58:44 +0100 Subject: [PATCH 23/77] screenshot: Capture collection log popup notifications --- .../main/java/net/runelite/api/ScriptID.java | 14 +++++++ .../java/net/runelite/api/VarClientStr.java | 4 +- .../main/java/net/runelite/api/Varbits.java | 12 +++++- .../plugins/screenshot/ScreenshotPlugin.java | 34 ++++++++++++++++- .../screenshot/ScreenshotPluginTest.java | 38 +++++++++++++++++++ 5 files changed, 99 insertions(+), 3 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/ScriptID.java b/runelite-api/src/main/java/net/runelite/api/ScriptID.java index dbde2ad2a4..b7109c1cb8 100644 --- a/runelite-api/src/main/java/net/runelite/api/ScriptID.java +++ b/runelite-api/src/main/java/net/runelite/api/ScriptID.java @@ -367,4 +367,18 @@ public final class ScriptID @ScriptArguments(integer = 6) public static final int COLLECTION_DRAW_LIST = 2730; + + /** + * Draws the active notification in increasing sizes (increasing horizontally first, then vertically) to show a + * starting animation. + */ + @ScriptArguments(integer = 3) + public static final int NOTIFICATION_START = 3346; + + /** + * Draws the active notification in full size for a specified number of client ticks. In essence, delayed between + * the open and close animations. + */ + @ScriptArguments(integer = 1) + public static final int NOTIFICATION_DELAY = 3347; } \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/VarClientStr.java b/runelite-api/src/main/java/net/runelite/api/VarClientStr.java index 68ba463897..352314134e 100644 --- a/runelite-api/src/main/java/net/runelite/api/VarClientStr.java +++ b/runelite-api/src/main/java/net/runelite/api/VarClientStr.java @@ -41,7 +41,9 @@ public enum VarClientStr CHATBOX_TYPED_TEXT(335), INPUT_TEXT(359), PRIVATE_MESSAGE_TARGET(360), - RECENT_FRIENDS_CHAT(362); + RECENT_FRIENDS_CHAT(362), + NOTIFICATION_TOP_TEXT(387), + NOTIFICATION_BOTTOM_TEXT(388); private final int index; } diff --git a/runelite-api/src/main/java/net/runelite/api/Varbits.java b/runelite-api/src/main/java/net/runelite/api/Varbits.java index 28b9222cd1..d7165d0951 100644 --- a/runelite-api/src/main/java/net/runelite/api/Varbits.java +++ b/runelite-api/src/main/java/net/runelite/api/Varbits.java @@ -607,7 +607,17 @@ public enum Varbits * * @see The OSRS Wiki's Minimap page */ - PVP_SPEC_ORB(8121); + PVP_SPEC_ORB(8121), + + /** + * Collection Log notification settings whenever a new item is added + * + * 0 = no notification + * 1 = chat notification only + * 2 = popup notification only + * 3 = chat and popup + */ + COLLECTION_LOG_NOTIFICATION(11959); /** * The raw varbit ID. diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java index f7c8c9e440..2813d835e1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java @@ -51,11 +51,15 @@ import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.Player; import net.runelite.api.Point; +import net.runelite.api.ScriptID; import net.runelite.api.SpriteID; +import net.runelite.api.VarClientStr; +import net.runelite.api.Varbits; import net.runelite.api.events.ActorDeath; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.GameTick; import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.api.events.ScriptPreFired; import net.runelite.api.events.WidgetLoaded; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetID; @@ -148,6 +152,7 @@ public class ScreenshotPlugin extends Plugin private Integer killCountNumber; private boolean shouldTakeScreenshot; + private boolean notificationStarted; @Inject private ScreenshotConfig config; @@ -239,6 +244,7 @@ public class ScreenshotPlugin extends Plugin clientToolbar.removeNavigation(titleBarButton); keyManager.unregisterKeyListener(hotkeyListener); kickPlayerName = null; + notificationStarted = false; } @Subscribe @@ -479,7 +485,7 @@ public class ScreenshotPlugin extends Plugin } } - if (config.screenshotCollectionLogEntries() && chatMessage.startsWith(COLLECTION_LOG_TEXT)) + if (config.screenshotCollectionLogEntries() && chatMessage.startsWith(COLLECTION_LOG_TEXT) && client.getVar(Varbits.COLLECTION_LOG_NOTIFICATION) == 1) { String entry = Text.removeTags(chatMessage).substring(COLLECTION_LOG_TEXT.length()); String fileName = "Collection log (" + entry + ")"; @@ -622,6 +628,32 @@ public class ScreenshotPlugin extends Plugin takeScreenshot(fileName, screenshotSubDir); } + @Subscribe + public void onScriptPreFired(ScriptPreFired scriptPreFired) + { + switch (scriptPreFired.getScriptId()) + { + case ScriptID.NOTIFICATION_START: + notificationStarted = true; + break; + case ScriptID.NOTIFICATION_DELAY: + if (!notificationStarted) + { + return; + } + String topText = client.getVar(VarClientStr.NOTIFICATION_TOP_TEXT); + String bottomText = client.getVar(VarClientStr.NOTIFICATION_BOTTOM_TEXT); + if (topText.equalsIgnoreCase("Collection log") && config.screenshotCollectionLogEntries()) + { + String entry = Text.removeTags(bottomText).substring("New item:".length()); + String fileName = "Collection log (" + entry + ")"; + takeScreenshot(fileName, SD_COLLECTION_LOG); + } + notificationStarted = false; + break; + } + } + private void manualScreenshot() { takeScreenshot("", null); diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java index 2664c031e7..47b6f14fca 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java @@ -32,8 +32,12 @@ import java.util.function.Consumer; import javax.inject.Inject; import static net.runelite.api.ChatMessageType.GAMEMESSAGE; import net.runelite.api.Client; +import net.runelite.api.ScriptID; +import net.runelite.api.VarClientStr; +import net.runelite.api.Varbits; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.GameTick; +import net.runelite.api.events.ScriptPreFired; import net.runelite.api.events.WidgetLoaded; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetID; @@ -59,6 +63,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import org.mockito.junit.MockitoJUnitRunner; @@ -76,6 +81,7 @@ public class ScreenshotPluginTest private static final String UNTRADEABLE_DROP = "Untradeable drop: Rusty sword"; private static final String BA_HIGH_GAMBLE_REWARD = "Raw shark (x 300)!
High level gamble count: 100"; private static final String HUNTER_LEVEL_2_TEXT = "Congratulations, you've just advanced a Hunter level.

Your Hunter level is now 2."; + private static final String COLLECTION_LOG_CHAT = "New item added to your collection log: Chompy bird hat"; @Mock @Bind @@ -128,6 +134,7 @@ public class ScreenshotPluginTest when(screenshotConfig.screenshotValuableDrop()).thenReturn(true); when(screenshotConfig.valuableDropThreshold()).thenReturn(1000); when(screenshotConfig.screenshotUntradeableDrop()).thenReturn(true); + when(screenshotConfig.screenshotCollectionLogEntries()).thenReturn(true); } @Test @@ -386,4 +393,35 @@ public class ScreenshotPluginTest verify(drawManager, times(0)).requestNextFrameListener(any(Consumer.class)); } + + @Test + public void testCollectionLogPopup() + { + ScriptPreFired notificationStart = new ScriptPreFired(ScriptID.NOTIFICATION_START); + screenshotPlugin.onScriptPreFired(notificationStart); + + when(client.getVar(VarClientStr.NOTIFICATION_TOP_TEXT)).thenReturn("Collection log"); + when(client.getVar(VarClientStr.NOTIFICATION_BOTTOM_TEXT)).thenReturn("New item:

Chompy bird hat"); + + ScriptPreFired notificationDelay = new ScriptPreFired(ScriptID.NOTIFICATION_DELAY); + screenshotPlugin.onScriptPreFired(notificationDelay); + + verify(drawManager).requestNextFrameListener(any(Consumer.class)); + } + + @Test + public void testCollectionLogChat() + { + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "", COLLECTION_LOG_CHAT, null, 0); + + when(client.getVar(Varbits.COLLECTION_LOG_NOTIFICATION)).thenReturn(1); + screenshotPlugin.onChatMessage(chatMessageEvent); + + verify(drawManager).requestNextFrameListener(any(Consumer.class)); + + when(client.getVar(Varbits.COLLECTION_LOG_NOTIFICATION)).thenReturn(3); + screenshotPlugin.onChatMessage(chatMessageEvent); + + verifyNoMoreInteractions(drawManager); + } } From 86cda7de0be670f672a929c527993c00e5adabdd Mon Sep 17 00:00:00 2001 From: Patrick Watts Date: Tue, 21 Sep 2021 11:41:54 +0400 Subject: [PATCH 24/77] screenshot: Add clan member death screenshotting (#14052) --- .../plugins/screenshot/ScreenshotConfig.java | 28 +++++++++++++------ .../plugins/screenshot/ScreenshotPlugin.java | 5 +++- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotConfig.java index 1dd5c53174..f7498f7af3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotConfig.java @@ -181,11 +181,23 @@ public interface ScreenshotConfig extends Config return false; } + @ConfigItem( + keyName = "clanDeath", + name = "Screenshot Clan Deaths", + description = "Configures whether or not screenshots are automatically taken when clan members die.", + position = 12, + section = whatSection + ) + default boolean screenshotClanDeath() + { + return false; + } + @ConfigItem( keyName = "duels", name = "Screenshot Duels", description = "Configures whether or not screenshots are automatically taken of the duel end screen.", - position = 12, + position = 13, section = whatSection ) default boolean screenshotDuels() @@ -197,7 +209,7 @@ public interface ScreenshotConfig extends Config keyName = "valuableDrop", name = "Screenshot Valuable drops", description = "Configures whether or not screenshots are automatically taken when you receive a valuable drop.", - position = 13, + position = 14, section = whatSection ) default boolean screenshotValuableDrop() @@ -209,7 +221,7 @@ public interface ScreenshotConfig extends Config keyName = "valuableDropThreshold", name = "Valuable Threshold", description = "The minimum value to save screenshots of valuable drops.", - position = 14, + position = 15, section = whatSection ) default int valuableDropThreshold() @@ -221,7 +233,7 @@ public interface ScreenshotConfig extends Config keyName = "untradeableDrop", name = "Screenshot Untradeable drops", description = "Configures whether or not screenshots are automatically taken when you receive an untradeable drop.", - position = 15, + position = 16, section = whatSection ) default boolean screenshotUntradeableDrop() @@ -233,7 +245,7 @@ public interface ScreenshotConfig extends Config keyName = "ccKick", name = "Screenshot Kicks from FC", description = "Take a screenshot when you kick a user from a friends chat.", - position = 16, + position = 17, section = whatSection ) default boolean screenshotKick() @@ -245,7 +257,7 @@ public interface ScreenshotConfig extends Config keyName = "baHighGamble", name = "Screenshot BA high gambles", description = "Take a screenshot of your reward from a high gamble at Barbarian Assault.", - position = 17, + position = 18, section = whatSection ) default boolean screenshotHighGamble() @@ -257,7 +269,7 @@ public interface ScreenshotConfig extends Config keyName = "collectionLogEntries", name = "Screenshot collection log entries", description = "Take a screenshot when completing an entry in the collection log", - position = 18, + position = 19, section = whatSection ) default boolean screenshotCollectionLogEntries() @@ -269,7 +281,7 @@ public interface ScreenshotConfig extends Config keyName = "hotkey", name = "Screenshot hotkey", description = "When you press this key a screenshot will be taken", - position = 19 + position = 20 ) default Keybind hotkey() { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java index 2813d835e1..c64e7c06b9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java @@ -308,7 +308,10 @@ public class ScreenshotPlugin extends Plugin { takeScreenshot("Death", SD_DEATHS); } - else if (player != client.getLocalPlayer() && (player.isFriendsChatMember() || player.isFriend()) && config.screenshotFriendDeath() && player.getCanvasTilePoly() != null) + else if (player != client.getLocalPlayer() + && player.getCanvasTilePoly() != null + && (((player.isFriendsChatMember() || player.isFriend()) && config.screenshotFriendDeath()) + || (player.isClanMember() && config.screenshotClanDeath()))) { takeScreenshot("Death " + player.getName(), SD_DEATHS); } From 9c7fade732d89216de2517ce0b4a688a302d6006 Mon Sep 17 00:00:00 2001 From: pwatts6060 Date: Tue, 21 Sep 2021 00:55:34 -0700 Subject: [PATCH 25/77] api: Add contains methods to WorldPoint and WorldArea --- .../net/runelite/api/coords/WorldArea.java | 20 +++++++++++ .../net/runelite/api/coords/WorldPoint.java | 36 +++++++++++++++++++ .../npcunaggroarea/NpcAggroAreaPlugin.java | 2 +- 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/runelite-api/src/main/java/net/runelite/api/coords/WorldArea.java b/runelite-api/src/main/java/net/runelite/api/coords/WorldArea.java index 9abb3aeac8..4ac96fbe24 100644 --- a/runelite-api/src/main/java/net/runelite/api/coords/WorldArea.java +++ b/runelite-api/src/main/java/net/runelite/api/coords/WorldArea.java @@ -151,6 +151,26 @@ public class WorldArea return distanceTo2D(new WorldArea(other, 1, 1)); } + /** + * Checks whether a tile is contained within the area and in the same plane. + * + * @return {@code true} if the tile is contained within the bounds of this area, {@code false} otherwise. + */ + public boolean contains(WorldPoint worldPoint) + { + return distanceTo(worldPoint) == 0; + } + + /** + * Checks whether a tile is contained within the area while ignoring the plane. + * + * @return {@code true} if the tile is contained within the bounds of this area regardless of plane, {@code false} otherwise. + */ + public boolean contains2D(WorldPoint worldPoint) + { + return distanceTo2D(worldPoint) == 0; + } + /** * Checks whether this area is within melee distance of another. *

diff --git a/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java b/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java index 6dfff72cd3..cafb9e9115 100644 --- a/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java +++ b/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java @@ -406,4 +406,40 @@ public class WorldPoint } return worldPoint; } + + /** + * Checks whether this tile is located within any of the given areas. + * + * @param worldAreas areas to check within + * @return {@code true} if any area contains this point, {@code false} otherwise. + */ + public boolean isInArea(WorldArea... worldAreas) + { + for (WorldArea area : worldAreas) + { + if (area.contains(this)) + { + return true; + } + } + return false; + } + + /** + * Checks whether this tile is located within any of the given areas, disregarding any plane differences. + * + * @param worldAreas areas to check within + * @return {@code true} if any area contains this point, {@code false} otherwise. + */ + public boolean isInArea2D(WorldArea... worldAreas) + { + for (WorldArea area : worldAreas) + { + if (area.contains2D(this)) + { + return true; + } + } + return false; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java index cf4830ebd7..148876e631 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java @@ -248,7 +248,7 @@ public class NpcAggroAreaPlugin extends Plugin private static boolean isInWilderness(WorldPoint location) { - return WILDERNESS_ABOVE_GROUND.distanceTo2D(location) == 0 || WILDERNESS_UNDERGROUND.distanceTo2D(location) == 0; + return location.isInArea2D(WILDERNESS_ABOVE_GROUND, WILDERNESS_UNDERGROUND); } private boolean isNpcMatch(NPC npc) From 1505f34ace2c8867cab7e9349827b677a4881869 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 17 Sep 2021 21:07:40 -0400 Subject: [PATCH 26/77] Update okhttp to 3.14.9 --- http-api/pom.xml | 4 ++-- http-service/pom.xml | 2 +- runelite-client/pom.xml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/http-api/pom.xml b/http-api/pom.xml index 93eb167f6c..26700a8998 100644 --- a/http-api/pom.xml +++ b/http-api/pom.xml @@ -43,7 +43,7 @@ com.squareup.okhttp3 okhttp - 3.7.0 + 3.14.9 com.google.code.gson @@ -79,7 +79,7 @@ com.squareup.okhttp3 mockwebserver - 3.7.0 + 3.14.9 test diff --git a/http-service/pom.xml b/http-service/pom.xml index 22ff46eb37..f0c903759b 100644 --- a/http-service/pom.xml +++ b/http-service/pom.xml @@ -137,7 +137,7 @@ com.squareup.okhttp3 mockwebserver - 3.7.0 + 3.14.9 test diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index e80f89611f..c575a52682 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -278,7 +278,7 @@ com.squareup.okhttp3 mockwebserver - 3.7.0 + 3.14.9 test From 642677d6e2431ad05b0d0ee7be9c9b9db5a7ba08 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 17 Sep 2021 20:56:46 -0400 Subject: [PATCH 27/77] http-service: assign name to scheduler thread --- .../service/SpringSchedulingConfigurer.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 http-service/src/main/java/net/runelite/http/service/SpringSchedulingConfigurer.java diff --git a/http-service/src/main/java/net/runelite/http/service/SpringSchedulingConfigurer.java b/http-service/src/main/java/net/runelite/http/service/SpringSchedulingConfigurer.java new file mode 100644 index 0000000000..6af0895619 --- /dev/null +++ b/http-service/src/main/java/net/runelite/http/service/SpringSchedulingConfigurer.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021, Adam + * 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.http.service; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.TaskScheduler; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.concurrent.ConcurrentTaskScheduler; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; + +@Configuration +public class SpringSchedulingConfigurer implements SchedulingConfigurer +{ + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) + { + // this is from ScheduledTaskRegistrar.scheduleTasks() but modified to give the scheduler thread a + // recognizable name + ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor( + new ThreadFactoryBuilder() + .setNameFormat("scheduler-%d") + .build() + ); + TaskScheduler scheduler = new ConcurrentTaskScheduler(scheduledExecutorService); + taskRegistrar.setTaskScheduler(scheduler); + } +} \ No newline at end of file From 4cab29cf2f3f1e969dfa13705baa52d4ee80ff38 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 20 Sep 2021 10:39:52 -0400 Subject: [PATCH 28/77] api: remove cachedModels2 and nodecache setters This is being moved internally since it benefits areas like the farming guild even with gpu off --- runelite-api/src/main/java/net/runelite/api/Client.java | 2 -- runelite-api/src/main/java/net/runelite/api/NodeCache.java | 4 ---- .../java/net/runelite/client/plugins/gpu/GpuPlugin.java | 7 ------- 3 files changed, 13 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/Client.java b/runelite-api/src/main/java/net/runelite/api/Client.java index b669649272..6dceaf0f0e 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -1769,8 +1769,6 @@ public interface Client extends GameEngine TextureProvider getTextureProvider(); - NodeCache getCachedModels2(); - void setRenderArea(boolean[][] renderArea); int getRasterizer3D_clipMidX2(); diff --git a/runelite-api/src/main/java/net/runelite/api/NodeCache.java b/runelite-api/src/main/java/net/runelite/api/NodeCache.java index e6d8f8208b..c6337fd735 100644 --- a/runelite-api/src/main/java/net/runelite/api/NodeCache.java +++ b/runelite-api/src/main/java/net/runelite/api/NodeCache.java @@ -33,8 +33,4 @@ public interface NodeCache * Resets cache. */ void reset(); - - void setCapacity(int capacity); - - void setRemainingCapacity(int remainingCapacity); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java index 93d0046a9f..b8a533e7c9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java @@ -66,7 +66,6 @@ import net.runelite.api.BufferProvider; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.Model; -import net.runelite.api.NodeCache; import net.runelite.api.Perspective; import net.runelite.api.Renderable; import net.runelite.api.Scene; @@ -407,12 +406,6 @@ public class GpuPlugin extends Plugin implements DrawCallbacks textureArrayId = -1; - // increase size of model cache for dynamic objects since we are extending scene size - NodeCache cachedModels2 = client.getCachedModels2(); - cachedModels2.setCapacity(256); - cachedModels2.setRemainingCapacity(256); - cachedModels2.reset(); - if (client.getGameState() == GameState.LOGGED_IN) { invokeOnMainThread(this::uploadScene); From 3d79ab60a22bce0d4c5c2f4438f24de122aad85b Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 22 Sep 2021 11:06:34 -0400 Subject: [PATCH 29/77] perspective: add gpu projection for modelToCanvas GPU uses an alternative projection to avoid vertex snapping. Usually this doesn't matter much, and in the worst case causes the discrepancy to be only a few pixels, but with the model outline feature it causes the outlines to be noticibly off when GPU is enabled. This adds a second model-to-canvas method using the alternative projection and uses it when GPU is enabled. --- .../java/net/runelite/api/Perspective.java | 81 ++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/runelite-api/src/main/java/net/runelite/api/Perspective.java b/runelite-api/src/main/java/net/runelite/api/Perspective.java index af61d02134..1fb04908d9 100644 --- a/runelite-api/src/main/java/net/runelite/api/Perspective.java +++ b/runelite-api/src/main/java/net/runelite/api/Perspective.java @@ -150,9 +150,88 @@ public class Perspective } /** - * Translates a model's vertices into 2d space + * Translates a model's vertices into 2d space. There is a separate implementation for GPU since GPU + * uses a slightly more precise projection that can cause features like model outlines being noticeably + * off otherwise. */ public static void modelToCanvas(Client client, int end, int x3dCenter, int y3dCenter, int z3dCenter, int rotate, int[] x3d, int[] y3d, int[] z3d, int[] x2d, int[] y2d) + { + if (client.isGpu()) + { + modelToCanvasGpu(client, end, x3dCenter, y3dCenter, z3dCenter, rotate, x3d, y3d, z3d, x2d, y2d); + } + else + { + modelToCanvasCpu(client, end, x3dCenter, y3dCenter, z3dCenter, rotate, x3d, y3d, z3d, x2d, y2d); + } + } + + private static void modelToCanvasGpu(Client client, int end, int x3dCenter, int y3dCenter, int z3dCenter, int rotate, int[] x3d, int[] y3d, int[] z3d, int[] x2d, int[] y2d) + { + final int + cameraPitch = client.getCameraPitch(), + cameraYaw = client.getCameraYaw(); + final float + pitchSin = SINE[cameraPitch] / 65536.0f, + pitchCos = COSINE[cameraPitch] / 65536.0f, + yawSin = SINE[cameraYaw] / 65536.0f, + yawCos = COSINE[cameraYaw] / 65536.0f, + rotateSin = SINE[rotate] / 65536.0f, + rotateCos = COSINE[rotate] / 65536.0f, + + cx = x3dCenter - client.getCameraX(), + cy = y3dCenter - client.getCameraY(), + cz = z3dCenter - client.getCameraZ(), + + viewportXMiddle = client.getViewportWidth() / 2f, + viewportYMiddle = client.getViewportHeight() / 2f, + viewportXOffset = client.getViewportXOffset(), + viewportYOffset = client.getViewportYOffset(), + + zoom3d = client.getScale(); + + for (int i = 0; i < end; i++) + { + float x = x3d[i]; + float y = y3d[i]; + float z = z3d[i]; + + if (rotate != 0) + { + float x0 = x; + x = x0 * rotateCos + y * rotateSin; + y = y * rotateCos - x0 * rotateSin; + } + + x += cx; + y += cy; + z += cz; + + final float + x1 = x * yawCos + y * yawSin, + y1 = y * yawCos - x * yawSin, + y2 = z * pitchCos - y1 * pitchSin, + z1 = y1 * pitchCos + z * pitchSin; + + int viewX, viewY; + + if (z1 < 50) + { + viewX = Integer.MIN_VALUE; + viewY = Integer.MIN_VALUE; + } + else + { + viewX = Math.round((viewportXMiddle + x1 * zoom3d / z1) + viewportXOffset); + viewY = Math.round((viewportYMiddle + y2 * zoom3d / z1) + viewportYOffset); + } + + x2d[i] = viewX; + y2d[i] = viewY; + } + } + + private static void modelToCanvasCpu(Client client, int end, int x3dCenter, int y3dCenter, int z3dCenter, int rotate, int[] x3d, int[] y3d, int[] z3d, int[] x2d, int[] y2d) { final int cameraPitch = client.getCameraPitch(), From 8c2d7bd2f428932292c5af22b9ee8c8d9998668d Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 22 Sep 2021 14:54:37 -0400 Subject: [PATCH 30/77] perspective: refactor localToCanvas Use variable namings from modelToCanvas --- .../java/net/runelite/api/Perspective.java | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/Perspective.java b/runelite-api/src/main/java/net/runelite/api/Perspective.java index 1fb04908d9..75963a2486 100644 --- a/runelite-api/src/main/java/net/runelite/api/Perspective.java +++ b/runelite-api/src/main/java/net/runelite/api/Perspective.java @@ -122,24 +122,25 @@ public class Perspective y -= client.getCameraY(); z -= client.getCameraZ(); - int cameraPitch = client.getCameraPitch(); - int cameraYaw = client.getCameraYaw(); + final int cameraPitch = client.getCameraPitch(); + final int cameraYaw = client.getCameraYaw(); - int pitchSin = SINE[cameraPitch]; - int pitchCos = COSINE[cameraPitch]; - int yawSin = SINE[cameraYaw]; - int yawCos = COSINE[cameraYaw]; + final int pitchSin = SINE[cameraPitch]; + final int pitchCos = COSINE[cameraPitch]; + final int yawSin = SINE[cameraYaw]; + final int yawCos = COSINE[cameraYaw]; - int var8 = yawCos * x + y * yawSin >> 16; - y = yawCos * y - yawSin * x >> 16; - x = var8; - var8 = pitchCos * z - y * pitchSin >> 16; - y = z * pitchSin + y * pitchCos >> 16; + final int + x1 = x * yawCos + y * yawSin >> 16, + y1 = y * yawCos - x * yawSin >> 16, + y2 = z * pitchCos - y1 * pitchSin >> 16, + z1 = y1 * pitchCos + z * pitchSin >> 16; - if (y >= 50) + if (z1 >= 50) { - int pointX = client.getViewportWidth() / 2 + x * client.getScale() / y; - int pointY = client.getViewportHeight() / 2 + var8 * client.getScale() / y; + final int scale = client.getScale(); + final int pointX = client.getViewportWidth() / 2 + x1 * scale / z1; + final int pointY = client.getViewportHeight() / 2 + y2 * scale / z1; return new Point( pointX + client.getViewportXOffset(), pointY + client.getViewportYOffset()); From 6df0372290652ef42848e09e2f17da268edf238a Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Wed, 22 Sep 2021 14:09:38 +0200 Subject: [PATCH 31/77] project: Java 17 support, update deps, rework some stupid logic --- buildSrc/src/main/kotlin/Dependencies.kt | 2 +- cache/cache.gradle.kts | 10 +- deobfuscator/deobfuscator.gradle.kts | 8 +- http-api/http-api.gradle.kts | 12 +- injector/injector.gradle.kts | 10 +- .../injector/injection/InjectData.java | 2 +- runelite-api/runelite-api.gradle.kts | 6 +- .../net/runelite/api/events/ActorDeath.java | 4 +- .../runelite/api/events/AnimationChanged.java | 26 +- .../api/events/AreaSoundEffectPlayed.java | 1 - .../net/runelite/api/events/ChatMessage.java | 4 +- .../runelite/api/events/CommandExecuted.java | 4 +- .../api/events/DecorativeObjectChanged.java | 2 +- .../api/events/DecorativeObjectDespawned.java | 2 +- .../api/events/DecorativeObjectSpawned.java | 2 +- .../net/runelite/api/events/FakeXpDrop.java | 4 +- .../api/events/FriendsChatChanged.java | 2 +- .../api/events/FriendsChatMemberJoined.java | 2 +- .../api/events/FriendsChatMemberLeft.java | 2 +- .../api/events/GameObjectDespawned.java | 2 +- .../api/events/GameObjectSpawned.java | 4 +- .../runelite/api/events/GameStateChanged.java | 2 +- .../api/events/GrandExchangeOfferChanged.java | 9 +- .../runelite/api/events/GraphicChanged.java | 24 + .../api/events/GraphicsObjectCreated.java | 4 +- .../api/events/GroundObjectChanged.java | 2 +- .../api/events/GroundObjectDespawned.java | 2 +- .../api/events/GroundObjectSpawned.java | 2 +- .../runelite/api/events/HitsplatApplied.java | 2 +- .../api/events/InteractingChanged.java | 30 +- .../api/events/ItemContainerChanged.java | 6 +- .../runelite/api/events/ItemDespawned.java | 7 +- .../api/events/ItemQuantityChanged.java | 11 +- .../net/runelite/api/events/ItemSpawned.java | 7 +- .../api/events/NameableNameChanged.java | 4 +- .../net/runelite/api/events/NpcChanged.java | 7 +- .../net/runelite/api/events/NpcDespawned.java | 4 +- .../net/runelite/api/events/NpcSpawned.java | 4 +- .../api/events/OverheadTextChanged.java | 33 +- .../runelite/api/events/PlayerDespawned.java | 4 +- .../runelite/api/events/PlayerSpawned.java | 4 +- .../runelite/api/events/PostHealthBar.java | 2 +- .../runelite/api/events/ProjectileMoved.java | 2 +- .../runelite/api/events/RemovedFriend.java | 2 +- .../api/events/ScriptCallbackEvent.java | 2 +- .../runelite/api/events/ScriptPostFired.java | 2 +- .../runelite/api/events/ScriptPreFired.java | 8 +- .../api/events/SoundEffectPlayed.java | 2 - .../net/runelite/api/events/StatChanged.java | 8 +- .../api/events/VarClientIntChanged.java | 3 +- .../api/events/VarClientStrChanged.java | 3 +- .../runelite/api/events/VolumeChanged.java | 4 +- .../api/events/WallObjectChanged.java | 2 +- .../api/events/WallObjectDespawned.java | 2 +- .../api/events/WallObjectSpawned.java | 2 +- .../net/runelite/api/events/WorldChanged.java | 2 +- .../runelite/api/events/WorldListLoad.java | 74 +- runelite-client/runelite-client.gradle.kts | 29 +- .../client/graphics/ModelOutlineRenderer.java | 1138 ----------------- .../java/net/runelite/client/RuneLite.java | 2 +- .../plugins/OPRSExternalBasePluginLoader.java | 24 + .../plugins/OPRSExternalClassLoader.java | 142 ++ .../plugins/OPRSExternalJarPluginLoader.java | 26 + .../OPRSExternalPf4jPluginManager.java | 6 +- .../plugins/OPRSExternalPluginManager.java | 2 +- .../client/plugins/PluginManager.java | 64 +- .../client/plugins/config/ConfigPanel.java | 8 +- .../plugins/config/PluginToggleButton.java | 31 +- .../net/runelite/client/rs/ClientLoader.java | 2 +- .../net/runelite/client/task/Scheduler.java | 63 - .../client/ui/components/ToggleButton.java | 78 ++ .../runelite/client/ui/skin/ObsidianSkin.java | 5 +- .../net/runelite/client/util/OSXUtil.java | 11 +- .../net/runelite/client/util/SwingUtil.java | 3 +- .../client/ui/components/switcher_on.png | Bin 0 -> 368 bytes runelite-jshell/runelite-jshell.gradle.kts | 4 +- runelite-mixins/runelite-mixins.gradle.kts | 4 +- .../net/runelite/mixins/ScriptVMMixin.java | 5 +- .../net/runelite/mixins/SoundEffectMixin.java | 10 - ...unelite-script-assembler-plugin.gradle.kts | 4 +- runescape-client/runescape-client.gradle.kts | 5 +- .../java/netscape/javascript/JSException.java | 60 + .../java/netscape/javascript/JSObject.java | 189 +++ .../netscape/javascript/JSObjectProvider.java | 20 + wiki-scraper/wiki-scraper.gradle.kts | 8 +- 85 files changed, 894 insertions(+), 1448 deletions(-) delete mode 100644 runelite-client/src/main/java/com/openosrs/client/graphics/ModelOutlineRenderer.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalBasePluginLoader.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalClassLoader.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalJarPluginLoader.java create mode 100644 runelite-client/src/main/java/net/runelite/client/ui/components/ToggleButton.java create mode 100644 runelite-client/src/main/resources/net/runelite/client/ui/components/switcher_on.png create mode 100644 runescape-client/src/main/java/netscape/javascript/JSException.java create mode 100644 runescape-client/src/main/java/netscape/javascript/JSObject.java create mode 100644 runescape-client/src/main/java/netscape/javascript/JSObjectProvider.java diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 921e78f596..4f88e9d411 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -27,7 +27,7 @@ object ProjectVersions { const val launcherVersion = "2.2.0" const val rlVersion = "1.7.24" - const val openosrsVersion = "4.10.0" + const val openosrsVersion = "4.11.0" const val rsversion = 199 const val cacheversion = 165 diff --git a/cache/cache.gradle.kts b/cache/cache.gradle.kts index 9061346bcc..686be529e8 100644 --- a/cache/cache.gradle.kts +++ b/cache/cache.gradle.kts @@ -38,14 +38,14 @@ dependencies { compileOnly(group = "org.projectlombok", name = "lombok", version = ProjectVersions.lombokVersion) - implementation(group = "com.google.code.gson", name = "gson", version = "2.8.6") - implementation(group = "com.google.guava", name = "guava", version = "30.0-jre") + implementation(group = "com.google.code.gson", name = "gson", version = "2.8.5") + implementation(group = "com.google.guava", name = "guava", version = "30.1.1-jre") implementation(group = "commons-cli", name = "commons-cli", version = "1.4") implementation(group = "io.netty", name = "netty-buffer", version = "4.1.54.Final") - implementation(group = "com.squareup.okhttp3", name = "okhttp", version = "4.9.0") + implementation(group = "com.squareup.okhttp3", name = "okhttp", version = "4.9.1") implementation(group = "org.antlr", name = "antlr4-runtime", version = "4.8-1") - implementation(group = "org.apache.commons", name = "commons-compress", version = "1.20") - implementation(group = "org.slf4j", name = "slf4j-api", version = "1.7.30") + implementation(group = "org.apache.commons", name = "commons-compress", version = "1.21") + implementation(group = "org.slf4j", name = "slf4j-api", version = "1.7.32") testAnnotationProcessor(group = "org.projectlombok", name = "lombok", version = ProjectVersions.lombokVersion) diff --git a/deobfuscator/deobfuscator.gradle.kts b/deobfuscator/deobfuscator.gradle.kts index 57c0ad772a..0da4c139ef 100644 --- a/deobfuscator/deobfuscator.gradle.kts +++ b/deobfuscator/deobfuscator.gradle.kts @@ -40,15 +40,15 @@ dependencies { implementation(project(":runelite-api")) implementation(project(":runescape-api")) implementation(project(":cache")) - implementation(group = "org.jetbrains", name = "annotations", version = "20.1.0") + implementation(group = "org.jetbrains", name = "annotations", version = "22.0.0") implementation(group = "org.ow2.asm", name = "asm", version = "9.0") implementation(group = "org.ow2.asm", name = "asm-util", version = "9.0") implementation(group = "net.runelite", name = "fernflower", version = "07082019") implementation(group = "com.google.code.gson", name = "gson", version = "2.8.6") - implementation(group = "com.google.guava", name = "guava", version = "23.2-jre") - implementation(group = "org.slf4j", name = "slf4j-api", version = "1.7.12") + implementation(group = "com.google.guava", name = "guava", version = "30.1.1-jre") + implementation(group = "org.slf4j", name = "slf4j-api", version = "1.7.32") - runtimeOnly(group = "org.slf4j", name = "slf4j-simple", version = "1.7.12") + runtimeOnly(group = "org.slf4j", name = "slf4j-simple", version = "1.7.32") testImplementation(deobjars) testImplementation(group = "junit", name = "junit", version = "4.12") diff --git a/http-api/http-api.gradle.kts b/http-api/http-api.gradle.kts index e3ce785847..436fa78f13 100644 --- a/http-api/http-api.gradle.kts +++ b/http-api/http-api.gradle.kts @@ -34,14 +34,14 @@ dependencies { implementation(project(":runelite-api")) implementation(group = "com.google.code.gson", name = "gson", version = "2.8.5") - implementation(group = "com.google.guava", name = "guava", version = "23.2-jre") - implementation(group = "com.squareup.okhttp3", name = "okhttp", version = "3.7.0") - implementation(group = "org.apache.commons", name = "commons-csv", version = "1.4") - implementation(group = "org.slf4j", name = "slf4j-api", version = "1.7.12") + implementation(group = "com.google.guava", name = "guava", version = "30.1.1-jre") + implementation(group = "com.squareup.okhttp3", name = "okhttp", version = "4.9.1") + implementation(group = "org.apache.commons", name = "commons-csv", version = "1.9.0") + implementation(group = "org.slf4j", name = "slf4j-api", version = "1.7.32") - testImplementation(group = "com.squareup.okhttp3", name = "mockwebserver", version = "4.9.0") + testImplementation(group = "com.squareup.okhttp3", name = "mockwebserver", version = "4.9.1") testImplementation(group = "junit", name = "junit", version = "4.12") - testImplementation(group = "org.slf4j", name = "slf4j-simple", version = "1.7.12") + testImplementation(group = "org.slf4j", name = "slf4j-simple", version = "1.7.32") } tasks { diff --git a/injector/injector.gradle.kts b/injector/injector.gradle.kts index 7b2943edfb..66484a6950 100644 --- a/injector/injector.gradle.kts +++ b/injector/injector.gradle.kts @@ -24,11 +24,11 @@ dependencies { implementation(project(":runescape-client")) implementation(project(":runelite-mixins")) - implementation(group = "org.ow2.asm", name = "asm", version = "8.0.1") - implementation(group = "org.ow2.asm", name = "asm-util", version = "8.0.1") - implementation(group = "org.jetbrains", name = "annotations", version = "19.0.0") - implementation(group = "com.google.guava", name = "guava", version = "23.2-jre") - implementation(group = "net.sf.jopt-simple", name = "jopt-simple", version = "5.0.1") + implementation(group = "org.ow2.asm", name = "asm", version = "9.0") + implementation(group = "org.ow2.asm", name = "asm-util", version = "9.0") + implementation(group = "org.jetbrains", name = "annotations", version = "22.0.0") + implementation(group = "com.google.guava", name = "guava", version = "30.1.1-jre") + implementation(group = "net.sf.jopt-simple", name = "jopt-simple", version = "5.0.4") } tasks.register("inject") { diff --git a/injector/src/main/java/com/openosrs/injector/injection/InjectData.java b/injector/src/main/java/com/openosrs/injector/injection/InjectData.java index 378bc42d38..be301c7324 100644 --- a/injector/src/main/java/com/openosrs/injector/injection/InjectData.java +++ b/injector/src/main/java/com/openosrs/injector/injection/InjectData.java @@ -63,7 +63,7 @@ public abstract class InjectData for (final ClassFile deobClass : deobfuscated) { - if (deobClass.getName().startsWith("net/runelite/")) + if (deobClass.getName().startsWith("net/runelite/") || deobClass.getName().startsWith("netscape")) { continue; } diff --git a/runelite-api/runelite-api.gradle.kts b/runelite-api/runelite-api.gradle.kts index 615c7fe92c..56b6cd4122 100644 --- a/runelite-api/runelite-api.gradle.kts +++ b/runelite-api/runelite-api.gradle.kts @@ -31,9 +31,9 @@ dependencies { compileOnly(group = "org.projectlombok", name = "lombok", version = ProjectVersions.lombokVersion) implementation(group = "com.google.code.findbugs", name = "jsr305", version = "3.0.2") - implementation(group = "com.google.guava", name = "guava", version = "23.2-jre") - implementation(group = "org.apache.commons", name = "commons-text", version = "1.2") - implementation(group = "org.slf4j", name = "slf4j-api", version = "1.7.12") + implementation(group = "com.google.guava", name = "guava", version = "30.1.1-jre") + implementation(group = "org.apache.commons", name = "commons-text", version = "1.9") + implementation(group = "org.slf4j", name = "slf4j-api", version = "1.7.32") testImplementation(group = "junit", name = "junit", version = "4.12") } \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/events/ActorDeath.java b/runelite-api/src/main/java/net/runelite/api/events/ActorDeath.java index b6e4588c0c..e721be6eab 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/ActorDeath.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ActorDeath.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, HSJ + * Copyright (c) 2018, Matthew Steglinski * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -33,5 +33,5 @@ import net.runelite.api.Actor; @Value public class ActorDeath { - Actor actor; + private final Actor actor; } diff --git a/runelite-api/src/main/java/net/runelite/api/events/AnimationChanged.java b/runelite-api/src/main/java/net/runelite/api/events/AnimationChanged.java index 5cbc26a97b..fe3acab950 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/AnimationChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/AnimationChanged.java @@ -1,7 +1,31 @@ +/* + * Copyright (c) 2016-2017, Abel Briggs + * 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.events; -import net.runelite.api.Actor; import lombok.Data; +import net.runelite.api.Actor; /** * An event where the {@link Actor} has changed animations. diff --git a/runelite-api/src/main/java/net/runelite/api/events/AreaSoundEffectPlayed.java b/runelite-api/src/main/java/net/runelite/api/events/AreaSoundEffectPlayed.java index 4114cb22ca..e0f4c1fe28 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/AreaSoundEffectPlayed.java +++ b/runelite-api/src/main/java/net/runelite/api/events/AreaSoundEffectPlayed.java @@ -33,7 +33,6 @@ public class AreaSoundEffectPlayed { @Nullable private final Actor source; - private int soundId; private int sceneX; private int sceneY; diff --git a/runelite-api/src/main/java/net/runelite/api/events/ChatMessage.java b/runelite-api/src/main/java/net/runelite/api/events/ChatMessage.java index fccf5a98d8..91ddf32ed2 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/ChatMessage.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ChatMessage.java @@ -24,11 +24,11 @@ */ package net.runelite.api.events; -import net.runelite.api.ChatMessageType; -import net.runelite.api.MessageNode; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import net.runelite.api.ChatMessageType; +import net.runelite.api.MessageNode; /** * An event where a new chat message is received. diff --git a/runelite-api/src/main/java/net/runelite/api/events/CommandExecuted.java b/runelite-api/src/main/java/net/runelite/api/events/CommandExecuted.java index fe524a7e76..d0dfae5ff2 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/CommandExecuted.java +++ b/runelite-api/src/main/java/net/runelite/api/events/CommandExecuted.java @@ -47,9 +47,9 @@ public class CommandExecuted /** * The name of the command entered. */ - String command; + private String command; /** * The command arguments that have been entered. */ - String[] arguments; + private String[] arguments; } diff --git a/runelite-api/src/main/java/net/runelite/api/events/DecorativeObjectChanged.java b/runelite-api/src/main/java/net/runelite/api/events/DecorativeObjectChanged.java index a18683d7b4..661711e566 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/DecorativeObjectChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/DecorativeObjectChanged.java @@ -24,9 +24,9 @@ */ package net.runelite.api.events; +import lombok.Data; import net.runelite.api.DecorativeObject; import net.runelite.api.Tile; -import lombok.Data; /** * An event where the {@link DecorativeObject} attached to a {@link Tile} diff --git a/runelite-api/src/main/java/net/runelite/api/events/DecorativeObjectDespawned.java b/runelite-api/src/main/java/net/runelite/api/events/DecorativeObjectDespawned.java index 94c06488c7..77152ec9c6 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/DecorativeObjectDespawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/DecorativeObjectDespawned.java @@ -24,9 +24,9 @@ */ package net.runelite.api.events; +import lombok.Data; import net.runelite.api.DecorativeObject; import net.runelite.api.Tile; -import lombok.Data; /** * An event where the {@link DecorativeObject} attached to a {@link Tile} diff --git a/runelite-api/src/main/java/net/runelite/api/events/DecorativeObjectSpawned.java b/runelite-api/src/main/java/net/runelite/api/events/DecorativeObjectSpawned.java index fe8d17862f..b89806418e 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/DecorativeObjectSpawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/DecorativeObjectSpawned.java @@ -24,9 +24,9 @@ */ package net.runelite.api.events; +import lombok.Data; import net.runelite.api.DecorativeObject; import net.runelite.api.Tile; -import lombok.Data; /** * An event where a {@link DecorativeObject} is attached to a {@link Tile}. diff --git a/runelite-api/src/main/java/net/runelite/api/events/FakeXpDrop.java b/runelite-api/src/main/java/net/runelite/api/events/FakeXpDrop.java index 07a98b0eb4..67cbeea22d 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/FakeXpDrop.java +++ b/runelite-api/src/main/java/net/runelite/api/events/FakeXpDrop.java @@ -30,6 +30,6 @@ import net.runelite.api.Skill; @Value public class FakeXpDrop { - Skill skill; - int xp; + private final Skill skill; + private final int xp; } diff --git a/runelite-api/src/main/java/net/runelite/api/events/FriendsChatChanged.java b/runelite-api/src/main/java/net/runelite/api/events/FriendsChatChanged.java index 271eb83e49..0bab986a4d 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/FriendsChatChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/FriendsChatChanged.java @@ -35,5 +35,5 @@ public class FriendsChatChanged /** * Whether or not the client is now in a friends chat. */ - boolean joined; + private boolean joined; } diff --git a/runelite-api/src/main/java/net/runelite/api/events/FriendsChatMemberJoined.java b/runelite-api/src/main/java/net/runelite/api/events/FriendsChatMemberJoined.java index e5a0cdb8a0..cab17bd556 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/FriendsChatMemberJoined.java +++ b/runelite-api/src/main/java/net/runelite/api/events/FriendsChatMemberJoined.java @@ -33,5 +33,5 @@ public class FriendsChatMemberJoined /** * The member that joined */ - FriendsChatMember member; + private FriendsChatMember member; } diff --git a/runelite-api/src/main/java/net/runelite/api/events/FriendsChatMemberLeft.java b/runelite-api/src/main/java/net/runelite/api/events/FriendsChatMemberLeft.java index 0970b762c8..a5ed698988 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/FriendsChatMemberLeft.java +++ b/runelite-api/src/main/java/net/runelite/api/events/FriendsChatMemberLeft.java @@ -33,5 +33,5 @@ public class FriendsChatMemberLeft /** * The member that left */ - FriendsChatMember member; + private FriendsChatMember member; } diff --git a/runelite-api/src/main/java/net/runelite/api/events/GameObjectDespawned.java b/runelite-api/src/main/java/net/runelite/api/events/GameObjectDespawned.java index 5d2e9fad1a..ed4280918a 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/GameObjectDespawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/GameObjectDespawned.java @@ -24,9 +24,9 @@ */ package net.runelite.api.events; +import lombok.Data; import net.runelite.api.GameObject; import net.runelite.api.Tile; -import lombok.Data; /** * An event where a {@link GameObject} on a {@link Tile} is removed. diff --git a/runelite-api/src/main/java/net/runelite/api/events/GameObjectSpawned.java b/runelite-api/src/main/java/net/runelite/api/events/GameObjectSpawned.java index dc9fdbdd24..a8b09298a5 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/GameObjectSpawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/GameObjectSpawned.java @@ -37,9 +37,9 @@ public class GameObjectSpawned /** * The affected tile. */ - Tile tile; + private Tile tile; /** * The newly spawned game object. */ - GameObject gameObject; + private GameObject gameObject; } diff --git a/runelite-api/src/main/java/net/runelite/api/events/GameStateChanged.java b/runelite-api/src/main/java/net/runelite/api/events/GameStateChanged.java index 2a0b61fc40..f62ee5547e 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/GameStateChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/GameStateChanged.java @@ -24,8 +24,8 @@ */ package net.runelite.api.events; -import net.runelite.api.GameState; import lombok.Data; +import net.runelite.api.GameState; /** * An event where the clients game state has changed. diff --git a/runelite-api/src/main/java/net/runelite/api/events/GrandExchangeOfferChanged.java b/runelite-api/src/main/java/net/runelite/api/events/GrandExchangeOfferChanged.java index 88e4aa1fac..8a7ff3ffc0 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/GrandExchangeOfferChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/GrandExchangeOfferChanged.java @@ -24,20 +24,21 @@ */ package net.runelite.api.events; -import net.runelite.api.GrandExchangeOffer; import lombok.Data; +import net.runelite.api.GrandExchangeOffer; +import net.runelite.api.GrandExchangeOfferState; /** - * An event where a {GrandExchangeOffer} has been updated with + * An event where a {@link GrandExchangeOffer} has been updated with * new information. *

* When the client initially logs in, this event is called for all grand - * exchange slots with the {GrandExchangeOfferState#EMPTY} state, + * exchange slots with the {@link GrandExchangeOfferState#EMPTY} state, * regardless of whether any slots have offers. Once the exchange is * initialized, the client then updates any offers with items as it * receives information from the server. *

- * See {GrandExchangeOfferState} for potential states an offer + * See {@link GrandExchangeOfferState} for potential states an offer * can change into. */ @Data diff --git a/runelite-api/src/main/java/net/runelite/api/events/GraphicChanged.java b/runelite-api/src/main/java/net/runelite/api/events/GraphicChanged.java index 775487c6d0..9a50a5671c 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/GraphicChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/GraphicChanged.java @@ -1,3 +1,27 @@ +/* + * Copyright (c) 2018, Adam + * 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.events; import lombok.Data; diff --git a/runelite-api/src/main/java/net/runelite/api/events/GraphicsObjectCreated.java b/runelite-api/src/main/java/net/runelite/api/events/GraphicsObjectCreated.java index 280cc77624..5af54e0660 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/GraphicsObjectCreated.java +++ b/runelite-api/src/main/java/net/runelite/api/events/GraphicsObjectCreated.java @@ -24,8 +24,8 @@ */ package net.runelite.api.events; -import net.runelite.api.GraphicsObject; import lombok.Value; +import net.runelite.api.GraphicsObject; /** * An event where a new {@link GraphicsObject} has been created. @@ -36,5 +36,5 @@ public class GraphicsObjectCreated /** * The newly created graphics object. */ - GraphicsObject graphicsObject; + private final GraphicsObject graphicsObject; } diff --git a/runelite-api/src/main/java/net/runelite/api/events/GroundObjectChanged.java b/runelite-api/src/main/java/net/runelite/api/events/GroundObjectChanged.java index 8fa97ae503..093948306b 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/GroundObjectChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/GroundObjectChanged.java @@ -24,9 +24,9 @@ */ package net.runelite.api.events; +import lombok.Data; import net.runelite.api.GroundObject; import net.runelite.api.Tile; -import lombok.Data; /** * An event where the {@link GroundObject} on a {@link Tile} has been changed. diff --git a/runelite-api/src/main/java/net/runelite/api/events/GroundObjectDespawned.java b/runelite-api/src/main/java/net/runelite/api/events/GroundObjectDespawned.java index 54bb6dfbe0..b77d1bf579 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/GroundObjectDespawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/GroundObjectDespawned.java @@ -24,9 +24,9 @@ */ package net.runelite.api.events; +import lombok.Data; import net.runelite.api.GroundObject; import net.runelite.api.Tile; -import lombok.Data; /** * An event where a {@link GroundObject} on a {@link Tile} has been removed. diff --git a/runelite-api/src/main/java/net/runelite/api/events/GroundObjectSpawned.java b/runelite-api/src/main/java/net/runelite/api/events/GroundObjectSpawned.java index af1f15ab6f..1e3d6597ff 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/GroundObjectSpawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/GroundObjectSpawned.java @@ -24,9 +24,9 @@ */ package net.runelite.api.events; +import lombok.Data; import net.runelite.api.GroundObject; import net.runelite.api.Tile; -import lombok.Data; /** * An event where a {@link GroundObject} is added to a {@link Tile}. diff --git a/runelite-api/src/main/java/net/runelite/api/events/HitsplatApplied.java b/runelite-api/src/main/java/net/runelite/api/events/HitsplatApplied.java index f96a0f08d7..705667ae32 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/HitsplatApplied.java +++ b/runelite-api/src/main/java/net/runelite/api/events/HitsplatApplied.java @@ -24,9 +24,9 @@ */ package net.runelite.api.events; +import lombok.Data; import net.runelite.api.Actor; import net.runelite.api.Hitsplat; -import lombok.Data; /** * An event called when a {@link Hitsplat} is processed on an {@link Actor}. diff --git a/runelite-api/src/main/java/net/runelite/api/events/InteractingChanged.java b/runelite-api/src/main/java/net/runelite/api/events/InteractingChanged.java index ef1da8baca..fdfe0d1272 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/InteractingChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/InteractingChanged.java @@ -1,7 +1,31 @@ +/* + * Copyright (c) 2018, Adam + * 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.events; -import net.runelite.api.Actor; import lombok.Value; +import net.runelite.api.Actor; /** * An event called when the actor an actor is interacting with changes @@ -9,10 +33,10 @@ import lombok.Value; @Value public class InteractingChanged { - Actor source; + private final Actor source; /** * Target actor, may be null */ - Actor target; + private final Actor target; } diff --git a/runelite-api/src/main/java/net/runelite/api/events/ItemContainerChanged.java b/runelite-api/src/main/java/net/runelite/api/events/ItemContainerChanged.java index 5a5ddef151..f2ff89a679 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/ItemContainerChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ItemContainerChanged.java @@ -24,8 +24,8 @@ */ package net.runelite.api.events; -import net.runelite.api.ItemContainer; import lombok.Value; +import net.runelite.api.ItemContainer; /** * An event called whenever the stack size of an {@link net.runelite.api.Item} @@ -44,10 +44,10 @@ public class ItemContainerChanged /** * The modified container's ID. */ - int containerId; + private final int containerId; /** * The modified item container. */ - ItemContainer itemContainer; + private final ItemContainer itemContainer; } diff --git a/runelite-api/src/main/java/net/runelite/api/events/ItemDespawned.java b/runelite-api/src/main/java/net/runelite/api/events/ItemDespawned.java index 22082bfedc..3b25a15439 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/ItemDespawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ItemDespawned.java @@ -25,9 +25,8 @@ package net.runelite.api.events; import lombok.Value; -import net.runelite.api.TileItem; import net.runelite.api.Tile; -import lombok.Value; +import net.runelite.api.TileItem; /** * Called when an item pile despawns from the ground. When the client loads a new scene, @@ -36,6 +35,6 @@ import lombok.Value; @Value public class ItemDespawned { - Tile tile; - TileItem item; + private final Tile tile; + private final TileItem item; } diff --git a/runelite-api/src/main/java/net/runelite/api/events/ItemQuantityChanged.java b/runelite-api/src/main/java/net/runelite/api/events/ItemQuantityChanged.java index 7971da5f12..e95b2f83eb 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/ItemQuantityChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ItemQuantityChanged.java @@ -25,9 +25,8 @@ package net.runelite.api.events; import lombok.Value; -import net.runelite.api.TileItem; import net.runelite.api.Tile; -import lombok.Value; +import net.runelite.api.TileItem; /** * Called when the quantity of an item pile changes. @@ -35,8 +34,8 @@ import lombok.Value; @Value public class ItemQuantityChanged { - TileItem item; - Tile tile; - int oldQuantity; - int newQuantity; + private final TileItem item; + private final Tile tile; + private final int oldQuantity; + private final int newQuantity; } diff --git a/runelite-api/src/main/java/net/runelite/api/events/ItemSpawned.java b/runelite-api/src/main/java/net/runelite/api/events/ItemSpawned.java index af3c034abc..e7726fc111 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/ItemSpawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ItemSpawned.java @@ -25,9 +25,8 @@ package net.runelite.api.events; import lombok.Value; -import net.runelite.api.TileItem; import net.runelite.api.Tile; -import lombok.Value; +import net.runelite.api.TileItem; /** * Called when an item pile spawns on the ground. When the client loads a new scene, @@ -36,6 +35,6 @@ import lombok.Value; @Value public class ItemSpawned { - Tile tile; - TileItem item; + private final Tile tile; + private final TileItem item; } diff --git a/runelite-api/src/main/java/net/runelite/api/events/NameableNameChanged.java b/runelite-api/src/main/java/net/runelite/api/events/NameableNameChanged.java index 18b106ec9f..501a1b7931 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/NameableNameChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/NameableNameChanged.java @@ -24,8 +24,8 @@ */ package net.runelite.api.events; -import net.runelite.api.Nameable; import lombok.Value; +import net.runelite.api.Nameable; /** * An event where a {@link Nameable} has had their name changed. @@ -36,5 +36,5 @@ public class NameableNameChanged /** * The nameable that changed names. */ - Nameable nameable; + private final Nameable nameable; } diff --git a/runelite-api/src/main/java/net/runelite/api/events/NpcChanged.java b/runelite-api/src/main/java/net/runelite/api/events/NpcChanged.java index f01da68ae2..7abdb731dd 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/NpcChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/NpcChanged.java @@ -37,11 +37,10 @@ public class NpcChanged /** * The NPC of which the composition changed. */ - NPC npc; - + private final NPC npc; /** * The old composition of the NPC */ - NPCComposition old; -} \ No newline at end of file + private final NPCComposition old; +} diff --git a/runelite-api/src/main/java/net/runelite/api/events/NpcDespawned.java b/runelite-api/src/main/java/net/runelite/api/events/NpcDespawned.java index 9d2fed4200..0f6399fa4a 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/NpcDespawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/NpcDespawned.java @@ -24,9 +24,9 @@ */ package net.runelite.api.events; +import lombok.Value; import net.runelite.api.Actor; import net.runelite.api.NPC; -import lombok.Value; /** * An event where an {@link NPC} has despawned. @@ -37,7 +37,7 @@ public class NpcDespawned /** * The despawned NPC. */ - NPC npc; + private final NPC npc; public Actor getActor() { diff --git a/runelite-api/src/main/java/net/runelite/api/events/NpcSpawned.java b/runelite-api/src/main/java/net/runelite/api/events/NpcSpawned.java index aab89fffb8..2101bdd4fb 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/NpcSpawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/NpcSpawned.java @@ -24,9 +24,9 @@ */ package net.runelite.api.events; +import lombok.Value; import net.runelite.api.Actor; import net.runelite.api.NPC; -import lombok.Value; /** * An event where an {@link NPC} has spawned. @@ -37,7 +37,7 @@ public class NpcSpawned /** * The spawned NPC. */ - NPC npc; + private final NPC npc; public Actor getActor() { diff --git a/runelite-api/src/main/java/net/runelite/api/events/OverheadTextChanged.java b/runelite-api/src/main/java/net/runelite/api/events/OverheadTextChanged.java index 9e77178776..a366eb297a 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/OverheadTextChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/OverheadTextChanged.java @@ -1,12 +1,39 @@ +/* + * Copyright (c) 2018, Magic fTail + * 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.events; -import net.runelite.api.Actor; import lombok.Value; +import net.runelite.api.Actor; +/** + * Event fired when an actors overhead text is changed. + */ @Value public class OverheadTextChanged { - Actor actor; + private final Actor actor; - String overheadText; + private final String overheadText; } \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/events/PlayerDespawned.java b/runelite-api/src/main/java/net/runelite/api/events/PlayerDespawned.java index ed5f2a9057..9e38311069 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/PlayerDespawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/PlayerDespawned.java @@ -24,9 +24,9 @@ */ package net.runelite.api.events; +import lombok.Value; import net.runelite.api.Actor; import net.runelite.api.Player; -import lombok.Value; /** * An event where a {@link Player} has despawned. @@ -39,7 +39,7 @@ public class PlayerDespawned /** * The despawned player. */ - Player player; + private final Player player; public Actor getActor() { diff --git a/runelite-api/src/main/java/net/runelite/api/events/PlayerSpawned.java b/runelite-api/src/main/java/net/runelite/api/events/PlayerSpawned.java index 73e1932285..f730a0b652 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/PlayerSpawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/PlayerSpawned.java @@ -24,9 +24,9 @@ */ package net.runelite.api.events; +import lombok.Value; import net.runelite.api.Actor; import net.runelite.api.Player; -import lombok.Value; /** * An event where a {@link Player} has spawned. @@ -37,7 +37,7 @@ public class PlayerSpawned /** * The spawned player. */ - Player player; + private final Player player; public Actor getActor() { diff --git a/runelite-api/src/main/java/net/runelite/api/events/PostHealthBar.java b/runelite-api/src/main/java/net/runelite/api/events/PostHealthBar.java index c8896ff945..01085f05bb 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/PostHealthBar.java +++ b/runelite-api/src/main/java/net/runelite/api/events/PostHealthBar.java @@ -24,8 +24,8 @@ */ package net.runelite.api.events; -import net.runelite.api.HealthBar; import lombok.Data; +import net.runelite.api.HealthBar; @Data public class PostHealthBar diff --git a/runelite-api/src/main/java/net/runelite/api/events/ProjectileMoved.java b/runelite-api/src/main/java/net/runelite/api/events/ProjectileMoved.java index 70d73d7026..6d9a1c281f 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/ProjectileMoved.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ProjectileMoved.java @@ -24,9 +24,9 @@ */ package net.runelite.api.events; +import lombok.Data; import net.runelite.api.Projectile; import net.runelite.api.coords.LocalPoint; -import lombok.Data; /** * An event called whenever a {@link Projectile} has moved towards a point. diff --git a/runelite-api/src/main/java/net/runelite/api/events/RemovedFriend.java b/runelite-api/src/main/java/net/runelite/api/events/RemovedFriend.java index 3d109ef982..a4bed3e95f 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/RemovedFriend.java +++ b/runelite-api/src/main/java/net/runelite/api/events/RemovedFriend.java @@ -37,4 +37,4 @@ public class RemovedFriend * The removed friend or ignore entry */ private final Nameable nameable; -} \ No newline at end of file +} diff --git a/runelite-api/src/main/java/net/runelite/api/events/ScriptCallbackEvent.java b/runelite-api/src/main/java/net/runelite/api/events/ScriptCallbackEvent.java index 716f7bbe90..d13b03ea8a 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/ScriptCallbackEvent.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ScriptCallbackEvent.java @@ -24,8 +24,8 @@ */ package net.runelite.api.events; -import net.runelite.api.Script; import lombok.Data; +import net.runelite.api.Script; /** * A callback from a runelite_callback opcode in a cs2 diff --git a/runelite-api/src/main/java/net/runelite/api/events/ScriptPostFired.java b/runelite-api/src/main/java/net/runelite/api/events/ScriptPostFired.java index 55338bd87a..1337dcead1 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/ScriptPostFired.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ScriptPostFired.java @@ -35,5 +35,5 @@ public class ScriptPostFired /** * The script id of the invoked script */ - int scriptId; + private final int scriptId; } diff --git a/runelite-api/src/main/java/net/runelite/api/events/ScriptPreFired.java b/runelite-api/src/main/java/net/runelite/api/events/ScriptPreFired.java index f8e9549281..c509303784 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/ScriptPreFired.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ScriptPreFired.java @@ -24,22 +24,22 @@ */ package net.runelite.api.events; -import lombok.Value; +import lombok.Data; import net.runelite.api.ScriptEvent; /** * An event that is fired before the designated script is ran */ -@Value +@Data public class ScriptPreFired { /** * The script id of the invoked script */ - int scriptId; + private final int scriptId; /** * The input of the script invoke, this will be null unless it is the root script */ - ScriptEvent scriptEvent; + private ScriptEvent scriptEvent; } diff --git a/runelite-api/src/main/java/net/runelite/api/events/SoundEffectPlayed.java b/runelite-api/src/main/java/net/runelite/api/events/SoundEffectPlayed.java index 7c111d1d8d..06002f717a 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/SoundEffectPlayed.java +++ b/runelite-api/src/main/java/net/runelite/api/events/SoundEffectPlayed.java @@ -33,10 +33,8 @@ public class SoundEffectPlayed { @Nullable private final Actor source; - private int soundId; private int delay; - private int npcid; private boolean consumed; diff --git a/runelite-api/src/main/java/net/runelite/api/events/StatChanged.java b/runelite-api/src/main/java/net/runelite/api/events/StatChanged.java index 809636f446..b5fd373731 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/StatChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/StatChanged.java @@ -33,8 +33,8 @@ import net.runelite.api.Skill; @Value public class StatChanged { - Skill skill; - int xp; - int level; - int boostedLevel; + private final Skill skill; + private final int xp; + private final int level; + private final int boostedLevel; } diff --git a/runelite-api/src/main/java/net/runelite/api/events/VarClientIntChanged.java b/runelite-api/src/main/java/net/runelite/api/events/VarClientIntChanged.java index 521e8a62ae..911befbf27 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/VarClientIntChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/VarClientIntChanged.java @@ -28,11 +28,10 @@ package net.runelite.api.events; import lombok.Value; /** - * An event where a client int var has changed. * @see net.runelite.api.VarClientInt */ @Value public class VarClientIntChanged { - int index; + private int index; } diff --git a/runelite-api/src/main/java/net/runelite/api/events/VarClientStrChanged.java b/runelite-api/src/main/java/net/runelite/api/events/VarClientStrChanged.java index 2fff4da47e..5a68f5f3f9 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/VarClientStrChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/VarClientStrChanged.java @@ -28,11 +28,10 @@ package net.runelite.api.events; import lombok.Value; /** - * An event where a client var string has changed. * @see net.runelite.api.VarClientStr */ @Value public class VarClientStrChanged { - int index; + private int index; } diff --git a/runelite-api/src/main/java/net/runelite/api/events/VolumeChanged.java b/runelite-api/src/main/java/net/runelite/api/events/VolumeChanged.java index 30e87b9c79..8af4ee481b 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/VolumeChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/VolumeChanged.java @@ -37,5 +37,5 @@ public class VolumeChanged AREA } - Type type; -} \ No newline at end of file + private final Type type; +} diff --git a/runelite-api/src/main/java/net/runelite/api/events/WallObjectChanged.java b/runelite-api/src/main/java/net/runelite/api/events/WallObjectChanged.java index bea7686602..9d20cf3b11 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/WallObjectChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/WallObjectChanged.java @@ -24,9 +24,9 @@ */ package net.runelite.api.events; +import lombok.Data; import net.runelite.api.Tile; import net.runelite.api.WallObject; -import lombok.Data; /** * An event where the {@link WallObject} of a {@link Tile} has been changed. diff --git a/runelite-api/src/main/java/net/runelite/api/events/WallObjectDespawned.java b/runelite-api/src/main/java/net/runelite/api/events/WallObjectDespawned.java index 6ac609a46f..b6a6a69b96 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/WallObjectDespawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/WallObjectDespawned.java @@ -24,9 +24,9 @@ */ package net.runelite.api.events; +import lombok.Data; import net.runelite.api.Tile; import net.runelite.api.WallObject; -import lombok.Data; /** * An event where a {@link WallObject} on a {@link Tile} has been removed. diff --git a/runelite-api/src/main/java/net/runelite/api/events/WallObjectSpawned.java b/runelite-api/src/main/java/net/runelite/api/events/WallObjectSpawned.java index dc22e07f7d..0a2feaa1d3 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/WallObjectSpawned.java +++ b/runelite-api/src/main/java/net/runelite/api/events/WallObjectSpawned.java @@ -24,9 +24,9 @@ */ package net.runelite.api.events; +import lombok.Data; import net.runelite.api.Tile; import net.runelite.api.WallObject; -import lombok.Data; /** * An event where a {@link WallObject} is added to a {@link Tile}. diff --git a/runelite-api/src/main/java/net/runelite/api/events/WorldChanged.java b/runelite-api/src/main/java/net/runelite/api/events/WorldChanged.java index 3b641e27e6..408114af1e 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/WorldChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/WorldChanged.java @@ -36,4 +36,4 @@ import net.runelite.api.Client; */ public class WorldChanged { -} \ No newline at end of file +} diff --git a/runelite-api/src/main/java/net/runelite/api/events/WorldListLoad.java b/runelite-api/src/main/java/net/runelite/api/events/WorldListLoad.java index c45f4cf1ae..f7cc8e243f 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/WorldListLoad.java +++ b/runelite-api/src/main/java/net/runelite/api/events/WorldListLoad.java @@ -1,37 +1,37 @@ -/* - * Copyright (c) 2018, Adam - * 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.events; - -import net.runelite.api.World; -import lombok.Value; - -/** - * Event when the world list is loaded for the world switcher - */ -@Value -public class WorldListLoad -{ - World[] worlds; -} +/* + * Copyright (c) 2018, Adam + * 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.events; + +import lombok.Value; +import net.runelite.api.World; + +/** + * Event when the world list is loaded for the world switcher + */ +@Value +public class WorldListLoad +{ + private final World[] worlds; +} diff --git a/runelite-client/runelite-client.gradle.kts b/runelite-client/runelite-client.gradle.kts index e49a905f86..529319f29f 100644 --- a/runelite-client/runelite-client.gradle.kts +++ b/runelite-client/runelite-client.gradle.kts @@ -44,7 +44,7 @@ description = "RuneLite Client" dependencies { annotationProcessor(group = "org.projectlombok", name = "lombok", version = ProjectVersions.lombokVersion) - annotationProcessor(group = "org.pf4j", name = "pf4j", version = "3.5.0") + annotationProcessor(group = "org.pf4j", name = "pf4j", version = "3.6.0") api(project(":runelite-api")) @@ -56,23 +56,24 @@ dependencies { implementation(project(":runelite-jshell")) implementation(group = "ch.qos.logback", name = "logback-classic", version = "1.2.3") implementation(group = "com.google.code.gson", name = "gson", version = "2.8.5") - implementation(group = "com.google.guava", name = "guava", version = "23.2-jre") - implementation(group = "com.google.inject", name = "guice", version = "4.1.0", classifier = "no_aop") + implementation(group = "com.google.guava", name = "guava", version = "30.1.1-jre") + implementation(group = "com.google.inject", name = "guice", version = "5.0.1") implementation(group = "com.h2database", name = "h2", version = "1.4.200") - implementation(group = "com.jakewharton.rxrelay3", name = "rxrelay", version = "3.0.0") - implementation(group = "com.squareup.okhttp3", name = "okhttp", version = "3.7.0") - implementation(group = "io.reactivex.rxjava3", name = "rxjava", version = "3.0.10") + implementation(group = "com.jakewharton.rxrelay3", name = "rxrelay", version = "3.0.1") + implementation(group = "com.squareup.okhttp3", name = "okhttp", version = "4.9.1") + implementation(group = "io.reactivex.rxjava3", name = "rxjava", version = "3.1.1") + implementation(group = "org.jgroups", name = "jgroups", version = "5.1.9.Final") implementation(group = "net.java.dev.jna", name = "jna", version = "5.9.0") - implementation(group = "org.jgroups", name = "jgroups", version = "5.0.4.Final") implementation(group = "net.java.dev.jna", name = "jna-platform", version = "5.9.0") implementation(group = "net.runelite", name = "discord", version = "1.4") - implementation(group = "net.runelite.pushingpixels", name = "substance", version = "8.0.02") - implementation(group = "net.sf.jopt-simple", name = "jopt-simple", version = "5.0.1") - implementation(group = "org.apache.commons", name = "commons-text", version = "1.2") + implementation(group = "org.pushing-pixels", name = "radiance-substance", version = "4.0.0") + implementation(group = "net.sf.jopt-simple", name = "jopt-simple", version = "5.0.4") + implementation(group = "org.madlonkay", name = "desktopsupport", version = "0.6.0") + implementation(group = "org.apache.commons", name = "commons-text", version = "1.9") implementation(group = "commons-io", name = "commons-io", version = "2.8.0") - implementation(group = "org.jetbrains", name = "annotations", version = "20.1.0") + implementation(group = "org.jetbrains", name = "annotations", version = "22.0.0") implementation(group = "com.github.zafarkhaja", name = "java-semver", version = "0.9.0") - implementation(group = "org.slf4j", name = "slf4j-api", version = "1.7.12") + implementation(group = "org.slf4j", name = "slf4j-api", version = "1.7.32") implementation(group = "org.pf4j", name = "pf4j", version = "3.6.0") { exclude(group = "org.slf4j") } @@ -105,8 +106,8 @@ dependencies { testImplementation(group = "junit", name = "junit", version = "4.12") testImplementation(group = "org.mockito", name = "mockito-core", version = "3.1.0") testImplementation(group = "org.mockito", name = "mockito-inline", version = "3.1.0") - testImplementation(group = "com.squareup.okhttp3", name = "mockwebserver", version = "3.7.0") - testImplementation(group = "org.slf4j", name = "slf4j-api", version = "1.7.12") + testImplementation(group = "com.squareup.okhttp3", name = "mockwebserver", version = "4.9.1") + testImplementation(group = "org.slf4j", name = "slf4j-api", version = "1.7.32") } fun formatDate(date: Date?) = with(date ?: Date()) { diff --git a/runelite-client/src/main/java/com/openosrs/client/graphics/ModelOutlineRenderer.java b/runelite-client/src/main/java/com/openosrs/client/graphics/ModelOutlineRenderer.java deleted file mode 100644 index 6e366ef7ad..0000000000 --- a/runelite-client/src/main/java/com/openosrs/client/graphics/ModelOutlineRenderer.java +++ /dev/null @@ -1,1138 +0,0 @@ -/* - * Copyright (c) 2018, Woox - * 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 com.openosrs.client.graphics; - -import com.google.inject.Inject; -import com.google.inject.Singleton; -import java.awt.Color; -import java.awt.image.BufferedImage; -import java.awt.image.DataBufferInt; -import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import lombok.RequiredArgsConstructor; -import lombok.Value; -import net.runelite.api.Client; -import net.runelite.api.DecorativeObject; -import net.runelite.api.GameObject; -import net.runelite.api.GroundObject; -import net.runelite.api.ItemLayer; -import net.runelite.api.MainBufferProvider; -import net.runelite.api.Model; -import net.runelite.api.NPC; -import net.runelite.api.NPCComposition; -import net.runelite.api.Perspective; -import net.runelite.api.Player; -import net.runelite.api.Renderable; -import net.runelite.api.TileObject; -import net.runelite.api.WallObject; -import net.runelite.api.coords.LocalPoint; -import net.runelite.client.task.Schedule; -import net.runelite.client.task.Scheduler; - -@Deprecated(forRemoval = true, since = "4.9.2") -@Singleton -public class ModelOutlineRenderer -{ - /* - * This class doesn't really "need" static variables, but they are - * static for performance reasons. Arrays are kept outside methods - * to avoid frequent big allocations. Arrays should mostly be seen - * as ArrayLists. The size of them is increased whenever they need - * to become bigger. - */ - - private final Client client; - - private boolean isReset; - private boolean usedSinceLastCheck; - - // Dimensions of the underlying image - private int imageWidth; - private int imageHeight; - - // Boundaries for the current rasterization - private int clipX1; - private int clipY1; - private int clipX2; - private int clipY2; - - // Pixel points that would be rendered to - private int[] visited; - private int currentVisitedNumber = 0; - - // Transformed vertex positions - private int[] projectedVerticesX; - private int[] projectedVerticesY; - private boolean[] projectedVerticesRenderable; - - // An array of pixel points to raster onto the image. These are checked against - // clip boundaries and the visited array to prevent drawing on top of the model - // and outside the scene area. They are grouped per distance to the closest pixel - // drawn on the model. - private int[][] outlinePixels; - private int[] outlinePixelsLengths; // outlinePixelsLength[i] is the used length of outlinePixels[i] - private int outlineArrayWidth; - - // A list of pixel distances ordered from shortest to longest distance for - // each outline width. These are calculated once upon first usage and then - // stored here to prevent reevaluation. - private List> precomputedDistancePriorities; - - @Inject - private ModelOutlineRenderer(Client client, Scheduler scheduler) - { - this.client = client; - scheduler.registerObject(this); - - reset(); - } - - @Schedule(period = 5, unit = ChronoUnit.SECONDS) - public void checkUsage() - { - if (!isReset && !usedSinceLastCheck) - { - // Reset memory allocated when the rasterizer becomes inactive - reset(); - } - usedSinceLastCheck = false; - } - - /** - * Reset memory used by the rasterizer - */ - private void reset() - { - visited = new int[0]; - projectedVerticesX = new int[0]; - projectedVerticesY = new int[0]; - projectedVerticesRenderable = new boolean[0]; - outlinePixels = new int[0][]; - outlinePixelsLengths = new int[0]; - precomputedDistancePriorities = new ArrayList<>(0); - isReset = true; - } - - /** - * Calculate the next power of two of a value - * - * @param value The value to find the next power of two of - * @return Returns the next power of two - */ - private static int nextPowerOfTwo(int value) - { - value--; - value |= value >> 1; - value |= value >> 2; - value |= value >> 4; - value |= value >> 8; - value |= value >> 16; - value++; - return value; - } - - /** - * Determine if a triangle goes counter clockwise - * - * @return Returns true if the triangle goes counter clockwise and should be culled, otherwise false - */ - private static boolean cullFace(int x1, int y1, int x2, int y2, int x3, int y3) - { - return - (y2 - y1) * (x3 - x2) - - (x2 - x1) * (y3 - y2) < 0; - } - - /** - * Gets the list of pixel distances ordered by distance from closest pixel for a specific outline width. - * - * @param outlineWidth The outline width - * @return Returns the list of pixel distances - */ - private List getPriorityList(int outlineWidth) - { - while (precomputedDistancePriorities.size() <= outlineWidth) - { - precomputedDistancePriorities.add(null); - } - - // Grab the cached outline width if we have one - if (precomputedDistancePriorities.get(outlineWidth) != null) - { - return precomputedDistancePriorities.get(outlineWidth); - } - - List ps = new ArrayList<>(); - for (int x = 0; x <= outlineWidth; x++) - { - for (int y = 0; y <= outlineWidth; y++) - { - if (x == 0 && y == 0) - { - continue; - } - - double dist = Math.sqrt(x * x + y * y); - if (dist > outlineWidth) - { - continue; - } - - int outerAlpha = outlineWidth == 1 ? 255 // For preventing division by 0 - : (int) (255 * (dist - 1) / (outlineWidth - 1)); - ps.add(new PixelDistanceAlpha(outerAlpha, x + y * outlineArrayWidth)); - } - } - ps.sort(Comparator.comparingDouble(PixelDistanceAlpha::getOuterAlpha)); - precomputedDistancePriorities.set(outlineWidth, ps); - - return ps; - } - - /** - * Checks that the size of outlinePixels is big enough to hold a specific - * amount of elements. This is used to reduce the amount of if checks needed - * when adding elements to outlinePixels. - * - * @param distArrayPos The position in the array - * @param additionalMinimumSize The additional minimum size required - */ - private void ensureMinimumOutlineQueueSize(int distArrayPos, int additionalMinimumSize) - { - int minimumSize = outlinePixelsLengths[distArrayPos] + additionalMinimumSize; - while (outlinePixels[distArrayPos].length < minimumSize) - { - int[] newArr = new int[nextPowerOfTwo(minimumSize)]; - System.arraycopy(outlinePixels[distArrayPos], 0, newArr, 0, - outlinePixels[distArrayPos].length); - outlinePixels[distArrayPos] = newArr; - } - } - - /** - * Resets the visited flag for a specific amount of pixels - * - * @param pixelAmount The amount of pixels to reset - */ - private void resetVisited(int pixelAmount) - { - // The visited array is essentially a boolean array, but by - // making it an int array and checking if visited[i] == currentVisitedNumber - // and changing currentVisitedNumber for every new outline, we can essentially - // reset the whole array without having to iterate over every element - - if (visited.length < pixelAmount) - { - visited = new int[nextPowerOfTwo(pixelAmount)]; - currentVisitedNumber = 0; - } - - currentVisitedNumber++; - } - - /** - * Resets the pixels that are queued for outlining - * - * @param outlineWidth The width of the outline to reset pixels for - */ - private void resetOutline(int outlineWidth) - { - outlineArrayWidth = outlineWidth + 2; - - int arraySizes = outlineArrayWidth * outlineArrayWidth; - if (outlinePixels.length < arraySizes) - { - outlinePixels = new int[arraySizes][]; - outlinePixelsLengths = new int[arraySizes]; - for (int i = 0; i < arraySizes; i++) - { - outlinePixels[i] = new int[4]; - } - } - else - { - for (int i = 0; i < arraySizes; i++) - { - outlinePixelsLengths[i] = 0; - } - } - } - - /** - * Simulates a horizontal line rasterization and adds the pixels to the left - * and to the right to the outline queue if they are within the clip area. - * - * @param pixelPos The pixel position in the line where x == 0 - * @param x1 The starting x position - * @param x2 The ending x position - */ - private void simulateHorizontalLineRasterizationForOutline(int pixelPos, int x1, int x2) - { - if (x2 > clipX2) - { - x2 = clipX2; - } - if (x1 < clipX1) - { - x1 = clipX1; - } - if (x1 >= x2) - { - return; - } - - // Queue the pixel positions to the left and to the right of the line - ensureMinimumOutlineQueueSize(1, 2); - if (x2 < clipX2) - { - outlinePixels[1][outlinePixelsLengths[1]++] = pixelPos + x2; - } - if (x1 > clipX1) - { - outlinePixels[1][outlinePixelsLengths[1]++] = pixelPos + x1 - 1; - } - - // Divide by 4 to account for loop unrolling - int xDist = x2 - x1 >> 2; - pixelPos += x1; - - // This loop could run over 100m times per second without loop unrolling in some cases, - // so unrolling it can give a noticeable performance boost. - while (xDist-- > 0) - { - visited[pixelPos++] = currentVisitedNumber; - visited[pixelPos++] = currentVisitedNumber; - visited[pixelPos++] = currentVisitedNumber; - visited[pixelPos++] = currentVisitedNumber; - } - - // Draw up to 3 more pixels if there were any left - xDist = (x2 - x1) & 3; - while (xDist-- > 0) - { - visited[pixelPos++] = currentVisitedNumber; - } - } - - /** - * Queues the pixel positions above and below two horizontal lines, excluding those - * where the x positions of the lines intersect. - * - * @param pixelPos The pixel position at x == 0 of the second line - * @param x1 The starting x position of the first line - * @param x2 The ending x position of the first line - * @param x3 The starting x position of the second line - * @param x4 The ending x position of the second line - */ - private void outlineAroundHorizontalLine(int pixelPos, int x1, int x2, int x3, int x4) - { - if (x1 < clipX1) - { - x1 = clipX1; - } - if (x2 < clipX1) - { - x2 = clipX1; - } - if (x3 < clipX1) - { - x3 = clipX1; - } - if (x4 < clipX1) - { - x4 = clipX1; - } - - if (x1 > clipX2) - { - x1 = clipX2; - } - if (x2 > clipX2) - { - x2 = clipX2; - } - if (x3 > clipX2) - { - x3 = clipX2; - } - if (x4 > clipX2) - { - x4 = clipX2; - } - - if (x1 < x3) - { - ensureMinimumOutlineQueueSize(outlineArrayWidth, x3 - x1); - for (int x = x1; x < x3; x++) - { - outlinePixels[outlineArrayWidth][outlinePixelsLengths[outlineArrayWidth]++] = pixelPos - imageWidth + x; - } - } - else - { - ensureMinimumOutlineQueueSize(outlineArrayWidth, x1 - x3); - for (int x = x3; x < x1; x++) - { - outlinePixels[outlineArrayWidth][outlinePixelsLengths[outlineArrayWidth]++] = pixelPos + x; - } - } - - if (x2 < x4) - { - ensureMinimumOutlineQueueSize(outlineArrayWidth, x4 - x2); - for (int x = x2; x < x4; x++) - { - outlinePixels[outlineArrayWidth][outlinePixelsLengths[outlineArrayWidth]++] = pixelPos + x; - } - } - else - { - ensureMinimumOutlineQueueSize(outlineArrayWidth, x2 - x4); - for (int x = x4; x < x2; x++) - { - outlinePixels[outlineArrayWidth][outlinePixelsLengths[outlineArrayWidth]++] = pixelPos - imageWidth + x; - } - } - } - - /** - * Simulates rasterization of a triangle and adds every pixel outside the triangle - * to the outline queue. - * - * @param x1 The x position of the first vertex in the triangle - * @param y1 The y position of the first vertex in the triangle - * @param x2 The x position of the second vertex in the triangle - * @param y2 The y position of the second vertex in the triangle - * @param x3 The x position of the third vertex in the triangle - * @param y3 The y position of the third vertex in the triangle - */ - private void simulateTriangleRasterizationForOutline(int x1, int y1, int x2, int y2, int x3, int y3) - { - // Swap vertices so y1 <= y2 <= y3 using bubble sort - if (y1 > y2) - { - int yp = y1; - int xp = x1; - y1 = y2; - y2 = yp; - x1 = x2; - x2 = xp; - } - if (y2 > y3) - { - int yp = y2; - int xp = x2; - y2 = y3; - y3 = yp; - x2 = x3; - x3 = xp; - } - if (y1 > y2) - { - int yp = y1; - int xp = x1; - y1 = y2; - y2 = yp; - x1 = x2; - x2 = xp; - } - - if (y1 > clipY2) - { - // All points are outside clip boundaries - return; - } - - int slope1 = 0; - if (y1 != y2) - { - slope1 = (x2 - x1 << 14) / (y2 - y1); - } - - int slope2 = 0; - if (y3 != y2) - { - slope2 = (x3 - x2 << 14) / (y3 - y2); - } - - int slope3 = 0; - if (y1 != y3) - { - slope3 = (x1 - x3 << 14) / (y1 - y3); - } - - if (y2 > clipY2) - { - y2 = clipY2; - } - if (y3 > clipY2) - { - y3 = clipY2; - } - if (y1 == y3 || y3 < 0) - { - return; - } - - x1 <<= 14; - x2 <<= 14; - x3 = x1; - - if (y1 < 0) - { - x3 -= y1 * slope3; - x1 -= y1 * slope1; - y1 = 0; - } - if (y2 < 0) - { - x2 -= slope2 * y2; - y2 = 0; - } - - int pixelPos = y1 * imageWidth; - int currX1; - int currX2; - if (y1 != y2 && slope3 < slope1 || y1 == y2 && slope3 > slope2) - { - int height1 = y2 - y1; - int height2 = y3 - y2; - - int prevX1; - int prevX2; - if (height1 <= 0) - { - prevX1 = x3 >> 14; - prevX2 = x2 >> 14; - } - else - { - prevX1 = x3 >> 14; - prevX2 = x1 >> 14; - } - - outlineAroundHorizontalLine(pixelPos, prevX1, prevX2, prevX2, prevX2); - - while (height1-- > 0) - { - currX1 = x3 >> 14; - currX2 = x1 >> 14; - outlineAroundHorizontalLine(pixelPos, currX1, currX2, prevX1, prevX2); - simulateHorizontalLineRasterizationForOutline(pixelPos, currX1, currX2); - x3 += slope3; - x1 += slope1; - pixelPos += imageWidth; - prevX1 = currX1; - prevX2 = currX2; - } - - while (height2-- > 0) - { - currX1 = x3 >> 14; - currX2 = x2 >> 14; - outlineAroundHorizontalLine(pixelPos, currX1, currX2, prevX1, prevX2); - simulateHorizontalLineRasterizationForOutline(pixelPos, currX1, currX2); - x3 += slope3; - x2 += slope2; - pixelPos += imageWidth; - prevX1 = currX1; - prevX2 = currX2; - } - - outlineAroundHorizontalLine(pixelPos, prevX1, prevX1, prevX1, prevX2); - } - else - { - int height1 = y2 - y1; - int height2 = y3 - y2; - - int prevX1; - int prevX2; - if (height1 <= 0) - { - prevX1 = x2 >> 14; - prevX2 = x3 >> 14; - } - else - { - prevX1 = x1 >> 14; - prevX2 = x3 >> 14; - } - - outlineAroundHorizontalLine(pixelPos, prevX1, prevX2, prevX2, prevX2); - - while (height1-- > 0) - { - currX1 = x1 >> 14; - currX2 = x3 >> 14; - outlineAroundHorizontalLine(pixelPos, currX1, currX2, prevX1, prevX2); - simulateHorizontalLineRasterizationForOutline(pixelPos, currX1, currX2); - x1 += slope1; - x3 += slope3; - pixelPos += imageWidth; - prevX1 = currX1; - prevX2 = currX2; - } - - while (height2-- > 0) - { - currX1 = x2 >> 14; - currX2 = x3 >> 14; - outlineAroundHorizontalLine(pixelPos, currX1, currX2, prevX1, prevX2); - simulateHorizontalLineRasterizationForOutline(pixelPos, currX1, currX2); - x3 += slope3; - x2 += slope2; - pixelPos += imageWidth; - prevX1 = currX1; - prevX2 = currX2; - } - - outlineAroundHorizontalLine(pixelPos, prevX1, prevX1, prevX1, prevX2); - } - } - - /** - * Translates the vertices 3D points to the screen canvas 2D points - * - * @param localX The local x position of the vertices - * @param localY The local y position of the vertices - * @param localZ The local z position of the vertices - * @param vertexOrientation The orientation of the vertices - * @return Returns true if any of them are inside the clip area, otherwise false - */ - private boolean projectVertices(Model model, final int localX, final int localY, final int localZ, final int vertexOrientation) - { - final int cameraX = client.getCameraX(); - final int cameraY = client.getCameraY(); - final int cameraZ = client.getCameraZ(); - final int cameraYaw = client.getCameraYaw(); - final int cameraPitch = client.getCameraPitch(); - final int scale = client.getScale(); - final int orientationSin = Perspective.SINE[vertexOrientation]; - final int orientationCos = Perspective.COSINE[vertexOrientation]; - final int pitchSin = Perspective.SINE[cameraPitch]; - final int pitchCos = Perspective.COSINE[cameraPitch]; - final int yawSin = Perspective.SINE[cameraYaw]; - final int yawCos = Perspective.COSINE[cameraYaw]; - final int vertexCount = model.getVerticesCount(); - final int[] verticesX = model.getVerticesX(); - final int[] verticesY = model.getVerticesY(); - final int[] verticesZ = model.getVerticesZ(); - - boolean anyVisible = false; - - // Make sure the arrays are big enough - while (projectedVerticesX.length < vertexCount) - { - int newSize = nextPowerOfTwo(vertexCount); - projectedVerticesX = new int[newSize]; - projectedVerticesY = new int[newSize]; - projectedVerticesRenderable = new boolean[newSize]; - } - - for (int i = 0; i < vertexCount; i++) - { - int vx = verticesX[i]; - int vy = verticesZ[i]; - int vz = verticesY[i]; - int vh; // Value holder - - // Rotate based on orientation - vh = vx * orientationCos + vy * orientationSin >> 16; - vy = vy * orientationCos - vx * orientationSin >> 16; - vx = vh; - - // Translate to local coords - vx += localX; - vy += localY; - vz += localZ; - - // Translate to camera - vx -= cameraX; - vy -= cameraY; - vz -= cameraZ; - - // Transform to canvas - vh = vx * yawCos + vy * yawSin >> 16; - vy = vy * yawCos - vx * yawSin >> 16; - vx = vh; - vh = vz * pitchCos - vy * pitchSin >> 16; - vz = vz * pitchSin + vy * pitchCos >> 16; - vy = vh; - - if (vz >= 50) - { - projectedVerticesX[i] = (clipX1 + clipX2) / 2 + vx * scale / vz; - projectedVerticesY[i] = (clipY1 + clipY2) / 2 + vy * scale / vz; - - projectedVerticesRenderable[i] = true; - anyVisible |= - projectedVerticesX[i] >= clipX1 && projectedVerticesX[i] < clipX2 && - projectedVerticesY[i] >= clipY1 && projectedVerticesY[i] < clipY2; - } - else - { - projectedVerticesRenderable[i] = false; - } - } - - return anyVisible; - } - - /** - * Simulate rendering of the model and puts every pixel of the wireframe of - * the non-culled and non-transparent faces into the outline pixel queue. - */ - private void simulateModelRasterizationForOutline(Model model) - { - final int triangleCount = model.getTrianglesCount(); - final int[] indices1 = model.getTrianglesX(); - final int[] indices2 = model.getTrianglesY(); - final int[] indices3 = model.getTrianglesZ(); - final byte[] triangleTransparencies = model.getTriangleTransparencies(); - - for (int i = 0; i < triangleCount; i++) - { - if (projectedVerticesRenderable[indices1[i]] && - projectedVerticesRenderable[indices2[i]] && - projectedVerticesRenderable[indices3[i]] && - // 254 and 255 counts as fully transparent - (triangleTransparencies == null || (triangleTransparencies[i] & 255) < 254)) - { - final int index1 = indices1[i]; - final int index2 = indices2[i]; - final int index3 = indices3[i]; - final int v1x = projectedVerticesX[index1]; - final int v1y = projectedVerticesY[index1]; - final int v2x = projectedVerticesX[index2]; - final int v2y = projectedVerticesY[index2]; - final int v3x = projectedVerticesX[index3]; - final int v3y = projectedVerticesY[index3]; - - if (!cullFace(v1x, v1y, v2x, v2y, v3x, v3y)) - { - simulateTriangleRasterizationForOutline( - v1x, v1y, v2x, v2y, v3x, v3y); - } - } - } - } - - /** - * Draws an outline of the pixels in the outline queue to an image - * - * @param image The image to draw the outline to - * @param outlineWidth The width of the outline - * @param innerColor The color of the pixels of the outline closest to the model - * @param outerColor The color of the pixels of the outline furthest away from the model - */ - private void renderOutline(BufferedImage image, int outlineWidth, Color innerColor, Color outerColor) - { - int[] imageData = ((DataBufferInt) image.getRaster().getDataBuffer()).getData(); - List ps = getPriorityList(outlineWidth); - - for (PixelDistanceAlpha p : ps) - { - int color; - int alpha; - if (outlineWidth == 1) - { - color = - ((innerColor.getRed() + outerColor.getRed()) << 15) | - ((innerColor.getGreen() + outerColor.getGreen() << 7)) | - ((innerColor.getBlue() + outerColor.getBlue() >> 1)); - alpha = (innerColor.getAlpha() + outerColor.getAlpha()) >> 1; - } - else - { - int outerAlpha = p.getOuterAlpha(); - int innerAlpha = 255 - outerAlpha; - int innerAlphaFraction = (innerAlpha * innerColor.getAlpha()) / 255; - int outerAlphaFraction = (outerAlpha * outerColor.getAlpha()) / 255; - alpha = innerAlphaFraction + outerAlphaFraction; - if (alpha != 0) - { - color = - ((innerColor.getRed() * innerAlphaFraction + - outerColor.getRed() * outerAlphaFraction) / alpha << 16) | - ((innerColor.getGreen() * innerAlphaFraction + - outerColor.getGreen() * outerAlphaFraction) / alpha << 8) | - ((innerColor.getBlue() * innerAlphaFraction + - outerColor.getBlue() * outerAlphaFraction) / alpha); - } - else - { - color = 0; - } - } - - final int distArrayPos = p.getDistArrayPos(); - final int nextDistArrayPosY = distArrayPos + outlineArrayWidth; - final int nextDistArrayPosX = distArrayPos + 1; - ensureMinimumOutlineQueueSize(nextDistArrayPosX, outlinePixelsLengths[distArrayPos] * 2); - ensureMinimumOutlineQueueSize(nextDistArrayPosY, outlinePixelsLengths[distArrayPos] * 2); - - // The following 3 branches do the same thing, but when the requirements are simple, - // there are less checks needed which can give a performance boost. - if (alpha == 255) - { - if (outlineWidth == 1) - { - for (int i2 = 0; i2 < outlinePixelsLengths[distArrayPos]; i2++) - { - int pixelPos = outlinePixels[distArrayPos][i2]; - int x = pixelPos % imageWidth; - int y = pixelPos / imageWidth; - if (x < clipX1 || x >= clipX2 || - y < clipY1 || y >= clipY2 || - visited[pixelPos] == currentVisitedNumber) - { - continue; - } - - imageData[pixelPos] = color; - } - } - else - { - for (int i2 = 0; i2 < outlinePixelsLengths[distArrayPos]; i2++) - { - int pixelPos = outlinePixels[distArrayPos][i2]; - int x = pixelPos % imageWidth; - int y = pixelPos / imageWidth; - if (x < clipX1 || x >= clipX2 || - y < clipY1 || y >= clipY2 || - visited[pixelPos] == currentVisitedNumber) - { - continue; - } - visited[pixelPos] = currentVisitedNumber; - - imageData[pixelPos] = color; - - if (pixelPos % imageWidth != 0) - { - outlinePixels[nextDistArrayPosX][outlinePixelsLengths[nextDistArrayPosX]++] = pixelPos - 1; - } - if ((pixelPos + 1) % imageWidth != 0) - { - outlinePixels[nextDistArrayPosX][outlinePixelsLengths[nextDistArrayPosX]++] = pixelPos + 1; - } - outlinePixels[nextDistArrayPosY][outlinePixelsLengths[nextDistArrayPosY]++] = pixelPos - imageWidth; - outlinePixels[nextDistArrayPosY][outlinePixelsLengths[nextDistArrayPosY]++] = pixelPos + imageWidth; - } - } - } - else - { - for (int i2 = 0; i2 < outlinePixelsLengths[distArrayPos]; i2++) - { - int pixelPos = outlinePixels[distArrayPos][i2]; - int x = pixelPos % imageWidth; - int y = pixelPos / imageWidth; - if (x < clipX1 || x >= clipX2 || - y < clipY1 || y >= clipY2 || - visited[pixelPos] == currentVisitedNumber) - { - continue; - } - visited[pixelPos] = currentVisitedNumber; - - imageData[pixelPos] = - ((((color & 0xFF0000) * alpha + (imageData[pixelPos] & 0xFF0000) * (255 - alpha)) / 255) & 0xFF0000) + - ((((color & 0xFF00) * alpha + (imageData[pixelPos] & 0xFF00) * (255 - alpha)) / 255) & 0xFF00) + - ((((color & 0xFF) * alpha + (imageData[pixelPos] & 0xFF) * (255 - alpha)) / 255) & 0xFF); - - if (pixelPos % imageWidth != 0) - { - outlinePixels[nextDistArrayPosX][outlinePixelsLengths[nextDistArrayPosX]++] = pixelPos - 1; - } - if ((pixelPos + 1) % imageWidth != 0) - { - outlinePixels[nextDistArrayPosX][outlinePixelsLengths[nextDistArrayPosX]++] = pixelPos + 1; - } - outlinePixels[nextDistArrayPosY][outlinePixelsLengths[nextDistArrayPosY]++] = pixelPos - imageWidth; - outlinePixels[nextDistArrayPosY][outlinePixelsLengths[nextDistArrayPosY]++] = pixelPos + imageWidth; - } - } - } - } - - /** - * Draws an outline around a model to an image - * - * @param localX The local x position of the model - * @param localY The local y position of the model - * @param localZ The local z position of the model - * @param orientation The orientation of the model - * @param outlineWidth The width of the outline - * @param innerColor The color of the pixels of the outline closest to the model - * @param outerColor The color of the pixels of the outline furthest away from the model - */ - private void drawModelOutline(Model model, int localX, int localY, int localZ, int orientation, int outlineWidth, Color innerColor, Color outerColor) - { - if (outlineWidth <= 0) - { - return; - } - - isReset = false; - usedSinceLastCheck = true; - - MainBufferProvider bufferProvider = (MainBufferProvider) client.getBufferProvider(); - BufferedImage image = (BufferedImage) bufferProvider.getImage(); - - clipX1 = client.getViewportXOffset(); - clipY1 = client.getViewportYOffset(); - clipX2 = client.getViewportWidth() + clipX1; - clipY2 = client.getViewportHeight() + clipY1; - imageWidth = image.getWidth(); - imageHeight = image.getHeight(); - final int pixelAmount = imageWidth * imageHeight; - - resetVisited(pixelAmount); - resetOutline(outlineWidth); - - if (!projectVertices(model, - localX, localY, localZ, orientation)) - { - // No vertex of the model is visible on the screen, so we can - // assume there are no parts of the model to outline. - return; - } - - simulateModelRasterizationForOutline(model); - - renderOutline(image, outlineWidth, innerColor, outerColor); - } - - @Deprecated(forRemoval = true, since = "4.9.2") - public void drawOutline(NPC npc, int outlineWidth, Color color) - { - drawOutline(npc, outlineWidth, color, color); - } - - @Deprecated(forRemoval = true, since = "4.9.2") - public void drawOutline(NPC npc, int outlineWidth, Color innerColor, Color outerColor) - { - int size = 1; - NPCComposition composition = npc.getTransformedComposition(); - if (composition != null) - { - size = composition.getSize(); - } - - LocalPoint lp = npc.getLocalLocation(); - if (lp != null) - { - // NPCs z position are calculated based on the tile height of the northeastern tile - final int northEastX = lp.getX() + Perspective.LOCAL_TILE_SIZE * (size - 1) / 2; - final int northEastY = lp.getY() + Perspective.LOCAL_TILE_SIZE * (size - 1) / 2; - final LocalPoint northEastLp = new LocalPoint(northEastX, northEastY); - - drawModelOutline(npc.getModel(), lp.getX(), lp.getY(), - Perspective.getTileHeight(client, northEastLp, client.getPlane()), - npc.getCurrentOrientation(), outlineWidth, innerColor, outerColor); - } - } - - @Deprecated(forRemoval = true, since = "4.9.2") - public void drawOutline(Player player, int outlineWidth, Color color) - { - drawOutline(player, outlineWidth, color, color); - } - - @Deprecated(forRemoval = true, since = "4.9.2") - public void drawOutline(Player player, int outlineWidth, Color innerColor, Color outerColor) - { - LocalPoint lp = player.getLocalLocation(); - if (lp != null) - { - drawModelOutline(player.getModel(), lp.getX(), lp.getY(), - Perspective.getTileHeight(client, lp, client.getPlane()), - player.getCurrentOrientation(), outlineWidth, innerColor, outerColor); - } - } - - @Deprecated(forRemoval = true, since = "4.9.2") - public void drawOutline(GameObject gameObject, int outlineWidth, Color innerColor, Color outerColor) - { - LocalPoint lp = gameObject.getLocalLocation(); - if (lp != null) - { - Renderable renderable = gameObject.getRenderable(); - if (renderable == null) - { - return; - } - - drawModelOutline(renderable instanceof Model ? (Model) renderable : renderable.getModel(), lp.getX(), lp.getY(), - Perspective.getTileHeight(client, lp, gameObject.getPlane()), - gameObject.getModelOrientation(), outlineWidth, innerColor, outerColor); - } - } - - @Deprecated(forRemoval = true, since = "4.9.2") - public void drawOutline(GroundObject groundObject, int outlineWidth, Color innerColor, Color outerColor) - { - LocalPoint lp = groundObject.getLocalLocation(); - if (lp != null) - { - drawModelOutline(groundObject.getModel(), lp.getX(), lp.getY(), - Perspective.getTileHeight(client, lp, client.getPlane()), - 0, outlineWidth, innerColor, outerColor); - } - } - - private void drawOutline(ItemLayer tileItemPile, int outlineWidth, Color innerColor, Color outerColor) - { - LocalPoint lp = tileItemPile.getLocalLocation(); - if (lp != null) - { - Model model = tileItemPile.getModelBottom(); - if (model != null) - { - drawModelOutline(model, lp.getX(), lp.getY(), - Perspective.getTileHeight(client, lp, tileItemPile.getPlane()), - 0, outlineWidth, innerColor, outerColor); - } - - model = tileItemPile.getModelMiddle(); - if (model != null) - { - drawModelOutline(model, lp.getX(), lp.getY(), - Perspective.getTileHeight(client, lp, tileItemPile.getPlane()), - 0, outlineWidth, innerColor, outerColor); - } - - model = tileItemPile.getModelTop(); - if (model != null) - { - drawModelOutline(model, lp.getX(), lp.getY(), - Perspective.getTileHeight(client, lp, tileItemPile.getPlane()), - 0, outlineWidth, innerColor, outerColor); - } - } - } - - private void drawOutline(DecorativeObject decorativeObject, int outlineWidth, Color innerColor, Color outerColor) - { - LocalPoint lp = decorativeObject.getLocalLocation(); - if (lp != null) - { - Renderable renderable1 = decorativeObject.getRenderable(); - if (renderable1 != null) - { - Model model = renderable1 instanceof Model ? (Model) renderable1 : renderable1.getModel(); - if (model != null) - { - drawModelOutline(model, - lp.getX() + decorativeObject.getXOffset(), - lp.getY() + decorativeObject.getYOffset(), - Perspective.getTileHeight(client, lp, decorativeObject.getPlane()), - 0, outlineWidth, innerColor, outerColor); - } - } - - Renderable renderable2 = decorativeObject.getRenderable2(); - if (renderable2 != null) - { - Model model = renderable2 instanceof Model ? (Model) renderable2 : renderable2.getModel(); - if (model != null) - { - // Offset is not used for the second model - drawModelOutline(model, lp.getX(), lp.getY(), - Perspective.getTileHeight(client, lp, decorativeObject.getPlane()), - 0, outlineWidth, innerColor, outerColor); - } - } - } - } - - private void drawOutline(WallObject wallObject, int outlineWidth, Color innerColor, Color outerColor) - { - LocalPoint lp = wallObject.getLocalLocation(); - if (lp != null) - { - Model model = wallObject.getModelA(); - if (model != null) - { - drawModelOutline(model, lp.getX(), lp.getY(), - Perspective.getTileHeight(client, lp, wallObject.getPlane()), - wallObject.getOrientationA(), outlineWidth, innerColor, outerColor); - } - - model = wallObject.getModelB(); - if (model != null) - { - drawModelOutline(model, lp.getX(), lp.getY(), - Perspective.getTileHeight(client, lp, wallObject.getPlane()), - wallObject.getOrientationB(), outlineWidth, innerColor, outerColor); - } - } - } - - @Deprecated(forRemoval = true, since = "4.9.2") - public void drawOutline(TileObject tileObject, int outlineWidth, Color color) - { - drawOutline(tileObject, outlineWidth, color, color); - } - - @Deprecated(forRemoval = true, since = "4.9.2") - public void drawOutline(TileObject tileObject, - int outlineWidth, Color innerColor, Color outerColor) - { - if (tileObject instanceof GameObject) - { - drawOutline((GameObject) tileObject, outlineWidth, innerColor, outerColor); - } - else if (tileObject instanceof GroundObject) - { - drawOutline((GroundObject) tileObject, outlineWidth, innerColor, outerColor); - } - else if (tileObject instanceof ItemLayer) - { - drawOutline((ItemLayer) tileObject, outlineWidth, innerColor, outerColor); - } - else if (tileObject instanceof DecorativeObject) - { - drawOutline((DecorativeObject) tileObject, outlineWidth, innerColor, outerColor); - } - else if (tileObject instanceof WallObject) - { - drawOutline((WallObject) tileObject, outlineWidth, innerColor, outerColor); - } - } - - @Value - @RequiredArgsConstructor - static class PixelDistanceAlpha - { - int outerAlpha; - int distArrayPos; - } -} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index ef7de6c3b9..05a9f07ef4 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -354,7 +354,7 @@ public class RuneLite oprsExternalPluginManager.setOutdated(isOutdated); // Update external plugins - oprsExternalPluginManager.update(); //TODO: Re-enable after fixing actions for new repo + oprsExternalPluginManager.update(); // Load the plugins, but does not start them yet. // This will initialize configuration diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalBasePluginLoader.java b/runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalBasePluginLoader.java new file mode 100644 index 0000000000..ce062bd49e --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalBasePluginLoader.java @@ -0,0 +1,24 @@ +package net.runelite.client.plugins; + +import java.nio.file.Path; +import lombok.extern.slf4j.Slf4j; +import org.pf4j.BasePluginLoader; +import org.pf4j.PluginClassLoader; +import org.pf4j.PluginClasspath; +import org.pf4j.PluginDescriptor; +import org.pf4j.PluginManager; + +@Slf4j +class OPRSExternalBasePluginLoader extends BasePluginLoader +{ + OPRSExternalBasePluginLoader(PluginManager pluginManager, PluginClasspath pluginClasspath) + { + super(pluginManager, pluginClasspath); + } + + @Override + protected PluginClassLoader createPluginClassLoader(Path pluginPath, PluginDescriptor pluginDescriptor) + { + return new OPRSExternalClassLoader(pluginManager, pluginDescriptor, getClass().getClassLoader()); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalClassLoader.java b/runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalClassLoader.java new file mode 100644 index 0000000000..a0cf9d0c47 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalClassLoader.java @@ -0,0 +1,142 @@ +package net.runelite.client.plugins; + +import java.lang.invoke.MethodHandles; +import java.util.List; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import net.runelite.client.util.ReflectUtil; +import org.pf4j.ClassLoadingStrategy; +import org.pf4j.PluginClassLoader; +import org.pf4j.PluginDependency; +import org.pf4j.PluginDescriptor; +import org.pf4j.PluginManager; + +@Slf4j +class OPRSExternalClassLoader extends PluginClassLoader implements ReflectUtil.PrivateLookupableClassLoader +{ + private static final String JAVA_PACKAGE_PREFIX = "java."; + private static final String PLUGIN_PACKAGE_PREFIX = "org.pf4j."; + + @Getter + @Setter + private MethodHandles.Lookup lookup; + + private final PluginManager pluginManager; + private final PluginDescriptor pluginDescriptor; + private final ClassLoadingStrategy classLoadingStrategy; + + OPRSExternalClassLoader(PluginManager pluginManager, PluginDescriptor pluginDescriptor, ClassLoader parent) + { + super(pluginManager, pluginDescriptor, parent); + + this.pluginManager = pluginManager; + this.pluginDescriptor = pluginDescriptor; + this.classLoadingStrategy = ClassLoadingStrategy.PDA; + + ReflectUtil.installLookupHelper(this); + } + + @Override + public Class defineClass0(String name, byte[] b, int off, int len) throws ClassFormatError + { + return super.defineClass(name, b, off, len); + } + + @Override + protected Class loadClassFromDependencies(String className) + { + log.trace("Search in dependencies for class '{}'", className); + + List dependencies = pluginDescriptor.getDependencies(); + for (PluginDependency dependency : dependencies) + { + ClassLoader classLoader = pluginManager.getPluginClassLoader(dependency.getPluginId()); + + // If the dependency is marked as optional, its class loader might not be available. + if (classLoader == null && dependency.isOptional()) + { + continue; + } + + try + { + if (classLoader != null) + { + return classLoader.loadClass(className); + } + } + catch (ClassNotFoundException e) + { + // try next dependency + } + } + + return null; + } + + @Override + public Class loadClass(String className) throws ClassNotFoundException + { + synchronized (getClassLoadingLock(className)) + { + // first check whether it's a system class, delegate to the system loader + if (className.startsWith(JAVA_PACKAGE_PREFIX)) + { + return findSystemClass(className); + } + + // if the class is part of the plugin engine use parent class loader + if (className.startsWith(PLUGIN_PACKAGE_PREFIX) && !className.startsWith("org.pf4j.demo")) + { +// log.trace("Delegate the loading of PF4J class '{}' to parent", className); + return getParent().loadClass(className); + } + + log.trace("Received request to load class '{}'", className); + + // second check whether it's already been loaded + Class loadedClass = findLoadedClass(className); + if (loadedClass != null) + { + log.trace("Found loaded class '{}'", className); + return loadedClass; + } + + for (ClassLoadingStrategy.Source classLoadingSource : this.classLoadingStrategy.getSources()) + { + Class c = null; + try + { + switch (classLoadingSource) + { + case APPLICATION: + c = super.loadClass(className); + break; + case PLUGIN: + c = findClass(className); + break; + case DEPENDENCIES: + c = loadClassFromDependencies(className); + break; + } + } + catch (ClassNotFoundException ignored) + { + } + + if (c != null) + { + log.trace("Found class '{}' in {} classpath", className, classLoadingSource); + return c; + } + else + { + log.trace("Couldn't find class '{}' in {} classpath", className, classLoadingSource); + } + } + + throw new ClassNotFoundException(className); + } + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalJarPluginLoader.java b/runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalJarPluginLoader.java new file mode 100644 index 0000000000..78cf086a8f --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalJarPluginLoader.java @@ -0,0 +1,26 @@ +package net.runelite.client.plugins; + +import java.nio.file.Path; +import lombok.extern.slf4j.Slf4j; +import org.pf4j.JarPluginLoader; +import org.pf4j.PluginClassLoader; +import org.pf4j.PluginDescriptor; +import org.pf4j.PluginManager; + +@Slf4j +class OPRSExternalJarPluginLoader extends JarPluginLoader +{ + public OPRSExternalJarPluginLoader(PluginManager pluginManager) + { + super(pluginManager); + } + + @Override + public ClassLoader loadPlugin(Path pluginPath, PluginDescriptor pluginDescriptor) + { + PluginClassLoader pluginClassLoader = new OPRSExternalClassLoader(pluginManager, pluginDescriptor, getClass().getClassLoader()); + pluginClassLoader.addFile(pluginPath.toFile()); + + return pluginClassLoader; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalPf4jPluginManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalPf4jPluginManager.java index 4c6ec404fe..9476dda610 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalPf4jPluginManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalPf4jPluginManager.java @@ -17,13 +17,11 @@ import java.util.Set; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import lombok.extern.slf4j.Slf4j; -import org.pf4j.BasePluginLoader; import org.pf4j.CompoundPluginLoader; import org.pf4j.CompoundPluginRepository; import org.pf4j.DefaultPluginManager; import org.pf4j.DependencyResolver; import org.pf4j.DevelopmentPluginRepository; -import org.pf4j.JarPluginLoader; import org.pf4j.JarPluginRepository; import org.pf4j.ManifestPluginDescriptorFinder; import org.pf4j.PluginAlreadyLoadedException; @@ -105,8 +103,8 @@ class OPRSExternalPf4jPluginManager extends DefaultPluginManager protected PluginLoader createPluginLoader() { return new CompoundPluginLoader() - .add(new BasePluginLoader(this, new OPRSExternalPluginClasspath()), this::isDevelopment) - .add(new JarPluginLoader(this), this::isNotDevelopment); + .add(new OPRSExternalBasePluginLoader(this, new OPRSExternalPluginClasspath()), this::isDevelopment) + .add(new OPRSExternalJarPluginLoader(this), this::isNotDevelopment); } @Override diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalPluginManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalPluginManager.java index e03672694f..5959e03b01 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalPluginManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/OPRSExternalPluginManager.java @@ -1203,4 +1203,4 @@ public class OPRSExternalPluginManager { return URLEncoder.encode(s, StandardCharsets.UTF_8); } -} +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java index 2ae6cd40d7..7e2003efb4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java @@ -39,7 +39,13 @@ import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.Module; import java.io.IOException; +import java.lang.invoke.CallSite; +import java.lang.invoke.LambdaMetafactory; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -69,9 +75,12 @@ import net.runelite.client.eventbus.Subscribe; import net.runelite.client.events.PluginChanged; import net.runelite.client.events.SessionClose; import net.runelite.client.events.SessionOpen; +import net.runelite.client.task.Schedule; +import net.runelite.client.task.ScheduledMethod; import net.runelite.client.task.Scheduler; import net.runelite.client.ui.SplashScreen; import net.runelite.client.util.GameEventManager; +import net.runelite.client.util.ReflectUtil; @Singleton @Slf4j @@ -651,14 +660,59 @@ public class PluginManager private void schedule(Plugin plugin) { - // note to devs: this method will almost certainly merge conflict in the future, just apply the changes in the scheduler instead - scheduler.registerObject(plugin); + for (Method method : plugin.getClass().getMethods()) + { + Schedule schedule = method.getAnnotation(Schedule.class); + + if (schedule == null) + { + continue; + } + + Runnable runnable = null; + try + { + final Class clazz = method.getDeclaringClass(); + final MethodHandles.Lookup caller = ReflectUtil.privateLookupIn(clazz); + final MethodType subscription = MethodType.methodType(method.getReturnType(), method.getParameterTypes()); + final MethodHandle target = caller.findVirtual(clazz, method.getName(), subscription); + final CallSite site = LambdaMetafactory.metafactory( + caller, + "run", + MethodType.methodType(Runnable.class, clazz), + subscription, + target, + subscription); + + final MethodHandle factory = site.getTarget(); + runnable = (Runnable) factory.bindTo(plugin).invokeExact(); + } + catch (Throwable e) + { + log.warn("Unable to create lambda for method {}", method, e); + } + + ScheduledMethod scheduledMethod = new ScheduledMethod(schedule, method, plugin, runnable); + log.debug("Scheduled task {}", scheduledMethod); + + scheduler.addScheduledMethod(scheduledMethod); + } } private void unschedule(Plugin plugin) { - // note to devs: this method will almost certainly merge conflict in the future, just apply the changes in the scheduler instead - scheduler.unregisterObject(plugin); + List methods = new ArrayList<>(scheduler.getScheduledMethods()); + + for (ScheduledMethod method : methods) + { + if (method.getObject() != plugin) + { + continue; + } + + log.debug("Removing scheduled task {}", method); + scheduler.removeScheduledMethod(method); + } } /** @@ -734,4 +788,4 @@ public class PluginManager }) .collect(Collectors.toList()); } -} +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java index 83339d9d3e..27e8727cb2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java @@ -115,6 +115,7 @@ import net.runelite.client.ui.FontManager; import net.runelite.client.ui.PluginPanel; import net.runelite.client.ui.components.ColorJButton; import net.runelite.client.ui.components.ComboBoxListRenderer; +import net.runelite.client.ui.components.ToggleButton; import net.runelite.client.ui.components.colorpicker.ColorPickerManager; import net.runelite.client.ui.components.colorpicker.RuneliteColorPicker; import net.runelite.client.util.ColorUtil; @@ -487,8 +488,7 @@ class ConfigPanel extends PluginPanel if (cid.getType() == boolean.class) { - JCheckBox checkbox = new JCheckBox(); - checkbox.setBackground(ColorScheme.LIGHT_GRAY_COLOR); + JCheckBox checkbox = new ToggleButton(); checkbox.setSelected(Boolean.parseBoolean(configManager.getConfiguration(cd.getGroup().value(), cid.getItem().keyName()))); checkbox.addActionListener(ae -> changeConfiguration(checkbox, cd, cid)); @@ -864,8 +864,8 @@ class ConfigPanel extends PluginPanel { String option = String.valueOf(obj).toLowerCase().replace("_", " "); - JCheckBox checkbox = new JCheckBox(option); - checkbox.setBackground(ColorScheme.LIGHT_GRAY_COLOR); + JCheckBox checkbox = new ToggleButton(option); + checkbox.setBackground(ColorScheme.DARK_GRAY_COLOR); checkbox.setSelected(enumSet.contains(obj)); jcheckboxes.add(checkbox); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java index b40cdd2e62..a817f76778 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java @@ -26,41 +26,18 @@ package net.runelite.client.plugins.config; import java.awt.Dimension; -import java.awt.image.BufferedImage; import java.util.List; -import javax.swing.ImageIcon; -import javax.swing.JToggleButton; -import net.runelite.client.ui.ColorScheme; -import net.runelite.client.util.ImageUtil; -import net.runelite.client.util.SwingUtil; +import net.runelite.client.ui.components.ToggleButton; -class PluginToggleButton extends JToggleButton +class PluginToggleButton extends ToggleButton { - private static final ImageIcon ON_SWITCHER; - private static final ImageIcon OFF_SWITCHER; - - static - { - BufferedImage onSwitcher = ImageUtil.loadImageResource(ConfigPanel.class, "switcher_on.png"); - ON_SWITCHER = new ImageIcon(ImageUtil.recolorImage(onSwitcher, ColorScheme.BRAND_BLUE)); - OFF_SWITCHER = new ImageIcon(ImageUtil.flipImage( - ImageUtil.luminanceScale( - ImageUtil.grayscaleImage(onSwitcher), - 0.61f - ), - true, - false - )); - } - private String conflictString = ""; public PluginToggleButton() { - super(OFF_SWITCHER); - setSelectedIcon(ON_SWITCHER); - SwingUtil.removeButtonDecorations(this); + super(); setPreferredSize(new Dimension(25, 0)); + addItemListener(l -> updateTooltip()); updateTooltip(); } diff --git a/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java index c529b073da..6afd761a68 100644 --- a/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java +++ b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java @@ -78,7 +78,7 @@ import okhttp3.Response; public class ClientLoader implements Supplier { private static final String INJECTED_CLIENT_NAME = "/injected-client.oprs"; - private static final int NUM_ATTEMPTS = 6; + private static final int NUM_ATTEMPTS = 0; private static File LOCK_FILE = new File(RuneLite.CACHE_DIR, "cache.lock"); private static File VANILLA_CACHE = new File(RuneLite.CACHE_DIR, "vanilla.cache"); private static File PATCHED_CACHE = new File(RuneLite.CACHE_DIR, "patched.cache"); diff --git a/runelite-client/src/main/java/net/runelite/client/task/Scheduler.java b/runelite-client/src/main/java/net/runelite/client/task/Scheduler.java index 67ba137e63..8ecf6ab665 100644 --- a/runelite-client/src/main/java/net/runelite/client/task/Scheduler.java +++ b/runelite-client/src/main/java/net/runelite/client/task/Scheduler.java @@ -24,16 +24,10 @@ */ package net.runelite.client.task; -import java.lang.invoke.CallSite; -import java.lang.invoke.LambdaMetafactory; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.time.Duration; import java.time.Instant; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -66,63 +60,6 @@ public class Scheduler return Collections.unmodifiableList(scheduledMethods); } - public void registerObject(Object obj) - { - for (Method method : obj.getClass().getMethods()) - { - Schedule schedule = method.getAnnotation(Schedule.class); - - if (schedule == null) - { - continue; - } - - Runnable runnable = null; - try - { - final Class clazz = method.getDeclaringClass(); - final MethodHandles.Lookup caller = MethodHandles.privateLookupIn(clazz, MethodHandles.lookup()); - final MethodType subscription = MethodType.methodType(method.getReturnType(), method.getParameterTypes()); - final MethodHandle target = caller.findVirtual(clazz, method.getName(), subscription); - final CallSite site = LambdaMetafactory.metafactory( - caller, - "run", - MethodType.methodType(Runnable.class, clazz), - subscription, - target, - subscription); - - final MethodHandle factory = site.getTarget(); - runnable = (Runnable) factory.bindTo(obj).invokeExact(); - } - catch (Throwable e) - { - log.warn("Unable to create lambda for method {}", method, e); - } - - ScheduledMethod scheduledMethod = new ScheduledMethod(schedule, method, obj, runnable); - log.debug("Scheduled task {}", scheduledMethod); - - addScheduledMethod(scheduledMethod); - } - } - - public void unregisterObject(Object obj) - { - List methods = new ArrayList<>(getScheduledMethods()); - - for (ScheduledMethod method : methods) - { - if (method.getObject() != obj) - { - continue; - } - - log.debug("Removing scheduled task {}", method); - removeScheduledMethod(method); - } - } - public void tick() { Instant now = Instant.now(); diff --git a/runelite-client/src/main/java/net/runelite/client/ui/components/ToggleButton.java b/runelite-client/src/main/java/net/runelite/client/ui/components/ToggleButton.java new file mode 100644 index 0000000000..f6a7007d26 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/ui/components/ToggleButton.java @@ -0,0 +1,78 @@ +/* + * 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.client.ui.components; + +import java.awt.image.BufferedImage; +import javax.swing.ImageIcon; +import javax.swing.JCheckBox; +import net.runelite.client.ui.ColorScheme; +import net.runelite.client.util.ImageUtil; +import net.runelite.client.util.SwingUtil; + +public class ToggleButton extends JCheckBox +{ + private static final ImageIcon ON_SWITCHER; + private static final ImageIcon OFF_SWITCHER; + private static final ImageIcon DISABLED_SWITCHER; + + static + { + BufferedImage onSwitcher = ImageUtil.loadImageResource(ToggleButton.class, "switcher_on.png"); + ON_SWITCHER = new ImageIcon(ImageUtil.recolorImage(onSwitcher, ColorScheme.BRAND_BLUE)); + OFF_SWITCHER = new ImageIcon(ImageUtil.flipImage( + ImageUtil.luminanceScale( + ImageUtil.grayscaleImage(onSwitcher), + 0.61f + ), + true, + false + )); + DISABLED_SWITCHER = new ImageIcon(ImageUtil.flipImage( + ImageUtil.luminanceScale( + ImageUtil.grayscaleImage(onSwitcher), + 0.4f + ), + true, + false + )); + } + + public ToggleButton() + { + super(OFF_SWITCHER); + setSelectedIcon(ON_SWITCHER); + setDisabledIcon(DISABLED_SWITCHER); + SwingUtil.removeButtonDecorations(this); + } + + public ToggleButton(String text) + { + super(text, OFF_SWITCHER, false); + setSelectedIcon(ON_SWITCHER); + setDisabledIcon(DISABLED_SWITCHER); + SwingUtil.removeButtonDecorations(this); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/ui/skin/ObsidianSkin.java b/runelite-client/src/main/java/net/runelite/client/ui/skin/ObsidianSkin.java index 92620713fc..8615d70788 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/skin/ObsidianSkin.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/skin/ObsidianSkin.java @@ -59,7 +59,7 @@ public class ObsidianSkin extends SubstanceSkin ObsidianSkin() { final SubstanceSkin.ColorSchemes schemes = SubstanceSkin - .getColorSchemes(getClass().getResource(NAME + ".colorschemes")); + .getColorSchemes(getClass().getResourceAsStream(NAME + ".colorschemes")); final SubstanceColorScheme activeScheme = schemes.get("RuneLite Active"); final SubstanceColorScheme enabledScheme = schemes.get("RuneLite Enabled"); @@ -119,7 +119,7 @@ public class ObsidianSkin extends SubstanceSkin .get("RuneLite Decorations Watermark"); this.registerDecorationAreaSchemeBundle(decorationsSchemeBundle, decorationsWatermarkScheme, - DecorationAreaType.TOOLBAR, DecorationAreaType.GENERAL, DecorationAreaType.FOOTER); + DecorationAreaType.TOOLBAR, DecorationAreaType.CONTROL_PANE, DecorationAreaType.FOOTER); final SubstanceColorSchemeBundle headerSchemeBundle = new SubstanceColorSchemeBundle(activeScheme, enabledScheme, enabledScheme); @@ -184,7 +184,6 @@ public class ObsidianSkin extends SubstanceSkin } }; - this.watermark = null; this.fillPainter = new FractionBasedFillPainter("RuneLite", new float[]{0.0f, 0.5f, 1.0f}, new ColorSchemeSingleColorQuery[]{ColorSchemeSingleColorQuery.ULTRALIGHT, diff --git a/runelite-client/src/main/java/net/runelite/client/util/OSXUtil.java b/runelite-client/src/main/java/net/runelite/client/util/OSXUtil.java index de099a1646..3a90759ec9 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/OSXUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/util/OSXUtil.java @@ -24,10 +24,9 @@ */ package net.runelite.client.util; -import com.apple.eawt.Application; -import com.apple.eawt.FullScreenUtilities; import javax.swing.JFrame; import lombok.extern.slf4j.Slf4j; +import org.madlonkay.desktopsupport.DesktopSupport; /** * A class with OSX-specific functions to improve integration. @@ -44,7 +43,7 @@ public class OSXUtil { if (OSType.getOSType() == OSType.MacOS) { - FullScreenUtilities.setWindowCanFullScreen(gui, true); + DesktopSupport.getSupport().setWindowCanFullScreen(gui, true); log.debug("Enabled fullscreen on macOS"); } } @@ -54,8 +53,7 @@ public class OSXUtil */ public static void requestUserAttention() { - Application app = Application.getApplication(); - app.requestUserAttention(true); + DesktopSupport.getSupport().requestUserAttention(true); log.debug("Requested user attention on macOS"); } @@ -64,8 +62,7 @@ public class OSXUtil */ public static void requestForeground() { - Application app = Application.getApplication(); - app.requestForeground(true); + DesktopSupport.getSupport().requestForeground(true); log.debug("Forced focus on macOS"); } } diff --git a/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java b/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java index 22e46213e2..11b6bbd479 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java @@ -62,6 +62,7 @@ import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.components.CustomScrollBarUI; import net.runelite.client.ui.components.SliderUI; +import org.pushingpixels.substance.api.SubstanceSlices; import org.pushingpixels.substance.internal.SubstanceSynapse; /** @@ -217,7 +218,7 @@ public class SwingUtil button.setSize(scaledImage.getWidth(), scaledImage.getHeight()); button.setToolTipText(navigationButton.getTooltip()); button.setIcon(new ImageIcon(scaledImage)); - button.putClientProperty(SubstanceSynapse.FLAT_LOOK, Boolean.TRUE); + button.putClientProperty(SubstanceSynapse.BACKGROUND_APPEARANCE_STRATEGY, SubstanceSlices.BackgroundAppearanceStrategy.FLAT); button.setFocusable(false); button.addActionListener(e -> { diff --git a/runelite-client/src/main/resources/net/runelite/client/ui/components/switcher_on.png b/runelite-client/src/main/resources/net/runelite/client/ui/components/switcher_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e49f318005b6aa9edc3184ccd3a903fee76b4d04 GIT binary patch literal 368 zcmV-$0gwKPP)P000jN1^@s65oToN00009a7bBm000XU z000XU0RWnu7ytkPB1uF+R5*>@)4xl@Kor37Z<0oeP{l<`rw*wZ1jWHYoSj5;5*K&Z z4&LH_5W!hob#WD)Toge>w}QgifQUk^LZx-E7(!ek)ZpbxT*SA%ANM{S$H9LIBkMum zV*#iF({bqv*m4AiTEzD#0FyuwuocEKu%zg1Is&0Ye2*bu4j541fhk};r4O*;2=>1c zGtr#T00g12r~wE%#5WW+K8gQ#=bp65_!^{?sUzjZl?WiJ*FWw z;3I9peJgjaLu!q|Jtg7@I>0gT00ciRuydT&U+ha2aMR2mcqgUp-dd*5=(_Is+RXFn zZ24_|I3HF3+Fh%Dc2_vsxftD*QeOWWiJ=lu0Y>7|D{w2NY-HW}_u~^=;YGM^AOCp( O0000 + * Allows Java code to manipulate JavaScript objects. + *

+ * + *

+ * When a JavaScript object is passed or returned to Java code, it + * is wrapped in an instance of {@code JSObject}. When a + * {@code JSObject} instance is passed to the JavaScript engine, + * it is unwrapped back to its original JavaScript object. The + * {@code JSObject} class provides a way to invoke JavaScript + * methods and examine JavaScript properties. + *

+ * + *

Any data returned from the JavaScript engine to Java is + * converted to Java data types. Certain data passed to the JavaScript + * engine is converted to JavaScript data types. + *

+ * + */ +@SuppressWarnings("deprecation") +public abstract class JSObject { + /** + * Constructs a new JSObject. Users should neither call this method nor + * subclass JSObject. + */ + protected JSObject() { + } + + /** + * Calls a JavaScript method. Equivalent to + * "this.methodName(args[0], args[1], ...)" in JavaScript. + * + * @param methodName The name of the JavaScript method to be invoked. + * @param args the Java objects passed as arguments to the method. + * @return Result of the method. + * @throws JSException when an error is reported from the browser or + * JavaScript engine. + */ + public abstract Object call(String methodName, Object... args) throws JSException; + + /** + * Evaluates a JavaScript expression. The expression is a string of + * JavaScript source code which will be evaluated in the context given by + * "this". + * + * @param s The JavaScript expression. + * @return Result of the JavaScript evaluation. + * @throws JSException when an error is reported from the browser or + * JavaScript engine. + */ + public abstract Object eval(String s) throws JSException; + + /** + * Retrieves a named member of a JavaScript object. Equivalent to + * "this.name" in JavaScript. + * + * @param name The name of the JavaScript property to be accessed. + * @return The value of the propery. + * @throws JSException when an error is reported from the browser or + * JavaScript engine. + */ + public abstract Object getMember(String name) throws JSException; + + /** + * Sets a named member of a JavaScript object. Equivalent to + * "this.name = value" in JavaScript. + * + * @param name The name of the JavaScript property to be accessed. + * @param value The value of the propery. + * @throws JSException when an error is reported from the browser or + * JavaScript engine. + */ + public abstract void setMember(String name, Object value) throws JSException; + + /** + * Removes a named member of a JavaScript object. Equivalent + * to "delete this.name" in JavaScript. + * + * @param name The name of the JavaScript property to be removed. + * @throws JSException when an error is reported from the browser or + * JavaScript engine. + */ + public abstract void removeMember(String name) throws JSException; + + /** + * Retrieves an indexed member of a JavaScript object. Equivalent to + * "this[index]" in JavaScript. + * + * @param index The index of the array to be accessed. + * @return The value of the indexed member. + * @throws JSException when an error is reported from the browser or + * JavaScript engine. + */ + public abstract Object getSlot(int index) throws JSException; + + /** + * Sets an indexed member of a JavaScript object. Equivalent to + * "this[index] = value" in JavaScript. + * + * @param index The index of the array to be accessed. + * @param value The value to set + * @throws JSException when an error is reported from the browser or + * JavaScript engine. + */ + public abstract void setSlot(int index, Object value) throws JSException; + + /** + * Returns a JSObject for the window containing the given applet. This + * method only works when the Java code is running in a browser as an + * applet. The object returned may be used to access the HTML DOM directly. + * + * @param applet The applet. + * @return JSObject representing the window containing the given applet or + * {@code null} if we are not connected to a browser. + * @throws JSException when an error is reported from the browser or + * JavaScript engine or if applet is {@code null} + * + * @deprecated The Applet API is deprecated. See the + * + * java.applet package documentation for further information. + */ + + @Deprecated(since = "9") + @SuppressWarnings("exports") + public static JSObject getWindow(Applet applet) throws JSException { + return ProviderLoader.callGetWindow(applet); + } + + private static class ProviderLoader { + private static final JSObjectProvider provider; + + static { + provider = AccessController.doPrivileged( + new PrivilegedAction() { + @Override + public JSObjectProvider run() { + Iterator providers = + ServiceLoader.loadInstalled(JSObjectProvider.class).iterator(); + if (providers.hasNext()) { + return providers.next(); + } + return null; + } + } + ); + } + + private static JSObject callGetWindow(Applet applet) { + if (provider != null) { + return provider.getWindow(applet); + } + return null; + } + } +} \ No newline at end of file diff --git a/runescape-client/src/main/java/netscape/javascript/JSObjectProvider.java b/runescape-client/src/main/java/netscape/javascript/JSObjectProvider.java new file mode 100644 index 0000000000..4d69202cfe --- /dev/null +++ b/runescape-client/src/main/java/netscape/javascript/JSObjectProvider.java @@ -0,0 +1,20 @@ +package netscape.javascript; + +import java.applet.Applet; +import netscape.javascript.JSException; +import netscape.javascript.JSObject; + +@SuppressWarnings("deprecation") +public interface JSObjectProvider { + /** + * Return a JSObject for the window containing the given applet. + * Implementations of this class should return null if not connected to a + * browser, for example, when running in AppletViewer. + * + * @param applet The applet. + * @return JSObject for the window containing the given applet or null if we + * are not connected to a browser. + * @throws JSException when an error is encountered. + */ + public JSObject getWindow(Applet applet) throws JSException; +} diff --git a/wiki-scraper/wiki-scraper.gradle.kts b/wiki-scraper/wiki-scraper.gradle.kts index 383ab0db0d..ffc50e1a05 100644 --- a/wiki-scraper/wiki-scraper.gradle.kts +++ b/wiki-scraper/wiki-scraper.gradle.kts @@ -34,11 +34,11 @@ dependencies { compileOnly(group = "org.projectlombok", name = "lombok", version = ProjectVersions.lombokVersion) implementation(group = "com.google.code.gson", name = "gson", version = "2.8.5") - implementation(group = "com.google.guava", name = "guava", version = "23.2-jre") + implementation(group = "com.google.guava", name = "guava", version = "30.1.1-jre") implementation(group = "com.github.petitparser", name = "java-petitparser", version = "2.3.1") - implementation(group = "com.squareup.okhttp3", name = "okhttp", version = "3.7.0") - implementation(group = "org.slf4j", name = "slf4j-api", version = "1.7.12") - implementation(group = "org.slf4j", name = "slf4j-simple", version = "1.7.12") + implementation(group = "com.squareup.okhttp3", name = "okhttp", version = "4.9.1") + implementation(group = "org.slf4j", name = "slf4j-api", version = "1.7.32") + implementation(group = "org.slf4j", name = "slf4j-simple", version = "1.7.32") implementation(group = "org.junit.jupiter", name = "junit-jupiter-api", version = "5.7.0") } From 0d0e75b825251929754eb1288e64a5372dbd6fef Mon Sep 17 00:00:00 2001 From: superiorser9 Date: Wed, 11 Aug 2021 14:58:44 +0100 Subject: [PATCH 32/77] screenshot: Capture collection log popup notifications --- .../main/java/net/runelite/api/ScriptID.java | 14 +++++++ .../java/net/runelite/api/VarClientStr.java | 4 +- .../main/java/net/runelite/api/Varbits.java | 12 +++++- .../plugins/screenshot/ScreenshotPlugin.java | 34 ++++++++++++++++- .../screenshot/ScreenshotPluginTest.java | 38 +++++++++++++++++++ 5 files changed, 99 insertions(+), 3 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/ScriptID.java b/runelite-api/src/main/java/net/runelite/api/ScriptID.java index 0ba345626d..0795e2d2c3 100644 --- a/runelite-api/src/main/java/net/runelite/api/ScriptID.java +++ b/runelite-api/src/main/java/net/runelite/api/ScriptID.java @@ -411,4 +411,18 @@ public final class ScriptID @ScriptArguments(integer = 6) public static final int COLLECTION_DRAW_LIST = 2730; + + /** + * Draws the active notification in increasing sizes (increasing horizontally first, then vertically) to show a + * starting animation. + */ + @ScriptArguments(integer = 3) + public static final int NOTIFICATION_START = 3346; + + /** + * Draws the active notification in full size for a specified number of client ticks. In essence, delayed between + * the open and close animations. + */ + @ScriptArguments(integer = 1) + public static final int NOTIFICATION_DELAY = 3347; } \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/VarClientStr.java b/runelite-api/src/main/java/net/runelite/api/VarClientStr.java index 3c6c4bd528..e8749b1eb2 100644 --- a/runelite-api/src/main/java/net/runelite/api/VarClientStr.java +++ b/runelite-api/src/main/java/net/runelite/api/VarClientStr.java @@ -42,7 +42,9 @@ public enum VarClientStr CHATBOX_TYPED_TEXT(335), INPUT_TEXT(359), PRIVATE_MESSAGE_TARGET(360), - RECENT_FRIENDS_CHAT(362); + RECENT_FRIENDS_CHAT(362), + NOTIFICATION_TOP_TEXT(387), + NOTIFICATION_BOTTOM_TEXT(388); private final int index; } diff --git a/runelite-api/src/main/java/net/runelite/api/Varbits.java b/runelite-api/src/main/java/net/runelite/api/Varbits.java index bf7ffe4ef4..625fd94780 100644 --- a/runelite-api/src/main/java/net/runelite/api/Varbits.java +++ b/runelite-api/src/main/java/net/runelite/api/Varbits.java @@ -633,7 +633,17 @@ public enum Varbits * * @see The OSRS Wiki's Minimap page */ - PVP_SPEC_ORB(8121); + PVP_SPEC_ORB(8121), + + /** + * Collection Log notification settings whenever a new item is added + * + * 0 = no notification + * 1 = chat notification only + * 2 = popup notification only + * 3 = chat and popup + */ + COLLECTION_LOG_NOTIFICATION(11959); /** * The raw varbit ID. diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java index f7c8c9e440..2813d835e1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java @@ -51,11 +51,15 @@ import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.Player; import net.runelite.api.Point; +import net.runelite.api.ScriptID; import net.runelite.api.SpriteID; +import net.runelite.api.VarClientStr; +import net.runelite.api.Varbits; import net.runelite.api.events.ActorDeath; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.GameTick; import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.api.events.ScriptPreFired; import net.runelite.api.events.WidgetLoaded; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetID; @@ -148,6 +152,7 @@ public class ScreenshotPlugin extends Plugin private Integer killCountNumber; private boolean shouldTakeScreenshot; + private boolean notificationStarted; @Inject private ScreenshotConfig config; @@ -239,6 +244,7 @@ public class ScreenshotPlugin extends Plugin clientToolbar.removeNavigation(titleBarButton); keyManager.unregisterKeyListener(hotkeyListener); kickPlayerName = null; + notificationStarted = false; } @Subscribe @@ -479,7 +485,7 @@ public class ScreenshotPlugin extends Plugin } } - if (config.screenshotCollectionLogEntries() && chatMessage.startsWith(COLLECTION_LOG_TEXT)) + if (config.screenshotCollectionLogEntries() && chatMessage.startsWith(COLLECTION_LOG_TEXT) && client.getVar(Varbits.COLLECTION_LOG_NOTIFICATION) == 1) { String entry = Text.removeTags(chatMessage).substring(COLLECTION_LOG_TEXT.length()); String fileName = "Collection log (" + entry + ")"; @@ -622,6 +628,32 @@ public class ScreenshotPlugin extends Plugin takeScreenshot(fileName, screenshotSubDir); } + @Subscribe + public void onScriptPreFired(ScriptPreFired scriptPreFired) + { + switch (scriptPreFired.getScriptId()) + { + case ScriptID.NOTIFICATION_START: + notificationStarted = true; + break; + case ScriptID.NOTIFICATION_DELAY: + if (!notificationStarted) + { + return; + } + String topText = client.getVar(VarClientStr.NOTIFICATION_TOP_TEXT); + String bottomText = client.getVar(VarClientStr.NOTIFICATION_BOTTOM_TEXT); + if (topText.equalsIgnoreCase("Collection log") && config.screenshotCollectionLogEntries()) + { + String entry = Text.removeTags(bottomText).substring("New item:".length()); + String fileName = "Collection log (" + entry + ")"; + takeScreenshot(fileName, SD_COLLECTION_LOG); + } + notificationStarted = false; + break; + } + } + private void manualScreenshot() { takeScreenshot("", null); diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java index 2664c031e7..47b6f14fca 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java @@ -32,8 +32,12 @@ import java.util.function.Consumer; import javax.inject.Inject; import static net.runelite.api.ChatMessageType.GAMEMESSAGE; import net.runelite.api.Client; +import net.runelite.api.ScriptID; +import net.runelite.api.VarClientStr; +import net.runelite.api.Varbits; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.GameTick; +import net.runelite.api.events.ScriptPreFired; import net.runelite.api.events.WidgetLoaded; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetID; @@ -59,6 +63,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import org.mockito.junit.MockitoJUnitRunner; @@ -76,6 +81,7 @@ public class ScreenshotPluginTest private static final String UNTRADEABLE_DROP = "Untradeable drop: Rusty sword"; private static final String BA_HIGH_GAMBLE_REWARD = "Raw shark (x 300)!
High level gamble count: 100"; private static final String HUNTER_LEVEL_2_TEXT = "Congratulations, you've just advanced a Hunter level.

Your Hunter level is now 2."; + private static final String COLLECTION_LOG_CHAT = "New item added to your collection log: Chompy bird hat"; @Mock @Bind @@ -128,6 +134,7 @@ public class ScreenshotPluginTest when(screenshotConfig.screenshotValuableDrop()).thenReturn(true); when(screenshotConfig.valuableDropThreshold()).thenReturn(1000); when(screenshotConfig.screenshotUntradeableDrop()).thenReturn(true); + when(screenshotConfig.screenshotCollectionLogEntries()).thenReturn(true); } @Test @@ -386,4 +393,35 @@ public class ScreenshotPluginTest verify(drawManager, times(0)).requestNextFrameListener(any(Consumer.class)); } + + @Test + public void testCollectionLogPopup() + { + ScriptPreFired notificationStart = new ScriptPreFired(ScriptID.NOTIFICATION_START); + screenshotPlugin.onScriptPreFired(notificationStart); + + when(client.getVar(VarClientStr.NOTIFICATION_TOP_TEXT)).thenReturn("Collection log"); + when(client.getVar(VarClientStr.NOTIFICATION_BOTTOM_TEXT)).thenReturn("New item:

Chompy bird hat"); + + ScriptPreFired notificationDelay = new ScriptPreFired(ScriptID.NOTIFICATION_DELAY); + screenshotPlugin.onScriptPreFired(notificationDelay); + + verify(drawManager).requestNextFrameListener(any(Consumer.class)); + } + + @Test + public void testCollectionLogChat() + { + ChatMessage chatMessageEvent = new ChatMessage(null, GAMEMESSAGE, "", COLLECTION_LOG_CHAT, null, 0); + + when(client.getVar(Varbits.COLLECTION_LOG_NOTIFICATION)).thenReturn(1); + screenshotPlugin.onChatMessage(chatMessageEvent); + + verify(drawManager).requestNextFrameListener(any(Consumer.class)); + + when(client.getVar(Varbits.COLLECTION_LOG_NOTIFICATION)).thenReturn(3); + screenshotPlugin.onChatMessage(chatMessageEvent); + + verifyNoMoreInteractions(drawManager); + } } From 3a64e1063e0833d31d2bf6ee2f3c28452271b625 Mon Sep 17 00:00:00 2001 From: Patrick Watts Date: Tue, 21 Sep 2021 11:41:54 +0400 Subject: [PATCH 33/77] screenshot: Add clan member death screenshotting (#14052) --- .../plugins/screenshot/ScreenshotConfig.java | 28 +++++++++++++------ .../plugins/screenshot/ScreenshotPlugin.java | 5 +++- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotConfig.java index 1dd5c53174..f7498f7af3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotConfig.java @@ -181,11 +181,23 @@ public interface ScreenshotConfig extends Config return false; } + @ConfigItem( + keyName = "clanDeath", + name = "Screenshot Clan Deaths", + description = "Configures whether or not screenshots are automatically taken when clan members die.", + position = 12, + section = whatSection + ) + default boolean screenshotClanDeath() + { + return false; + } + @ConfigItem( keyName = "duels", name = "Screenshot Duels", description = "Configures whether or not screenshots are automatically taken of the duel end screen.", - position = 12, + position = 13, section = whatSection ) default boolean screenshotDuels() @@ -197,7 +209,7 @@ public interface ScreenshotConfig extends Config keyName = "valuableDrop", name = "Screenshot Valuable drops", description = "Configures whether or not screenshots are automatically taken when you receive a valuable drop.", - position = 13, + position = 14, section = whatSection ) default boolean screenshotValuableDrop() @@ -209,7 +221,7 @@ public interface ScreenshotConfig extends Config keyName = "valuableDropThreshold", name = "Valuable Threshold", description = "The minimum value to save screenshots of valuable drops.", - position = 14, + position = 15, section = whatSection ) default int valuableDropThreshold() @@ -221,7 +233,7 @@ public interface ScreenshotConfig extends Config keyName = "untradeableDrop", name = "Screenshot Untradeable drops", description = "Configures whether or not screenshots are automatically taken when you receive an untradeable drop.", - position = 15, + position = 16, section = whatSection ) default boolean screenshotUntradeableDrop() @@ -233,7 +245,7 @@ public interface ScreenshotConfig extends Config keyName = "ccKick", name = "Screenshot Kicks from FC", description = "Take a screenshot when you kick a user from a friends chat.", - position = 16, + position = 17, section = whatSection ) default boolean screenshotKick() @@ -245,7 +257,7 @@ public interface ScreenshotConfig extends Config keyName = "baHighGamble", name = "Screenshot BA high gambles", description = "Take a screenshot of your reward from a high gamble at Barbarian Assault.", - position = 17, + position = 18, section = whatSection ) default boolean screenshotHighGamble() @@ -257,7 +269,7 @@ public interface ScreenshotConfig extends Config keyName = "collectionLogEntries", name = "Screenshot collection log entries", description = "Take a screenshot when completing an entry in the collection log", - position = 18, + position = 19, section = whatSection ) default boolean screenshotCollectionLogEntries() @@ -269,7 +281,7 @@ public interface ScreenshotConfig extends Config keyName = "hotkey", name = "Screenshot hotkey", description = "When you press this key a screenshot will be taken", - position = 19 + position = 20 ) default Keybind hotkey() { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java index 2813d835e1..c64e7c06b9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java @@ -308,7 +308,10 @@ public class ScreenshotPlugin extends Plugin { takeScreenshot("Death", SD_DEATHS); } - else if (player != client.getLocalPlayer() && (player.isFriendsChatMember() || player.isFriend()) && config.screenshotFriendDeath() && player.getCanvasTilePoly() != null) + else if (player != client.getLocalPlayer() + && player.getCanvasTilePoly() != null + && (((player.isFriendsChatMember() || player.isFriend()) && config.screenshotFriendDeath()) + || (player.isClanMember() && config.screenshotClanDeath()))) { takeScreenshot("Death " + player.getName(), SD_DEATHS); } From c08c6d80e8ba41d3743208b4bdf6dfe7e19608c8 Mon Sep 17 00:00:00 2001 From: pwatts6060 Date: Tue, 21 Sep 2021 00:55:34 -0700 Subject: [PATCH 34/77] api: Add contains methods to WorldPoint and WorldArea --- .../net/runelite/api/coords/WorldArea.java | 20 +++++++++++ .../net/runelite/api/coords/WorldPoint.java | 36 +++++++++++++++++++ .../npcunaggroarea/NpcAggroAreaPlugin.java | 2 +- 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/runelite-api/src/main/java/net/runelite/api/coords/WorldArea.java b/runelite-api/src/main/java/net/runelite/api/coords/WorldArea.java index 3e34427459..e0ae129a44 100644 --- a/runelite-api/src/main/java/net/runelite/api/coords/WorldArea.java +++ b/runelite-api/src/main/java/net/runelite/api/coords/WorldArea.java @@ -160,6 +160,26 @@ public class WorldArea return distanceTo2D(new WorldArea(other, 1, 1)); } + /** + * Checks whether a tile is contained within the area and in the same plane. + * + * @return {@code true} if the tile is contained within the bounds of this area, {@code false} otherwise. + */ + public boolean contains(WorldPoint worldPoint) + { + return distanceTo(worldPoint) == 0; + } + + /** + * Checks whether a tile is contained within the area while ignoring the plane. + * + * @return {@code true} if the tile is contained within the bounds of this area regardless of plane, {@code false} otherwise. + */ + public boolean contains2D(WorldPoint worldPoint) + { + return distanceTo2D(worldPoint) == 0; + } + /** * Checks whether this area is within melee distance of another. *

diff --git a/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java b/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java index 88520c6de0..d24174feab 100644 --- a/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java +++ b/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java @@ -557,4 +557,40 @@ public class WorldPoint } return worldPoint; } + + /** + * Checks whether this tile is located within any of the given areas. + * + * @param worldAreas areas to check within + * @return {@code true} if any area contains this point, {@code false} otherwise. + */ + public boolean isInArea(WorldArea... worldAreas) + { + for (WorldArea area : worldAreas) + { + if (area.contains(this)) + { + return true; + } + } + return false; + } + + /** + * Checks whether this tile is located within any of the given areas, disregarding any plane differences. + * + * @param worldAreas areas to check within + * @return {@code true} if any area contains this point, {@code false} otherwise. + */ + public boolean isInArea2D(WorldArea... worldAreas) + { + for (WorldArea area : worldAreas) + { + if (area.contains2D(this)) + { + return true; + } + } + return false; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java index cf4830ebd7..148876e631 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java @@ -248,7 +248,7 @@ public class NpcAggroAreaPlugin extends Plugin private static boolean isInWilderness(WorldPoint location) { - return WILDERNESS_ABOVE_GROUND.distanceTo2D(location) == 0 || WILDERNESS_UNDERGROUND.distanceTo2D(location) == 0; + return location.isInArea2D(WILDERNESS_ABOVE_GROUND, WILDERNESS_UNDERGROUND); } private boolean isNpcMatch(NPC npc) From d6579901c62fc24e522733665b1a3c8fdecb3623 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Sat, 25 Sep 2021 03:01:43 +0200 Subject: [PATCH 35/77] api(mixins): More object methods exposed --- .../src/main/java/net/runelite/api/Node.java | 5 ++ .../src/main/java/net/runelite/api/Scene.java | 50 ++++++++++++++++ .../net/runelite/mixins/RSSceneMixin.java | 60 +++++++++++++++++++ .../java/net/runelite/rs/api/RSScene.java | 21 +++++++ runescape-client/src/main/java/Scene.java | 9 ++- .../src/main/java/ScriptFrame.java | 6 +- 6 files changed, 145 insertions(+), 6 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/Node.java b/runelite-api/src/main/java/net/runelite/api/Node.java index 56d2755e74..bd1cf8c7cb 100644 --- a/runelite-api/src/main/java/net/runelite/api/Node.java +++ b/runelite-api/src/main/java/net/runelite/api/Node.java @@ -43,6 +43,11 @@ public interface Node */ Node getPrevious(); + /** + * Unlink. + */ + void unlink(); + /** * Gets the hash value of the node. * diff --git a/runelite-api/src/main/java/net/runelite/api/Scene.java b/runelite-api/src/main/java/net/runelite/api/Scene.java index b7f5103c4c..e40fedf690 100644 --- a/runelite-api/src/main/java/net/runelite/api/Scene.java +++ b/runelite-api/src/main/java/net/runelite/api/Scene.java @@ -71,6 +71,56 @@ public interface Scene */ void removeGameObject(GameObject gameObject); + /** + * Remove a game object from the scene + * @param plane + * @param x + * @param y + */ + void removeGameObject(int plane, int x, int y); + + /** + * Remove a game object from the scene + * @param wallObject + */ + void removeWallObject(WallObject wallObject); + + /** + * Remove a wall object from the scene + * @param plane + * @param x + * @param y + */ + void removeWallObject(int plane, int x, int y); + + /** + * Remove a decorative object from the scene + * @param decorativeObject + */ + void removeDecorativeObject(DecorativeObject decorativeObject); + + /** + * Remove a decorative object from the scene + * @param plane + * @param x + * @param y + */ + void removeDecorativeObject(int plane, int x, int y); + + /** + * Remove a ground object from the scene + * @param groundObject + */ + void removeGroundObject(GroundObject groundObject); + + /** + * Remove a ground object from the scene + * @param plane + * @param x + * @param y + */ + void removeGroundObject(int plane, int x, int y); + void generateHouses(); void setRoofRemovalMode(int flags); diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java index 303bda7f90..6273fe8f56 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java @@ -30,10 +30,13 @@ 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.DecorativeObject; +import net.runelite.api.GroundObject; import net.runelite.api.Perspective; import net.runelite.api.SceneTileModel; import net.runelite.api.SceneTilePaint; import net.runelite.api.Tile; +import net.runelite.api.WallObject; import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; import net.runelite.api.hooks.DrawCallbacks; @@ -1240,4 +1243,61 @@ public abstract class RSSceneMixin implements RSScene { rl$tileShapes = tileShapes; } + + @Inject + @Override + public void removeWallObject(WallObject wallObject) + { + final Tile[][][] tiles = getTiles(); + + for (int y = 0; y < 104; ++y) + { + for (int x = 0; x < 104; ++x) + { + Tile tile = tiles[client.getPlane()][x][y]; + if (tile != null && tile.getWallObject() == wallObject) + { + tile.setWallObject(null); + } + } + } + } + + @Inject + @Override + public void removeDecorativeObject(DecorativeObject decorativeObject) + { + final Tile[][][] tiles = getTiles(); + + for (int y = 0; y < 104; ++y) + { + for (int x = 0; x < 104; ++x) + { + Tile tile = tiles[client.getPlane()][x][y]; + if (tile != null && tile.getDecorativeObject() == decorativeObject) + { + tile.setDecorativeObject(null); + } + } + } + } + + @Inject + @Override + public void removeGroundObject(GroundObject groundObject) + { + final Tile[][][] tiles = getTiles(); + + for (int y = 0; y < 104; ++y) + { + for (int x = 0; x < 104; ++x) + { + Tile tile = tiles[client.getPlane()][x][y]; + if (tile != null && tile.getGroundObject() == groundObject) + { + tile.setGroundObject(null); + } + } + } + } } \ No newline at end of file diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSScene.java b/runescape-api/src/main/java/net/runelite/rs/api/RSScene.java index e4dda41f0d..af1f331fe9 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSScene.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSScene.java @@ -1,8 +1,11 @@ package net.runelite.rs.api; +import net.runelite.api.DecorativeObject; import net.runelite.api.GameObject; +import net.runelite.api.GroundObject; import net.runelite.api.Scene; import net.runelite.api.Tile; +import net.runelite.api.WallObject; import net.runelite.mapping.Import; public interface RSScene extends Scene @@ -56,6 +59,24 @@ public interface RSScene extends Scene @Import("removeGameObject") void removeGameObject(GameObject gameObject); + @Import("removeGameObject") + void removeGameObject(int plane, int x, int y); + + void removeWallObject(WallObject wallObject); + + @Import("removeBoundaryObject") + void removeWallObject(int plane, int x, int y); + + void removeDecorativeObject(DecorativeObject decorativeObject); + + @Import("removeWallDecoration") + void removeDecorativeObject(int plane, int x, int y); + + void removeGroundObject(GroundObject groundObject); + + @Import("removeFloorDecoration") + void removeGroundObject(int plane, int x, int y); + byte[][][] getUnderlayIds(); void setUnderlayIds(byte[][][] underlayIds); diff --git a/runescape-client/src/main/java/Scene.java b/runescape-client/src/main/java/Scene.java index 45f73f98fc..aeb44a5f45 100644 --- a/runescape-client/src/main/java/Scene.java +++ b/runescape-client/src/main/java/Scene.java @@ -721,7 +721,8 @@ public class Scene { @ObfuscatedSignature( descriptor = "(III)Lhn;" ) - public BoundaryObject method4155(int var1, int var2, int var3) { + @Export("getBoundaryObject") + public BoundaryObject getBoundaryObject(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; return var4 == null ? null : var4.boundaryObject; } @@ -730,7 +731,8 @@ public class Scene { @ObfuscatedSignature( descriptor = "(III)Lhh;" ) - public WallDecoration method4156(int var1, int var2, int var3) { + @Export("getWallDecoration") + public WallDecoration getWallDecoration(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; return var4 == null ? null : var4.wallDecoration; } @@ -739,7 +741,8 @@ public class Scene { @ObfuscatedSignature( descriptor = "(III)Lhj;" ) - public GameObject method4180(int var1, int var2, int var3) { + @Export("getGameObject") + public GameObject getGameObject(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; if (var4 == null) { return null; diff --git a/runescape-client/src/main/java/ScriptFrame.java b/runescape-client/src/main/java/ScriptFrame.java index 725d92f661..71feaa1b70 100644 --- a/runescape-client/src/main/java/ScriptFrame.java +++ b/runescape-client/src/main/java/ScriptFrame.java @@ -412,7 +412,7 @@ public class ScriptFrame { var9 = Client.field549[var7]; if (var3 >= 0 && var4 >= 0 && var3 < 103 && var4 < 103) { if (var9 == 0) { - BoundaryObject var33 = CollisionMap.scene.method4155(class391.Client_plane, var3, var4); + BoundaryObject var33 = CollisionMap.scene.getBoundaryObject(class391.Client_plane, var3, var4); if (var33 != null) { var11 = HealthBarDefinition.Entity_unpackID(var33.tag); if (var7 == 2) { @@ -425,7 +425,7 @@ public class ScriptFrame { } if (var9 == 1) { - WallDecoration var43 = CollisionMap.scene.method4156(class391.Client_plane, var3, var4); + WallDecoration var43 = CollisionMap.scene.getWallDecoration(class391.Client_plane, var3, var4); if (var43 != null) { var11 = HealthBarDefinition.Entity_unpackID(var43.tag); if (var7 != 4 && var7 != 5) { @@ -444,7 +444,7 @@ public class ScriptFrame { } if (var9 == 2) { - GameObject var44 = CollisionMap.scene.method4180(class391.Client_plane, var3, var4); + GameObject var44 = CollisionMap.scene.getGameObject(class391.Client_plane, var3, var4); if (var7 == 11) { var7 = 10; } From 4938b84123232362f95d8ee74791b3c9ec510955 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Sat, 25 Sep 2021 23:07:03 +0200 Subject: [PATCH 36/77] feat: biem boem bam --- .../java/com/openosrs/injector/Injector.java | 6 + .../injector/injection/InjectData.java | 16 +- .../injectors/raw/GraphicsObject.java | 56 +++++++ .../injectors/raw/RuneliteObject.java | 103 ++++++++++++ .../net/runelite/mixins/RSClientMixin.java | 43 ++++- .../mixins/RSGraphicsObjectMixin.java | 35 ++++ .../mixins/RSObjectCompositionMixin.java | 11 ++ .../runelite/mixins/RuneLiteObjectMixin.java | 158 ++++++++++++++++++ .../java/net/runelite/rs/api/RSClient.java | 6 + .../net/runelite/rs/api/RSGraphicsObject.java | 36 ++++ .../java/net/runelite/rs/api/RSModelData.java | 12 ++ .../net/runelite/rs/api/RSRuneLiteObject.java | 10 ++ .../runelite/rs/api/RSSequenceDefinition.java | 6 +- .../rs/api/RSSpotAnimationDefinition.java | 17 +- .../src/main/java/BuddyRankComparator.java | 2 +- .../src/main/java/ClientPreferences.java | 11 +- runescape-client/src/main/java/Fonts.java | 4 +- .../src/main/java/GraphicsObject.java | 11 +- .../src/main/java/RuneLiteObject.java | 68 ++++++++ runescape-client/src/main/java/Varps.java | 2 +- runescape-client/src/main/java/class184.java | 2 +- 21 files changed, 589 insertions(+), 26 deletions(-) create mode 100644 injector/src/main/java/com/openosrs/injector/injectors/raw/GraphicsObject.java create mode 100644 injector/src/main/java/com/openosrs/injector/injectors/raw/RuneliteObject.java create mode 100644 runelite-mixins/src/main/java/net/runelite/mixins/RuneLiteObjectMixin.java create mode 100644 runescape-api/src/main/java/net/runelite/rs/api/RSRuneLiteObject.java create mode 100644 runescape-client/src/main/java/RuneLiteObject.java diff --git a/injector/src/main/java/com/openosrs/injector/Injector.java b/injector/src/main/java/com/openosrs/injector/Injector.java index 1a99787dde..9c2903f7e0 100644 --- a/injector/src/main/java/com/openosrs/injector/Injector.java +++ b/injector/src/main/java/com/openosrs/injector/Injector.java @@ -18,9 +18,11 @@ import com.openosrs.injector.injectors.RSApiInjector; import com.openosrs.injector.injectors.raw.AddPlayerToMenu; import com.openosrs.injector.injectors.raw.ClearColorBuffer; import com.openosrs.injector.injectors.raw.DrawMenu; +import com.openosrs.injector.injectors.raw.GraphicsObject; import com.openosrs.injector.injectors.raw.Occluder; import com.openosrs.injector.injectors.raw.RasterizerAlpha; import com.openosrs.injector.injectors.raw.RenderDraw; +import com.openosrs.injector.injectors.raw.RuneliteObject; import com.openosrs.injector.injectors.raw.ScriptVM; import com.openosrs.injector.rsapi.RSApi; import com.openosrs.injector.transformers.InjectTransformer; @@ -109,6 +111,8 @@ public class Injector extends InjectData implements InjectTaskHandler inject(new CreateAnnotations(this)); + inject(new RuneliteObject(this)); + inject(new InterfaceInjector(this)); inject(new RasterizerAlpha(this)); @@ -138,6 +142,8 @@ public class Injector extends InjectData implements InjectTaskHandler inject(new AddPlayerToMenu(this)); + inject(new GraphicsObject(this)); + validate(new InjectorValidator(this)); transform(new SourceChanger(this)); diff --git a/injector/src/main/java/com/openosrs/injector/injection/InjectData.java b/injector/src/main/java/com/openosrs/injector/injection/InjectData.java index be301c7324..ea1af6a0a4 100644 --- a/injector/src/main/java/com/openosrs/injector/injection/InjectData.java +++ b/injector/src/main/java/com/openosrs/injector/injection/InjectData.java @@ -7,7 +7,6 @@ */ package com.openosrs.injector.injection; -import com.google.common.collect.ImmutableMap; import com.openosrs.injector.InjectUtil; import com.openosrs.injector.injectors.Injector; import com.openosrs.injector.rsapi.RSApi; @@ -45,7 +44,7 @@ public abstract class InjectData /** * Deobfuscated ClassFiles -> Vanilla ClassFiles */ - public Map toVanilla; + public final Map toVanilla = new HashMap<>(); /** * Strings -> Deobfuscated ClassFiles @@ -53,14 +52,12 @@ public abstract class InjectData * - Obfuscated name * - RSApi implementing name */ - private final Map toDeob = new HashMap<>(); + public final Map toDeob = new HashMap<>(); public abstract void runChildInjector(Injector injector); public void initToVanilla() { - ImmutableMap.Builder toVanillaB = ImmutableMap.builder(); - for (final ClassFile deobClass : deobfuscated) { if (deobClass.getName().startsWith("net/runelite/") || deobClass.getName().startsWith("netscape")) @@ -73,13 +70,14 @@ public abstract class InjectData { toDeob.put(obName, deobClass); - // Can't be null final ClassFile obClass = this.vanilla.findClass(obName); - toVanillaB.put(deobClass, obClass); + + if (obClass != null) + { + toVanilla.put(deobClass, obClass); + } } } - - this.toVanilla = toVanillaB.build(); } /** diff --git a/injector/src/main/java/com/openosrs/injector/injectors/raw/GraphicsObject.java b/injector/src/main/java/com/openosrs/injector/injectors/raw/GraphicsObject.java new file mode 100644 index 0000000000..7b3e74d14c --- /dev/null +++ b/injector/src/main/java/com/openosrs/injector/injectors/raw/GraphicsObject.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2021, Owain van Brakel + * All rights reserved. + * + * This code is licensed under GPL3, see the complete license in + * the LICENSE file in the root directory of this submodule. + */ +package com.openosrs.injector.injectors.raw; + +import com.openosrs.injector.injection.InjectData; +import com.openosrs.injector.injectors.AbstractInjector; +import net.runelite.asm.ClassFile; +import net.runelite.asm.Method; +import net.runelite.asm.attributes.Code; +import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.attributes.code.instructions.ALoad; +import net.runelite.asm.attributes.code.instructions.InvokeSpecial; +import net.runelite.asm.attributes.code.instructions.VReturn; +import net.runelite.asm.signature.Signature; + +public class GraphicsObject extends AbstractInjector +{ + public GraphicsObject(InjectData inject) + { + super(inject); + } + + public void inject() + { + final ClassFile graphicsObjectVanilla = inject.toVanilla( + inject.getDeobfuscated() + .findClass("GraphicsObject") + ); + + final ClassFile renderableVanilla = inject.toVanilla( + inject.getDeobfuscated() + .findClass("Renderable") + ); + + graphicsObjectVanilla.clearFinal(); + + Method initGraphicsObject = new Method(graphicsObjectVanilla, "", new Signature("()V")); + initGraphicsObject.setPublic(); + + final Code code = new Code(initGraphicsObject); + code.setMaxStack(1); + initGraphicsObject.setCode(code); + graphicsObjectVanilla.addMethod(initGraphicsObject); + + Instructions ins = code.getInstructions(); + + ins.addInstruction(new ALoad(ins, 0)); + ins.addInstruction(new InvokeSpecial(ins, new net.runelite.asm.pool.Method(renderableVanilla.getPoolClass(), "", new Signature("()V")))); + ins.addInstruction(new VReturn(ins)); + } +} diff --git a/injector/src/main/java/com/openosrs/injector/injectors/raw/RuneliteObject.java b/injector/src/main/java/com/openosrs/injector/injectors/raw/RuneliteObject.java new file mode 100644 index 0000000000..0cfeba8cd2 --- /dev/null +++ b/injector/src/main/java/com/openosrs/injector/injectors/raw/RuneliteObject.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2021, Owain van Brakel + * All rights reserved. + * + * This code is licensed under GPL3, see the complete license in + * the LICENSE file in the root directory of this submodule. + */ +package com.openosrs.injector.injectors.raw; + +import com.openosrs.injector.injection.InjectData; +import com.openosrs.injector.injectors.AbstractInjector; +import java.util.List; +import net.runelite.asm.ClassFile; +import net.runelite.asm.Method; +import net.runelite.asm.attributes.Code; +import net.runelite.asm.attributes.code.Instruction; +import net.runelite.asm.attributes.code.InstructionType; +import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.attributes.code.instructions.ALoad; +import net.runelite.asm.attributes.code.instructions.Dup; +import net.runelite.asm.attributes.code.instructions.InvokeSpecial; +import net.runelite.asm.attributes.code.instructions.New; +import net.runelite.asm.attributes.code.instructions.Return; +import net.runelite.asm.attributes.code.instructions.VReturn; +import net.runelite.asm.signature.Signature; +import org.objectweb.asm.Opcodes; + +public class RuneliteObject extends AbstractInjector +{ + private static final String RUNELITE_OBJECT = "RuneLiteObject"; + + public RuneliteObject(InjectData inject) + { + super(inject); + } + + public void inject() + { + ClassFile runeliteObjectVanilla = inject.vanilla.findClass(RUNELITE_OBJECT); + + final ClassFile graphicsObjectVanilla = inject.toVanilla( + inject.getDeobfuscated() + .findClass("GraphicsObject") + ); + + graphicsObjectVanilla.clearFinal(); + + final ClassFile clientVanilla = inject.toVanilla( + inject.getDeobfuscated() + .findClass("Client") + ); + + final ClassFile runeLiteObjectDeob = inject.getDeobfuscated() + .findClass(RUNELITE_OBJECT); + + if (runeliteObjectVanilla == null) + { + runeliteObjectVanilla = new ClassFile(inject.vanilla); + runeliteObjectVanilla.setName(RUNELITE_OBJECT); + runeliteObjectVanilla.setParentClass(graphicsObjectVanilla.getPoolClass()); + runeliteObjectVanilla.setAccess(Opcodes.ACC_PUBLIC); + runeliteObjectVanilla.setVersion(Opcodes.V1_8); + inject.vanilla.addClass(runeliteObjectVanilla); + + inject.toVanilla.put(runeLiteObjectDeob, runeliteObjectVanilla); + } + + { + Method initRuneliteObject = new Method(runeliteObjectVanilla, "", new Signature("()V")); + initRuneliteObject.setPublic(); + + final Code code = new Code(initRuneliteObject); + code.setMaxStack(1); + initRuneliteObject.setCode(code); + runeliteObjectVanilla.addMethod(initRuneliteObject); + + final Instructions instructions = code.getInstructions(); + final List ins = instructions.getInstructions(); + + ins.add(new ALoad(instructions, 0)); + ins.add(new InvokeSpecial(instructions, new net.runelite.asm.pool.Method(graphicsObjectVanilla.getPoolClass(), "", new Signature("()V")))); + ins.add(new VReturn(instructions)); + } + + { + Method copy = new Method(clientVanilla, "createRuneLiteObject", new Signature("()Lnet/runelite/api/RuneLiteObject;")); + copy.setPublic(); + + final Code code = new Code(copy); + code.setMaxStack(2); + copy.setCode(code); + clientVanilla.addMethod(copy); + + final Instructions instructions = code.getInstructions(); + final List ins = instructions.getInstructions(); + + ins.add(new New(instructions, runeliteObjectVanilla.getPoolClass())); + ins.add(new Dup(instructions)); + ins.add(new InvokeSpecial(instructions, new net.runelite.asm.pool.Method(runeliteObjectVanilla.getPoolClass(), "", new Signature("()V")))); + ins.add(new Return(instructions, InstructionType.ARETURN)); + } + } +} diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java index 119fc17088..10fb361050 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -53,9 +53,18 @@ import net.runelite.api.IntegerNode; import net.runelite.api.InventoryID; import net.runelite.api.ItemComposition; import net.runelite.api.MenuAction; -import static net.runelite.api.MenuAction.*; +import static net.runelite.api.MenuAction.PLAYER_EIGTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_FIFTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_FIRST_OPTION; +import static net.runelite.api.MenuAction.PLAYER_FOURTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_SECOND_OPTION; +import static net.runelite.api.MenuAction.PLAYER_SEVENTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_SIXTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_THIRD_OPTION; +import static net.runelite.api.MenuAction.UNKNOWN; import net.runelite.api.MenuEntry; import net.runelite.api.MessageNode; +import net.runelite.api.Model; import net.runelite.api.NPC; import net.runelite.api.NPCComposition; import net.runelite.api.NameableContainer; @@ -68,6 +77,7 @@ import net.runelite.api.Point; import net.runelite.api.Prayer; import net.runelite.api.Projectile; import net.runelite.api.ScriptEvent; +import net.runelite.api.Sequence; import net.runelite.api.Skill; import net.runelite.api.SpritePixels; import net.runelite.api.StructComposition; @@ -124,8 +134,8 @@ import net.runelite.api.widgets.WidgetConfig; import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.widgets.WidgetItem; import net.runelite.api.widgets.WidgetType; -import net.runelite.rs.api.RSArchive; import net.runelite.rs.api.RSAbstractArchive; +import net.runelite.rs.api.RSArchive; import net.runelite.rs.api.RSChatChannel; import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSEnumComposition; @@ -133,6 +143,7 @@ import net.runelite.rs.api.RSFriendSystem; import net.runelite.rs.api.RSIndexedSprite; import net.runelite.rs.api.RSInterfaceParent; import net.runelite.rs.api.RSItemContainer; +import net.runelite.rs.api.RSModelData; import net.runelite.rs.api.RSNPC; import net.runelite.rs.api.RSNode; import net.runelite.rs.api.RSNodeDeque; @@ -2311,5 +2322,33 @@ public abstract class RSClientMixin implements RSClient scene.setTileShapes(Arrays.copyOf(tileShapes, tileShapes.length)); } } + + @Inject + public Model loadModel(int id) + { + return loadModel(id, null, null); + } + + @Inject + public Model loadModel(int id, short[] colorToFind, short[] colorToReplace) + { + RSModelData modeldata = client.getModelData(client.getObjectDefinition_modelsArchive(), id, 0); + + if (colorToFind != null) + { + for (int i = 0; i < colorToFind.length; ++i) + { + modeldata.recolor(colorToFind[i], colorToReplace[i]); + } + } + + return modeldata.toModel(modeldata.getAmbient() + 64, modeldata.getContrast() + 850, -30, -50, -30); + } + + @Inject + public Sequence loadAnimation(int id) + { + return client.getSequenceDefinition(id); + } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSGraphicsObjectMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSGraphicsObjectMixin.java index c7757732ba..071e278643 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSGraphicsObjectMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSGraphicsObjectMixin.java @@ -1,12 +1,17 @@ package net.runelite.mixins; +import net.runelite.api.RuneLiteObject; import net.runelite.api.coords.LocalPoint; import net.runelite.api.events.GraphicsObjectCreated; +import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; +import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSGraphicsObject; +import net.runelite.rs.api.RSModel; +import net.runelite.rs.api.RSRuneLiteObject; @Mixin(RSGraphicsObject.class) public abstract class RSGraphicsObjectMixin implements RSGraphicsObject @@ -27,4 +32,34 @@ public abstract class RSGraphicsObjectMixin implements RSGraphicsObject { return new LocalPoint(this.getX(), this.getY()); } + + + @Copy("advance") + @Replace("advance") + public void copy$advance(int var1) + { + if (this instanceof RuneLiteObject) + { + ((RSRuneLiteObject) this).advanceRL(var1); + } + else + { + copy$advance(var1); + } + } + + + @Copy("getModel") + @Replace("getModel") + public RSModel copy$getModel() + { + if (this instanceof RuneLiteObject) + { + return ((RSRuneLiteObject) this).getModelRl(); + } + else + { + return copy$getModel(); + } + } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSObjectCompositionMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSObjectCompositionMixin.java index c98fd60f8a..8cb1da388f 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSObjectCompositionMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSObjectCompositionMixin.java @@ -2,6 +2,7 @@ package net.runelite.mixins; import net.runelite.api.IterableHashTable; import net.runelite.api.Node; +import net.runelite.api.NodeCache; import net.runelite.api.mixins.*; import net.runelite.rs.api.RSBuffer; import net.runelite.rs.api.RSClient; @@ -16,6 +17,16 @@ public abstract class RSObjectCompositionMixin implements RSObjectComposition @Inject private int accessBitMask = 0; + @MethodHook(value = "", end = true) + @Inject + public void rl$init() + { + NodeCache cachedModels2 = client.getCachedModels2(); + cachedModels2.setCapacity(256); + cachedModels2.setRemainingCapacity(256); + cachedModels2.reset(); + } + @Inject @Override public int getAccessBitMask() diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RuneLiteObjectMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RuneLiteObjectMixin.java new file mode 100644 index 0000000000..99d9c61bec --- /dev/null +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RuneLiteObjectMixin.java @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2018, OpenOSRS + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.mixins; + +import net.runelite.api.Model; +import net.runelite.api.Perspective; +import net.runelite.api.Sequence; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.mixins.Inject; +import net.runelite.api.mixins.Mixin; +import net.runelite.api.mixins.Shadow; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSModel; +import net.runelite.rs.api.RSRuneLiteObject; +import net.runelite.rs.api.RSSequenceDefinition; + +@Mixin(RSRuneLiteObject.class) +public abstract class RuneLiteObjectMixin implements RSRuneLiteObject +{ + @Shadow("client") + private static RSClient client; + + @Inject + private static boolean loop; + + @Inject + private static RSModel model; + + @Inject + RuneLiteObjectMixin() + { + setFinished(true); + } + + @Inject + public void setModel(Model var1) + { + model = (RSModel) var1; + } + + @Inject + public void setLocation(LocalPoint localPoint, int plane) + { + setX(localPoint.getX()); + setY(localPoint.getY()); + setLevel(plane); + setHeight(Perspective.getTileHeight(client, localPoint, plane)); + } + + @Inject + public void advanceRL(int var1) + { + if (getSequenceDefinition() != null) + { + if (!finished()) + { + setFrameCycle(getFrameCycle() + var1); + + while (getFrameCycle() > getSequenceDefinition().getFrameLengths()[getFrame()]) + { + setFrameCycle(getFrameCycle() - getSequenceDefinition().getFrameLengths()[getFrame()]); + setFrame(getFrame() + 1); + if (getFrame() >= getSequenceDefinition().getFrameIDs().length) + { + setFinished(true); + break; + } + } + } + + if (loop && finished()) + { + setFinished(false); + setFrame(0); + setFrameCycle(0); + } + } + } + + @Inject + public boolean isActive() + { + return !finished(); + } + + @Inject + public void setActive(boolean active) + { + if (finished() == active) + { + setFinished(!active); + + if (active) + { + setFrame(0); + setFrameCycle(0); + client.getGraphicsObjectDeque().addFirst(this); + } + else + { + unlink(); + } + + } + } + + @Inject + public void setShouldLoop(boolean var1) + { + loop = var1; + } + + @Inject + public void setAnimation(Sequence var1) + { + setFrame(0); + setFrameCycle(0); + setSequenceDefinition((RSSequenceDefinition) var1); + } + + @Inject + public RSModel getModelRl() + { + RSModel model = RuneLiteObjectMixin.model; + if (getSequenceDefinition() != null) + { + model = getSequenceDefinition().transformSpotAnimationModel(model, getFrame()); + } + else + { + model = model.toSharedModel(true); + } + + return model; + } +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java index e0fade4a9f..89fe610bbe 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java @@ -1451,4 +1451,10 @@ public interface RSClient extends RSGameEngine, Client @Import("Tiles_shapes") byte[][][] getTileShapes(); + + @Import("SpotAnimationDefinition_get") + RSSpotAnimationDefinition getSpotAnimationDefinition(int id); + + @Import("ModelData_get") + RSModelData getModelData(RSAbstractArchive var0, int var1, int var2); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSGraphicsObject.java b/runescape-api/src/main/java/net/runelite/rs/api/RSGraphicsObject.java index 3187c22103..fe2bb9fb77 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSGraphicsObject.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSGraphicsObject.java @@ -9,6 +9,9 @@ public interface RSGraphicsObject extends GraphicsObject, RSRenderable @Override int getId(); + @Import("id") + void setId(int id); + @Import("x") int getX(); @@ -30,4 +33,37 @@ public interface RSGraphicsObject extends GraphicsObject, RSRenderable @Import("isFinished") @Override boolean finished(); + + @Import("frame") + int getFrame(); + + @Import("frame") + void setFrame(int frame); + + @Import("frameCycle") + int getFrameCycle(); + + @Import("frameCycle") + void setFrameCycle(int frameCycle); + + @Import("isFinished") + void setFinished(boolean finished); + + @Import("plane") + void setLevel(int level); + + @Import("x") + void setX(int x); + + @Import("y") + void setY(int y); + + @Import("height") + void setHeight(int height); + + @Import("sequenceDefinition") + RSSequenceDefinition getSequenceDefinition(); + + @Import("sequenceDefinition") + void setSequenceDefinition(RSSequenceDefinition sequenceDefinition); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSModelData.java b/runescape-api/src/main/java/net/runelite/rs/api/RSModelData.java index 4a3a519641..3d8cb0e9c0 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSModelData.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSModelData.java @@ -51,4 +51,16 @@ public interface RSModelData extends RSRenderable @Import("vertexVertices") RSVertexNormal[] getVertexVertices(); + + @Import("recolor") + void recolor(short var1, short var2); + + @Import("toModel") + RSModel toModel(int var1, int var2, int var3, int var4, int var5); + + @Import("ambient") + short getAmbient(); + + @Import("contrast") + short getContrast(); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSRuneLiteObject.java b/runescape-api/src/main/java/net/runelite/rs/api/RSRuneLiteObject.java new file mode 100644 index 0000000000..a1bd48c7ba --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSRuneLiteObject.java @@ -0,0 +1,10 @@ +package net.runelite.rs.api; + +import net.runelite.api.RuneLiteObject; + +public interface RSRuneLiteObject extends RuneLiteObject, RSGraphicsObject +{ + void advanceRL(int var1); + + RSModel getModelRl(); +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSSequenceDefinition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSSequenceDefinition.java index 1137851b39..8436ba4d11 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSSequenceDefinition.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSSequenceDefinition.java @@ -1,9 +1,10 @@ package net.runelite.rs.api; +import net.runelite.api.Sequence; import net.runelite.api.SequenceDefinition; import net.runelite.mapping.Import; -public interface RSSequenceDefinition extends RSNode, SequenceDefinition +public interface RSSequenceDefinition extends RSNode, SequenceDefinition, Sequence { // @Import("stretches") // boolean getStretches(); @@ -35,4 +36,7 @@ public interface RSSequenceDefinition extends RSNode, SequenceDefinition @Import("chatFrameIds") @Override int[] getChatFrameIds(); + + @Import("transformSpotAnimationModel") + RSModel transformSpotAnimationModel(RSModel var1, int var2); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSSpotAnimationDefinition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSSpotAnimationDefinition.java index 7f91b7ea68..722bbc0e51 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSSpotAnimationDefinition.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSSpotAnimationDefinition.java @@ -1,3 +1,18 @@ package net.runelite.rs.api; -public interface RSSpotAnimationDefinition {} +import net.runelite.mapping.Import; + +public interface RSSpotAnimationDefinition +{ + @Import("getModel") + RSModel getModel(int var1); + + @Import("recolorFrom") + void setRecolorFrom(short[] from); + + @Import("recolorTo") + void setRecolorTo(short[] to); + + @Import("sequence") + int getSequence(); +} diff --git a/runescape-client/src/main/java/BuddyRankComparator.java b/runescape-client/src/main/java/BuddyRankComparator.java index 0cb459400b..bcde252b70 100644 --- a/runescape-client/src/main/java/BuddyRankComparator.java +++ b/runescape-client/src/main/java/BuddyRankComparator.java @@ -109,7 +109,7 @@ public class BuddyRankComparator extends AbstractUserComparator { } if (var3 == 6) { - float var5 = ((float)VarbitComposition.clientPreferences.field1193 - 0.5F) * 200.0F; + float var5 = ((float)VarbitComposition.clientPreferences.brightness - 0.5F) * 200.0F; var4 = 100 - Math.round(var5); } else if (var3 == 7) { var4 = Math.round((float)VarbitComposition.clientPreferences.musicVolume / 2.55F); diff --git a/runescape-client/src/main/java/ClientPreferences.java b/runescape-client/src/main/java/ClientPreferences.java index af1f5e6825..edfe8454d4 100644 --- a/runescape-client/src/main/java/ClientPreferences.java +++ b/runescape-client/src/main/java/ClientPreferences.java @@ -43,7 +43,8 @@ public class ClientPreferences { @Export("hideUsername") boolean hideUsername; @ObfuscatedName("a") - double field1193; + @Export("brightness") + double brightness; @ObfuscatedName("u") @ObfuscatedGetter( intValue = -970652687 @@ -79,7 +80,7 @@ public class ClientPreferences { this.windowMode = 1; this.rememberedUsername = null; this.hideUsername = false; - this.field1193 = 0.8D; + this.brightness = 0.8D; this.musicVolume = 127; this.soundEffectsVolume = 127; this.areaSoundEffectsVolume = 127; @@ -95,7 +96,7 @@ public class ClientPreferences { this.windowMode = 1; this.rememberedUsername = null; this.hideUsername = false; - this.field1193 = 0.8D; + this.brightness = 0.8D; this.musicVolume = 127; this.soundEffectsVolume = 127; this.areaSoundEffectsVolume = 127; @@ -135,7 +136,7 @@ public class ClientPreferences { } if (var2 > 6) { - this.field1193 = (double)var1.readUnsignedByte() / 100.0D; + this.brightness = (double)var1.readUnsignedByte() / 100.0D; this.musicVolume = var1.readUnsignedByte(); this.soundEffectsVolume = var1.readUnsignedByte(); this.areaSoundEffectsVolume = var1.readUnsignedByte(); @@ -184,7 +185,7 @@ public class ClientPreferences { var1.writeStringCp1252NullTerminated(this.rememberedUsername != null ? this.rememberedUsername : ""); var1.writeBoolean(this.hideUsername); - var1.writeByte((int)(100.0D * this.field1193)); + var1.writeByte((int)(100.0D * this.brightness)); var1.writeByte(this.musicVolume); var1.writeByte(this.soundEffectsVolume); var1.writeByte(this.areaSoundEffectsVolume); diff --git a/runescape-client/src/main/java/Fonts.java b/runescape-client/src/main/java/Fonts.java index a88b36b7ba..71e05e6ff1 100644 --- a/runescape-client/src/main/java/Fonts.java +++ b/runescape-client/src/main/java/Fonts.java @@ -525,9 +525,9 @@ public class Fonts { Login.Login_loadingText = "Loading textures - " + "0%"; Login.Login_loadingPercent = 90; } else { - MusicPatch.textureProvider = new TextureProvider(VarcInt.archive9, World.archive8, 20, VarbitComposition.clientPreferences.field1193, Client.isLowDetail ? 64 : 128); + MusicPatch.textureProvider = new TextureProvider(VarcInt.archive9, World.archive8, 20, VarbitComposition.clientPreferences.brightness, Client.isLowDetail ? 64 : 128); Rasterizer3D.Rasterizer3D_setTextureLoader(MusicPatch.textureProvider); - Rasterizer3D.Rasterizer3D_setBrightness(VarbitComposition.clientPreferences.field1193); + Rasterizer3D.Rasterizer3D_setBrightness(VarbitComposition.clientPreferences.brightness); Client.titleLoadingStage = 100; } } else if (Client.titleLoadingStage == 100) { diff --git a/runescape-client/src/main/java/GraphicsObject.java b/runescape-client/src/main/java/GraphicsObject.java index babb06b4ef..f4f829a3fb 100644 --- a/runescape-client/src/main/java/GraphicsObject.java +++ b/runescape-client/src/main/java/GraphicsObject.java @@ -6,7 +6,7 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("bu") @Implements("GraphicsObject") -public final class GraphicsObject extends Renderable { +public class GraphicsObject extends Renderable { @ObfuscatedName("hu") @ObfuscatedSignature( descriptor = "[Loc;" @@ -91,13 +91,18 @@ public final class GraphicsObject extends Renderable { } + public GraphicsObject() + { + + } + @ObfuscatedName("n") @ObfuscatedSignature( descriptor = "(II)V", garbageValue = "1654884246" ) @Export("advance") - final void advance(int var1) { + void advance(int var1) { if (!this.isFinished) { this.frameCycle += var1; @@ -119,7 +124,7 @@ public final class GraphicsObject extends Renderable { garbageValue = "18" ) @Export("getModel") - protected final Model getModel() { + protected Model getModel() { SpotAnimationDefinition var1 = TaskHandler.SpotAnimationDefinition_get(this.id); Model var2; if (!this.isFinished) { diff --git a/runescape-client/src/main/java/RuneLiteObject.java b/runescape-client/src/main/java/RuneLiteObject.java new file mode 100644 index 0000000000..1990b62e27 --- /dev/null +++ b/runescape-client/src/main/java/RuneLiteObject.java @@ -0,0 +1,68 @@ +public class RuneLiteObject extends GraphicsObject +{ + public Model model; + public boolean loop; + + public RuneLiteObject() { + super.isFinished = true; + } + + public boolean isActive() { + return !super.isFinished; + } + + public void setActive(boolean active) + { + if (super.isFinished == active) + { + super.isFinished = !active; + + if (active) + { + super.frame = 0; + super.frameCycle = 0; + Client.graphicsObjects.addFirst(this); + } + else + { + remove(); + } + + } + } + + public void setShouldLoop(boolean var1) { + this.loop = var1; + } + + @Override + public void advance(int var1) + { + if (super.sequenceDefinition != null) { + super.advance(var1); + if (this.loop && super.isFinished) { + super.isFinished = false; + super.frame = 0; + super.frameCycle = 0; + } + + } + } + + @Override + public Model getModel() + { + if (super.sequenceDefinition != null) + { + return super.sequenceDefinition.transformSpotAnimationModel(this.model, super.frame); + } + else + { + return this.model.toSharedSequenceModel(true); + } + } + + public void setModel(Model var1) { + this.model = var1; + } +} diff --git a/runescape-client/src/main/java/Varps.java b/runescape-client/src/main/java/Varps.java index 0bc799b9c5..6e6facf8cf 100644 --- a/runescape-client/src/main/java/Varps.java +++ b/runescape-client/src/main/java/Varps.java @@ -95,7 +95,7 @@ public class Varps { Rasterizer3D.Rasterizer3D_setBrightness(var0); ((TextureProvider)Rasterizer3D.Rasterizer3D_textureLoader).setBrightness(var0); ItemComposition.ItemDefinition_cachedSprites.clear(); - VarbitComposition.clientPreferences.field1193 = var0; + VarbitComposition.clientPreferences.brightness = var0; DevicePcmPlayerProvider.savePreferences(); } } diff --git a/runescape-client/src/main/java/class184.java b/runescape-client/src/main/java/class184.java index 0d0bcac771..990088c96a 100644 --- a/runescape-client/src/main/java/class184.java +++ b/runescape-client/src/main/java/class184.java @@ -642,7 +642,7 @@ public class class184 implements WorldMapSection { Varps.method4858((double)(0.5F + (float)var10 / 200.0F)); return 1; } else if (var0 == 3182) { - float var3 = ((float)VarbitComposition.clientPreferences.field1193 - 0.5F) * 200.0F; + float var3 = ((float)VarbitComposition.clientPreferences.brightness - 0.5F) * 200.0F; Interpreter.Interpreter_intStack[++class240.Interpreter_intStackSize - 1] = 100 - Math.round(var3); return 1; } else if (var0 != 3183 && var0 != 3184) { From 6f4da3fd34f3cc26459626438a807995acda36a3 Mon Sep 17 00:00:00 2001 From: geheur <41499327+geheur@users.noreply.github.com> Date: Mon, 27 Sep 2021 19:51:48 -0700 Subject: [PATCH 37/77] menu swapper: add extra op swapping for deposit box --- .../menuentryswapper/MenuEntrySwapperPlugin.java | 12 +++++++----- .../plugins/menuentryswapper/ShiftDepositMode.java | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java index 5e632a991e..46d64e8785 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java @@ -581,18 +581,21 @@ public class MenuEntrySwapperPlugin extends Plugin // widget ticking and prior to our client tick event. This is because drag start // is what builds the context menu row which is what the eventual click will use + final int widgetGroupId = WidgetInfo.TO_GROUP(menuEntryAdded.getActionParam1()); + + final boolean isDepositBoxPlayerInventory = widgetGroupId == WidgetID.DEPOSIT_BOX_GROUP_ID; + final boolean isChambersOfXericStorageUnitPlayerInventory = widgetGroupId == WidgetID.CHAMBERS_OF_XERIC_STORAGE_UNIT_INVENTORY_GROUP_ID; // Swap to shift-click deposit behavior // Deposit- op 1 is the current withdraw amount 1/5/10/x for deposit box interface and chambers of xeric storage unit. // Deposit- op 2 is the current withdraw amount 1/5/10/x for bank interface if (shiftModifier() && config.bankDepositShiftClick() != ShiftDepositMode.OFF && menuEntryAdded.getType() == MenuAction.CC_OP.getId() - && (menuEntryAdded.getIdentifier() == 2 || menuEntryAdded.getIdentifier() == 1) + && menuEntryAdded.getIdentifier() == (isDepositBoxPlayerInventory || isChambersOfXericStorageUnitPlayerInventory ? 1 : 2) && (menuEntryAdded.getOption().startsWith("Deposit-") || menuEntryAdded.getOption().startsWith("Store") || menuEntryAdded.getOption().startsWith("Donate"))) { ShiftDepositMode shiftDepositMode = config.bankDepositShiftClick(); - final int widgetGroupId = WidgetInfo.TO_GROUP(menuEntryAdded.getActionParam1()); - final int opId = widgetGroupId == WidgetID.DEPOSIT_BOX_GROUP_ID ? shiftDepositMode.getIdentifierDepositBox() - : widgetGroupId == WidgetID.CHAMBERS_OF_XERIC_STORAGE_UNIT_INVENTORY_GROUP_ID ? shiftDepositMode.getIdentifierChambersStorageUnit() + final int opId = isDepositBoxPlayerInventory ? shiftDepositMode.getIdentifierDepositBox() + : isChambersOfXericStorageUnitPlayerInventory ? shiftDepositMode.getIdentifierChambersStorageUnit() : shiftDepositMode.getIdentifier(); final int actionId = opId >= 6 ? MenuAction.CC_OP_LOW_PRIORITY.getId() : MenuAction.CC_OP.getId(); bankModeSwap(actionId, opId); @@ -605,7 +608,6 @@ public class MenuEntrySwapperPlugin extends Plugin && menuEntryAdded.getOption().startsWith("Withdraw")) { ShiftWithdrawMode shiftWithdrawMode = config.bankWithdrawShiftClick(); - final int widgetGroupId = WidgetInfo.TO_GROUP(menuEntryAdded.getActionParam1()); final int actionId, opId; if (widgetGroupId == WidgetID.CHAMBERS_OF_XERIC_STORAGE_UNIT_PRIVATE_GROUP_ID || widgetGroupId == WidgetID.CHAMBERS_OF_XERIC_STORAGE_UNIT_SHARED_GROUP_ID) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/ShiftDepositMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/ShiftDepositMode.java index add9d4afe8..6c7deb9149 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/ShiftDepositMode.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/ShiftDepositMode.java @@ -36,7 +36,7 @@ public enum ShiftDepositMode DEPOSIT_10("Deposit-10", 5, 4, 3), DEPOSIT_X("Deposit-X", 6, 6, 5), DEPOSIT_ALL("Deposit-All", 8, 5, 4), - EXTRA_OP("Eat/Wield/Etc.", 9, 0, 0), + EXTRA_OP("Eat/Wield/Etc.", 9, 9, 0), OFF("Off", 0, 0, 0); private final String name; From 31007d3437329c2a30ce8d3e5827f9e303d5ef00 Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 28 Sep 2021 17:14:37 -0400 Subject: [PATCH 38/77] api: add runtime jar This jar excludes classes we know can never be referenced at runtime, which currently takes the resulting jar from 1.1MB to .3MB --- runelite-api/pom.xml | 48 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/runelite-api/pom.xml b/runelite-api/pom.xml index 3918045d57..a6dd776d73 100644 --- a/runelite-api/pom.xml +++ b/runelite-api/pom.xml @@ -64,4 +64,52 @@ test + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + runtime-jar + package + + jar + + + runtime + + net/runelite/api/AnimationID.class + net/runelite/api/EnumID.class + net/runelite/api/FontID.class + net/runelite/api/GraphicID.class + net/runelite/api/ItemID.class + net/runelite/api/NpcID.class + net/runelite/api/NullItemID.class + net/runelite/api/NullNpcID.class + net/runelite/api/NullObjectID.class + net/runelite/api/ObjectID.class + net/runelite/api/Opcodes.class + net/runelite/api/ParamID.class + net/runelite/api/ProjectileID.class + net/runelite/api/ScriptID.class + net/runelite/api/SettingID.class + net/runelite/api/SoundEffectID.class + net/runelite/api/SoundEffectVolume.class + net/runelite/api/SpriteID.class + net/runelite/api/StructID.class + + + + + + + From 87dda2d54ed71300901bc69c28905d4329990c2d Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 28 Sep 2021 18:17:31 -0400 Subject: [PATCH 39/77] api: mark runtime classes as final --- runelite-api/src/main/java/net/runelite/api/GraphicID.java | 2 +- runelite-api/src/main/java/net/runelite/api/ParamID.java | 2 +- runelite-api/src/main/java/net/runelite/api/ProjectileID.java | 2 +- runelite-api/src/main/java/net/runelite/api/SettingID.java | 2 +- runelite-api/src/main/java/net/runelite/api/StructID.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/GraphicID.java b/runelite-api/src/main/java/net/runelite/api/GraphicID.java index 6f2db34f74..f6c6138da6 100644 --- a/runelite-api/src/main/java/net/runelite/api/GraphicID.java +++ b/runelite-api/src/main/java/net/runelite/api/GraphicID.java @@ -24,7 +24,7 @@ */ package net.runelite.api; -public class GraphicID +public final class GraphicID { public static final int WINE_MAKE = 47; public static final int SPLASH = 85; diff --git a/runelite-api/src/main/java/net/runelite/api/ParamID.java b/runelite-api/src/main/java/net/runelite/api/ParamID.java index 9be05d76ef..50d2bdf71f 100644 --- a/runelite-api/src/main/java/net/runelite/api/ParamID.java +++ b/runelite-api/src/main/java/net/runelite/api/ParamID.java @@ -27,7 +27,7 @@ package net.runelite.api; /** * @see ParamHolder */ -public class ParamID +public final class ParamID { /** * @see SettingID diff --git a/runelite-api/src/main/java/net/runelite/api/ProjectileID.java b/runelite-api/src/main/java/net/runelite/api/ProjectileID.java index 1c1f82ae76..4030f92e56 100644 --- a/runelite-api/src/main/java/net/runelite/api/ProjectileID.java +++ b/runelite-api/src/main/java/net/runelite/api/ProjectileID.java @@ -29,7 +29,7 @@ package net.runelite.api; *

* Note: This class is not complete and may be missing mapped IDs. */ -public class ProjectileID +public final class ProjectileID { public static final int CANNONBALL = 53; public static final int GRANITE_CANNONBALL = 1443; diff --git a/runelite-api/src/main/java/net/runelite/api/SettingID.java b/runelite-api/src/main/java/net/runelite/api/SettingID.java index 2d471d16f2..bac3bd9be4 100644 --- a/runelite-api/src/main/java/net/runelite/api/SettingID.java +++ b/runelite-api/src/main/java/net/runelite/api/SettingID.java @@ -27,7 +27,7 @@ package net.runelite.api; /** * @see ParamID#SETTING_ID */ -public class SettingID +public final class SettingID { public static final int CAMERA_ZOOM = 14; diff --git a/runelite-api/src/main/java/net/runelite/api/StructID.java b/runelite-api/src/main/java/net/runelite/api/StructID.java index e1dab81026..54b61c4b02 100644 --- a/runelite-api/src/main/java/net/runelite/api/StructID.java +++ b/runelite-api/src/main/java/net/runelite/api/StructID.java @@ -29,7 +29,7 @@ package net.runelite.api; * @see StructComposition * @see Client#getStructComposition(int) */ -public class StructID +public final class StructID { public static final int SETTINGS_MUSIC_VOLUME = 2753; public static final int SETTINGS_EFFECT_VOLUME = 2754; From b496f9e4e8a3c7a4ae782bafef5e21f272a96752 Mon Sep 17 00:00:00 2001 From: LlemonDuck Date: Tue, 28 Sep 2021 17:30:55 -0700 Subject: [PATCH 40/77] chatcommands: cg shorthand for corrupted gauntlet --- .../runelite/client/plugins/chatcommands/ChatCommandsPlugin.java | 1 + 1 file changed, 1 insertion(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java index 9168c8f150..ee1e8e2fa5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java @@ -2008,6 +2008,7 @@ public class ChatCommandsPlugin extends Plugin case "cgaunt": case "cgauntlet": case "the corrupted gauntlet": + case "cg": return "Corrupted Gauntlet"; // The Nightmare From 6428a7af4ff94e16e22c58c65ef4a4c93d793e98 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Thu, 9 Sep 2021 22:41:43 -0700 Subject: [PATCH 41/77] skill calculator: Code cleanup --- .../skillcalculator/SkillCalculator.java | 30 ++++++++++--------- .../skillcalculator/SkillCalculatorPanel.java | 1 - .../SkillCalculatorPlugin.java | 1 - .../plugins/skillcalculator/UIActionSlot.java | 3 +- .../skillcalculator/UICombinedActionSlot.java | 1 - 5 files changed, 17 insertions(+), 19 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java index bd688d3788..6a756431d4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2018, Kruithne * Copyright (c) 2018, Psikoi * All rights reserved. @@ -81,7 +81,7 @@ class SkillCalculator extends JPanel private int currentXP = Experience.getXpForLevel(currentLevel); private int targetLevel = currentLevel + 1; private int targetXP = Experience.getXpForLevel(targetLevel); - private float xpFactor = 1.0f; + private float xpFactor = 1; SkillCalculator(Client client, UICalculatorInputArea uiInput, SpriteManager spriteManager, ItemManager itemManager) { @@ -145,7 +145,7 @@ class SkillCalculator extends JPanel skillData = cacheSkillData.getSkillData(calculatorType.getDataFile()); // Reset the XP factor, removing bonuses. - xpFactor = 1.0f; + xpFactor = 1; VarPlayer endGoalVarp = endGoalVarpForSkill(calculatorType.getSkill()); int endGoal = client.getVar(endGoalVarp); @@ -234,15 +234,17 @@ class SkillCalculator extends JPanel private void renderBonusOptions() { - if (skillData.getBonuses() != null) + if (skillData.getBonuses() == null) { - for (SkillDataBonus bonus : skillData.getBonuses()) - { - JPanel checkboxPanel = buildCheckboxPanel(bonus); + return; + } - add(checkboxPanel); - add(Box.createRigidArea(new Dimension(0, 5))); - } + for (SkillDataBonus bonus : skillData.getBonuses()) + { + JPanel checkboxPanel = buildCheckboxPanel(bonus); + + add(checkboxPanel); + add(Box.createRigidArea(new Dimension(0, 5))); } } @@ -363,7 +365,7 @@ class SkillCalculator extends JPanel updateCombinedAction(); } - private String formatXPActionString(double xp, int actionCount, String expExpression) + private static String formatXPActionString(double xp, int actionCount, String expExpression) { return XP_FORMAT.format(xp) + expExpression + NumberFormat.getIntegerInstance().format(actionCount) + (actionCount > 1 ? " actions" : " action"); } @@ -389,7 +391,7 @@ class SkillCalculator extends JPanel private void adjustXPBonus(float value) { - xpFactor = 1f + value; + xpFactor = 1 + value; calculate(); } @@ -449,12 +451,12 @@ class SkillCalculator extends JPanel }); } - private boolean slotContainsText(UIActionSlot slot, String text) + private static boolean slotContainsText(UIActionSlot slot, String text) { return slot.getAction().getName().toLowerCase().contains(text.toLowerCase()); } - private FocusAdapter buildFocusAdapter(Consumer focusLostConsumer) + private static FocusAdapter buildFocusAdapter(Consumer focusLostConsumer) { return new FocusAdapter() { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPanel.java index b6abe4577f..6c2f97f57c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPanel.java @@ -23,7 +23,6 @@ * (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.skillcalculator; import java.awt.GridBagConstraints; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java index 8999d2ad00..b62f688576 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java @@ -22,7 +22,6 @@ * (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.skillcalculator; import java.awt.image.BufferedImage; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java index 2051a0ddcd..3d9124136a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java @@ -23,7 +23,6 @@ * (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.skillcalculator; import java.awt.BorderLayout; @@ -80,7 +79,7 @@ class UIActionSlot extends JPanel @Getter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE) - private double value = 0; + private double value; UIActionSlot(SkillDataEntry action, JLabel uiIcon) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UICombinedActionSlot.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UICombinedActionSlot.java index fa1614c91b..46aea10dff 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UICombinedActionSlot.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UICombinedActionSlot.java @@ -23,7 +23,6 @@ * (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.skillcalculator; import java.awt.BorderLayout; From 7b678b2afbceedc6dbfe11044ef496136249fe82 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Thu, 9 Sep 2021 22:48:03 -0700 Subject: [PATCH 42/77] skill calculator: Define actions and bonuses in Java As the number of bonus types increases, the existing system of allowing only a single type of bonus to be applied, and only allowing actions to entirely opt out of having bonuses applied rather than more fine-grained control, is showing its age. This commit redefines all bonus and action entries in Java enums so that such systems can be better-defined. Additionally, it comes with the benefit of easier change validation via testing and enabling item and sprite ID referencing via runelite-api. --- .../main/java/net/runelite/api/SpriteID.java | 49 +- .../skillcalculator/CalculatorType.java | 42 +- .../skillcalculator/SkillCalculator.java | 33 +- .../plugins/skillcalculator/UIActionSlot.java | 6 +- .../skillcalculator/skills/AgilityAction.java | 67 + .../skills/ConstructionAction.java | 209 ++++ .../skills/ConstructionBonus.java | 39 + .../skillcalculator/skills/CookingAction.java | 164 +++ .../skills/CraftingAction.java | 175 +++ .../skillcalculator/skills/FarmingAction.java | 104 ++ .../FarmingBonus.java} | 19 +- .../skills/FiremakingAction.java | 53 + .../skills/FiremakingBonus.java | 39 + .../skillcalculator/skills/FishingAction.java | 75 ++ .../FishingBonus.java} | 23 +- .../skills/FletchingAction.java | 139 +++ .../skills/HerbloreAction.java | 113 ++ .../skillcalculator/skills/HunterAction.java | 99 ++ .../skillcalculator/skills/MagicAction.java | 221 ++++ .../skillcalculator/skills/MiningAction.java | 68 + .../MiningBonus.java} | 19 +- .../skillcalculator/skills/PrayerAction.java | 100 ++ .../skillcalculator/skills/PrayerBonus.java | 42 + .../skills/RunecraftAction.java | 78 ++ .../skills/RunecraftBonus.java | 39 + .../skillcalculator/skills/SkillAction.java | 93 ++ .../skillcalculator/skills/SkillBonus.java | 47 + .../skills/SmithingAction.java | 222 ++++ .../skills/ThievingAction.java | 85 ++ .../skills/WoodcuttingAction.java | 55 + .../skills/WoodcuttingBonus.java | 39 + .../skillcalculator/skill_agility.json | 160 --- .../skillcalculator/skill_construction.json | 1018 --------------- .../skillcalculator/skill_cooking.json | 742 ----------- .../skillcalculator/skill_crafting.json | 809 ------------ .../skillcalculator/skill_farming.json | 388 ------ .../skillcalculator/skill_firemaking.json | 82 -- .../skillcalculator/skill_fishing.json | 214 ---- .../skillcalculator/skill_fletching.json | 592 --------- .../skillcalculator/skill_herblore.json | 436 ------- .../plugins/skillcalculator/skill_hunter.json | 352 ------ .../plugins/skillcalculator/skill_magic.json | 1084 ---------------- .../plugins/skillcalculator/skill_mining.json | 166 --- .../plugins/skillcalculator/skill_prayer.json | 397 ------ .../skillcalculator/skill_runecraft.json | 240 ---- .../skillcalculator/skill_smithing.json | 1090 ----------------- .../skillcalculator/skill_thieving.json | 268 ---- .../skillcalculator/skill_woodcutting.json | 91 -- .../skillcalculator/CalculatorTypeTest.java} | 44 +- 49 files changed, 2502 insertions(+), 8227 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/AgilityAction.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ConstructionAction.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ConstructionBonus.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CookingAction.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CraftingAction.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FarmingAction.java rename runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/{beans/SkillDataBonus.java => skills/FarmingBonus.java} (78%) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FiremakingAction.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FiremakingBonus.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FishingAction.java rename runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/{beans/SkillDataEntry.java => skills/FishingBonus.java} (78%) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FletchingAction.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HerbloreAction.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HunterAction.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MagicAction.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MiningAction.java rename runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/{beans/SkillData.java => skills/MiningBonus.java} (78%) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerAction.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerBonus.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/RunecraftAction.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/RunecraftBonus.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SkillAction.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SkillBonus.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SmithingAction.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ThievingAction.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/WoodcuttingAction.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/WoodcuttingBonus.java delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_agility.json delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_construction.json delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_cooking.json delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_crafting.json delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_farming.json delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_firemaking.json delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fishing.json delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_herblore.json delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_hunter.json delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_magic.json delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_mining.json delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_prayer.json delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_runecraft.json delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_smithing.json delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_thieving.json delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_woodcutting.json rename runelite-client/src/{main/java/net/runelite/client/plugins/skillcalculator/CacheSkillData.java => test/java/net/runelite/client/plugins/skillcalculator/CalculatorTypeTest.java} (61%) diff --git a/runelite-api/src/main/java/net/runelite/api/SpriteID.java b/runelite-api/src/main/java/net/runelite/api/SpriteID.java index d085bb0674..cb7cd1b560 100644 --- a/runelite-api/src/main/java/net/runelite/api/SpriteID.java +++ b/runelite-api/src/main/java/net/runelite/api/SpriteID.java @@ -1209,17 +1209,52 @@ public final class SpriteID public static final int KOUREND_FAVOUR_LOVAKENGJ_ICON = 1244; public static final int KOUREND_FAVOUR_PISCARILIUS_ICON = 1245; public static final int KOUREND_FAVOUR_SHAYZIEN_ICON = 1246; - /* Unmapped: 1247~1296 */ + public static final int SPELL_BASIC_REANIMATION = 1247; + public static final int SPELL_ADEPT_REANIMATION = 1248; + public static final int SPELL_EXPERT_REANIMATION = 1249; + public static final int SPELL_MASTER_REANIMATION = 1250; + /* Unmapped: 1251 */ + public static final int SPELL_ARCEUUS_LIBRARY_TELEPORT = 1252; + public static final int SPELL_DRAYNOR_MANOR_TELEPORT = 1253; + public static final int SPELL_SALVE_GRAVEYARD_TELEPORT = 1254; + /* Unmapped: 1255 */ + public static final int SPELL_MIND_ALTAR_TELEPORT = 1256; + public static final int SPELL_RESPAWN_TELEPORT = 1257; + /* Unmapped 1258 */ + public static final int SPELL_FENKENSTRAINS_CASTLE_TELEPORT = 1259; + public static final int SPELL_WEST_ARDOUGNE_TELEPORT = 1260; + public static final int SPELL_HARMONY_ISLAND_TELEPORT = 1261; + public static final int SPELL_BARROWS_TELEPORT = 1262; + public static final int SPELL_APE_ATOLL_TELEPORT = 1263; + public static final int SPELL_CEMETERY_TELEPORT = 1264; + /* Unmapped: 1265 */ + public static final int SPELL_RESURRECT_CROPS = 1266; + public static final int SPELL_GHOSTLY_GRASP = 1267; + public static final int SPELL_SKELETAL_GRASP = 1268; + public static final int SPELL_UNDEAD_GRASP = 1269; + public static final int SPELL_RESURRECT_LESSER_GHOST = 1270; + /* Unmapped: 1271~1296 */ public static final int QUESTS_PAGE_ICON_PURPLE_KOUREND = 1297; public static final int UNUSED_TAB_QUESTS_GREEN_ACHIEVEMENT_DIARIES = 1298; public static final int TAB_QUESTS_GREEN_ACHIEVEMENT_DIARIES = 1299; - /* Unmapped: 1300~1305 */ + /* Unmapped: 1300~1301 */ + public static final int SPELL_INFERIOR_DEMONBANE = 1302; + public static final int SPELL_SUPERIOR_DEMONBANE = 1303; + public static final int SPELL_DARK_DEMONBANE = 1304; + public static final int SPELL_MARK_OF_DARKNESS = 1305; public static final int SPELL_WARD_OF_ARCEUUS = 1306; - /* Unmapped: 1307~1309 */ + public static final int SPELL_LESSER_CORRUPTION = 1307; + public static final int SPELL_GREATER_CORRUPTION = 1308; + /* Unmapped: 1309 */ public static final int SPELL_DEATH_CHARGE = 1310; - /* Unmapped: 1311~1314 */ + public static final int SPELL_DEMONIC_OFFERING = 1311; + public static final int SPELL_SINISTER_OFFERING = 1312; + /* Unmapped: 1313~1314 */ public static final int SPELL_SHADOW_VEIL = 1315; - /* Unmapped: 1316~1324 */ + public static final int SPELL_DARK_LURE = 1316; + public static final int SPELL_VILE_VIGOUR = 1317; + public static final int SPELL_DEGRIME = 1318; + /* Unmapped: 1319~1324 */ public static final int SPELL_WARD_OF_ARCEUUS_DISABLED = 1325; /* Unmapped: 1326 */ public static final int SPELL_GREATER_CORRUPTION_DISABLED = 1327; @@ -1615,6 +1650,8 @@ public final class SpriteID public static final int HEALTHBAR_YELLOW_BACK_70PX = 2978; /* Unmapped: 2979, 2980 */ public static final int SPELL_RESURRECT_SUPERIOR_SKELETON = 2981; - /* Unmapped: 2982~2986 */ + /* Unmapped: 2982~2983 */ + public static final int SPELL_RESURRECT_GREATER_ZOMBIE = 2984; + /* Unmapped: 2985~2986 */ public static final int SPELL_RESURRECT_SUPERIOR_SKELETON_DISABLED = 2987; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CalculatorType.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CalculatorType.java index e102988f50..8c27d8a509 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CalculatorType.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CalculatorType.java @@ -24,32 +24,36 @@ */ package net.runelite.client.plugins.skillcalculator; +import javax.annotation.Nullable; import lombok.AllArgsConstructor; import lombok.Getter; import net.runelite.api.Skill; +import net.runelite.client.plugins.skillcalculator.skills.*; @AllArgsConstructor @Getter enum CalculatorType { - MINING(Skill.MINING, "skill_mining.json"), - AGILITY(Skill.AGILITY, "skill_agility.json"), - SMITHING(Skill.SMITHING, "skill_smithing.json"), - HERBLORE(Skill.HERBLORE, "skill_herblore.json"), - FISHING(Skill.FISHING, "skill_fishing.json"), - THIEVING(Skill.THIEVING, "skill_thieving.json"), - COOKING(Skill.COOKING, "skill_cooking.json"), - PRAYER(Skill.PRAYER, "skill_prayer.json"), - CRAFTING(Skill.CRAFTING, "skill_crafting.json"), - FIREMAKING(Skill.FIREMAKING, "skill_firemaking.json"), - MAGIC(Skill.MAGIC, "skill_magic.json"), - FLETCHING(Skill.FLETCHING, "skill_fletching.json"), - WOODCUTTING(Skill.WOODCUTTING, "skill_woodcutting.json"), - RUNECRAFT(Skill.RUNECRAFT, "skill_runecraft.json"), - FARMING(Skill.FARMING, "skill_farming.json"), - CONSTRUCTION(Skill.CONSTRUCTION, "skill_construction.json"), - HUNTER(Skill.HUNTER, "skill_hunter.json"); + MINING(Skill.MINING, MiningBonus.values(), MiningAction.values()), + AGILITY(Skill.AGILITY, null, AgilityAction.values()), + SMITHING(Skill.SMITHING, null, SmithingAction.values()), + HERBLORE(Skill.HERBLORE, null, HerbloreAction.values()), + FISHING(Skill.FISHING, FishingBonus.values(), FishingAction.values()), + THIEVING(Skill.THIEVING, null, ThievingAction.values()), + COOKING(Skill.COOKING, null, CookingAction.values()), + PRAYER(Skill.PRAYER, PrayerBonus.values(), PrayerAction.values()), + CRAFTING(Skill.CRAFTING, null, CraftingAction.values()), + FIREMAKING(Skill.FIREMAKING, FiremakingBonus.values(), FiremakingAction.values()), + MAGIC(Skill.MAGIC, null, MagicAction.values()), + FLETCHING(Skill.FLETCHING, null, FletchingAction.values()), + WOODCUTTING(Skill.WOODCUTTING, WoodcuttingBonus.values(), WoodcuttingAction.values()), + RUNECRAFT(Skill.RUNECRAFT, RunecraftBonus.values(), RunecraftAction.values()), + FARMING(Skill.FARMING, FarmingBonus.values(), FarmingAction.values()), + CONSTRUCTION(Skill.CONSTRUCTION, ConstructionBonus.values(), ConstructionAction.values()), + HUNTER(Skill.HUNTER, null, HunterAction.values()); private final Skill skill; - private final String dataFile; -} \ No newline at end of file + @Nullable + private final SkillBonus[] skillBonuses; + private final SkillAction[] skillActions; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java index 6a756431d4..736d7b3fab 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java @@ -50,9 +50,8 @@ import net.runelite.api.Skill; import net.runelite.api.VarPlayer; import net.runelite.client.game.ItemManager; import net.runelite.client.game.SpriteManager; -import net.runelite.client.plugins.skillcalculator.beans.SkillData; -import net.runelite.client.plugins.skillcalculator.beans.SkillDataBonus; -import net.runelite.client.plugins.skillcalculator.beans.SkillDataEntry; +import net.runelite.client.plugins.skillcalculator.skills.SkillAction; +import net.runelite.client.plugins.skillcalculator.skills.SkillBonus; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.DynamicGridLayout; import net.runelite.client.ui.FontManager; @@ -69,14 +68,12 @@ class SkillCalculator extends JPanel private final SpriteManager spriteManager; private final ItemManager itemManager; private final List uiActionSlots = new ArrayList<>(); - private final CacheSkillData cacheSkillData = new CacheSkillData(); private final UICombinedActionSlot combinedActionSlot; private final ArrayList combinedActionSlots = new ArrayList<>(); private final List bonusCheckBoxes = new ArrayList<>(); private final IconTextField searchBar = new IconTextField(); - private SkillData skillData; - private Skill currentSkill; + private CalculatorType currentCalculator; private int currentLevel = 1; private int currentXP = Experience.getXpForLevel(currentLevel); private int targetLevel = currentLevel + 1; @@ -137,12 +134,9 @@ class SkillCalculator extends JPanel currentXP = client.getSkillExperience(calculatorType.getSkill()); currentLevel = Experience.getLevelForXp(currentXP); - if (currentSkill != calculatorType.getSkill()) + if (currentCalculator != calculatorType) { - currentSkill = calculatorType.getSkill(); - - // Load the skill data. - skillData = cacheSkillData.getSkillData(calculatorType.getDataFile()); + currentCalculator = calculatorType; // Reset the XP factor, removing bonuses. xpFactor = 1; @@ -234,12 +228,13 @@ class SkillCalculator extends JPanel private void renderBonusOptions() { - if (skillData.getBonuses() == null) + final SkillBonus[] skillBonuses = currentCalculator.getSkillBonuses(); + if (skillBonuses == null) { return; } - for (SkillDataBonus bonus : skillData.getBonuses()) + for (SkillBonus bonus : skillBonuses) { JPanel checkboxPanel = buildCheckboxPanel(bonus); @@ -248,7 +243,7 @@ class SkillCalculator extends JPanel } } - private JPanel buildCheckboxPanel(SkillDataBonus bonus) + private JPanel buildCheckboxPanel(SkillBonus bonus) { JPanel uiOption = new JPanel(new BorderLayout()); JLabel uiLabel = new JLabel(bonus.getName()); @@ -272,7 +267,7 @@ class SkillCalculator extends JPanel return uiOption; } - private void adjustCheckboxes(JCheckBox target, SkillDataBonus bonus) + private void adjustCheckboxes(JCheckBox target, SkillBonus bonus) { adjustXPBonus(0); bonusCheckBoxes.forEach(otherSelectedCheckbox -> @@ -295,15 +290,15 @@ class SkillCalculator extends JPanel uiActionSlots.clear(); // Create new components for the action slots. - for (SkillDataEntry action : skillData.getActions()) + for (SkillAction action : currentCalculator.getSkillActions()) { JLabel uiIcon = new JLabel(); - if (action.getIcon() != null) + if (action.getIcon() != -1) { itemManager.getImage(action.getIcon()).addTo(uiIcon); } - else if (action.getSprite() != null) + else if (action.getSprite() != -1) { spriteManager.addSpriteTo(uiIcon, action.getSprite(), 0); } @@ -348,7 +343,7 @@ class SkillCalculator extends JPanel { int actionCount = 0; int neededXP = targetXP - currentXP; - SkillDataEntry action = slot.getAction(); + SkillAction action = slot.getAction(); double xp = (action.isIgnoreBonus()) ? action.getXp() : action.getXp() * xpFactor; if (neededXP > 0) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java index 3d9124136a..c005d42f90 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java @@ -41,7 +41,7 @@ import javax.swing.border.EmptyBorder; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; -import net.runelite.client.plugins.skillcalculator.beans.SkillDataEntry; +import net.runelite.client.plugins.skillcalculator.skills.SkillAction; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.components.shadowlabel.JShadowedLabel; @@ -63,7 +63,7 @@ class UIActionSlot extends JPanel private static final Dimension ICON_SIZE = new Dimension(32, 32); @Getter(AccessLevel.PACKAGE) - private final SkillDataEntry action; + private final SkillAction action; private final JShadowedLabel uiLabelActions; private final JPanel uiInfo; @@ -81,7 +81,7 @@ class UIActionSlot extends JPanel @Setter(AccessLevel.PACKAGE) private double value; - UIActionSlot(SkillDataEntry action, JLabel uiIcon) + UIActionSlot(SkillAction action, JLabel uiIcon) { this.action = action; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/AgilityAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/AgilityAction.java new file mode 100644 index 0000000000..d62285d548 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/AgilityAction.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.ItemID; + +@AllArgsConstructor +@Getter +public enum AgilityAction implements SkillAction +{ + GNOME_STRONGHOLD_COURSE("Gnome Stronghold", 1, 86.5f, ItemID.SWAMP_TOAD), + SHAYZIEN_BASIC_COURSE("Shayzien Basic Course", 5, 133.2f, ItemID.SHAYZIEN_HELM_1), + DRAYNOR_VILLAGE_ROOFTOP("Draynor Village Rooftop", 10, 120, ItemID.MARK_OF_GRACE), + LEAPING_TROUT("Leaping trout", 15, 5, ItemID.LEAPING_TROUT), + AL_KHARID_ROOFTOP("Al Kharid Rooftop", 20, 180, ItemID.MARK_OF_GRACE), + VARROCK_ROOFTOP("Varrock Rooftop", 30, 238, ItemID.MARK_OF_GRACE), + PENGUIN_AGILITY_COURSE("Penguin Agility Course", 30, 540, ItemID.CLOCKWORK_SUIT), + LEAPING_SALMON("Leaping salmon", 30, 6, ItemID.LEAPING_SALMON), + BARBARIAN_OUTPOST("Barbarian Outpost", 35, 152.5f, ItemID.STEEL_BATTLEAXE), + CANIFIS_ROOFTOP("Canifis Rooftop", 40, 240, ItemID.MARK_OF_GRACE), + LEAPING_STURGEON("Leaping sturgeon", 45, 7, ItemID.LEAPING_STURGEON), + APE_ATOLL_COURSE("Ape Atoll", 48, 580, ItemID.GORILLA_GREEGREE), + SHAYZIEN_ADVANCED_COURSE("Shayzien Advanced Course", 48, 474.3f, ItemID.SHAYZIEN_HELM_5), + FALADOR_ROOFTOP("Falador Rooftop", 50, 440, ItemID.MARK_OF_GRACE), + WILDERNESS_AGILITY_COURSE("Wilderness Agility Course", 52, 571, ItemID.SKULL), + HALLOWED_SEPULCHRE_FLOOR_1("Hallowed Sepulchre Floor 1", 52, 575, ItemID.RING_OF_ENDURANCE), + SEERS_VILLAGE_ROOFTOP("Seers' Village Rooftop", 60, 570, ItemID.MARK_OF_GRACE), + WEREWOLF_AGILITY_COURSE("Werewolf Agility Course", 60, 730, ItemID.STICK), + HALLOWED_SEPULCHRE_FLOOR_2("Hallowed Sepulchre Floor 2", 62, 925, ItemID.RING_OF_ENDURANCE), + POLLNIVNEACH_ROOFTOP("Pollnivneach Rooftop", 70, 890, ItemID.MARK_OF_GRACE), + HALLOWED_SEPULCHRE_FLOOR_3("Hallowed Sepulchre Floor 3", 72, 1500, ItemID.RING_OF_ENDURANCE), + PRIFDDINAS_AGILITY_COURSE("Prifddinas Agility Course", 75, 1337, ItemID.CRYSTAL_SHARD), + RELLEKKA_ROOFTOP("Rellekka Rooftop", 80, 780, ItemID.MARK_OF_GRACE), + HALLOWED_SEPULCHRE_FLOOR_4("Hallowed Sepulchre Floor 4", 82, 2700, ItemID.RING_OF_ENDURANCE), + ARDOUGNE_ROOFTOP("Ardougne Rooftop", 90, 793, ItemID.MARK_OF_GRACE), + HALLOWED_SEPULCHRE_FLOOR_5("Hallowed Sepulchre Floor 5", 92, 6000, ItemID.RING_OF_ENDURANCE), + ; + + private final String name; + private final int level; + private final float xp; + private final int icon; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ConstructionAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ConstructionAction.java new file mode 100644 index 0000000000..01b1148909 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ConstructionAction.java @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.ItemID; + +@AllArgsConstructor +@Getter +public enum ConstructionAction implements SkillAction +{ + EXIT_PORTAL("Exit Portal", 1, 100, ItemID.EXIT_PORTAL), + PLANK("Plank", 1, 29, ItemID.PLANK), + OAK_PLANK("Oak Plank", 1, 60, ItemID.OAK_PLANK), + TEAK_PLANK("Teak Plank", 1, 90, ItemID.TEAK_PLANK), + MAHOGANY_PLANK("Mahogany Plank", 1, 140, ItemID.MAHOGANY_PLANK), + PLANT("Plant", 1, 31, ItemID.PLANT), + FERN_BIG_PLANT("Fern (big plant)", 1, 31, ItemID.FERN_8186), + SHORT_PLANT("Short Plant", 1, 31, ItemID.SHORT_PLANT), + DOCK_LEAF("Dock Leaf", 1, 31, ItemID.DOCK_LEAF), + CRUDE_WOODEN_CHAIR("Crude Wooden Chair", 1, 58, ItemID.CRUDE_WOODEN_CHAIR), + BROWN_RUG("Brown Rug", 2, 30, ItemID.BROWN_RUG), + TORN_CURTAINS("Torn Curtains", 2, 132, ItemID.TORN_CURTAINS), + CLAY_FIREPLACE("Clay Fireplace", 3, 30, ItemID.CLAY_FIREPLACE), + WOODEN_BOOKCASE("Wooden Bookcase", 4, 115, ItemID.WOODEN_BOOKCASE), + FIREPIT("Firepit", 5, 40, ItemID.FIREPIT), + CAT_BLANKET("Cat Blanket", 5, 15, ItemID.CAT_BLANKET), + DECORATIVE_ROCK("Decorative Rock", 5, 100, ItemID.DECORATIVE_ROCK), + TREE("Tree", 5, 31, ItemID.TREE), + SMALL_FERN("Small Fern", 6, 70, ItemID.SMALL_FERN), + THISTLE("Thistle", 6, 70, ItemID.THISTLE), + BUSH("Bush", 6, 70, ItemID.BUSH), + LARGE_LEAF_BUSH("Large Leaf Bush", 6, 70, ItemID.LARGELEAF_PLANT), + WOODEN_SHELVES_1("Wooden Shelves 1", 6, 87, ItemID.WOODEN_SHELVES_1), + PUMP_AND_DRAIN("Pump and Drain", 7, 100, ItemID.PUMP_AND_DRAIN), + BEER_BARREL("Beer Barrel", 7, 87, ItemID.BEER_BARREL), + WOODEN_CHAIR("Wooden Chair", 8, 87, ItemID.WOODEN_CHAIR), + WOODEN_LARDER("Wooden Larder", 9, 228, ItemID.WOODEN_LARDER), + WOOD_DINING_TABLE("Wood Dining Table", 10, 115, ItemID.WOOD_DINING_TABLE), + POND("Pond", 10, 100, ItemID.POND), + NICE_TREE("Nice Tree", 10, 44, ItemID.NICE_TREE), + WOODEN_BENCH("Wooden Bench", 10, 115, ItemID.WOODEN_BENCH), + FIREPIT_WITH_HOOK("Firepit with Hook", 11, 60, ItemID.FIREPIT_WITH_HOOK), + REEDS("Reeds", 12, 100, ItemID.REEDS), + FERN_SMALL_PLANT("Fern (small plant)", 12, 100, ItemID.FERN), + CIDER_BARREL("Cider Barrel", 12, 91, ItemID.CIDER_BARREL), + WOODEN_SHELVES_2("Wooden Shelves 2", 12, 147, ItemID.WOODEN_SHELVES_2), + WOOD_TABLE("Wood Table", 12, 87, ItemID.WOOD_DINING_TABLE), + HUGE_PLANT("Huge Plant", 12, 100, ItemID.HUGE_PLANT), + TALL_PLANT("Tall Plant", 12, 100, ItemID.TALL_PLANT), + RUG("Rug", 13, 60, ItemID.RUG), + ROCKING_CHAIR("Rocking Chair", 14, 87, ItemID.ROCKING_CHAIR), + IMP_STATUE("Imp Statue", 15, 150, ItemID.IMP_STATUE), + OAK_TREE("Oak Tree", 15, 70, ItemID.OAK_TREE), + OAK_DECORATION("Oak Decoration", 16, 120, ItemID.OAK_DECORATION), + FIREPIT_WITH_POT("Firepit with Pot", 17, 80, ItemID.FIREPIT_WITH_POT), + CURTAINS("Curtains", 18, 225, ItemID.CURTAINS), + ASGARNIAN_ALE("Asgarnian Ale", 18, 184, ItemID.ASGARNIAN_ALE), + CAT_BASKET("Cat Basket", 19, 58, ItemID.CAT_BASKET), + OAK_CHAIR("Oak Chair", 19, 120, ItemID.OAK_CHAIR), + WOODEN_BED("Wooden Bed", 20, 117, ItemID.WOODEN_BED), + SHOE_BOX("Shoe Box", 20, 58, ItemID.SHOE_BOX), + SHAVING_STAND("Shaving Stand", 21, 30, ItemID.SHAVING_STAND), + OAK_DINING_TABLE("Oak Dining Table", 22, 240, ItemID.OAK_DINING_TABLE), + OAK_BENCH("Oak Bench", 22, 240, ItemID.OAK_BENCH), + WOODEN_SHELVES_3("Wooden Shelves 3", 23, 147, ItemID.WOODEN_SHELVES_3), + SMALL_OVEN("Small Oven", 24, 80, ItemID.SMALL_OVEN), + OAK_CLOCK("Oak Clock", 25, 142, ItemID.OAK_CLOCK), + GREENMANS_ALE("Greenman's Ale", 26, 184, ItemID.GREENMANS_ALE), + OAK_ARMCHAIR("Oak Armchair", 26, 180, ItemID.OAK_ARMCHAIR), + ROPE_BELL_PULL("Rope Bell-Pull", 26, 64, ItemID.ROPE_BELLPULL), + PUMP_AND_TUB("Pump and Tub", 27, 200, ItemID.PUMP_AND_TUB), + OAK_DRAWERS("Oak Drawers", 27, 120, ItemID.OAK_DRAWERS), + OAK_BOOKCASE("Oak Bookcase", 29, 180, ItemID.OAK_BOOKCASE), + LARGE_OVEN("Large Oven", 29, 100, ItemID.LARGE_OVEN), + OAK_SHAVING_STAND("Oak Shaving Stand", 29, 61, ItemID.OAK_SHAVING_STAND), + WILLOW_TREE("Willow Tree", 30, 100, ItemID.WILLOW_TREE), + OAK_BED("Oak Bed", 30, 210, ItemID.OAK_BED), + LONG_BONE("Long Bone", 30, 4500, ItemID.LONG_BONE), + CURVED_BONE("Curved Bone", 30, 6750, ItemID.CURVED_BONE), + CARVED_OAK_BENCH("Carved Oak Bench", 31, 240, ItemID.CARVED_OAK_BENCH), + CARVED_OAK_TABLE("Carved Oak Table", 31, 360, ItemID.CARVED_OAK_TABLE), + OAK_KITCHEN_TABLE("Oak Kitchen Table", 32, 180, ItemID.TEAK_TABLE), + BOXING_RING("Boxing Ring", 32, 420, ItemID.BOXING_RING), + OAK_LARDER("Oak Larder", 33, 480, ItemID.OAK_LARDER), + CUSHIONED_BASKET("Cushioned Basket", 33, 58, ItemID.CUSHIONED_BASKET), + STONE_FIREPLACE("Stone Fireplace", 33, 40, ItemID.STONE_FIREPLACE), + STEEL_RANGE("Steel Range", 34, 120, ItemID.STEEL_RANGE), + OAK_SHELVES_1("Oak Shelves 1", 34, 240, ItemID.OAK_SHELVES_1), + GLOVE_RACK("Glove Rack", 34, 120, ItemID.GLOVE_RACK), + LARGE_OAK_BED("Large Oak Bed", 34, 330, ItemID.LARGE_OAK_BED), + TEAK_ARMCHAIR("Teak Armchair", 35, 180, ItemID.TEAK_ARMCHAIR), + DRAGON_BITTER("Dragon Bitter", 36, 224, ItemID.DRAGON_BITTER), + TEAK_DECORATION("Teak Decoration", 36, 180, ItemID.TEAK_DECORATION), + BELL_PULL("Bell-Pull", 37, 120, ItemID.BELLPULL), + OAK_DRESSER("Oak Dresser", 37, 121, ItemID.OAK_DRESSER), + TEAK_BENCH("Teak Bench", 38, 360, ItemID.CARVED_TEAK_BENCH), + TEAK_TABLE("Teak Table", 38, 360, ItemID.TEAK_TABLE), + OAK_WARDROBE("Oak Wardrobe", 39, 180, ItemID.OAK_WARDROBE), + TEAK_BED("Teak Bed", 40, 300, ItemID.TEAK_BED), + MAHOGANY_BOOKCASE("Mahogany Bookcase", 40, 420, ItemID.MAHOGANY_BOOKCASE), + OAK_LECTERN("Oak Lectern", 40, 60, ItemID.OAK_LECTERN), + OPULENT_CURTAINS("Opulent Curtains", 40, 315, ItemID.OPULENT_CURTAINS), + FENCING_RING("Fencing Ring", 41, 570, ItemID.FENCING_RING), + GLOBE("Globe", 41, 180, ItemID.GLOBE), + FANCY_RANGE("Fancy Range", 42, 160, ItemID.FANCY_RANGE), + CRYSTAL_BALL("Crystal Ball", 42, 280, ItemID.CRYSTAL_BALL), + ALCHEMICAL_CHART("Alchemical Chart", 43, 30, ItemID.ALCHEMICAL_CHART), + TEAK_LARDER("Teak larder", 43, 750, ItemID.TEAK_LARDER), + WOODEN_TELESCOPE("Wooden Telescope", 44, 121, ItemID.OAK_TELESCOPE), + WEAPONS_RACK("Weapons Rack", 44, 180, ItemID.WEAPONS_RACK), + CARVED_TEAK_BENCH("Carved Teak Bench", 44, 360, ItemID.CARVED_TEAK_BENCH), + OAK_SHELVES_2("Oak Shelves 2", 45, 240, ItemID.OAK_SHELVES_2), + CARVED_TEAK_TABLE("Carved Teak Table", 45, 600, ItemID.CARVED_TEAK_TABLE), + LARGE_TEAK_BED("Large Teak Bed", 45, 480, ItemID.LARGE_TEAK_BED), + MAPLE_TREE("Maple Tree", 45, 122, ItemID.MAPLE_TREE), + TEAK_DRESSER("Teak Dresser", 46, 181, ItemID.TEAK_DRESSER), + SINK("Sink", 47, 300, ItemID.SINK), + EAGLE_LECTERN("Eagle Lectern", 47, 120, ItemID.EAGLE_LECTERN), + DEMON_LECTERN("Demon Lectern", 47, 120, ItemID.DEMON_LECTERN), + MOUNTED_MYTHICAL_CAPE("Mounted Mythical Cape", 47, 370, ItemID.MYTHICAL_CAPE), + CHEFS_DELIGHT("Chef's Delight", 48, 224, ItemID.CHEFS_DELIGHT), + TEAK_PORTAL("Teak Portal", 50, 270, ItemID.TEAK_PORTAL), + MAHOGANY_ARMCHAIR("Mahogany Armchair", 50, 280, ItemID.MAHOGANY_ARMCHAIR), + ORNAMENTAL_GLOBE("Ornamental Globe", 50, 270, ItemID.ORNAMENTAL_GLOBE), + TELEPORT_FOCUS("Teleport Focus", 50, 40, ItemID.TELEPORT_FOCUS), + TEAK_DRAWERS("Teak Drawers", 51, 180, ItemID.TEAK_DRAWERS), + COMBAT_RING("Combat Ring", 51, 630, ItemID.COMBAT_RING), + TEAK_KITCHEN_TABLE("Teak Kitchen Table", 52, 270, ItemID.TEAK_TABLE), + MAHOGANY_BENCH("Mahogany Bench", 52, 560, ItemID.MAHOGANY_BENCH), + MAHOGANY_TABLE("Mahogany Table", 52, 840, ItemID.MAHOGANY_TABLE), + FOUR_POSTER_BED("4-Poster Bed", 53, 450, ItemID._4POSTER), + EXTRA_WEAPONS_RACK("Extra Weapons Rack", 54, 440, ItemID.EXTRA_WEAPONS_RACK), + ELEMENTAL_SPHERE("Elemental Sphere", 54, 580, ItemID.ELEMENTAL_SPHERE), + TEAK_CLOCK("Teak Clock", 55, 202, ItemID.TEAK_CLOCK), + GILDED_DECORATION("Gilded Decoration", 56, 1020, ItemID.GILDED_DECORATION), + FANCY_TEAK_DRESSER("Fancy Teak Dresser", 56, 182, ItemID.FANCY_TEAK_DRESSER), + TEAK_SHELVES_1("Teak Shelves 1", 56, 330, ItemID.TEAK_SHELVES_1), + TEAK_EAGLE_LECTERN("Teak Eagle Lectern", 57, 180, ItemID.TEAK_EAGLE_LECTERN), + TEAK_DEMON_LECTERN("Teak Demon Lectern", 57, 180, ItemID.TEAK_DEMON_LECTERN), + LIMESTONE_ATTACK_STONE("Limestone attack stone", 59, 200, ItemID.ATTACK_STONE), + LUNAR_GLOBE("Lunar Globe", 59, 570, ItemID.LUNAR_GLOBE), + GILDED_FOUR_POSTER_BED("Gilded 4-Poster Bed", 60, 1330, ItemID.GILDED_4POSTER), + POSH_BELL_PULL("Posh Bell-Pull", 60, 420, ItemID.POSH_BELLPULL), + SPICE_RACK("Spice Rack", 60, 374, ItemID.SPICE_RACK), + YEW_TREE("Yew Tree", 60, 141, ItemID.YEW_TREE), + GILDED_BENCH("Gilded Bench", 61, 1760, ItemID.GILDED_BENCH), + TEAK_WARDROBE("Teak Wardrobe", 63, 270, ItemID.TEAK_WARDROBE), + MARBLE_FIREPLACE("Marble Fireplace", 63, 500, ItemID.MARBLE_FIREPLACE), + ASTRONOMICAL_CHART("Astronomical Chart", 63, 45, ItemID.ASTRONOMICAL_CHART), + TEAK_TELESCOPE("Teak Telescope", 64, 181, ItemID.TEAK_TELESCOPE), + MAHOGANY_DRESSER("Mahogany Dresser", 64, 281, ItemID.MAHOGANY_DRESSER), + MAHOGANY_PORTAL("Mahogany Portal", 65, 420, ItemID.MAHOGANY_PORTAL), + GREATER_FOCUS("Greater Focus", 65, 500, ItemID.GREATER_FOCUS), + OPULENT_RUG("Opulent Rug", 65, 360, ItemID.OPULENT_RUG), + TEAK_GARDEN_BENCH("Teak Garden Bench", 66, 540, ItemID.TEAK_GARDEN_BENCH), + CRYSTAL_OF_POWER("Crystal of Power", 66, 890, ItemID.CRYSTAL_OF_POWER), + TEAK_SHELVES_2("Teak Shelves 2", 67, 930, ItemID.TEAK_SHELVES_2), + MAHOGANY_DEMON_LECTERN("Mahogany Demon Lectern", 67, 580, ItemID.TEAK_DEMON_LECTERN), + MAHOGANY_EAGLE_LECTERN("Mahogany Eagle Lectern", 67, 580, ItemID.TEAK_DEMON_LECTERN), + CELESTIAL_GLOBE("Celestial Globe", 68, 570, ItemID.CELESTIAL_GLOBE), + DUNGEON_ENTRANCE("Dungeon Entrance", 70, 500, ItemID.DUNGEON_ENTRANCE), + RANGING_PEDESTALS("Ranging Pedestals", 71, 720, ItemID.RANGING_PEDESTALS), + OPULENT_TABLE("Opulent Table", 72, 3100, ItemID.OPULENT_TABLE), + OAK_DOOR("Oak Door", 74, 600, ItemID.OAK_DOOR), + GILDED_DRESSER("Gilded Dresser", 74, 582, ItemID.GILDED_DRESSER), + MAHOGANY_WARDROBE("Mahogany Wardrobe", 75, 420, ItemID.MAHOGANY_WARDROBE), + MAGIC_TREE("Magic Tree", 75, 223, ItemID.MAGIC_TREE), + ARMILLARY_GLOBE("Armillary Globe", 77, 960, ItemID.GLOBE), + GNOME_BENCH("Gnome Bench", 77, 840, ItemID.GNOME_BENCH), + MARBLE_PORTAL("Marble Portal", 80, 1500, ItemID.MARBLE_PORTAL), + SCRYING_POOL("Scrying Pool", 80, 2000, ItemID.SCRYING_POOL), + BALANCE_BEAM("Balance Beam", 81, 1000, ItemID.BALANCE_BEAM), + INFERNAL_CHART("Infernal Chart", 83, 60, ItemID.INFERNAL_CHART), + MAHOGANY_TELESCOPE("Mahogany Telescope", 84, 281, ItemID.MAHOGANY_TELESCOPE), + GILDED_CLOCK("Gilded Clock", 85, 602, ItemID.GILDED_CLOCK), + SMALL_ORRERY("Small Orrery", 86, 1320, ItemID.SMALL_ORRERY), + GILDED_WARDROBE("Gilded Wardrobe", 87, 720, ItemID.GILDED_WARDROBE), + LARGE_ORRERY("Large Orrery", 95, 1420, ItemID.LARGE_ORRERY), + ; + + private final String name; + private final int level; + private final float xp; + private final int icon; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ConstructionBonus.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ConstructionBonus.java new file mode 100644 index 0000000000..d398ea2786 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ConstructionBonus.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter(onMethod_ = @Override) +public enum ConstructionBonus implements SkillBonus +{ + CARPENTERS_OUTFIT("Carpenter's Outfit (+2.5%)", 0.025f), + ; + + private final String name; + private final float value; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CookingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CookingAction.java new file mode 100644 index 0000000000..3a9b2a208f --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CookingAction.java @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.ItemID; + +@AllArgsConstructor +@Getter +public enum CookingAction implements SkillAction +{ + SINEW("Sinew", 1, 3, ItemID.SINEW), + SHRIMPS("Shrimps", 1, 30, ItemID.SHRIMPS), + COOKED_CHICKEN("Cooked chicken", 1, 30, ItemID.COOKED_CHICKEN), + COOKED_MEAT("Cooked meat", 1, 30, ItemID.COOKED_MEAT), + COOKED_RABBIT("Cooked rabbit", 1, 30, ItemID.COOKED_RABBIT), + ANCHOVIES("Anchovies", 1, 30, ItemID.ANCHOVIES), + SARDINE("Sardine", 1, 40, ItemID.SARDINE), + POISON_KARAMBWAN("Poison karambwan", 1, 80, ItemID.POISON_KARAMBWAN), + UGTHANKI_MEAT("Ugthanki meat", 1, 40, ItemID.UGTHANKI_MEAT), + BREAD("Bread", 1, 40, ItemID.BREAD), + HERRING("Herring", 5, 50, ItemID.HERRING), + FRUIT_BLAST("Fruit blast", 6, 50, ItemID.FRUIT_BLAST), + BAKED_POTATO("Baked potato", 7, 15, ItemID.BAKED_POTATO), + GUPPY("Guppy", 7, 12, ItemID.GUPPY), + PINEAPPLE_PUNCH("Pineapple punch", 8, 70, ItemID.PINEAPPLE_PUNCH), + SPICY_SAUCE("Spicy sauce", 9, 25, ItemID.SPICY_SAUCE), + MACKEREL("Mackerel", 10, 60, ItemID.MACKEREL), + REDBERRY_PIE("Redberry pie", 10, 78, ItemID.REDBERRY_PIE), + TOAD_CRUNCHIES("Toad crunchies", 10, 100, ItemID.TOAD_CRUNCHIES), + CHILLI_CON_CARNE("Chilli con carne", 11, 55, ItemID.CHILLI_CON_CARNE), + ROAST_BIRD_MEAT("Roast bird meat", 11, 62.5f, ItemID.ROAST_BIRD_MEAT), + THIN_SNAIL_MEAT("Thin snail meat", 12, 70, ItemID.THIN_SNAIL_MEAT), + SPICY_CRUNCHIES("Spicy crunchies", 12, 100, ItemID.SPICY_CRUNCHIES), + SCRAMBLED_EGG("Scrambled egg", 13, 50, ItemID.SCRAMBLED_EGG), + CIDER("Cider", 14, 182, ItemID.CIDER), + WORM_CRUNCHIES("Worm crunchies", 14, 104, ItemID.WORM_CRUNCHIES), + TROUT("Trout", 15, 70, ItemID.TROUT), + SPIDER_ON_STICK("Spider on stick", 16, 80, ItemID.SPIDER_ON_STICK), + SPIDER_ON_SHAFT("Spider on shaft", 16, 80, ItemID.SPIDER_ON_SHAFT), + ROAST_RABBIT("Roast rabbit", 16, 72.5f, ItemID.ROAST_RABBIT), + CHOCCHIP_CRUNCHIES("Chocchip crunchies", 16, 100, ItemID.CHOCCHIP_CRUNCHIES), + LEAN_SNAIL_MEAT("Lean snail meat", 17, 80, ItemID.LEAN_SNAIL_MEAT), + COD("Cod", 18, 75, ItemID.COD), + WIZARD_BLIZZARD("Wizard blizzard", 18, 110, ItemID.WIZARD_BLIZZARD), + DWARVEN_STOUT("Dwarven stout", 19, 215, ItemID.DWARVEN_STOUT), + SHORT_GREEN_GUY("Short green guy", 20, 120, ItemID.SHORT_GREEN_GUY), + MEAT_PIE("Meat pie", 20, 110, ItemID.MEAT_PIE), + PIKE("Pike", 20, 80, ItemID.PIKE), + CUP_OF_TEA("Cup of tea", 20, 52, ItemID.CUP_OF_TEA), + CAVEFISH("Cavefish", 20, 23, ItemID.CAVEFISH), + ROAST_BEAST_MEAT("Roast beast meat", 21, 82.5f, ItemID.ROAST_BEAST_MEAT), + COOKED_CRAB_MEAT("Cooked crab meat", 21, 100, ItemID.COOKED_CRAB_MEAT), + POT_OF_CREAM("Pot of cream", 21, 18, ItemID.POT_OF_CREAM), + FAT_SNAIL_MEAT("Fat snail meat", 22, 95, ItemID.FAT_SNAIL_MEAT), + EGG_AND_TOMATO("Egg and tomato", 23, 50, ItemID.EGG_AND_TOMATO), + ASGARNIAN_ALE("Asgarnian ale", 24, 248, ItemID.ASGARNIAN_ALE), + SALMON("Salmon", 25, 90, ItemID.SALMON), + STEW("Stew", 25, 117, ItemID.STEW), + FRUIT_BATTA("Fruit batta", 25, 150, ItemID.FRUIT_BATTA), + TOAD_BATTA("Toad batta", 26, 152, ItemID.TOAD_BATTA), + WORM_BATTA("Worm batta", 27, 154, ItemID.WORM_BATTA), + VEGETABLE_BATTA("Vegetable batta", 28, 156, ItemID.VEGETABLE_BATTA), + SWEETCORN("Sweetcorn", 28, 104, ItemID.COOKED_SWEETCORN), + COOKED_SLIMY_EEL("Cooked slimy eel", 28, 95, ItemID.COOKED_SLIMY_EEL), + MUD_PIE("Mud pie", 29, 128, ItemID.MUD_PIE), + GREENMANS_ALE("Greenman's ale", 29, 281, ItemID.GREENMANS_ALE), + CHEESE_AND_TOMATO_BATTA("Cheese and tomato Batta", 29, 158, ItemID.CHEESETOM_BATTA), + TUNA("Tuna", 30, 100, ItemID.TUNA), + APPLE_PIE("Apple pie", 30, 130, ItemID.APPLE_PIE), + WORM_HOLE("Worm hole", 30, 170, ItemID.WORM_HOLE), + COOKED_KARAMBWAN("Cooked karambwan", 30, 190, ItemID.COOKED_KARAMBWAN), + ROASTED_CHOMPY("Roasted chompy", 30, 100, ItemID.COOKED_CHOMPY), + FISHCAKE("Fishcake", 31, 100, ItemID.COOKED_FISHCAKE), + DRUNK_DRAGON("Drunk dragon", 32, 160, ItemID.DRUNK_DRAGON), + CHOC_SATURDAY("Choc saturday", 33, 170, ItemID.CHOC_SATURDAY), + TETRA("Tetra", 33, 31, ItemID.TETRA), + GARDEN_PIE("Garden pie", 34, 138, ItemID.GARDEN_PIE), + WIZARDS_MIND_BOMB("Wizard's mind bomb", 34, 314, ItemID.WIZARDS_MIND_BOMB), + JUG_OF_WINE("Jug of wine", 35, 200, ItemID.JUG_OF_WINE), + PLAIN_PIZZA("Plain pizza", 35, 143, ItemID.PLAIN_PIZZA), + RAINBOW_FISH("Rainbow fish", 35, 110, ItemID.RAINBOW_FISH), + VEG_BALL("Veg ball", 35, 175, ItemID.VEG_BALL), + BLURBERRY_SPECIAL("Blurberry special", 37, 180, ItemID.BLURBERRY_SPECIAL), + CAVE_EEL("Cave eel", 38, 115, ItemID.CAVE_EEL), + PAT_OF_BUTTER("Pat of butter", 38, 40.5f, ItemID.PAT_OF_BUTTER), + DRAGON_BITTER("Dragon bitter", 39, 347, ItemID.DRAGON_BITTER), + POTATO_WITH_BUTTER("Potato with butter", 39, 40, ItemID.POTATO_WITH_BUTTER), + LOBSTER("Lobster", 40, 120, ItemID.LOBSTER), + CAKE("Cake", 40, 180, ItemID.CAKE), + TANGLED_TOADS_LEGS("Tangled toad's legs", 40, 185, ItemID.TANGLED_TOADS_LEGS), + CHILLI_POTATO("Chilli potato", 41, 165.5f, ItemID.CHILLI_POTATO), + COOKED_JUBBLY("Cooked jubbly", 41, 160, ItemID.COOKED_JUBBLY), + CHOCOLATE_BOMB("Chocolate bomb", 42, 190, ItemID.CHOCOLATE_BOMB), + FRIED_ONIONS("Fried onions", 42, 60, ItemID.FRIED_ONIONS), + BASS("Bass", 43, 130, ItemID.BASS), + MOONLIGHT_MEAD("Moonlight mead", 44, 380, ItemID.MOONLIGHT_MEAD), + SWORDFISH("Swordfish", 45, 140, ItemID.SWORDFISH), + MEAT_PIZZA("Meat pizza", 45, 169, ItemID.MEAT_PIZZA), + FRIED_MUSHROOMS("Fried mushrooms", 46, 60, ItemID.FRIED_MUSHROOMS), + CATFISH("Catfish", 46, 43, ItemID.CATFISH), + FISH_PIE("Fish pie", 47, 164, ItemID.FISH_PIE), + POTATO_WITH_CHEESE("Potato with cheese", 47, 40, ItemID.POTATO_WITH_CHEESE), + CHEESE("Cheese", 48, 64, ItemID.CHEESE), + AXEMANS_FOLLY("Axeman's folly", 49, 413, ItemID.AXEMANS_FOLLY), + COOKED_OOMLIE_WRAP("Cooked oomlie wrap", 50, 30, ItemID.COOKED_OOMLIE_WRAP), + CHOCOLATE_CAKE("Chocolate cake", 50, 210, ItemID.CHOCOLATE_CAKE), + EGG_POTATO("Egg potato", 51, 195.5f, ItemID.EGG_POTATO), + BOTANICAL_PIE("Botanical pie", 52, 180, ItemID.BOTANICAL_PIE), + LAVA_EEL("Lava eel", 53, 30, ItemID.LAVA_EEL), + CHEFS_DELIGHT("Chef's Delight", 54, 446, ItemID.CHEFS_DELIGHT), + ANCHOVY_PIZZA("Anchovy pizza", 55, 182, ItemID.ANCHOVY_PIZZA), + MUSHROOM_AND_ONION("Mushroom & onion", 57, 120, ItemID.MUSHROOM__ONION), + UGTHANKI_KEBAB_FRESH("Ugthanki kebab (Fresh)", 58, 80, ItemID.UGTHANKI_KEBAB), + PITTA_BREAD("Pitta bread", 58, 40, ItemID.PITTA_BREAD), + SLAYERS_RESPITE("Slayer's respite", 59, 479, ItemID.SLAYERS_RESPITE), + CURRY("Curry", 60, 280, ItemID.CURRY), + MUSHROOM_PIE("Mushroom pie", 60, 200, ItemID.MUSHROOM_PIE), + MONKFISH("Monkfish", 62, 150, ItemID.MONKFISH), + MUSHROOM_POTATO("Mushroom potato", 64, 270.5f, ItemID.MUSHROOM_POTATO), + PINEAPPLE_PIZZA("Pineapple pizza", 65, 188, ItemID.PINEAPPLE_PIZZA), + WINE_OF_ZAMORAK("Wine of zamorak", 65, 200, ItemID.WINE_OF_ZAMORAK), + TUNA_AND_CORN("Tuna and corn", 67, 204, ItemID.TUNA_AND_CORN), + TUNA_POTATO("Tuna potato", 68, 309.5f, ItemID.TUNA_POTATO), + ADMIRAL_PIE("Admiral pie", 70, 210, ItemID.ADMIRAL_PIE), + SACRED_EEL("Sacred eel", 72, 109, ItemID.SACRED_EEL), + DRAGONFRUIT_PIE("Dragonfruit pie", 73, 220, ItemID.DRAGONFRUIT_PIE), + SHARK("Shark", 80, 210, ItemID.SHARK), + SEA_TURTLE("Sea turtle", 82, 211.3f, ItemID.SEA_TURTLE), + ANGLERFISH("Anglerfish", 84, 230, ItemID.ANGLERFISH), + WILD_PIE("Wild pie", 85, 240, ItemID.WILD_PIE), + DARK_CRAB("Dark crab", 90, 215, ItemID.DARK_CRAB), + MANTA_RAY("Manta ray", 91, 216.3f, ItemID.MANTA_RAY), + SUMMER_PIE("Summer pie", 95, 260, ItemID.SUMMER_PIE), + ; + + private final String name; + private final int level; + private final float xp; + private final int icon; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CraftingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CraftingAction.java new file mode 100644 index 0000000000..26d5ecf040 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CraftingAction.java @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.ItemID; + +@AllArgsConstructor +@Getter +public enum CraftingAction implements SkillAction +{ + BALL_OF_WOOL("Ball of wool", 1, 2.5f, ItemID.BALL_OF_WOOL), + UNFIRED_POT("Unfired pot", 1, 6.3f, ItemID.UNFIRED_POT), + POT("Pot", 1, 6.3f, ItemID.POT), + LEATHER_GLOVES("Leather gloves", 1, 13.8f, ItemID.LEATHER_GLOVES), + OPAL("Opal", 1, 15, ItemID.OPAL), + OPAL_RING("Opal ring", 1, 10, ItemID.OPAL_RING), + MOLTEN_GLASS("Molten glass", 1, 20, ItemID.MOLTEN_GLASS), + BEER_GLASS("Beer glass", 1, 17.5f, ItemID.BEER_GLASS), + EMPTY_CANDLE_LANTERN("Empty candle lantern", 4, 19, ItemID.EMPTY_CANDLE_LANTERN), + GOLD_RING("Gold ring", 5, 15, ItemID.GOLD_RING), + BIRD_HOUSE("Bird house", 5, 15, ItemID.BIRD_HOUSE), + GOLD_NECKLACE("Gold necklace", 6, 20, ItemID.GOLD_NECKLACE), + LEATHER_BOOTS("Leather boots", 7, 16.3f, ItemID.LEATHER_BOOTS), + UNFIRED_PIE_DISH("Unfired pie dish", 7, 15, ItemID.UNFIRED_PIE_DISH), + PIE_DISH("Pie dish", 7, 10, ItemID.PIE_DISH), + GOLD_BRACELET("Gold bracelet", 7, 25, ItemID.GOLD_BRACELET), + UNFIRED_BOWL("Unfired bowl", 8, 18, ItemID.UNFIRED_BOWL), + BOWL("Bowl", 8, 15, ItemID.BOWL), + GOLD_AMULET_U("Gold amulet (u)", 8, 30, ItemID.GOLD_AMULET_U), + COWL("Cowl", 9, 18.5f, ItemID.LEATHER_COWL), + CROSSBOW_STRING("Crossbow string", 10, 15, ItemID.CROSSBOW_STRING), + BOW_STRING("Bow string", 10, 15, ItemID.BOW_STRING), + LEATHER_VAMBRACES("Leather vambraces", 11, 22, ItemID.LEATHER_VAMBRACES), + EMPTY_OIL_LAMP("Empty oil lamp", 12, 25, ItemID.EMPTY_OIL_LAMP), + JADE("Jade", 13, 20, ItemID.JADE), + JADE_RING("Jade ring", 13, 32, ItemID.JADE_RING), + LEATHER_BODY("Leather body", 14, 25, ItemID.LEATHER_BODY), + OAK_BIRD_HOUSE("Oak bird house", 15, 20, ItemID.OAK_BIRD_HOUSE), + RED_TOPAZ("Red topaz", 16, 25, ItemID.RED_TOPAZ), + TOPAZ_RING("Topaz ring", 16, 35, ItemID.TOPAZ_RING), + HOLY_SYMBOL("Holy symbol", 16, 50, ItemID.HOLY_SYMBOL), + OPAL_NECKLACE("Opal necklace", 16, 35, ItemID.OPAL_NECKLACE), + UNHOLY_SYMBOL("Unholy symbol", 17, 50, ItemID.UNHOLY_SYMBOL), + LEATHER_CHAPS("Leather chaps", 18, 27, ItemID.LEATHER_CHAPS), + UNFIRED_PLANT_POT("Unfired plant pot", 19, 20, ItemID.UNFIRED_PLANT_POT), + EMPTY_PLANT_POT("Empty plant pot", 19, 17.5f, ItemID.EMPTY_PLANT_POT), + MAGIC_STRING("Magic string", 19, 30, ItemID.MAGIC_STRING), + SAPPHIRE("Sapphire", 20, 50, ItemID.SAPPHIRE), + SAPPHIRE_RING("Sapphire ring", 20, 40, ItemID.SAPPHIRE_RING), + EMPTY_SACK("Empty sack", 21, 38, ItemID.EMPTY_SACK), + SAPPHIRE_NECKLACE("Sapphire necklace", 22, 55, ItemID.SAPPHIRE_NECKLACE), + OPAL_BRACELET("Opal bracelet", 22, 45, ItemID.OPAL_BRACELET), + SAPPHIRE_BRACELET("Sapphire bracelet", 23, 60, ItemID.SAPPHIRE_BRACELET), + TIARA("Tiara", 23, 52.5f, ItemID.TIARA), + SAPPHIRE_AMULET_U("Sapphire amulet (u)", 24, 65, ItemID.SAPPHIRE_AMULET_U), + UNFIRED_POT_LID("Unfired pot lid", 25, 20, ItemID.UNFIRED_POT_LID), + POT_LID("Pot lid", 25, 20, ItemID.POT_LID), + JADE_NECKLACE("Jade necklace", 25, 54, ItemID.JADE_NECKLACE), + WILLOW_BIRD_HOUSE("Willow bird house", 25, 25, ItemID.WILLOW_BIRD_HOUSE), + DRIFT_NET("Drift net", 26, 55, ItemID.SMALL_FISHING_NET_6209), + EMERALD("Emerald", 27, 67.5f, ItemID.EMERALD), + EMERALD_RING("Emerald ring", 27, 55, ItemID.EMERALD_RING), + OPAL_AMULET_U("Opal amulet (u)", 27, 55, ItemID.OPAL_AMULET_U), + HARDLEATHER_BODY("Hardleather body", 28, 35, ItemID.HARDLEATHER_BODY), + EMERALD_NECKLACE("Emerald necklace", 29, 60, ItemID.EMERALD_NECKLACE), + JADE_BRACELET("Jade bracelet", 29, 60, ItemID.JADE_BRACELET), + EMERALD_BRACELET("Emerald bracelet", 30, 65, ItemID.EMERALD_BRACELET), + ROPE("Rope", 30, 25, ItemID.ROPE), + EMERALD_AMULET_U("Emerald amulet (u)", 31, 70, ItemID.EMERALD_AMULET_U), + SPIKY_VAMBRACES("Spiky vambraces", 32, 6, ItemID.SPIKY_VAMBRACES), + TOPAZ_NECKLACE("Topaz necklace", 32, 70, ItemID.TOPAZ_NECKLACE), + VIAL("Vial", 33, 35, ItemID.VIAL), + RUBY("Ruby", 34, 85, ItemID.RUBY), + RUBY_RING("Ruby ring", 34, 70, ItemID.RUBY_RING), + JADE_AMULET_U("Jade amulet (u)", 34, 70, ItemID.JADE_AMULET_U), + BROODOO_SHIELD("Broodoo shield", 35, 100, ItemID.BROODOO_SHIELD), + TEAK_BIRD_HOUSE("Teak bird house", 35, 30, ItemID.TEAK_BIRD_HOUSE), + BASKET("Basket", 36, 56, ItemID.BASKET), + COIF("Coif", 38, 37, ItemID.COIF), + TOPAZ_BRACELET("Topaz bracelet", 38, 75, ItemID.TOPAZ_BRACELET), + RUBY_NECKLACE("Ruby necklace", 40, 75, ItemID.RUBY_NECKLACE), + HARD_LEATHER_SHIELD("Hard leather shield", 41, 70, ItemID.HARD_LEATHER_SHIELD), + RUBY_BRACELET("Ruby bracelet", 42, 80, ItemID.RUBY_BRACELET), + FISHBOWL("Fishbowl", 42, 42.5f, ItemID.FISHBOWL), + DIAMOND("Diamond", 43, 107.5f, ItemID.DIAMOND), + DIAMOND_RING("Diamond ring", 43, 85, ItemID.DIAMOND_RING), + TOPAZ_AMULET_U("Topaz amulet (u)", 45, 80, ItemID.TOPAZ_AMULET_U), + SNAKESKIN_BOOTS("Snakeskin boots", 45, 30, ItemID.SNAKESKIN_BOOTS), + MAPLE_BIRD_HOUSE("Maple bird house", 45, 35, ItemID.MAPLE_BIRD_HOUSE), + UNPOWERED_ORB("Unpowered orb", 46, 52.5f, ItemID.UNPOWERED_ORB), + SNAKESKIN_VAMBRACES("Snakeskin vambraces", 47, 35, ItemID.SNAKESKIN_VAMBRACES), + SNAKESKIN_BANDANA("Snakeskin bandana", 48, 45, ItemID.SNAKESKIN_BANDANA), + LANTERN_LENS("Lantern lens", 49, 55, ItemID.LANTERN_LENS), + RUBY_AMULET_U("Ruby amulet (u)", 50, 85, ItemID.RUBY_AMULET_U), + MAHOGANY_BIRD_HOUSE("Mahogany bird house", 50, 40, ItemID.MAHOGANY_BIRD_HOUSE), + SNAKESKIN_CHAPS("Snakeskin chaps", 51, 50, ItemID.SNAKESKIN_CHAPS), + SNAKESKIN_BODY("Snakeskin body", 53, 55, ItemID.SNAKESKIN_BODY), + WATER_BATTLESTAFF("Water battlestaff", 54, 100, ItemID.WATER_BATTLESTAFF), + DRAGONSTONE("Dragonstone", 55, 137.5f, ItemID.DRAGONSTONE), + DRAGONSTONE_RING("Dragonstone ring", 55, 100, ItemID.DRAGONSTONE_RING), + DIAMOND_NECKLACE("Diamond necklace", 56, 90, ItemID.DIAMOND_NECKLACE), + SNAKESKIN_SHIELD("Snakeskin shield", 56, 100, ItemID.SNAKESKIN_SHIELD), + GREEN_DHIDE_VAMB("Green D'hide vamb", 57, 62, ItemID.GREEN_DHIDE_VAMBRACES), + DIAMOND_BRACELET("Diamond bracelet", 58, 95, ItemID.DIAMOND_BRACELET), + EARTH_BATTLESTAFF("Earth battlestaff", 58, 112.5f, ItemID.EARTH_BATTLESTAFF), + GREEN_DHIDE_CHAPS("Green D'hide chaps", 60, 124, ItemID.GREEN_DHIDE_CHAPS), + YEW_BIRD_HOUSE("Yew bird house", 60, 45, ItemID.YEW_BIRD_HOUSE), + FIRE_BATTLESTAFF("Fire battlestaff", 62, 125, ItemID.FIRE_BATTLESTAFF), + GREEN_DHIDE_SHIELD("Green D'hide shield", 62, 124, ItemID.GREEN_DHIDE_SHIELD), + GREEN_DHIDE_BODY("Green D'hide body", 63, 186, ItemID.GREEN_DHIDE_BODY), + AIR_BATTLESTAFF("Air battlestaff", 66, 137.5f, ItemID.AIR_BATTLESTAFF), + BLUE_DHIDE_VAMB("Blue D'hide vamb", 66, 70, ItemID.BLUE_DHIDE_VAMBRACES), + ONYX_RING("Onyx ring", 67, 115, ItemID.ONYX_RING), + ONYX("Onyx", 67, 167.5f, ItemID.ONYX), + BLUE_DHIDE_CHAPS("Blue D'hide chaps", 68, 140, ItemID.BLUE_DHIDE_CHAPS), + BLUE_DHIDE_SHIELD("Blue D'hide shield", 69, 140, ItemID.BLUE_DHIDE_SHIELD), + DIAMOND_AMULET_U("Diamond amulet (u)", 70, 100, ItemID.DIAMOND_AMULET_U), + BLUE_DHIDE_BODY("Blue D'hide body", 71, 210, ItemID.BLUE_DHIDE_BODY), + DRAGONSTONE_NECKLACE("Dragonstone necklace", 72, 105, ItemID.DRAGON_NECKLACE), + RED_DHIDE_VAMB("Red D'hide vamb", 73, 78, ItemID.RED_DHIDE_VAMBRACES), + DRAGONSTONE_BRACELET("Dragonstone bracelet", 74, 110, ItemID.DRAGONSTONE_BRACELET), + RED_DHIDE_CHAPS("Red D'hide chaps", 75, 156, ItemID.RED_DHIDE_CHAPS), + MAGIC_BIRD_HOUSE("Magic bird house", 75, 50, ItemID.MAGIC_BIRD_HOUSE), + RED_DHIDE_SHIELD("Red D'hide shield", 76, 156, ItemID.RED_DHIDE_SHIELD), + RED_DHIDE_BODY("Red D'hide body", 77, 234, ItemID.RED_DHIDE_BODY), + BLACK_DHIDE_VAMB("Black D'hide vamb", 79, 86, ItemID.BLACK_DHIDE_VAMBRACES), + DRAGONSTONE_AMULET_U("Dragonstone amulet (u)", 80, 150, ItemID.DRAGONSTONE_AMULET_U), + BLACK_DHIDE_CHAPS("Black D'hide chaps", 82, 172, ItemID.BLACK_DHIDE_CHAPS), + ONYX_NECKLACE("Onyx necklace", 82, 120, ItemID.ONYX_NECKLACE), + AMETHYST_BOLT_TIPS("Amethyst bolt tips", 83, 4, ItemID.AMETHYST_BOLT_TIPS), + BLACK_DHIDE_SHIELD("Black D'hide shield", 83, 172, ItemID.BLACK_DHIDE_SHIELD), + BLACK_DHIDE_BODY("Black D'hide body", 84, 258, ItemID.BLACK_DHIDE_BODY), + ONYX_BRACELET("Onyx bracelet", 84, 125, ItemID.ONYX_BRACELET), + AMETHYST_ARROWTIPS("Amethyst arrowtips", 85, 4, ItemID.AMETHYST_ARROWTIPS), + AMETHYST_JAVELIN_HEADS("Amethyst javelin heads", 87, 12, ItemID.AMETHYST_JAVELIN_HEADS), + LIGHT_ORB("Light orb", 87, 70, ItemID.LIGHT_ORB), + AMETHYST_DART_TIP("Amethyst dart tip", 89, 7.5f, ItemID.AMETHYST_DART_TIP), + ZENYTE("Zenyte", 89, 200, ItemID.ZENYTE), + ZENYTE_RING("Zenyte ring", 89, 150, ItemID.ZENYTE_RING), + ONYX_AMULET_U("Onyx amulet (u)", 90, 165, ItemID.ONYX_AMULET_U), + REDWOOD_BIRD_HOUSE("Redwood bird house", 90, 55, ItemID.REDWOOD_BIRD_HOUSE), + ZENYTE_NECKLACE("Zenyte necklace", 92, 165, ItemID.ZENYTE_NECKLACE), + ZENYTE_BRACELET("Zenyte bracelet", 95, 180, ItemID.ZENYTE_BRACELET), + ZENYTE_AMULET_U("Zenyte amulet (u)", 98, 200, ItemID.ZENYTE_AMULET_U), + ; + + private final String name; + private final int level; + private final float xp; + private final int icon; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FarmingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FarmingAction.java new file mode 100644 index 0000000000..bcf06f1668 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FarmingAction.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.ItemID; + +@AllArgsConstructor +@Getter +public enum FarmingAction implements SkillAction +{ + PLANT("Plant", 1, 31, ItemID.PLANT), + FERN_BIG_PLANT("Fern (big plant)", 1, 31, ItemID.FERN_8186), + SHORT_PLANT("Short Plant", 1, 31, ItemID.SHORT_PLANT), + DOCK_LEAF("Dock Leaf", 1, 31, ItemID.DOCK_LEAF), + SMALL_FERN("Small Fern", 1, 70, ItemID.SMALL_FERN), + THISTLE("Thistle", 1, 70, ItemID.THISTLE), + BUSH("Bush", 1, 70, ItemID.BUSH), + LARGE_LEAF_BUSH("Large Leaf Bush", 1, 70, ItemID.LARGELEAF_PLANT), + HUGE_PLANT("Huge Plant", 1, 100, ItemID.HUGE_PLANT), + TALL_PLANT("Tall Plant", 1, 100, ItemID.TALL_PLANT), + REEDS("Reeds", 1, 100, ItemID.REEDS), + FERN_SMALL_PLANT("Fern (small plant)", 1, 100, ItemID.FERN), + WINTER_SQIRK("Winter Sq'irk", 1, 30, ItemID.WINTER_SQIRK), + SPRING_SQIRK("Spring Sq'irk", 1, 40, ItemID.SPRING_SQIRK), + AUTUMN_SQIRK("Autumn Sq'irk", 1, 50, ItemID.AUTUMN_SQIRK), + SUMMER_SQIRK("Summer Sq'irk", 1, 60, ItemID.SUMMER_SQIRK), + POTATOES("Potatoes", 1, 8, ItemID.POTATO), + ONIONS("Onions", 5, 10, ItemID.ONION), + CABBAGES("Cabbages", 7, 10, ItemID.CABBAGE), + GUAM_LEAF("Guam Leaf", 9, 11, ItemID.GUAM_LEAF), + TOMATOES("Tomatoes", 12, 12.5f, ItemID.TOMATO), + MARRENTILL("Marrentill", 14, 13.5f, ItemID.MARRENTILL), + OAK_TREE("Oak Tree", 15, 481.3f, ItemID.OAK_LOGS), + TARROMIN("Tarromin", 19, 16, ItemID.TARROMIN), + SWEETCORN("Sweetcorn", 20, 17, ItemID.SWEETCORN), + GIANT_SEAWEED("Giant seaweed", 23, 21, ItemID.GIANT_SEAWEED), + HARRALANDER("Harralander", 26, 21.5f, ItemID.HARRALANDER), + LIMPWURT_PLANT("Limpwurt Plant", 26, 40, ItemID.LIMPWURT_ROOT), + APPLE_TREE("Apple Tree", 27, 1221.5f, ItemID.COOKING_APPLE), + GOUTWEED("Goutweed", 29, 105, ItemID.GOUTWEED), + WILLOW_TREE("Willow Tree", 30, 1481.5f, ItemID.WILLOW_LOGS), + STRAWBERRIES("Strawberries", 31, 26, ItemID.STRAWBERRY), + RANARR_WEED("Ranarr Weed", 32, 27, ItemID.RANARR_WEED), + BANANA_TREE("Banana Tree", 33, 1778.5f, ItemID.BANANA), + TEAK_TREE("Teak Tree", 35, 7315, ItemID.TEAK_LOGS), + TOADFLAX("Toadflax", 38, 34, ItemID.TOADFLAX), + ORANGE_TREE("Orange Tree", 39, 2505.7f, ItemID.ORANGE), + CURRY_TREE("Curry Tree", 42, 2946.9f, ItemID.CURRY_LEAF), + IRIT_LEAF("Irit Leaf", 44, 43, ItemID.IRIT_LEAF), + MAPLE_TREE("Maple Tree", 45, 3448.4f, ItemID.MAPLE_LOGS), + WATERMELONS("Watermelons", 47, 49, ItemID.WATERMELON), + AVANTOE("Avantoe", 50, 54.5f, ItemID.AVANTOE), + PINEAPPLE_PLANT("Pineapple Plant", 51, 4662.7f, ItemID.PINEAPPLE), + MAHOGANY_TREE("Mahogany Tree", 55, 15783, ItemID.MAHOGANY_LOGS), + KWUARM("Kwuarm", 56, 69, ItemID.KWUARM), + PAPAYA_TREE("Papaya Tree", 57, 6218.4f, ItemID.PAPAYA_FRUIT), + WHITE_LILY("White lily", 58, 292, ItemID.WHITE_LILY), + YEW_TREE("Yew Tree", 60, 7150.9f, ItemID.YEW_LOGS), + SNAPE_GRASS("Snape grass", 61, 82, ItemID.SNAPE_GRASS), + SNAPDRAGON("Snapdragon", 62, 87.5f, ItemID.SNAPDRAGON), + HESPORI("Hespori", 65, 12662, ItemID.CLAN_WARS_CAPE_12662), + CADANTINE("Cadantine", 67, 106.5f, ItemID.CADANTINE), + PALM_TREE("Palm Tree", 68, 10260.6f, ItemID.COCONUT), + CALQUAT_TREE("Calquat Tree", 72, 12225.5f, ItemID.CALQUAT_FRUIT), + LANTADYME("Lantadyme", 73, 134.5f, ItemID.LANTADYME), + CRYSTAL_TREE("Crystal Tree", 74, 13366, ItemID.CRYSTAL_SHARD), + MAGIC_TREE("Magic Tree", 75, 13913.8f, ItemID.MAGIC_LOGS), + DWARF_WEED("Dwarf Weed", 79, 170.5f, ItemID.DWARF_WEED), + DRAGONFRUIT_TREE("Dragonfruit Tree", 81, 17895, ItemID.DRAGONFRUIT), + SPIRIT_TREE("Spirit Tree", 83, 19501.3f, ItemID.SPIRIT_TREE), + CELASTRUS_TREE("Celastrus Tree", 85, 14334, ItemID.CELASTRUS_BARK), + TORSTOL("Torstol", 85, 199.5f, ItemID.TORSTOL), + REDWOOD_TREE("Redwood Tree", 90, 22680, ItemID.REDWOOD_LOGS), + ; + + private final String name; + private final int level; + private final float xp; + private final int icon; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataBonus.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FarmingBonus.java similarity index 78% rename from runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataBonus.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FarmingBonus.java index 675fcb51db..bef0a0bf2c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataBonus.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FarmingBonus.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Kruithne + * Copyright (c) 2021, Jordan Atwood * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,13 +22,18 @@ * (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.skillcalculator.beans; +package net.runelite.client.plugins.skillcalculator.skills; +import lombok.AllArgsConstructor; import lombok.Getter; -@Getter -public class SkillDataBonus +@AllArgsConstructor +@Getter(onMethod_ = @Override) +public enum FarmingBonus implements SkillBonus { - private String name; - private float value; -} \ No newline at end of file + FARMERS_OUTFIT("Farmer's Outfit (+2.5%)", 0.025f), + ; + + private final String name; + private final float value; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FiremakingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FiremakingAction.java new file mode 100644 index 0000000000..57d1b92e7e --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FiremakingAction.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.ItemID; + +@AllArgsConstructor +@Getter +public enum FiremakingAction implements SkillAction +{ + LOGS("Logs", 1, 40, ItemID.LOGS), + ACHEY_TREE_LOGS("Achey tree logs", 1, 40, ItemID.ACHEY_TREE_LOGS), + OAK_LOGS("Oak logs", 15, 60, ItemID.OAK_LOGS), + WILLOW_LOGS("Willow logs", 30, 90, ItemID.WILLOW_LOGS), + TEAK_LOGS("Teak logs", 35, 105, ItemID.TEAK_LOGS), + ARCTIC_PINE_LOGS("Arctic pine logs", 42, 125, ItemID.ARCTIC_PINE_LOGS), + MAPLE_LOGS("Maple logs", 45, 135, ItemID.MAPLE_LOGS), + MAHOGANY_LOGS("Mahogany logs", 50, 157.5f, ItemID.MAHOGANY_LOGS), + YEW_LOGS("Yew logs", 60, 202.5f, ItemID.YEW_LOGS), + BLISTERWOOD_LOGS("Blisterwood logs", 62, 96, ItemID.BLISTERWOOD_LOGS), + MAGIC_LOGS("Magic logs", 75, 303.8f, ItemID.MAGIC_LOGS), + REDWOOD_LOGS("Redwood logs", 90, 350, ItemID.REDWOOD_LOGS), + ; + + private final String name; + private final int level; + private final float xp; + private final int icon; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FiremakingBonus.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FiremakingBonus.java new file mode 100644 index 0000000000..6f4cd5a720 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FiremakingBonus.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter(onMethod_ = @Override) +public enum FiremakingBonus implements SkillBonus +{ + PYROMANCER_OUTFIT("Pyromancer Outfit (+2.5%)", 0.025f), + ; + + private final String name; + private final float value; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FishingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FishingAction.java new file mode 100644 index 0000000000..c414ac2d77 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FishingAction.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.ItemID; + +@AllArgsConstructor +@Getter +public enum FishingAction implements SkillAction +{ + RAW_SHRIMPS("Raw shrimps", 1, 10, ItemID.RAW_SHRIMPS), + RAW_SARDINE("Raw sardine", 5, 20, ItemID.RAW_SARDINE), + RAW_KARAMBWANJI("Raw karambwanji", 5, 5, ItemID.RAW_KARAMBWANJI), + RAW_GUPPY("Raw guppy", 7, 8, ItemID.RAW_GUPPY), + RAW_HERRING("Raw herring", 10, 30, ItemID.RAW_HERRING), + RAW_ANCHOVIES("Raw anchovies", 15, 40, ItemID.RAW_ANCHOVIES), + RAW_MACKEREL("Raw mackerel", 16, 20, ItemID.RAW_MACKEREL), + RAW_TROUT("Raw trout", 20, 50, ItemID.RAW_TROUT), + RAW_CAVEFISH("Raw cavefish", 20, 16, ItemID.RAW_CAVEFISH), + RAW_COD("Raw cod", 23, 45, ItemID.RAW_COD), + RAW_PIKE("Raw pike", 25, 60, ItemID.RAW_PIKE), + RAW_SLIMY_EEL("Raw slimy eel", 28, 65, ItemID.RAW_SLIMY_EEL), + RAW_SALMON("Raw salmon", 30, 70, ItemID.RAW_SALMON), + RAW_TETRA("Raw tetra", 33, 24, ItemID.RAW_TETRA), + RAW_TUNA("Raw tuna", 35, 80, ItemID.RAW_TUNA), + RAW_RAINBOW_FISH("Raw rainbow fish", 38, 80, ItemID.RAW_RAINBOW_FISH), + RAW_CAVE_EEL("Raw cave eel", 38, 80, ItemID.RAW_CAVE_EEL), + RAW_LOBSTER("Raw lobster", 40, 90, ItemID.RAW_LOBSTER), + RAW_BASS("Raw bass", 46, 100, ItemID.RAW_BASS), + RAW_CATFISH("Raw catfish", 46, 33, ItemID.RAW_CATFISH), + LEAPING_TROUT("Leaping trout", 48, 50, ItemID.LEAPING_TROUT), + RAW_SWORDFISH("Raw swordfish", 50, 100, ItemID.RAW_SWORDFISH), + LEAPING_SALMON("Leaping salmon", 58, 70, ItemID.LEAPING_SALMON), + RAW_MONKFISH("Raw monkfish", 62, 120, ItemID.RAW_MONKFISH), + RAW_KARAMBWAN("Raw karambwan", 65, 50, ItemID.RAW_KARAMBWAN), + LEAPING_STURGEON("Leaping sturgeon", 70, 80, ItemID.LEAPING_STURGEON), + RAW_SHARK("Raw shark", 76, 110, ItemID.RAW_SHARK), + RAW_SEA_TURTLE("Raw sea turtle", 79, 38, ItemID.RAW_SEA_TURTLE), + INFERNAL_EEL("Infernal eel", 80, 95, ItemID.INFERNAL_EEL), + RAW_MANTA_RAY("Raw manta ray", 81, 46, ItemID.RAW_MANTA_RAY), + RAW_ANGLERFISH("Raw anglerfish", 82, 120, ItemID.RAW_ANGLERFISH), + MINNOW("Minnow", 82, 26.5f, ItemID.MINNOW), + RAW_DARK_CRAB("Raw dark crab", 85, 130, ItemID.RAW_DARK_CRAB), + SACRED_EEL("Sacred eel", 87, 105, ItemID.SACRED_EEL), + ; + + private final String name; + private final int level; + private final float xp; + private final int icon; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataEntry.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FishingBonus.java similarity index 78% rename from runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataEntry.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FishingBonus.java index b21188d913..422d22968e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataEntry.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FishingBonus.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Kruithne + * Copyright (c) 2021, Jordan Atwood * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,17 +22,18 @@ * (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.skillcalculator.beans; +package net.runelite.client.plugins.skillcalculator.skills; +import lombok.AllArgsConstructor; import lombok.Getter; -@Getter -public class SkillDataEntry +@AllArgsConstructor +@Getter(onMethod_ = @Override) +public enum FishingBonus implements SkillBonus { - private String name; - private int level; - private double xp; - private Integer icon; - private Integer sprite; - private boolean ignoreBonus; -} \ No newline at end of file + ANGLERS_OUTFIT("Angler's Outfit (+2.5%)", 0.025f), + ; + + private final String name; + private final float value; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FletchingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FletchingAction.java new file mode 100644 index 0000000000..7da07f6817 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FletchingAction.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.ItemID; + +@AllArgsConstructor +@Getter +public enum FletchingAction implements SkillAction +{ + ARROW_SHAFT("Arrow shaft", 1, 0.33f, ItemID.ARROW_SHAFT), + HEADLESS_ARROW("Headless arrow", 1, 1, ItemID.HEADLESS_ARROW), + BRONZE_ARROW("Bronze arrow", 1, 1.3f, ItemID.BRONZE_ARROW), + OGRE_ARROW("Ogre arrow", 5, 1, ItemID.OGRE_ARROW), + SHORTBOW_U("Shortbow (u)", 5, 5, ItemID.SHORTBOW_U), + SHORTBOW("Shortbow", 5, 5, ItemID.SHORTBOW), + BRONZE_BOLTS("Bronze bolts", 9, 0.5f, ItemID.BRONZE_BOLTS), + WOODEN_STOCK("Wooden stock", 9, 6, ItemID.WOODEN_STOCK), + BRONZE_CROSSBOW_U("Bronze crossbow (u)", 9, 12, ItemID.BRONZE_CROSSBOW_U), + BRONZE_CROSSBOW("Bronze crossbow", 9, 6, ItemID.BRONZE_CROSSBOW), + BRONZE_DART("Bronze dart", 10, 1.8f, ItemID.BRONZE_DART), + LONGBOW("Longbow", 10, 10, ItemID.LONGBOW), + LONGBOW_U("Longbow (u)", 10, 10, ItemID.LONGBOW_U), + OPAL_BOLTS("Opal bolts", 11, 1.6f, ItemID.OPAL_BOLTS), + IRON_ARROW("Iron arrow", 15, 2.5f, ItemID.IRON_ARROW), + OAK_SHORTBOW_U("Oak shortbow (u)", 20, 16.5f, ItemID.OAK_SHORTBOW_U), + OAK_SHORTBOW("Oak shortbow", 20, 16.5f, ItemID.OAK_SHORTBOW), + IRON_DART("Iron dart", 22, 3.8f, ItemID.IRON_DART), + OAK_STOCK("Oak stock", 24, 16, ItemID.OAK_STOCK), + BLURITE_CROSSBOW_U("Blurite crossbow (u)", 24, 32, ItemID.BLURITE_CROSSBOW_U), + BLURITE_CROSSBOW("Blurite crossbow", 24, 16, ItemID.BLURITE_CROSSBOW), + OAK_LONGBOW_U("Oak longbow (u)", 25, 25, ItemID.OAK_LONGBOW_U), + OAK_LONGBOW("Oak longbow", 25, 25, ItemID.OAK_LONGBOW), + OAK_SHIELD("Oak shield", 27, 50, ItemID.OAK_SHIELD), + STEEL_ARROW("Steel arrow", 30, 5, ItemID.STEEL_ARROW), + KEBBIT_BOLTS("Kebbit bolts", 32, 1, ItemID.KEBBIT_BOLTS), + WILLOW_SHORTBOW_U("Willow shortbow (u)", 35, 33.3f, ItemID.WILLOW_SHORTBOW_U), + WILLOW_SHORTBOW("Willow shortbow", 35, 33.3f, ItemID.WILLOW_SHORTBOW), + STEEL_DART("Steel dart", 37, 7.5f, ItemID.STEEL_DART), + IRON_BOLTS("Iron bolts", 39, 1.5f, ItemID.IRON_BOLTS), + WILLOW_STOCK("Willow stock", 39, 22, ItemID.WILLOW_STOCK), + IRON_CROSSBOW_U("Iron crossbow (u)", 39, 44, ItemID.IRON_CROSSBOW_U), + IRON_CROSSBOW("Iron crossbow", 39, 22, ItemID.IRON_CROSSBOW), + WILLOW_LONGBOW_U("Willow longbow (u)", 40, 41.5f, ItemID.WILLOW_LONGBOW_U), + WILLOW_LONGBOW("Willow longbow", 40, 41.5f, ItemID.WILLOW_LONGBOW), + BATTLESTAFF("Battlestaff", 40, 80, ItemID.BATTLESTAFF), + PEARL_BOLTS("Pearl bolts", 41, 3.2f, ItemID.PEARL_BOLTS), + WILLOW_SHIELD("Willow shield", 42, 83, ItemID.WILLOW_SHIELD), + LONG_KEBBIT_BOLTS("Long kebbit bolts", 42, 1.3f, ItemID.LONG_KEBBIT_BOLTS), + SILVER_BOLTS("Silver bolts", 43, 2.5f, ItemID.SILVER_BOLTS), + MITHRIL_ARROW("Mithril arrow", 45, 7.5f, ItemID.MITHRIL_ARROW), + STEEL_BOLTS("Steel bolts", 46, 3.5f, ItemID.STEEL_BOLTS), + TEAK_STOCK("Teak stock", 46, 27, ItemID.TEAK_STOCK), + STEEL_CROSSBOW_U("Steel crossbow (u)", 46, 54, ItemID.STEEL_CROSSBOW_U), + STEEL_CROSSBOW("Steel crossbow", 46, 27, ItemID.STEEL_CROSSBOW), + MAPLE_SHORTBOW_U("Maple shortbow (u)", 50, 50, ItemID.MAPLE_SHORTBOW_U), + MAPLE_SHORTBOW("Maple shortbow", 50, 50, ItemID.MAPLE_SHORTBOW), + BARBED_BOLTS("Barbed bolts", 51, 9.5f, ItemID.BARBED_BOLTS), + MITHRIL_DART("Mithril dart", 52, 11.2f, ItemID.MITHRIL_DART), + BROAD_ARROWS("Broad arrows", 52, 10, ItemID.BROAD_ARROWS), + TOXIC_BLOWPIPE("Toxic blowpipe", 53, 120, ItemID.TOXIC_BLOWPIPE), + MITH_CROSSBOW("Mith crossbow", 54, 32, ItemID.MITHRIL_CROSSBOW), + MAPLE_STOCK("Maple stock", 54, 32, ItemID.MAPLE_STOCK), + MITHRIL_BOLTS("Mithril bolts", 54, 5, ItemID.MITHRIL_BOLTS), + MITHRIL_CROSSBOW_U("Mithril crossbow (u)", 54, 64f, ItemID.MITHRIL_CROSSBOW_U), + MAPLE_LONGBOW_U("Maple longbow (u)", 55, 58.3f, ItemID.MAPLE_LONGBOW_U), + BROAD_BOLTS("Broad bolts", 55, 3, ItemID.BROAD_BOLTS), + MAPLE_LONGBOW("Maple longbow", 55, 58, ItemID.MAPLE_LONGBOW), + SAPPHIRE_BOLTS("Sapphire bolts", 56, 4.7f, ItemID.SAPPHIRE_BOLTS), + MAPLE_SHIELD("Maple shield", 57, 116.5f, ItemID.MAPLE_SHIELD), + EMERALD_BOLTS("Emerald bolts", 58, 5.5f, ItemID.EMERALD_BOLTS), + ADAMANT_ARROW("Adamant arrow", 60, 10, ItemID.ADAMANT_ARROW), + ADAMANT_BOLTS("Adamant bolts", 61, 7, ItemID.ADAMANT_BOLTS), + MAHOGANY_STOCK("Mahogany stock", 61, 41, ItemID.MAHOGANY_STOCK), + ADAMANT_CROSSBOW_U("Adamant crossbow (u)", 61, 82, ItemID.ADAMANT_CROSSBOW_U), + ADAMANT_CROSSBOW("Adamant crossbow", 61, 41, ItemID.ADAMANT_CROSSBOW), + RUBY_BOLTS("Ruby bolts", 63, 6.3f, ItemID.RUBY_BOLTS), + DIAMOND_BOLTS("Diamond bolts", 65, 7, ItemID.DIAMOND_BOLTS), + YEW_SHORTBOW("Yew shortbow", 65, 67.5f, ItemID.YEW_SHORTBOW), + YEW_SHORTBOW_U("Yew shortbow (u)", 65, 67.5f, ItemID.YEW_SHORTBOW_U), + ADAMANT_DART("Adamant dart", 67, 15, ItemID.ADAMANT_DART), + RUNITE_CROSSBOW_U("Runite crossbow (u)", 69, 100, ItemID.RUNITE_CROSSBOW_U), + RUNE_CROSSBOW("Rune crossbow", 69, 50, ItemID.RUNE_CROSSBOW), + YEW_STOCK("Yew stock", 69, 50, ItemID.YEW_STOCK), + RUNITE_BOLTS("Runite bolts", 69, 10, ItemID.RUNITE_BOLTS), + YEW_LONGBOW("Yew longbow", 70, 75, ItemID.YEW_LONGBOW), + YEW_LONGBOW_U("Yew longbow (u)", 70, 75, ItemID.YEW_LONGBOW_U), + DRAGONSTONE_BOLTS("Dragonstone bolts", 71, 8.2f, ItemID.DRAGONSTONE_BOLTS), + YEW_SHIELD("Yew shield", 72, 150, ItemID.YEW_SHIELD), + ONYX_BOLTS("Onyx bolts", 73, 9.4f, ItemID.ONYX_BOLTS), + RUNE_ARROW("Rune arrow", 75, 12.5f, ItemID.RUNE_ARROW), + AMETHYST_BROAD_BOLTS("Amethyst broad bolts", 76, 10.6f, ItemID.AMETHYST_BROAD_BOLTS), + MAGIC_STOCK("Magic stock", 78, 70, ItemID.MAGIC_STOCK), + DRAGON_CROSSBOW_U("Dragon crossbow (u)", 78, 135, ItemID.DRAGON_CROSSBOW_U), + DRAGON_CROSSBOW("Dragon crossbow", 78, 70, ItemID.DRAGON_CROSSBOW), + MAGIC_SHORTBOW("Magic shortbow", 80, 83.3f, ItemID.MAGIC_SHORTBOW), + MAGIC_SHORTBOW_U("Magic shortbow (u)", 80, 83.3f, ItemID.MAGIC_SHORTBOW_U), + RUNE_DART("Rune dart", 81, 18.8f, ItemID.RUNE_DART), + AMETHYST_ARROW("Amethyst arrow", 82, 13.5f, ItemID.AMETHYST_ARROW), + DRAGON_BOLTS("Dragon bolts", 84, 12, ItemID.DRAGON_BOLTS_UNF), + AMETHYST_JAVELIN("Amethyst javelin", 84, 13.5f, ItemID.AMETHYST_JAVELIN), + MAGIC_LONGBOW("Magic longbow", 85, 91.5f, ItemID.MAGIC_LONGBOW), + MAGIC_LONGBOW_U("Magic longbow (u)", 85, 91.5f, ItemID.MAGIC_LONGBOW_U), + MAGIC_SHIELD("Magic shield", 87, 183, ItemID.MAGIC_SHIELD), + AMETHYST_DART("Amethyst dart", 90, 21, ItemID.AMETHYST_DART), + DRAGON_ARROW("Dragon arrow", 90, 15, ItemID.DRAGON_ARROW), + REDWOOD_SHIELD("Redwood shield", 92, 216, ItemID.REDWOOD_SHIELD), + DRAGON_DART("Dragon dart", 95, 25, ItemID.DRAGON_DART), + ; + + private final String name; + private final int level; + private final float xp; + private final int icon; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HerbloreAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HerbloreAction.java new file mode 100644 index 0000000000..fc2d5b6c65 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HerbloreAction.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.ItemID; + +@AllArgsConstructor +@Getter +public enum HerbloreAction implements SkillAction +{ + ATTACK_POTION_3("Attack potion (3)", 3, 25, ItemID.ATTACK_POTION3), + GUAM_LEAF("Guam leaf", 3, 2.5f, ItemID.GUAM_LEAF), + MARRENTILL("Marrentill", 5, 3.8f, ItemID.MARRENTILL), + ANTIPOISON_3("Antipoison (3)", 5, 37.5f, ItemID.ANTIPOISON3), + RELICYMS_BALM_3("Relicym's balm (3)", 8, 40, ItemID.RELICYMS_BALM3), + TARROMIN("Tarromin", 11, 5, ItemID.TARROMIN), + STRENGTH_POTION_3("Strength potion (3)", 12, 50, ItemID.STRENGTH_POTION3), + SERUM_207_3("Serum 207 (3)", 15, 50, ItemID.SERUM_207_3), + GUTHIX_REST_3("Guthix rest (3)", 18, 59, ItemID.GUTHIX_REST3), + GUAM_TAR("Guam tar", 19, 30, ItemID.GUAM_TAR), + HARRALANDER("Harralander", 20, 6.3f, ItemID.HARRALANDER), + COMPOST_POTION_3("Compost potion (3)", 22, 60, ItemID.COMPOST_POTION3), + RESTORE_POTION_3("Restore potion (3)", 22, 62.5f, ItemID.RESTORE_POTION3), + RANARR_WEED("Ranarr weed", 25, 7.5f, ItemID.RANARR_WEED), + ENERGY_POTION_3("Energy potion (3)", 26, 67.5f, ItemID.ENERGY_POTION3), + TOADFLAX("Toadflax", 30, 8, ItemID.TOADFLAX), + DEFENCE_POTION_3("Defence potion (3)", 30, 75, ItemID.DEFENCE_POTION3), + MARRENTILL_TAR("Marrentill tar", 31, 42.5f, ItemID.MARRENTILL_TAR), + AGILITY_POTION_3("Agility potion (3)", 34, 80, ItemID.AGILITY_POTION3), + COMBAT_POTION_3("Combat potion (3)", 36, 84, ItemID.COMBAT_POTION3), + PRAYER_POTION_3("Prayer potion (3)", 38, 87.5f, ItemID.PRAYER_POTION3), + TARROMIN_TAR("Tarromin tar", 39, 55, ItemID.TARROMIN_TAR), + IRIT_LEAF("Irit leaf", 40, 8.8f, ItemID.IRIT_LEAF), + HARRALANDER_TAR("Harralander tar", 44, 72.5f, ItemID.HARRALANDER_TAR), + SUPER_ATTACK_3("Super attack (3)", 45, 100, ItemID.SUPER_ATTACK3), + SUPERANTIPOISON_3("Superantipoison (3)", 48, 106.3f, ItemID.SUPERANTIPOISON3), + AVANTOE("Avantoe", 48, 10, ItemID.AVANTOE), + FISHING_POTION_3("Fishing potion (3)", 50, 112.5f, ItemID.FISHING_POTION3), + SUPER_ENERGY_3("Super energy (3)", 52, 117.5f, ItemID.SUPER_ENERGY3), + HUNTER_POTION_3("Hunter potion (3)", 53, 120, ItemID.HUNTER_POTION3), + KWUARM("Kwuarm", 54, 11.3f, ItemID.KWUARM), + SUPER_STRENGTH_3("Super strength (3)", 55, 125, ItemID.SUPER_STRENGTH3), + MAGIC_ESSENCE_POTION_3("Magic essence potion (3)", 57, 130, ItemID.MAGIC_ESSENCE3), + SNAPDRAGON("Snapdragon", 59, 11.8f, ItemID.SNAPDRAGON), + WEAPON_POISON("Weapon poison", 60, 137.5f, ItemID.WEAPON_POISON), + SUPER_RESTORE_3("Super restore (3)", 63, 142.5f, ItemID.SUPER_RESTORE3), + CADANTINE("Cadantine", 65, 12.5f, ItemID.CADANTINE), + SANFEW_SERUM_3("Sanfew serum (3)", 65, 160, ItemID.SANFEW_SERUM3), + SUPER_DEFENCE_3("Super defence (3)", 66, 150, ItemID.SUPER_DEFENCE3), + LANTADYME("Lantadyme", 67, 13.1f, ItemID.LANTADYME), + ANTIDOTE_PLUS_3("Antidote+ (3)", 68, 155, ItemID.ANTIDOTE3), + ANTIFIRE_POTION_3("Antifire potion (3)", 69, 157.5f, ItemID.ANTIFIRE_POTION3), + DIVINE_SUPER_ATTACK_POTION_4("Divine super attack potion(4)", 70, 2, ItemID.DIVINE_SUPER_ATTACK_POTION4), + DIVINE_SUPER_DEFENCE_POTION_4("Divine super defence potion(4)", 70, 2, ItemID.DIVINE_SUPER_DEFENCE_POTION4), + DIVINE_SUPER_STRENGTH_POTION_4("Divine super strength potion(4)", 70, 2, ItemID.DIVINE_SUPER_STRENGTH_POTION4), + DWARF_WEED("Dwarf weed", 70, 13.8f, ItemID.DWARF_WEED), + RANGING_POTION_3("Ranging potion (3)", 72, 162.5f, ItemID.RANGING_POTION3), + WEAPON_POISON_PLUS("Weapon poison (+)", 73, 165, ItemID.WEAPON_POISON_5937), + DIVINE_RANGING_POTION_4("Divine ranging potion(4)", 74, 2, ItemID.DIVINE_RANGING_POTION4), + TORSTOL("Torstol", 75, 15, ItemID.TORSTOL), + MAGIC_POTION_3("Magic potion (3)", 76, 172.5f, ItemID.MAGIC_POTION3), + STAMINA_POTION_3("Stamina potion (3)", 77, 76.5f, ItemID.STAMINA_POTION3), + STAMINA_POTION_4("Stamina potion (4)", 77, 102, ItemID.STAMINA_POTION4), + DIVINE_MAGIC_POTION_4("Divine magic potion(4)", 78, 2, ItemID.DIVINE_MAGIC_POTION4), + ZAMORAK_BREW_3("Zamorak brew (3)", 78, 175, ItemID.ZAMORAK_BREW3), + ANTIDOTE_PLUS_PLUS_3("Antidote++ (3)", 79, 177.5f, ItemID.ANTIDOTE3_5954), + BASTION_POTION_3("Bastion potion (3)", 80, 155, ItemID.BASTION_POTION3), + BATTLEMAGE_POTION_3("Battlemage potion (3)", 80, 155, ItemID.BATTLEMAGE_POTION3), + SARADOMIN_BREW_3("Saradomin brew (3)", 81, 180, ItemID.SARADOMIN_BREW3), + WEAPON_POISON_PLUS_PLUS("Weapon poison (++)", 82, 190, ItemID.WEAPON_POISON_5940), + EXTENDED_ANTIFIRE_3("Extended antifire (3)", 84, 82.5f, ItemID.EXTENDED_ANTIFIRE3), + EXTENDED_ANTIFIRE_4("Extended antifire (4)", 84, 110, ItemID.EXTENDED_ANTIFIRE4), + DIVINE_BASTION_POTION_4("Divine bastion potion(4)", 86, 2, ItemID.DIVINE_BASTION_POTION4), + DIVINE_BATTLEMAGE_POTION_4("Divine battlemage potion(4)", 86, 2, ItemID.DIVINE_BATTLEMAGE_POTION4), + ANTIVENOM_3("Anti-venom(3)", 87, 90, ItemID.ANTIVENOM3), + ANTIVENOM_4("Anti-venom(4)", 87, 120, ItemID.ANTIVENOM4), + SUPER_COMBAT_POTION_4("Super combat potion(4)", 90, 150, ItemID.SUPER_COMBAT_POTION4), + SUPER_ANTIFIRE_4("Super antifire (4)", 92, 130, ItemID.SUPER_ANTIFIRE_POTION4), + ANTIVENOM_PLUS_4("Anti-venom+(4)", 94, 125, ItemID.ANTIVENOM4_12913), + DIVINE_SUPER_COMBAT_POTION_4("Divine super combat potion(4)", 97, 2, ItemID.DIVINE_SUPER_COMBAT_POTION4), + EXTENDED_SUPER_ANTIFIRE_3("Extended super antifire (3)", 98, 120, ItemID.SUPER_ANTIFIRE_POTION3), + EXTENDED_SUPER_ANTIFIRE_4("Extended super antifire (4)", 98, 160, ItemID.SUPER_ANTIFIRE_POTION4), + ; + + private final String name; + private final int level; + private final float xp; + private final int icon; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HunterAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HunterAction.java new file mode 100644 index 0000000000..01ed388c80 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HunterAction.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.ItemID; + +@AllArgsConstructor +@Getter +public enum HunterAction implements SkillAction +{ + CRIMSON_SWIFT("Crimson Swift", 1, 34, ItemID.CRIMSON_SWIFT), + POLAR_KEBBIT("Polar Kebbit", 1, 30, ItemID.KEBBIT), + COMMON_KEBBIT("Common Kebbit", 3, 36, ItemID.KEBBIT_9954), + GOLDEN_WARBLER("Golden Warbler", 5, 47, ItemID.GOLDEN_WARBLER), + REGULAR_BIRD_HOUSE("Regular Bird House", 5, 280, ItemID.BIRD_HOUSE), + FELDIP_WEASEL("Feldip Weasel", 7, 48, ItemID.KEBBIT_9955), + COPPER_LONGTAIL("Copper Longtail", 9, 61, ItemID.COPPER_LONGTAIL), + CERULEAN_TWITCH("Cerulean Twitch", 11, 64.5f, ItemID.CERULEAN_TWITCH), + DESERT_DEVIL("Desert Devil", 13, 66, ItemID.KEBBIT_9956), + OAK_BIRD_HOUSE("Oak Bird House", 14, 420, ItemID.OAK_BIRD_HOUSE), + RUBY_HARVEST("Ruby Harvest", 15, 24, ItemID.BUTTERFLY), + BABY_IMPLING("Baby Impling", 17, 18, ItemID.BABY_IMPLING_JAR), + TROPICAL_WAGTAIL("Tropical Wagtail", 19, 95, ItemID.TROPICAL_WAGTAIL), + YOUNG_IMPLING("Young Impling", 22, 20, ItemID.YOUNG_IMPLING_JAR), + WILD_KEBBIT("Wild Kebbit", 23, 128, ItemID.KEBBIT), + WILLOW_BIRD_HOUSE("Willow Bird House", 24, 560, ItemID.WILLOW_BIRD_HOUSE), + SAPPHIRE_GLACIALIS("Sapphire Glacialis", 25, 34, ItemID.BUTTERFLY_9971), + FERRET("Ferret", 27, 115, ItemID.FERRET), + WHITE_RABBIT("White Rabbit", 27, 144, ItemID.RABBIT), + GOURMET_IMPLING("Gourmet Impling", 28, 22, ItemID.GOURMET_IMPLING_JAR), + SWAMP_LIZARD("Swamp Lizard", 29, 152, ItemID.SWAMP_LIZARD), + SPINED_LARUPIA("Spined Larupia", 31, 180, ItemID.LARUPIA_HAT), + BARB_TAILED_KEBBIT("Barb-tailed Kebbit", 33, 168, ItemID.KEBBIT_9958), + TEAK_BIRD_HOUSE("Teak Bird House", 34, 700, ItemID.TEAK_BIRD_HOUSE), + SNOWY_KNIGHT("Snowy Knight", 35, 44, ItemID.BUTTERFLY_9972), + EARTH_IMPLING("Earth Impling", 36, 25, ItemID.EARTH_IMPLING_JAR), + PRICKLY_KEBBIT("Prickly Kebbit", 37, 204, ItemID.KEBBIT_9957), + HORNED_GRAAHK("Horned Graahk", 41, 240, ItemID.GRAAHK_HEADDRESS), + ESSENCE_IMPLING("Essence Impling", 42, 27, ItemID.ESSENCE_IMPLING_JAR), + SPOTTED_KEBBIT("Spotted Kebbit", 43, 104, ItemID.KEBBIT_9960), + MAPLE_BIRD_HOUSE("Maple Bird House", 44, 820, ItemID.MAPLE_BIRD_HOUSE), + BLACK_WARLOCK("Black Warlock", 45, 54, ItemID.BUTTERFLY_9973), + ORANGE_SALAMANDER("Orange Salamander", 47, 224, ItemID.ORANGE_SALAMANDER), + RAZOR_BACKED_KEBBIT("Razor-backed Kebbit", 49, 348, ItemID.KEBBIT_9961), + MAHOGANY_BIRD_HOUSE("Mahogany Bird House", 49, 960, ItemID.MAHOGANY_BIRD_HOUSE), + ECLECTIC_IMPLING("Eclectic Impling", 50, 32, ItemID.ECLECTIC_IMPLING_JAR), + SABRE_TOOTHED_KEBBIT("Sabre-toothed Kebbit", 51, 200, ItemID.KEBBIT_9959), + CHINCHOMPA("Chinchompa", 53, 198.3f, ItemID.CHINCHOMPA), + SABRE_TOOTHED_KYATT("Sabre-toothed Kyatt", 55, 300, ItemID.KYATT_HAT), + DARK_KEBBIT("Dark Kebbit", 57, 132, ItemID.KEBBIT_9963), + NATURE_IMPLING("Nature Impling", 58, 34, ItemID.NATURE_IMPLING_JAR), + RED_SALAMANDER("Red Salamander", 59, 272, ItemID.RED_SALAMANDER), + YEW_BIRD_HOUSE("Yew Bird House", 59, 1020, ItemID.YEW_BIRD_HOUSE), + MANIACAL_MONKEY("Maniacal Monkey", 60, 1000, ItemID.MONKEY_19556), + CARNIVOROUS_CHINCHOMPA("Carnivorous Chinchompa", 63, 265, ItemID.RED_CHINCHOMPA), + MAGPIE_IMPLING("Magpie Impling", 65, 44, ItemID.MAGPIE_IMPLING_JAR), + MAGPIE_IMPLING_GIELINOR("Magpie Impling (Gielinor)", 65, 216, ItemID.MAGPIE_IMPLING_JAR), + BLACK_SALAMANDER("Black Salamander", 67, 319.5f, ItemID.BLACK_SALAMANDER), + DASHING_KEBBIT("Dashing Kebbit", 69, 156, ItemID.KEBBIT_9964), + BLACK_CHINCHOMPA("Black Chinchompa", 73, 315, ItemID.BLACK_CHINCHOMPA), + MAGIC_BIRD_HOUSE("Magic Bird House", 74, 1140, ItemID.MAGIC_BIRD_HOUSE), + NINJA_IMPLING("Ninja Impling", 74, 52, ItemID.NINJA_IMPLING_JAR), + NINJA_IMPLING_GIELINOR("Ninja Impling (Gielinor)", 74, 240, ItemID.NINJA_IMPLING_JAR), + CRYSTAL_IMPLING("Crystal Impling", 80, 280, ItemID.CRYSTAL_IMPLING_JAR), + DRAGON_IMPLING("Dragon Impling", 83, 65, ItemID.DRAGON_IMPLING_JAR), + DRAGON_IMPLING_GIELINOR("Dragon Impling (Gielinor)", 83, 300, ItemID.DRAGON_IMPLING_JAR), + REDWOOD_BIRD_HOUSE("Redwood Bird House", 89, 1200, ItemID.REDWOOD_BIRD_HOUSE), + LUCKY_IMPLING("Lucky Impling", 89, 380, ItemID.LUCKY_IMPLING_JAR), + ; + + private final String name; + private final int level; + private final float xp; + private final int icon; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MagicAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MagicAction.java new file mode 100644 index 0000000000..bb3b5a20ff --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MagicAction.java @@ -0,0 +1,221 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.SpriteID; + +@AllArgsConstructor +@Getter +public enum MagicAction implements SkillAction +{ + WIND_STRIKE("Wind Strike", 1, 5.5f, SpriteID.SPELL_WIND_STRIKE), + CONFUSE("Confuse", 3, 13, SpriteID.SPELL_CONFUSE), + ENCHANT_OPAL_BOLT("Enchant Opal Bolt", 4, 9, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT), + WATER_STRIKE("Water Strike", 5, 7.5f, SpriteID.SPELL_WATER_STRIKE), + ARCEUUS_LIBRARY_TELEPORT("Arceuus Library Teleport", 6, 10, SpriteID.SPELL_ARCEUUS_LIBRARY_TELEPORT), + ENCHANT_SAPPHIRE_JEWELLERY("Enchant Sapphire Jewellery", 7, 17.5f, SpriteID.SPELL_LVL_1_ENCHANT), + ENCHANT_SAPPHIRE_BOLT("Enchant Sapphire Bolt", 7, 17.5f, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT), + EARTH_STRIKE("Earth Strike", 9, 9.5f, SpriteID.SPELL_EARTH_STRIKE), + WEAKEN("Weaken", 11, 21, SpriteID.SPELL_WEAKEN), + FIRE_STRIKE("Fire Strike", 13, 11.5f, SpriteID.SPELL_FIRE_STRIKE), + ENCHANT_JADE_BOLT("Enchant Jade Bolt", 14, 19, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT), + BONES_TO_BANANAS("Bones To Bananas", 15, 25, SpriteID.SPELL_BONES_TO_BANANAS), + BASIC_REANIMATION("Basic Reanimation", 16, 32, SpriteID.SPELL_BASIC_REANIMATION), + DRAYNOR_MANOR_TELEPORT("Draynor Manor Teleport", 17, 16, SpriteID.SPELL_DRAYNOR_MANOR_TELEPORT), + WIND_BOLT("Wind Bolt", 17, 13.5f, SpriteID.SPELL_WIND_BOLT), + CURSE("Curse", 19, 29, SpriteID.SPELL_CURSE), + BIND("Bind", 20, 30, SpriteID.SPELL_BIND), + LOW_LEVEL_ALCHEMY("Low Level Alchemy", 21, 31, SpriteID.SPELL_LOW_LEVEL_ALCHEMY), + WATER_BOLT("Water Bolt", 23, 16.5f, SpriteID.SPELL_WATER_BOLT), + ENCHANT_PEARL_BOLT("Enchant Pearl Bolt", 24, 29, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT), + VARROCK_TELEPORT("Varrock Teleport", 25, 35, SpriteID.SPELL_VARROCK_TELEPORT), + ENCHANT_EMERALD_JEWELLERY("Enchant Emerald Jewellery", 27, 37, SpriteID.SPELL_LVL_2_ENCHANT), + ENCHANT_EMERALD_BOLT("Enchant Emerald Bolt", 27, 37, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT), + MIND_ALTAR_TELEPORT("Mind Altar Teleport", 28, 22, SpriteID.SPELL_MIND_ALTAR_TELEPORT), + ENCHANT_TOPAZ_BOLT("Enchant Topaz Bolt", 29, 33, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT), + EARTH_BOLT("Earth Bolt", 29, 19.5f, SpriteID.SPELL_EARTH_BOLT), + LUMBRIDGE_TELEPORT("Lumbridge Teleport", 31, 41, SpriteID.SPELL_LUMBRIDGE_TELEPORT), + TELEKINETIC_GRAB("Telekinetic Grab", 33, 43, SpriteID.SPELL_TELEKINETIC_GRAB), + RESPAWN_TELEPORT("Respawn Teleport", 34, 27, SpriteID.SPELL_RESPAWN_TELEPORT), + FIRE_BOLT("Fire Bolt", 35, 22.5f, SpriteID.SPELL_FIRE_BOLT), + GHOSTLY_GRASP("Ghostly Grasp", 35, 22.5f, SpriteID.SPELL_GHOSTLY_GRASP), + FALADOR_TELEPORT("Falador Teleport", 37, 48, SpriteID.SPELL_FALADOR_TELEPORT), + RESURRECT_LESSER_THRALL("Resurrect Lesser Thrall", 38, 55, SpriteID.SPELL_RESURRECT_LESSER_GHOST), + CRUMBLE_UNDEAD("Crumble Undead", 39, 24.5f, SpriteID.SPELL_CRUMBLE_UNDEAD), + SALVE_GRAVEYARD_TELEPORT("Salve Graveyard Teleport", 40, 30, SpriteID.SPELL_SALVE_GRAVEYARD_TELEPORT), + TELEPORT_TO_HOUSE("Teleport To House", 40, 30, SpriteID.SPELL_TELEPORT_TO_HOUSE), + ADEPT_REANIMATION("Adept Reanimation", 41, 80, SpriteID.SPELL_ADEPT_REANIMATION), + WIND_BLAST("Wind Blast", 41, 25.5f, SpriteID.SPELL_WIND_BLAST), + SUPERHEAT_ITEM("Superheat Item", 43, 53, SpriteID.SPELL_SUPERHEAT_ITEM), + INFERIOR_DEMONBANE("Inferior Demonbane", 44, 27, SpriteID.SPELL_INFERIOR_DEMONBANE), + CAMELOT_TELEPORT("Camelot Teleport", 45, 55.5f, SpriteID.SPELL_CAMELOT_TELEPORT), + WATER_BLAST("Water Blast", 47, 28.5f, SpriteID.SPELL_WATER_BLAST), + SHADOW_VEIL("Shadow Veil", 47, 58, SpriteID.SPELL_SHADOW_VEIL), + FENKENSTRAINS_CASTLE_TELEPORT("Fenkenstrain's Castle Teleport", 48, 50, SpriteID.SPELL_FENKENSTRAINS_CASTLE_TELEPORT), + ENCHANT_RUBY_JEWELLERY("Enchant Ruby Jewellery", 49, 59, SpriteID.SPELL_LVL_3_ENCHANT), + ENCHANT_RUBY_BOLT("Enchant Ruby Bolt", 49, 59, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT), + IBAN_BLAST("Iban Blast", 50, 30, SpriteID.SPELL_IBAN_BLAST), + SMOKE_RUSH("Smoke Rush", 50, 30, SpriteID.SPELL_SMOKE_RUSH), + MAGIC_DART("Magic Dart", 50, 30, SpriteID.SPELL_MAGIC_DART), + SNARE("Snare", 50, 60, SpriteID.SPELL_SNARE), + DARK_LURE("Dark Lure", 50, 60, SpriteID.SPELL_DARK_LURE), + ARDOUGNE_TELEPORT("Ardougne Teleport", 51, 61, SpriteID.SPELL_ARDOUGNE_TELEPORT), + SHADOW_RUSH("Shadow Rush", 52, 31, SpriteID.SPELL_SHADOW_RUSH), + EARTH_BLAST("Earth Blast", 53, 31.5f, SpriteID.SPELL_EARTH_BLAST), + PADDEWWA_TELEPORT("Paddewwa Teleport", 54, 64, SpriteID.SPELL_PADDEWWA_TELEPORT), + HIGH_LEVEL_ALCHEMY("High Level Alchemy", 55, 65, SpriteID.SPELL_HIGH_LEVEL_ALCHEMY), + CHARGE_WATER_ORB("Charge Water Orb", 56, 66, SpriteID.SPELL_CHARGE_WATER_ORB), + BLOOD_RUSH("Blood Rush", 56, 33, SpriteID.SPELL_BLOOD_RUSH), + SKELETAL_GRASP("Skeletal Grasp", 56, 33, SpriteID.SPELL_SKELETAL_GRASP), + ENCHANT_DIAMOND_BOLT("Enchant Diamond Bolt", 57, 67, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT), + ENCHANT_DIAMOND_JEWELLERY("Enchant Diamond Jewellery", 57, 67, SpriteID.SPELL_LVL_4_ENCHANT), + RESURRECT_SUPERIOR_THRALL("Resurrect Superior Thrall", 57, 70, SpriteID.SPELL_RESURRECT_SUPERIOR_SKELETON), + WATCHTOWER_TELEPORT("Watchtower Teleport", 58, 68, SpriteID.SPELL_WATCHTOWER_TELEPORT), + ICE_RUSH("Ice Rush", 58, 34, SpriteID.SPELL_ICE_RUSH), + FIRE_BLAST("Fire Blast", 59, 34.5f, SpriteID.SPELL_FIRE_BLAST), + MARK_OF_DARKNESS("Mark of Darkness", 59, 70, SpriteID.SPELL_MARK_OF_DARKNESS), + SENNTISTEN_TELEPORT("Senntisten Teleport", 60, 70, SpriteID.SPELL_SENNTISTEN_TELEPORT), + CLAWS_OF_GUTHIX("Claws Of Guthix", 60, 35, SpriteID.SPELL_CLAWS_OF_GUTHIC), + FLAMES_OF_ZAMORAK("Flames Of Zamorak", 60, 35, SpriteID.SPELL_FLAMES_OF_ZAMORAK), + SARADOMIN_STRIKE("Saradomin Strike", 60, 35, SpriteID.SPELL_SARADOMIN_STRIKE), + CHARGE_EARTH_ORB("Charge Earth Orb", 60, 70, SpriteID.SPELL_CHARGE_EARTH_ORB), + BONES_TO_PEACHES("Bones To Peaches", 60, 35.5f, SpriteID.SPELL_BONES_TO_PEACHES), + WEST_ARDOUGNE_TELEPORT("West Ardougne Teleport", 61, 68, SpriteID.SPELL_WEST_ARDOUGNE_TELEPORT), + TROLLHEIM_TELEPORT("Trollheim Teleport", 61, 68, SpriteID.SPELL_TROLLHEIM_TELEPORT), + SMOKE_BURST("Smoke Burst", 62, 36, SpriteID.SPELL_SMOKE_BURST), + WIND_WAVE("Wind Wave", 62, 36, SpriteID.SPELL_WIND_WAVE), + SUPERIOR_DEMONBANE("Superior Demonbane", 62, 36, SpriteID.SPELL_SUPERIOR_DEMONBANE), + CHARGE_FIRE_ORB("Charge Fire Orb", 63, 73, SpriteID.SPELL_CHARGE_FIRE_ORB), + SHADOW_BURST("Shadow Burst", 64, 37, SpriteID.SPELL_SHADOW_BURST), + TELEPORT_APE_ATOLL("Teleport Ape Atoll", 64, 74, SpriteID.SPELL_TELEPORT_TO_APE_ATOLL), + LESSER_CORRUPTION("Lesser Corruption", 64, 75, SpriteID.SPELL_LESSER_CORRUPTION), + BAKE_PIE("Bake Pie", 65, 60, SpriteID.SPELL_BAKE_PIE), + HARMONY_ISLAND_TELEPORT("Harmony Island Teleport", 65, 74, SpriteID.SPELL_HARMONY_ISLAND_TELEPORT), + GEOMANCY("Geomancy", 65, 60, SpriteID.SPELL_GEOMANCY), + WATER_WAVE("Water Wave", 65, 37.5f, SpriteID.SPELL_WATER_WAVE), + CHARGE_AIR_ORB("Charge Air Orb", 66, 76, SpriteID.SPELL_CHARGE_AIR_ORB), + CURE_PLANT("Cure Plant", 66, 60, SpriteID.SPELL_CURE_PLANT), + KHARYRLL_TELEPORT("Kharyrll Teleport", 66, 76, SpriteID.SPELL_KHARYRLL_TELEPORT), + VULNERABILITY("Vulnerability", 66, 76, SpriteID.SPELL_VULNERABILITY), + MONSTER_EXAMINE("Monster Examine", 66, 61, SpriteID.SPELL_MONSTER_EXAMINE), + VILE_VIGOUR("Vile Vigour", 66, 76, SpriteID.SPELL_VILE_VIGOUR), + NPC_CONTACT("Npc Contact", 67, 63, SpriteID.SPELL_NPC_CONTACT), + BLOOD_BURST("Blood Burst", 68, 39, SpriteID.SPELL_BLOOD_BURST), + CURE_OTHER("Cure Other", 68, 65, SpriteID.SPELL_CURE_OTHER), + ENCHANT_DRAGONSTONE_JEWELLERY("Enchant Dragonstone Jewellery", 68, 78, SpriteID.SPELL_LVL_5_ENCHANT), + ENCHANT_DRAGONSTONE_BOLT("Enchant Dragonstone Bolt", 68, 78, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT), + HUMIDIFY("Humidify", 68, 65, SpriteID.SPELL_HUMIDIFY), + MOONCLAN_TELEPORT("Moonclan Teleport", 69, 66, SpriteID.SPELL_MOONCLAN_TELEPORT), + EARTH_WAVE("Earth Wave", 70, 40, SpriteID.SPELL_EARTH_WAVE), + ICE_BURST("Ice Burst", 70, 40, SpriteID.SPELL_ICE_BURST), + TELE_GROUP_MOONCLAN("Tele Group Moonclan", 70, 67, SpriteID.SPELL_TELE_GROUP_MOONCLAN), + DEGRIME("Degrime", 70, 83, SpriteID.SPELL_DEGRIME), + OURANIA_TELEPORT("Ourania Teleport", 71, 69, SpriteID.SPELL_OURANIA_TELEPORT), + CEMETERY_TELEPORT("Cemetery Teleport", 71, 82, SpriteID.SPELL_CEMETERY_TELEPORT), + CURE_ME("Cure Me", 71, 69, SpriteID.SPELL_CURE_ME), + HUNTER_KIT("Hunter Kit", 71, 70, SpriteID.SPELL_HUNTER_KIT), + EXPERT_REANIMATION("Expert Reanimation", 72, 138, SpriteID.SPELL_EXPERT_REANIMATION), + LASSAR_TELEPORT("Lassar Teleport", 72, 82, SpriteID.SPELL_LASSAR_TELEPORT), + WATERBIRTH_TELEPORT("Waterbirth Teleport", 72, 71, SpriteID.SPELL_WATERBIRTH_TELEPORT), + TELE_GROUP_WATERBIRTH("Tele Group Waterbirth", 73, 72, SpriteID.SPELL_TELE_GROUP_WATERBIRTH), + ENFEEBLE("Enfeeble", 73, 83, SpriteID.SPELL_ENFEEBLE), + WARD_OF_ARCEUUS("Ward of Arceuus", 73, 83, SpriteID.SPELL_WARD_OF_ARCEUUS), + TELEOTHER_LUMBRIDGE("Teleother Lumbridge", 74, 84, SpriteID.SPELL_TELEOTHER_LUMBRIDGE), + SMOKE_BLITZ("Smoke Blitz", 74, 42, SpriteID.SPELL_SMOKE_BLITZ), + CURE_GROUP("Cure Group", 74, 74, SpriteID.SPELL_CURE_GROUP), + STAT_SPY("Stat Spy", 75, 76, SpriteID.SPELL_STAT_SPY), + BARBARIAN_TELEPORT("Barbarian Teleport", 75, 76, SpriteID.SPELL_BARBARIAN_TELEPORT), + FIRE_WAVE("Fire Wave", 75, 42.5f, SpriteID.SPELL_FIRE_WAVE), + TELE_GROUP_BARBARIAN("Tele Group Barbarian", 76, 77, SpriteID.SPELL_TELE_GROUP_ICE_PLATEAU), + SHADOW_BLITZ("Shadow Blitz", 76, 43, SpriteID.SPELL_SHADOW_BLITZ), + SPIN_FLAX("Spin Flax", 76, 75, SpriteID.SPELL_SPIN_FLAX), + RESURRECT_GREATER_THRALL("Resurrect Greater Thrall", 76, 88, SpriteID.SPELL_RESURRECT_GREATER_ZOMBIE), + SUPERGLASS_MAKE("Superglass Make", 77, 78, SpriteID.SPELL_SUPERGLASS_MAKE), + TAN_LEATHER("Tan Leather", 78, 81, SpriteID.SPELL_TAN_LEATHER), + KHAZARD_TELEPORT("Khazard Teleport", 78, 80, SpriteID.SPELL_KHAZARD_TELEPORT), + DAREEYAK_TELEPORT("Dareeyak Teleport", 78, 88, SpriteID.SPELL_DAREEYAK_TELEPORT), + RESURRECT_CROPS("Resurrect Crops", 78, 90, SpriteID.SPELL_RESURRECT_CROPS), + ENTANGLE("Entangle", 79, 89, SpriteID.SPELL_ENTANGLE), + TELE_GROUP_KHAZARD("Tele Group Khazard", 79, 81, SpriteID.SPELL_TELE_GROUP_KHAZARD), + DREAM("Dream", 79, 82, SpriteID.SPELL_DREAM), + UNDEAD_GRASP("Undead Grasp", 79, 46.5f, SpriteID.SPELL_UNDEAD_GRASP), + CHARGE("Charge", 80, 180, SpriteID.SPELL_CHARGE), + BLOOD_BLITZ("Blood Blitz", 80, 45, SpriteID.SPELL_BLOOD_BLITZ), + STUN("Stun", 80, 90, SpriteID.SPELL_STUN), + STRING_JEWELLERY("String Jewellery", 80, 83, SpriteID.SPELL_STRING_JEWELLERY), + DEATH_CHARGE("Death Charge", 80, 90, SpriteID.SPELL_DEATH_CHARGE), + STAT_RESTORE_POT_SHARE("Stat Restore Pot Share", 81, 84, SpriteID.SPELL_STAT_RESTORE_POT_SHARE), + WIND_SURGE("Wind Surge", 81, 44, SpriteID.SPELL_WIND_SURGE), + TELEOTHER_FALADOR("Teleother Falador", 82, 92, SpriteID.SPELL_TELEOTHER_FALADOR), + MAGIC_IMBUE("Magic Imbue", 82, 86, SpriteID.SPELL_MAGIC_IMBUE), + ICE_BLITZ("Ice Blitz", 82, 46, SpriteID.SPELL_ICE_BLITZ), + DARK_DEMONBANE("Dark Demonbane", 82, 43.5f, SpriteID.SPELL_DARK_DEMONBANE), + FERTILE_SOIL("Fertile Soil", 83, 87, SpriteID.SPELL_FERTILE_SOIL), + BARROWS_TELEPORT("Barrows Teleport", 83, 90, SpriteID.SPELL_BARROWS_TELEPORT), + CARRALLANGAR_TELEPORT("Carrallangar Teleport", 84, 82, SpriteID.SPELL_CARRALLANGAR_TELEPORT), + BOOST_POTION_SHARE("Boost Potion Share", 84, 88, SpriteID.SPELL_BOOST_POTION_SHARE), + DEMONIC_OFFERING("Demonic Offering", 84, 175, SpriteID.SPELL_DEMONIC_OFFERING), + WATER_SURGE("Water Surge", 85, 46, SpriteID.SPELL_WATER_SURGE), + FISHING_GUILD_TELEPORT("Fishing Guild Teleport", 85, 89, SpriteID.SPELL_FISHING_GUILD_TELEPORT), + TELE_BLOCK("Tele Block", 85, 80, SpriteID.SPELL_TELE_BLOCK), + TELEPORT_TO_TARGET("Teleport To Target", 85, 45, SpriteID.SPELL_TELEPORT_TO_BOUNTY_TARGET), + GREATER_CORRUPTION("Greater Corruption", 85, 95, SpriteID.SPELL_GREATER_CORRUPTION), + SMOKE_BARRAGE("Smoke Barrage", 86, 48, SpriteID.SPELL_SMOKE_BARRAGE), + TELE_GROUP_FISHING_GUILD("Tele Group Fishing Guild", 86, 90, SpriteID.SPELL_TELE_GROUP_FISHING_GUILD), + PLANK_MAKE("Plank Make", 86, 90, SpriteID.SPELL_PLANK_MAKE), + CATHERBY_TELEPORT("Catherby Teleport", 87, 92, SpriteID.SPELL_CATHERBY_TELEPORT), + ENCHANT_ONYX_JEWELLERY("Enchant Onyx Jewellery", 87, 97, SpriteID.SPELL_LVL_6_ENCHANT), + ENCHANT_ONYX_BOLT("Enchant Onyx Bolt", 87, 97, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT), + SHADOW_BARRAGE("Shadow Barrage", 88, 48, SpriteID.SPELL_SHADOW_BARRAGE), + TELE_GROUP_CATHERBY("Tele Group Catherby", 88, 93, SpriteID.SPELL_TELE_GROUP_CATHERBY), + ICE_PLATEAU_TELEPORT("Ice Plateau Teleport", 89, 96, SpriteID.SPELL_ICE_PLATEAU_TELEPORT), + RECHARGE_DRAGONSTONE("Recharge Dragonstone", 89, 97.5f, SpriteID.SPELL_RECHARGE_DRAGONSTONE), + ANNAKARL_TELEPORT("Annakarl Teleport", 90, 100, SpriteID.SPELL_ANNAKARL_TELEPORT), + EARTH_SURGE("Earth Surge", 90, 48, SpriteID.SPELL_EARTH_SURGE), + MASTER_REANIMATION("Master Reanimation", 90, 170, SpriteID.SPELL_MASTER_REANIMATION), + TELE_GROUP_ICE_PLATEAU("Tele Group Ice Plateau", 90, 99, SpriteID.SPELL_TELE_GROUP_ICE_PLATEAU), + TELEOTHER_CAMELOT("Teleother Camelot", 90, 100, SpriteID.SPELL_TELEOTHER_CAMELOT), + APE_ATOLL_TELEPORT("Ape Atoll Teleport", 90, 100, SpriteID.SPELL_APE_ATOLL_TELEPORT), + ENERGY_TRANSFER("Energy Transfer", 91, 100, SpriteID.SPELL_ENERGY_TRANSFER), + BLOOD_BARRAGE("Blood Barrage", 92, 51, SpriteID.SPELL_BLOOD_BARRAGE), + HEAL_OTHER("Heal Other", 92, 101, SpriteID.SPELL_HEAL_OTHER), + SINISTER_OFFERING("Sinister Offering", 92, 180, SpriteID.SPELL_SINISTER_OFFERING), + VENGEANCE_OTHER("Vengeance Other", 93, 108, SpriteID.SPELL_VENGEANCE_OTHER), + ENCHANT_ZENYTE_JEWELLERY("Enchant Zenyte Jewellery", 93, 110, SpriteID.SPELL_LVL_7_ENCHANT), + ICE_BARRAGE("Ice Barrage", 94, 52, SpriteID.SPELL_ICE_BARRAGE), + VENGEANCE("Vengeance", 94, 112, SpriteID.SPELL_VENGEANCE), + HEAL_GROUP("Heal Group", 95, 124, SpriteID.SPELL_HEAL_GROUP), + FIRE_SURGE("Fire Surge", 95, 51, SpriteID.SPELL_FIRE_SURGE), + GHORROCK_TELEPORT("Ghorrock Teleport", 96, 106, SpriteID.SPELL_GHORROCK_TELEPORT), + SPELLBOOK_SWAP("Spellbook Swap", 96, 130, SpriteID.SPELL_SPELLBOOK_SWAP), + ; + + private final String name; + private final int level; + private final float xp; + private final int sprite; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MiningAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MiningAction.java new file mode 100644 index 0000000000..cdbcdb74cf --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MiningAction.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.ItemID; +import net.runelite.api.NullItemID; + +@AllArgsConstructor +@Getter +public enum MiningAction implements SkillAction +{ + CLAY("Clay", 1, 5, ItemID.CLAY), + RUNE_ESSENCE("Rune essence", 1, 5, ItemID.RUNE_ESSENCE), + COPPER_ORE("Copper ore", 1, 17.5f, ItemID.COPPER_ORE), + TIN_ORE("Tin ore", 1, 17.5f, ItemID.TIN_ORE), + LIMESTONE("Limestone", 10, 26.5f, ItemID.LIMESTONE), + BARRONITE_SHARDS("Barronite shards", 14, 16, NullItemID.NULL_25683), + BARRONITE_DEPOSIT("Barronite deposit", 14, 32, ItemID.BARRONITE_DEPOSIT), + IRON_ORE("Iron ore", 15, 35, ItemID.IRON_ORE), + SILVER_ORE("Silver ore", 20, 40, ItemID.SILVER_ORE), + PURE_ESSENCE("Pure essence", 30, 5, ItemID.PURE_ESSENCE), + COAL("Coal", 30, 50, ItemID.COAL), + SANDSTONE_1KG("Sandstone (1kg)", 35, 30, ItemID.SANDSTONE_1KG), + SANDSTONE_2KG("Sandstone (2kg)", 35, 40, ItemID.SANDSTONE_2KG), + SANDSTONE_5KG("Sandstone (5kg)", 35, 50, ItemID.SANDSTONE_5KG), + SANDSTONE_10KG("Sandstone (10kg)", 35, 60, ItemID.SANDSTONE_10KG), + DENSE_ESSENCE_BLOCK("Dense essence block", 38, 12, ItemID.DENSE_ESSENCE_BLOCK), + GOLD_ORE("Gold ore", 40, 65, ItemID.GOLD_ORE), + GEM_ROCKS("Gem rocks", 40, 65, ItemID.UNCUT_RED_TOPAZ), + GRANITE_500G("Granite (500g)", 45, 50, ItemID.GRANITE_500G), + GRANITE_2KG("Granite (2kg)", 45, 60, ItemID.GRANITE_2KG), + GRANITE_5KG("Granite (5kg)", 45, 75, ItemID.GRANITE_5KG), + MITHRIL_ORE("Mithril ore", 55, 80, ItemID.MITHRIL_ORE), + SOFT_CLAY("Soft clay", 70, 5, ItemID.SOFT_CLAY), + ADAMANTITE_ORE("Adamantite ore", 70, 95, ItemID.ADAMANTITE_ORE), + RUNITE_ORE("Runite ore", 85, 125, ItemID.RUNITE_ORE), + AMETHYST("Amethyst", 92, 240, ItemID.AMETHYST), + ; + + private final String name; + private final int level; + private final float xp; + private final int icon; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillData.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MiningBonus.java similarity index 78% rename from runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillData.java rename to runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MiningBonus.java index 4c2d36aa68..aba67a316d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillData.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MiningBonus.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Kruithne + * Copyright (c) 2021, Jordan Atwood * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,13 +22,18 @@ * (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.skillcalculator.beans; +package net.runelite.client.plugins.skillcalculator.skills; +import lombok.AllArgsConstructor; import lombok.Getter; -@Getter -public class SkillData +@AllArgsConstructor +@Getter(onMethod_ = @Override) +public enum MiningBonus implements SkillBonus { - private SkillDataEntry[] actions; - private SkillDataBonus[] bonuses; -} \ No newline at end of file + PROSPECTOR_KIT("Prospector Kit (+2.5%)", 0.025f), + ; + + private final String name; + private final float value; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerAction.java new file mode 100644 index 0000000000..0995027103 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerAction.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.ItemID; + +@AllArgsConstructor +@Getter +public enum PrayerAction implements SkillAction +{ + ENSOULED_GOBLIN_HEAD("Ensouled goblin head", 1, 130, ItemID.ENSOULED_GOBLIN_HEAD, true), + ENSOULED_MONKEY_HEAD("Ensouled monkey head", 1, 182, ItemID.ENSOULED_MONKEY_HEAD, true), + ENSOULED_IMP_HEAD("Ensouled imp head", 1, 286, ItemID.ENSOULED_IMP_HEAD, true), + ENSOULED_MINOTAUR_HEAD("Ensouled minotaur head", 1, 364, ItemID.ENSOULED_MINOTAUR_HEAD, true), + ENSOULED_SCORPION_HEAD("Ensouled scorpion head", 1, 454, ItemID.ENSOULED_SCORPION_HEAD, true), + ENSOULED_BEAR_HEAD("Ensouled bear head", 1, 480, ItemID.ENSOULED_BEAR_HEAD, true), + ENSOULED_UNICORN_HEAD("Ensouled unicorn head", 1, 494, ItemID.ENSOULED_UNICORN_HEAD, true), + ENSOULED_DOG_HEAD("Ensouled dog head", 1, 520, ItemID.ENSOULED_DOG_HEAD, true), + ENSOULED_CHAOS_DRUID_HEAD("Ensouled chaos druid head", 1, 584, ItemID.ENSOULED_CHAOS_DRUID_HEAD, true), + ENSOULED_GIANT_HEAD("Ensouled giant head", 1, 650, ItemID.ENSOULED_GIANT_HEAD, true), + ENSOULED_OGRE_HEAD("Ensouled ogre head", 1, 716, ItemID.ENSOULED_OGRE_HEAD, true), + ENSOULED_ELF_HEAD("Ensouled elf head", 1, 754, ItemID.ENSOULED_ELF_HEAD, true), + ENSOULED_TROLL_HEAD("Ensouled troll head", 1, 780, ItemID.ENSOULED_TROLL_HEAD, true), + ENSOULED_HORROR_HEAD("Ensouled horror head", 1, 832, ItemID.ENSOULED_HORROR_HEAD, true), + ENSOULED_KALPHITE_HEAD("Ensouled kalphite head", 1, 884, ItemID.ENSOULED_KALPHITE_HEAD, true), + ENSOULED_DAGANNOTH_HEAD("Ensouled dagannoth head", 1, 936, ItemID.ENSOULED_DAGANNOTH_HEAD, true), + ENSOULED_BLOODVELD_HEAD("Ensouled bloodveld head", 1, 1040, ItemID.ENSOULED_BLOODVELD_HEAD, true), + ENSOULED_TZHAAR_HEAD("Ensouled tzhaar head", 1, 1104, ItemID.ENSOULED_TZHAAR_HEAD, true), + ENSOULED_DEMON_HEAD("Ensouled demon head", 1, 1170, ItemID.ENSOULED_DEMON_HEAD, true), + ENSOULED_AVIANSIE_HEAD("Ensouled aviansie head", 1, 1234, ItemID.ENSOULED_AVIANSIE_HEAD, true), + ENSOULED_ABYSSAL_HEAD("Ensouled abyssal head", 1, 1300, ItemID.ENSOULED_ABYSSAL_HEAD, true), + ENSOULED_DRAGON_HEAD("Ensouled dragon head", 1, 1560, ItemID.ENSOULED_DRAGON_HEAD, true), + FIENDISH_ASHES("Fiendish ashes", 1, 10, ItemID.FIENDISH_ASHES, true), + VILE_ASHES("Vile ashes", 1, 25, ItemID.VILE_ASHES, true), + MALICIOUS_ASHES("Malicious ashes", 1, 65, ItemID.MALICIOUS_ASHES, true), + ABYSSAL_ASHES("Abyssal ashes", 1, 85, ItemID.ABYSSAL_ASHES, true), + INFERNAL_ASHES("Infernal ashes", 1, 110, ItemID.INFERNAL_ASHES, true), + BONES("Bones", 1, 4.5f, ItemID.BONES, false), + WOLF_BONES("Wolf bones", 1, 4.5f, ItemID.WOLF_BONES, false), + LOAR_REMAINS("Loar remains", 1, 33, ItemID.LOAR_REMAINS, false), + BURNT_BONES("Burnt bones", 1, 4.5f, ItemID.BURNT_BONES, false), + MONKEY_BONES("Monkey bones", 1, 5, ItemID.MONKEY_BONES, false), + BAT_BONES("Bat bones", 1, 5.3f, ItemID.BAT_BONES, false), + JOGRE_BONES("Jogre bones", 1, 15, ItemID.JOGRE_BONES, false), + BIG_BONES("Big bones", 1, 15, ItemID.BIG_BONES, false), + ZOGRE_BONES("Zogre bones", 1, 22.5f, ItemID.ZOGRE_BONES, false), + SHAIKAHAN_BONES("Shaikahan bones", 1, 25, ItemID.SHAIKAHAN_BONES, false), + BABYDRAGON_BONES("Babydragon bones", 1, 30, ItemID.BABYDRAGON_BONES, false), + PHRIN_REMAINS("Phrin remains", 1, 46.5f, ItemID.PHRIN_REMAINS, false), + WYRM_BONES("Wyrm bones", 1, 50, ItemID.WYRM_BONES, false), + RIYL_REMAINS("Riyl remains", 1, 59.5f, ItemID.RIYL_REMAINS, false), + WYVERN_BONES("Wyvern bones", 1, 72, ItemID.WYVERN_BONES, false), + DRAGON_BONES("Dragon bones", 1, 72, ItemID.DRAGON_BONES, false), + DRAKE_BONES("Drake bones", 1, 80, ItemID.DRAKE_BONES, false), + ASYN_REMAINS("Asyn remains", 1, 82.5f, ItemID.ASYN_REMAINS, false), + FAYRG_BONES("Fayrg bones", 1, 84, ItemID.FAYRG_BONES, false), + FIYR_REMAINS("Fiyr remains", 1, 84, ItemID.FIYR_REMAINS, false), + LAVA_DRAGON_BONES("Lava dragon bones", 1, 85, ItemID.LAVA_DRAGON_BONES, false), + RAURG_BONES("Raurg bones", 1, 96, ItemID.RAURG_BONES, false), + HYDRA_BONES("Hydra bones", 1, 110, ItemID.HYDRA_BONES, false), + DAGANNOTH_BONES("Dagannoth bones", 1, 125, ItemID.DAGANNOTH_BONES, false), + OURG_BONES("Ourg bones", 1, 140, ItemID.OURG_BONES, false), + URIUM_REMAINS("Urium remains", 1, 120, ItemID.URIUM_REMAINS, false), + GUPPY("Guppy", 1, 4, ItemID.GUPPY, false), + CAVEFISH("Cavefish", 1, 7, ItemID.CAVEFISH, false), + TETRA("Tetra", 1, 10, ItemID.TETRA, false), + CATFISH("Catfish", 1, 16, ItemID.CATFISH, false), + SUPERIOR_DRAGON_BONES("Superior dragon bones", 70, 150, ItemID.SUPERIOR_DRAGON_BONES, false), + ; + + private final String name; + private final int level; + private final float xp; + private final int icon; + private final boolean ignoreBonus; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerBonus.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerBonus.java new file mode 100644 index 0000000000..872d52e8d3 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerBonus.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter(onMethod_ = @Override) +public enum PrayerBonus implements SkillBonus +{ + LIT_GILDED_ALTAR("Lit Gilded Altar (350%)", 2.5f), + ECTOFUNTUS("Ectofuntus (400%)", 3), + CHAOS_ALTAR("Chaos Altar (700%)", 6), + MORYTANIA_DIARY_3_SHADES("Morytania Diary 3 Shades(150%)", 0.5f), + ; + + private final String name; + private final float value; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/RunecraftAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/RunecraftAction.java new file mode 100644 index 0000000000..d6eda355db --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/RunecraftAction.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.ItemID; + +@AllArgsConstructor +@Getter +public enum RunecraftAction implements SkillAction +{ + AIR_TIARA("Air tiara", 1, 25, ItemID.AIR_TIARA, true), + MIND_TIARA("Mind tiara", 1, 27.5f, ItemID.MIND_TIARA, true), + WATER_TIARA("Water tiara", 1, 30, ItemID.WATER_TIARA, true), + EARTH_TIARA("Earth tiara", 1, 32.5f, ItemID.EARTH_TIARA, true), + FIRE_TIARA("Fire tiara", 1, 35, ItemID.FIRE_TIARA, true), + BODY_TIARA("Body tiara", 1, 37.5f, ItemID.BODY_TIARA, true), + COSMIC_TIARA("Cosmic tiara", 1, 40, ItemID.COSMIC_TIARA, true), + CHAOS_TIARA("Chaos tiara", 1, 42.5f, ItemID.CHAOS_TIARA, true), + NATURE_TIARA("Nature tiara", 1, 45, ItemID.NATURE_TIARA, true), + LAW_TIARA("Law tiara", 1, 47.5f, ItemID.LAW_TIARA, true), + DEATH_TIARA("Death tiara", 1, 50, ItemID.DEATH_TIARA, true), + WRATH_TIARA("Wrath tiara", 1, 52.5f, ItemID.WRATH_TIARA, true), + AIR_RUNE("Air rune", 1, 5, ItemID.AIR_RUNE, false), + MIND_RUNE("Mind rune", 2, 5.5f, ItemID.MIND_RUNE, false), + MIND_CORE("Mind core", 2, 55, ItemID.MIND_CORE, false), + WATER_RUNE("Water rune", 5, 6, ItemID.WATER_RUNE, false), + MIST_RUNE("Mist rune", 6, 8.5f, ItemID.MIST_RUNE, false), + EARTH_RUNE("Earth rune", 9, 6.5f, ItemID.EARTH_RUNE, false), + DUST_RUNE("Dust rune", 10, 9, ItemID.DUST_RUNE, false), + MUD_RUNE("Mud rune", 13, 9.5f, ItemID.MUD_RUNE, false), + FIRE_RUNE("Fire rune", 14, 7, ItemID.FIRE_RUNE, false), + SMOKE_RUNE("Smoke rune", 15, 9.5f, ItemID.SMOKE_RUNE, false), + STEAM_RUNE("Steam rune", 19, 10, ItemID.STEAM_RUNE, false), + BODY_RUNE("Body rune", 20, 7.5f, ItemID.BODY_RUNE, false), + BODY_CORE("Body core", 20, 75, ItemID.BODY_CORE, false), + LAVA_RUNE("Lava rune", 23, 10.5f, ItemID.LAVA_RUNE, false), + COSMIC_RUNE("Cosmic rune", 27, 8, ItemID.COSMIC_RUNE, false), + CHAOS_RUNE("Chaos rune", 35, 8.5f, ItemID.CHAOS_RUNE, false), + CHAOS_CORE("Chaos core", 35, 85, ItemID.CHAOS_CORE, false), + ASTRAL_RUNE("Astral rune", 40, 8.7f, ItemID.ASTRAL_RUNE, false), + NATURE_RUNE("Nature rune", 44, 9, ItemID.NATURE_RUNE, false), + LAW_RUNE("Law rune", 54, 9.5f, ItemID.LAW_RUNE, false), + DEATH_RUNE("Death rune", 65, 10, ItemID.DEATH_RUNE, false), + BLOOD_RUNE("Blood rune", 77, 24.425f, ItemID.BLOOD_RUNE, true), + SOUL_RUNE("Soul rune", 90, 30.325f, ItemID.SOUL_RUNE, true), + WRATH_RUNE("Wrath rune", 95, 8, ItemID.WRATH_RUNE, false), + ; + + private final String name; + private final int level; + private final float xp; + private final int icon; + private final boolean ignoreBonus; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/RunecraftBonus.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/RunecraftBonus.java new file mode 100644 index 0000000000..0fa8a7477b --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/RunecraftBonus.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter(onMethod_ = @Override) +public enum RunecraftBonus implements SkillBonus +{ + DAEYALT_ESSENCE("Daeyalt essence (+50%)", 0.5f), + ; + + private final String name; + private final float value; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SkillAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SkillAction.java new file mode 100644 index 0000000000..9f6153678a --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SkillAction.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +/** + * An object representing a single skill action which grants some xp. + */ +public interface SkillAction +{ + /** + * Gets the name of this skill action, usually the item or object created, or the spell cast. + * + * @return The name of this skill action. + */ + String getName(); + + /** + * Gets the level required to perform this skill action. + * + * @return The level required to perform this skill action. + */ + int getLevel(); + + /** + * Gets the amount of xp granted for performing this skill action. + * + * @return The amount of xp granted for performing this skill action. + */ + float getXp(); + + /** + * Gets the item icon ID for this skill action, if applicable. + *

+ * Note: Either this method or {@link #getSprite()} will always return {@code -1}, and the other will return some + * value {@code 0} or greater. + * + * @return The item icon ID of this skill action, or {@code -1} if its icon should be represented using a sprite. + * @see net.runelite.api.ItemID + * @see #getSprite() + */ + default int getIcon() + { + return -1; + } + + /** + * Gets the sprite ID for this skill action, if applicable. + *

+ * Note: Either this method or {@link #getIcon()} will always return {@code -1}, and the other will return some + * value {@code 0} or greater. + * + * @return The sprite ID of this skill action, or {@code -1} if its icon should be represented using an item icon. + * @see net.runelite.api.SpriteID + * @see #getIcon() + */ + default int getSprite() + { + return -1; + } + + /** + * Returns {@code true} if this skill action is not boosted by any {@link SkillBonus skill bonuses}, {@code false} + * otherwise. + * + * @return {@code true} if this skill action is unaffected by skill bonuses, {@code false} otherwise. + */ + default boolean isIgnoreBonus() + { + return false; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SkillBonus.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SkillBonus.java new file mode 100644 index 0000000000..cf7d1d8dcf --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SkillBonus.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +/** + * An object representing a skill bonus, such as from a skilling outfit or activity granting boosted xp. + */ +public interface SkillBonus +{ + /** + * Gets the name of this skill bonus. + * + * @return The name of this skill bonus. + */ + String getName(); + + /** + * Gets the multiplier for this skill bonus. When multiplied with the skill action XP value, it yields the amount of + * additional xp granted for that action. (eg. {@code {@link SkillAction#getXp()} * (1 + {@link #getValue()}} yields + * the full amount of xp gained) + * + * @return The skill bonus multiplier. + */ + float getValue(); +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SmithingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SmithingAction.java new file mode 100644 index 0000000000..8e32705cd1 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SmithingAction.java @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.ItemID; + +@AllArgsConstructor +@Getter +public enum SmithingAction implements SkillAction +{ + BRONZE_BAR("Bronze bar", 1, 6.3f, ItemID.BRONZE_BAR), + BRONZE_AXE("Bronze axe", 1, 12.5f, ItemID.BRONZE_AXE), + BRONZE_DAGGER("Bronze dagger", 1, 12.5f, ItemID.BRONZE_DAGGER), + BRONZE_MACE("Bronze mace", 2, 12.5f, ItemID.BRONZE_MACE), + BRONZE_MED_HELM("Bronze med helm", 3, 12.5f, ItemID.BRONZE_MED_HELM), + BRONZE_BOLTS_UNF("Bronze bolts (unf)", 3, 12.5f, ItemID.BRONZE_BOLTS_UNF), + BRONZE_NAILS("Bronze nails", 4, 12.5f, ItemID.BRONZE_NAILS), + BRONZE_SWORD("Bronze sword", 4, 12.5f, ItemID.BRONZE_SWORD), + BRONZE_WIRE("Bronze wire", 4, 12.5f, ItemID.BRONZE_WIRE), + BRONZE_DART_TIP("Bronze dart tip", 4, 12.5f, ItemID.BRONZE_DART_TIP), + BRONZE_ARROWTIPS("Bronze arrowtips", 5, 12.5f, ItemID.BRONZE_ARROWTIPS), + BRONZE_SCIMITAR("Bronze scimitar", 5, 25, ItemID.BRONZE_SCIMITAR), + BRONZE_HASTA("Bronze hasta", 5, 25, ItemID.BRONZE_HASTA), + BRONZE_SPEAR("Bronze spear", 5, 25, ItemID.BRONZE_SPEAR), + BRONZE_JAVELIN_HEADS("Bronze javelin heads", 6, 12.5f, ItemID.BRONZE_JAVELIN_HEADS), + BRONZE_LONGSWORD("Bronze longsword", 6, 25, ItemID.BRONZE_LONGSWORD), + BRONZE_LIMBS("Bronze limbs", 6, 12.5f, ItemID.BRONZE_LIMBS), + BRONZE_KNIFE("Bronze knife", 7, 12.5f, ItemID.BRONZE_KNIFE), + BRONZE_FULL_HELM("Bronze full helm", 7, 25, ItemID.BRONZE_FULL_HELM), + BRONZE_SQ_SHIELD("Bronze sq shield", 8, 25, ItemID.BRONZE_SQ_SHIELD), + BRONZE_WARHAMMER("Bronze warhammer", 9, 37.5f, ItemID.BRONZE_WARHAMMER), + BRONZE_BATTLEAXE("Bronze battleaxe", 10, 37.5f, ItemID.BRONZE_BATTLEAXE), + BRONZE_CHAINBODY("Bronze chainbody", 11, 37.5f, ItemID.BRONZE_CHAINBODY), + BRONZE_KITESHIELD("Bronze kiteshield", 12, 37.5f, ItemID.BRONZE_KITESHIELD), + BRONZE_CLAWS("Bronze claws", 13, 25, ItemID.BRONZE_CLAWS), + BRONZE_2H_SWORD("Bronze 2h sword", 14, 37.5f, ItemID.BRONZE_2H_SWORD), + BARRONITE_DEPOSITS("Barronite deposits", 14, 30, ItemID.BARRONITE_DEPOSIT), + IRON_BAR("Iron bar", 15, 12.5f, ItemID.IRON_BAR), + IRON_DAGGER("Iron dagger", 15, 25, ItemID.IRON_DAGGER), + IRON_AXE("Iron axe", 16, 25, ItemID.IRON_AXE), + BRONZE_PLATELEGS("Bronze platelegs", 16, 37.5f, ItemID.BRONZE_PLATELEGS), + BRONZE_PLATESKIRT("Bronze plateskirt", 16, 37.5f, ItemID.BRONZE_PLATESKIRT), + IRON_SPIT("Iron spit", 17, 25, ItemID.IRON_SPIT), + IRON_MACE("Iron mace", 17, 25, ItemID.IRON_MACE), + IRON_BOLTS_UNF("Iron bolts (unf)", 18, 25, ItemID.IRON_BOLTS_UNF), + BRONZE_PLATEBODY("Bronze platebody", 18, 62.5f, ItemID.BRONZE_PLATEBODY), + IRON_MED_HELM("Iron med helm", 18, 25, ItemID.IRON_MED_HELM), + IRON_NAILS("Iron nails", 19, 25, ItemID.IRON_NAILS), + IRON_DART_TIP("Iron dart tip", 19, 25, ItemID.IRON_DART_TIP), + IRON_SWORD("Iron sword", 19, 25, ItemID.IRON_SWORD), + SILVER_BAR("Silver bar", 20, 13.7f, ItemID.SILVER_BAR), + IRON_ARROWTIPS("Iron arrowtips", 20, 25, ItemID.IRON_ARROWTIPS), + IRON_SCIMITAR("Iron scimitar", 20, 50, ItemID.IRON_SCIMITAR), + IRON_HASTA("Iron hasta", 20, 50, ItemID.IRON_HASTA), + IRON_SPEAR("Iron spear", 20, 50, ItemID.IRON_SPEAR), + IRON_LONGSWORD("Iron longsword", 21, 50, ItemID.IRON_LONGSWORD), + IRON_JAVELIN_HEADS("Iron javelin heads", 21, 25, ItemID.IRON_JAVELIN_HEADS), + IRON_FULL_HELM("Iron full helm", 22, 50, ItemID.IRON_FULL_HELM), + IRON_KNIFE("Iron knife", 22, 25, ItemID.IRON_KNIFE), + IRON_LIMBS("Iron limbs", 23, 25, ItemID.IRON_LIMBS), + IRON_SQ_SHIELD("Iron sq shield", 23, 50, ItemID.IRON_SQ_SHIELD), + IRON_WARHAMMER("Iron warhammer", 24, 75, ItemID.IRON_WARHAMMER), + IRON_BATTLEAXE("Iron battleaxe", 25, 75, ItemID.IRON_BATTLEAXE), + OIL_LANTERN_FRAME("Oil lantern frame", 26, 25, ItemID.OIL_LANTERN_FRAME), + IRON_CHAINBODY("Iron chainbody", 26, 75, ItemID.IRON_CHAINBODY), + IRON_KITESHIELD("Iron kiteshield", 27, 75, ItemID.IRON_KITESHIELD), + IRON_CLAWS("Iron claws", 28, 50, ItemID.IRON_CLAWS), + IRON_2H_SWORD("Iron 2h sword", 29, 75, ItemID.IRON_2H_SWORD), + STEEL_DAGGER("Steel dagger", 30, 37.5f, ItemID.STEEL_DAGGER), + STEEL_BAR("Steel bar", 30, 17.5f, ItemID.STEEL_BAR), + IRON_PLATESKIRT("Iron plateskirt", 31, 75, ItemID.IRON_PLATESKIRT), + IRON_PLATELEGS("Iron platelegs", 31, 75, ItemID.IRON_PLATELEGS), + STEEL_AXE("Steel axe", 31, 37.5f, ItemID.STEEL_AXE), + STEEL_MACE("Steel mace", 32, 37.5f, ItemID.STEEL_MACE), + IRON_PLATEBODY("Iron platebody", 33, 125, ItemID.IRON_PLATEBODY), + STEEL_MED_HELM("Steel med helm", 33, 37.5f, ItemID.STEEL_MED_HELM), + STEEL_BOLTS_UNF("Steel bolts (unf)", 33, 37.5f, ItemID.STEEL_BOLTS_UNF), + STEEL_DART_TIP("Steel dart tip", 34, 37.5f, ItemID.STEEL_DART_TIP), + STEEL_NAILS("Steel nails", 34, 37.5f, ItemID.STEEL_NAILS), + STEEL_SWORD("Steel sword", 34, 37.5f, ItemID.STEEL_SWORD), + CANNONBALL("Cannonball", 35, 25.6f, ItemID.CANNONBALL), + STEEL_SCIMITAR("Steel scimitar", 35, 75, ItemID.STEEL_SCIMITAR), + STEEL_ARROWTIPS("Steel arrowtips", 35, 37.5f, ItemID.STEEL_ARROWTIPS), + STEEL_HASTA("Steel hasta", 35, 75, ItemID.STEEL_HASTA), + STEEL_SPEAR("Steel spear", 35, 75, ItemID.STEEL_SPEAR), + STEEL_LIMBS("Steel limbs", 36, 37.5f, ItemID.STEEL_LIMBS), + STEEL_STUDS("Steel studs", 36, 37.5f, ItemID.STEEL_STUDS), + STEEL_LONGSWORD("Steel longsword", 36, 75, ItemID.STEEL_LONGSWORD), + STEEL_JAVELIN_HEADS("Steel javelin heads", 36, 37.5f, ItemID.STEEL_JAVELIN_HEADS), + STEEL_KNIFE("Steel knife", 37, 37.5f, ItemID.STEEL_KNIFE), + STEEL_FULL_HELM("Steel full helm", 37, 75, ItemID.STEEL_FULL_HELM), + STEEL_SQ_SHIELD("Steel sq shield", 38, 75, ItemID.STEEL_SQ_SHIELD), + STEEL_WARHAMMER("Steel warhammer", 39, 112.5f, ItemID.STEEL_WARHAMMER), + STEEL_BATTLEAXE("Steel battleaxe", 40, 112.5f, ItemID.STEEL_BATTLEAXE), + GOLD_BAR_GOLDSMITH_GAUNTLETS("Gold bar (Goldsmith gauntlets)", 40, 56.2f, ItemID.GOLD_BAR), + GOLD_BAR("Gold bar", 40, 22.5f, ItemID.GOLD_BAR), + STEEL_CHAINBODY("Steel chainbody", 41, 112.5f, ItemID.STEEL_CHAINBODY), + STEEL_KITESHIELD("Steel kiteshield", 42, 112.5f, ItemID.STEEL_KITESHIELD), + STEEL_CLAWS("Steel claws", 43, 75, ItemID.STEEL_CLAWS), + STEEL_2H_SWORD("Steel 2h sword", 44, 112.5f, ItemID.STEEL_2H_SWORD), + STEEL_PLATELEGS("Steel platelegs", 46, 112.5f, ItemID.STEEL_PLATELEGS), + STEEL_PLATESKIRT("Steel plateskirt", 46, 112.5f, ItemID.STEEL_PLATESKIRT), + STEEL_PLATEBODY("Steel platebody", 48, 187.5f, ItemID.STEEL_PLATEBODY), + BULLSEYE_LANTERN_UNF("Bullseye lantern (unf)", 49, 37, ItemID.BULLSEYE_LANTERN_UNF), + MITHRIL_DAGGER("Mithril dagger", 50, 50, ItemID.MITHRIL_DAGGER), + MITHRIL_BAR("Mithril bar", 50, 30, ItemID.MITHRIL_BAR), + MITHRIL_AXE("Mithril axe", 51, 50, ItemID.MITHRIL_AXE), + MITHRIL_MACE("Mithril mace", 52, 50, ItemID.MITHRIL_MACE), + MITHRIL_MED_HELM("Mithril med helm", 53, 50, ItemID.MITHRIL_MED_HELM), + MITHRIL_BOLTS_UNF("Mithril bolts (unf)", 53, 50, ItemID.MITHRIL_BOLTS_UNF), + MITHRIL_SWORD("Mithril sword", 54, 50, ItemID.MITHRIL_SWORD), + MITHRIL_DART_TIP("Mithril dart tip", 54, 50, ItemID.MITHRIL_DART_TIP), + MITHRIL_NAILS("Mithril nails", 54, 50, ItemID.MITHRIL_NAILS), + MITHRIL_ARROWTIPS("Mithril arrowtips", 55, 50, ItemID.MITHRIL_ARROWTIPS), + MITHRIL_SCIMITAR("Mithril scimitar", 55, 100, ItemID.MITHRIL_SCIMITAR), + MITHRIL_HASTA("Mithril hasta", 55, 100, ItemID.MITHRIL_HASTA), + MITHRIL_SPEAR("Mithril spear", 55, 100, ItemID.MITHRIL_SPEAR), + MITHRIL_LONGSWORD("Mithril longsword", 56, 100, ItemID.MITHRIL_LONGSWORD), + MITHRIL_JAVELIN_HEADS("Mithril javelin heads", 56, 50, ItemID.MITHRIL_JAVELIN_HEADS), + MITHRIL_LIMBS("Mithril limbs", 56, 50, ItemID.MITHRIL_LIMBS), + MITHRIL_FULL_HELM("Mithril full helm", 57, 100, ItemID.MITHRIL_FULL_HELM), + MITHRIL_KNIFE("Mithril knife", 57, 50, ItemID.MITHRIL_KNIFE), + MITHRIL_SQ_SHIELD("Mithril sq shield", 58, 100, ItemID.MITHRIL_SQ_SHIELD), + MITH_GRAPPLE_TIP("Mith grapple tip", 59, 50, ItemID.MITH_GRAPPLE_TIP), + MITHRIL_WARHAMMER("Mithril warhammer", 59, 150, ItemID.MITHRIL_WARHAMMER), + DRAGON_SQ_SHIELD("Dragon sq shield", 60, 75, ItemID.DRAGON_SQ_SHIELD), + MITHRIL_BATTLEAXE("Mithril battleaxe", 60, 150, ItemID.MITHRIL_BATTLEAXE), + MITHRIL_CHAINBODY("Mithril chainbody", 61, 150, ItemID.MITHRIL_CHAINBODY), + MITHRIL_KITESHIELD("Mithril kiteshield", 62, 150, ItemID.MITHRIL_KITESHIELD), + MITHRIL_CLAWS("Mithril claws", 63, 100, ItemID.MITHRIL_CLAWS), + MITHRIL_2H_SWORD("Mithril 2h sword", 64, 150, ItemID.MITHRIL_2H_SWORD), + MITHRIL_PLATESKIRT("Mithril plateskirt", 66, 150, ItemID.MITHRIL_PLATESKIRT), + MITHRIL_PLATELEGS("Mithril platelegs", 66, 150, ItemID.MITHRIL_PLATELEGS), + MITHRIL_PLATEBODY("Mithril platebody", 68, 250, ItemID.MITHRIL_PLATEBODY), + ADAMANT_DAGGER("Adamant dagger", 70, 62.5f, ItemID.ADAMANT_DAGGER), + ADAMANTITE_BAR("Adamantite bar", 70, 37.5f, ItemID.ADAMANTITE_BAR), + ADAMANT_AXE("Adamant axe", 71, 62.5f, ItemID.ADAMANT_AXE), + ADAMANT_MACE("Adamant mace", 72, 62.5f, ItemID.ADAMANT_MACE), + ADAMANT_BOLTS_UNF("Adamant bolts (unf)", 73, 62.5f, ItemID.ADAMANT_BOLTSUNF), + ADAMANT_MED_HELM("Adamant med helm", 73, 62.5f, ItemID.ADAMANT_MED_HELM), + ADAMANT_DART_TIP("Adamant dart tip", 74, 62.5f, ItemID.ADAMANT_DART_TIP), + ADAMANT_SWORD("Adamant sword", 74, 62.5f, ItemID.ADAMANT_SWORD), + ADAMANTITE_NAILS("Adamantite nails", 74, 62.5f, ItemID.ADAMANTITE_NAILS), + ADAMANT_ARROWTIPS("Adamant arrowtips", 75, 62.5f, ItemID.ADAMANT_ARROWTIPS), + ADAMANT_SCIMITAR("Adamant scimitar", 75, 125, ItemID.ADAMANT_SCIMITAR), + ADAMANT_HASTA("Adamant hasta", 75, 125, ItemID.ADAMANT_HASTA), + ADAMANT_SPEAR("Adamant spear", 75, 125, ItemID.ADAMANT_SPEAR), + ADAMANTITE_LIMBS("Adamantite limbs", 76, 62.5f, ItemID.ADAMANTITE_LIMBS), + ADAMANT_LONGSWORD("Adamant longsword", 76, 125, ItemID.ADAMANT_LONGSWORD), + ADAMANT_JAVELIN_HEADS("Adamant javelin heads", 76, 62.5f, ItemID.ADAMANT_JAVELIN_HEADS), + ADAMANT_FULL_HELM("Adamant full helm", 77, 125, ItemID.ADAMANT_FULL_HELM), + ADAMANT_KNIFE("Adamant knife", 77, 62.5f, ItemID.ADAMANT_KNIFE), + ADAMANT_SQ_SHIELD("Adamant sq shield", 78, 125, ItemID.ADAMANT_SQ_SHIELD), + ADAMANT_WARHAMMER("Adamant warhammer", 79, 187.5f, ItemID.ADAMANT_WARHAMMER), + ADAMANT_BATTLEAXE("Adamant battleaxe", 80, 187.5f, ItemID.ADAMANT_BATTLEAXE), + ADAMANT_CHAINBODY("Adamant chainbody", 81, 187.5f, ItemID.ADAMANT_CHAINBODY), + ADAMANT_KITESHIELD("Adamant kiteshield", 82, 187.5f, ItemID.ADAMANT_KITESHIELD), + ADAMANT_CLAWS("Adamant claws", 83, 125, ItemID.ADAMANT_CLAWS), + ADAMANT_2H_SWORD("Adamant 2h sword", 84, 187.5f, ItemID.ADAMANT_2H_SWORD), + RUNITE_BAR("Runite bar", 85, 50, ItemID.RUNITE_BAR), + RUNE_DAGGER("Rune dagger", 85, 75, ItemID.RUNE_DAGGER), + RUNE_AXE("Rune axe", 86, 75, ItemID.RUNE_AXE), + ADAMANT_PLATESKIRT("Adamant plateskirt", 86, 187.5f, ItemID.ADAMANT_PLATESKIRT), + ADAMANT_PLATELEGS("Adamant platelegs", 86, 187.5f, ItemID.ADAMANT_PLATELEGS), + RUNE_MACE("Rune mace", 87, 75, ItemID.RUNE_MACE), + RUNITE_BOLTS_UNF("Runite bolts (unf)", 88, 75, ItemID.RUNITE_BOLTS_UNF), + RUNE_MED_HELM("Rune med helm", 88, 75, ItemID.RUNE_MED_HELM), + ADAMANT_PLATEBODY("Adamant platebody", 88, 312.5f, ItemID.ADAMANT_PLATEBODY), + RUNE_SWORD("Rune sword", 89, 75, ItemID.RUNE_SWORD), + RUNE_NAILS("Rune nails", 89, 75, ItemID.RUNE_NAILS), + RUNE_DART_TIP("Rune dart tip", 89, 75, ItemID.RUNE_DART_TIP), + RUNE_ARROWTIPS("Rune arrowtips", 90, 75, ItemID.RUNE_ARROWTIPS), + RUNE_SCIMITAR("Rune scimitar", 90, 150, ItemID.RUNE_SCIMITAR), + RUNE_HASTA("Rune hasta", 90, 150, ItemID.RUNE_HASTA), + RUNE_SPEAR("Rune spear", 90, 150, ItemID.RUNE_SPEAR), + DRAGONFIRE_SHIELD("Dragonfire shield", 90, 2000, ItemID.DRAGONFIRE_SHIELD), + RUNE_LONGSWORD("Rune longsword", 91, 150, ItemID.RUNE_LONGSWORD), + RUNE_JAVELIN_HEADS("Rune javelin heads", 91, 75, ItemID.RUNE_JAVELIN_HEADS), + RUNITE_LIMBS("Runite limbs", 91, 75, ItemID.RUNITE_LIMBS), + RUNE_KNIFE("Rune knife", 92, 75, ItemID.RUNE_KNIFE), + RUNE_FULL_HELM("Rune full helm", 92, 150, ItemID.RUNE_FULL_HELM), + RUNE_SQ_SHIELD("Rune sq shield", 93, 150, ItemID.RUNE_SQ_SHIELD), + RUNE_WARHAMMER("Rune warhammer", 94, 225, ItemID.RUNE_WARHAMMER), + RUNE_BATTLEAXE("Rune battleaxe", 95, 225, ItemID.RUNE_BATTLEAXE), + RUNE_CHAINBODY("Rune chainbody", 96, 225, ItemID.RUNE_CHAINBODY), + RUNE_KITESHIELD("Rune kiteshield", 97, 225, ItemID.RUNE_KITESHIELD), + RUNE_CLAWS("Rune claws", 98, 150, ItemID.RUNE_CLAWS), + RUNE_PLATEBODY("Rune platebody", 99, 375, ItemID.RUNE_PLATEBODY), + RUNE_PLATESKIRT("Rune plateskirt", 99, 225, ItemID.RUNE_PLATESKIRT), + RUNE_PLATELEGS("Rune platelegs", 99, 225, ItemID.RUNE_PLATELEGS), + RUNE_2H_SWORD("Rune 2h sword", 99, 225, ItemID.RUNE_2H_SWORD), + ; + + private final String name; + private final int level; + private final float xp; + private final int icon; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ThievingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ThievingAction.java new file mode 100644 index 0000000000..1f168e6dba --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ThievingAction.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.ItemID; + +@AllArgsConstructor +@Getter +public enum ThievingAction implements SkillAction +{ + MAN_OR_WOMAN("Man / Woman", 1, 8, ItemID.MAN), + WINTER_SQIRKJUICE("Winter Sq'irkjuice", 1, 350, ItemID.WINTER_SQIRKJUICE), + VEGETABLE_STALL("Vegetable Stall", 2, 10, ItemID.CABBAGE), + CAKE_STALL("Cake Stall", 5, 16, ItemID.CAKE), + TEA_STALL("Tea Stall", 5, 16, ItemID.CUP_OF_TEA_4242), + CRAFTING_STALL("Crafting Stall", 5, 16, ItemID.CHISEL_5601), + MONKEY_FOOD_STALL("Monkey Food Stall", 5, 16, ItemID.BANANA), + FARMER("Farmer", 10, 14.5f, ItemID.FARMER), + FEMALE_HAM_MEMBER("Female H.A.M. Member", 15, 18.5f, ItemID.FEMALE_HAM), + SILK_STALL("Silk Stall", 20, 24, ItemID.SILK), + MALE_HAM_MEMBER("Male H.A.M. Member", 20, 22.5f, ItemID.MALE_HAM), + WINE_STALL("Wine Stall", 22, 27, ItemID.BOTTLE_OF_WINE), + WARRIOR_WOMEN_OR_AL_KHARID_WARRIOR("Warrior Women / Al-Kharid Warrior", 25, 26, ItemID.WARRIOR_WOMAN), + FRUIT_STALL("Fruit Stall", 25, 28, ItemID.STRANGE_FRUIT), + SPRING_SQIRKJUICE("Spring Sq'irkjuice", 25, 1350, ItemID.SPRING_SQIRKJUICE), + SEED_STALL("Seed Stall", 27, 10, ItemID.POTATO_SEED), + ROGUE("Rogue", 32, 35.5f, ItemID.ROGUE), + FUR_STALL("Fur Stall", 35, 36, ItemID.GREY_WOLF_FUR), + CAVE_GOBLIN("Cave Goblin", 36, 40, ItemID.CAVE_GOBLIN), + MASTER_FARMER("Master Farmer", 38, 43, ItemID.MASTER_FARMER), + GUARD("Guard", 40, 46.8f, ItemID.GUARD), + FISH_STALL("Fish Stall", 42, 42, ItemID.RAW_SALMON), + BEARDED_POLLNIVNIAN_BANDIT("Bearded Pollnivnian Bandit", 45, 65, ItemID.BANDIT_6782), + FREMENNIK_CITIZEN("Fremennik Citizen", 45, 65, ItemID.FREMENNIK), + AUTUMN_SQIRKJUICE("Autumn Sq'irkjuice", 45, 2350, ItemID.AUTUMN_SQIRKJUICE), + CROSSBOW_STALL("Crossbow Stall", 49, 52, ItemID.CROSSBOW), + SILVER_STALL("Silver Stall", 50, 54, ItemID.SILVER_BAR), + WALL_SAFE("Wall Safe", 50, 70, ItemID.STETHOSCOPE), + DESERT_BANDIT("Desert Bandit", 53, 79.5f, ItemID.BANDIT), + KNIGHT("Knight", 55, 84.3f, ItemID.KNIGHT_OF_ARDOUGNE), + POLLNIVNIAN_BANDIT("Pollnivnian Bandit", 55, 84.3f, ItemID.BANDIT_6781), + MAGIC_STALL("Magic Stall", 65, 100, ItemID.AIR_RUNE_6422), + SCIMITAR_STALL("Scimitar Stall", 65, 100, ItemID.STEEL_SCIMITAR), + MENAPHITE_THUG("Menaphite Thug", 65, 137.5f, ItemID.MENAPHITE_THUG), + SPICES_STALL("Spices Stall", 65, 81, ItemID.SPICE), + YANILLE_WATCHMAN("Yanille Watchman", 65, 137.5f, ItemID.WATCHMAN), + SUMMER_SQIRKJUICE("Summer Sq'irkjuice", 65, 3000, ItemID.SUMMER_SQIRKJUICE), + PALADIN("Paladin", 70, 151.8f, ItemID.PALADIN), + GNOME("Gnome", 75, 198.5f, ItemID.GNOME), + GEMS_STALL("Gems Stall", 75, 160, ItemID.SAPPHIRE), + HERO("Hero", 80, 275, ItemID.HERO), + VYRE("Vyre", 82, 306.9f, ItemID.VYRE), + ELF("Elf", 85, 353, ItemID.ELF), + TZHAAR_HUR("TzHaar-Hur", 90, 103.4f, ItemID.TZHAARHUR), + ; + + private final String name; + private final int level; + private final float xp; + private final int icon; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/WoodcuttingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/WoodcuttingAction.java new file mode 100644 index 0000000000..6bb90b5ea1 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/WoodcuttingAction.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.ItemID; + +@AllArgsConstructor +@Getter +public enum WoodcuttingAction implements SkillAction +{ + LOGS("Logs", 1, 25, ItemID.LOGS), + ACHEY_TREE_LOGS("Achey tree logs", 1, 25, ItemID.ACHEY_TREE_LOGS), + OAK_LOGS("Oak logs", 15, 37.5f, ItemID.OAK_LOGS), + WILLOW_LOGS("Willow logs", 30, 67.5f, ItemID.WILLOW_LOGS), + TEAK_LOGS("Teak logs", 35, 85, ItemID.TEAK_LOGS), + BARK("Bark", 45, 82.5f, ItemID.BARK), + MAPLE_LOGS("Maple logs", 45, 100, ItemID.MAPLE_LOGS), + MAHOGANY_LOGS("Mahogany logs", 50, 125, ItemID.MAHOGANY_LOGS), + ARCTIC_PINE_LOGS("Arctic pine logs", 54, 40, ItemID.ARCTIC_PINE_LOGS), + YEW_LOGS("Yew logs", 60, 175, ItemID.YEW_LOGS), + BLISTERWOOD_LOGS("Blisterwood logs", 62, 76, ItemID.BLISTERWOOD_LOGS), + SULLIUSCEPS("Sulliusceps", 65, 127, ItemID.SULLIUSCEP_CAP), + MAGIC_LOGS("Magic logs", 75, 250, ItemID.MAGIC_LOGS), + REDWOOD_LOGS("Redwood logs", 90, 380, ItemID.REDWOOD_LOGS), + ; + + private final String name; + private final int level; + private final float xp; + private final int icon; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/WoodcuttingBonus.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/WoodcuttingBonus.java new file mode 100644 index 0000000000..14ee9a4c21 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/WoodcuttingBonus.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter(onMethod_ = @Override) +public enum WoodcuttingBonus implements SkillBonus +{ + LUMBERJACK_OUTFIT("Lumberjack Outfit (+2.5%)", 0.025f), + ; + + private final String name; + private final float value; +} diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_agility.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_agility.json deleted file mode 100644 index e26954adde..0000000000 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_agility.json +++ /dev/null @@ -1,160 +0,0 @@ -{ - "actions": [ - { - "level": 1, - "icon": 2150, - "name": "Gnome Stronghold", - "xp": 86.5 - }, - { - "level": 5, - "icon": 13359, - "name": "Shayzien Basic Course", - "xp": 133.2 - }, - { - "level": 10, - "icon": 11849, - "name": "Draynor Village Rooftop", - "xp": 120 - }, - { - "level":15, - "icon": 11328, - "name": "Leaping trout", - "xp": 5 - }, - { - "level": 20, - "icon": 11849, - "name": "Al Kharid Rooftop", - "xp": 180 - }, - { - "level": 30, - "icon": 11849, - "name": "Varrock Rooftop", - "xp": 238 - }, - { - "level": 30, - "icon": 10595, - "name": "Penguin Agility Course", - "xp": 540 - }, - { - "level":30, - "icon": 11330, - "name": "Leaping salmon", - "xp": 6 - }, - { - "level": 35, - "icon": 1365, - "name": "Barbarian Outpost", - "xp": 152.5 - }, - { - "level": 40, - "icon": 11849, - "name": "Canifis Rooftop", - "xp": 240 - }, - { - "level":45, - "icon": 11332, - "name": "Leaping sturgeon", - "xp": 7 - }, - { - "level": 48, - "icon": 4026, - "name": "Ape Atoll", - "xp": 580 - }, - { - "level": 48, - "icon": 13379, - "name": "Shayzien Advanced Course", - "xp": 474.3 - }, - { - "level": 50, - "icon": 11849, - "name": "Falador Rooftop", - "xp": 440 - }, - { - "level": 52, - "icon": 964, - "name": "Wilderness Agility Course", - "xp": 571 - }, - { - "level": 52, - "icon": 24736, - "name": "Hallowed Sepulchre Floor 1", - "xp": 575 - }, - { - "level": 60, - "icon": 11849, - "name": "Seers' Village Rooftop", - "xp": 570 - }, - { - "level": 60, - "icon": 4179, - "name": "Werewolf Agility Course", - "xp": 730 - }, - { - "level": 62, - "icon": 24736, - "name": "Hallowed Sepulchre Floor 2", - "xp": 925 - }, - { - "level": 70, - "icon": 11849, - "name": "Pollnivneach Rooftop", - "xp": 890 - }, - { - "level": 72, - "icon": 24736, - "name": "Hallowed Sepulchre Floor 3", - "xp": 1500 - }, - { - "level": 75, - "icon": 23962, - "name": "Prifddinas Agility Course", - "xp": 1337 - }, - { - "level": 80, - "icon": 11849, - "name": "Rellekka Rooftop", - "xp": 780 - }, - { - "level": 82, - "icon": 24736, - "name": "Hallowed Sepulchre Floor 4", - "xp": 2700 - }, - { - "level": 90, - "icon": 11849, - "name": "Ardougne Rooftop", - "xp": 793 - }, - { - "level": 92, - "icon": 24736, - "name": "Hallowed Sepulchre Floor 5", - "xp": 6000 - } - ] -} diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_construction.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_construction.json deleted file mode 100644 index 32897151de..0000000000 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_construction.json +++ /dev/null @@ -1,1018 +0,0 @@ -{ - "bonuses": [ - { - "name": "Carpenter's Outfit (+2.5%)", - "value": 0.025 - } - ], - "actions": [ - { - "level": 1, - "icon": 8168, - "name": "Exit Portal", - "xp": 100 - }, - { - "level": 1, - "icon": 960, - "name": "Plank", - "xp": 29 - }, - { - "level": 1, - "icon": 8778, - "name": "Oak Plank", - "xp": 60 - }, - { - "level": 1, - "icon": 8780, - "name": "Teak Plank", - "xp": 90 - }, - { - "level": 1, - "icon": 8782, - "name": "Mahogany Plank", - "xp": 140 - }, - { - "level": 1, - "icon": 8180, - "name": "Plant", - "xp": 31 - }, - { - "level": 1, - "icon": 8186, - "name": "Fern (big plant)", - "xp": 31 - }, - { - "level": 1, - "icon": 8189, - "name": "Short Plant", - "xp": 31 - }, - { - "level": 1, - "icon": 8183, - "name": "Dock Leaf", - "xp": 31 - }, - { - "level": 1, - "icon": 8309, - "name": "Crude Wooden Chair", - "xp": 58 - }, - { - "level": 2, - "icon": 8316, - "name": "Brown Rug", - "xp": 30 - }, - { - "level": 2, - "icon": 8322, - "name": "Torn Curtains", - "xp": 132 - }, - { - "level": 3, - "icon": 8325, - "name": "Clay Fireplace", - "xp": 30 - }, - { - "level": 4, - "icon": 8319, - "name": "Wooden Bookcase", - "xp": 115 - }, - { - "level": 5, - "icon": 8216, - "name": "Firepit", - "xp": 40 - }, - { - "level": 5, - "icon": 8236, - "name": "Cat Blanket", - "xp": 15 - }, - { - "level": 5, - "icon": 8169, - "name": "Decorative Rock", - "xp": 100 - }, - { - "level": 5, - "icon": 8173, - "name": "Tree", - "xp": 31 - }, - { - "level": 6, - "icon": 8181, - "name": "Small Fern", - "xp": 70 - }, - { - "level": 6, - "icon": 8184, - "name": "Thistle", - "xp": 70 - }, - { - "level": 6, - "icon": 8187, - "name": "Bush", - "xp": 70 - }, - { - "level": 6, - "icon": 8190, - "name": "Large Leaf Bush", - "xp": 70 - }, - { - "level": 6, - "icon": 8223, - "name": "Wooden Shelves 1", - "xp": 87 - }, - { - "level": 7, - "icon": 8230, - "name": "Pump and Drain", - "xp": 100 - }, - { - "level": 7, - "icon": 8239, - "name": "Beer Barrel", - "xp": 87 - }, - { - "level": 8, - "icon": 8310, - "name": "Wooden Chair", - "xp": 87 - }, - { - "level": 9, - "icon": 8233, - "name": "Wooden Larder", - "xp": 228 - }, - { - "level": 10, - "icon": 8115, - "name": "Wood Dining Table", - "xp": 115 - }, - { - "level": 10, - "icon": 8170, - "name": "Pond", - "xp": 100 - }, - { - "level": 10, - "icon": 8174, - "name": "Nice Tree", - "xp": 44 - }, - { - "level": 10, - "icon": 8108, - "name": "Wooden Bench", - "xp": 115 - }, - { - "level": 11, - "icon": 8217, - "name": "Firepit with Hook", - "xp": 60 - }, - { - "level": 12, - "icon": 8185, - "name": "Reeds", - "xp": 100 - }, - { - "level": 12, - "icon": 8182, - "name": "Fern (small plant)", - "xp": 100 - }, - { - "level": 12, - "icon": 8240, - "name": "Cider Barrel", - "xp": 91 - }, - { - "level": 12, - "icon": 8224, - "name": "Wooden Shelves 2", - "xp": 147 - }, - { - "level": 12, - "icon": 8115, - "name": "Wood Table", - "xp": 87 - }, - { - "level": 12, - "icon": 8191, - "name": "Huge Plant", - "xp": 100 - }, - { - "level": 12, - "icon": 8188, - "name": "Tall Plant", - "xp": 100 - }, - { - "level": 13, - "icon": 8317, - "name": "Rug", - "xp": 60 - }, - { - "level": 14, - "icon": 8311, - "name": "Rocking Chair", - "xp": 87 - }, - { - "level": 15, - "icon": 8171, - "name": "Imp Statue", - "xp": 150 - }, - { - "level": 15, - "icon": 8175, - "name": "Oak Tree", - "xp": 70 - }, - { - "level": 16, - "icon": 8102, - "name": "Oak Decoration", - "xp": 120 - }, - { - "level": 17, - "icon": 8218, - "name": "Firepit with Pot", - "xp": 80 - }, - { - "level": 18, - "icon": 8323, - "name": "Curtains", - "xp": 225 - }, - { - "level": 18, - "icon": 1905, - "name": "Asgarnian Ale", - "xp": 184 - }, - { - "level": 19, - "icon": 8237, - "name": "Cat Basket", - "xp": 58 - }, - { - "level": 19, - "icon": 8312, - "name": "Oak Chair", - "xp": 120 - }, - { - "level": 20, - "icon": 8031, - "name": "Wooden Bed", - "xp": 117 - }, - { - "level": 20, - "icon": 8038, - "name": "Shoe Box", - "xp": 58 - }, - { - "level": 21, - "icon": 8045, - "name": "Shaving Stand", - "xp": 30 - }, - { - "level": 22, - "icon": 8116, - "name": "Oak Table", - "xp": 240 - }, - { - "level": 22, - "icon": 8109, - "name": "Oak Bench", - "xp": 240 - }, - { - "level": 23, - "icon": 8225, - "name": "Wooden Shelves 3", - "xp": 147 - }, - { - "level": 24, - "icon": 8219, - "name": "Small Oven", - "xp": 80 - }, - { - "level": 25, - "icon": 8052, - "name": "Oak Clock", - "xp": 142 - }, - { - "level": 26, - "icon": 1909, - "name": "Greenman's Ale", - "xp": 184 - }, - { - "level": 26, - "icon": 8313, - "name": "Oak Armchair", - "xp": 180 - }, - { - "level": 26, - "icon": 8099, - "name": "Rope Bell-Pull", - "xp": 64 - }, - { - "level": 27, - "icon": 8231, - "name": "Pump and Tub", - "xp": 200 - }, - { - "level": 27, - "icon": 8039, - "name": "Oak Drawers", - "xp": 120 - }, - { - "level": 29, - "icon": 8320, - "name": "Oak Bookcase", - "xp": 180 - }, - { - "level": 29, - "icon": 8220, - "name": "Large Oven", - "xp": 100 - }, - { - "level": 29, - "icon": 8046, - "name": "Oak Shaving Stand", - "xp": 61 - }, - { - "level": 30, - "icon": 8176, - "name": "Willow Tree", - "xp": 100 - }, - { - "level": 30, - "icon": 8032, - "name": "Oak Bed", - "xp": 210 - }, - { - "level": 30, - "icon": 10976, - "name": "Long Bone", - "xp": 4500 - }, - { - "level": 30, - "icon": 10977, - "name": "Curved Bone", - "xp": 6750 - }, - { - "level": 31, - "icon": 8110, - "name": "Carved Oak Bench", - "xp": 240 - }, - { - "level": 31, - "icon": 8117, - "name": "Carved Oak Table", - "xp": 360 - }, - { - "level": 32, - "icon": 8118, - "name": "Oak Table", - "xp": 180 - }, - { - "level": 32, - "icon": 8023, - "name": "Boxing Ring", - "xp": 420 - }, - { - "level": 33, - "icon": 8234, - "name": "Oak Larder", - "xp": 480 - }, - { - "level": 33, - "icon": 8238, - "name": "Cushioned Basket", - "xp": 58 - }, - { - "level": 33, - "icon": 8326, - "name": "Stone Fireplace", - "xp": 40 - }, - { - "level": 34, - "icon": 8221, - "name": "Steel Range", - "xp": 120 - }, - { - "level": 34, - "icon": 8226, - "name": "Oak Shelves 1", - "xp": 240 - }, - { - "level": 34, - "icon": 8028, - "name": "Glove Rack", - "xp": 120 - }, - { - "level": 34, - "icon": 8033, - "name": "Large Oak Bed", - "xp": 330 - }, - { - "level": 35, - "icon": 8314, - "name": "Teak Armchair", - "xp": 180 - }, - { - "level": 36, - "icon": 1911, - "name": "Dragon Bitter", - "xp": 224 - }, - { - "level": 36, - "icon": 8103, - "name": "Teak Decoration", - "xp": 180 - }, - { - "level": 37, - "icon": 8100, - "name": "Bell-Pull", - "xp": 120 - }, - { - "level": 37, - "icon": 8047, - "name": "Oak Dresser", - "xp": 121 - }, - { - "level": 38, - "icon": 8112, - "name": "Teak Bench", - "xp": 360 - }, - { - "level": 38, - "icon": 8118, - "name": "Teak Table", - "xp": 360 - }, - { - "level": 39, - "icon": 8040, - "name": "Oak Wardrobe", - "xp": 180 - }, - { - "level": 40, - "icon": 8034, - "name": "Teak Bed", - "xp": 300 - }, - { - "level": 40, - "icon": 8321, - "name": "Mahogany Bookcase", - "xp": 420 - }, - { - "level": 40, - "icon": 8334, - "name": "Oak Lectern", - "xp": 60 - }, - { - "level": 40, - "icon": 8324, - "name": "Opulent Curtains", - "xp": 315 - }, - { - "level": 41, - "icon": 8024, - "name": "Fencing Ring", - "xp": 570 - }, - { - "level": 41, - "icon": 8341, - "name": "Globe", - "xp": 180 - }, - { - "level": 42, - "icon": 8222, - "name": "Fancy Range", - "xp": 160 - }, - { - "level": 42, - "icon": 8351, - "name": "Crystal Ball", - "xp": 280 - }, - { - "level": 43, - "icon": 8354, - "name": "Alchemical Chart", - "xp": 30 - }, - { - "level": 43, - "icon": 8235, - "name": "Teak larder", - "xp": 750 - }, - { - "level": 44, - "icon": 8348, - "name": "Wooden Telescope", - "xp": 121 - }, - { - "level": 44, - "icon": 8029, - "name": "Weapons Rack", - "xp": 180 - }, - { - "level": 44, - "icon": 8112, - "name": "Carved Teak Bench", - "xp": 360 - }, - { - "level": 45, - "icon": 8227, - "name": "Oak Shelves 2", - "xp": 240 - }, - { - "level": 45, - "icon": 8119, - "name": "Carved Teak Table", - "xp": 600 - }, - { - "level": 45, - "icon": 8035, - "name": "Large Teak Bed", - "xp": 480 - }, - { - "level": 45, - "icon": 8177, - "name": "Maple Tree", - "xp": 122 - }, - { - "level": 46, - "icon": 8048, - "name": "Teak Dresser", - "xp": 181 - }, - { - "level": 47, - "icon": 8232, - "name": "Sink", - "xp": 300 - }, - { - "level": 47, - "icon": 8335, - "name": "Eagle Lectern", - "xp": 120 - }, - { - "level": 47, - "icon": 8336, - "name": "Demon Lectern", - "xp": 120 - }, - { - "level": 47, - "icon": 21913, - "name": "Mounted Mythical Cape", - "xp": 370 - }, - { - "level": 48, - "icon": 5755, - "name": "Chef's Delight", - "xp": 224 - }, - { - "level": 50, - "icon": 8328, - "name": "Teak Portal", - "xp": 270 - }, - { - "level": 50, - "icon": 8315, - "name": "Mahogany Armchair", - "xp": 280 - }, - { - "level": 50, - "icon": 8342, - "name": "Ornamental Globe", - "xp": 270 - }, - { - "level": 50, - "icon": 8331, - "name": "Teleport Focus", - "xp": 40 - }, - { - "level": 51, - "icon": 8041, - "name": "Teak Drawers", - "xp": 180 - }, - { - "level": 51, - "icon": 8025, - "name": "Combat Ring", - "xp": 630 - }, - { - "level": 52, - "icon": 8118, - "name": "Teak Kitchen Table", - "xp": 270 - }, - { - "level": 52, - "icon": 8113, - "name": "Mahogany Bench", - "xp": 560 - }, - { - "level": 52, - "icon": 8120, - "name": "Mahogany Table", - "xp": 840 - }, - { - "level": 53, - "icon": 8036, - "name": "4-Poster Bed", - "xp": 450 - }, - { - "level": 54, - "icon": 8030, - "name": "Extra Weapons Rack", - "xp": 440 - }, - { - "level": 54, - "icon": 8352, - "name": "Elemental Sphere", - "xp": 580 - }, - { - "level": 55, - "icon": 8053, - "name": "Teak Clock", - "xp": 202 - }, - { - "level": 56, - "icon": 8104, - "name": "Gilded Decoration", - "xp": 1020 - }, - { - "level": 56, - "icon": 8049, - "name": "Fancy Teak Dresser", - "xp": 182 - }, - { - "level": 56, - "icon": 8228, - "name": "Teak Shelves 1", - "xp": 330 - }, - { - "level": 57, - "icon": 8337, - "name": "Teak Eagle Lectern", - "xp": 180 - }, - { - "level": 57, - "icon": 8338, - "name": "Teak Demon Lectern", - "xp": 180 - }, - { - "level": 59, - "icon": 8154, - "name": "Limestone attack stone", - "xp": 200 - }, - { - "level": 59, - "icon": 8343, - "name": "Lunar Globe", - "xp": 570 - }, - { - "level": 60, - "icon": 8037, - "name": "Gilded 4-Poster Bed", - "xp": 1330 - }, - { - "level": 60, - "icon": 8101, - "name": "Posh Bell-Pull", - "xp": 420 - }, - { - "level": 60, - "icon": 24479, - "name": "Spice Rack", - "xp": 374 - }, - { - "level": 60, - "icon": 8178, - "name": "Yew Tree", - "xp": 141 - }, - { - "level": 61, - "icon": 8114, - "name": "Gilded Bench", - "xp": 1760 - }, - { - "level": 63, - "icon": 8042, - "name": "Teak Wardrobe", - "xp": 270 - }, - { - "level": 63, - "icon": 8327, - "name": "Marble Fireplace", - "xp": 500 - }, - { - "level": 63, - "icon": 8355, - "name": "Astronomical Chart", - "xp": 45 - }, - { - "level": 64, - "icon": 8349, - "name": "Teak Telescope", - "xp": 181 - }, - { - "level": 64, - "icon": 8050, - "name": "Mahogany Dresser", - "xp": 281 - }, - { - "level": 65, - "icon": 8329, - "name": "Mahogany Portal", - "xp": 420 - }, - { - "level": 65, - "icon": 8332, - "name": "Greater Focus", - "xp": 500 - }, - { - "level": 65, - "icon": 8318, - "name": "Opulent Rug", - "xp": 360 - }, - { - "level": 66, - "icon": 20649, - "name": "Teak Garden Bench", - "xp": 540 - }, - { - "level": 66, - "icon": 8353, - "name": "Crystal of Power", - "xp": 890 - }, - { - "level": 67, - "icon": 8229, - "name": "Teak Shelves 2", - "xp": 930 - }, - { - "level": 67, - "icon": 8338, - "name": "Mahogany Demon Lectern", - "xp": 580 - }, - { - "level": 67, - "icon": 8338, - "name": "Mahogany Eagle Lectern", - "xp": 580 - }, - { - "level": 68, - "icon": 8344, - "name": "Celestial Globe", - "xp": 570 - }, - { - "level": 70, - "icon": 8172, - "name": "Dungeon Entrance", - "xp": 500 - }, - { - "level": 71, - "icon": 8026, - "name": "Ranging Pedestals", - "xp": 720 - }, - { - "level": 72, - "icon": 8121, - "name": "Opulent Table", - "xp": 3100 - }, - { - "level": 74, - "icon": 8122, - "name": "Oak Door", - "xp": 600 - }, - { - "level": 74, - "icon": 8051, - "name": "Gilded Dresser", - "xp": 582 - }, - { - "level": 75, - "icon": 8043, - "name": "Mahogany Wardrobe", - "xp": 420 - }, - { - "level": 75, - "icon": 8179, - "name": "Magic Tree", - "xp": 223 - }, - { - "level": 77, - "icon": 8341, - "name": "Armillary Globe", - "xp": 960 - }, - { - "level": 77, - "icon": 20650, - "name": "Gnome Bench", - "xp": 840 - }, - { - "level": 80, - "icon": 8330, - "name": "Marble Portal", - "xp": 1500 - }, - { - "level": 80, - "icon": 8333, - "name": "Scrying Pool", - "xp": 2000 - }, - { - "level": 81, - "icon": 8027, - "name": "Balance Beam", - "xp": 1000 - }, - { - "level": 83, - "icon": 8356, - "name": "Infernal Chart", - "xp": 60 - }, - { - "level": 84, - "icon": 8350, - "name": "Mahogany Telescope", - "xp": 281 - }, - { - "level": 85, - "icon": 8054, - "name": "Gilded Clock", - "xp": 602 - }, - { - "level": 86, - "icon": 8346, - "name": "Small Orrery", - "xp": 1320 - }, - { - "level": 87, - "icon": 8044, - "name": "Gilded Wardrobe", - "xp": 720 - }, - { - "level": 95, - "icon": 8347, - "name": "Large Orrery", - "xp": 1420 - } - ] -} diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_cooking.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_cooking.json deleted file mode 100644 index 8e86a25a65..0000000000 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_cooking.json +++ /dev/null @@ -1,742 +0,0 @@ -{ - "actions": [ - { - "level": 1, - "icon": 9436, - "name": "Sinew", - "xp": 3 - }, - { - "level": 1, - "icon": 315, - "name": "Shrimps", - "xp": 30 - }, - { - "level": 1, - "icon": 2140, - "name": "Cooked Chicken", - "xp": 30 - }, - { - "level": 1, - "icon": 2142, - "name": "Cooked Meat", - "xp": 30 - }, - { - "level": 1, - "icon": 3228, - "name": "Cooked Rabbit", - "xp": 30 - }, - { - "level": 1, - "icon": 319, - "name": "Anchovies", - "xp": 30 - }, - { - "level": 1, - "icon": 325, - "name": "Sardine", - "xp": 40 - }, - { - "level": 1, - "icon": 3146, - "name": "Poison Karambwan", - "xp": 80 - }, - { - "level": 1, - "icon": 1861, - "name": "Ugthanki Meat", - "xp": 40 - }, - { - "level": 1, - "icon": 2309, - "name": "Bread", - "xp": 40 - }, - { - "level": 5, - "icon": 347, - "name": "Herring", - "xp": 50 - }, - { - "level": 6, - "icon": 2084, - "name": "Fruit Blast", - "xp": 50 - }, - { - "level": 7, - "icon": 6701, - "name": "Baked Potato", - "xp": 15 - }, - { - "level": 7, - "icon": 25654, - "name": "Guppy", - "xp": 12 - }, - { - "level": 8, - "icon": 2048, - "name": "Pineapple Punch", - "xp": 70 - }, - { - "level": 9, - "icon": 7072, - "name": "Spicy Sauce", - "xp": 25 - }, - { - "level": 10, - "icon": 355, - "name": "Mackerel", - "xp": 60 - }, - { - "level": 10, - "icon": 2325, - "name": "Redberry Pie", - "xp": 78 - }, - { - "level": 10, - "icon": 2217, - "name": "Toad Crunchies", - "xp": 100 - }, - { - "level": 11, - "icon": 7062, - "name": "Chilli Con Carne", - "xp": 55 - }, - { - "level": 11, - "icon": 9980, - "name": "Roast Bird Meat", - "xp": 62.5 - }, - { - "level": 12, - "icon": 3369, - "name": "Thin Snail Meat", - "xp": 70 - }, - { - "level": 12, - "icon": 2213, - "name": "Spicy Crunchies", - "xp": 100 - }, - { - "level": 13, - "icon": 7078, - "name": "Scrambled Egg", - "xp": 50 - }, - { - "level": 14, - "icon": 5763, - "name": "Cider", - "xp": 182 - }, - { - "level": 14, - "icon": 2205, - "name": "Worm Crunchies", - "xp": 104 - }, - { - "level": 15, - "icon": 333, - "name": "Trout", - "xp": 70 - }, - { - "level": 16, - "icon": 6293, - "name": "Spider on stick", - "xp": 80 - }, - { - "level": 16, - "icon": 6295, - "name": "Spider on shaft", - "xp": 80 - }, - { - "level": 16, - "icon": 7223, - "name": "Roast Rabbit", - "xp": 72.5 - }, - { - "level": 16, - "icon": 2209, - "name": "Chocchip crunchies", - "xp": 100 - }, - { - "level": 17, - "icon": 3371, - "name": "Lean Snail Meat", - "xp": 80 - }, - { - "level": 18, - "icon": 339, - "name": "Cod", - "xp": 75 - }, - { - "level": 18, - "icon": 2054, - "name": "Wizard Blizzard", - "xp": 110 - }, - { - "level": 19, - "icon": 1913, - "name": "Dwarven Stout", - "xp": 215 - }, - { - "level": 20, - "icon": 2080, - "name": "Short Green Guy", - "xp": 120 - }, - { - "level": 20, - "icon": 2327, - "name": "Meat Pie", - "xp": 110 - }, - { - "level": 20, - "icon": 351, - "name": "Pike", - "xp": 80 - }, - { - "level": 20, - "icon": 712, - "name": "Cup of tea", - "xp": 52 - }, - { - "level": 20, - "icon": 25660, - "name": "Cavefish", - "xp": 23 - }, - { - "level": 21, - "icon": 9988, - "name": "Roast Beast Meat", - "xp": 82.5 - }, - { - "level": 21, - "icon": 7521, - "name": "Cooked Crab Meat", - "xp": 100 - }, - { - "level": 21, - "icon": 2130, - "name": "Pot of cream", - "xp": 18 - }, - { - "level": 22, - "icon": 3373, - "name": "Fat Snail Meat", - "xp": 95 - }, - { - "level": 23, - "icon": 7064, - "name": "Egg And Tomato", - "xp": 50 - }, - { - "level": 24, - "icon": 1905, - "name": "Asgarnian Ale", - "xp": 248 - }, - { - "level": 25, - "icon": 329, - "name": "Salmon", - "xp": 90 - }, - { - "level": 25, - "icon": 2003, - "name": "Stew", - "xp": 117 - }, - { - "level": 25, - "icon": 2277, - "name": "Fruit Batta", - "xp": 150 - }, - { - "level": 26, - "icon": 2255, - "name": "Toad Batta", - "xp": 152 - }, - { - "level": 27, - "icon": 2253, - "name": "Worm Batta", - "xp": 154 - }, - { - "level": 28, - "icon": 2281, - "name": "Vegetable Batta", - "xp": 156 - }, - { - "level": 28, - "icon": 5988, - "name": "Sweetcorn", - "xp": 104 - }, - { - "level": 28, - "icon": 3381, - "name": "Cooked Slimy Eel", - "xp": 95 - }, - { - "level": 29, - "icon": 7170, - "name": "Mud Pie", - "xp": 128 - }, - { - "level": 29, - "icon": 1909, - "name": "Greenman's ale", - "xp": 281 - }, - { - "level": 29, - "icon": 2259, - "name": "Cheese and Tomato Batta", - "xp": 158 - }, - { - "level": 30, - "icon": 361, - "name": "Tuna", - "xp": 100 - }, - { - "level": 30, - "icon": 2323, - "name": "Apple Pie", - "xp": 130 - }, - { - "level": 30, - "icon": 2191, - "name": "Worm Hole", - "xp": 170 - }, - { - "level": 30, - "icon": 3144, - "name": "Cooked Karambwan", - "xp": 190 - }, - { - "level": 30, - "icon": 2878, - "name": "Roasted Chompy", - "xp": 100 - }, - { - "level": 31, - "icon": 7530, - "name": "Fishcake", - "xp": 100 - }, - { - "level": 32, - "icon": 2092, - "name": "Drunk Dragon", - "xp": 160 - }, - { - "level": 33, - "icon": 2074, - "name": "Choc Saturday", - "xp": 170 - }, - { - "level": 33, - "icon": 25666, - "name": "Tetra", - "xp": 31 - }, - { - "level": 34, - "icon": 7178, - "name": "Garden Pie", - "xp": 138 - }, - { - "level": 34, - "icon": 1907, - "name": "Wizard's mind bomb", - "xp": 314 - }, - { - "level": 35, - "icon": 1993, - "name": "Jug Of Wine", - "xp": 200 - }, - { - "level": 35, - "icon": 2289, - "name": "Plain Pizza", - "xp": 143 - }, - { - "level": 35, - "icon": 10136, - "name": "Rainbow Fish", - "xp": 110 - }, - { - "level": 35, - "icon": 2195, - "name": "Veg ball", - "xp": 175 - }, - { - "level": 37, - "icon": 2064, - "name": "Blurberry Special", - "xp": 180 - }, - { - "level": 38, - "icon": 5003, - "name": "Cave Eel", - "xp": 115 - }, - { - "level": 38, - "icon": 6697, - "name": "Pat of butter", - "xp": 40.5 - }, - { - "level": 39, - "icon": 1911, - "name": "Dragon Bitter", - "xp": 347 - }, - { - "level": 39, - "icon": 6703, - "name": "Potato with butter", - "xp": 40 - }, - { - "level": 40, - "icon": 379, - "name": "Lobster", - "xp": 120 - }, - { - "level": 40, - "icon": 1891, - "name": "Cake", - "xp": 180 - }, - { - "level": 40, - "icon": 2187, - "name": "Tangled toad's legs", - "xp": 185 - }, - { - "level": 41, - "icon": 7054, - "name": "Chilli Potato", - "xp": 165.5 - }, - { - "level": 41, - "icon": 7568, - "name": "Cooked Jubbly", - "xp": 160 - }, - { - "level": 42, - "icon": 2185, - "name": "Chocolate Bomb", - "xp": 190 - }, - { - "level": 42, - "icon": 7084, - "name": "Fried Onions", - "xp": 60 - }, - { - "level": 43, - "icon": 365, - "name": "Bass", - "xp": 130 - }, - { - "level": 44, - "icon": 2955, - "name": "Moonlight Mead", - "xp": 380 - }, - { - "level": 45, - "icon": 373, - "name": "Swordfish", - "xp": 140 - }, - { - "level": 45, - "icon": 2293, - "name": "Meat Pizza", - "xp": 169 - }, - { - "level": 46, - "icon": 7082, - "name": "Fried Mushrooms", - "xp": 60 - }, - { - "level": 46, - "icon": 25672, - "name": "Catfish", - "xp": 43 - }, - { - "level": 47, - "icon": 7188, - "name": "Fish Pie", - "xp": 164 - }, - { - "level": 47, - "icon": 6705, - "name": "Potato with cheese", - "xp": 40 - }, - { - "level": 48, - "icon": 1985, - "name": "Cheese", - "xp": 64 - }, - { - "level": 49, - "icon": 5751, - "name": "Axeman's folly", - "xp": 413 - }, - { - "level": 50, - "icon": 2343, - "name": "Cooked Oomlie Wrap", - "xp": 30 - }, - { - "level": 50, - "icon": 1897, - "name": "Chocolate Cake", - "xp": 210 - }, - { - "level": 51, - "icon": 7056, - "name": "Egg Potato", - "xp": 195.5 - }, - { - "level": 52, - "icon": 19662, - "name": "Botanical Pie", - "xp": 180 - }, - { - "level": 53, - "icon": 2149, - "name": "Lava Eel", - "xp": 30 - }, - { - "level": 54, - "icon": 5755, - "name": "Chef's Delight", - "xp": 446 - }, - { - "level": 55, - "icon": 2297, - "name": "Anchovy Pizza", - "xp": 182 - }, - { - "level": 57, - "icon": 7066, - "name": "Mushroom & onion", - "xp": 120 - }, - { - "level": 58, - "icon": 1883, - "name": "Ugthanki Kebab (Fresh)", - "xp": 80 - }, - { - "level": 58, - "icon": 1865, - "name": "Pitta Bread", - "xp": 40 - }, - { - "level": 59, - "icon": 5759, - "name": "Slayer's respite", - "xp": 479 - }, - { - "level": 60, - "icon": 2011, - "name": "Curry", - "xp": 280 - }, - { - "level": 60, - "icon": 21690, - "name": "Mushroom Pie", - "xp": 200 - }, - { - "level": 62, - "icon": 7946, - "name": "Monkfish", - "xp": 150 - }, - { - "level": 64, - "icon": 7058, - "name": "Mushroom Potato", - "xp": 270.5 - }, - { - "level": 65, - "icon": 2301, - "name": "Pineapple Pizza", - "xp": 188 - }, - { - "level": 65, - "icon": 245, - "name": "Wine of Zamorak", - "xp": 200 - }, - { - "level": 67, - "icon": 7068, - "name": "Tuna And Corn", - "xp": 204 - }, - { - "level": 68, - "icon": 7060, - "name": "Tuna Potato", - "xp": 309.5 - }, - { - "level": 70, - "icon": 7198, - "name": "Admiral Pie", - "xp": 210 - }, - { - "level": 72, - "icon": 13339, - "name": "Sacred Eel", - "xp": 109 - }, - { - "level": 73, - "icon": 22795, - "name": "Dragonfruit Pie", - "xp": 220 - }, - { - "level": 80, - "icon": 385, - "name": "Shark", - "xp": 210 - }, - { - "level": 82, - "icon": 397, - "name": "Sea Turtle", - "xp": 211.3 - }, - { - "level": 84, - "icon": 13441, - "name": "Anglerfish", - "xp": 230 - }, - { - "level": 85, - "icon": 7208, - "name": "Wild Pie", - "xp": 240 - }, - { - "level": 90, - "icon": 11936, - "name": "Dark Crab", - "xp": 215 - }, - { - "level": 91, - "icon": 391, - "name": "Manta Ray", - "xp": 216.3 - }, - { - "level": 95, - "icon": 7218, - "name": "Summer Pie", - "xp": 260 - } - ] -} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_crafting.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_crafting.json deleted file mode 100644 index d8e6c6e9d2..0000000000 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_crafting.json +++ /dev/null @@ -1,809 +0,0 @@ -{ - "actions": [ - { - "level": 1, - "icon": 1759, - "name": "Ball Of Wool", - "xp": 2.5 - }, - { - "level": 1, - "icon": 1787, - "name": "Unfired pot", - "xp": 6.3 - }, - { - "level": 1, - "icon": 1931, - "name": "Pot", - "xp": 6.3 - }, - { - "level": 1, - "icon": 1059, - "name": "Leather Gloves", - "xp": 13.8 - }, - { - "level": 1, - "icon": 1609, - "name": "Opal", - "xp": 15 - }, - { - "level": 1, - "icon": 21081, - "name": "Opal Ring", - "xp": 10 - }, - { - "level": 1, - "icon": 1775, - "name": "Molten Glass", - "xp": 20 - }, - { - "level": 1, - "icon": 1919, - "name": "Beer Glass", - "xp": 17.5 - }, - { - "level": 4, - "icon": 4527, - "name": "Empty Candle Lantern", - "xp": 19 - }, - { - "level": 5, - "icon": 1635, - "name": "Gold Ring", - "xp": 15 - }, - { - "level": 5, - "icon": 21512, - "name": "Bird House", - "xp": 15 - }, - { - "level": 6, - "icon": 1654, - "name": "Gold Necklace", - "xp": 20 - }, - { - "level": 7, - "icon": 1061, - "name": "Leather Boots", - "xp": 16.3 - }, - { - "level": 7, - "icon": 1789, - "name": "Unfired pie dish", - "xp": 15 - }, - { - "level": 7, - "icon": 2313, - "name": "Pie dish", - "xp": 10 - }, - { - "level": 7, - "icon": 11068, - "name": "Gold Bracelet", - "xp": 25 - }, - { - "level": 8, - "icon": 1791, - "name": "Unfired bowl", - "xp": 18 - }, - { - "level": 8, - "icon": 1923, - "name": "Bowl", - "xp": 15 - }, - { - "level": 8, - "icon": 1673, - "name": "Gold Amulet (U)", - "xp": 30 - }, - { - "level": 9, - "icon": 1167, - "name": "Cowl", - "xp": 18.5 - }, - { - "level": 10, - "icon": 9438, - "name": "Crossbow String", - "xp": 15 - }, - { - "level": 10, - "icon": 1777, - "name": "Bow String", - "xp": 15 - }, - { - "level": 11, - "icon": 1063, - "name": "Leather Vambraces", - "xp": 22 - }, - { - "level": 12, - "icon": 4525, - "name": "Empty Oil Lamp", - "xp": 25 - }, - { - "level": 13, - "icon": 1611, - "name": "Jade", - "xp": 20 - }, - { - "level": 13, - "icon": 21084, - "name": "Jade Ring", - "xp": 32 - }, - { - "level": 14, - "icon": 1129, - "name": "Leather Body", - "xp": 25 - }, - { - "level": 15, - "icon": 21515, - "name": "Oak Bird House", - "xp": 20 - }, - { - "level": 16, - "icon": 1613, - "name": "Red Topaz", - "xp": 25 - }, - { - "level": 16, - "icon": 21087, - "name": "Topaz Ring", - "xp": 35 - }, - { - "level": 16, - "icon": 1718, - "name": "Holy Symbol", - "xp": 50 - }, - { - "level": 16, - "icon": 21090, - "name": "Opal Necklace", - "xp": 35 - }, - - { - "level": 17, - "icon": 1724, - "name": "Unholy Symbol", - "xp": 50 - }, - { - "level": 18, - "icon": 1095, - "name": "Leather Chaps", - "xp": 27 - }, - { - "level": 19, - "icon": 5352, - "name": "Unfired plant pot", - "xp": 20 - }, - { - "level": 19, - "icon": 5350, - "name": "Empty plant pot", - "xp": 17.5 - }, - { - "level": 19, - "icon": 6038, - "name": "Magic String", - "xp": 30 - }, - { - "level": 20, - "icon": 1637, - "name": "Sapphire Ring", - "xp": 40 - }, - { - "level": 20, - "icon": 1607, - "name": "Sapphire", - "xp": 50 - }, - { - "level": 21, - "icon": 5418, - "name": "Empty Sack", - "xp": 38 - }, - { - "level": 22, - "icon": 1656, - "name": "Sapphire Necklace", - "xp": 55 - }, - { - "level": 22, - "icon": 21117, - "name": "Opal Bracelet", - "xp": 45 - }, - { - "level": 23, - "icon": 11071, - "name": "Sapphire Bracelet", - "xp": 60 - }, - { - "level": 23, - "icon": 5525, - "name": "Tiara", - "xp": 52.5 - }, - { - "level": 24, - "icon": 1675, - "name": "Sapphire Amulet (U)", - "xp": 65 - }, - { - "level": 25, - "icon": 4438, - "name": "Unfired pot lid", - "xp": 20 - }, - { - "level": 25, - "icon": 4440, - "name": "Pot lid", - "xp": 20 - }, - { - "level": 25, - "icon": 21093, - "name": "Jade Necklace", - "xp": 54 - }, - { - "level": 25, - "icon": 21518, - "name": "Willow Bird House", - "xp": 25 - }, - { - "level": 26, - "icon": 6209, - "name": "Drift Net", - "xp": 55 - }, - { - "level": 27, - "icon": 1605, - "name": "Emerald", - "xp": 67.5 - }, - { - "level": 27, - "icon": 1639, - "name": "Emerald Ring", - "xp": 55 - }, - { - "level": 27, - "icon": 21099, - "name": "Opal Amulet (U)", - "xp": 55 - }, - { - "level": 28, - "icon": 1131, - "name": "Hardleather Body", - "xp": 35 - }, - { - "level": 29, - "icon": 1658, - "name": "Emerald Necklace", - "xp": 60 - }, - { - "level": 29, - "icon": 21120, - "name": "Jade Bracelet", - "xp": 60 - }, - { - "level": 30, - "icon": 11076, - "name": "Emerald Bracelet", - "xp": 65 - }, - { - "level": 30, - "icon": 954, - "name": "Rope", - "xp": 25 - }, - { - "level": 31, - "icon": 1677, - "name": "Emerald Amulet (U)", - "xp": 70 - }, - { - "level": 32, - "icon": 10077, - "name": "Spiky Vambraces", - "xp": 6 - }, - { - "level": 32, - "icon": 21096, - "name": "Topaz Necklace", - "xp": 70 - }, - { - "level": 33, - "icon": 229, - "name": "Vial", - "xp": 35 - }, - { - "level": 34, - "icon": 1603, - "name": "Ruby", - "xp": 85 - }, - { - "level": 34, - "icon": 1641, - "name": "Ruby Ring", - "xp": 70 - }, - { - "level": 34, - "icon": 21102, - "name": "Jade Amulet (U)", - "xp": 70 - }, - { - "level": 35, - "icon": 6235, - "name": "Broodoo shield", - "xp": 100 - }, - { - "level": 35, - "icon": 21521, - "name": "Teak Bird House", - "xp": 30 - }, - { - "level": 36, - "icon": 5376, - "name": "Basket", - "xp": 56 - }, - { - "level": 38, - "icon": 1169, - "name": "Coif", - "xp": 37 - }, - { - "level": 38, - "icon": 21123, - "name": "Topaz Bracelet", - "xp": 75 - }, - { - "level": 40, - "icon": 1660, - "name": "Ruby Necklace", - "xp": 75 - }, - { - "level": 41, - "icon": 22269, - "name": "Hard leather shield", - "xp": 70 - }, - { - "level": 42, - "icon": 11085, - "name": "Ruby Bracelet", - "xp": 80 - }, - { - "level": 42, - "icon": 6668, - "name": "Fishbowl", - "xp": 42.5 - }, - { - "level": 43, - "icon": 1601, - "name": "Diamond", - "xp": 107.5 - }, - { - "level": 43, - "icon": 1643, - "name": "Diamond Ring", - "xp": 85 - }, - { - "level": 45, - "icon": 21105, - "name": "Topaz Amulet (U)", - "xp": 80 - }, - { - "level": 45, - "icon": 6328, - "name": "Snakeskin boots", - "xp": 30 - }, - { - "level": 45, - "icon": 22192, - "name": "Maple Bird House", - "xp": 35 - }, - { - "level": 46, - "icon": 567, - "name": "Unpowered Orb", - "xp": 52.5 - }, - { - "level": 47, - "icon": 6330, - "name": "Snakeskin vambraces", - "xp": 35 - }, - { - "level": 48, - "icon": 6326, - "name": "Snakeskin bandana", - "xp": 45 - }, - { - "level": 49, - "icon": 4542, - "name": "Lantern Lens", - "xp": 55 - }, - { - "level": 50, - "icon": 1679, - "name": "Ruby Amulet (U)", - "xp": 85 - }, - { - "level": 50, - "icon": 22195, - "name": "Mahogany Bird House", - "xp": 40 - }, - { - "level": 51, - "icon": 6324, - "name": "Snakeskin chaps", - "xp": 50 - }, - { - "level": 53, - "icon": 6322, - "name": "Snakeskin body", - "xp": 55 - }, - { - "level": 54, - "icon": 1395, - "name": "Water Battlestaff", - "xp": 100 - }, - { - "level": 55, - "icon": 1645, - "name": "Dragonstone Ring", - "xp": 100 - }, - { - "level": 55, - "icon": 1615, - "name": "Dragonstone", - "xp": 137.5 - }, - { - "level": 56, - "icon": 1662, - "name": "Diamond Necklace", - "xp": 90 - }, - { - "level": 56, - "icon": 22272, - "name": "Snakeskin shield", - "xp": 100 - }, - { - "level": 57, - "icon": 1065, - "name": "Green D'hide Vamb", - "xp": 62 - }, - { - "level": 58, - "icon": 11092, - "name": "Diamond Bracelet", - "xp": 95 - }, - { - "level": 58, - "icon": 1399, - "name": "Earth Battlestaff", - "xp": 112.5 - }, - { - "level": 60, - "icon": 1099, - "name": "Green D'hide Chaps", - "xp": 124 - }, - { - "level": 60, - "icon": 22198, - "name": "Yew Bird House", - "xp": 45 - }, - { - "level": 62, - "icon": 1393, - "name": "Fire Battlestaff", - "xp": 125 - }, - { - "level": 62, - "icon": 22275, - "name": "Green D'hide Shield", - "xp": 124 - }, - { - "level": 63, - "icon": 1135, - "name": "Green D'hide Body", - "xp": 186 - }, - { - "level": 66, - "icon": 1397, - "name": "Air Battlestaff", - "xp": 137.5 - }, - { - "level": 66, - "icon": 2487, - "name": "Blue D'hide Vamb", - "xp": 70 - }, - { - "level": 67, - "icon": 6575, - "name": "Onyx Ring", - "xp": 115 - }, - { - "level": 67, - "icon": 6573, - "name": "Onyx", - "xp": 167.5 - }, - { - "level": 68, - "icon": 2493, - "name": "Blue D'hide Chaps", - "xp": 140 - }, - { - "level": 69, - "icon": 22278, - "name": "Blue D'hide Shield", - "xp": 140 - }, - { - "level": 70, - "icon": 1681, - "name": "Diamond Amulet (U)", - "xp": 100 - }, - { - "level": 71, - "icon": 2499, - "name": "Blue D'hide Body", - "xp": 210 - }, - { - "level": 72, - "icon": 1664, - "name": "Dragonstone Necklace", - "xp": 105 - }, - { - "level": 73, - "icon": 2489, - "name": "Red D'hide Vamb", - "xp": 78 - }, - { - "level": 74, - "icon": 11115, - "name": "Dragonstone Bracelet", - "xp": 110 - }, - { - "level": 75, - "icon": 2495, - "name": "Red D'hide Chaps", - "xp": 156 - }, - { - "level": 75, - "icon": 22201, - "name": "Magic Bird House", - "xp": 50 - }, - { - "level": 76, - "icon": 22281, - "name": "Red D'hide Shield", - "xp": 156 - }, - { - "level": 77, - "icon": 2501, - "name": "Red D'hide Body", - "xp": 234 - }, - { - "level": 79, - "icon": 2491, - "name": "Black D'hide Vamb", - "xp": 86 - }, - { - "level": 80, - "icon": 1683, - "name": "Dragonstone Amulet (U)", - "xp": 150 - }, - { - "level": 82, - "icon": 2497, - "name": "Black D'hide Chaps", - "xp": 172 - }, - { - "level": 82, - "icon": 6577, - "name": "Onyx Necklace", - "xp": 120 - }, - { - "level": 83, - "icon": 21338, - "name": "Amethyst Bolt Tips", - "xp": 4 - }, - { - "level": 83, - "icon": 22284, - "name": "Black D'hide Shield", - "xp": 172 - }, - { - "level": 84, - "icon": 2503, - "name": "Black D'hide Body", - "xp": 258 - }, - { - "level": 84, - "icon": 11130, - "name": "Onyx Bracelet", - "xp": 125 - }, - { - "level": 85, - "icon": 21350, - "name": "Amethyst Arrowtips", - "xp": 4 - }, - { - "level": 87, - "icon": 21352, - "name": "Amethyst Javelin Heads", - "xp": 12 - }, - { - "level": 87, - "icon": 10973, - "name": "Light Orb", - "xp": 70 - }, - { - "level": 89, - "icon": 25853, - "name": "Amethyst Dart Tip", - "xp": 7.5 - }, - { - "level": 89, - "icon": 19538, - "name": "Zenyte Ring", - "xp": 150 - }, - { - "level": 89, - "icon": 19493, - "name": "Zenyte", - "xp": 200 - }, - { - "level": 90, - "icon": 6579, - "name": "Onyx Amulet (U)", - "xp": 165 - }, - { - "level": 90, - "icon": 22204, - "name": "Redwood Bird House", - "xp": 55 - }, - { - "level": 92, - "icon": 19535, - "name": "Zenyte Necklace", - "xp": 165 - }, - { - "level": 95, - "icon": 19492, - "name": "Zenyte Bracelet", - "xp": 180 - }, - { - "level": 98, - "icon": 19501, - "name": "Zenyte Amulet (U)", - "xp": 200 - } - ] -} diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_farming.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_farming.json deleted file mode 100644 index 70ac3b3444..0000000000 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_farming.json +++ /dev/null @@ -1,388 +0,0 @@ -{ - "bonuses": [ - { - "name": "Farmer's Outfit (+2.5%)", - "value": 0.025 - } - ], - "actions": [ - { - "level": 1, - "icon": 8180, - "name": "Plant", - "xp": 31 - }, - { - "level": 1, - "icon": 8186, - "name": "Fern (big plant)", - "xp": 31 - }, - { - "level": 1, - "icon": 8189, - "name": "Short Plant", - "xp": 31 - }, - { - "level": 1, - "icon": 8183, - "name": "Dock Leaf", - "xp": 31 - }, - { - "level": 1, - "icon": 8181, - "name": "Small Fern", - "xp": 70 - }, - { - "level": 1, - "icon": 8184, - "name": "Thistle", - "xp": 70 - }, - { - "level": 1, - "icon": 8187, - "name": "Bush", - "xp": 70 - }, - { - "level": 1, - "icon": 8190, - "name": "Large Leaf Bush", - "xp": 70 - }, - { - "level": 1, - "icon": 8191, - "name": "Huge Plant", - "xp": 100 - }, - { - "level": 1, - "icon": 8188, - "name": "Tall Plant", - "xp": 100 - }, - { - "level": 1, - "icon": 8185, - "name": "Reeds", - "xp": 100 - }, - { - "level": 1, - "icon": 8182, - "name": "Fern (small plant)", - "xp": 100 - }, - { - "level": 1, - "icon": 10847, - "name": "Winter Sq'irk", - "xp": 30 - }, - { - "level": 1, - "icon": 10844, - "name": "Spring Sq'irk", - "xp": 40 - }, - { - "level": 1, - "icon": 10846, - "name": "Autumn Sq'irk", - "xp": 50 - }, - { - "level": 1, - "icon": 10845, - "name": "Summer Sq'irk", - "xp": 60 - }, - { - "level": 1, - "icon": 1942, - "name": "Potatoes", - "xp": 8 - }, - { - "level": 5, - "icon": 1957, - "name": "Onions", - "xp": 10 - }, - { - "level": 7, - "icon": 1965, - "name": "Cabbages", - "xp": 10 - }, - { - "level": 9, - "icon": 249, - "name": "Guam Leaf", - "xp": 11 - }, - { - "level": 12, - "icon": 1982, - "name": "Tomatoes", - "xp": 12.5 - }, - { - "level": 14, - "icon": 251, - "name": "Marrentill", - "xp": 13.5 - }, - { - "level": 15, - "icon": 1521, - "name": "Oak Tree", - "xp": 481.3 - }, - { - "level": 19, - "icon": 253, - "name": "Tarromin", - "xp": 16 - }, - { - "level": 20, - "icon": 5986, - "name": "Sweetcorn", - "xp": 17 - }, - { - "level": 23, - "icon": 21504, - "name": "Giant seaweed", - "xp": 21 - }, - { - "level": 26, - "icon": 255, - "name": "Harralander", - "xp": 21.5 - }, - { - "level": 26, - "icon": 225, - "name": "Limpwurt Plant", - "xp": 40 - }, - { - "level": 27, - "icon": 1955, - "name": "Apple Tree", - "xp": 1221.5 - }, - { - "level": 29, - "icon": 3261, - "name": "Goutweed", - "xp": 105 - }, - { - "level": 30, - "icon": 1519, - "name": "Willow Tree", - "xp": 1481.5 - }, - { - "level": 31, - "icon": 5504, - "name": "Strawberries", - "xp": 26 - }, - { - "level": 32, - "icon": 257, - "name": "Ranarr Weed", - "xp": 27 - }, - { - "level": 33, - "icon": 1963, - "name": "Banana Tree", - "xp": 1778.5 - }, - { - "level": 35, - "icon": 6333, - "name": "Teak Tree", - "xp": 7315 - }, - { - "level": 38, - "icon": 2998, - "name": "Toadflax", - "xp": 34 - }, - { - "level": 39, - "icon": 2108, - "name": "Orange Tree", - "xp": 2505.7 - }, - { - "level": 42, - "icon": 5970, - "name": "Curry Tree", - "xp": 2946.9 - }, - { - "level": 44, - "icon": 259, - "name": "Irit Leaf", - "xp": 43 - }, - { - "level": 45, - "icon": 1517, - "name": "Maple Tree", - "xp": 3448.4 - }, - { - "level": 47, - "icon": 5982, - "name": "Watermelons", - "xp": 49 - }, - { - "level": 50, - "icon": 261, - "name": "Avantoe", - "xp": 54.5 - }, - { - "level": 51, - "icon": 2114, - "name": "Pineapple Plant", - "xp": 4662.7 - }, - { - "level": 55, - "icon": 6332, - "name": "Mahogany Tree", - "xp": 15783 - }, - { - "level": 56, - "icon": 263, - "name": "Kwuarm", - "xp": 69 - }, - { - "level": 57, - "icon": 5972, - "name": "Papaya Tree", - "xp": 6218.4 - }, - { - "level": 58, - "icon": 22932, - "name": "White lily", - "xp": 292 - }, - { - "level": 60, - "icon": 1515, - "name": "Yew Tree", - "xp": 7150.9 - }, - { - "level": 61, - "icon": 231, - "name": "Snape grass", - "xp": 82 - }, - { - "level": 62, - "icon": 3000, - "name": "Snapdragon", - "xp": 87.5 - }, - { - "level": 65, - "icon": 23044, - "name": "Hespori", - "xp": 12662 - }, - { - "level": 67, - "icon": 265, - "name": "Cadantine", - "xp": 106.5 - }, - { - "level": 68, - "icon": 5974, - "name": "Palm Tree", - "xp": 10260.6 - }, - { - "level": 72, - "icon": 5980, - "name": "Calquat Tree", - "xp": 12225.5 - }, - { - "level": 73, - "icon": 2481, - "name": "Lantadyme", - "xp": 134.5 - }, - { - "level": 74, - "icon": 23962, - "name": "Crystal Tree", - "xp": 13366 - }, - { - "level": 75, - "icon": 1513, - "name": "Magic Tree", - "xp": 13913.8 - }, - { - "level": 79, - "icon": 267, - "name": "Dwarf Weed", - "xp": 170.5 - }, - { - "level": 81, - "icon": 22929, - "name": "Dragonfruit Tree", - "xp": 17895 - }, - { - "level": 83, - "icon": 6063, - "name": "Spirit Tree", - "xp": 19501.3 - }, - { - "level": 85, - "icon": 22935, - "name": "Celastrus Tree", - "xp": 14334 - }, - { - "level": 85, - "icon": 269, - "name": "Torstol", - "xp": 199.5 - }, - { - "level": 90, - "icon": 19669, - "name": "Redwood Tree", - "xp": 22680 - } - ] -} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_firemaking.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_firemaking.json deleted file mode 100644 index 37fe236443..0000000000 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_firemaking.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "bonuses": [ - { - "name": "Pyromancer Outfit (+2.5%)", - "value": 0.025 - } - ], - "actions": [ - { - "level": 1, - "icon": 1511, - "name": "Logs", - "xp": 40 - }, - { - "level": 1, - "icon": 2862, - "name": "Achey Tree Logs", - "xp": 40 - }, - { - "level": 15, - "icon": 1521, - "name": "Oak Logs", - "xp": 60 - }, - { - "level": 30, - "icon": 1519, - "name": "Willow Logs", - "xp": 90 - }, - { - "level": 35, - "icon": 6333, - "name": "Teak Logs", - "xp": 105 - }, - { - "level": 42, - "icon": 10810, - "name": "Arctic Pine Logs", - "xp": 125 - }, - { - "level": 45, - "icon": 1517, - "name": "Maple Logs", - "xp": 135 - }, - { - "level": 50, - "icon": 6332, - "name": "Mahogany Logs", - "xp": 157.5 - }, - { - "level": 60, - "icon": 1515, - "name": "Yew Logs", - "xp": 202.5 - }, - { - "level": 62, - "icon": 24691, - "name": "Blisterwood Logs", - "xp": 96 - }, - { - "level": 75, - "icon": 1513, - "name": "Magic Logs", - "xp": 303.8 - }, - { - "level": 90, - "icon": 19669, - "name": "Redwood Logs", - "xp": 350 - } - ] -} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fishing.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fishing.json deleted file mode 100644 index 730be09d00..0000000000 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fishing.json +++ /dev/null @@ -1,214 +0,0 @@ -{ - "bonuses": [ - { - "name": "Anglers Outfit (+2.5%)", - "value": 0.025 - } - ], - "actions": [ - { - "level": 1, - "icon": 317, - "name": "Raw Shrimps", - "xp": 10 - }, - { - "level": 5, - "icon": 327, - "name": "Raw Sardine", - "xp": 20 - }, - { - "level": 5, - "icon": 3150, - "name": "Raw Karambwanji", - "xp": 5 - }, - { - "level": 7, - "icon": 25652, - "name": "Raw Guppy", - "xp": 8 - }, - { - "level": 10, - "icon": 345, - "name": "Raw Herring", - "xp": 30 - }, - { - "level": 15, - "icon": 321, - "name": "Raw Anchovies", - "xp": 40 - }, - { - "level": 16, - "icon": 353, - "name": "Raw Mackerel", - "xp": 20 - }, - { - "level": 20, - "icon": 335, - "name": "Raw Trout", - "xp": 50 - }, - { - "level": 20, - "icon": 25658, - "name": "Raw Cavefish", - "xp": 16 - }, - { - "level": 23, - "icon": 341, - "name": "Raw Cod", - "xp": 45 - }, - { - "level": 25, - "icon": 349, - "name": "Raw Pike", - "xp": 60 - }, - { - "level": 28, - "icon": 3379, - "name": "Raw Slimy Eel", - "xp": 65 - }, - { - "level": 30, - "icon": 331, - "name": "Raw Salmon", - "xp": 70 - }, - { - "level": 33, - "icon": 25664, - "name": "Raw Tetra", - "xp": 24 - }, - { - "level": 35, - "icon": 359, - "name": "Raw Tuna", - "xp": 80 - }, - { - "level": 38, - "icon": 10138, - "name": "Raw Rainbow Fish", - "xp": 80 - }, - { - "level": 38, - "icon": 5001, - "name": "Raw Cave Eel", - "xp": 80 - }, - { - "level": 40, - "icon": 377, - "name": "Raw Lobster", - "xp": 90 - }, - { - "level": 46, - "icon": 363, - "name": "Raw Bass", - "xp": 100 - }, - { - "level": 46, - "icon": 25670, - "name": "Raw Catfish", - "xp": 33 - }, - { - "level": 48, - "icon": 11328, - "name": "Leaping Trout", - "xp": 50 - }, - { - "level": 50, - "icon": 371, - "name": "Raw Swordfish", - "xp": 100 - }, - { - "level": 58, - "icon": 11330, - "name": "Leaping Salmon", - "xp": 70 - }, - { - "level": 62, - "icon": 7944, - "name": "Raw Monkfish", - "xp": 120 - }, - { - "level": 65, - "icon": 3142, - "name": "Raw Karambwan", - "xp": 50 - }, - { - "level": 70, - "icon": 11332, - "name": "Leaping Sturgeon", - "xp": 80 - }, - { - "level": 76, - "icon": 383, - "name": "Raw Shark", - "xp": 110 - }, - { - "level": 79, - "icon": 395, - "name": "Raw Sea Turtle", - "xp": 38 - }, - { - "level": 80, - "icon": 21293, - "name": "Infernal Eel", - "xp": 95 - }, - { - "level": 81, - "icon": 389, - "name": "Raw Manta Ray", - "xp": 46 - }, - { - "level": 82, - "icon": 13439, - "name": "Raw Anglerfish", - "xp": 120 - }, - { - "level": 82, - "icon": 21356, - "name": "Minnow", - "xp": 26.5 - }, - { - "level": 85, - "icon": 11934, - "name": "Raw Dark Crab", - "xp": 130 - }, - { - "level": 87, - "icon": 13339, - "name": "Sacred Eel", - "xp": 105 - } - ] -} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json deleted file mode 100644 index 53e3042478..0000000000 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json +++ /dev/null @@ -1,592 +0,0 @@ -{ - "actions": [ - { - "level": 1, - "icon": 52, - "name": "Arrow Shaft", - "xp": 0.33 - }, - { - "level": 1, - "icon": 53, - "name": "Headless Arrow", - "xp": 1 - }, - { - "level": 1, - "icon": 882, - "name": "Bronze Arrow", - "xp": 1.3 - }, - { - "level": 5, - "icon": 2866, - "name": "Ogre Arrow", - "xp": 1 - }, - { - "level": 5, - "icon": 50, - "name": "Shortbow (U)", - "xp": 5 - }, - { - "level": 5, - "icon": 841, - "name": "Shortbow", - "xp": 5 - }, - { - "level": 9, - "icon": 877, - "name": "Bronze Bolts", - "xp": 0.5 - }, - { - "level": 9, - "icon": 9440, - "name": "Wooden Stock", - "xp": 6 - }, - { - "level": 9, - "icon": 9454, - "name": "Bronze Crossbow (U)", - "xp": 12 - }, - { - "level": 9, - "icon": 9174, - "name": "Bronze Crossbow", - "xp": 6 - }, - { - "level": 10, - "icon": 806, - "name": "Bronze Dart", - "xp": 1.8 - }, - { - "level": 10, - "icon": 839, - "name": "Longbow", - "xp": 10 - }, - { - "level": 10, - "icon": 48, - "name": "Longbow (U)", - "xp": 10 - }, - { - "level": 11, - "icon": 879, - "name": "Opal Bolts", - "xp": 1.6 - }, - { - "level": 15, - "icon": 884, - "name": "Iron Arrow", - "xp": 2.5 - }, - { - "level": 20, - "icon": 54, - "name": "Oak Shortbow (U)", - "xp": 16.5 - }, - { - "level": 20, - "icon": 843, - "name": "Oak Shortbow", - "xp": 16.5 - }, - { - "level": 22, - "icon": 807, - "name": "Iron Dart", - "xp": 3.8 - }, - { - "level": 24, - "icon": 9442, - "name": "Oak Stock", - "xp": 16 - }, - { - "level": 24, - "icon": 9456, - "name": "Blurite Crossbow (U)", - "xp": 32 - }, - { - "level": 24, - "icon": 9176, - "name": "Blurite Crossbow", - "xp": 16 - }, - { - "level": 25, - "icon": 56, - "name": "Oak Longbow (U)", - "xp": 25 - }, - { - "level": 25, - "icon": 845, - "name": "Oak Longbow", - "xp": 25 - }, - { - "level": 27, - "icon": 22251, - "name": "Oak Shield", - "xp": 50 - }, - { - "level": 30, - "icon": 886, - "name": "Steel Arrow", - "xp": 5 - }, - { - "level": 32, - "icon": 10158, - "name": "Kebbit Bolts", - "xp": 1 - }, - { - "level": 35, - "icon": 60, - "name": "Willow Shortbow (U)", - "xp": 33.3 - }, - { - "level": 35, - "icon": 849, - "name": "Willow Shortbow", - "xp": 33.3 - }, - { - "level": 37, - "icon": 808, - "name": "Steel Dart", - "xp": 7.5 - }, - { - "level": 39, - "icon": 9140, - "name": "Iron Bolts", - "xp": 1.5 - }, - { - "level": 39, - "icon": 9444, - "name": "Willow Stock", - "xp": 22 - }, - { - "level": 39, - "icon": 9457, - "name": "Iron Crossbow (U)", - "xp": 44 - }, - { - "level": 39, - "icon": 9177, - "name": "Iron Crossbow", - "xp": 22 - }, - { - "level": 40, - "icon": 58, - "name": "Willow Longbow (U)", - "xp": 41.5 - }, - { - "level": 40, - "icon": 847, - "name": "Willow Longbow", - "xp": 41.5 - }, - { - "level": 40, - "icon": 1391, - "name": "Battlestaff", - "xp": 80 - }, - { - "level": 41, - "icon": 880, - "name": "Pearl Bolts", - "xp": 3.2 - }, - { - "level": 42, - "icon": 22254, - "name": "Willow Shield", - "xp": 83 - }, - { - "level": 42, - "icon": 10159, - "name": "Long Kebbit Bolts", - "xp": 1.3 - }, - { - "level": 43, - "icon": 9145, - "name": "Silver Bolts", - "xp": 2.5 - }, - { - "level": 45, - "icon": 888, - "name": "Mithril Arrow", - "xp": 7.5 - }, - { - "level": 46, - "icon": 9141, - "name": "Steel Bolts", - "xp": 3.5 - }, - { - "level": 46, - "icon": 9446, - "name": "Teak Stock", - "xp": 27 - }, - { - "level": 46, - "icon": 9459, - "name": "Steel Crossbow (U)", - "xp": 54 - }, - { - "level": 46, - "icon": 9179, - "name": "Steel Crossbow", - "xp": 27 - }, - { - "level": 50, - "icon": 64, - "name": "Maple Shortbow (U)", - "xp": 50 - }, - { - "level": 50, - "icon": 853, - "name": "Maple Shortbow", - "xp": 50 - }, - { - "level": 51, - "icon": 881, - "name": "Barbed Bolts", - "xp": 9.5 - }, - { - "level": 52, - "icon": 809, - "name": "Mithril Dart", - "xp": 11.2 - }, - { - "level": 52, - "icon": 4150, - "name": "Broad Arrows", - "xp": 10 - }, - { - "level": 53, - "icon": 12926, - "name": "Toxic Blowpipe", - "xp": 120 - }, - { - "level": 54, - "icon": 9181, - "name": "Mith Crossbow", - "xp": 32 - }, - { - "level": 54, - "icon": 9448, - "name": "Maple Stock", - "xp": 32 - }, - { - "level": 54, - "icon": 9142, - "name": "Mithril Bolts", - "xp": 5 - }, - { - "level": 54, - "icon": 9461, - "name": "Mithril Crossbow (U)", - "xp": 64 - }, - { - "level": 55, - "icon": 62, - "name": "Maple Longbow (U)", - "xp": 58.3 - }, - { - "level": 55, - "icon": 11875, - "name": "Broad Bolts", - "xp": 3 - }, - { - "level": 55, - "icon": 851, - "name": "Maple Longbow", - "xp": 58 - }, - { - "level": 56, - "icon": 9337, - "name": "Sapphire Bolts", - "xp": 4.7 - }, - { - "level": 57, - "icon": 22257, - "name": "Maple Shield", - "xp": 116.5 - }, - { - "level": 58, - "icon": 9338, - "name": "Emerald Bolts", - "xp": 5.5 - }, - { - "level": 60, - "icon": 890, - "name": "Adamant Arrow", - "xp": 10 - }, - { - "level": 61, - "icon": 9143, - "name": "Adamant Bolts", - "xp": 7 - }, - { - "level": 61, - "icon": 9450, - "name": "Mahogany Stock", - "xp": 41 - }, - { - "level": 61, - "icon": 9463, - "name": "Adamant Crossbow (U)", - "xp": 82 - }, - { - "level": 61, - "icon": 9183, - "name": "Adamant Crossbow", - "xp": 41 - }, - { - "level": 63, - "icon": 9339, - "name": "Ruby Bolts", - "xp": 6.3 - }, - { - "level": 65, - "icon": 9340, - "name": "Diamond Bolts", - "xp": 7 - }, - { - "level": 65, - "icon": 857, - "name": "Yew Shortbow", - "xp": 67.5 - }, - { - "level": 65, - "icon": 68, - "name": "Yew Shortbow (U)", - "xp": 67.5 - }, - { - "level": 67, - "icon": 810, - "name": "Adamant Dart", - "xp": 15 - }, - { - "level": 69, - "icon": 9465, - "name": "Runite Crossbow (U)", - "xp": 100 - }, - { - "level": 69, - "icon": 9185, - "name": "Rune Crossbow", - "xp": 50 - }, - { - "level": 69, - "icon": 9452, - "name": "Yew Stock", - "xp": 50 - }, - { - "level": 69, - "icon": 9144, - "name": "Runite Bolts", - "xp": 10 - }, - { - "level": 70, - "icon": 855, - "name": "Yew Longbow", - "xp": 75 - }, - { - "level": 70, - "icon": 66, - "name": "Yew Longbow (U)", - "xp": 75 - }, - { - "level": 71, - "icon": 9341, - "name": "Dragonstone Bolts", - "xp": 8.2 - }, - { - "level": 72, - "icon": 22260, - "name": "Yew Shield", - "xp": 150 - }, - { - "level": 73, - "icon": 9342, - "name": "Onyx Bolts", - "xp": 9.4 - }, - { - "level": 75, - "icon": 892, - "name": "Rune Arrow", - "xp": 12.5 - }, - { - "level": 76, - "icon": 21316, - "name": "Amethyst Broad Bolts", - "xp": 10.6 - }, - { - "level": 78, - "icon": 21952, - "name": "Magic Stock", - "xp": 70 - }, - { - "level": 78, - "icon": 21921, - "name": "Dragon Crossbow (U)", - "xp": 135 - }, - { - "level": 78, - "icon": 21902, - "name": "Dragon Crossbow", - "xp": 70 - }, - { - "level": 80, - "icon": 861, - "name": "Magic Shortbow", - "xp": 83.3 - }, - { - "level": 80, - "icon": 72, - "name": "Magic Shortbow (U)", - "xp": 83.3 - }, - { - "level": 81, - "icon": 811, - "name": "Rune Dart", - "xp": 18.8 - }, - { - "level": 82, - "icon": 21326, - "name": "Amethyst Arrow", - "xp": 13.5 - }, - { - "level": 84, - "icon": 21930, - "name": "Dragon Bolts", - "xp": 12 - }, - { - "level": 84, - "icon": 21318, - "name": "Amethyst Javelin", - "xp": 13.5 - }, - { - "level": 85, - "icon": 859, - "name": "Magic Longbow", - "xp": 91.5 - }, - { - "level": 85, - "icon": 70, - "name": "Magic Longbow (U)", - "xp": 91.5 - }, - { - "level": 87, - "icon": 22263, - "name": "Magic Shield", - "xp": 183 - }, - { - "level": 90, - "icon": 25849, - "name": "Amethyst Dart", - "xp": 21 - }, - { - "level": 90, - "icon": 11212, - "name": "Dragon Arrow", - "xp": 15 - }, - { - "level": 92, - "icon": 22266, - "name": "Redwood Shield", - "xp": 216 - }, - { - "level": 95, - "icon": 11230, - "name": "Dragon Dart", - "xp": 25 - } - ] -} diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_herblore.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_herblore.json deleted file mode 100644 index d91f14eccf..0000000000 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_herblore.json +++ /dev/null @@ -1,436 +0,0 @@ -{ - "actions": [ - { - "level": 3, - "icon": 121, - "name": "Attack Potion (3)", - "xp": 25 - }, - { - "level": 3, - "icon": 249, - "name": "Guam Leaf", - "xp": 2.5 - }, - { - "level": 5, - "icon": 251, - "name": "Marrentill", - "xp": 3.8 - }, - { - "level": 5, - "icon": 175, - "name": "Antipoison (3)", - "xp": 37.5 - }, - { - "level": 8, - "icon": 4844, - "name": "Relicym's Balm (3)", - "xp": 40 - }, - { - "level": 11, - "icon": 253, - "name": "Tarromin", - "xp": 5 - }, - { - "level": 12, - "icon": 115, - "name": "Strength Potion (3)", - "xp": 50 - }, - { - "level": 15, - "icon": 3410, - "name": "Serum 207 (3)", - "xp": 50 - }, - { - "level": 18, - "icon": 4419, - "name": "Guthix Rest (3)", - "xp": 59 - }, - { - "level": 19, - "icon": 10142, - "name": "Guam tar", - "xp": 30 - }, - { - "level": 20, - "icon": 255, - "name": "Harralander", - "xp": 6.3 - }, - { - "level": 22, - "icon": 6472, - "name": "Compost Potion (3)", - "xp": 60 - }, - { - "level": 22, - "icon": 127, - "name": "Restore Potion (3)", - "xp": 62.5 - }, - { - "level": 25, - "icon": 257, - "name": "Ranarr Weed", - "xp": 7.5 - }, - { - "level": 26, - "icon": 3010, - "name": "Energy Potion (3)", - "xp": 67.5 - }, - { - "level": 30, - "icon": 2998, - "name": "Toadflax", - "xp": 8 - }, - { - "level": 30, - "icon": 133, - "name": "Defence Potion (3)", - "xp": 75 - }, - { - "level": 31, - "icon": 10143, - "name": "Marrentill tar", - "xp": 42.5 - }, - { - "level": 34, - "icon": 3034, - "name": "Agility Potion (3)", - "xp": 80 - }, - { - "level": 36, - "icon": 9741, - "name": "Combat Potion (3)", - "xp": 84 - }, - { - "level": 38, - "icon": 139, - "name": "Prayer Potion (3)", - "xp": 87.5 - }, - { - "level": 39, - "icon": 10144, - "name": "Tarromin tar", - "xp": 55 - }, - { - "level": 40, - "icon": 259, - "name": "Irit Leaf", - "xp": 8.8 - }, - { - "level": 44, - "icon": 10145, - "name": "Harralander tar", - "xp": 72.5 - }, - { - "level": 45, - "icon": 145, - "name": "Super Attack (3)", - "xp": 100 - }, - { - "level": 48, - "icon": 181, - "name": "Superantipoison (3)", - "xp": 106.3 - }, - { - "level": 48, - "icon": 261, - "name": "Avantoe", - "xp": 10 - }, - { - "level": 50, - "icon": 151, - "name": "Fishing Potion (3)", - "xp": 112.5 - }, - { - "level": 52, - "icon": 3018, - "name": "Super Energy (3)", - "xp": 117.5 - }, - { - "level": 53, - "icon": 10000, - "name": "Hunter Potion (3)", - "xp": 120 - }, - { - "level": 54, - "icon": 263, - "name": "Kwuarm", - "xp": 11.3 - }, - { - "level": 55, - "icon": 157, - "name": "Super Strength (3)", - "xp": 125 - }, - { - "level": 57, - "icon": 9022, - "name": "Magic Essence Potion (3)", - "xp": 130 - }, - { - "level": 59, - "icon": 3000, - "name": "Snapdragon", - "xp": 11.8 - }, - { - "level": 60, - "icon": 187, - "name": "Weapon Poison", - "xp": 137.5 - }, - { - "level": 63, - "icon": 3026, - "name": "Super Restore (3)", - "xp": 142.5 - }, - { - "level": 65, - "icon": 265, - "name": "Cadantine", - "xp": 12.5 - }, - { - "level": 65, - "icon": 10927, - "name": "Sanfew Serum (3)", - "xp": 160 - }, - { - "level": 66, - "icon": 163, - "name": "Super Defence (3)", - "xp": 150 - }, - { - "level": 67, - "icon": 2481, - "name": "Lantadyme", - "xp": 13.1 - }, - { - "level": 68, - "icon": 5945, - "name": "Antidote+ (3)", - "xp": 155 - }, - { - "level": 69, - "icon": 2454, - "name": "Antifire Potion (3)", - "xp": 157.5 - }, - { - "level": 70, - "icon": 23697, - "name": "Divine super attack potion(4)", - "xp:": 2 - }, - { - "level": 70, - "icon": 23721, - "name": "Divine super defence potion(4)", - "xp:": 2 - }, - { - "level": 70, - "icon": 23709, - "name": "Divine super strength potion(4)", - "xp:": 2 - }, - { - "level": 70, - "icon": 267, - "name": "Dwarf Weed", - "xp": 13.8 - }, - { - "level": 72, - "icon": 169, - "name": "Ranging Potion (3)", - "xp": 162.5 - }, - { - "level": 73, - "icon": 5937, - "name": "Weapon Poison (+)", - "xp": 165 - }, - { - "level": 74, - "icon": 23733, - "name": "Divine ranging potion(4)", - "xp:": 2 - }, - { - "level": 75, - "icon": 269, - "name": "Torstol", - "xp": 15 - }, - { - "level": 76, - "icon": 3042, - "name": "Magic Potion (3)", - "xp": 172.5 - }, - { - "level": 77, - "icon": 12627, - "name": "Stamina Potion (3)", - "xp": 76.5 - }, - { - "level": 77, - "icon": 12625, - "name": "Stamina Potion (4)", - "xp": 102 - }, - { - "level": 78, - "icon": 23745, - "name": "Divine magic potion(4)", - "xp:": 2 - }, - { - "level": 78, - "icon": 189, - "name": "Zamorak Brew (3)", - "xp": 175 - }, - { - "level": 79, - "icon": 5954, - "name": "Antidote++ (3)", - "xp": 177.5 - }, - { - "level": 80, - "icon": 22464, - "name": "Bastion Potion (3)", - "xp": 155 - }, - { - "level": 80, - "icon": 22452, - "name": "Battlemage Potion (3)", - "xp": 155 - }, - { - "level": 81, - "icon": 6687, - "name": "Saradomin Brew (3)", - "xp": 180 - }, - { - "level": 82, - "icon": 5940, - "name": "Weapon Poison (++)", - "xp": 190 - }, - { - "level": 84, - "icon": 11953, - "name": "Extended Antifire (3)", - "xp": 82.5 - }, - { - "level": 84, - "icon": 11951, - "name": "Extended Antifire (4)", - "xp": 110 - }, - { - "level": 86, - "icon": 24635, - "name": "Divine bastion potion(4)", - "xp:": 2 - }, - { - "level": 86, - "icon": 24623, - "name": "Divine battlemage potion(4)", - "xp:": 2 - }, - { - "level": 87, - "icon": 12907, - "name": "Anti-venom(3)", - "xp": 90 - }, - { - "level": 87, - "icon": 12905, - "name": "Anti-venom(4)", - "xp": 120 - }, - { - "level": 90, - "icon": 12695, - "name": "Super Combat Potion(4)", - "xp": 150 - }, - { - "level": 92, - "icon": 21978, - "name": "Super Antifire (4)", - "xp": 130 - }, - { - "level": 94, - "icon": 12913, - "name": "Anti-venom+(4)", - "xp": 125 - }, - { - "level": 97, - "icon": 23685, - "name": "Divine super combat potion(4)", - "xp:": 2 - }, - { - "level": 98, - "icon": 21981, - "name": "Extended Super Antifire (3)", - "xp": 120 - }, - { - "level": 98, - "icon": 21978, - "name": "Extended Super Antifire (4)", - "xp": 160 - } - ] -} diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_hunter.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_hunter.json deleted file mode 100644 index a50c2164d6..0000000000 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_hunter.json +++ /dev/null @@ -1,352 +0,0 @@ -{ - "actions": [ - { - "level": 1, - "icon": 9965, - "name": "Crimson Swift", - "xp": 34 - }, - { - "level": 1, - "icon": 9953, - "name": "Polar Kebbit", - "xp": 30 - }, - { - "level": 3, - "icon": 9954, - "name": "Common Kebbit", - "xp": 36 - }, - { - "level": 5, - "icon": 9968, - "name": "Golden Warbler", - "xp": 47 - }, - { - "level": 5, - "icon": 21512, - "name": "Regular Bird House", - "xp": 280 - }, - { - "level": 7, - "icon": 9955, - "name": "Feldip Weasel", - "xp": 48 - }, - { - "level": 9, - "icon": 9966, - "name": "Copper Longtail", - "xp": 61 - }, - { - "level": 11, - "icon": 9967, - "name": "Cerulean Twitch", - "xp": 64.5 - }, - { - "level": 13, - "icon": 9956, - "name": "Desert Devil", - "xp": 66 - }, - { - "level": 14, - "icon": 21515, - "name": "Oak Bird House", - "xp": 420 - }, - { - "level": 15, - "icon": 9970, - "name": "Ruby Harvest", - "xp": 24 - }, - { - "level": 17, - "icon": 11238, - "name": "Baby Impling", - "xp": 18 - }, - { - "level": 19, - "icon": 9969, - "name": "Tropical Wagtail", - "xp": 95 - }, - { - "level": 22, - "icon": 11240, - "name": "Young Impling", - "xp": 20 - }, - { - "level": 23, - "icon": 9953, - "name": "Wild Kebbit", - "xp": 128 - }, - { - "level": 24, - "icon": 21518, - "name": "Willow Bird House", - "xp": 560 - }, - { - "level": 25, - "icon": 9971, - "name": "Sapphire Glacialis", - "xp": 34 - }, - { - "level": 27, - "icon": 10092, - "name": "Ferret", - "xp": 115 - }, - { - "level": 27, - "icon": 9975, - "name": "White Rabbit", - "xp": 144 - }, - { - "level": 28, - "icon": 11242, - "name": "Gourmet Impling", - "xp": 22 - }, - { - "level": 29, - "icon": 10149, - "name": "Swamp Lizard", - "xp": 152 - }, - { - "level": 31, - "icon": 10045, - "name": "Spined Larupia", - "xp": 180 - }, - { - "level": 33, - "icon": 9958, - "name": "Barb-tailed Kebbit", - "xp": 168 - }, - { - "level": 34, - "icon": 21521, - "name": "Teak Bird House", - "xp": 700 - }, - { - "level": 35, - "icon": 9972, - "name": "Snowy Knight", - "xp": 44 - }, - { - "level": 36, - "icon": 11244, - "name": "Earth Impling", - "xp": 25 - }, - { - "level": 37, - "icon": 9957, - "name": "Prickly Kebbit", - "xp": 204 - }, - { - "level": 41, - "icon": 10051, - "name": "Horned Graahk", - "xp": 240 - }, - { - "level": 42, - "icon": 11246, - "name": "Essence Impling", - "xp": 27 - }, - { - "level": 43, - "icon": 9960, - "name": "Spotted Kebbit", - "xp": 104 - }, - { - "level": 44, - "icon": 22192, - "name": "Maple Bird House", - "xp": 820 - }, - { - "level": 45, - "icon": 9973, - "name": "Black Warlock", - "xp": 54 - }, - { - "level": 47, - "icon": 10146, - "name": "Orange Salamander", - "xp": 224 - }, - { - "level": 49, - "icon": 9961, - "name": "Razor-backed Kebbit", - "xp": 348 - }, - { - "level": 49, - "icon": 22195, - "name": "Mahogany Bird House", - "xp": 960 - }, - { - "level": 50, - "icon": 11248, - "name": "Eclectic Impling", - "xp": 32 - }, - { - "level": 51, - "icon": 9959, - "name": "Sabre-toothed Kebbit", - "xp": 200 - }, - { - "level": 53, - "icon": 9976, - "name": "Chinchompa", - "xp": 198.3 - }, - { - "level": 55, - "icon": 10039, - "name": "Sabre-toothed Kyatt", - "xp": 300 - }, - { - "level": 57, - "icon": 9963, - "name": "Dark Kebbit", - "xp": 132 - }, - { - "level": 58, - "icon": 11250, - "name": "Nature Impling", - "xp": 34 - }, - { - "level": 59, - "icon": 10147, - "name": "Red Salamander", - "xp": 272 - }, - { - "level": 59, - "icon": 22198, - "name": "Yew Bird House", - "xp": 1020 - }, - { - "level": 60, - "icon": 19556, - "name": "Maniacal Monkey", - "xp": 1000 - }, - { - "level": 63, - "icon": 9977, - "name": "Carnivorous Chinchompa", - "xp": 265 - }, - { - "level": 65, - "icon": 11252, - "name": "Magpie Impling", - "xp": 44 - }, - { - "level": 65, - "icon": 11252, - "name": "Magpie Impling (Gielinor)", - "xp": 216 - }, - { - "level": 67, - "icon": 10148, - "name": "Black Salamander", - "xp": 319.5 - }, - { - "level": 69, - "icon": 9964, - "name": "Dashing Kebbit", - "xp": 156 - }, - { - "level": 73, - "icon": 5091, - "name": "Black Chinchompa", - "xp": 315 - }, - { - "level": 74, - "icon": 22201, - "name": "Magic Bird House", - "xp": 1140 - }, - { - "level": 74, - "icon": 11254, - "name": "Ninja Impling", - "xp": 52 - }, - { - "level": 74, - "icon": 11254, - "name": "Ninja Impling (Gielinor)", - "xp": 240 - }, - { - "level": 80, - "icon": 23768, - "name": "Crystal Impling", - "xp": 280 - }, - { - "level": 83, - "icon": 11256, - "name": "Dragon Impling", - "xp": 65 - }, - { - "level": 83, - "icon": 11256, - "name": "Dragon Impling (Gielinor)", - "xp": 300 - }, - { - "level": 89, - "icon": 22204, - "name": "Redwood Bird House", - "xp": 1200 - }, - { - "level": 89, - "icon": 19732, - "name": "Lucky Impling", - "xp": 380 - } - ] -} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_magic.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_magic.json deleted file mode 100644 index c127933d7c..0000000000 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_magic.json +++ /dev/null @@ -1,1084 +0,0 @@ -{ - "actions": [ - { - "level": 1, - "sprite": 15, - "name": "Wind Strike", - "xp": 5.5 - }, - { - "level": 3, - "sprite": 16, - "name": "Confuse", - "xp": 13 - }, - { - "level": 4, - "sprite": 358, - "name": "Enchant Opal Bolt", - "xp": 9 - }, - { - "level": 5, - "sprite": 17, - "name": "Water Strike", - "xp": 7.5 - }, - { - "level": 6, - "sprite": 1252, - "name": "Arceuus Library Teleport", - "xp": 10 - }, - { - "level": 7, - "sprite": 18, - "name": "Enchant Sapphire Jewellery", - "xp": 17.5 - }, - { - "level": 7, - "sprite": 358, - "name": "Enchant Sapphire Bolt", - "xp": 17.5 - }, - { - "level": 9, - "sprite": 19, - "name": "Earth Strike", - "xp": 9.5 - }, - { - "level": 11, - "sprite": 20, - "name": "Weaken", - "xp": 21 - }, - { - "level": 13, - "sprite": 21, - "name": "Fire Strike", - "xp": 11.5 - }, - { - "level": 14, - "sprite": 358, - "name": "Enchant Jade Bolt", - "xp": 19 - }, - { - "level": 15, - "sprite": 22, - "name": "Bones To Bananas", - "xp": 25 - }, - { - "level": 16, - "sprite": 1247, - "name": "Basic Reanimation", - "xp": 32 - }, - { - "level": 17, - "sprite": 1253, - "name": "Draynor Manor Teleport", - "xp": 16 - }, - { - "level": 17, - "sprite": 23, - "name": "Wind Bolt", - "xp": 13.5 - }, - { - "level": 19, - "sprite": 24, - "name": "Curse", - "xp": 29 - }, - { - "level": 20, - "sprite": 319, - "name": "Bind", - "xp": 30 - }, - { - "level": 21, - "sprite": 25, - "name": "Low Level Alchemy", - "xp": 31 - }, - { - "level": 23, - "sprite": 26, - "name": "Water Bolt", - "xp": 16.5 - }, - { - "level": 24, - "sprite": 358, - "name": "Enchant Pearl Bolt", - "xp": 29 - }, - { - "level": 25, - "sprite": 27, - "name": "Varrock Teleport", - "xp": 35 - }, - { - "level": 27, - "sprite": 28, - "name": "Enchant Emerald Jewellery", - "xp": 37 - }, - { - "level": 27, - "sprite": 358, - "name": "Enchant Emerald Bolt", - "xp": 37 - }, - { - "level": 28, - "sprite": 1256, - "name": "Mind Altar Teleport", - "xp": 22 - }, - { - "level": 29, - "sprite": 358, - "name": "Enchant Topaz Bolt", - "xp": 33 - }, - { - "level": 29, - "sprite": 29, - "name": "Earth Bolt", - "xp": 19.5 - }, - { - "level": 31, - "sprite": 30, - "name": "Lumbridge Teleport", - "xp": 41 - }, - { - "level": 33, - "sprite": 31, - "name": "Telekinetic Grab", - "xp": 43 - }, - { - "level": 34, - "sprite": 1257, - "name": "Respawn Teleport", - "xp": 27 - }, - { - "level": 35, - "sprite": 32, - "name": "Fire Bolt", - "xp": 22.5 - }, - { - "level": 35, - "sprite": 1267, - "name": "Ghostly Grasp", - "xp": 22.5 - }, - { - "level": 37, - "sprite": 33, - "name": "Falador Teleport", - "xp": 48 - }, - { - "level": 38, - "sprite": 1270, - "name": "Resurrect Lesser Thrall", - "xp": 55 - }, - { - "level": 39, - "sprite": 34, - "name": "Crumble Undead", - "xp": 24.5 - }, - { - "level": 40, - "sprite": 1254, - "name": "Salve Graveyard Teleport", - "xp": 30 - }, - { - "level": 40, - "sprite": 355, - "name": "Teleport To House", - "xp": 30 - }, - { - "level": 41, - "sprite": 1248, - "name": "Adept Reanimation", - "xp": 80 - }, - { - "level": 41, - "sprite": 35, - "name": "Wind Blast", - "xp": 25.5 - }, - { - "level": 43, - "sprite": 36, - "name": "Superheat Item", - "xp": 53 - }, - { - "level": 44, - "sprite": 1302, - "name": "Inferior Demonbane", - "xp": 27 - }, - { - "level": 45, - "sprite": 37, - "name": "Camelot Teleport", - "xp": 55.5 - }, - { - "level": 47, - "sprite": 38, - "name": "Water Blast", - "xp": 28.5 - }, - { - "level": 47, - "sprite": 1315, - "name": "Shadow Veil", - "xp": 58 - }, - { - "level": 48, - "sprite": 1259, - "name": "Fenkenstrain's Castle Teleport", - "xp": 50 - }, - { - "level": 49, - "sprite": 39, - "name": "Enchant Ruby Jewellery", - "xp": 59 - }, - { - "level": 49, - "sprite": 358, - "name": "Enchant Ruby Bolt", - "xp": 59 - }, - { - "level": 50, - "sprite": 53, - "name": "Iban Blast", - "xp": 30 - }, - { - "level": 50, - "sprite": 329, - "name": "Smoke Rush", - "xp": 30 - }, - { - "level": 50, - "sprite": 324, - "name": "Magic Dart", - "xp": 30 - }, - { - "level": 50, - "sprite": 320, - "name": "Snare", - "xp": 60 - }, - { - "level": 50, - "sprite": 1316, - "name": "Dark Lure", - "xp": 60 - }, - { - "level": 51, - "sprite": 54, - "name": "Ardougne Teleport", - "xp": 61 - }, - { - "level": 52, - "sprite": 337, - "name": "Shadow Rush", - "xp": 31 - }, - { - "level": 53, - "sprite": 40, - "name": "Earth Blast", - "xp": 31.5 - }, - { - "level": 54, - "sprite": 341, - "name": "Paddewwa Teleport", - "xp": 64 - }, - { - "level": 55, - "sprite": 41, - "name": "High Level Alchemy", - "xp": 65 - }, - { - "level": 56, - "sprite": 42, - "name": "Charge Water Orb", - "xp": 66 - }, - { - "level": 56, - "sprite": 333, - "name": "Blood Rush", - "xp": 33 - }, - { - "level": 56, - "sprite": 1268, - "name": "Skeletal Grasp", - "xp": 33 - }, - { - "level": 57, - "sprite": 358, - "name": "Enchant Diamond Bolt", - "xp": 67 - }, - { - "level": 57, - "sprite": 43, - "name": "Enchant Diamond Jewellery", - "xp": 67 - }, - { - "level": 57, - "sprite": 2981, - "name": "Resurrect Superior Thrall", - "xp": 70 - }, - { - "level": 58, - "sprite": 55, - "name": "Watchtower Teleport", - "xp": 68 - }, - { - "level": 58, - "sprite": 325, - "name": "Ice Rush", - "xp": 34 - }, - { - "level": 59, - "sprite": 44, - "name": "Fire Blast", - "xp": 34.5 - }, - { - "level": 59, - "sprite": 1305, - "name": "Mark of Darkness", - "xp": 70 - }, - { - "level": 60, - "sprite": 342, - "name": "Senntisten Teleport", - "xp": 70 - }, - { - "level": 60, - "sprite": 60, - "name": "Claws Of Guthix", - "xp": 35 - }, - { - "level": 60, - "sprite": 59, - "name": "Flames Of Zamorak", - "xp": 35 - }, - { - "level": 60, - "sprite": 61, - "name": "Saradomin Strike", - "xp": 35 - }, - { - "level": 60, - "sprite": 45, - "name": "Charge Earth Orb", - "xp": 70 - }, - { - "level": 60, - "sprite": 354, - "name": "Bones To Peaches", - "xp": 35.5 - }, - { - "level": 61, - "sprite": 1260, - "name": "West Ardougne Teleport", - "xp": 68 - }, - { - "level": 61, - "sprite": 323, - "name": "Trollheim Teleport", - "xp": 68 - }, - { - "level": 62, - "sprite": 330, - "name": "Smoke Burst", - "xp": 36 - }, - { - "level": 62, - "sprite": 46, - "name": "Wind Wave", - "xp": 36 - }, - { - "level": 62, - "sprite": 1303, - "name": "Superior Demonbane", - "xp": 36 - }, - { - "level": 63, - "sprite": 47, - "name": "Charge Fire Orb", - "xp": 73 - }, - { - "level": 64, - "sprite": 338, - "name": "Shadow Burst", - "xp": 37 - }, - { - "level": 64, - "sprite": 357, - "name": "Teleport Ape Atoll", - "xp": 74 - }, - { - "level": 64, - "sprite": 1307, - "name": "Lesser Corruption", - "xp": 75 - }, - { - "level": 65, - "sprite": 543, - "name": "Bake Pie", - "xp": 60 - }, - { - "level": 65, - "sprite": 1261, - "name": "Harmony Island Teleport", - "xp": 74 - }, - { - "level": 65, - "sprite": 563, - "name": "Geomancy", - "xp": 60 - }, - { - "level": 65, - "sprite": 48, - "name": "Water Wave", - "xp": 37.5 - }, - { - "level": 66, - "sprite": 49, - "name": "Charge Air Orb", - "xp": 76 - }, - { - "level": 66, - "sprite": 567, - "name": "Cure Plant", - "xp": 60 - }, - { - "level": 66, - "sprite": 343, - "name": "Kharyrll Teleport", - "xp": 76 - }, - { - "level": 66, - "sprite": 56, - "name": "Vulnerability", - "xp": 76 - }, - { - "level": 66, - "sprite": 577, - "name": "Monster Examine", - "xp": 61 - }, - { - "level": 66, - "sprite": 1317, - "name": "Vile Vigour", - "xp": 76 - }, - { - "level": 67, - "sprite": 568, - "name": "Npc Contact", - "xp": 63 - }, - { - "level": 68, - "sprite": 334, - "name": "Blood Burst", - "xp": 39 - }, - { - "level": 68, - "sprite": 559, - "name": "Cure Other", - "xp": 65 - }, - { - "level": 68, - "sprite": 50, - "name": "Enchant Dragonstone Jewellery", - "xp": 78 - }, - { - "level": 68, - "sprite": 358, - "name": "Enchant Dragonstone Bolt", - "xp": 78 - }, - { - "level": 68, - "sprite": 578, - "name": "Humidify", - "xp": 65 - }, - { - "level": 69, - "sprite": 544, - "name": "Moonclan Teleport", - "xp": 66 - }, - { - "level": 70, - "sprite": 51, - "name": "Earth Wave", - "xp": 40 - }, - { - "level": 70, - "sprite": 326, - "name": "Ice Burst", - "xp": 40 - }, - { - "level": 70, - "sprite": 569, - "name": "Tele Group Moonclan", - "xp": 67 - }, - { - "level": 70, - "sprite": 1318, - "name": "Degrime", - "xp": 83 - }, - { - "level": 71, - "sprite": 586, - "name": "Ourania Teleport", - "xp": 69 - }, - { - "level": 71, - "sprite": 1264, - "name": "Cemetery Teleport", - "xp": 82 - }, - { - "level": 71, - "sprite": 562, - "name": "Cure Me", - "xp": 69 - }, - { - "level": 71, - "sprite": 579, - "name": "Hunter Kit", - "xp": 70 - }, - { - "level": 72, - "sprite": 1249, - "name": "Expert Reanimation", - "xp": 138 - }, - { - "level": 72, - "sprite": 344, - "name": "Lassar Teleport", - "xp": 82 - }, - { - "level": 72, - "sprite": 545, - "name": "Waterbirth Teleport", - "xp": 71 - }, - { - "level": 73, - "sprite": 570, - "name": "Tele Group Waterbirth", - "xp": 72 - }, - { - "level": 73, - "sprite": 57, - "name": "Enfeeble", - "xp": 83 - }, - { - "level": 73, - "sprite": 1306, - "name": "Ward of Arceuus", - "xp": 83 - }, - { - "level": 74, - "sprite": 349, - "name": "Teleother Lumbridge", - "xp": 84 - }, - { - "level": 74, - "sprite": 331, - "name": "Smoke Blitz", - "xp": 42 - }, - { - "level": 74, - "sprite": 565, - "name": "Cure Group", - "xp": 74 - }, - { - "level": 75, - "sprite": 576, - "name": "Stat Spy", - "xp": 76 - }, - { - "level": 75, - "sprite": 547, - "name": "Barbarian Teleport", - "xp": 76 - }, - { - "level": 75, - "sprite": 52, - "name": "Fire Wave", - "xp": 42.5 - }, - { - "level": 76, - "sprite": 575, - "name": "Tele Group Barbarian", - "xp": 77 - }, - { - "level": 76, - "sprite": 339, - "name": "Shadow Blitz", - "xp": 43 - }, - { - "level": 76, - "sprite": 585, - "name": "Spin Flax", - "xp": 75 - }, - { - "level": 76, - "sprite": 2984, - "name": "Resurrect Greater Thrall", - "xp": 88 - }, - { - "level": 77, - "sprite": 548, - "name": "Superglass Make", - "xp": 78 - }, - { - "level": 78, - "sprite": 583, - "name": "Tan Leather", - "xp": 81 - }, - { - "level": 78, - "sprite": 549, - "name": "Khazard Teleport", - "xp": 80 - }, - { - "level": 78, - "sprite": 345, - "name": "Dareeyak Teleport", - "xp": 88 - }, - { - "level": 78, - "sprite": 1266, - "name": "Resurrect Crops", - "xp": 90 - }, - { - "level": 79, - "sprite": 321, - "name": "Entangle", - "xp": 89 - }, - { - "level": 79, - "sprite": 572, - "name": "Tele Group Khazard", - "xp": 81 - }, - { - "level": 79, - "sprite": 580, - "name": "Dream", - "xp": 82 - }, - { - "level": 79, - "sprite": 1269, - "name": "Undead Grasp", - "xp": 46.5 - }, - { - "level": 80, - "sprite": 322, - "name": "Charge", - "xp": 180 - }, - { - "level": 80, - "sprite": 335, - "name": "Blood Blitz", - "xp": 45 - }, - { - "level": 80, - "sprite": 58, - "name": "Stun", - "xp": 90 - }, - { - "level": 80, - "sprite": 550, - "name": "String Jewellery", - "xp": 83 - }, - { - "level": 80, - "sprite": 1310, - "name": "Death Charge", - "xp": 90 - }, - { - "level": 81, - "sprite": 554, - "name": "Stat Restore Pot Share", - "xp": 84 - }, - { - "level": 81, - "sprite": 362, - "name": "Wind Surge", - "xp": 44 - }, - { - "level": 82, - "sprite": 350, - "name": "Teleother Falador", - "xp": 92 - }, - { - "level": 82, - "sprite": 552, - "name": "Magic Imbue", - "xp": 86 - }, - { - "level": 82, - "sprite": 327, - "name": "Ice Blitz", - "xp": 46 - }, - { - "level": 82, - "sprite": 1304, - "name": "Dark Demonbane", - "xp": 43.5 - }, - { - "level": 83, - "sprite": 553, - "name": "Fertile Soil", - "xp": 87 - }, - { - "level": 83, - "sprite": 1262, - "name": "Barrows Teleport", - "xp": 90 - }, - { - "level": 84, - "sprite": 346, - "name": "Carrallangar Teleport", - "xp": 82 - }, - { - "level": 84, - "sprite": 551, - "name": "Boost Potion Share", - "xp": 88 - }, - { - "level": 84, - "sprite": 1311, - "name": "Demonic Offering", - "xp": 175 - }, - { - "level": 85, - "sprite": 363, - "name": "Water Surge", - "xp": 46 - }, - { - "level": 85, - "sprite": 555, - "name": "Fishing Guild Teleport", - "xp": 89 - }, - { - "level": 85, - "sprite": 352, - "name": "Tele Block", - "xp": 80 - }, - { - "level": 85, - "sprite": 359, - "name": "Teleport To Bounty Target", - "xp": 45 - }, - { - "level": 85, - "sprite": 1308, - "name": "Greater Corruption", - "xp": 95 - }, - { - "level": 86, - "sprite": 332, - "name": "Smoke Barrage", - "xp": 48 - }, - { - "level": 86, - "sprite": 573, - "name": "Tele Group Fishing Guild", - "xp": 90 - }, - { - "level": 86, - "sprite": 581, - "name": "Plank Make", - "xp": 90 - }, - { - "level": 87, - "sprite": 556, - "name": "Catherby Teleport", - "xp": 92 - }, - { - "level": 87, - "sprite": 353, - "name": "Enchant Onyx Jewellery", - "xp": 97 - }, - { - "level": 87, - "sprite": 358, - "name": "Enchant Onyx Bolt", - "xp": 97 - }, - { - "level": 88, - "sprite": 340, - "name": "Shadow Barrage", - "xp": 48 - }, - { - "level": 88, - "sprite": 574, - "name": "Tele Group Catherby", - "xp": 93 - }, - { - "level": 89, - "sprite": 557, - "name": "Ice Plateau Teleport", - "xp": 96 - }, - { - "level": 89, - "sprite": 584, - "name": "Recharge Dragonstone", - "xp": 97.5 - }, - { - "level": 90, - "sprite": 347, - "name": "Annakarl Teleport", - "xp": 100 - }, - { - "level": 90, - "sprite": 364, - "name": "Earth Surge", - "xp": 48 - }, - { - "level": 90, - "sprite": 1250, - "name": "Master Reanimation", - "xp": 170 - }, - { - "level": 90, - "sprite": 575, - "name": "Tele Group Ice Plateau", - "xp": 99 - }, - { - "level": 90, - "sprite": 351, - "name": "Teleother Camelot", - "xp": 100 - }, - { - "level": 90, - "sprite": 1263, - "name": "Ape Atoll Teleport", - "xp": 100 - }, - { - "level": 91, - "sprite": 558, - "name": "Energy Transfer", - "xp": 100 - }, - { - "level": 92, - "sprite": 336, - "name": "Blood Barrage", - "xp": 51 - }, - { - "level": 92, - "sprite": 560, - "name": "Heal Other", - "xp": 101 - }, - { - "level": 92, - "sprite": 1312, - "name": "Sinister Offering", - "xp": 180 - }, - { - "level": 93, - "sprite": 561, - "name": "Vengeance Other", - "xp": 108 - }, - { - "level": 93, - "sprite": 361, - "name": "Enchant Zenyte Jewellery", - "xp": 110 - }, - { - "level": 94, - "sprite": 328, - "name": "Ice Barrage", - "xp": 52 - }, - { - "level": 94, - "sprite": 564, - "name": "Vengeance", - "xp": 112 - }, - { - "level": 95, - "sprite": 566, - "name": "Heal Group", - "xp": 124 - }, - { - "level": 95, - "sprite": 365, - "name": "Fire Surge", - "xp": 51 - }, - { - "level": 96, - "sprite": 348, - "name": "Ghorrock Teleport", - "xp": 106 - }, - { - "level": 96, - "sprite": 582, - "name": "Spellbook Swap", - "xp": 130 - } - ] -} diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_mining.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_mining.json deleted file mode 100644 index a944c4782f..0000000000 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_mining.json +++ /dev/null @@ -1,166 +0,0 @@ -{ - "bonuses": [ - { - "name": "Prospector Outfit (+2.5%)", - "value": 0.025 - } - ], - "actions": [ - { - "level": 1, - "icon": 434, - "name": "Clay", - "xp": 5 - }, - { - "level": 1, - "icon": 1436, - "name": "Rune Essence", - "xp": 5 - }, - { - "level": 1, - "icon": 436, - "name": "Copper Ore", - "xp": 17.5 - }, - { - "level": 1, - "icon": 438, - "name": "Tin Ore", - "xp": 17.5 - }, - { - "level": 10, - "icon": 3211, - "name": "Limestone", - "xp": 26.5 - }, - { - "level": 14, - "icon": 25683, - "name": "Barronite shards", - "xp": 16 - }, - { - "level": 14, - "icon": 25684, - "name": "Barronite deposit", - "xp": 32 - }, - { - "level": 15, - "icon": 440, - "name": "Iron Ore", - "xp": 35 - }, - { - "level": 20, - "icon": 442, - "name": "Silver Ore", - "xp": 40 - }, - { - "level": 30, - "icon": 7936, - "name": "Pure Essence", - "xp": 5 - }, - { - "level": 30, - "icon": 453, - "name": "Coal", - "xp": 50 - }, - { - "level": 35, - "icon": 6977, - "name": "Sandstone (10kg)", - "xp": 60 - }, - { - "level": 35, - "icon": 6975, - "name": "Sandstone (5kg)", - "xp": 50 - }, - { - "level": 35, - "icon": 6973, - "name": "Sandstone (2kg)", - "xp": 40 - }, - { - "level": 35, - "icon": 6971, - "name": "Sandstone (1kg)", - "xp": 30 - }, - { - "level": 38, - "icon": 13445, - "name": "Dense Essence Block", - "xp": 12 - }, - { - "level": 40, - "icon": 444, - "name": "Gold Ore", - "xp": 65 - }, - { - "level": 40, - "icon": 1629, - "name": "Gem Rocks", - "xp": 65 - }, - { - "level": 45, - "icon": 6979, - "name": "Granite (500g)", - "xp": 50 - }, - { - "level": 45, - "icon": 6981, - "name": "Granite (2kg)", - "xp": 60 - }, - { - "level": 45, - "icon": 6983, - "name": "Granite (5kg)", - "xp": 75 - }, - { - "level": 55, - "icon": 447, - "name": "Mithril Ore", - "xp": 80 - }, - { - "level": 70, - "icon": 1761, - "name": "Soft Clay", - "xp": 5 - }, - { - "level": 70, - "icon": 449, - "name": "Adamantite Ore", - "xp": 95 - }, - { - "level": 85, - "icon": 451, - "name": "Runite Ore", - "xp": 125 - }, - { - "level": 92, - "icon": 21347, - "name": "Amethyst", - "xp": 240 - } - ] -} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_prayer.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_prayer.json deleted file mode 100644 index 9ebde37563..0000000000 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_prayer.json +++ /dev/null @@ -1,397 +0,0 @@ -{ - "bonuses": [ - { - "name": "Lit Gilded Altar (350%)", - "value": 2.5 - }, - { - "name": "Ectofuntus (400%)", - "value": 3 - }, - { - "name": "Chaos Altar (700%)", - "value": 6 - }, - { - "name": "Morytania Diary 3 Shades(150%)", - "value": 0.5 - } - ], - "actions": [ - { - "level": 1, - "icon": 13447, - "name": "Ensouled Goblin Head", - "xp": 130, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 13450, - "name": "Ensouled Monkey Head", - "xp": 182, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 13453, - "name": "Ensouled Imp Head", - "xp": 286, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 13456, - "name": "Ensouled Minotaur Head", - "xp": 364, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 13459, - "name": "Ensouled Scorpion Head", - "xp": 454, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 13462, - "name": "Ensouled Bear Head", - "xp": 480, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 13465, - "name": "Ensouled Unicorn Head", - "xp": 494, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 13468, - "name": "Ensouled Dog Head", - "xp": 520, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 13471, - "name": "Ensouled Chaos Druid Head", - "xp": 584, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 13474, - "name": "Ensouled Giant Head", - "xp": 650, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 13477, - "name": "Ensouled Ogre Head", - "xp": 716, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 13480, - "name": "Ensouled Elf Head", - "xp": 754, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 13483, - "name": "Ensouled Troll Head", - "xp": 780, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 13486, - "name": "Ensouled Horror Head", - "xp": 832, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 13489, - "name": "Ensouled Kalphite Head", - "xp": 884, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 13492, - "name": "Ensouled Dagannoth Head", - "xp": 936, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 13495, - "name": "Ensouled Bloodveld Head", - "xp": 1040, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 13498, - "name": "Ensouled Tzhaar Head", - "xp": 1104, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 13501, - "name": "Ensouled Demon Head", - "xp": 1170, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 13504, - "name": "Ensouled Aviansie Head", - "xp": 1234, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 13507, - "name": "Ensouled Abyssal Head", - "xp": 1300, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 13510, - "name": "Ensouled Dragon Head", - "xp": 1560, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 25766, - "name": "Fiendish Ashes", - "xp": 10, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 25769, - "name": "Vile Ashes", - "xp": 25, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 25772, - "name": "Malicious Ashes", - "xp": 65, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 25775, - "name": "Abyssal Ashes", - "xp": 85, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 25778, - "name": "Infernal Ashes", - "xp": 110, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 526, - "name": "Bones", - "xp": 4.5 - }, - { - "level": 1, - "icon": 2859, - "name": "Wolf Bones", - "xp": 4.5 - }, - { - "level": 1, - "icon": 3396, - "name": "Loar Remains", - "xp": 33 - }, - { - "level": 1, - "icon": 528, - "name": "Burnt Bones", - "xp": 4.5 - }, - { - "level": 1, - "icon": 3179, - "name": "Monkey Bones", - "xp": 5 - }, - { - "level": 1, - "icon": 530, - "name": "Bat Bones", - "xp": 5.3 - }, - { - "level": 1, - "icon": 3125, - "name": "Jogre Bones", - "xp": 15 - }, - { - "level": 1, - "icon": 532, - "name": "Big Bones", - "xp": 15 - }, - { - "level": 1, - "icon": 4812, - "name": "Zogre Bones", - "xp": 22.5 - }, - { - "level": 1, - "icon": 3123, - "name": "Shaikahan Bones", - "xp": 25 - }, - { - "level": 1, - "icon": 534, - "name": "Babydragon Bones", - "xp": 30 - }, - { - "level": 1, - "icon": 3398, - "name": "Phrin Remains", - "xp": 46.5 - }, - { - "level": 1, - "icon": 22780, - "name": "Wyrm Bones", - "xp": 50 - }, - { - "level": 1, - "icon": 3400, - "name": "Riyl Remains", - "xp": 59.5 - }, - { - "level": 1, - "icon": 6812, - "name": "Wyvern Bones", - "xp": 72 - }, - { - "level": 1, - "icon": 536, - "name": "Dragon Bones", - "xp": 72 - }, - { - "level": 1, - "icon": 22783, - "name": "Drake Bones", - "xp": 80 - }, - { - "level": 1, - "icon": 3402, - "name": "Asyn Remains", - "xp": 82.5 - }, - { - "level": 1, - "icon": 4830, - "name": "Fayrg Bones", - "xp": 84 - }, - { - "level": 1, - "icon": 3404, - "name": "Fiyr Remains", - "xp": 84 - }, - { - "level": 1, - "icon": 11943, - "name": "Lava Dragon Bones", - "xp": 85 - }, - { - "level": 1, - "icon": 4832, - "name": "Raurg Bones", - "xp": 96 - }, - { - "level": 1, - "icon": 22786, - "name": "Hydra Bones", - "xp": 110 - }, - { - "level": 1, - "icon": 6729, - "name": "Dagannoth Bones", - "xp": 125 - }, - { - "level": 1, - "icon": 4834, - "name": "Ourg Bones", - "xp": 140 - }, - { - "level": 70, - "icon": 22124, - "name": "Superior Dragon Bones", - "xp": 150 - }, - { - "level": 1, - "icon": 25419, - "name": "Urium Remains", - "xp": 120 - }, - { - "level": 1, - "icon": 25654, - "name": "Guppy", - "xp": 4 - }, - { - "level": 1, - "icon": 25660, - "name": "Cavefish", - "xp": 7 - }, - { - "level": 1, - "icon": 25666, - "name": "Tetra", - "xp": 10 - }, - { - "level": 1, - "icon": 25672, - "name": "Cavefish", - "xp": 16 - } - ] -} diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_runecraft.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_runecraft.json deleted file mode 100644 index 901196750e..0000000000 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_runecraft.json +++ /dev/null @@ -1,240 +0,0 @@ -{ - "bonuses": [ - { - "name": "Daeyalt essence (+50%)", - "value": 0.5 - } - ], - "actions": [ - { - "level": 1, - "icon": 5527, - "name": "Air Tiara", - "xp": 25, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 5529, - "name": "Mind Tiara", - "xp": 27.5, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 5531, - "name": "Water Tiara", - "xp": 30, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 5535, - "name": "Earth Tiara", - "xp": 32.5, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 5537, - "name": "Fire Tiara", - "xp": 35, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 5533, - "name": "Body Tiara", - "xp": 37.5, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 5539, - "name": "Cosmic Tiara", - "xp": 40, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 5543, - "name": "Chaos Tiara", - "xp": 42.5, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 5541, - "name": "Nature Tiara", - "xp": 45, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 5545, - "name": "Law Tiara", - "xp": 47.5, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 5547, - "name": "Death Tiara", - "xp": 50, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 22121, - "name": "Wrath Tiara", - "xp": 52.5, - "ignoreBonus": true - }, - { - "level": 1, - "icon": 556, - "name": "Air Rune", - "xp": 5 - }, - { - "level": 2, - "icon": 558, - "name": "Mind Rune", - "xp": 5.5 - }, - { - "level": 2, - "icon": 25696, - "name": "Mind core", - "xp": 55 - }, - { - "level": 5, - "icon": 555, - "name": "Water Rune", - "xp": 6 - }, - { - "level": 6, - "icon": 4695, - "name": "Mist Rune", - "xp": 8.5 - }, - { - "level": 9, - "icon": 557, - "name": "Earth Rune", - "xp": 6.5 - }, - { - "level": 10, - "icon": 4696, - "name": "Dust Rune", - "xp": 9 - }, - { - "level": 13, - "icon": 4698, - "name": "Mud Rune", - "xp": 9.5 - }, - { - "level": 14, - "icon": 554, - "name": "Fire Rune", - "xp": 7 - }, - { - "level": 15, - "icon": 4697, - "name": "Smoke Rune", - "xp": 9.5 - }, - { - "level": 19, - "icon": 4694, - "name": "Steam Rune", - "xp": 10 - }, - { - "level": 20, - "icon": 559, - "name": "Body Rune", - "xp": 7.5 - }, - { - "level": 20, - "icon": 25698, - "name": "Body core", - "xp": 75 - }, - { - "level": 23, - "icon": 4699, - "name": "Lava Rune", - "xp": 10.5 - }, - { - "level": 27, - "icon": 564, - "name": "Cosmic Rune", - "xp": 8 - }, - { - "level": 35, - "icon": 562, - "name": "Chaos Rune", - "xp": 8.5 - }, - { - "level": 35, - "icon": 25700, - "name": "Chaos core", - "xp": 85 - }, - { - "level": 40, - "icon": 9075, - "name": "Astral Rune", - "xp": 8.7 - }, - { - "level": 44, - "icon": 561, - "name": "Nature Rune", - "xp": 9 - }, - { - "level": 54, - "icon": 563, - "name": "Law Rune", - "xp": 9.5 - }, - { - "level": 65, - "icon": 560, - "name": "Death Rune", - "xp": 10 - }, - { - "level": 77, - "icon": 565, - "name": "Blood Rune", - "xp": 24.425, - "ignoreBonus": true - }, - { - "level": 90, - "icon": 566, - "name": "Soul Rune", - "xp": 30.325, - "ignoreBonus": true - }, - { - "level": 95, - "icon": 21880, - "name": "Wrath Rune", - "xp": 8 - } - ] -} diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_smithing.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_smithing.json deleted file mode 100644 index bf829f53b6..0000000000 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_smithing.json +++ /dev/null @@ -1,1090 +0,0 @@ -{ - "actions": [ - { - "level": 1, - "icon": 2349, - "name": "Bronze Bar", - "xp": 6.3 - }, - { - "level": 1, - "icon": 1351, - "name": "Bronze Axe", - "xp": 12.5 - }, - { - "level": 1, - "icon": 1205, - "name": "Bronze Dagger", - "xp": 12.5 - }, - { - "level": 2, - "icon": 1422, - "name": "Bronze Mace", - "xp": 12.5 - }, - { - "level": 3, - "icon": 1139, - "name": "Bronze Med Helm", - "xp": 12.5 - }, - { - "level": 3, - "icon": 9375, - "name": "Bronze Bolts (Unf)", - "xp": 12.5 - }, - { - "level": 4, - "icon": 4819, - "name": "Bronze Nails", - "xp": 12.5 - }, - { - "level": 4, - "icon": 1277, - "name": "Bronze Sword", - "xp": 12.5 - }, - { - "level": 4, - "icon": 1794, - "name": "Bronze Wire", - "xp": 12.5 - }, - { - "level": 4, - "icon": 819, - "name": "Bronze Dart Tip", - "xp": 12.5 - }, - { - "level": 5, - "icon": 39, - "name": "Bronze Arrowtips", - "xp": 12.5 - }, - { - "level": 5, - "icon": 1321, - "name": "Bronze Scimitar", - "xp": 25 - }, - { - "level": 5, - "icon": 11367, - "name": "Bronze Hasta", - "xp": 25 - }, - { - "level": 5, - "icon": 1237, - "name": "Bronze Spear", - "xp": 25 - }, - { - "level": 6, - "icon": 19570, - "name": "Bronze Javelin Heads", - "xp": 12.5 - }, - { - "level": 6, - "icon": 1291, - "name": "Bronze Longsword", - "xp": 25 - }, - { - "level": 6, - "icon": 9420, - "name": "Bronze Limbs", - "xp": 12.5 - }, - { - "level": 7, - "icon": 864, - "name": "Bronze Knife", - "xp": 12.5 - }, - { - "level": 7, - "icon": 1155, - "name": "Bronze Full Helm", - "xp": 25 - }, - { - "level": 8, - "icon": 1173, - "name": "Bronze Sq Shield", - "xp": 25 - }, - { - "level": 9, - "icon": 1337, - "name": "Bronze Warhammer", - "xp": 37.5 - }, - { - "level": 10, - "icon": 1375, - "name": "Bronze Battleaxe", - "xp": 37.5 - }, - { - "level": 11, - "icon": 1103, - "name": "Bronze Chainbody", - "xp": 37.5 - }, - { - "level": 12, - "icon": 1189, - "name": "Bronze Kiteshield", - "xp": 37.5 - }, - { - "level": 13, - "icon": 3095, - "name": "Bronze Claws", - "xp": 25 - }, - { - "level": 14, - "icon": 1307, - "name": "Bronze 2h Sword", - "xp": 37.5 - }, - { - "level": 14, - "icon": 25684, - "name": "Barronite deposits", - "xp": 30 - }, - { - "level": 15, - "icon": 2351, - "name": "Iron Bar", - "xp": 12.5 - }, - { - "level": 15, - "icon": 1203, - "name": "Iron Dagger", - "xp": 25 - }, - { - "level": 16, - "icon": 1349, - "name": "Iron Axe", - "xp": 25 - }, - { - "level": 16, - "icon": 1075, - "name": "Bronze Platelegs", - "xp": 37.5 - }, - { - "level": 16, - "icon": 1087, - "name": "Bronze Plateskirt", - "xp": 37.5 - }, - { - "level": 17, - "icon": 7225, - "name": "Iron Spit", - "xp": 25 - }, - { - "level": 17, - "icon": 1420, - "name": "Iron Mace", - "xp": 25 - }, - { - "level": 18, - "icon": 9377, - "name": "Iron Bolts (Unf)", - "xp": 25 - }, - { - "level": 18, - "icon": 1117, - "name": "Bronze Platebody", - "xp": 62.5 - }, - { - "level": 18, - "icon": 1137, - "name": "Iron Med Helm", - "xp": 25 - }, - { - "level": 19, - "icon": 4820, - "name": "Iron Nails", - "xp": 25 - }, - { - "level": 19, - "icon": 820, - "name": "Iron Dart Tip", - "xp": 25 - }, - { - "level": 19, - "icon": 1279, - "name": "Iron Sword", - "xp": 25 - }, - { - "level": 20, - "icon": 2355, - "name": "Silver Bar", - "xp": 13.7 - }, - { - "level": 20, - "icon": 40, - "name": "Iron Arrowtips", - "xp": 25 - }, - { - "level": 20, - "icon": 1323, - "name": "Iron Scimitar", - "xp": 50 - }, - { - "level": 20, - "icon": 11369, - "name": "Iron Hasta", - "xp": 50 - }, - { - "level": 20, - "icon": 1239, - "name": "Iron Spear", - "xp": 50 - }, - { - "level": 21, - "icon": 1293, - "name": "Iron Longsword", - "xp": 50 - }, - { - "level": 21, - "icon": 19572, - "name": "Iron Javelin Heads", - "xp": 25 - }, - { - "level": 22, - "icon": 1153, - "name": "Iron Full Helm", - "xp": 50 - }, - { - "level": 22, - "icon": 863, - "name": "Iron Knife", - "xp": 25 - }, - { - "level": 23, - "icon": 9423, - "name": "Iron Limbs", - "xp": 25 - }, - { - "level": 23, - "icon": 1175, - "name": "Iron Sq Shield", - "xp": 50 - }, - { - "level": 24, - "icon": 1335, - "name": "Iron Warhammer", - "xp": 75 - }, - { - "level": 25, - "icon": 1363, - "name": "Iron Battleaxe", - "xp": 75 - }, - { - "level": 26, - "icon": 4540, - "name": "Oil Lantern Frame", - "xp": 25 - }, - { - "level": 26, - "icon": 1101, - "name": "Iron Chainbody", - "xp": 75 - }, - { - "level": 27, - "icon": 1191, - "name": "Iron Kiteshield", - "xp": 75 - }, - { - "level": 28, - "icon": 3096, - "name": "Iron Claws", - "xp": 50 - }, - { - "level": 29, - "icon": 1309, - "name": "Iron 2h Sword", - "xp": 75 - }, - { - "level": 30, - "icon": 1207, - "name": "Steel Dagger", - "xp": 37.5 - }, - { - "level": 30, - "icon": 2353, - "name": "Steel Bar", - "xp": 17.5 - }, - { - "level": 31, - "icon": 1081, - "name": "Iron Plateskirt", - "xp": 75 - }, - { - "level": 31, - "icon": 1067, - "name": "Iron Platelegs", - "xp": 75 - }, - { - "level": 31, - "icon": 1353, - "name": "Steel Axe", - "xp": 37.5 - }, - { - "level": 32, - "icon": 1424, - "name": "Steel Mace", - "xp": 37.5 - }, - { - "level": 33, - "icon": 1115, - "name": "Iron Platebody", - "xp": 125 - }, - { - "level": 33, - "icon": 1141, - "name": "Steel Med Helm", - "xp": 37.5 - }, - { - "level": 33, - "icon": 9378, - "name": "Steel Bolts (Unf)", - "xp": 37.5 - }, - { - "level": 34, - "icon": 821, - "name": "Steel Dart Tip", - "xp": 37.5 - }, - { - "level": 34, - "icon": 1539, - "name": "Steel Nails", - "xp": 37.5 - }, - { - "level": 34, - "icon": 1281, - "name": "Steel Sword", - "xp": 37.5 - }, - { - "level": 35, - "icon": 2, - "name": "Cannonball", - "xp": 25.6 - }, - { - "level": 35, - "icon": 1325, - "name": "Steel Scimitar", - "xp": 75 - }, - { - "level": 35, - "icon": 41, - "name": "Steel Arrowtips", - "xp": 37.5 - }, - { - "level": 35, - "icon": 11371, - "name": "Steel Hasta", - "xp": 75 - }, - { - "level": 35, - "icon": 1241, - "name": "Steel Spear", - "xp": 75 - }, - { - "level": 36, - "icon": 9425, - "name": "Steel Limbs", - "xp": 37.5 - }, - { - "level": 36, - "icon": 2370, - "name": "Steel Studs", - "xp": 37.5 - }, - { - "level": 36, - "icon": 1295, - "name": "Steel Longsword", - "xp": 75 - }, - { - "level": 36, - "icon": 19574, - "name": "Steel Javelin Heads", - "xp": 37.5 - }, - { - "level": 37, - "icon": 865, - "name": "Steel Knife", - "xp": 37.5 - }, - { - "level": 37, - "icon": 1157, - "name": "Steel Full Helm", - "xp": 75 - }, - { - "level": 38, - "icon": 1177, - "name": "Steel Sq Shield", - "xp": 75 - }, - { - "level": 39, - "icon": 1339, - "name": "Steel Warhammer", - "xp": 112.5 - }, - { - "level": 40, - "icon": 1365, - "name": "Steel Battleaxe", - "xp": 112.5 - }, - { - "level": 40, - "icon": 2357, - "name": "Gold Bar (Goldsmith Gauntlets)", - "xp": 56.2 - }, - { - "level": 40, - "icon": 2357, - "name": "Gold Bar", - "xp": 22.5 - }, - { - "level": 41, - "icon": 1105, - "name": "Steel Chainbody", - "xp": 112.5 - }, - { - "level": 42, - "icon": 1193, - "name": "Steel Kiteshield", - "xp": 112.5 - }, - { - "level": 43, - "icon": 3097, - "name": "Steel Claws", - "xp": 75 - }, - { - "level": 44, - "icon": 1311, - "name": "Steel 2h Sword", - "xp": 112.5 - }, - { - "level": 46, - "icon": 1069, - "name": "Steel Platelegs", - "xp": 112.5 - }, - { - "level": 46, - "icon": 1083, - "name": "Steel Plateskirt", - "xp": 112.5 - }, - { - "level": 48, - "icon": 1119, - "name": "Steel Platebody", - "xp": 187.5 - }, - { - "level": 49, - "icon": 4544, - "name": "Bullseye Lantern (Unf)", - "xp": 37 - }, - { - "level": 50, - "icon": 1209, - "name": "Mithril Dagger", - "xp": 50 - }, - { - "level": 50, - "icon": 2359, - "name": "Mithril Bar", - "xp": 30 - }, - { - "level": 51, - "icon": 1355, - "name": "Mithril Axe", - "xp": 50 - }, - { - "level": 52, - "icon": 1428, - "name": "Mithril Mace", - "xp": 50 - }, - { - "level": 53, - "icon": 1143, - "name": "Mithril Med Helm", - "xp": 50 - }, - { - "level": 53, - "icon": 9379, - "name": "Mithril Bolts (Unf)", - "xp": 50 - }, - { - "level": 54, - "icon": 1285, - "name": "Mithril Sword", - "xp": 50 - }, - { - "level": 54, - "icon": 822, - "name": "Mithril Dart Tip", - "xp": 50 - }, - { - "level": 54, - "icon": 4822, - "name": "Mithril Nails", - "xp": 50 - }, - { - "level": 55, - "icon": 42, - "name": "Mithril Arrowtips", - "xp": 50 - }, - { - "level": 55, - "icon": 1329, - "name": "Mithril Scimitar", - "xp": 100 - }, - { - "level": 55, - "icon": 11373, - "name": "Mithril Hasta", - "xp": 100 - }, - { - "level": 55, - "icon": 1243, - "name": "Mithril Spear", - "xp": 100 - }, - { - "level": 56, - "icon": 1299, - "name": "Mithril Longsword", - "xp": 100 - }, - { - "level": 56, - "icon": 19576, - "name": "Mithril Javelin Heads", - "xp": 50 - }, - { - "level": 56, - "icon": 9427, - "name": "Mithril Limbs", - "xp": 50 - }, - { - "level": 57, - "icon": 1159, - "name": "Mithril Full Helm", - "xp": 100 - }, - { - "level": 57, - "icon": 866, - "name": "Mithril Knife", - "xp": 50 - }, - { - "level": 58, - "icon": 1181, - "name": "Mithril Sq Shield", - "xp": 100 - }, - { - "level": 59, - "icon": 9416, - "name": "Mith Grapple Tip", - "xp": 50 - }, - { - "level": 59, - "icon": 1343, - "name": "Mithril Warhammer", - "xp": 150 - }, - { - "level": 60, - "icon": 1187, - "name": "Dragon Sq Shield", - "xp": 75 - }, - { - "level": 60, - "icon": 1369, - "name": "Mithril Battleaxe", - "xp": 150 - }, - { - "level": 61, - "icon": 1109, - "name": "Mithril Chainbody", - "xp": 150 - }, - { - "level": 62, - "icon": 1197, - "name": "Mithril Kiteshield", - "xp": 150 - }, - { - "level": 63, - "icon": 3099, - "name": "Mithril Claws", - "xp": 100 - }, - { - "level": 64, - "icon": 1315, - "name": "Mithril 2h Sword", - "xp": 150 - }, - { - "level": 66, - "icon": 1085, - "name": "Mithril Plateskirt", - "xp": 150 - }, - { - "level": 66, - "icon": 1071, - "name": "Mithril Platelegs", - "xp": 150 - }, - { - "level": 68, - "icon": 1121, - "name": "Mithril Platebody", - "xp": 250 - }, - { - "level": 70, - "icon": 1211, - "name": "Adamant Dagger", - "xp": 62.5 - }, - { - "level": 70, - "icon": 2361, - "name": "Adamantite Bar", - "xp": 37.5 - }, - { - "level": 71, - "icon": 1357, - "name": "Adamant Axe", - "xp": 62.5 - }, - { - "level": 72, - "icon": 1430, - "name": "Adamant Mace", - "xp": 62.5 - }, - { - "level": 73, - "icon": 9380, - "name": "Adamant Bolts (Unf)", - "xp": 62.5 - }, - { - "level": 73, - "icon": 1145, - "name": "Adamant Med Helm", - "xp": 62.5 - }, - { - "level": 74, - "icon": 823, - "name": "Adamant Dart Tip", - "xp": 62.5 - }, - { - "level": 74, - "icon": 1287, - "name": "Adamant Sword", - "xp": 62.5 - }, - { - "level": 74, - "icon": 4823, - "name": "Adamantite Nails", - "xp": 62.5 - }, - { - "level": 75, - "icon": 43, - "name": "Adamant Arrowtips", - "xp": 62.5 - }, - { - "level": 75, - "icon": 1331, - "name": "Adamant Scimitar", - "xp": 125 - }, - { - "level": 75, - "icon": 11375, - "name": "Adamant Hasta", - "xp": 125 - }, - { - "level": 75, - "icon": 1245, - "name": "Adamant Spear", - "xp": 125 - }, - { - "level": 76, - "icon": 9429, - "name": "Adamantite Limbs", - "xp": 62.5 - }, - { - "level": 76, - "icon": 1301, - "name": "Adamant Longsword", - "xp": 125 - }, - { - "level": 76, - "icon": 19578, - "name": "Adamant Javelin Heads", - "xp": 62.5 - }, - { - "level": 77, - "icon": 1161, - "name": "Adamant Full Helm", - "xp": 125 - }, - { - "level": 77, - "icon": 867, - "name": "Adamant Knife", - "xp": 62.5 - }, - { - "level": 78, - "icon": 1183, - "name": "Adamant Sq Shield", - "xp": 125 - }, - { - "level": 79, - "icon": 1345, - "name": "Adamant Warhammer", - "xp": 187.5 - }, - { - "level": 80, - "icon": 1371, - "name": "Adamant Battleaxe", - "xp": 187.5 - }, - { - "level": 81, - "icon": 1111, - "name": "Adamant Chainbody", - "xp": 187.5 - }, - { - "level": 82, - "icon": 1199, - "name": "Adamant Kiteshield", - "xp": 187.5 - }, - { - "level": 83, - "icon": 3100, - "name": "Adamant Claws", - "xp": 125 - }, - { - "level": 84, - "icon": 1317, - "name": "Adamant 2h Sword", - "xp": 187.5 - }, - { - "level": 85, - "icon": 2363, - "name": "Runite Bar", - "xp": 50 - }, - { - "level": 85, - "icon": 1213, - "name": "Rune Dagger", - "xp": 75 - }, - { - "level": 86, - "icon": 1359, - "name": "Rune Axe", - "xp": 75 - }, - { - "level": 86, - "icon": 1091, - "name": "Adamant Plateskirt", - "xp": 187.5 - }, - { - "level": 86, - "icon": 1073, - "name": "Adamant Platelegs", - "xp": 187.5 - }, - { - "level": 87, - "icon": 1432, - "name": "Rune Mace", - "xp": 75 - }, - { - "level": 88, - "icon": 9381, - "name": "Runite Bolts (Unf)", - "xp": 75 - }, - { - "level": 88, - "icon": 1147, - "name": "Rune Med Helm", - "xp": 75 - }, - { - "level": 88, - "icon": 1123, - "name": "Adamant Platebody", - "xp": 312.5 - }, - { - "level": 89, - "icon": 1289, - "name": "Rune Sword", - "xp": 75 - }, - { - "level": 89, - "icon": 4824, - "name": "Rune Nails", - "xp": 75 - }, - { - "level": 89, - "icon": 824, - "name": "Rune Dart Tip", - "xp": 75 - }, - { - "level": 90, - "icon": 44, - "name": "Rune Arrowtips", - "xp": 75 - }, - { - "level": 90, - "icon": 1333, - "name": "Rune Scimitar", - "xp": 150 - }, - { - "level": 90, - "icon": 11377, - "name": "Rune Hasta", - "xp": 150 - }, - { - "level": 90, - "icon": 1247, - "name": "Rune Spear", - "xp": 150 - }, - { - "level": 90, - "icon": 11283, - "name": "Dragonfire Shield", - "xp": 2000 - }, - { - "level": 91, - "icon": 1303, - "name": "Rune Longsword", - "xp": 150 - }, - { - "level": 91, - "icon": 19580, - "name": "Rune Javelin Heads", - "xp": 75 - }, - { - "level": 91, - "icon": 9431, - "name": "Runite Limbs", - "xp": 75 - }, - { - "level": 92, - "icon": 868, - "name": "Rune Knife", - "xp": 75 - }, - { - "level": 92, - "icon": 1163, - "name": "Rune Full Helm", - "xp": 150 - }, - { - "level": 93, - "icon": 1185, - "name": "Rune Sq Shield", - "xp": 150 - }, - { - "level": 94, - "icon": 1347, - "name": "Rune Warhammer", - "xp": 225 - }, - { - "level": 95, - "icon": 1373, - "name": "Rune Battleaxe", - "xp": 225 - }, - { - "level": 96, - "icon": 1113, - "name": "Rune Chainbody", - "xp": 225 - }, - { - "level": 97, - "icon": 1201, - "name": "Rune Kiteshield", - "xp": 225 - }, - { - "level": 98, - "icon": 3101, - "name": "Rune Claws", - "xp": 150 - }, - { - "level": 99, - "icon": 1127, - "name": "Rune Platebody", - "xp": 375 - }, - { - "level": 99, - "icon": 1093, - "name": "Rune Plateskirt", - "xp": 225 - }, - { - "level": 99, - "icon": 1079, - "name": "Rune Platelegs", - "xp": 225 - }, - { - "level": 99, - "icon": 1319, - "name": "Rune 2h Sword", - "xp": 225 - } - ] -} diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_thieving.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_thieving.json deleted file mode 100644 index f23248c568..0000000000 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_thieving.json +++ /dev/null @@ -1,268 +0,0 @@ -{ - "actions": [ - { - "level": 1, - "icon": 3241, - "name": "Man / Woman", - "xp": 8 - }, - { - "level": 1, - "icon": 10851, - "name": "Winter Sq'irkjuice", - "xp": 350 - }, - { - "level": 2, - "icon": 1965, - "name": "Vegetable Stall", - "xp": 10 - }, - { - "level": 5, - "icon": 1891, - "name": "Cake Stall", - "xp": 16 - }, - { - "level": 5, - "icon": 4242, - "name": "Tea Stall", - "xp": 16 - }, - { - "level": 5, - "icon": 5601, - "name": "Crafting Stall", - "xp": 16 - }, - { - "level": 5, - "icon": 1963, - "name": "Monkey Food Stall", - "xp": 16 - }, - { - "level": 10, - "icon": 3243, - "name": "Farmer", - "xp": 14.5 - }, - { - "level": 15, - "icon": 4295, - "name": "Female H.A.M. Member", - "xp": 18.5 - }, - { - "level": 20, - "icon": 950, - "name": "Silk Stall", - "xp": 24 - }, - { - "level": 20, - "icon": 4297, - "name": "Male H.A.M. Member", - "xp": 22.5 - }, - { - "level": 22, - "icon": 7919, - "name": "Wine Stall", - "xp": 27 - }, - { - "level": 25, - "icon": 3245, - "name": "Warrior Women / Al-Kharid Warrior", - "xp": 26 - }, - { - "level": 25, - "icon": 464, - "name": "Fruit Stall", - "xp": 28 - }, - { - "level": 25, - "icon": 10848, - "name": "Spring Sq'irkjuice", - "xp": 1350 - }, - { - "level": 27, - "icon": 5318, - "name": "Seed Stall", - "xp": 10 - }, - { - "level": 32, - "icon": 3247, - "name": "Rogue", - "xp": 35.5 - }, - { - "level": 35, - "icon": 958, - "name": "Fur Stall", - "xp": 36 - }, - { - "level": 36, - "icon": 10998, - "name": "Cave Goblin", - "xp": 40 - }, - { - "level": 38, - "icon": 5068, - "name": "Master Farmer", - "xp": 43 - }, - { - "level": 40, - "icon": 3249, - "name": "Guard", - "xp": 46.8 - }, - { - "level": 42, - "icon": 331, - "name": "Fish Stall", - "xp": 42 - }, - { - "level": 45, - "icon": 6782, - "name": "Bearded Pollnivnian Bandit", - "xp": 65 - }, - { - "level": 45, - "icon": 3686, - "name": "Fremennik Citizen", - "xp": 65 - }, - { - "level": 45, - "icon": 10850, - "name": "Autumn Sq'irkjuice", - "xp": 2350 - }, - { - "level": 49, - "icon": 837, - "name": "Crossbow Stall", - "xp": 52 - }, - { - "level": 50, - "icon": 2355, - "name": "Silver Stall", - "xp": 54 - }, - { - "level": 50, - "icon": 5560, - "name": "Wall Safe", - "xp": 70 - }, - { - "level": 53, - "icon": 4625, - "name": "Desert Bandit", - "xp": 79.5 - }, - { - "level": 55, - "icon": 3251, - "name": "Knight", - "xp": 84.3 - }, - { - "level": 55, - "icon": 6781, - "name": "Pollnivnian Bandit", - "xp": 84.3 - }, - { - "level": 65, - "icon": 6422, - "name": "Magic Stall", - "xp": 100 - }, - { - "level": 65, - "icon": 1325, - "name": "Scimitar Stall", - "xp": 100 - }, - { - "level": 65, - "icon": 6780, - "name": "Menaphite Thug", - "xp": 137.5 - }, - { - "level": 65, - "icon": 2007, - "name": "Spices Stall", - "xp": 81 - }, - { - "level": 65, - "icon": 3253, - "name": "Yanille Watchman", - "xp": 137.5 - }, - { - "level": 65, - "icon": 10849, - "name": "Summer Sq'irkjuice", - "xp": 3000 - }, - { - "level": 70, - "icon": 3255, - "name": "Paladin", - "xp": 151.8 - }, - { - "level": 75, - "icon": 3257, - "name": "Gnome", - "xp": 198.5 - }, - { - "level": 75, - "icon": 1607, - "name": "Gems Stall", - "xp": 160 - }, - { - "level": 80, - "icon": 3259, - "name": "Hero", - "xp": 275 - }, - { - "level": 82, - "icon": 24702, - "name": "Vyre", - "xp": 306.9 - }, - { - "level": 85, - "icon": 6105, - "name": "Elf", - "xp": 353 - }, - { - "level": 90, - "icon": 21278, - "name": "TzHaar-Hur", - "xp": 103.4 - } - ] -} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_woodcutting.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_woodcutting.json deleted file mode 100644 index 8a72413c99..0000000000 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_woodcutting.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "bonuses": [ - { "name": "Lumberjack Outfit (+2.5%)", "value": 0.025 } - ], - "actions": [ - { - "level": 1, - "icon": 1511, - "name": "Logs", - "xp": 25 - }, - { - "level": 1, - "icon": 2862, - "name": "Achey Tree Logs", - "xp": 25 - }, - { - "level": 15, - "icon": 1521, - "name": "Oak Logs", - "xp": 37.5 - }, - { - "level": 30, - "icon": 1519, - "name": "Willow Logs", - "xp": 67.5 - }, - { - "level": 35, - "icon": 6333, - "name": "Teak Logs", - "xp": 85 - }, - { - "level": 45, - "icon": 3239, - "name": "Bark", - "xp": 82.5 - }, - { - "level": 45, - "icon": 1517, - "name": "Maple Logs", - "xp": 100 - }, - { - "level": 50, - "icon": 6332, - "name": "Mahogany Logs", - "xp": 125 - }, - { - "level": 54, - "icon": 10810, - "name": "Arctic Pine Logs", - "xp": 40 - }, - { - "level": 60, - "icon": 1515, - "name": "Yew Logs", - "xp": 175 - }, - { - "level": 62, - "icon": 24691, - "name": "Blisterwood Logs", - "xp": 76 - }, - { - "level": 65, - "icon": 21626, - "name": "Sulliusceps", - "xp": 127 - }, - { - "level": 75, - "icon": 1513, - "name": "Magic Logs", - "xp": 250 - }, - { - "level": 90, - "icon": 19669, - "name": "Redwood Logs", - "xp": 380 - } - ] -} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CacheSkillData.java b/runelite-client/src/test/java/net/runelite/client/plugins/skillcalculator/CalculatorTypeTest.java similarity index 61% rename from runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CacheSkillData.java rename to runelite-client/src/test/java/net/runelite/client/plugins/skillcalculator/CalculatorTypeTest.java index 4959390271..df5ee04041 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CacheSkillData.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/skillcalculator/CalculatorTypeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Kruithne + * Copyright (c) 2021, Jordan Atwood * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,36 +24,28 @@ */ package net.runelite.client.plugins.skillcalculator; -import com.google.gson.Gson; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.Map; -import net.runelite.client.plugins.skillcalculator.beans.SkillData; +import net.runelite.client.plugins.skillcalculator.skills.SkillAction; +import static org.junit.Assert.fail; +import org.junit.Test; -class CacheSkillData +public class CalculatorTypeTest { - private final Map cache = new HashMap<>(); - - SkillData getSkillData(String dataFile) + @Test + public void skillActionsInLevelOrder() { - if (cache.containsKey(dataFile)) + for (final CalculatorType calculatorType : CalculatorType.values()) { - return cache.get(dataFile); - } + int level = 1; - try (InputStream skillDataFile = SkillCalculatorPlugin.class.getResourceAsStream(dataFile)) - { - SkillData skillData = new Gson().fromJson(new InputStreamReader(skillDataFile, StandardCharsets.UTF_8), SkillData.class); + for (final SkillAction skillAction : calculatorType.getSkillActions()) + { + if (skillAction.getLevel() < level) + { + fail("Skill action " + skillAction + " is out of order for " + calculatorType.getSkill().getName()); + } - cache.put(dataFile, skillData); - return skillData; - } - catch (IOException e) - { - throw new RuntimeException(e); + level = skillAction.getLevel(); + } } } -} \ No newline at end of file +} From ac8f778307d80903b6b580595fb97b6e746ec4ff Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Thu, 9 Sep 2021 23:36:28 -0700 Subject: [PATCH 43/77] skill calculator: Add ItemSkillAction interface This interface allows for drastically simplified skill actions, allowing us to eschew their name entries in favor of looking up the item name using the items' compositions (fetched from their IDs) at runtime. --- .../skillcalculator/SkillCalculator.java | 9 +- .../skillcalculator/SkillCalculatorPanel.java | 5 +- .../SkillCalculatorPlugin.java | 6 +- .../plugins/skillcalculator/UIActionSlot.java | 17 +- .../skillcalculator/skills/AgilityAction.java | 2 +- .../skills/ConstructionAction.java | 2 +- .../skillcalculator/skills/CookingAction.java | 251 ++++++------ .../skills/CraftingAction.java | 273 +++++++------ .../skillcalculator/skills/FarmingAction.java | 2 +- .../skills/FiremakingAction.java | 29 +- .../skillcalculator/skills/FishingAction.java | 73 ++-- .../skills/FletchingAction.java | 201 +++++----- .../skills/HerbloreAction.java | 149 ++++--- .../skillcalculator/skills/HunterAction.java | 2 +- .../skills/ItemSkillAction.java | 67 ++++ .../skillcalculator/skills/MagicAction.java | 7 + .../skillcalculator/skills/MiningAction.java | 2 +- .../skills/NamedSkillAction.java | 46 +++ .../skillcalculator/skills/PrayerAction.java | 121 +++--- .../skills/RunecraftAction.java | 77 ++-- .../skillcalculator/skills/SkillAction.java | 9 +- .../skills/SmithingAction.java | 367 +++++++++--------- .../skills/ThievingAction.java | 2 +- .../skills/WoodcuttingAction.java | 2 +- 24 files changed, 928 insertions(+), 793 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ItemSkillAction.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/NamedSkillAction.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java index 736d7b3fab..5bc35696ca 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java @@ -48,6 +48,7 @@ import net.runelite.api.Client; import net.runelite.api.Experience; import net.runelite.api.Skill; import net.runelite.api.VarPlayer; +import net.runelite.client.callback.ClientThread; import net.runelite.client.game.ItemManager; import net.runelite.client.game.SpriteManager; import net.runelite.client.plugins.skillcalculator.skills.SkillAction; @@ -65,6 +66,7 @@ class SkillCalculator extends JPanel private final UICalculatorInputArea uiInput; private final Client client; + private final ClientThread clientThread; private final SpriteManager spriteManager; private final ItemManager itemManager; private final List uiActionSlots = new ArrayList<>(); @@ -80,9 +82,10 @@ class SkillCalculator extends JPanel private int targetXP = Experience.getXpForLevel(targetLevel); private float xpFactor = 1; - SkillCalculator(Client client, UICalculatorInputArea uiInput, SpriteManager spriteManager, ItemManager itemManager) + SkillCalculator(Client client, ClientThread clientThread, UICalculatorInputArea uiInput, SpriteManager spriteManager, ItemManager itemManager) { this.client = client; + this.clientThread = clientThread; this.uiInput = uiInput; this.spriteManager = spriteManager; this.itemManager = itemManager; @@ -303,7 +306,7 @@ class SkillCalculator extends JPanel spriteManager.addSpriteTo(uiIcon, action.getSprite(), 0); } - UIActionSlot slot = new UIActionSlot(action, uiIcon); + UIActionSlot slot = new UIActionSlot(action, clientThread, itemManager, uiIcon); uiActionSlots.add(slot); // Keep our own reference. add(slot); // Add component to the panel. @@ -448,7 +451,7 @@ class SkillCalculator extends JPanel private static boolean slotContainsText(UIActionSlot slot, String text) { - return slot.getAction().getName().toLowerCase().contains(text.toLowerCase()); + return slot.getActionName().toLowerCase().contains(text.toLowerCase()); } private static FocusAdapter buildFocusAdapter(Consumer focusLostConsumer) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPanel.java index 6c2f97f57c..82d4f59648 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPanel.java @@ -32,6 +32,7 @@ import javax.swing.ImageIcon; import javax.swing.JScrollPane; import javax.swing.border.EmptyBorder; import net.runelite.api.Client; +import net.runelite.client.callback.ClientThread; import net.runelite.client.game.ItemManager; import net.runelite.client.game.SkillIconManager; import net.runelite.client.game.SpriteManager; @@ -46,7 +47,7 @@ class SkillCalculatorPanel extends PluginPanel private final SkillIconManager iconManager; private final MaterialTabGroup tabGroup; - SkillCalculatorPanel(SkillIconManager iconManager, Client client, SpriteManager spriteManager, ItemManager itemManager) + SkillCalculatorPanel(SkillIconManager iconManager, Client client, ClientThread clientThread, SpriteManager spriteManager, ItemManager itemManager) { super(); getScrollPane().setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); @@ -70,7 +71,7 @@ class SkillCalculatorPanel extends PluginPanel final UICalculatorInputArea uiInput = new UICalculatorInputArea(); uiInput.setBorder(new EmptyBorder(15, 0, 15, 0)); uiInput.setBackground(ColorScheme.DARK_GRAY_COLOR); - uiCalculator = new SkillCalculator(client, uiInput, spriteManager, itemManager); + uiCalculator = new SkillCalculator(client, clientThread, uiInput, spriteManager, itemManager); add(tabGroup, c); c.gridy++; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java index b62f688576..1aab06820f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java @@ -27,6 +27,7 @@ package net.runelite.client.plugins.skillcalculator; import java.awt.image.BufferedImage; import javax.inject.Inject; import net.runelite.api.Client; +import net.runelite.client.callback.ClientThread; import net.runelite.client.game.ItemManager; import net.runelite.client.game.SkillIconManager; import net.runelite.client.game.SpriteManager; @@ -46,6 +47,9 @@ public class SkillCalculatorPlugin extends Plugin @Inject private Client client; + @Inject + private ClientThread clientThread; + @Inject private SkillIconManager skillIconManager; @@ -64,7 +68,7 @@ public class SkillCalculatorPlugin extends Plugin protected void startUp() throws Exception { final BufferedImage icon = ImageUtil.loadImageResource(getClass(), "calc.png"); - final SkillCalculatorPanel uiPanel = new SkillCalculatorPanel(skillIconManager, client, spriteManager, itemManager); + final SkillCalculatorPanel uiPanel = new SkillCalculatorPanel(skillIconManager, client, clientThread, spriteManager, itemManager); uiNavigationButton = NavigationButton.builder() .tooltip("Skill Calculator") diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java index c005d42f90..aa2fd23937 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java @@ -35,12 +35,15 @@ import java.awt.event.MouseListener; import javax.swing.BorderFactory; import javax.swing.JLabel; import javax.swing.JPanel; +import javax.swing.SwingUtilities; import javax.swing.border.Border; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; +import net.runelite.client.callback.ClientThread; +import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.skillcalculator.skills.SkillAction; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.FontManager; @@ -64,8 +67,11 @@ class UIActionSlot extends JPanel @Getter(AccessLevel.PACKAGE) private final SkillAction action; - private final JShadowedLabel uiLabelActions; + @Getter(AccessLevel.PACKAGE) + private String actionName; + + private final JShadowedLabel uiLabelActions; private final JPanel uiInfo; @Getter(AccessLevel.PACKAGE) @@ -81,7 +87,7 @@ class UIActionSlot extends JPanel @Setter(AccessLevel.PACKAGE) private double value; - UIActionSlot(SkillAction action, JLabel uiIcon) + UIActionSlot(SkillAction action, ClientThread clientThread, ItemManager itemManager, JLabel uiIcon) { this.action = action; @@ -120,7 +126,12 @@ class UIActionSlot extends JPanel uiInfo.setBackground(ColorScheme.DARKER_GRAY_COLOR); uiInfo.setBorder(new EmptyBorder(0, 5, 0, 0)); - JShadowedLabel uiLabelName = new JShadowedLabel(action.getName()); + JShadowedLabel uiLabelName = new JShadowedLabel(); + clientThread.invokeLater(() -> + { + actionName = action.getName(itemManager); + SwingUtilities.invokeLater(() -> uiLabelName.setText(actionName)); + }); uiLabelName.setForeground(Color.WHITE); uiLabelActions = new JShadowedLabel("Unknown"); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/AgilityAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/AgilityAction.java index d62285d548..3edef73f70 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/AgilityAction.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/AgilityAction.java @@ -30,7 +30,7 @@ import net.runelite.api.ItemID; @AllArgsConstructor @Getter -public enum AgilityAction implements SkillAction +public enum AgilityAction implements NamedSkillAction { GNOME_STRONGHOLD_COURSE("Gnome Stronghold", 1, 86.5f, ItemID.SWAMP_TOAD), SHAYZIEN_BASIC_COURSE("Shayzien Basic Course", 5, 133.2f, ItemID.SHAYZIEN_HELM_1), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ConstructionAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ConstructionAction.java index 01b1148909..ed0e0c65b2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ConstructionAction.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ConstructionAction.java @@ -30,7 +30,7 @@ import net.runelite.api.ItemID; @AllArgsConstructor @Getter -public enum ConstructionAction implements SkillAction +public enum ConstructionAction implements NamedSkillAction { EXIT_PORTAL("Exit Portal", 1, 100, ItemID.EXIT_PORTAL), PLANK("Plank", 1, 29, ItemID.PLANK), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CookingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CookingAction.java index 3a9b2a208f..7a6c09cc4c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CookingAction.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CookingAction.java @@ -30,135 +30,134 @@ import net.runelite.api.ItemID; @AllArgsConstructor @Getter -public enum CookingAction implements SkillAction +public enum CookingAction implements ItemSkillAction { - SINEW("Sinew", 1, 3, ItemID.SINEW), - SHRIMPS("Shrimps", 1, 30, ItemID.SHRIMPS), - COOKED_CHICKEN("Cooked chicken", 1, 30, ItemID.COOKED_CHICKEN), - COOKED_MEAT("Cooked meat", 1, 30, ItemID.COOKED_MEAT), - COOKED_RABBIT("Cooked rabbit", 1, 30, ItemID.COOKED_RABBIT), - ANCHOVIES("Anchovies", 1, 30, ItemID.ANCHOVIES), - SARDINE("Sardine", 1, 40, ItemID.SARDINE), - POISON_KARAMBWAN("Poison karambwan", 1, 80, ItemID.POISON_KARAMBWAN), - UGTHANKI_MEAT("Ugthanki meat", 1, 40, ItemID.UGTHANKI_MEAT), - BREAD("Bread", 1, 40, ItemID.BREAD), - HERRING("Herring", 5, 50, ItemID.HERRING), - FRUIT_BLAST("Fruit blast", 6, 50, ItemID.FRUIT_BLAST), - BAKED_POTATO("Baked potato", 7, 15, ItemID.BAKED_POTATO), - GUPPY("Guppy", 7, 12, ItemID.GUPPY), - PINEAPPLE_PUNCH("Pineapple punch", 8, 70, ItemID.PINEAPPLE_PUNCH), - SPICY_SAUCE("Spicy sauce", 9, 25, ItemID.SPICY_SAUCE), - MACKEREL("Mackerel", 10, 60, ItemID.MACKEREL), - REDBERRY_PIE("Redberry pie", 10, 78, ItemID.REDBERRY_PIE), - TOAD_CRUNCHIES("Toad crunchies", 10, 100, ItemID.TOAD_CRUNCHIES), - CHILLI_CON_CARNE("Chilli con carne", 11, 55, ItemID.CHILLI_CON_CARNE), - ROAST_BIRD_MEAT("Roast bird meat", 11, 62.5f, ItemID.ROAST_BIRD_MEAT), - THIN_SNAIL_MEAT("Thin snail meat", 12, 70, ItemID.THIN_SNAIL_MEAT), - SPICY_CRUNCHIES("Spicy crunchies", 12, 100, ItemID.SPICY_CRUNCHIES), - SCRAMBLED_EGG("Scrambled egg", 13, 50, ItemID.SCRAMBLED_EGG), - CIDER("Cider", 14, 182, ItemID.CIDER), - WORM_CRUNCHIES("Worm crunchies", 14, 104, ItemID.WORM_CRUNCHIES), - TROUT("Trout", 15, 70, ItemID.TROUT), - SPIDER_ON_STICK("Spider on stick", 16, 80, ItemID.SPIDER_ON_STICK), - SPIDER_ON_SHAFT("Spider on shaft", 16, 80, ItemID.SPIDER_ON_SHAFT), - ROAST_RABBIT("Roast rabbit", 16, 72.5f, ItemID.ROAST_RABBIT), - CHOCCHIP_CRUNCHIES("Chocchip crunchies", 16, 100, ItemID.CHOCCHIP_CRUNCHIES), - LEAN_SNAIL_MEAT("Lean snail meat", 17, 80, ItemID.LEAN_SNAIL_MEAT), - COD("Cod", 18, 75, ItemID.COD), - WIZARD_BLIZZARD("Wizard blizzard", 18, 110, ItemID.WIZARD_BLIZZARD), - DWARVEN_STOUT("Dwarven stout", 19, 215, ItemID.DWARVEN_STOUT), - SHORT_GREEN_GUY("Short green guy", 20, 120, ItemID.SHORT_GREEN_GUY), - MEAT_PIE("Meat pie", 20, 110, ItemID.MEAT_PIE), - PIKE("Pike", 20, 80, ItemID.PIKE), - CUP_OF_TEA("Cup of tea", 20, 52, ItemID.CUP_OF_TEA), - CAVEFISH("Cavefish", 20, 23, ItemID.CAVEFISH), - ROAST_BEAST_MEAT("Roast beast meat", 21, 82.5f, ItemID.ROAST_BEAST_MEAT), - COOKED_CRAB_MEAT("Cooked crab meat", 21, 100, ItemID.COOKED_CRAB_MEAT), - POT_OF_CREAM("Pot of cream", 21, 18, ItemID.POT_OF_CREAM), - FAT_SNAIL_MEAT("Fat snail meat", 22, 95, ItemID.FAT_SNAIL_MEAT), - EGG_AND_TOMATO("Egg and tomato", 23, 50, ItemID.EGG_AND_TOMATO), - ASGARNIAN_ALE("Asgarnian ale", 24, 248, ItemID.ASGARNIAN_ALE), - SALMON("Salmon", 25, 90, ItemID.SALMON), - STEW("Stew", 25, 117, ItemID.STEW), - FRUIT_BATTA("Fruit batta", 25, 150, ItemID.FRUIT_BATTA), - TOAD_BATTA("Toad batta", 26, 152, ItemID.TOAD_BATTA), - WORM_BATTA("Worm batta", 27, 154, ItemID.WORM_BATTA), - VEGETABLE_BATTA("Vegetable batta", 28, 156, ItemID.VEGETABLE_BATTA), - SWEETCORN("Sweetcorn", 28, 104, ItemID.COOKED_SWEETCORN), - COOKED_SLIMY_EEL("Cooked slimy eel", 28, 95, ItemID.COOKED_SLIMY_EEL), - MUD_PIE("Mud pie", 29, 128, ItemID.MUD_PIE), - GREENMANS_ALE("Greenman's ale", 29, 281, ItemID.GREENMANS_ALE), - CHEESE_AND_TOMATO_BATTA("Cheese and tomato Batta", 29, 158, ItemID.CHEESETOM_BATTA), - TUNA("Tuna", 30, 100, ItemID.TUNA), - APPLE_PIE("Apple pie", 30, 130, ItemID.APPLE_PIE), - WORM_HOLE("Worm hole", 30, 170, ItemID.WORM_HOLE), - COOKED_KARAMBWAN("Cooked karambwan", 30, 190, ItemID.COOKED_KARAMBWAN), - ROASTED_CHOMPY("Roasted chompy", 30, 100, ItemID.COOKED_CHOMPY), - FISHCAKE("Fishcake", 31, 100, ItemID.COOKED_FISHCAKE), - DRUNK_DRAGON("Drunk dragon", 32, 160, ItemID.DRUNK_DRAGON), - CHOC_SATURDAY("Choc saturday", 33, 170, ItemID.CHOC_SATURDAY), - TETRA("Tetra", 33, 31, ItemID.TETRA), - GARDEN_PIE("Garden pie", 34, 138, ItemID.GARDEN_PIE), - WIZARDS_MIND_BOMB("Wizard's mind bomb", 34, 314, ItemID.WIZARDS_MIND_BOMB), - JUG_OF_WINE("Jug of wine", 35, 200, ItemID.JUG_OF_WINE), - PLAIN_PIZZA("Plain pizza", 35, 143, ItemID.PLAIN_PIZZA), - RAINBOW_FISH("Rainbow fish", 35, 110, ItemID.RAINBOW_FISH), - VEG_BALL("Veg ball", 35, 175, ItemID.VEG_BALL), - BLURBERRY_SPECIAL("Blurberry special", 37, 180, ItemID.BLURBERRY_SPECIAL), - CAVE_EEL("Cave eel", 38, 115, ItemID.CAVE_EEL), - PAT_OF_BUTTER("Pat of butter", 38, 40.5f, ItemID.PAT_OF_BUTTER), - DRAGON_BITTER("Dragon bitter", 39, 347, ItemID.DRAGON_BITTER), - POTATO_WITH_BUTTER("Potato with butter", 39, 40, ItemID.POTATO_WITH_BUTTER), - LOBSTER("Lobster", 40, 120, ItemID.LOBSTER), - CAKE("Cake", 40, 180, ItemID.CAKE), - TANGLED_TOADS_LEGS("Tangled toad's legs", 40, 185, ItemID.TANGLED_TOADS_LEGS), - CHILLI_POTATO("Chilli potato", 41, 165.5f, ItemID.CHILLI_POTATO), - COOKED_JUBBLY("Cooked jubbly", 41, 160, ItemID.COOKED_JUBBLY), - CHOCOLATE_BOMB("Chocolate bomb", 42, 190, ItemID.CHOCOLATE_BOMB), - FRIED_ONIONS("Fried onions", 42, 60, ItemID.FRIED_ONIONS), - BASS("Bass", 43, 130, ItemID.BASS), - MOONLIGHT_MEAD("Moonlight mead", 44, 380, ItemID.MOONLIGHT_MEAD), - SWORDFISH("Swordfish", 45, 140, ItemID.SWORDFISH), - MEAT_PIZZA("Meat pizza", 45, 169, ItemID.MEAT_PIZZA), - FRIED_MUSHROOMS("Fried mushrooms", 46, 60, ItemID.FRIED_MUSHROOMS), - CATFISH("Catfish", 46, 43, ItemID.CATFISH), - FISH_PIE("Fish pie", 47, 164, ItemID.FISH_PIE), - POTATO_WITH_CHEESE("Potato with cheese", 47, 40, ItemID.POTATO_WITH_CHEESE), - CHEESE("Cheese", 48, 64, ItemID.CHEESE), - AXEMANS_FOLLY("Axeman's folly", 49, 413, ItemID.AXEMANS_FOLLY), - COOKED_OOMLIE_WRAP("Cooked oomlie wrap", 50, 30, ItemID.COOKED_OOMLIE_WRAP), - CHOCOLATE_CAKE("Chocolate cake", 50, 210, ItemID.CHOCOLATE_CAKE), - EGG_POTATO("Egg potato", 51, 195.5f, ItemID.EGG_POTATO), - BOTANICAL_PIE("Botanical pie", 52, 180, ItemID.BOTANICAL_PIE), - LAVA_EEL("Lava eel", 53, 30, ItemID.LAVA_EEL), - CHEFS_DELIGHT("Chef's Delight", 54, 446, ItemID.CHEFS_DELIGHT), - ANCHOVY_PIZZA("Anchovy pizza", 55, 182, ItemID.ANCHOVY_PIZZA), - MUSHROOM_AND_ONION("Mushroom & onion", 57, 120, ItemID.MUSHROOM__ONION), - UGTHANKI_KEBAB_FRESH("Ugthanki kebab (Fresh)", 58, 80, ItemID.UGTHANKI_KEBAB), - PITTA_BREAD("Pitta bread", 58, 40, ItemID.PITTA_BREAD), - SLAYERS_RESPITE("Slayer's respite", 59, 479, ItemID.SLAYERS_RESPITE), - CURRY("Curry", 60, 280, ItemID.CURRY), - MUSHROOM_PIE("Mushroom pie", 60, 200, ItemID.MUSHROOM_PIE), - MONKFISH("Monkfish", 62, 150, ItemID.MONKFISH), - MUSHROOM_POTATO("Mushroom potato", 64, 270.5f, ItemID.MUSHROOM_POTATO), - PINEAPPLE_PIZZA("Pineapple pizza", 65, 188, ItemID.PINEAPPLE_PIZZA), - WINE_OF_ZAMORAK("Wine of zamorak", 65, 200, ItemID.WINE_OF_ZAMORAK), - TUNA_AND_CORN("Tuna and corn", 67, 204, ItemID.TUNA_AND_CORN), - TUNA_POTATO("Tuna potato", 68, 309.5f, ItemID.TUNA_POTATO), - ADMIRAL_PIE("Admiral pie", 70, 210, ItemID.ADMIRAL_PIE), - SACRED_EEL("Sacred eel", 72, 109, ItemID.SACRED_EEL), - DRAGONFRUIT_PIE("Dragonfruit pie", 73, 220, ItemID.DRAGONFRUIT_PIE), - SHARK("Shark", 80, 210, ItemID.SHARK), - SEA_TURTLE("Sea turtle", 82, 211.3f, ItemID.SEA_TURTLE), - ANGLERFISH("Anglerfish", 84, 230, ItemID.ANGLERFISH), - WILD_PIE("Wild pie", 85, 240, ItemID.WILD_PIE), - DARK_CRAB("Dark crab", 90, 215, ItemID.DARK_CRAB), - MANTA_RAY("Manta ray", 91, 216.3f, ItemID.MANTA_RAY), - SUMMER_PIE("Summer pie", 95, 260, ItemID.SUMMER_PIE), + SINEW(ItemID.SINEW, 1, 3), + SHRIMPS(ItemID.SHRIMPS, 1, 30), + COOKED_CHICKEN(ItemID.COOKED_CHICKEN, 1, 30), + COOKED_MEAT(ItemID.COOKED_MEAT, 1, 30), + COOKED_RABBIT(ItemID.COOKED_RABBIT, 1, 30), + ANCHOVIES(ItemID.ANCHOVIES, 1, 30), + SARDINE(ItemID.SARDINE, 1, 40), + POISON_KARAMBWAN(ItemID.POISON_KARAMBWAN, 1, 80), + UGTHANKI_MEAT(ItemID.UGTHANKI_MEAT, 1, 40), + BREAD(ItemID.BREAD, 1, 40), + HERRING(ItemID.HERRING, 5, 50), + FRUIT_BLAST(ItemID.FRUIT_BLAST, 6, 50), + BAKED_POTATO(ItemID.BAKED_POTATO, 7, 15), + GUPPY(ItemID.GUPPY, 7, 12), + PINEAPPLE_PUNCH(ItemID.PINEAPPLE_PUNCH, 8, 70), + SPICY_SAUCE(ItemID.SPICY_SAUCE, 9, 25), + MACKEREL(ItemID.MACKEREL, 10, 60), + REDBERRY_PIE(ItemID.REDBERRY_PIE, 10, 78), + TOAD_CRUNCHIES(ItemID.TOAD_CRUNCHIES, 10, 100), + CHILLI_CON_CARNE(ItemID.CHILLI_CON_CARNE, 11, 55), + ROAST_BIRD_MEAT(ItemID.ROAST_BIRD_MEAT, 11, 62.5f), + THIN_SNAIL_MEAT(ItemID.THIN_SNAIL_MEAT, 12, 70), + SPICY_CRUNCHIES(ItemID.SPICY_CRUNCHIES, 12, 100), + SCRAMBLED_EGG(ItemID.SCRAMBLED_EGG, 13, 50), + CIDER(ItemID.CIDER, 14, 182), + WORM_CRUNCHIES(ItemID.WORM_CRUNCHIES, 14, 104), + TROUT(ItemID.TROUT, 15, 70), + SPIDER_ON_STICK(ItemID.SPIDER_ON_STICK, 16, 80), + SPIDER_ON_SHAFT(ItemID.SPIDER_ON_SHAFT, 16, 80), + ROAST_RABBIT(ItemID.ROAST_RABBIT, 16, 72.5f), + CHOCCHIP_CRUNCHIES(ItemID.CHOCCHIP_CRUNCHIES, 16, 100), + LEAN_SNAIL_MEAT(ItemID.LEAN_SNAIL_MEAT, 17, 80), + COD(ItemID.COD, 18, 75), + WIZARD_BLIZZARD(ItemID.WIZARD_BLIZZARD, 18, 110), + DWARVEN_STOUT(ItemID.DWARVEN_STOUT, 19, 215), + SHORT_GREEN_GUY(ItemID.SHORT_GREEN_GUY, 20, 120), + MEAT_PIE(ItemID.MEAT_PIE, 20, 110), + PIKE(ItemID.PIKE, 20, 80), + CUP_OF_TEA(ItemID.CUP_OF_TEA, 20, 52), + CAVEFISH(ItemID.CAVEFISH, 20, 23), + ROAST_BEAST_MEAT(ItemID.ROAST_BEAST_MEAT, 21, 82.5f), + COOKED_CRAB_MEAT(ItemID.COOKED_CRAB_MEAT, 21, 100), + POT_OF_CREAM(ItemID.POT_OF_CREAM, 21, 18), + FAT_SNAIL_MEAT(ItemID.FAT_SNAIL_MEAT, 22, 95), + EGG_AND_TOMATO(ItemID.EGG_AND_TOMATO, 23, 50), + ASGARNIAN_ALE(ItemID.ASGARNIAN_ALE, 24, 248), + SALMON(ItemID.SALMON, 25, 90), + STEW(ItemID.STEW, 25, 117), + FRUIT_BATTA(ItemID.FRUIT_BATTA, 25, 150), + TOAD_BATTA(ItemID.TOAD_BATTA, 26, 152), + WORM_BATTA(ItemID.WORM_BATTA, 27, 154), + VEGETABLE_BATTA(ItemID.VEGETABLE_BATTA, 28, 156), + SWEETCORN(ItemID.COOKED_SWEETCORN, 28, 104), + COOKED_SLIMY_EEL(ItemID.COOKED_SLIMY_EEL, 28, 95), + MUD_PIE(ItemID.MUD_PIE, 29, 128), + GREENMANS_ALE(ItemID.GREENMANS_ALE, 29, 281), + CHEESE_AND_TOMATO_BATTA(ItemID.CHEESETOM_BATTA, 29, 158), + TUNA(ItemID.TUNA, 30, 100), + APPLE_PIE(ItemID.APPLE_PIE, 30, 130), + WORM_HOLE(ItemID.WORM_HOLE, 30, 170), + COOKED_KARAMBWAN(ItemID.COOKED_KARAMBWAN, 30, 190), + ROASTED_CHOMPY(ItemID.COOKED_CHOMPY, 30, 100), + FISHCAKE(ItemID.COOKED_FISHCAKE, 31, 100), + DRUNK_DRAGON(ItemID.DRUNK_DRAGON, 32, 160), + CHOC_SATURDAY(ItemID.CHOC_SATURDAY, 33, 170), + TETRA(ItemID.TETRA, 33, 31), + GARDEN_PIE(ItemID.GARDEN_PIE, 34, 138), + WIZARDS_MIND_BOMB(ItemID.WIZARDS_MIND_BOMB, 34, 314), + JUG_OF_WINE(ItemID.JUG_OF_WINE, 35, 200), + PLAIN_PIZZA(ItemID.PLAIN_PIZZA, 35, 143), + RAINBOW_FISH(ItemID.RAINBOW_FISH, 35, 110), + VEG_BALL(ItemID.VEG_BALL, 35, 175), + BLURBERRY_SPECIAL(ItemID.BLURBERRY_SPECIAL, 37, 180), + CAVE_EEL(ItemID.CAVE_EEL, 38, 115), + PAT_OF_BUTTER(ItemID.PAT_OF_BUTTER, 38, 40.5f), + DRAGON_BITTER(ItemID.DRAGON_BITTER, 39, 347), + POTATO_WITH_BUTTER(ItemID.POTATO_WITH_BUTTER, 39, 40), + LOBSTER(ItemID.LOBSTER, 40, 120), + CAKE(ItemID.CAKE, 40, 180), + TANGLED_TOADS_LEGS(ItemID.TANGLED_TOADS_LEGS, 40, 185), + CHILLI_POTATO(ItemID.CHILLI_POTATO, 41, 165.5f), + COOKED_JUBBLY(ItemID.COOKED_JUBBLY, 41, 160), + CHOCOLATE_BOMB(ItemID.CHOCOLATE_BOMB, 42, 190), + FRIED_ONIONS(ItemID.FRIED_ONIONS, 42, 60), + BASS(ItemID.BASS, 43, 130), + MOONLIGHT_MEAD(ItemID.MOONLIGHT_MEAD, 44, 380), + SWORDFISH(ItemID.SWORDFISH, 45, 140), + MEAT_PIZZA(ItemID.MEAT_PIZZA, 45, 169), + FRIED_MUSHROOMS(ItemID.FRIED_MUSHROOMS, 46, 60), + CATFISH(ItemID.CATFISH, 46, 43), + FISH_PIE(ItemID.FISH_PIE, 47, 164), + POTATO_WITH_CHEESE(ItemID.POTATO_WITH_CHEESE, 47, 40), + CHEESE(ItemID.CHEESE, 48, 64), + AXEMANS_FOLLY(ItemID.AXEMANS_FOLLY, 49, 413), + COOKED_OOMLIE_WRAP(ItemID.COOKED_OOMLIE_WRAP, 50, 30), + CHOCOLATE_CAKE(ItemID.CHOCOLATE_CAKE, 50, 210), + EGG_POTATO(ItemID.EGG_POTATO, 51, 195.5f), + BOTANICAL_PIE(ItemID.BOTANICAL_PIE, 52, 180), + LAVA_EEL(ItemID.LAVA_EEL, 53, 30), + CHEFS_DELIGHT(ItemID.CHEFS_DELIGHT, 54, 446), + ANCHOVY_PIZZA(ItemID.ANCHOVY_PIZZA, 55, 182), + MUSHROOM_AND_ONION(ItemID.MUSHROOM__ONION, 57, 120), + UGTHANKI_KEBAB_FRESH(ItemID.UGTHANKI_KEBAB, 58, 80), + PITTA_BREAD(ItemID.PITTA_BREAD, 58, 40), + SLAYERS_RESPITE(ItemID.SLAYERS_RESPITE, 59, 479), + CURRY(ItemID.CURRY, 60, 280), + MUSHROOM_PIE(ItemID.MUSHROOM_PIE, 60, 200), + MONKFISH(ItemID.MONKFISH, 62, 150), + MUSHROOM_POTATO(ItemID.MUSHROOM_POTATO, 64, 270.5f), + PINEAPPLE_PIZZA(ItemID.PINEAPPLE_PIZZA, 65, 188), + WINE_OF_ZAMORAK(ItemID.WINE_OF_ZAMORAK, 65, 200), + TUNA_AND_CORN(ItemID.TUNA_AND_CORN, 67, 204), + TUNA_POTATO(ItemID.TUNA_POTATO, 68, 309.5f), + ADMIRAL_PIE(ItemID.ADMIRAL_PIE, 70, 210), + SACRED_EEL(ItemID.SACRED_EEL, 72, 109), + DRAGONFRUIT_PIE(ItemID.DRAGONFRUIT_PIE, 73, 220), + SHARK(ItemID.SHARK, 80, 210), + SEA_TURTLE(ItemID.SEA_TURTLE, 82, 211.3f), + ANGLERFISH(ItemID.ANGLERFISH, 84, 230), + WILD_PIE(ItemID.WILD_PIE, 85, 240), + DARK_CRAB(ItemID.DARK_CRAB, 90, 215), + MANTA_RAY(ItemID.MANTA_RAY, 91, 216.3f), + SUMMER_PIE(ItemID.SUMMER_PIE, 95, 260), ; - private final String name; + private final int itemId; private final int level; private final float xp; - private final int icon; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CraftingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CraftingAction.java index 26d5ecf040..c7c8720508 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CraftingAction.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CraftingAction.java @@ -30,146 +30,145 @@ import net.runelite.api.ItemID; @AllArgsConstructor @Getter -public enum CraftingAction implements SkillAction +public enum CraftingAction implements ItemSkillAction { - BALL_OF_WOOL("Ball of wool", 1, 2.5f, ItemID.BALL_OF_WOOL), - UNFIRED_POT("Unfired pot", 1, 6.3f, ItemID.UNFIRED_POT), - POT("Pot", 1, 6.3f, ItemID.POT), - LEATHER_GLOVES("Leather gloves", 1, 13.8f, ItemID.LEATHER_GLOVES), - OPAL("Opal", 1, 15, ItemID.OPAL), - OPAL_RING("Opal ring", 1, 10, ItemID.OPAL_RING), - MOLTEN_GLASS("Molten glass", 1, 20, ItemID.MOLTEN_GLASS), - BEER_GLASS("Beer glass", 1, 17.5f, ItemID.BEER_GLASS), - EMPTY_CANDLE_LANTERN("Empty candle lantern", 4, 19, ItemID.EMPTY_CANDLE_LANTERN), - GOLD_RING("Gold ring", 5, 15, ItemID.GOLD_RING), - BIRD_HOUSE("Bird house", 5, 15, ItemID.BIRD_HOUSE), - GOLD_NECKLACE("Gold necklace", 6, 20, ItemID.GOLD_NECKLACE), - LEATHER_BOOTS("Leather boots", 7, 16.3f, ItemID.LEATHER_BOOTS), - UNFIRED_PIE_DISH("Unfired pie dish", 7, 15, ItemID.UNFIRED_PIE_DISH), - PIE_DISH("Pie dish", 7, 10, ItemID.PIE_DISH), - GOLD_BRACELET("Gold bracelet", 7, 25, ItemID.GOLD_BRACELET), - UNFIRED_BOWL("Unfired bowl", 8, 18, ItemID.UNFIRED_BOWL), - BOWL("Bowl", 8, 15, ItemID.BOWL), - GOLD_AMULET_U("Gold amulet (u)", 8, 30, ItemID.GOLD_AMULET_U), - COWL("Cowl", 9, 18.5f, ItemID.LEATHER_COWL), - CROSSBOW_STRING("Crossbow string", 10, 15, ItemID.CROSSBOW_STRING), - BOW_STRING("Bow string", 10, 15, ItemID.BOW_STRING), - LEATHER_VAMBRACES("Leather vambraces", 11, 22, ItemID.LEATHER_VAMBRACES), - EMPTY_OIL_LAMP("Empty oil lamp", 12, 25, ItemID.EMPTY_OIL_LAMP), - JADE("Jade", 13, 20, ItemID.JADE), - JADE_RING("Jade ring", 13, 32, ItemID.JADE_RING), - LEATHER_BODY("Leather body", 14, 25, ItemID.LEATHER_BODY), - OAK_BIRD_HOUSE("Oak bird house", 15, 20, ItemID.OAK_BIRD_HOUSE), - RED_TOPAZ("Red topaz", 16, 25, ItemID.RED_TOPAZ), - TOPAZ_RING("Topaz ring", 16, 35, ItemID.TOPAZ_RING), - HOLY_SYMBOL("Holy symbol", 16, 50, ItemID.HOLY_SYMBOL), - OPAL_NECKLACE("Opal necklace", 16, 35, ItemID.OPAL_NECKLACE), - UNHOLY_SYMBOL("Unholy symbol", 17, 50, ItemID.UNHOLY_SYMBOL), - LEATHER_CHAPS("Leather chaps", 18, 27, ItemID.LEATHER_CHAPS), - UNFIRED_PLANT_POT("Unfired plant pot", 19, 20, ItemID.UNFIRED_PLANT_POT), - EMPTY_PLANT_POT("Empty plant pot", 19, 17.5f, ItemID.EMPTY_PLANT_POT), - MAGIC_STRING("Magic string", 19, 30, ItemID.MAGIC_STRING), - SAPPHIRE("Sapphire", 20, 50, ItemID.SAPPHIRE), - SAPPHIRE_RING("Sapphire ring", 20, 40, ItemID.SAPPHIRE_RING), - EMPTY_SACK("Empty sack", 21, 38, ItemID.EMPTY_SACK), - SAPPHIRE_NECKLACE("Sapphire necklace", 22, 55, ItemID.SAPPHIRE_NECKLACE), - OPAL_BRACELET("Opal bracelet", 22, 45, ItemID.OPAL_BRACELET), - SAPPHIRE_BRACELET("Sapphire bracelet", 23, 60, ItemID.SAPPHIRE_BRACELET), - TIARA("Tiara", 23, 52.5f, ItemID.TIARA), - SAPPHIRE_AMULET_U("Sapphire amulet (u)", 24, 65, ItemID.SAPPHIRE_AMULET_U), - UNFIRED_POT_LID("Unfired pot lid", 25, 20, ItemID.UNFIRED_POT_LID), - POT_LID("Pot lid", 25, 20, ItemID.POT_LID), - JADE_NECKLACE("Jade necklace", 25, 54, ItemID.JADE_NECKLACE), - WILLOW_BIRD_HOUSE("Willow bird house", 25, 25, ItemID.WILLOW_BIRD_HOUSE), - DRIFT_NET("Drift net", 26, 55, ItemID.SMALL_FISHING_NET_6209), - EMERALD("Emerald", 27, 67.5f, ItemID.EMERALD), - EMERALD_RING("Emerald ring", 27, 55, ItemID.EMERALD_RING), - OPAL_AMULET_U("Opal amulet (u)", 27, 55, ItemID.OPAL_AMULET_U), - HARDLEATHER_BODY("Hardleather body", 28, 35, ItemID.HARDLEATHER_BODY), - EMERALD_NECKLACE("Emerald necklace", 29, 60, ItemID.EMERALD_NECKLACE), - JADE_BRACELET("Jade bracelet", 29, 60, ItemID.JADE_BRACELET), - EMERALD_BRACELET("Emerald bracelet", 30, 65, ItemID.EMERALD_BRACELET), - ROPE("Rope", 30, 25, ItemID.ROPE), - EMERALD_AMULET_U("Emerald amulet (u)", 31, 70, ItemID.EMERALD_AMULET_U), - SPIKY_VAMBRACES("Spiky vambraces", 32, 6, ItemID.SPIKY_VAMBRACES), - TOPAZ_NECKLACE("Topaz necklace", 32, 70, ItemID.TOPAZ_NECKLACE), - VIAL("Vial", 33, 35, ItemID.VIAL), - RUBY("Ruby", 34, 85, ItemID.RUBY), - RUBY_RING("Ruby ring", 34, 70, ItemID.RUBY_RING), - JADE_AMULET_U("Jade amulet (u)", 34, 70, ItemID.JADE_AMULET_U), - BROODOO_SHIELD("Broodoo shield", 35, 100, ItemID.BROODOO_SHIELD), - TEAK_BIRD_HOUSE("Teak bird house", 35, 30, ItemID.TEAK_BIRD_HOUSE), - BASKET("Basket", 36, 56, ItemID.BASKET), - COIF("Coif", 38, 37, ItemID.COIF), - TOPAZ_BRACELET("Topaz bracelet", 38, 75, ItemID.TOPAZ_BRACELET), - RUBY_NECKLACE("Ruby necklace", 40, 75, ItemID.RUBY_NECKLACE), - HARD_LEATHER_SHIELD("Hard leather shield", 41, 70, ItemID.HARD_LEATHER_SHIELD), - RUBY_BRACELET("Ruby bracelet", 42, 80, ItemID.RUBY_BRACELET), - FISHBOWL("Fishbowl", 42, 42.5f, ItemID.FISHBOWL), - DIAMOND("Diamond", 43, 107.5f, ItemID.DIAMOND), - DIAMOND_RING("Diamond ring", 43, 85, ItemID.DIAMOND_RING), - TOPAZ_AMULET_U("Topaz amulet (u)", 45, 80, ItemID.TOPAZ_AMULET_U), - SNAKESKIN_BOOTS("Snakeskin boots", 45, 30, ItemID.SNAKESKIN_BOOTS), - MAPLE_BIRD_HOUSE("Maple bird house", 45, 35, ItemID.MAPLE_BIRD_HOUSE), - UNPOWERED_ORB("Unpowered orb", 46, 52.5f, ItemID.UNPOWERED_ORB), - SNAKESKIN_VAMBRACES("Snakeskin vambraces", 47, 35, ItemID.SNAKESKIN_VAMBRACES), - SNAKESKIN_BANDANA("Snakeskin bandana", 48, 45, ItemID.SNAKESKIN_BANDANA), - LANTERN_LENS("Lantern lens", 49, 55, ItemID.LANTERN_LENS), - RUBY_AMULET_U("Ruby amulet (u)", 50, 85, ItemID.RUBY_AMULET_U), - MAHOGANY_BIRD_HOUSE("Mahogany bird house", 50, 40, ItemID.MAHOGANY_BIRD_HOUSE), - SNAKESKIN_CHAPS("Snakeskin chaps", 51, 50, ItemID.SNAKESKIN_CHAPS), - SNAKESKIN_BODY("Snakeskin body", 53, 55, ItemID.SNAKESKIN_BODY), - WATER_BATTLESTAFF("Water battlestaff", 54, 100, ItemID.WATER_BATTLESTAFF), - DRAGONSTONE("Dragonstone", 55, 137.5f, ItemID.DRAGONSTONE), - DRAGONSTONE_RING("Dragonstone ring", 55, 100, ItemID.DRAGONSTONE_RING), - DIAMOND_NECKLACE("Diamond necklace", 56, 90, ItemID.DIAMOND_NECKLACE), - SNAKESKIN_SHIELD("Snakeskin shield", 56, 100, ItemID.SNAKESKIN_SHIELD), - GREEN_DHIDE_VAMB("Green D'hide vamb", 57, 62, ItemID.GREEN_DHIDE_VAMBRACES), - DIAMOND_BRACELET("Diamond bracelet", 58, 95, ItemID.DIAMOND_BRACELET), - EARTH_BATTLESTAFF("Earth battlestaff", 58, 112.5f, ItemID.EARTH_BATTLESTAFF), - GREEN_DHIDE_CHAPS("Green D'hide chaps", 60, 124, ItemID.GREEN_DHIDE_CHAPS), - YEW_BIRD_HOUSE("Yew bird house", 60, 45, ItemID.YEW_BIRD_HOUSE), - FIRE_BATTLESTAFF("Fire battlestaff", 62, 125, ItemID.FIRE_BATTLESTAFF), - GREEN_DHIDE_SHIELD("Green D'hide shield", 62, 124, ItemID.GREEN_DHIDE_SHIELD), - GREEN_DHIDE_BODY("Green D'hide body", 63, 186, ItemID.GREEN_DHIDE_BODY), - AIR_BATTLESTAFF("Air battlestaff", 66, 137.5f, ItemID.AIR_BATTLESTAFF), - BLUE_DHIDE_VAMB("Blue D'hide vamb", 66, 70, ItemID.BLUE_DHIDE_VAMBRACES), - ONYX_RING("Onyx ring", 67, 115, ItemID.ONYX_RING), - ONYX("Onyx", 67, 167.5f, ItemID.ONYX), - BLUE_DHIDE_CHAPS("Blue D'hide chaps", 68, 140, ItemID.BLUE_DHIDE_CHAPS), - BLUE_DHIDE_SHIELD("Blue D'hide shield", 69, 140, ItemID.BLUE_DHIDE_SHIELD), - DIAMOND_AMULET_U("Diamond amulet (u)", 70, 100, ItemID.DIAMOND_AMULET_U), - BLUE_DHIDE_BODY("Blue D'hide body", 71, 210, ItemID.BLUE_DHIDE_BODY), - DRAGONSTONE_NECKLACE("Dragonstone necklace", 72, 105, ItemID.DRAGON_NECKLACE), - RED_DHIDE_VAMB("Red D'hide vamb", 73, 78, ItemID.RED_DHIDE_VAMBRACES), - DRAGONSTONE_BRACELET("Dragonstone bracelet", 74, 110, ItemID.DRAGONSTONE_BRACELET), - RED_DHIDE_CHAPS("Red D'hide chaps", 75, 156, ItemID.RED_DHIDE_CHAPS), - MAGIC_BIRD_HOUSE("Magic bird house", 75, 50, ItemID.MAGIC_BIRD_HOUSE), - RED_DHIDE_SHIELD("Red D'hide shield", 76, 156, ItemID.RED_DHIDE_SHIELD), - RED_DHIDE_BODY("Red D'hide body", 77, 234, ItemID.RED_DHIDE_BODY), - BLACK_DHIDE_VAMB("Black D'hide vamb", 79, 86, ItemID.BLACK_DHIDE_VAMBRACES), - DRAGONSTONE_AMULET_U("Dragonstone amulet (u)", 80, 150, ItemID.DRAGONSTONE_AMULET_U), - BLACK_DHIDE_CHAPS("Black D'hide chaps", 82, 172, ItemID.BLACK_DHIDE_CHAPS), - ONYX_NECKLACE("Onyx necklace", 82, 120, ItemID.ONYX_NECKLACE), - AMETHYST_BOLT_TIPS("Amethyst bolt tips", 83, 4, ItemID.AMETHYST_BOLT_TIPS), - BLACK_DHIDE_SHIELD("Black D'hide shield", 83, 172, ItemID.BLACK_DHIDE_SHIELD), - BLACK_DHIDE_BODY("Black D'hide body", 84, 258, ItemID.BLACK_DHIDE_BODY), - ONYX_BRACELET("Onyx bracelet", 84, 125, ItemID.ONYX_BRACELET), - AMETHYST_ARROWTIPS("Amethyst arrowtips", 85, 4, ItemID.AMETHYST_ARROWTIPS), - AMETHYST_JAVELIN_HEADS("Amethyst javelin heads", 87, 12, ItemID.AMETHYST_JAVELIN_HEADS), - LIGHT_ORB("Light orb", 87, 70, ItemID.LIGHT_ORB), - AMETHYST_DART_TIP("Amethyst dart tip", 89, 7.5f, ItemID.AMETHYST_DART_TIP), - ZENYTE("Zenyte", 89, 200, ItemID.ZENYTE), - ZENYTE_RING("Zenyte ring", 89, 150, ItemID.ZENYTE_RING), - ONYX_AMULET_U("Onyx amulet (u)", 90, 165, ItemID.ONYX_AMULET_U), - REDWOOD_BIRD_HOUSE("Redwood bird house", 90, 55, ItemID.REDWOOD_BIRD_HOUSE), - ZENYTE_NECKLACE("Zenyte necklace", 92, 165, ItemID.ZENYTE_NECKLACE), - ZENYTE_BRACELET("Zenyte bracelet", 95, 180, ItemID.ZENYTE_BRACELET), - ZENYTE_AMULET_U("Zenyte amulet (u)", 98, 200, ItemID.ZENYTE_AMULET_U), + BALL_OF_WOOL(ItemID.BALL_OF_WOOL, 1, 2.5f), + UNFIRED_POT(ItemID.UNFIRED_POT, 1, 6.3f), + POT(ItemID.POT, 1, 6.3f), + LEATHER_GLOVES(ItemID.LEATHER_GLOVES, 1, 13.8f), + OPAL(ItemID.OPAL, 1, 15), + OPAL_RING(ItemID.OPAL_RING, 1, 10), + MOLTEN_GLASS(ItemID.MOLTEN_GLASS, 1, 20), + BEER_GLASS(ItemID.BEER_GLASS, 1, 17.5f), + EMPTY_CANDLE_LANTERN(ItemID.EMPTY_CANDLE_LANTERN, 4, 19), + GOLD_RING(ItemID.GOLD_RING, 5, 15), + BIRD_HOUSE(ItemID.BIRD_HOUSE, 5, 15), + GOLD_NECKLACE(ItemID.GOLD_NECKLACE, 6, 20), + LEATHER_BOOTS(ItemID.LEATHER_BOOTS, 7, 16.3f), + UNFIRED_PIE_DISH(ItemID.UNFIRED_PIE_DISH, 7, 15), + PIE_DISH(ItemID.PIE_DISH, 7, 10), + GOLD_BRACELET(ItemID.GOLD_BRACELET, 7, 25), + UNFIRED_BOWL(ItemID.UNFIRED_BOWL, 8, 18), + BOWL(ItemID.BOWL, 8, 15), + GOLD_AMULET_U(ItemID.GOLD_AMULET_U, 8, 30), + COWL(ItemID.LEATHER_COWL, 9, 18.5f), + CROSSBOW_STRING(ItemID.CROSSBOW_STRING, 10, 15), + BOW_STRING(ItemID.BOW_STRING, 10, 15), + LEATHER_VAMBRACES(ItemID.LEATHER_VAMBRACES, 11, 22), + EMPTY_OIL_LAMP(ItemID.EMPTY_OIL_LAMP, 12, 25), + JADE(ItemID.JADE, 13, 20), + JADE_RING(ItemID.JADE_RING, 13, 32), + LEATHER_BODY(ItemID.LEATHER_BODY, 14, 25), + OAK_BIRD_HOUSE(ItemID.OAK_BIRD_HOUSE, 15, 20), + RED_TOPAZ(ItemID.RED_TOPAZ, 16, 25), + TOPAZ_RING(ItemID.TOPAZ_RING, 16, 35), + HOLY_SYMBOL(ItemID.HOLY_SYMBOL, 16, 50), + OPAL_NECKLACE(ItemID.OPAL_NECKLACE, 16, 35), + UNHOLY_SYMBOL(ItemID.UNHOLY_SYMBOL, 17, 50), + LEATHER_CHAPS(ItemID.LEATHER_CHAPS, 18, 27), + UNFIRED_PLANT_POT(ItemID.UNFIRED_PLANT_POT, 19, 20), + EMPTY_PLANT_POT(ItemID.EMPTY_PLANT_POT, 19, 17.5f), + MAGIC_STRING(ItemID.MAGIC_STRING, 19, 30), + SAPPHIRE(ItemID.SAPPHIRE, 20, 50), + SAPPHIRE_RING(ItemID.SAPPHIRE_RING, 20, 40), + EMPTY_SACK(ItemID.EMPTY_SACK, 21, 38), + SAPPHIRE_NECKLACE(ItemID.SAPPHIRE_NECKLACE, 22, 55), + OPAL_BRACELET(ItemID.OPAL_BRACELET, 22, 45), + SAPPHIRE_BRACELET(ItemID.SAPPHIRE_BRACELET, 23, 60), + TIARA(ItemID.TIARA, 23, 52.5f), + SAPPHIRE_AMULET_U(ItemID.SAPPHIRE_AMULET_U, 24, 65), + UNFIRED_POT_LID(ItemID.UNFIRED_POT_LID, 25, 20), + POT_LID(ItemID.POT_LID, 25, 20), + JADE_NECKLACE(ItemID.JADE_NECKLACE, 25, 54), + WILLOW_BIRD_HOUSE(ItemID.WILLOW_BIRD_HOUSE, 25, 25), + DRIFT_NET(ItemID.SMALL_FISHING_NET_6209, 26, 55), + EMERALD(ItemID.EMERALD, 27, 67.5f), + EMERALD_RING(ItemID.EMERALD_RING, 27, 55), + OPAL_AMULET_U(ItemID.OPAL_AMULET_U, 27, 55), + HARDLEATHER_BODY(ItemID.HARDLEATHER_BODY, 28, 35), + EMERALD_NECKLACE(ItemID.EMERALD_NECKLACE, 29, 60), + JADE_BRACELET(ItemID.JADE_BRACELET, 29, 60), + EMERALD_BRACELET(ItemID.EMERALD_BRACELET, 30, 65), + ROPE(ItemID.ROPE, 30, 25), + EMERALD_AMULET_U(ItemID.EMERALD_AMULET_U, 31, 70), + SPIKY_VAMBRACES(ItemID.SPIKY_VAMBRACES, 32, 6), + TOPAZ_NECKLACE(ItemID.TOPAZ_NECKLACE, 32, 70), + VIAL(ItemID.VIAL, 33, 35), + RUBY(ItemID.RUBY, 34, 85), + RUBY_RING(ItemID.RUBY_RING, 34, 70), + JADE_AMULET_U(ItemID.JADE_AMULET_U, 34, 70), + BROODOO_SHIELD(ItemID.BROODOO_SHIELD, 35, 100), + TEAK_BIRD_HOUSE(ItemID.TEAK_BIRD_HOUSE, 35, 30), + BASKET(ItemID.BASKET, 36, 56), + COIF(ItemID.COIF, 38, 37), + TOPAZ_BRACELET(ItemID.TOPAZ_BRACELET, 38, 75), + RUBY_NECKLACE(ItemID.RUBY_NECKLACE, 40, 75), + HARD_LEATHER_SHIELD(ItemID.HARD_LEATHER_SHIELD, 41, 70), + RUBY_BRACELET(ItemID.RUBY_BRACELET, 42, 80), + FISHBOWL(ItemID.FISHBOWL, 42, 42.5f), + DIAMOND(ItemID.DIAMOND, 43, 107.5f), + DIAMOND_RING(ItemID.DIAMOND_RING, 43, 85), + TOPAZ_AMULET_U(ItemID.TOPAZ_AMULET_U, 45, 80), + SNAKESKIN_BOOTS(ItemID.SNAKESKIN_BOOTS, 45, 30), + MAPLE_BIRD_HOUSE(ItemID.MAPLE_BIRD_HOUSE, 45, 35), + UNPOWERED_ORB(ItemID.UNPOWERED_ORB, 46, 52.5f), + SNAKESKIN_VAMBRACES(ItemID.SNAKESKIN_VAMBRACES, 47, 35), + SNAKESKIN_BANDANA(ItemID.SNAKESKIN_BANDANA, 48, 45), + LANTERN_LENS(ItemID.LANTERN_LENS, 49, 55), + RUBY_AMULET_U(ItemID.RUBY_AMULET_U, 50, 85), + MAHOGANY_BIRD_HOUSE(ItemID.MAHOGANY_BIRD_HOUSE, 50, 40), + SNAKESKIN_CHAPS(ItemID.SNAKESKIN_CHAPS, 51, 50), + SNAKESKIN_BODY(ItemID.SNAKESKIN_BODY, 53, 55), + WATER_BATTLESTAFF(ItemID.WATER_BATTLESTAFF, 54, 100), + DRAGONSTONE(ItemID.DRAGONSTONE, 55, 137.5f), + DRAGONSTONE_RING(ItemID.DRAGONSTONE_RING, 55, 100), + DIAMOND_NECKLACE(ItemID.DIAMOND_NECKLACE, 56, 90), + SNAKESKIN_SHIELD(ItemID.SNAKESKIN_SHIELD, 56, 100), + GREEN_DHIDE_VAMB(ItemID.GREEN_DHIDE_VAMBRACES, 57, 62), + DIAMOND_BRACELET(ItemID.DIAMOND_BRACELET, 58, 95), + EARTH_BATTLESTAFF(ItemID.EARTH_BATTLESTAFF, 58, 112.5f), + GREEN_DHIDE_CHAPS(ItemID.GREEN_DHIDE_CHAPS, 60, 124), + YEW_BIRD_HOUSE(ItemID.YEW_BIRD_HOUSE, 60, 45), + FIRE_BATTLESTAFF(ItemID.FIRE_BATTLESTAFF, 62, 125), + GREEN_DHIDE_SHIELD(ItemID.GREEN_DHIDE_SHIELD, 62, 124), + GREEN_DHIDE_BODY(ItemID.GREEN_DHIDE_BODY, 63, 186), + AIR_BATTLESTAFF(ItemID.AIR_BATTLESTAFF, 66, 137.5f), + BLUE_DHIDE_VAMB(ItemID.BLUE_DHIDE_VAMBRACES, 66, 70), + ONYX_RING(ItemID.ONYX_RING, 67, 115), + ONYX(ItemID.ONYX, 67, 167.5f), + BLUE_DHIDE_CHAPS(ItemID.BLUE_DHIDE_CHAPS, 68, 140), + BLUE_DHIDE_SHIELD(ItemID.BLUE_DHIDE_SHIELD, 69, 140), + DIAMOND_AMULET_U(ItemID.DIAMOND_AMULET_U, 70, 100), + BLUE_DHIDE_BODY(ItemID.BLUE_DHIDE_BODY, 71, 210), + DRAGONSTONE_NECKLACE(ItemID.DRAGON_NECKLACE, 72, 105), + RED_DHIDE_VAMB(ItemID.RED_DHIDE_VAMBRACES, 73, 78), + DRAGONSTONE_BRACELET(ItemID.DRAGONSTONE_BRACELET, 74, 110), + RED_DHIDE_CHAPS(ItemID.RED_DHIDE_CHAPS, 75, 156), + MAGIC_BIRD_HOUSE(ItemID.MAGIC_BIRD_HOUSE, 75, 50), + RED_DHIDE_SHIELD(ItemID.RED_DHIDE_SHIELD, 76, 156), + RED_DHIDE_BODY(ItemID.RED_DHIDE_BODY, 77, 234), + BLACK_DHIDE_VAMB(ItemID.BLACK_DHIDE_VAMBRACES, 79, 86), + DRAGONSTONE_AMULET_U(ItemID.DRAGONSTONE_AMULET_U, 80, 150), + BLACK_DHIDE_CHAPS(ItemID.BLACK_DHIDE_CHAPS, 82, 172), + ONYX_NECKLACE(ItemID.ONYX_NECKLACE, 82, 120), + AMETHYST_BOLT_TIPS(ItemID.AMETHYST_BOLT_TIPS, 83, 4), + BLACK_DHIDE_SHIELD(ItemID.BLACK_DHIDE_SHIELD, 83, 172), + BLACK_DHIDE_BODY(ItemID.BLACK_DHIDE_BODY, 84, 258), + ONYX_BRACELET(ItemID.ONYX_BRACELET, 84, 125), + AMETHYST_ARROWTIPS(ItemID.AMETHYST_ARROWTIPS, 85, 4), + AMETHYST_JAVELIN_HEADS(ItemID.AMETHYST_JAVELIN_HEADS, 87, 12), + LIGHT_ORB(ItemID.LIGHT_ORB, 87, 70), + AMETHYST_DART_TIP(ItemID.AMETHYST_DART_TIP, 89, 7.5f), + ZENYTE(ItemID.ZENYTE, 89, 200), + ZENYTE_RING(ItemID.ZENYTE_RING, 89, 150), + ONYX_AMULET_U(ItemID.ONYX_AMULET_U, 90, 165), + REDWOOD_BIRD_HOUSE(ItemID.REDWOOD_BIRD_HOUSE, 90, 55), + ZENYTE_NECKLACE(ItemID.ZENYTE_NECKLACE, 92, 165), + ZENYTE_BRACELET(ItemID.ZENYTE_BRACELET, 95, 180), + ZENYTE_AMULET_U(ItemID.ZENYTE_AMULET_U, 98, 200), ; - private final String name; + private final int itemId; private final int level; private final float xp; - private final int icon; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FarmingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FarmingAction.java index bcf06f1668..6f17dcceb3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FarmingAction.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FarmingAction.java @@ -30,7 +30,7 @@ import net.runelite.api.ItemID; @AllArgsConstructor @Getter -public enum FarmingAction implements SkillAction +public enum FarmingAction implements NamedSkillAction { PLANT("Plant", 1, 31, ItemID.PLANT), FERN_BIG_PLANT("Fern (big plant)", 1, 31, ItemID.FERN_8186), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FiremakingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FiremakingAction.java index 57d1b92e7e..424fb851a8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FiremakingAction.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FiremakingAction.java @@ -30,24 +30,23 @@ import net.runelite.api.ItemID; @AllArgsConstructor @Getter -public enum FiremakingAction implements SkillAction +public enum FiremakingAction implements ItemSkillAction { - LOGS("Logs", 1, 40, ItemID.LOGS), - ACHEY_TREE_LOGS("Achey tree logs", 1, 40, ItemID.ACHEY_TREE_LOGS), - OAK_LOGS("Oak logs", 15, 60, ItemID.OAK_LOGS), - WILLOW_LOGS("Willow logs", 30, 90, ItemID.WILLOW_LOGS), - TEAK_LOGS("Teak logs", 35, 105, ItemID.TEAK_LOGS), - ARCTIC_PINE_LOGS("Arctic pine logs", 42, 125, ItemID.ARCTIC_PINE_LOGS), - MAPLE_LOGS("Maple logs", 45, 135, ItemID.MAPLE_LOGS), - MAHOGANY_LOGS("Mahogany logs", 50, 157.5f, ItemID.MAHOGANY_LOGS), - YEW_LOGS("Yew logs", 60, 202.5f, ItemID.YEW_LOGS), - BLISTERWOOD_LOGS("Blisterwood logs", 62, 96, ItemID.BLISTERWOOD_LOGS), - MAGIC_LOGS("Magic logs", 75, 303.8f, ItemID.MAGIC_LOGS), - REDWOOD_LOGS("Redwood logs", 90, 350, ItemID.REDWOOD_LOGS), + LOGS(ItemID.LOGS, 1, 40), + ACHEY_TREE_LOGS(ItemID.ACHEY_TREE_LOGS, 1, 40), + OAK_LOGS(ItemID.OAK_LOGS, 15, 60), + WILLOW_LOGS(ItemID.WILLOW_LOGS, 30, 90), + TEAK_LOGS(ItemID.TEAK_LOGS, 35, 105), + ARCTIC_PINE_LOGS(ItemID.ARCTIC_PINE_LOGS, 42, 125), + MAPLE_LOGS(ItemID.MAPLE_LOGS, 45, 135), + MAHOGANY_LOGS(ItemID.MAHOGANY_LOGS, 50, 157.5f), + YEW_LOGS(ItemID.YEW_LOGS, 60, 202.5f), + BLISTERWOOD_LOGS(ItemID.BLISTERWOOD_LOGS, 62, 96), + MAGIC_LOGS(ItemID.MAGIC_LOGS, 75, 303.8f), + REDWOOD_LOGS(ItemID.REDWOOD_LOGS, 90, 350), ; - private final String name; + private final int itemId; private final int level; private final float xp; - private final int icon; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FishingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FishingAction.java index c414ac2d77..7f42218de2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FishingAction.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FishingAction.java @@ -30,46 +30,45 @@ import net.runelite.api.ItemID; @AllArgsConstructor @Getter -public enum FishingAction implements SkillAction +public enum FishingAction implements ItemSkillAction { - RAW_SHRIMPS("Raw shrimps", 1, 10, ItemID.RAW_SHRIMPS), - RAW_SARDINE("Raw sardine", 5, 20, ItemID.RAW_SARDINE), - RAW_KARAMBWANJI("Raw karambwanji", 5, 5, ItemID.RAW_KARAMBWANJI), - RAW_GUPPY("Raw guppy", 7, 8, ItemID.RAW_GUPPY), - RAW_HERRING("Raw herring", 10, 30, ItemID.RAW_HERRING), - RAW_ANCHOVIES("Raw anchovies", 15, 40, ItemID.RAW_ANCHOVIES), - RAW_MACKEREL("Raw mackerel", 16, 20, ItemID.RAW_MACKEREL), - RAW_TROUT("Raw trout", 20, 50, ItemID.RAW_TROUT), - RAW_CAVEFISH("Raw cavefish", 20, 16, ItemID.RAW_CAVEFISH), - RAW_COD("Raw cod", 23, 45, ItemID.RAW_COD), - RAW_PIKE("Raw pike", 25, 60, ItemID.RAW_PIKE), - RAW_SLIMY_EEL("Raw slimy eel", 28, 65, ItemID.RAW_SLIMY_EEL), - RAW_SALMON("Raw salmon", 30, 70, ItemID.RAW_SALMON), - RAW_TETRA("Raw tetra", 33, 24, ItemID.RAW_TETRA), - RAW_TUNA("Raw tuna", 35, 80, ItemID.RAW_TUNA), - RAW_RAINBOW_FISH("Raw rainbow fish", 38, 80, ItemID.RAW_RAINBOW_FISH), - RAW_CAVE_EEL("Raw cave eel", 38, 80, ItemID.RAW_CAVE_EEL), - RAW_LOBSTER("Raw lobster", 40, 90, ItemID.RAW_LOBSTER), - RAW_BASS("Raw bass", 46, 100, ItemID.RAW_BASS), - RAW_CATFISH("Raw catfish", 46, 33, ItemID.RAW_CATFISH), - LEAPING_TROUT("Leaping trout", 48, 50, ItemID.LEAPING_TROUT), - RAW_SWORDFISH("Raw swordfish", 50, 100, ItemID.RAW_SWORDFISH), - LEAPING_SALMON("Leaping salmon", 58, 70, ItemID.LEAPING_SALMON), - RAW_MONKFISH("Raw monkfish", 62, 120, ItemID.RAW_MONKFISH), - RAW_KARAMBWAN("Raw karambwan", 65, 50, ItemID.RAW_KARAMBWAN), - LEAPING_STURGEON("Leaping sturgeon", 70, 80, ItemID.LEAPING_STURGEON), - RAW_SHARK("Raw shark", 76, 110, ItemID.RAW_SHARK), - RAW_SEA_TURTLE("Raw sea turtle", 79, 38, ItemID.RAW_SEA_TURTLE), - INFERNAL_EEL("Infernal eel", 80, 95, ItemID.INFERNAL_EEL), - RAW_MANTA_RAY("Raw manta ray", 81, 46, ItemID.RAW_MANTA_RAY), - RAW_ANGLERFISH("Raw anglerfish", 82, 120, ItemID.RAW_ANGLERFISH), - MINNOW("Minnow", 82, 26.5f, ItemID.MINNOW), - RAW_DARK_CRAB("Raw dark crab", 85, 130, ItemID.RAW_DARK_CRAB), - SACRED_EEL("Sacred eel", 87, 105, ItemID.SACRED_EEL), + RAW_SHRIMPS(ItemID.RAW_SHRIMPS, 1, 10), + RAW_SARDINE(ItemID.RAW_SARDINE, 5, 20), + RAW_KARAMBWANJI(ItemID.RAW_KARAMBWANJI, 5, 5), + RAW_GUPPY(ItemID.RAW_GUPPY, 7, 8), + RAW_HERRING(ItemID.RAW_HERRING, 10, 30), + RAW_ANCHOVIES(ItemID.RAW_ANCHOVIES, 15, 40), + RAW_MACKEREL(ItemID.RAW_MACKEREL, 16, 20), + RAW_TROUT(ItemID.RAW_TROUT, 20, 50), + RAW_CAVEFISH(ItemID.RAW_CAVEFISH, 20, 16), + RAW_COD(ItemID.RAW_COD, 23, 45), + RAW_PIKE(ItemID.RAW_PIKE, 25, 60), + RAW_SLIMY_EEL(ItemID.RAW_SLIMY_EEL, 28, 65), + RAW_SALMON(ItemID.RAW_SALMON, 30, 70), + RAW_TETRA(ItemID.RAW_TETRA, 33, 24), + RAW_TUNA(ItemID.RAW_TUNA, 35, 80), + RAW_RAINBOW_FISH(ItemID.RAW_RAINBOW_FISH, 38, 80), + RAW_CAVE_EEL(ItemID.RAW_CAVE_EEL, 38, 80), + RAW_LOBSTER(ItemID.RAW_LOBSTER, 40, 90), + RAW_BASS(ItemID.RAW_BASS, 46, 100), + RAW_CATFISH(ItemID.RAW_CATFISH, 46, 33), + LEAPING_TROUT(ItemID.LEAPING_TROUT, 48, 50), + RAW_SWORDFISH(ItemID.RAW_SWORDFISH, 50, 100), + LEAPING_SALMON(ItemID.LEAPING_SALMON, 58, 70), + RAW_MONKFISH(ItemID.RAW_MONKFISH, 62, 120), + RAW_KARAMBWAN(ItemID.RAW_KARAMBWAN, 65, 50), + LEAPING_STURGEON(ItemID.LEAPING_STURGEON, 70, 80), + RAW_SHARK(ItemID.RAW_SHARK, 76, 110), + RAW_SEA_TURTLE(ItemID.RAW_SEA_TURTLE, 79, 38), + INFERNAL_EEL(ItemID.INFERNAL_EEL, 80, 95), + RAW_MANTA_RAY(ItemID.RAW_MANTA_RAY, 81, 46), + RAW_ANGLERFISH(ItemID.RAW_ANGLERFISH, 82, 120), + MINNOW(ItemID.MINNOW, 82, 26.5f), + RAW_DARK_CRAB(ItemID.RAW_DARK_CRAB, 85, 130), + SACRED_EEL(ItemID.SACRED_EEL, 87, 105), ; - private final String name; + private final int itemId; private final int level; private final float xp; - private final int icon; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FletchingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FletchingAction.java index 7da07f6817..c869ed06a2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FletchingAction.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FletchingAction.java @@ -30,110 +30,109 @@ import net.runelite.api.ItemID; @AllArgsConstructor @Getter -public enum FletchingAction implements SkillAction +public enum FletchingAction implements ItemSkillAction { - ARROW_SHAFT("Arrow shaft", 1, 0.33f, ItemID.ARROW_SHAFT), - HEADLESS_ARROW("Headless arrow", 1, 1, ItemID.HEADLESS_ARROW), - BRONZE_ARROW("Bronze arrow", 1, 1.3f, ItemID.BRONZE_ARROW), - OGRE_ARROW("Ogre arrow", 5, 1, ItemID.OGRE_ARROW), - SHORTBOW_U("Shortbow (u)", 5, 5, ItemID.SHORTBOW_U), - SHORTBOW("Shortbow", 5, 5, ItemID.SHORTBOW), - BRONZE_BOLTS("Bronze bolts", 9, 0.5f, ItemID.BRONZE_BOLTS), - WOODEN_STOCK("Wooden stock", 9, 6, ItemID.WOODEN_STOCK), - BRONZE_CROSSBOW_U("Bronze crossbow (u)", 9, 12, ItemID.BRONZE_CROSSBOW_U), - BRONZE_CROSSBOW("Bronze crossbow", 9, 6, ItemID.BRONZE_CROSSBOW), - BRONZE_DART("Bronze dart", 10, 1.8f, ItemID.BRONZE_DART), - LONGBOW("Longbow", 10, 10, ItemID.LONGBOW), - LONGBOW_U("Longbow (u)", 10, 10, ItemID.LONGBOW_U), - OPAL_BOLTS("Opal bolts", 11, 1.6f, ItemID.OPAL_BOLTS), - IRON_ARROW("Iron arrow", 15, 2.5f, ItemID.IRON_ARROW), - OAK_SHORTBOW_U("Oak shortbow (u)", 20, 16.5f, ItemID.OAK_SHORTBOW_U), - OAK_SHORTBOW("Oak shortbow", 20, 16.5f, ItemID.OAK_SHORTBOW), - IRON_DART("Iron dart", 22, 3.8f, ItemID.IRON_DART), - OAK_STOCK("Oak stock", 24, 16, ItemID.OAK_STOCK), - BLURITE_CROSSBOW_U("Blurite crossbow (u)", 24, 32, ItemID.BLURITE_CROSSBOW_U), - BLURITE_CROSSBOW("Blurite crossbow", 24, 16, ItemID.BLURITE_CROSSBOW), - OAK_LONGBOW_U("Oak longbow (u)", 25, 25, ItemID.OAK_LONGBOW_U), - OAK_LONGBOW("Oak longbow", 25, 25, ItemID.OAK_LONGBOW), - OAK_SHIELD("Oak shield", 27, 50, ItemID.OAK_SHIELD), - STEEL_ARROW("Steel arrow", 30, 5, ItemID.STEEL_ARROW), - KEBBIT_BOLTS("Kebbit bolts", 32, 1, ItemID.KEBBIT_BOLTS), - WILLOW_SHORTBOW_U("Willow shortbow (u)", 35, 33.3f, ItemID.WILLOW_SHORTBOW_U), - WILLOW_SHORTBOW("Willow shortbow", 35, 33.3f, ItemID.WILLOW_SHORTBOW), - STEEL_DART("Steel dart", 37, 7.5f, ItemID.STEEL_DART), - IRON_BOLTS("Iron bolts", 39, 1.5f, ItemID.IRON_BOLTS), - WILLOW_STOCK("Willow stock", 39, 22, ItemID.WILLOW_STOCK), - IRON_CROSSBOW_U("Iron crossbow (u)", 39, 44, ItemID.IRON_CROSSBOW_U), - IRON_CROSSBOW("Iron crossbow", 39, 22, ItemID.IRON_CROSSBOW), - WILLOW_LONGBOW_U("Willow longbow (u)", 40, 41.5f, ItemID.WILLOW_LONGBOW_U), - WILLOW_LONGBOW("Willow longbow", 40, 41.5f, ItemID.WILLOW_LONGBOW), - BATTLESTAFF("Battlestaff", 40, 80, ItemID.BATTLESTAFF), - PEARL_BOLTS("Pearl bolts", 41, 3.2f, ItemID.PEARL_BOLTS), - WILLOW_SHIELD("Willow shield", 42, 83, ItemID.WILLOW_SHIELD), - LONG_KEBBIT_BOLTS("Long kebbit bolts", 42, 1.3f, ItemID.LONG_KEBBIT_BOLTS), - SILVER_BOLTS("Silver bolts", 43, 2.5f, ItemID.SILVER_BOLTS), - MITHRIL_ARROW("Mithril arrow", 45, 7.5f, ItemID.MITHRIL_ARROW), - STEEL_BOLTS("Steel bolts", 46, 3.5f, ItemID.STEEL_BOLTS), - TEAK_STOCK("Teak stock", 46, 27, ItemID.TEAK_STOCK), - STEEL_CROSSBOW_U("Steel crossbow (u)", 46, 54, ItemID.STEEL_CROSSBOW_U), - STEEL_CROSSBOW("Steel crossbow", 46, 27, ItemID.STEEL_CROSSBOW), - MAPLE_SHORTBOW_U("Maple shortbow (u)", 50, 50, ItemID.MAPLE_SHORTBOW_U), - MAPLE_SHORTBOW("Maple shortbow", 50, 50, ItemID.MAPLE_SHORTBOW), - BARBED_BOLTS("Barbed bolts", 51, 9.5f, ItemID.BARBED_BOLTS), - MITHRIL_DART("Mithril dart", 52, 11.2f, ItemID.MITHRIL_DART), - BROAD_ARROWS("Broad arrows", 52, 10, ItemID.BROAD_ARROWS), - TOXIC_BLOWPIPE("Toxic blowpipe", 53, 120, ItemID.TOXIC_BLOWPIPE), - MITH_CROSSBOW("Mith crossbow", 54, 32, ItemID.MITHRIL_CROSSBOW), - MAPLE_STOCK("Maple stock", 54, 32, ItemID.MAPLE_STOCK), - MITHRIL_BOLTS("Mithril bolts", 54, 5, ItemID.MITHRIL_BOLTS), - MITHRIL_CROSSBOW_U("Mithril crossbow (u)", 54, 64f, ItemID.MITHRIL_CROSSBOW_U), - MAPLE_LONGBOW_U("Maple longbow (u)", 55, 58.3f, ItemID.MAPLE_LONGBOW_U), - BROAD_BOLTS("Broad bolts", 55, 3, ItemID.BROAD_BOLTS), - MAPLE_LONGBOW("Maple longbow", 55, 58, ItemID.MAPLE_LONGBOW), - SAPPHIRE_BOLTS("Sapphire bolts", 56, 4.7f, ItemID.SAPPHIRE_BOLTS), - MAPLE_SHIELD("Maple shield", 57, 116.5f, ItemID.MAPLE_SHIELD), - EMERALD_BOLTS("Emerald bolts", 58, 5.5f, ItemID.EMERALD_BOLTS), - ADAMANT_ARROW("Adamant arrow", 60, 10, ItemID.ADAMANT_ARROW), - ADAMANT_BOLTS("Adamant bolts", 61, 7, ItemID.ADAMANT_BOLTS), - MAHOGANY_STOCK("Mahogany stock", 61, 41, ItemID.MAHOGANY_STOCK), - ADAMANT_CROSSBOW_U("Adamant crossbow (u)", 61, 82, ItemID.ADAMANT_CROSSBOW_U), - ADAMANT_CROSSBOW("Adamant crossbow", 61, 41, ItemID.ADAMANT_CROSSBOW), - RUBY_BOLTS("Ruby bolts", 63, 6.3f, ItemID.RUBY_BOLTS), - DIAMOND_BOLTS("Diamond bolts", 65, 7, ItemID.DIAMOND_BOLTS), - YEW_SHORTBOW("Yew shortbow", 65, 67.5f, ItemID.YEW_SHORTBOW), - YEW_SHORTBOW_U("Yew shortbow (u)", 65, 67.5f, ItemID.YEW_SHORTBOW_U), - ADAMANT_DART("Adamant dart", 67, 15, ItemID.ADAMANT_DART), - RUNITE_CROSSBOW_U("Runite crossbow (u)", 69, 100, ItemID.RUNITE_CROSSBOW_U), - RUNE_CROSSBOW("Rune crossbow", 69, 50, ItemID.RUNE_CROSSBOW), - YEW_STOCK("Yew stock", 69, 50, ItemID.YEW_STOCK), - RUNITE_BOLTS("Runite bolts", 69, 10, ItemID.RUNITE_BOLTS), - YEW_LONGBOW("Yew longbow", 70, 75, ItemID.YEW_LONGBOW), - YEW_LONGBOW_U("Yew longbow (u)", 70, 75, ItemID.YEW_LONGBOW_U), - DRAGONSTONE_BOLTS("Dragonstone bolts", 71, 8.2f, ItemID.DRAGONSTONE_BOLTS), - YEW_SHIELD("Yew shield", 72, 150, ItemID.YEW_SHIELD), - ONYX_BOLTS("Onyx bolts", 73, 9.4f, ItemID.ONYX_BOLTS), - RUNE_ARROW("Rune arrow", 75, 12.5f, ItemID.RUNE_ARROW), - AMETHYST_BROAD_BOLTS("Amethyst broad bolts", 76, 10.6f, ItemID.AMETHYST_BROAD_BOLTS), - MAGIC_STOCK("Magic stock", 78, 70, ItemID.MAGIC_STOCK), - DRAGON_CROSSBOW_U("Dragon crossbow (u)", 78, 135, ItemID.DRAGON_CROSSBOW_U), - DRAGON_CROSSBOW("Dragon crossbow", 78, 70, ItemID.DRAGON_CROSSBOW), - MAGIC_SHORTBOW("Magic shortbow", 80, 83.3f, ItemID.MAGIC_SHORTBOW), - MAGIC_SHORTBOW_U("Magic shortbow (u)", 80, 83.3f, ItemID.MAGIC_SHORTBOW_U), - RUNE_DART("Rune dart", 81, 18.8f, ItemID.RUNE_DART), - AMETHYST_ARROW("Amethyst arrow", 82, 13.5f, ItemID.AMETHYST_ARROW), - DRAGON_BOLTS("Dragon bolts", 84, 12, ItemID.DRAGON_BOLTS_UNF), - AMETHYST_JAVELIN("Amethyst javelin", 84, 13.5f, ItemID.AMETHYST_JAVELIN), - MAGIC_LONGBOW("Magic longbow", 85, 91.5f, ItemID.MAGIC_LONGBOW), - MAGIC_LONGBOW_U("Magic longbow (u)", 85, 91.5f, ItemID.MAGIC_LONGBOW_U), - MAGIC_SHIELD("Magic shield", 87, 183, ItemID.MAGIC_SHIELD), - AMETHYST_DART("Amethyst dart", 90, 21, ItemID.AMETHYST_DART), - DRAGON_ARROW("Dragon arrow", 90, 15, ItemID.DRAGON_ARROW), - REDWOOD_SHIELD("Redwood shield", 92, 216, ItemID.REDWOOD_SHIELD), - DRAGON_DART("Dragon dart", 95, 25, ItemID.DRAGON_DART), + ARROW_SHAFT(ItemID.ARROW_SHAFT, 1, 0.33f), + HEADLESS_ARROW(ItemID.HEADLESS_ARROW, 1, 1), + BRONZE_ARROW(ItemID.BRONZE_ARROW, 1, 1.3f), + OGRE_ARROW(ItemID.OGRE_ARROW, 5, 1), + SHORTBOW_U(ItemID.SHORTBOW_U, 5, 5), + SHORTBOW(ItemID.SHORTBOW, 5, 5), + BRONZE_BOLTS(ItemID.BRONZE_BOLTS, 9, 0.5f), + WOODEN_STOCK(ItemID.WOODEN_STOCK, 9, 6), + BRONZE_CROSSBOW_U(ItemID.BRONZE_CROSSBOW_U, 9, 12), + BRONZE_CROSSBOW(ItemID.BRONZE_CROSSBOW, 9, 6), + BRONZE_DART(ItemID.BRONZE_DART, 10, 1.8f), + LONGBOW(ItemID.LONGBOW, 10, 10), + LONGBOW_U(ItemID.LONGBOW_U, 10, 10), + OPAL_BOLTS(ItemID.OPAL_BOLTS, 11, 1.6f), + IRON_ARROW(ItemID.IRON_ARROW, 15, 2.5f), + OAK_SHORTBOW_U(ItemID.OAK_SHORTBOW_U, 20, 16.5f), + OAK_SHORTBOW(ItemID.OAK_SHORTBOW, 20, 16.5f), + IRON_DART(ItemID.IRON_DART, 22, 3.8f), + OAK_STOCK(ItemID.OAK_STOCK, 24, 16), + BLURITE_CROSSBOW_U(ItemID.BLURITE_CROSSBOW_U, 24, 32), + BLURITE_CROSSBOW(ItemID.BLURITE_CROSSBOW, 24, 16), + OAK_LONGBOW_U(ItemID.OAK_LONGBOW_U, 25, 25), + OAK_LONGBOW(ItemID.OAK_LONGBOW, 25, 25), + OAK_SHIELD(ItemID.OAK_SHIELD, 27, 50), + STEEL_ARROW(ItemID.STEEL_ARROW, 30, 5), + KEBBIT_BOLTS(ItemID.KEBBIT_BOLTS, 32, 1), + WILLOW_SHORTBOW_U(ItemID.WILLOW_SHORTBOW_U, 35, 33.3f), + WILLOW_SHORTBOW(ItemID.WILLOW_SHORTBOW, 35, 33.3f), + STEEL_DART(ItemID.STEEL_DART, 37, 7.5f), + IRON_BOLTS(ItemID.IRON_BOLTS, 39, 1.5f), + WILLOW_STOCK(ItemID.WILLOW_STOCK, 39, 22), + IRON_CROSSBOW_U(ItemID.IRON_CROSSBOW_U, 39, 44), + IRON_CROSSBOW(ItemID.IRON_CROSSBOW, 39, 22), + WILLOW_LONGBOW_U(ItemID.WILLOW_LONGBOW_U, 40, 41.5f), + WILLOW_LONGBOW(ItemID.WILLOW_LONGBOW, 40, 41.5f), + BATTLESTAFF(ItemID.BATTLESTAFF, 40, 80), + PEARL_BOLTS(ItemID.PEARL_BOLTS, 41, 3.2f), + WILLOW_SHIELD(ItemID.WILLOW_SHIELD, 42, 83), + LONG_KEBBIT_BOLTS(ItemID.LONG_KEBBIT_BOLTS, 42, 1.3f), + SILVER_BOLTS(ItemID.SILVER_BOLTS, 43, 2.5f), + MITHRIL_ARROW(ItemID.MITHRIL_ARROW, 45, 7.5f), + STEEL_BOLTS(ItemID.STEEL_BOLTS, 46, 3.5f), + TEAK_STOCK(ItemID.TEAK_STOCK, 46, 27), + STEEL_CROSSBOW_U(ItemID.STEEL_CROSSBOW_U, 46, 54), + STEEL_CROSSBOW(ItemID.STEEL_CROSSBOW, 46, 27), + MAPLE_SHORTBOW_U(ItemID.MAPLE_SHORTBOW_U, 50, 50), + MAPLE_SHORTBOW(ItemID.MAPLE_SHORTBOW, 50, 50), + BARBED_BOLTS(ItemID.BARBED_BOLTS, 51, 9.5f), + MITHRIL_DART(ItemID.MITHRIL_DART, 52, 11.2f), + BROAD_ARROWS(ItemID.BROAD_ARROWS, 52, 10), + TOXIC_BLOWPIPE(ItemID.TOXIC_BLOWPIPE, 53, 120), + MITH_CROSSBOW(ItemID.MITHRIL_CROSSBOW, 54, 32), + MAPLE_STOCK(ItemID.MAPLE_STOCK, 54, 32), + MITHRIL_BOLTS(ItemID.MITHRIL_BOLTS, 54, 5), + MITHRIL_CROSSBOW_U(ItemID.MITHRIL_CROSSBOW_U, 54, 64), + MAPLE_LONGBOW_U(ItemID.MAPLE_LONGBOW_U, 55, 58.3f), + BROAD_BOLTS(ItemID.BROAD_BOLTS, 55, 3), + MAPLE_LONGBOW(ItemID.MAPLE_LONGBOW, 55, 58), + SAPPHIRE_BOLTS(ItemID.SAPPHIRE_BOLTS, 56, 4.7f), + MAPLE_SHIELD(ItemID.MAPLE_SHIELD, 57, 116.5f), + EMERALD_BOLTS(ItemID.EMERALD_BOLTS, 58, 5.5f), + ADAMANT_ARROW(ItemID.ADAMANT_ARROW, 60, 10), + ADAMANT_BOLTS(ItemID.ADAMANT_BOLTS, 61, 7), + MAHOGANY_STOCK(ItemID.MAHOGANY_STOCK, 61, 41), + ADAMANT_CROSSBOW_U(ItemID.ADAMANT_CROSSBOW_U, 61, 82), + ADAMANT_CROSSBOW(ItemID.ADAMANT_CROSSBOW, 61, 41), + RUBY_BOLTS(ItemID.RUBY_BOLTS, 63, 6.3f), + DIAMOND_BOLTS(ItemID.DIAMOND_BOLTS, 65, 7), + YEW_SHORTBOW(ItemID.YEW_SHORTBOW, 65, 67.5f), + YEW_SHORTBOW_U(ItemID.YEW_SHORTBOW_U, 65, 67.5f), + ADAMANT_DART(ItemID.ADAMANT_DART, 67, 15), + RUNITE_CROSSBOW_U(ItemID.RUNITE_CROSSBOW_U, 69, 100), + RUNE_CROSSBOW(ItemID.RUNE_CROSSBOW, 69, 50), + YEW_STOCK(ItemID.YEW_STOCK, 69, 50), + RUNITE_BOLTS(ItemID.RUNITE_BOLTS, 69, 10), + YEW_LONGBOW(ItemID.YEW_LONGBOW, 70, 75), + YEW_LONGBOW_U(ItemID.YEW_LONGBOW_U, 70, 75), + DRAGONSTONE_BOLTS(ItemID.DRAGONSTONE_BOLTS, 71, 8.2f), + YEW_SHIELD(ItemID.YEW_SHIELD, 72, 150), + ONYX_BOLTS(ItemID.ONYX_BOLTS, 73, 9.4f), + RUNE_ARROW(ItemID.RUNE_ARROW, 75, 12.5f), + AMETHYST_BROAD_BOLTS(ItemID.AMETHYST_BROAD_BOLTS, 76, 10.6f), + MAGIC_STOCK(ItemID.MAGIC_STOCK, 78, 70), + DRAGON_CROSSBOW_U(ItemID.DRAGON_CROSSBOW_U, 78, 135), + DRAGON_CROSSBOW(ItemID.DRAGON_CROSSBOW, 78, 70), + MAGIC_SHORTBOW(ItemID.MAGIC_SHORTBOW, 80, 83.3f), + MAGIC_SHORTBOW_U(ItemID.MAGIC_SHORTBOW_U, 80, 83.3f), + RUNE_DART(ItemID.RUNE_DART, 81, 18.8f), + AMETHYST_ARROW(ItemID.AMETHYST_ARROW, 82, 13.5f), + DRAGON_BOLTS(ItemID.DRAGON_BOLTS_UNF, 84, 12), + AMETHYST_JAVELIN(ItemID.AMETHYST_JAVELIN, 84, 13.5f), + MAGIC_LONGBOW(ItemID.MAGIC_LONGBOW, 85, 91.5f), + MAGIC_LONGBOW_U(ItemID.MAGIC_LONGBOW_U, 85, 91.5f), + MAGIC_SHIELD(ItemID.MAGIC_SHIELD, 87, 183), + AMETHYST_DART(ItemID.AMETHYST_DART, 90, 21), + DRAGON_ARROW(ItemID.DRAGON_ARROW, 90, 15), + REDWOOD_SHIELD(ItemID.REDWOOD_SHIELD, 92, 216), + DRAGON_DART(ItemID.DRAGON_DART, 95, 25), ; - private final String name; + private final int itemId; private final int level; private final float xp; - private final int icon; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HerbloreAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HerbloreAction.java index fc2d5b6c65..805bea57f0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HerbloreAction.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HerbloreAction.java @@ -30,84 +30,83 @@ import net.runelite.api.ItemID; @AllArgsConstructor @Getter -public enum HerbloreAction implements SkillAction +public enum HerbloreAction implements ItemSkillAction { - ATTACK_POTION_3("Attack potion (3)", 3, 25, ItemID.ATTACK_POTION3), - GUAM_LEAF("Guam leaf", 3, 2.5f, ItemID.GUAM_LEAF), - MARRENTILL("Marrentill", 5, 3.8f, ItemID.MARRENTILL), - ANTIPOISON_3("Antipoison (3)", 5, 37.5f, ItemID.ANTIPOISON3), - RELICYMS_BALM_3("Relicym's balm (3)", 8, 40, ItemID.RELICYMS_BALM3), - TARROMIN("Tarromin", 11, 5, ItemID.TARROMIN), - STRENGTH_POTION_3("Strength potion (3)", 12, 50, ItemID.STRENGTH_POTION3), - SERUM_207_3("Serum 207 (3)", 15, 50, ItemID.SERUM_207_3), - GUTHIX_REST_3("Guthix rest (3)", 18, 59, ItemID.GUTHIX_REST3), - GUAM_TAR("Guam tar", 19, 30, ItemID.GUAM_TAR), - HARRALANDER("Harralander", 20, 6.3f, ItemID.HARRALANDER), - COMPOST_POTION_3("Compost potion (3)", 22, 60, ItemID.COMPOST_POTION3), - RESTORE_POTION_3("Restore potion (3)", 22, 62.5f, ItemID.RESTORE_POTION3), - RANARR_WEED("Ranarr weed", 25, 7.5f, ItemID.RANARR_WEED), - ENERGY_POTION_3("Energy potion (3)", 26, 67.5f, ItemID.ENERGY_POTION3), - TOADFLAX("Toadflax", 30, 8, ItemID.TOADFLAX), - DEFENCE_POTION_3("Defence potion (3)", 30, 75, ItemID.DEFENCE_POTION3), - MARRENTILL_TAR("Marrentill tar", 31, 42.5f, ItemID.MARRENTILL_TAR), - AGILITY_POTION_3("Agility potion (3)", 34, 80, ItemID.AGILITY_POTION3), - COMBAT_POTION_3("Combat potion (3)", 36, 84, ItemID.COMBAT_POTION3), - PRAYER_POTION_3("Prayer potion (3)", 38, 87.5f, ItemID.PRAYER_POTION3), - TARROMIN_TAR("Tarromin tar", 39, 55, ItemID.TARROMIN_TAR), - IRIT_LEAF("Irit leaf", 40, 8.8f, ItemID.IRIT_LEAF), - HARRALANDER_TAR("Harralander tar", 44, 72.5f, ItemID.HARRALANDER_TAR), - SUPER_ATTACK_3("Super attack (3)", 45, 100, ItemID.SUPER_ATTACK3), - SUPERANTIPOISON_3("Superantipoison (3)", 48, 106.3f, ItemID.SUPERANTIPOISON3), - AVANTOE("Avantoe", 48, 10, ItemID.AVANTOE), - FISHING_POTION_3("Fishing potion (3)", 50, 112.5f, ItemID.FISHING_POTION3), - SUPER_ENERGY_3("Super energy (3)", 52, 117.5f, ItemID.SUPER_ENERGY3), - HUNTER_POTION_3("Hunter potion (3)", 53, 120, ItemID.HUNTER_POTION3), - KWUARM("Kwuarm", 54, 11.3f, ItemID.KWUARM), - SUPER_STRENGTH_3("Super strength (3)", 55, 125, ItemID.SUPER_STRENGTH3), - MAGIC_ESSENCE_POTION_3("Magic essence potion (3)", 57, 130, ItemID.MAGIC_ESSENCE3), - SNAPDRAGON("Snapdragon", 59, 11.8f, ItemID.SNAPDRAGON), - WEAPON_POISON("Weapon poison", 60, 137.5f, ItemID.WEAPON_POISON), - SUPER_RESTORE_3("Super restore (3)", 63, 142.5f, ItemID.SUPER_RESTORE3), - CADANTINE("Cadantine", 65, 12.5f, ItemID.CADANTINE), - SANFEW_SERUM_3("Sanfew serum (3)", 65, 160, ItemID.SANFEW_SERUM3), - SUPER_DEFENCE_3("Super defence (3)", 66, 150, ItemID.SUPER_DEFENCE3), - LANTADYME("Lantadyme", 67, 13.1f, ItemID.LANTADYME), - ANTIDOTE_PLUS_3("Antidote+ (3)", 68, 155, ItemID.ANTIDOTE3), - ANTIFIRE_POTION_3("Antifire potion (3)", 69, 157.5f, ItemID.ANTIFIRE_POTION3), - DIVINE_SUPER_ATTACK_POTION_4("Divine super attack potion(4)", 70, 2, ItemID.DIVINE_SUPER_ATTACK_POTION4), - DIVINE_SUPER_DEFENCE_POTION_4("Divine super defence potion(4)", 70, 2, ItemID.DIVINE_SUPER_DEFENCE_POTION4), - DIVINE_SUPER_STRENGTH_POTION_4("Divine super strength potion(4)", 70, 2, ItemID.DIVINE_SUPER_STRENGTH_POTION4), - DWARF_WEED("Dwarf weed", 70, 13.8f, ItemID.DWARF_WEED), - RANGING_POTION_3("Ranging potion (3)", 72, 162.5f, ItemID.RANGING_POTION3), - WEAPON_POISON_PLUS("Weapon poison (+)", 73, 165, ItemID.WEAPON_POISON_5937), - DIVINE_RANGING_POTION_4("Divine ranging potion(4)", 74, 2, ItemID.DIVINE_RANGING_POTION4), - TORSTOL("Torstol", 75, 15, ItemID.TORSTOL), - MAGIC_POTION_3("Magic potion (3)", 76, 172.5f, ItemID.MAGIC_POTION3), - STAMINA_POTION_3("Stamina potion (3)", 77, 76.5f, ItemID.STAMINA_POTION3), - STAMINA_POTION_4("Stamina potion (4)", 77, 102, ItemID.STAMINA_POTION4), - DIVINE_MAGIC_POTION_4("Divine magic potion(4)", 78, 2, ItemID.DIVINE_MAGIC_POTION4), - ZAMORAK_BREW_3("Zamorak brew (3)", 78, 175, ItemID.ZAMORAK_BREW3), - ANTIDOTE_PLUS_PLUS_3("Antidote++ (3)", 79, 177.5f, ItemID.ANTIDOTE3_5954), - BASTION_POTION_3("Bastion potion (3)", 80, 155, ItemID.BASTION_POTION3), - BATTLEMAGE_POTION_3("Battlemage potion (3)", 80, 155, ItemID.BATTLEMAGE_POTION3), - SARADOMIN_BREW_3("Saradomin brew (3)", 81, 180, ItemID.SARADOMIN_BREW3), - WEAPON_POISON_PLUS_PLUS("Weapon poison (++)", 82, 190, ItemID.WEAPON_POISON_5940), - EXTENDED_ANTIFIRE_3("Extended antifire (3)", 84, 82.5f, ItemID.EXTENDED_ANTIFIRE3), - EXTENDED_ANTIFIRE_4("Extended antifire (4)", 84, 110, ItemID.EXTENDED_ANTIFIRE4), - DIVINE_BASTION_POTION_4("Divine bastion potion(4)", 86, 2, ItemID.DIVINE_BASTION_POTION4), - DIVINE_BATTLEMAGE_POTION_4("Divine battlemage potion(4)", 86, 2, ItemID.DIVINE_BATTLEMAGE_POTION4), - ANTIVENOM_3("Anti-venom(3)", 87, 90, ItemID.ANTIVENOM3), - ANTIVENOM_4("Anti-venom(4)", 87, 120, ItemID.ANTIVENOM4), - SUPER_COMBAT_POTION_4("Super combat potion(4)", 90, 150, ItemID.SUPER_COMBAT_POTION4), - SUPER_ANTIFIRE_4("Super antifire (4)", 92, 130, ItemID.SUPER_ANTIFIRE_POTION4), - ANTIVENOM_PLUS_4("Anti-venom+(4)", 94, 125, ItemID.ANTIVENOM4_12913), - DIVINE_SUPER_COMBAT_POTION_4("Divine super combat potion(4)", 97, 2, ItemID.DIVINE_SUPER_COMBAT_POTION4), - EXTENDED_SUPER_ANTIFIRE_3("Extended super antifire (3)", 98, 120, ItemID.SUPER_ANTIFIRE_POTION3), - EXTENDED_SUPER_ANTIFIRE_4("Extended super antifire (4)", 98, 160, ItemID.SUPER_ANTIFIRE_POTION4), + ATTACK_POTION_3(ItemID.ATTACK_POTION3, 3, 25), + GUAM_LEAF(ItemID.GUAM_LEAF, 3, 2.5f), + MARRENTILL(ItemID.MARRENTILL, 5, 3.8f), + ANTIPOISON_3(ItemID.ANTIPOISON3, 5, 37.5f), + RELICYMS_BALM_3(ItemID.RELICYMS_BALM3, 8, 40), + TARROMIN(ItemID.TARROMIN, 11, 5), + STRENGTH_POTION_3(ItemID.STRENGTH_POTION3, 12, 50), + SERUM_207_3(ItemID.SERUM_207_3, 15, 50), + GUTHIX_REST_3(ItemID.GUTHIX_REST3, 18, 59), + GUAM_TAR(ItemID.GUAM_TAR, 19, 30), + HARRALANDER(ItemID.HARRALANDER, 20, 6.3f), + COMPOST_POTION_3(ItemID.COMPOST_POTION3, 22, 60), + RESTORE_POTION_3(ItemID.RESTORE_POTION3, 22, 62.5f), + RANARR_WEED(ItemID.RANARR_WEED, 25, 7.5f), + ENERGY_POTION_3(ItemID.ENERGY_POTION3, 26, 67.5f), + TOADFLAX(ItemID.TOADFLAX, 30, 8), + DEFENCE_POTION_3(ItemID.DEFENCE_POTION3, 30, 75), + MARRENTILL_TAR(ItemID.MARRENTILL_TAR, 31, 42.5f), + AGILITY_POTION_3(ItemID.AGILITY_POTION3, 34, 80), + COMBAT_POTION_3(ItemID.COMBAT_POTION3, 36, 84), + PRAYER_POTION_3(ItemID.PRAYER_POTION3, 38, 87.5f), + TARROMIN_TAR(ItemID.TARROMIN_TAR, 39, 55), + IRIT_LEAF(ItemID.IRIT_LEAF, 40, 8.8f), + HARRALANDER_TAR(ItemID.HARRALANDER_TAR, 44, 72.5f), + SUPER_ATTACK_3(ItemID.SUPER_ATTACK3, 45, 100), + SUPERANTIPOISON_3(ItemID.SUPERANTIPOISON3, 48, 106.3f), + AVANTOE(ItemID.AVANTOE, 48, 10), + FISHING_POTION_3(ItemID.FISHING_POTION3, 50, 112.5f), + SUPER_ENERGY_3(ItemID.SUPER_ENERGY3, 52, 117.5f), + HUNTER_POTION_3(ItemID.HUNTER_POTION3, 53, 120), + KWUARM(ItemID.KWUARM, 54, 11.3f), + SUPER_STRENGTH_3(ItemID.SUPER_STRENGTH3, 55, 125), + MAGIC_ESSENCE_POTION_3(ItemID.MAGIC_ESSENCE3, 57, 130), + SNAPDRAGON(ItemID.SNAPDRAGON, 59, 11.8f), + WEAPON_POISON(ItemID.WEAPON_POISON, 60, 137.5f), + SUPER_RESTORE_3(ItemID.SUPER_RESTORE3, 63, 142.5f), + CADANTINE(ItemID.CADANTINE, 65, 12.5f), + SANFEW_SERUM_3(ItemID.SANFEW_SERUM3, 65, 160), + SUPER_DEFENCE_3(ItemID.SUPER_DEFENCE3, 66, 150), + LANTADYME(ItemID.LANTADYME, 67, 13.1f), + ANTIDOTE_PLUS_3(ItemID.ANTIDOTE3, 68, 155), + ANTIFIRE_POTION_3(ItemID.ANTIFIRE_POTION3, 69, 157.5f), + DIVINE_SUPER_ATTACK_POTION_4(ItemID.DIVINE_SUPER_ATTACK_POTION4, 70, 2), + DIVINE_SUPER_DEFENCE_POTION_4(ItemID.DIVINE_SUPER_DEFENCE_POTION4, 70, 2), + DIVINE_SUPER_STRENGTH_POTION_4(ItemID.DIVINE_SUPER_STRENGTH_POTION4, 70, 2), + DWARF_WEED(ItemID.DWARF_WEED, 70, 13.8f), + RANGING_POTION_3(ItemID.RANGING_POTION3, 72, 162.5f), + WEAPON_POISON_PLUS(ItemID.WEAPON_POISON_5937, 73, 165), + DIVINE_RANGING_POTION_4(ItemID.DIVINE_RANGING_POTION4, 74, 2), + TORSTOL(ItemID.TORSTOL, 75, 15), + MAGIC_POTION_3(ItemID.MAGIC_POTION3, 76, 172.5f), + STAMINA_POTION_3(ItemID.STAMINA_POTION3, 77, 76.5f), + STAMINA_POTION_4(ItemID.STAMINA_POTION4, 77, 102), + DIVINE_MAGIC_POTION_4(ItemID.DIVINE_MAGIC_POTION4, 78, 2), + ZAMORAK_BREW_3(ItemID.ZAMORAK_BREW3, 78, 175), + ANTIDOTE_PLUS_PLUS_3(ItemID.ANTIDOTE3_5954, 79, 177.5f), + BASTION_POTION_3(ItemID.BASTION_POTION3, 80, 155), + BATTLEMAGE_POTION_3(ItemID.BATTLEMAGE_POTION3, 80, 155), + SARADOMIN_BREW_3(ItemID.SARADOMIN_BREW3, 81, 180), + WEAPON_POISON_PLUS_PLUS(ItemID.WEAPON_POISON_5940, 82, 190), + EXTENDED_ANTIFIRE_3(ItemID.EXTENDED_ANTIFIRE3, 84, 82.5f), + EXTENDED_ANTIFIRE_4(ItemID.EXTENDED_ANTIFIRE4, 84, 110), + DIVINE_BASTION_POTION_4(ItemID.DIVINE_BASTION_POTION4, 86, 2), + DIVINE_BATTLEMAGE_POTION_4(ItemID.DIVINE_BATTLEMAGE_POTION4, 86, 2), + ANTIVENOM_3(ItemID.ANTIVENOM3, 87, 90), + ANTIVENOM_4(ItemID.ANTIVENOM4, 87, 120), + SUPER_COMBAT_POTION_4(ItemID.SUPER_COMBAT_POTION4, 90, 150), + SUPER_ANTIFIRE_4(ItemID.SUPER_ANTIFIRE_POTION4, 92, 130), + ANTIVENOM_PLUS_4(ItemID.ANTIVENOM4_12913, 94, 125), + DIVINE_SUPER_COMBAT_POTION_4(ItemID.DIVINE_SUPER_COMBAT_POTION4, 97, 2), + EXTENDED_SUPER_ANTIFIRE_3(ItemID.SUPER_ANTIFIRE_POTION3, 98, 120), + EXTENDED_SUPER_ANTIFIRE_4(ItemID.SUPER_ANTIFIRE_POTION4, 98, 160), ; - private final String name; + private final int itemId; private final int level; private final float xp; - private final int icon; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HunterAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HunterAction.java index 01ed388c80..644bcd2598 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HunterAction.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HunterAction.java @@ -30,7 +30,7 @@ import net.runelite.api.ItemID; @AllArgsConstructor @Getter -public enum HunterAction implements SkillAction +public enum HunterAction implements NamedSkillAction { CRIMSON_SWIFT("Crimson Swift", 1, 34, ItemID.CRIMSON_SWIFT), POLAR_KEBBIT("Polar Kebbit", 1, 30, ItemID.KEBBIT), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ItemSkillAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ItemSkillAction.java new file mode 100644 index 0000000000..61a148749a --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ItemSkillAction.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import net.runelite.client.game.ItemManager; + +/** + * An object representing a single skill action involving an item which grants some xp. + */ +public interface ItemSkillAction extends SkillAction +{ + /** + * Gets the item ID used for this action. + * + * @return The item ID used for this action. + * @see net.runelite.api.ItemID + */ + int getItemId(); + + /** + * Gets the item icon ID for this skill action. + * + * @return The item icon ID of this skill action. + * @see net.runelite.api.ItemID + * @see #getItemId() + */ + @Override + default int getIcon() + { + return getItemId(); + } + + /** + * Gets the name of this skill action's associated item. + * + * @param itemManager An {@link ItemManager item manager} instance. + * @return The name of this skill action item. + * @see #getItemId() + */ + @Override + default String getName(final ItemManager itemManager) + { + return itemManager.getItemComposition(getItemId()).getName(); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MagicAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MagicAction.java index bb3b5a20ff..e907ebb48a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MagicAction.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MagicAction.java @@ -27,6 +27,7 @@ package net.runelite.client.plugins.skillcalculator.skills; import lombok.AllArgsConstructor; import lombok.Getter; import net.runelite.api.SpriteID; +import net.runelite.client.game.ItemManager; @AllArgsConstructor @Getter @@ -218,4 +219,10 @@ public enum MagicAction implements SkillAction private final int level; private final float xp; private final int sprite; + + @Override + public String getName(final ItemManager itemManager) + { + return getName(); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MiningAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MiningAction.java index cdbcdb74cf..e16b0cd6c2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MiningAction.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MiningAction.java @@ -31,7 +31,7 @@ import net.runelite.api.NullItemID; @AllArgsConstructor @Getter -public enum MiningAction implements SkillAction +public enum MiningAction implements NamedSkillAction { CLAY("Clay", 1, 5, ItemID.CLAY), RUNE_ESSENCE("Rune essence", 1, 5, ItemID.RUNE_ESSENCE), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/NamedSkillAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/NamedSkillAction.java new file mode 100644 index 0000000000..b551474bc9 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/NamedSkillAction.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.skillcalculator.skills; + +import net.runelite.client.game.ItemManager; + +/** + * An object representing a single skill action which grants some xp, with an explicitly defined name field. + */ +public interface NamedSkillAction extends SkillAction +{ + /** + * Gets the name of this skill action, usually the item or object created, or the spell cast. + * + * @return The name of this skill action. + */ + String getName(); + + @Override + default String getName(ItemManager itemManager) + { + return getName(); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerAction.java index 0995027103..ba4c1fa48e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerAction.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerAction.java @@ -30,71 +30,70 @@ import net.runelite.api.ItemID; @AllArgsConstructor @Getter -public enum PrayerAction implements SkillAction +public enum PrayerAction implements ItemSkillAction { - ENSOULED_GOBLIN_HEAD("Ensouled goblin head", 1, 130, ItemID.ENSOULED_GOBLIN_HEAD, true), - ENSOULED_MONKEY_HEAD("Ensouled monkey head", 1, 182, ItemID.ENSOULED_MONKEY_HEAD, true), - ENSOULED_IMP_HEAD("Ensouled imp head", 1, 286, ItemID.ENSOULED_IMP_HEAD, true), - ENSOULED_MINOTAUR_HEAD("Ensouled minotaur head", 1, 364, ItemID.ENSOULED_MINOTAUR_HEAD, true), - ENSOULED_SCORPION_HEAD("Ensouled scorpion head", 1, 454, ItemID.ENSOULED_SCORPION_HEAD, true), - ENSOULED_BEAR_HEAD("Ensouled bear head", 1, 480, ItemID.ENSOULED_BEAR_HEAD, true), - ENSOULED_UNICORN_HEAD("Ensouled unicorn head", 1, 494, ItemID.ENSOULED_UNICORN_HEAD, true), - ENSOULED_DOG_HEAD("Ensouled dog head", 1, 520, ItemID.ENSOULED_DOG_HEAD, true), - ENSOULED_CHAOS_DRUID_HEAD("Ensouled chaos druid head", 1, 584, ItemID.ENSOULED_CHAOS_DRUID_HEAD, true), - ENSOULED_GIANT_HEAD("Ensouled giant head", 1, 650, ItemID.ENSOULED_GIANT_HEAD, true), - ENSOULED_OGRE_HEAD("Ensouled ogre head", 1, 716, ItemID.ENSOULED_OGRE_HEAD, true), - ENSOULED_ELF_HEAD("Ensouled elf head", 1, 754, ItemID.ENSOULED_ELF_HEAD, true), - ENSOULED_TROLL_HEAD("Ensouled troll head", 1, 780, ItemID.ENSOULED_TROLL_HEAD, true), - ENSOULED_HORROR_HEAD("Ensouled horror head", 1, 832, ItemID.ENSOULED_HORROR_HEAD, true), - ENSOULED_KALPHITE_HEAD("Ensouled kalphite head", 1, 884, ItemID.ENSOULED_KALPHITE_HEAD, true), - ENSOULED_DAGANNOTH_HEAD("Ensouled dagannoth head", 1, 936, ItemID.ENSOULED_DAGANNOTH_HEAD, true), - ENSOULED_BLOODVELD_HEAD("Ensouled bloodveld head", 1, 1040, ItemID.ENSOULED_BLOODVELD_HEAD, true), - ENSOULED_TZHAAR_HEAD("Ensouled tzhaar head", 1, 1104, ItemID.ENSOULED_TZHAAR_HEAD, true), - ENSOULED_DEMON_HEAD("Ensouled demon head", 1, 1170, ItemID.ENSOULED_DEMON_HEAD, true), - ENSOULED_AVIANSIE_HEAD("Ensouled aviansie head", 1, 1234, ItemID.ENSOULED_AVIANSIE_HEAD, true), - ENSOULED_ABYSSAL_HEAD("Ensouled abyssal head", 1, 1300, ItemID.ENSOULED_ABYSSAL_HEAD, true), - ENSOULED_DRAGON_HEAD("Ensouled dragon head", 1, 1560, ItemID.ENSOULED_DRAGON_HEAD, true), - FIENDISH_ASHES("Fiendish ashes", 1, 10, ItemID.FIENDISH_ASHES, true), - VILE_ASHES("Vile ashes", 1, 25, ItemID.VILE_ASHES, true), - MALICIOUS_ASHES("Malicious ashes", 1, 65, ItemID.MALICIOUS_ASHES, true), - ABYSSAL_ASHES("Abyssal ashes", 1, 85, ItemID.ABYSSAL_ASHES, true), - INFERNAL_ASHES("Infernal ashes", 1, 110, ItemID.INFERNAL_ASHES, true), - BONES("Bones", 1, 4.5f, ItemID.BONES, false), - WOLF_BONES("Wolf bones", 1, 4.5f, ItemID.WOLF_BONES, false), - LOAR_REMAINS("Loar remains", 1, 33, ItemID.LOAR_REMAINS, false), - BURNT_BONES("Burnt bones", 1, 4.5f, ItemID.BURNT_BONES, false), - MONKEY_BONES("Monkey bones", 1, 5, ItemID.MONKEY_BONES, false), - BAT_BONES("Bat bones", 1, 5.3f, ItemID.BAT_BONES, false), - JOGRE_BONES("Jogre bones", 1, 15, ItemID.JOGRE_BONES, false), - BIG_BONES("Big bones", 1, 15, ItemID.BIG_BONES, false), - ZOGRE_BONES("Zogre bones", 1, 22.5f, ItemID.ZOGRE_BONES, false), - SHAIKAHAN_BONES("Shaikahan bones", 1, 25, ItemID.SHAIKAHAN_BONES, false), - BABYDRAGON_BONES("Babydragon bones", 1, 30, ItemID.BABYDRAGON_BONES, false), - PHRIN_REMAINS("Phrin remains", 1, 46.5f, ItemID.PHRIN_REMAINS, false), - WYRM_BONES("Wyrm bones", 1, 50, ItemID.WYRM_BONES, false), - RIYL_REMAINS("Riyl remains", 1, 59.5f, ItemID.RIYL_REMAINS, false), - WYVERN_BONES("Wyvern bones", 1, 72, ItemID.WYVERN_BONES, false), - DRAGON_BONES("Dragon bones", 1, 72, ItemID.DRAGON_BONES, false), - DRAKE_BONES("Drake bones", 1, 80, ItemID.DRAKE_BONES, false), - ASYN_REMAINS("Asyn remains", 1, 82.5f, ItemID.ASYN_REMAINS, false), - FAYRG_BONES("Fayrg bones", 1, 84, ItemID.FAYRG_BONES, false), - FIYR_REMAINS("Fiyr remains", 1, 84, ItemID.FIYR_REMAINS, false), - LAVA_DRAGON_BONES("Lava dragon bones", 1, 85, ItemID.LAVA_DRAGON_BONES, false), - RAURG_BONES("Raurg bones", 1, 96, ItemID.RAURG_BONES, false), - HYDRA_BONES("Hydra bones", 1, 110, ItemID.HYDRA_BONES, false), - DAGANNOTH_BONES("Dagannoth bones", 1, 125, ItemID.DAGANNOTH_BONES, false), - OURG_BONES("Ourg bones", 1, 140, ItemID.OURG_BONES, false), - URIUM_REMAINS("Urium remains", 1, 120, ItemID.URIUM_REMAINS, false), - GUPPY("Guppy", 1, 4, ItemID.GUPPY, false), - CAVEFISH("Cavefish", 1, 7, ItemID.CAVEFISH, false), - TETRA("Tetra", 1, 10, ItemID.TETRA, false), - CATFISH("Catfish", 1, 16, ItemID.CATFISH, false), - SUPERIOR_DRAGON_BONES("Superior dragon bones", 70, 150, ItemID.SUPERIOR_DRAGON_BONES, false), + ENSOULED_GOBLIN_HEAD(ItemID.ENSOULED_GOBLIN_HEAD, 1, 130, true), + ENSOULED_MONKEY_HEAD(ItemID.ENSOULED_MONKEY_HEAD, 1, 182, true), + ENSOULED_IMP_HEAD(ItemID.ENSOULED_IMP_HEAD, 1, 286, true), + ENSOULED_MINOTAUR_HEAD(ItemID.ENSOULED_MINOTAUR_HEAD, 1, 364, true), + ENSOULED_SCORPION_HEAD(ItemID.ENSOULED_SCORPION_HEAD, 1, 454, true), + ENSOULED_BEAR_HEAD(ItemID.ENSOULED_BEAR_HEAD, 1, 480, true), + ENSOULED_UNICORN_HEAD(ItemID.ENSOULED_UNICORN_HEAD, 1, 494, true), + ENSOULED_DOG_HEAD(ItemID.ENSOULED_DOG_HEAD, 1, 520, true), + ENSOULED_CHAOS_DRUID_HEAD(ItemID.ENSOULED_CHAOS_DRUID_HEAD, 1, 584, true), + ENSOULED_GIANT_HEAD(ItemID.ENSOULED_GIANT_HEAD, 1, 650, true), + ENSOULED_OGRE_HEAD(ItemID.ENSOULED_OGRE_HEAD, 1, 716, true), + ENSOULED_ELF_HEAD(ItemID.ENSOULED_ELF_HEAD, 1, 754, true), + ENSOULED_TROLL_HEAD(ItemID.ENSOULED_TROLL_HEAD, 1, 780, true), + ENSOULED_HORROR_HEAD(ItemID.ENSOULED_HORROR_HEAD, 1, 832, true), + ENSOULED_KALPHITE_HEAD(ItemID.ENSOULED_KALPHITE_HEAD, 1, 884, true), + ENSOULED_DAGANNOTH_HEAD(ItemID.ENSOULED_DAGANNOTH_HEAD, 1, 936, true), + ENSOULED_BLOODVELD_HEAD(ItemID.ENSOULED_BLOODVELD_HEAD, 1, 1040, true), + ENSOULED_TZHAAR_HEAD(ItemID.ENSOULED_TZHAAR_HEAD, 1, 1104, true), + ENSOULED_DEMON_HEAD(ItemID.ENSOULED_DEMON_HEAD, 1, 1170, true), + ENSOULED_AVIANSIE_HEAD(ItemID.ENSOULED_AVIANSIE_HEAD, 1, 1234, true), + ENSOULED_ABYSSAL_HEAD(ItemID.ENSOULED_ABYSSAL_HEAD, 1, 1300, true), + ENSOULED_DRAGON_HEAD(ItemID.ENSOULED_DRAGON_HEAD, 1, 1560, true), + FIENDISH_ASHES(ItemID.FIENDISH_ASHES, 1, 10, true), + VILE_ASHES(ItemID.VILE_ASHES, 1, 25, true), + MALICIOUS_ASHES(ItemID.MALICIOUS_ASHES, 1, 65, true), + ABYSSAL_ASHES(ItemID.ABYSSAL_ASHES, 1, 85, true), + INFERNAL_ASHES(ItemID.INFERNAL_ASHES, 1, 110, true), + BONES(ItemID.BONES, 1, 4.5f, false), + WOLF_BONES(ItemID.WOLF_BONES, 1, 4.5f, false), + LOAR_REMAINS(ItemID.LOAR_REMAINS, 1, 33, false), + BURNT_BONES(ItemID.BURNT_BONES, 1, 4.5f, false), + MONKEY_BONES(ItemID.MONKEY_BONES, 1, 5, false), + BAT_BONES(ItemID.BAT_BONES, 1, 5.3f, false), + JOGRE_BONES(ItemID.JOGRE_BONES, 1, 15, false), + BIG_BONES(ItemID.BIG_BONES, 1, 15, false), + ZOGRE_BONES(ItemID.ZOGRE_BONES, 1, 22.5f, false), + SHAIKAHAN_BONES(ItemID.SHAIKAHAN_BONES, 1, 25, false), + BABYDRAGON_BONES(ItemID.BABYDRAGON_BONES, 1, 30, false), + PHRIN_REMAINS(ItemID.PHRIN_REMAINS, 1, 46.5f, false), + WYRM_BONES(ItemID.WYRM_BONES, 1, 50, false), + RIYL_REMAINS(ItemID.RIYL_REMAINS, 1, 59.5f, false), + WYVERN_BONES(ItemID.WYVERN_BONES, 1, 72, false), + DRAGON_BONES(ItemID.DRAGON_BONES, 1, 72, false), + DRAKE_BONES(ItemID.DRAKE_BONES, 1, 80, false), + ASYN_REMAINS(ItemID.ASYN_REMAINS, 1, 82.5f, false), + FAYRG_BONES(ItemID.FAYRG_BONES, 1, 84, false), + FIYR_REMAINS(ItemID.FIYR_REMAINS, 1, 84, false), + LAVA_DRAGON_BONES(ItemID.LAVA_DRAGON_BONES, 1, 85, false), + RAURG_BONES(ItemID.RAURG_BONES, 1, 96, false), + HYDRA_BONES(ItemID.HYDRA_BONES, 1, 110, false), + DAGANNOTH_BONES(ItemID.DAGANNOTH_BONES, 1, 125, false), + OURG_BONES(ItemID.OURG_BONES, 1, 140, false), + URIUM_REMAINS(ItemID.URIUM_REMAINS, 1, 120, false), + GUPPY(ItemID.GUPPY, 1, 4, false), + CAVEFISH(ItemID.CAVEFISH, 1, 7, false), + TETRA(ItemID.TETRA, 1, 10, false), + CATFISH(ItemID.CATFISH, 1, 16, false), + SUPERIOR_DRAGON_BONES(ItemID.SUPERIOR_DRAGON_BONES, 70, 150, false), ; - private final String name; + private final int itemId; private final int level; private final float xp; - private final int icon; private final boolean ignoreBonus; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/RunecraftAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/RunecraftAction.java index d6eda355db..b779822207 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/RunecraftAction.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/RunecraftAction.java @@ -30,49 +30,48 @@ import net.runelite.api.ItemID; @AllArgsConstructor @Getter -public enum RunecraftAction implements SkillAction +public enum RunecraftAction implements ItemSkillAction { - AIR_TIARA("Air tiara", 1, 25, ItemID.AIR_TIARA, true), - MIND_TIARA("Mind tiara", 1, 27.5f, ItemID.MIND_TIARA, true), - WATER_TIARA("Water tiara", 1, 30, ItemID.WATER_TIARA, true), - EARTH_TIARA("Earth tiara", 1, 32.5f, ItemID.EARTH_TIARA, true), - FIRE_TIARA("Fire tiara", 1, 35, ItemID.FIRE_TIARA, true), - BODY_TIARA("Body tiara", 1, 37.5f, ItemID.BODY_TIARA, true), - COSMIC_TIARA("Cosmic tiara", 1, 40, ItemID.COSMIC_TIARA, true), - CHAOS_TIARA("Chaos tiara", 1, 42.5f, ItemID.CHAOS_TIARA, true), - NATURE_TIARA("Nature tiara", 1, 45, ItemID.NATURE_TIARA, true), - LAW_TIARA("Law tiara", 1, 47.5f, ItemID.LAW_TIARA, true), - DEATH_TIARA("Death tiara", 1, 50, ItemID.DEATH_TIARA, true), - WRATH_TIARA("Wrath tiara", 1, 52.5f, ItemID.WRATH_TIARA, true), - AIR_RUNE("Air rune", 1, 5, ItemID.AIR_RUNE, false), - MIND_RUNE("Mind rune", 2, 5.5f, ItemID.MIND_RUNE, false), - MIND_CORE("Mind core", 2, 55, ItemID.MIND_CORE, false), - WATER_RUNE("Water rune", 5, 6, ItemID.WATER_RUNE, false), - MIST_RUNE("Mist rune", 6, 8.5f, ItemID.MIST_RUNE, false), - EARTH_RUNE("Earth rune", 9, 6.5f, ItemID.EARTH_RUNE, false), - DUST_RUNE("Dust rune", 10, 9, ItemID.DUST_RUNE, false), - MUD_RUNE("Mud rune", 13, 9.5f, ItemID.MUD_RUNE, false), - FIRE_RUNE("Fire rune", 14, 7, ItemID.FIRE_RUNE, false), - SMOKE_RUNE("Smoke rune", 15, 9.5f, ItemID.SMOKE_RUNE, false), - STEAM_RUNE("Steam rune", 19, 10, ItemID.STEAM_RUNE, false), - BODY_RUNE("Body rune", 20, 7.5f, ItemID.BODY_RUNE, false), - BODY_CORE("Body core", 20, 75, ItemID.BODY_CORE, false), - LAVA_RUNE("Lava rune", 23, 10.5f, ItemID.LAVA_RUNE, false), - COSMIC_RUNE("Cosmic rune", 27, 8, ItemID.COSMIC_RUNE, false), - CHAOS_RUNE("Chaos rune", 35, 8.5f, ItemID.CHAOS_RUNE, false), - CHAOS_CORE("Chaos core", 35, 85, ItemID.CHAOS_CORE, false), - ASTRAL_RUNE("Astral rune", 40, 8.7f, ItemID.ASTRAL_RUNE, false), - NATURE_RUNE("Nature rune", 44, 9, ItemID.NATURE_RUNE, false), - LAW_RUNE("Law rune", 54, 9.5f, ItemID.LAW_RUNE, false), - DEATH_RUNE("Death rune", 65, 10, ItemID.DEATH_RUNE, false), - BLOOD_RUNE("Blood rune", 77, 24.425f, ItemID.BLOOD_RUNE, true), - SOUL_RUNE("Soul rune", 90, 30.325f, ItemID.SOUL_RUNE, true), - WRATH_RUNE("Wrath rune", 95, 8, ItemID.WRATH_RUNE, false), + AIR_TIARA(ItemID.AIR_TIARA, 1, 25, true), + MIND_TIARA(ItemID.MIND_TIARA, 1, 27.5f, true), + WATER_TIARA(ItemID.WATER_TIARA, 1, 30, true), + EARTH_TIARA(ItemID.EARTH_TIARA, 1, 32.5f, true), + FIRE_TIARA(ItemID.FIRE_TIARA, 1, 35, true), + BODY_TIARA(ItemID.BODY_TIARA, 1, 37.5f, true), + COSMIC_TIARA(ItemID.COSMIC_TIARA, 1, 40, true), + CHAOS_TIARA(ItemID.CHAOS_TIARA, 1, 42.5f, true), + NATURE_TIARA(ItemID.NATURE_TIARA, 1, 45, true), + LAW_TIARA(ItemID.LAW_TIARA, 1, 47.5f, true), + DEATH_TIARA(ItemID.DEATH_TIARA, 1, 50, true), + WRATH_TIARA(ItemID.WRATH_TIARA, 1, 52.5f, true), + AIR_RUNE(ItemID.AIR_RUNE, 1, 5, false), + MIND_RUNE(ItemID.MIND_RUNE, 2, 5.5f, false), + MIND_CORE(ItemID.MIND_CORE, 2, 55, false), + WATER_RUNE(ItemID.WATER_RUNE, 5, 6, false), + MIST_RUNE(ItemID.MIST_RUNE, 6, 8.5f, false), + EARTH_RUNE(ItemID.EARTH_RUNE, 9, 6.5f, false), + DUST_RUNE(ItemID.DUST_RUNE, 10, 9, false), + MUD_RUNE(ItemID.MUD_RUNE, 13, 9.5f, false), + FIRE_RUNE(ItemID.FIRE_RUNE, 14, 7, false), + SMOKE_RUNE(ItemID.SMOKE_RUNE, 15, 9.5f, false), + STEAM_RUNE(ItemID.STEAM_RUNE, 19, 10, false), + BODY_RUNE(ItemID.BODY_RUNE, 20, 7.5f, false), + BODY_CORE(ItemID.BODY_CORE, 20, 75, false), + LAVA_RUNE(ItemID.LAVA_RUNE, 23, 10.5f, false), + COSMIC_RUNE(ItemID.COSMIC_RUNE, 27, 8, false), + CHAOS_RUNE(ItemID.CHAOS_RUNE, 35, 8.5f, false), + CHAOS_CORE(ItemID.CHAOS_CORE, 35, 85, false), + ASTRAL_RUNE(ItemID.ASTRAL_RUNE, 40, 8.7f, false), + NATURE_RUNE(ItemID.NATURE_RUNE, 44, 9, false), + LAW_RUNE(ItemID.LAW_RUNE, 54, 9.5f, false), + DEATH_RUNE(ItemID.DEATH_RUNE, 65, 10, false), + BLOOD_RUNE(ItemID.BLOOD_RUNE, 77, 24.425f, true), + SOUL_RUNE(ItemID.SOUL_RUNE, 90, 30.325f, true), + WRATH_RUNE(ItemID.WRATH_RUNE, 95, 8, false), ; - private final String name; + private final int itemId; private final int level; private final float xp; - private final int icon; private final boolean ignoreBonus; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SkillAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SkillAction.java index 9f6153678a..f7b739457c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SkillAction.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SkillAction.java @@ -24,17 +24,22 @@ */ package net.runelite.client.plugins.skillcalculator.skills; +import net.runelite.api.ItemComposition; +import net.runelite.client.game.ItemManager; + /** * An object representing a single skill action which grants some xp. */ public interface SkillAction { /** - * Gets the name of this skill action, usually the item or object created, or the spell cast. + * Gets the name of this skill action, usually the item or object created, or the spell cast. This name may be + * fetched via {@link ItemComposition#getName()} from some defined item ID or explicitly defined. * + * @param itemManager An {@link ItemManager item manager} instance. * @return The name of this skill action. */ - String getName(); + String getName(final ItemManager itemManager); /** * Gets the level required to perform this skill action. diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SmithingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SmithingAction.java index 8e32705cd1..f4211febb9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SmithingAction.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SmithingAction.java @@ -30,193 +30,192 @@ import net.runelite.api.ItemID; @AllArgsConstructor @Getter -public enum SmithingAction implements SkillAction +public enum SmithingAction implements ItemSkillAction { - BRONZE_BAR("Bronze bar", 1, 6.3f, ItemID.BRONZE_BAR), - BRONZE_AXE("Bronze axe", 1, 12.5f, ItemID.BRONZE_AXE), - BRONZE_DAGGER("Bronze dagger", 1, 12.5f, ItemID.BRONZE_DAGGER), - BRONZE_MACE("Bronze mace", 2, 12.5f, ItemID.BRONZE_MACE), - BRONZE_MED_HELM("Bronze med helm", 3, 12.5f, ItemID.BRONZE_MED_HELM), - BRONZE_BOLTS_UNF("Bronze bolts (unf)", 3, 12.5f, ItemID.BRONZE_BOLTS_UNF), - BRONZE_NAILS("Bronze nails", 4, 12.5f, ItemID.BRONZE_NAILS), - BRONZE_SWORD("Bronze sword", 4, 12.5f, ItemID.BRONZE_SWORD), - BRONZE_WIRE("Bronze wire", 4, 12.5f, ItemID.BRONZE_WIRE), - BRONZE_DART_TIP("Bronze dart tip", 4, 12.5f, ItemID.BRONZE_DART_TIP), - BRONZE_ARROWTIPS("Bronze arrowtips", 5, 12.5f, ItemID.BRONZE_ARROWTIPS), - BRONZE_SCIMITAR("Bronze scimitar", 5, 25, ItemID.BRONZE_SCIMITAR), - BRONZE_HASTA("Bronze hasta", 5, 25, ItemID.BRONZE_HASTA), - BRONZE_SPEAR("Bronze spear", 5, 25, ItemID.BRONZE_SPEAR), - BRONZE_JAVELIN_HEADS("Bronze javelin heads", 6, 12.5f, ItemID.BRONZE_JAVELIN_HEADS), - BRONZE_LONGSWORD("Bronze longsword", 6, 25, ItemID.BRONZE_LONGSWORD), - BRONZE_LIMBS("Bronze limbs", 6, 12.5f, ItemID.BRONZE_LIMBS), - BRONZE_KNIFE("Bronze knife", 7, 12.5f, ItemID.BRONZE_KNIFE), - BRONZE_FULL_HELM("Bronze full helm", 7, 25, ItemID.BRONZE_FULL_HELM), - BRONZE_SQ_SHIELD("Bronze sq shield", 8, 25, ItemID.BRONZE_SQ_SHIELD), - BRONZE_WARHAMMER("Bronze warhammer", 9, 37.5f, ItemID.BRONZE_WARHAMMER), - BRONZE_BATTLEAXE("Bronze battleaxe", 10, 37.5f, ItemID.BRONZE_BATTLEAXE), - BRONZE_CHAINBODY("Bronze chainbody", 11, 37.5f, ItemID.BRONZE_CHAINBODY), - BRONZE_KITESHIELD("Bronze kiteshield", 12, 37.5f, ItemID.BRONZE_KITESHIELD), - BRONZE_CLAWS("Bronze claws", 13, 25, ItemID.BRONZE_CLAWS), - BRONZE_2H_SWORD("Bronze 2h sword", 14, 37.5f, ItemID.BRONZE_2H_SWORD), - BARRONITE_DEPOSITS("Barronite deposits", 14, 30, ItemID.BARRONITE_DEPOSIT), - IRON_BAR("Iron bar", 15, 12.5f, ItemID.IRON_BAR), - IRON_DAGGER("Iron dagger", 15, 25, ItemID.IRON_DAGGER), - IRON_AXE("Iron axe", 16, 25, ItemID.IRON_AXE), - BRONZE_PLATELEGS("Bronze platelegs", 16, 37.5f, ItemID.BRONZE_PLATELEGS), - BRONZE_PLATESKIRT("Bronze plateskirt", 16, 37.5f, ItemID.BRONZE_PLATESKIRT), - IRON_SPIT("Iron spit", 17, 25, ItemID.IRON_SPIT), - IRON_MACE("Iron mace", 17, 25, ItemID.IRON_MACE), - IRON_BOLTS_UNF("Iron bolts (unf)", 18, 25, ItemID.IRON_BOLTS_UNF), - BRONZE_PLATEBODY("Bronze platebody", 18, 62.5f, ItemID.BRONZE_PLATEBODY), - IRON_MED_HELM("Iron med helm", 18, 25, ItemID.IRON_MED_HELM), - IRON_NAILS("Iron nails", 19, 25, ItemID.IRON_NAILS), - IRON_DART_TIP("Iron dart tip", 19, 25, ItemID.IRON_DART_TIP), - IRON_SWORD("Iron sword", 19, 25, ItemID.IRON_SWORD), - SILVER_BAR("Silver bar", 20, 13.7f, ItemID.SILVER_BAR), - IRON_ARROWTIPS("Iron arrowtips", 20, 25, ItemID.IRON_ARROWTIPS), - IRON_SCIMITAR("Iron scimitar", 20, 50, ItemID.IRON_SCIMITAR), - IRON_HASTA("Iron hasta", 20, 50, ItemID.IRON_HASTA), - IRON_SPEAR("Iron spear", 20, 50, ItemID.IRON_SPEAR), - IRON_LONGSWORD("Iron longsword", 21, 50, ItemID.IRON_LONGSWORD), - IRON_JAVELIN_HEADS("Iron javelin heads", 21, 25, ItemID.IRON_JAVELIN_HEADS), - IRON_FULL_HELM("Iron full helm", 22, 50, ItemID.IRON_FULL_HELM), - IRON_KNIFE("Iron knife", 22, 25, ItemID.IRON_KNIFE), - IRON_LIMBS("Iron limbs", 23, 25, ItemID.IRON_LIMBS), - IRON_SQ_SHIELD("Iron sq shield", 23, 50, ItemID.IRON_SQ_SHIELD), - IRON_WARHAMMER("Iron warhammer", 24, 75, ItemID.IRON_WARHAMMER), - IRON_BATTLEAXE("Iron battleaxe", 25, 75, ItemID.IRON_BATTLEAXE), - OIL_LANTERN_FRAME("Oil lantern frame", 26, 25, ItemID.OIL_LANTERN_FRAME), - IRON_CHAINBODY("Iron chainbody", 26, 75, ItemID.IRON_CHAINBODY), - IRON_KITESHIELD("Iron kiteshield", 27, 75, ItemID.IRON_KITESHIELD), - IRON_CLAWS("Iron claws", 28, 50, ItemID.IRON_CLAWS), - IRON_2H_SWORD("Iron 2h sword", 29, 75, ItemID.IRON_2H_SWORD), - STEEL_DAGGER("Steel dagger", 30, 37.5f, ItemID.STEEL_DAGGER), - STEEL_BAR("Steel bar", 30, 17.5f, ItemID.STEEL_BAR), - IRON_PLATESKIRT("Iron plateskirt", 31, 75, ItemID.IRON_PLATESKIRT), - IRON_PLATELEGS("Iron platelegs", 31, 75, ItemID.IRON_PLATELEGS), - STEEL_AXE("Steel axe", 31, 37.5f, ItemID.STEEL_AXE), - STEEL_MACE("Steel mace", 32, 37.5f, ItemID.STEEL_MACE), - IRON_PLATEBODY("Iron platebody", 33, 125, ItemID.IRON_PLATEBODY), - STEEL_MED_HELM("Steel med helm", 33, 37.5f, ItemID.STEEL_MED_HELM), - STEEL_BOLTS_UNF("Steel bolts (unf)", 33, 37.5f, ItemID.STEEL_BOLTS_UNF), - STEEL_DART_TIP("Steel dart tip", 34, 37.5f, ItemID.STEEL_DART_TIP), - STEEL_NAILS("Steel nails", 34, 37.5f, ItemID.STEEL_NAILS), - STEEL_SWORD("Steel sword", 34, 37.5f, ItemID.STEEL_SWORD), - CANNONBALL("Cannonball", 35, 25.6f, ItemID.CANNONBALL), - STEEL_SCIMITAR("Steel scimitar", 35, 75, ItemID.STEEL_SCIMITAR), - STEEL_ARROWTIPS("Steel arrowtips", 35, 37.5f, ItemID.STEEL_ARROWTIPS), - STEEL_HASTA("Steel hasta", 35, 75, ItemID.STEEL_HASTA), - STEEL_SPEAR("Steel spear", 35, 75, ItemID.STEEL_SPEAR), - STEEL_LIMBS("Steel limbs", 36, 37.5f, ItemID.STEEL_LIMBS), - STEEL_STUDS("Steel studs", 36, 37.5f, ItemID.STEEL_STUDS), - STEEL_LONGSWORD("Steel longsword", 36, 75, ItemID.STEEL_LONGSWORD), - STEEL_JAVELIN_HEADS("Steel javelin heads", 36, 37.5f, ItemID.STEEL_JAVELIN_HEADS), - STEEL_KNIFE("Steel knife", 37, 37.5f, ItemID.STEEL_KNIFE), - STEEL_FULL_HELM("Steel full helm", 37, 75, ItemID.STEEL_FULL_HELM), - STEEL_SQ_SHIELD("Steel sq shield", 38, 75, ItemID.STEEL_SQ_SHIELD), - STEEL_WARHAMMER("Steel warhammer", 39, 112.5f, ItemID.STEEL_WARHAMMER), - STEEL_BATTLEAXE("Steel battleaxe", 40, 112.5f, ItemID.STEEL_BATTLEAXE), - GOLD_BAR_GOLDSMITH_GAUNTLETS("Gold bar (Goldsmith gauntlets)", 40, 56.2f, ItemID.GOLD_BAR), - GOLD_BAR("Gold bar", 40, 22.5f, ItemID.GOLD_BAR), - STEEL_CHAINBODY("Steel chainbody", 41, 112.5f, ItemID.STEEL_CHAINBODY), - STEEL_KITESHIELD("Steel kiteshield", 42, 112.5f, ItemID.STEEL_KITESHIELD), - STEEL_CLAWS("Steel claws", 43, 75, ItemID.STEEL_CLAWS), - STEEL_2H_SWORD("Steel 2h sword", 44, 112.5f, ItemID.STEEL_2H_SWORD), - STEEL_PLATELEGS("Steel platelegs", 46, 112.5f, ItemID.STEEL_PLATELEGS), - STEEL_PLATESKIRT("Steel plateskirt", 46, 112.5f, ItemID.STEEL_PLATESKIRT), - STEEL_PLATEBODY("Steel platebody", 48, 187.5f, ItemID.STEEL_PLATEBODY), - BULLSEYE_LANTERN_UNF("Bullseye lantern (unf)", 49, 37, ItemID.BULLSEYE_LANTERN_UNF), - MITHRIL_DAGGER("Mithril dagger", 50, 50, ItemID.MITHRIL_DAGGER), - MITHRIL_BAR("Mithril bar", 50, 30, ItemID.MITHRIL_BAR), - MITHRIL_AXE("Mithril axe", 51, 50, ItemID.MITHRIL_AXE), - MITHRIL_MACE("Mithril mace", 52, 50, ItemID.MITHRIL_MACE), - MITHRIL_MED_HELM("Mithril med helm", 53, 50, ItemID.MITHRIL_MED_HELM), - MITHRIL_BOLTS_UNF("Mithril bolts (unf)", 53, 50, ItemID.MITHRIL_BOLTS_UNF), - MITHRIL_SWORD("Mithril sword", 54, 50, ItemID.MITHRIL_SWORD), - MITHRIL_DART_TIP("Mithril dart tip", 54, 50, ItemID.MITHRIL_DART_TIP), - MITHRIL_NAILS("Mithril nails", 54, 50, ItemID.MITHRIL_NAILS), - MITHRIL_ARROWTIPS("Mithril arrowtips", 55, 50, ItemID.MITHRIL_ARROWTIPS), - MITHRIL_SCIMITAR("Mithril scimitar", 55, 100, ItemID.MITHRIL_SCIMITAR), - MITHRIL_HASTA("Mithril hasta", 55, 100, ItemID.MITHRIL_HASTA), - MITHRIL_SPEAR("Mithril spear", 55, 100, ItemID.MITHRIL_SPEAR), - MITHRIL_LONGSWORD("Mithril longsword", 56, 100, ItemID.MITHRIL_LONGSWORD), - MITHRIL_JAVELIN_HEADS("Mithril javelin heads", 56, 50, ItemID.MITHRIL_JAVELIN_HEADS), - MITHRIL_LIMBS("Mithril limbs", 56, 50, ItemID.MITHRIL_LIMBS), - MITHRIL_FULL_HELM("Mithril full helm", 57, 100, ItemID.MITHRIL_FULL_HELM), - MITHRIL_KNIFE("Mithril knife", 57, 50, ItemID.MITHRIL_KNIFE), - MITHRIL_SQ_SHIELD("Mithril sq shield", 58, 100, ItemID.MITHRIL_SQ_SHIELD), - MITH_GRAPPLE_TIP("Mith grapple tip", 59, 50, ItemID.MITH_GRAPPLE_TIP), - MITHRIL_WARHAMMER("Mithril warhammer", 59, 150, ItemID.MITHRIL_WARHAMMER), - DRAGON_SQ_SHIELD("Dragon sq shield", 60, 75, ItemID.DRAGON_SQ_SHIELD), - MITHRIL_BATTLEAXE("Mithril battleaxe", 60, 150, ItemID.MITHRIL_BATTLEAXE), - MITHRIL_CHAINBODY("Mithril chainbody", 61, 150, ItemID.MITHRIL_CHAINBODY), - MITHRIL_KITESHIELD("Mithril kiteshield", 62, 150, ItemID.MITHRIL_KITESHIELD), - MITHRIL_CLAWS("Mithril claws", 63, 100, ItemID.MITHRIL_CLAWS), - MITHRIL_2H_SWORD("Mithril 2h sword", 64, 150, ItemID.MITHRIL_2H_SWORD), - MITHRIL_PLATESKIRT("Mithril plateskirt", 66, 150, ItemID.MITHRIL_PLATESKIRT), - MITHRIL_PLATELEGS("Mithril platelegs", 66, 150, ItemID.MITHRIL_PLATELEGS), - MITHRIL_PLATEBODY("Mithril platebody", 68, 250, ItemID.MITHRIL_PLATEBODY), - ADAMANT_DAGGER("Adamant dagger", 70, 62.5f, ItemID.ADAMANT_DAGGER), - ADAMANTITE_BAR("Adamantite bar", 70, 37.5f, ItemID.ADAMANTITE_BAR), - ADAMANT_AXE("Adamant axe", 71, 62.5f, ItemID.ADAMANT_AXE), - ADAMANT_MACE("Adamant mace", 72, 62.5f, ItemID.ADAMANT_MACE), - ADAMANT_BOLTS_UNF("Adamant bolts (unf)", 73, 62.5f, ItemID.ADAMANT_BOLTSUNF), - ADAMANT_MED_HELM("Adamant med helm", 73, 62.5f, ItemID.ADAMANT_MED_HELM), - ADAMANT_DART_TIP("Adamant dart tip", 74, 62.5f, ItemID.ADAMANT_DART_TIP), - ADAMANT_SWORD("Adamant sword", 74, 62.5f, ItemID.ADAMANT_SWORD), - ADAMANTITE_NAILS("Adamantite nails", 74, 62.5f, ItemID.ADAMANTITE_NAILS), - ADAMANT_ARROWTIPS("Adamant arrowtips", 75, 62.5f, ItemID.ADAMANT_ARROWTIPS), - ADAMANT_SCIMITAR("Adamant scimitar", 75, 125, ItemID.ADAMANT_SCIMITAR), - ADAMANT_HASTA("Adamant hasta", 75, 125, ItemID.ADAMANT_HASTA), - ADAMANT_SPEAR("Adamant spear", 75, 125, ItemID.ADAMANT_SPEAR), - ADAMANTITE_LIMBS("Adamantite limbs", 76, 62.5f, ItemID.ADAMANTITE_LIMBS), - ADAMANT_LONGSWORD("Adamant longsword", 76, 125, ItemID.ADAMANT_LONGSWORD), - ADAMANT_JAVELIN_HEADS("Adamant javelin heads", 76, 62.5f, ItemID.ADAMANT_JAVELIN_HEADS), - ADAMANT_FULL_HELM("Adamant full helm", 77, 125, ItemID.ADAMANT_FULL_HELM), - ADAMANT_KNIFE("Adamant knife", 77, 62.5f, ItemID.ADAMANT_KNIFE), - ADAMANT_SQ_SHIELD("Adamant sq shield", 78, 125, ItemID.ADAMANT_SQ_SHIELD), - ADAMANT_WARHAMMER("Adamant warhammer", 79, 187.5f, ItemID.ADAMANT_WARHAMMER), - ADAMANT_BATTLEAXE("Adamant battleaxe", 80, 187.5f, ItemID.ADAMANT_BATTLEAXE), - ADAMANT_CHAINBODY("Adamant chainbody", 81, 187.5f, ItemID.ADAMANT_CHAINBODY), - ADAMANT_KITESHIELD("Adamant kiteshield", 82, 187.5f, ItemID.ADAMANT_KITESHIELD), - ADAMANT_CLAWS("Adamant claws", 83, 125, ItemID.ADAMANT_CLAWS), - ADAMANT_2H_SWORD("Adamant 2h sword", 84, 187.5f, ItemID.ADAMANT_2H_SWORD), - RUNITE_BAR("Runite bar", 85, 50, ItemID.RUNITE_BAR), - RUNE_DAGGER("Rune dagger", 85, 75, ItemID.RUNE_DAGGER), - RUNE_AXE("Rune axe", 86, 75, ItemID.RUNE_AXE), - ADAMANT_PLATESKIRT("Adamant plateskirt", 86, 187.5f, ItemID.ADAMANT_PLATESKIRT), - ADAMANT_PLATELEGS("Adamant platelegs", 86, 187.5f, ItemID.ADAMANT_PLATELEGS), - RUNE_MACE("Rune mace", 87, 75, ItemID.RUNE_MACE), - RUNITE_BOLTS_UNF("Runite bolts (unf)", 88, 75, ItemID.RUNITE_BOLTS_UNF), - RUNE_MED_HELM("Rune med helm", 88, 75, ItemID.RUNE_MED_HELM), - ADAMANT_PLATEBODY("Adamant platebody", 88, 312.5f, ItemID.ADAMANT_PLATEBODY), - RUNE_SWORD("Rune sword", 89, 75, ItemID.RUNE_SWORD), - RUNE_NAILS("Rune nails", 89, 75, ItemID.RUNE_NAILS), - RUNE_DART_TIP("Rune dart tip", 89, 75, ItemID.RUNE_DART_TIP), - RUNE_ARROWTIPS("Rune arrowtips", 90, 75, ItemID.RUNE_ARROWTIPS), - RUNE_SCIMITAR("Rune scimitar", 90, 150, ItemID.RUNE_SCIMITAR), - RUNE_HASTA("Rune hasta", 90, 150, ItemID.RUNE_HASTA), - RUNE_SPEAR("Rune spear", 90, 150, ItemID.RUNE_SPEAR), - DRAGONFIRE_SHIELD("Dragonfire shield", 90, 2000, ItemID.DRAGONFIRE_SHIELD), - RUNE_LONGSWORD("Rune longsword", 91, 150, ItemID.RUNE_LONGSWORD), - RUNE_JAVELIN_HEADS("Rune javelin heads", 91, 75, ItemID.RUNE_JAVELIN_HEADS), - RUNITE_LIMBS("Runite limbs", 91, 75, ItemID.RUNITE_LIMBS), - RUNE_KNIFE("Rune knife", 92, 75, ItemID.RUNE_KNIFE), - RUNE_FULL_HELM("Rune full helm", 92, 150, ItemID.RUNE_FULL_HELM), - RUNE_SQ_SHIELD("Rune sq shield", 93, 150, ItemID.RUNE_SQ_SHIELD), - RUNE_WARHAMMER("Rune warhammer", 94, 225, ItemID.RUNE_WARHAMMER), - RUNE_BATTLEAXE("Rune battleaxe", 95, 225, ItemID.RUNE_BATTLEAXE), - RUNE_CHAINBODY("Rune chainbody", 96, 225, ItemID.RUNE_CHAINBODY), - RUNE_KITESHIELD("Rune kiteshield", 97, 225, ItemID.RUNE_KITESHIELD), - RUNE_CLAWS("Rune claws", 98, 150, ItemID.RUNE_CLAWS), - RUNE_PLATEBODY("Rune platebody", 99, 375, ItemID.RUNE_PLATEBODY), - RUNE_PLATESKIRT("Rune plateskirt", 99, 225, ItemID.RUNE_PLATESKIRT), - RUNE_PLATELEGS("Rune platelegs", 99, 225, ItemID.RUNE_PLATELEGS), - RUNE_2H_SWORD("Rune 2h sword", 99, 225, ItemID.RUNE_2H_SWORD), + BRONZE_BAR(ItemID.BRONZE_BAR, 1, 6.3f), + BRONZE_AXE(ItemID.BRONZE_AXE, 1, 12.5f), + BRONZE_DAGGER(ItemID.BRONZE_DAGGER, 1, 12.5f), + BRONZE_MACE(ItemID.BRONZE_MACE, 2, 12.5f), + BRONZE_MED_HELM(ItemID.BRONZE_MED_HELM, 3, 12.5f), + BRONZE_BOLTS_UNF(ItemID.BRONZE_BOLTS_UNF, 3, 12.5f), + BRONZE_NAILS(ItemID.BRONZE_NAILS, 4, 12.5f), + BRONZE_SWORD(ItemID.BRONZE_SWORD, 4, 12.5f), + BRONZE_WIRE(ItemID.BRONZE_WIRE, 4, 12.5f), + BRONZE_DART_TIP(ItemID.BRONZE_DART_TIP, 4, 12.5f), + BRONZE_ARROWTIPS(ItemID.BRONZE_ARROWTIPS, 5, 12.5f), + BRONZE_SCIMITAR(ItemID.BRONZE_SCIMITAR, 5, 25), + BRONZE_HASTA(ItemID.BRONZE_HASTA, 5, 25), + BRONZE_SPEAR(ItemID.BRONZE_SPEAR, 5, 25), + BRONZE_JAVELIN_HEADS(ItemID.BRONZE_JAVELIN_HEADS, 6, 12.5f), + BRONZE_LONGSWORD(ItemID.BRONZE_LONGSWORD, 6, 25), + BRONZE_LIMBS(ItemID.BRONZE_LIMBS, 6, 12.5f), + BRONZE_KNIFE(ItemID.BRONZE_KNIFE, 7, 12.5f), + BRONZE_FULL_HELM(ItemID.BRONZE_FULL_HELM, 7, 25), + BRONZE_SQ_SHIELD(ItemID.BRONZE_SQ_SHIELD, 8, 25), + BRONZE_WARHAMMER(ItemID.BRONZE_WARHAMMER, 9, 37.5f), + BRONZE_BATTLEAXE(ItemID.BRONZE_BATTLEAXE, 10, 37.5f), + BRONZE_CHAINBODY(ItemID.BRONZE_CHAINBODY, 11, 37.5f), + BRONZE_KITESHIELD(ItemID.BRONZE_KITESHIELD, 12, 37.5f), + BRONZE_CLAWS(ItemID.BRONZE_CLAWS, 13, 25), + BRONZE_2H_SWORD(ItemID.BRONZE_2H_SWORD, 14, 37.5f), + BARRONITE_DEPOSITS(ItemID.BARRONITE_DEPOSIT, 14, 30), + IRON_BAR(ItemID.IRON_BAR, 15, 12.5f), + IRON_DAGGER(ItemID.IRON_DAGGER, 15, 25), + IRON_AXE(ItemID.IRON_AXE, 16, 25), + BRONZE_PLATELEGS(ItemID.BRONZE_PLATELEGS, 16, 37.5f), + BRONZE_PLATESKIRT(ItemID.BRONZE_PLATESKIRT, 16, 37.5f), + IRON_SPIT(ItemID.IRON_SPIT, 17, 25), + IRON_MACE(ItemID.IRON_MACE, 17, 25), + IRON_BOLTS_UNF(ItemID.IRON_BOLTS_UNF, 18, 25), + BRONZE_PLATEBODY(ItemID.BRONZE_PLATEBODY, 18, 62.5f), + IRON_MED_HELM(ItemID.IRON_MED_HELM, 18, 25), + IRON_NAILS(ItemID.IRON_NAILS, 19, 25), + IRON_DART_TIP(ItemID.IRON_DART_TIP, 19, 25), + IRON_SWORD(ItemID.IRON_SWORD, 19, 25), + SILVER_BAR(ItemID.SILVER_BAR, 20, 13.7f), + IRON_ARROWTIPS(ItemID.IRON_ARROWTIPS, 20, 25), + IRON_SCIMITAR(ItemID.IRON_SCIMITAR, 20, 50), + IRON_HASTA(ItemID.IRON_HASTA, 20, 50), + IRON_SPEAR(ItemID.IRON_SPEAR, 20, 50), + IRON_LONGSWORD(ItemID.IRON_LONGSWORD, 21, 50), + IRON_JAVELIN_HEADS(ItemID.IRON_JAVELIN_HEADS, 21, 25), + IRON_FULL_HELM(ItemID.IRON_FULL_HELM, 22, 50), + IRON_KNIFE(ItemID.IRON_KNIFE, 22, 25), + IRON_LIMBS(ItemID.IRON_LIMBS, 23, 25), + IRON_SQ_SHIELD(ItemID.IRON_SQ_SHIELD, 23, 50), + IRON_WARHAMMER(ItemID.IRON_WARHAMMER, 24, 75), + IRON_BATTLEAXE(ItemID.IRON_BATTLEAXE, 25, 75), + OIL_LANTERN_FRAME(ItemID.OIL_LANTERN_FRAME, 26, 25), + IRON_CHAINBODY(ItemID.IRON_CHAINBODY, 26, 75), + IRON_KITESHIELD(ItemID.IRON_KITESHIELD, 27, 75), + IRON_CLAWS(ItemID.IRON_CLAWS, 28, 50), + IRON_2H_SWORD(ItemID.IRON_2H_SWORD, 29, 75), + STEEL_DAGGER(ItemID.STEEL_DAGGER, 30, 37.5f), + STEEL_BAR(ItemID.STEEL_BAR, 30, 17.5f), + IRON_PLATESKIRT(ItemID.IRON_PLATESKIRT, 31, 75), + IRON_PLATELEGS(ItemID.IRON_PLATELEGS, 31, 75), + STEEL_AXE(ItemID.STEEL_AXE, 31, 37.5f), + STEEL_MACE(ItemID.STEEL_MACE, 32, 37.5f), + IRON_PLATEBODY(ItemID.IRON_PLATEBODY, 33, 125), + STEEL_MED_HELM(ItemID.STEEL_MED_HELM, 33, 37.5f), + STEEL_BOLTS_UNF(ItemID.STEEL_BOLTS_UNF, 33, 37.5f), + STEEL_DART_TIP(ItemID.STEEL_DART_TIP, 34, 37.5f), + STEEL_NAILS(ItemID.STEEL_NAILS, 34, 37.5f), + STEEL_SWORD(ItemID.STEEL_SWORD, 34, 37.5f), + CANNONBALL(ItemID.CANNONBALL, 35, 25.6f), + STEEL_SCIMITAR(ItemID.STEEL_SCIMITAR, 35, 75), + STEEL_ARROWTIPS(ItemID.STEEL_ARROWTIPS, 35, 37.5f), + STEEL_HASTA(ItemID.STEEL_HASTA, 35, 75), + STEEL_SPEAR(ItemID.STEEL_SPEAR, 35, 75), + STEEL_LIMBS(ItemID.STEEL_LIMBS, 36, 37.5f), + STEEL_STUDS(ItemID.STEEL_STUDS, 36, 37.5f), + STEEL_LONGSWORD(ItemID.STEEL_LONGSWORD, 36, 75), + STEEL_JAVELIN_HEADS(ItemID.STEEL_JAVELIN_HEADS, 36, 37.5f), + STEEL_KNIFE(ItemID.STEEL_KNIFE, 37, 37.5f), + STEEL_FULL_HELM(ItemID.STEEL_FULL_HELM, 37, 75), + STEEL_SQ_SHIELD(ItemID.STEEL_SQ_SHIELD, 38, 75), + STEEL_WARHAMMER(ItemID.STEEL_WARHAMMER, 39, 112.5f), + STEEL_BATTLEAXE(ItemID.STEEL_BATTLEAXE, 40, 112.5f), + GOLD_BAR_GOLDSMITH_GAUNTLETS(ItemID.GOLD_BAR, 40, 56.2f), + GOLD_BAR(ItemID.GOLD_BAR, 40, 22.5f), + STEEL_CHAINBODY(ItemID.STEEL_CHAINBODY, 41, 112.5f), + STEEL_KITESHIELD(ItemID.STEEL_KITESHIELD, 42, 112.5f), + STEEL_CLAWS(ItemID.STEEL_CLAWS, 43, 75), + STEEL_2H_SWORD(ItemID.STEEL_2H_SWORD, 44, 112.5f), + STEEL_PLATELEGS(ItemID.STEEL_PLATELEGS, 46, 112.5f), + STEEL_PLATESKIRT(ItemID.STEEL_PLATESKIRT, 46, 112.5f), + STEEL_PLATEBODY(ItemID.STEEL_PLATEBODY, 48, 187.5f), + BULLSEYE_LANTERN_UNF(ItemID.BULLSEYE_LANTERN_UNF, 49, 37), + MITHRIL_DAGGER(ItemID.MITHRIL_DAGGER, 50, 50), + MITHRIL_BAR(ItemID.MITHRIL_BAR, 50, 30), + MITHRIL_AXE(ItemID.MITHRIL_AXE, 51, 50), + MITHRIL_MACE(ItemID.MITHRIL_MACE, 52, 50), + MITHRIL_MED_HELM(ItemID.MITHRIL_MED_HELM, 53, 50), + MITHRIL_BOLTS_UNF(ItemID.MITHRIL_BOLTS_UNF, 53, 50), + MITHRIL_SWORD(ItemID.MITHRIL_SWORD, 54, 50), + MITHRIL_DART_TIP(ItemID.MITHRIL_DART_TIP, 54, 50), + MITHRIL_NAILS(ItemID.MITHRIL_NAILS, 54, 50), + MITHRIL_ARROWTIPS(ItemID.MITHRIL_ARROWTIPS, 55, 50), + MITHRIL_SCIMITAR(ItemID.MITHRIL_SCIMITAR, 55, 100), + MITHRIL_HASTA(ItemID.MITHRIL_HASTA, 55, 100), + MITHRIL_SPEAR(ItemID.MITHRIL_SPEAR, 55, 100), + MITHRIL_LONGSWORD(ItemID.MITHRIL_LONGSWORD, 56, 100), + MITHRIL_JAVELIN_HEADS(ItemID.MITHRIL_JAVELIN_HEADS, 56, 50), + MITHRIL_LIMBS(ItemID.MITHRIL_LIMBS, 56, 50), + MITHRIL_FULL_HELM(ItemID.MITHRIL_FULL_HELM, 57, 100), + MITHRIL_KNIFE(ItemID.MITHRIL_KNIFE, 57, 50), + MITHRIL_SQ_SHIELD(ItemID.MITHRIL_SQ_SHIELD, 58, 100), + MITH_GRAPPLE_TIP(ItemID.MITH_GRAPPLE_TIP, 59, 50), + MITHRIL_WARHAMMER(ItemID.MITHRIL_WARHAMMER, 59, 150), + DRAGON_SQ_SHIELD(ItemID.DRAGON_SQ_SHIELD, 60, 75), + MITHRIL_BATTLEAXE(ItemID.MITHRIL_BATTLEAXE, 60, 150), + MITHRIL_CHAINBODY(ItemID.MITHRIL_CHAINBODY, 61, 150), + MITHRIL_KITESHIELD(ItemID.MITHRIL_KITESHIELD, 62, 150), + MITHRIL_CLAWS(ItemID.MITHRIL_CLAWS, 63, 100), + MITHRIL_2H_SWORD(ItemID.MITHRIL_2H_SWORD, 64, 150), + MITHRIL_PLATESKIRT(ItemID.MITHRIL_PLATESKIRT, 66, 150), + MITHRIL_PLATELEGS(ItemID.MITHRIL_PLATELEGS, 66, 150), + MITHRIL_PLATEBODY(ItemID.MITHRIL_PLATEBODY, 68, 250), + ADAMANT_DAGGER(ItemID.ADAMANT_DAGGER, 70, 62.5f), + ADAMANTITE_BAR(ItemID.ADAMANTITE_BAR, 70, 37.5f), + ADAMANT_AXE(ItemID.ADAMANT_AXE, 71, 62.5f), + ADAMANT_MACE(ItemID.ADAMANT_MACE, 72, 62.5f), + ADAMANT_BOLTS_UNF(ItemID.ADAMANT_BOLTSUNF, 73, 62.5f), + ADAMANT_MED_HELM(ItemID.ADAMANT_MED_HELM, 73, 62.5f), + ADAMANT_DART_TIP(ItemID.ADAMANT_DART_TIP, 74, 62.5f), + ADAMANT_SWORD(ItemID.ADAMANT_SWORD, 74, 62.5f), + ADAMANTITE_NAILS(ItemID.ADAMANTITE_NAILS, 74, 62.5f), + ADAMANT_ARROWTIPS(ItemID.ADAMANT_ARROWTIPS, 75, 62.5f), + ADAMANT_SCIMITAR(ItemID.ADAMANT_SCIMITAR, 75, 125), + ADAMANT_HASTA(ItemID.ADAMANT_HASTA, 75, 125), + ADAMANT_SPEAR(ItemID.ADAMANT_SPEAR, 75, 125), + ADAMANTITE_LIMBS(ItemID.ADAMANTITE_LIMBS, 76, 62.5f), + ADAMANT_LONGSWORD(ItemID.ADAMANT_LONGSWORD, 76, 125), + ADAMANT_JAVELIN_HEADS(ItemID.ADAMANT_JAVELIN_HEADS, 76, 62.5f), + ADAMANT_FULL_HELM(ItemID.ADAMANT_FULL_HELM, 77, 125), + ADAMANT_KNIFE(ItemID.ADAMANT_KNIFE, 77, 62.5f), + ADAMANT_SQ_SHIELD(ItemID.ADAMANT_SQ_SHIELD, 78, 125), + ADAMANT_WARHAMMER(ItemID.ADAMANT_WARHAMMER, 79, 187.5f), + ADAMANT_BATTLEAXE(ItemID.ADAMANT_BATTLEAXE, 80, 187.5f), + ADAMANT_CHAINBODY(ItemID.ADAMANT_CHAINBODY, 81, 187.5f), + ADAMANT_KITESHIELD(ItemID.ADAMANT_KITESHIELD, 82, 187.5f), + ADAMANT_CLAWS(ItemID.ADAMANT_CLAWS, 83, 125), + ADAMANT_2H_SWORD(ItemID.ADAMANT_2H_SWORD, 84, 187.5f), + RUNITE_BAR(ItemID.RUNITE_BAR, 85, 50), + RUNE_DAGGER(ItemID.RUNE_DAGGER, 85, 75), + RUNE_AXE(ItemID.RUNE_AXE, 86, 75), + ADAMANT_PLATESKIRT(ItemID.ADAMANT_PLATESKIRT, 86, 187.5f), + ADAMANT_PLATELEGS(ItemID.ADAMANT_PLATELEGS, 86, 187.5f), + RUNE_MACE(ItemID.RUNE_MACE, 87, 75), + RUNITE_BOLTS_UNF(ItemID.RUNITE_BOLTS_UNF, 88, 75), + RUNE_MED_HELM(ItemID.RUNE_MED_HELM, 88, 75), + ADAMANT_PLATEBODY(ItemID.ADAMANT_PLATEBODY, 88, 312.5f), + RUNE_SWORD(ItemID.RUNE_SWORD, 89, 75), + RUNE_NAILS(ItemID.RUNE_NAILS, 89, 75), + RUNE_DART_TIP(ItemID.RUNE_DART_TIP, 89, 75), + RUNE_ARROWTIPS(ItemID.RUNE_ARROWTIPS, 90, 75), + RUNE_SCIMITAR(ItemID.RUNE_SCIMITAR, 90, 150), + RUNE_HASTA(ItemID.RUNE_HASTA, 90, 150), + RUNE_SPEAR(ItemID.RUNE_SPEAR, 90, 150), + DRAGONFIRE_SHIELD(ItemID.DRAGONFIRE_SHIELD, 90, 2000), + RUNE_LONGSWORD(ItemID.RUNE_LONGSWORD, 91, 150), + RUNE_JAVELIN_HEADS(ItemID.RUNE_JAVELIN_HEADS, 91, 75), + RUNITE_LIMBS(ItemID.RUNITE_LIMBS, 91, 75), + RUNE_KNIFE(ItemID.RUNE_KNIFE, 92, 75), + RUNE_FULL_HELM(ItemID.RUNE_FULL_HELM, 92, 150), + RUNE_SQ_SHIELD(ItemID.RUNE_SQ_SHIELD, 93, 150), + RUNE_WARHAMMER(ItemID.RUNE_WARHAMMER, 94, 225), + RUNE_BATTLEAXE(ItemID.RUNE_BATTLEAXE, 95, 225), + RUNE_CHAINBODY(ItemID.RUNE_CHAINBODY, 96, 225), + RUNE_KITESHIELD(ItemID.RUNE_KITESHIELD, 97, 225), + RUNE_CLAWS(ItemID.RUNE_CLAWS, 98, 150), + RUNE_PLATEBODY(ItemID.RUNE_PLATEBODY, 99, 375), + RUNE_PLATESKIRT(ItemID.RUNE_PLATESKIRT, 99, 225), + RUNE_PLATELEGS(ItemID.RUNE_PLATELEGS, 99, 225), + RUNE_2H_SWORD(ItemID.RUNE_2H_SWORD, 99, 225), ; - private final String name; + private final int itemId; private final int level; private final float xp; - private final int icon; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ThievingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ThievingAction.java index 1f168e6dba..0809ef0b72 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ThievingAction.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ThievingAction.java @@ -30,7 +30,7 @@ import net.runelite.api.ItemID; @AllArgsConstructor @Getter -public enum ThievingAction implements SkillAction +public enum ThievingAction implements NamedSkillAction { MAN_OR_WOMAN("Man / Woman", 1, 8, ItemID.MAN), WINTER_SQIRKJUICE("Winter Sq'irkjuice", 1, 350, ItemID.WINTER_SQIRKJUICE), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/WoodcuttingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/WoodcuttingAction.java index 6bb90b5ea1..8aad519aaa 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/WoodcuttingAction.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/WoodcuttingAction.java @@ -30,7 +30,7 @@ import net.runelite.api.ItemID; @AllArgsConstructor @Getter -public enum WoodcuttingAction implements SkillAction +public enum WoodcuttingAction implements NamedSkillAction { LOGS("Logs", 1, 25, ItemID.LOGS), ACHEY_TREE_LOGS("Achey tree logs", 1, 25, ItemID.ACHEY_TREE_LOGS), From 546cd6daf82f0bd2081109506269aa63728ecdde Mon Sep 17 00:00:00 2001 From: neatclient12345 <88599015+neatclient12345@users.noreply.github.com> Date: Tue, 28 Sep 2021 19:43:31 -0700 Subject: [PATCH 44/77] skill calculator: Fix grammar 0-action selections (#13995) --- .../client/plugins/skillcalculator/SkillCalculator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java index 5bc35696ca..8d9581adde 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java @@ -365,7 +365,7 @@ class SkillCalculator extends JPanel private static String formatXPActionString(double xp, int actionCount, String expExpression) { - return XP_FORMAT.format(xp) + expExpression + NumberFormat.getIntegerInstance().format(actionCount) + (actionCount > 1 ? " actions" : " action"); + return XP_FORMAT.format(xp) + expExpression + NumberFormat.getIntegerInstance().format(actionCount) + (actionCount == 1 ? " action" : " actions"); } private void updateInputFields() From 1294984dcefca9511d9e278c1bce2161a212c601 Mon Sep 17 00:00:00 2001 From: dekvall Date: Tue, 28 Sep 2021 19:51:53 -0700 Subject: [PATCH 45/77] skill calculator: Add common thieving chests --- .../client/plugins/skillcalculator/skills/ThievingAction.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ThievingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ThievingAction.java index 0809ef0b72..c43a1414a1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ThievingAction.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ThievingAction.java @@ -48,6 +48,7 @@ public enum ThievingAction implements NamedSkillAction FRUIT_STALL("Fruit Stall", 25, 28, ItemID.STRANGE_FRUIT), SPRING_SQIRKJUICE("Spring Sq'irkjuice", 25, 1350, ItemID.SPRING_SQIRKJUICE), SEED_STALL("Seed Stall", 27, 10, ItemID.POTATO_SEED), + NATURE_RUNE_CHEST("Nature Rune Chest", 28, 25, ItemID.NATURE_RUNE), ROGUE("Rogue", 32, 35.5f, ItemID.ROGUE), FUR_STALL("Fur Stall", 35, 36, ItemID.GREY_WOLF_FUR), CAVE_GOBLIN("Cave Goblin", 36, 40, ItemID.CAVE_GOBLIN), @@ -63,6 +64,7 @@ public enum ThievingAction implements NamedSkillAction DESERT_BANDIT("Desert Bandit", 53, 79.5f, ItemID.BANDIT), KNIGHT("Knight", 55, 84.3f, ItemID.KNIGHT_OF_ARDOUGNE), POLLNIVNIAN_BANDIT("Pollnivnian Bandit", 55, 84.3f, ItemID.BANDIT_6781), + STONE_CHEST("Stone Chest", 64, 280, ItemID.XERICIAN_FABRIC), MAGIC_STALL("Magic Stall", 65, 100, ItemID.AIR_RUNE_6422), SCIMITAR_STALL("Scimitar Stall", 65, 100, ItemID.STEEL_SCIMITAR), MENAPHITE_THUG("Menaphite Thug", 65, 137.5f, ItemID.MENAPHITE_THUG), @@ -72,8 +74,10 @@ public enum ThievingAction implements NamedSkillAction PALADIN("Paladin", 70, 151.8f, ItemID.PALADIN), GNOME("Gnome", 75, 198.5f, ItemID.GNOME), GEMS_STALL("Gems Stall", 75, 160, ItemID.SAPPHIRE), + DORGESH_KAAN_RICH_CHEST("Dorgesh-Kaan Rich Chest", 78, 650, ItemID.MINING_HELMET), HERO("Hero", 80, 275, ItemID.HERO), VYRE("Vyre", 82, 306.9f, ItemID.VYRE), + ROGUES_CASTLE_CHEST("Wilderness Rogues' Chest", 84, 100, ItemID.DRAGONSTONE), ELF("Elf", 85, 353, ItemID.ELF), TZHAAR_HUR("TzHaar-Hur", 90, 103.4f, ItemID.TZHAARHUR), ; From 9209de31e27a13916dc98812f49cfb07cc369cf0 Mon Sep 17 00:00:00 2001 From: evaan Date: Tue, 28 Sep 2021 20:03:51 -0700 Subject: [PATCH 46/77] skill calculator: Add bonecrusher prayer bonus --- .../client/plugins/skillcalculator/skills/PrayerBonus.java | 1 + 1 file changed, 1 insertion(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerBonus.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerBonus.java index 872d52e8d3..bf0f48c537 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerBonus.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerBonus.java @@ -35,6 +35,7 @@ public enum PrayerBonus implements SkillBonus ECTOFUNTUS("Ectofuntus (400%)", 3), CHAOS_ALTAR("Chaos Altar (700%)", 6), MORYTANIA_DIARY_3_SHADES("Morytania Diary 3 Shades(150%)", 0.5f), + BONECRUSHER("Bonecrusher (50%)", -0.5f), ; private final String name; From b6316b47728e18ca2b76941a58543d8fd8f0e759 Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 28 Sep 2021 23:34:57 -0400 Subject: [PATCH 47/77] api: move Favour to achievementdiary plugin --- .../main/java/net/runelite/api/Favour.java | 45 ------------------- .../achievementdiary/FavourRequirement.java | 19 +++++++- .../diaries/KourendDiaryRequirement.java | 31 +++++++------ 3 files changed, 33 insertions(+), 62 deletions(-) delete mode 100644 runelite-api/src/main/java/net/runelite/api/Favour.java diff --git a/runelite-api/src/main/java/net/runelite/api/Favour.java b/runelite-api/src/main/java/net/runelite/api/Favour.java deleted file mode 100644 index 38904257b1..0000000000 --- a/runelite-api/src/main/java/net/runelite/api/Favour.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2019 William - * 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 lombok.Getter; -import lombok.RequiredArgsConstructor; - -/** - * An enumeration of Kourend house favour the player can earn. - */ -@RequiredArgsConstructor -@Getter -public enum Favour -{ - ARCEUUS("Arceuus", Varbits.KOUREND_FAVOR_ARCEUUS), - HOSIDIUS("Hosidius", Varbits.KOUREND_FAVOR_HOSIDIUS), - LOVAKENGJ("Lovakengj", Varbits.KOUREND_FAVOR_LOVAKENGJ), - PISCARILIUS("Piscarilius", Varbits.KOUREND_FAVOR_PISCARILIUS), - SHAYZIEN("Shayzien", Varbits.KOUREND_FAVOR_SHAYZIEN); - - private final String name; - private final Varbits varbit; -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/FavourRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/FavourRequirement.java index a39953492c..ef608a2be5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/FavourRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/FavourRequirement.java @@ -27,12 +27,29 @@ package net.runelite.client.plugins.achievementdiary; import lombok.Getter; import lombok.RequiredArgsConstructor; import net.runelite.api.Client; -import net.runelite.api.Favour; +import net.runelite.api.Varbits; @RequiredArgsConstructor @Getter public class FavourRequirement implements Requirement { + /** + * An enumeration of Kourend house favour the player can earn. + */ + @RequiredArgsConstructor + @Getter + public enum Favour + { + ARCEUUS("Arceuus", Varbits.KOUREND_FAVOR_ARCEUUS), + HOSIDIUS("Hosidius", Varbits.KOUREND_FAVOR_HOSIDIUS), + LOVAKENGJ("Lovakengj", Varbits.KOUREND_FAVOR_LOVAKENGJ), + PISCARILIUS("Piscarilius", Varbits.KOUREND_FAVOR_PISCARILIUS), + SHAYZIEN("Shayzien", Varbits.KOUREND_FAVOR_SHAYZIEN); + + private final String name; + private final Varbits varbit; + } + private final Favour house; private final int percent; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KourendDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KourendDiaryRequirement.java index 2cde458c8e..6a44468381 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KourendDiaryRequirement.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KourendDiaryRequirement.java @@ -24,13 +24,12 @@ */ package net.runelite.client.plugins.achievementdiary.diaries; -import net.runelite.api.Favour; import net.runelite.api.Quest; import net.runelite.api.Skill; -import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; -import net.runelite.client.plugins.achievementdiary.SkillRequirement; -import net.runelite.client.plugins.achievementdiary.QuestRequirement; import net.runelite.client.plugins.achievementdiary.FavourRequirement; +import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.QuestRequirement; +import net.runelite.client.plugins.achievementdiary.SkillRequirement; public class KourendDiaryRequirement extends GenericDiaryRequirement { @@ -41,7 +40,7 @@ public class KourendDiaryRequirement extends GenericDiaryRequirement new SkillRequirement(Skill.MINING, 15)); add("Steal from a Hosidius Food Stall.", new SkillRequirement(Skill.THIEVING, 25), - new FavourRequirement(Favour.HOSIDIUS, 15)); + new FavourRequirement(FavourRequirement.Favour.HOSIDIUS, 15)); add("Browse the Warrens General Store.", new QuestRequirement(Quest.THE_QUEEN_OF_THIEVES, true)); add("Enter your Player Owned House from Hosidius.", @@ -65,11 +64,11 @@ public class KourendDiaryRequirement extends GenericDiaryRequirement add("Enter the Farming Guild.", new SkillRequirement(Skill.FARMING, 45)); add("Switch to the Necromancy Spellbook at Tyss.", - new FavourRequirement(Favour.ARCEUUS, 60)); + new FavourRequirement(FavourRequirement.Favour.ARCEUUS, 60)); add("Repair a Piscarilius crane.", new SkillRequirement(Skill.CRAFTING, 30)); add("Deliver some intelligence to Captain Ginea.", - new FavourRequirement(Favour.SHAYZIEN, 40)); + new FavourRequirement(FavourRequirement.Favour.SHAYZIEN, 40)); add("Catch a Bluegill on Molch Island.", new SkillRequirement(Skill.FISHING, 43), new SkillRequirement(Skill.HUNTER, 35)); @@ -86,23 +85,23 @@ public class KourendDiaryRequirement extends GenericDiaryRequirement //HARD add("Enter the Woodcutting Guild.", new SkillRequirement(Skill.WOODCUTTING, 60), - new FavourRequirement(Favour.HOSIDIUS, 75)); + new FavourRequirement(FavourRequirement.Favour.HOSIDIUS, 75)); add("Smelt an Adamantite bar in The Forsaken Tower.", new SkillRequirement(Skill.SMITHING, 70), new QuestRequirement(Quest.THE_FORSAKEN_TOWER, true)); add("Kill a Lizardman Shaman in Molch.", - new FavourRequirement(Favour.SHAYZIEN, 100)); + new FavourRequirement(FavourRequirement.Favour.SHAYZIEN, 100)); add("Mine some Lovakite.", new SkillRequirement(Skill.MINING, 65), - new FavourRequirement(Favour.LOVAKENGJ, 30)); + new FavourRequirement(FavourRequirement.Favour.LOVAKENGJ, 30)); add("Plant some Logavano seeds at the Tithe Farm.", new SkillRequirement(Skill.FARMING, 74), - new FavourRequirement(Favour.HOSIDIUS, 100)); + new FavourRequirement(FavourRequirement.Favour.HOSIDIUS, 100)); add("Teleport to Xeric's Heart using Xeric's Talisman.", new QuestRequirement(Quest.ARCHITECTURAL_ALLIANCE)); add("Deliver an artefact to Captain Khaled.", new SkillRequirement(Skill.THIEVING, 49), - new FavourRequirement(Favour.PISCARILIUS, 75)); + new FavourRequirement(FavourRequirement.Favour.PISCARILIUS, 75)); add("Kill a Wyrm in the Karuulm Slayer Dungeon.", new SkillRequirement(Skill.SLAYER, 62)); add("Cast Monster Examine on a Troll south of Mount Quidamortem.", @@ -114,21 +113,21 @@ public class KourendDiaryRequirement extends GenericDiaryRequirement new SkillRequirement(Skill.RUNECRAFT, 77), new SkillRequirement(Skill.MINING, 38), new SkillRequirement(Skill.CRAFTING, 38), - new FavourRequirement(Favour.ARCEUUS, 100)); + new FavourRequirement(FavourRequirement.Favour.ARCEUUS, 100)); add("Chop some Redwood logs.", new SkillRequirement(Skill.WOODCUTTING, 90), - new FavourRequirement(Favour.HOSIDIUS, 75)); + new FavourRequirement(FavourRequirement.Favour.HOSIDIUS, 75)); add("Catch an Anglerfish and cook it whilst in Great Kourend.", new SkillRequirement(Skill.FISHING, 82), new SkillRequirement(Skill.COOKING, 84), - new FavourRequirement(Favour.PISCARILIUS, 100)); + new FavourRequirement(FavourRequirement.Favour.PISCARILIUS, 100)); add("Kill a Hydra in the Karuulm Slayer Dungeon.", new SkillRequirement(Skill.SLAYER, 95)); add("Create an Ape Atoll teleport tablet.", new SkillRequirement(Skill.MAGIC, 90), new SkillRequirement(Skill.MINING, 38), new SkillRequirement(Skill.CRAFTING, 38), - new FavourRequirement(Favour.ARCEUUS, 100)); + new FavourRequirement(FavourRequirement.Favour.ARCEUUS, 100)); add("Create your own Battlestaff from scratch within the Farming Guild.", new SkillRequirement(Skill.FARMING, 85), new SkillRequirement(Skill.FLETCHING, 40)); From c1f442e36ee96f657b8682e56c8e4aeb6093315d Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Fri, 25 Jun 2021 20:43:03 +0100 Subject: [PATCH 48/77] gpu: display device and driver being used during plugin startup --- .../runelite/client/plugins/gpu/GpuPlugin.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java index b8a533e7c9..536527b205 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java @@ -328,6 +328,24 @@ public class GpuPlugin extends Plugin implements DrawCallbacks invokeOnMainThread(() -> { + try + { + // Get and display the device and driver used by the GPU plugin + GLDrawable dummyDrawable = GLDrawableFactory.getFactory(GLProfile.getDefault()) + .createDummyDrawable(GLProfile.getDefaultDevice(), true, new GLCapabilities(GLProfile.getDefault()), null); + dummyDrawable.setRealized(true); + GLContext versionContext = dummyDrawable.createContext(null); + versionContext.makeCurrent(); + GL versionGL = versionContext.getGL(); + log.info("Using device: {}", versionGL.glGetString(GL.GL_RENDERER)); + log.info("Using driver: {}", versionGL.glGetString(GL.GL_VERSION)); + versionContext.destroy(); + } + catch (Exception ex) + { + log.warn("error checking device and driver version", ex); + } + GLProfile glProfile = GLProfile.get(GLProfile.GL4); GLCapabilities glCaps = new GLCapabilities(glProfile); From 8d537cabf1acab37ec91bc1ff67de475eddaabb6 Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 28 Sep 2021 14:49:27 -0400 Subject: [PATCH 49/77] api: add clan ids and accessors --- runelite-api/pom.xml | 1 + .../main/java/net/runelite/api/Client.java | 18 +++++++++ .../java/net/runelite/api/clan/ClanID.java | 37 +++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 runelite-api/src/main/java/net/runelite/api/clan/ClanID.java diff --git a/runelite-api/pom.xml b/runelite-api/pom.xml index a6dd776d73..1b2e9d6de4 100644 --- a/runelite-api/pom.xml +++ b/runelite-api/pom.xml @@ -86,6 +86,7 @@ runtime + net/runelite/api/clan/ClanID.class net/runelite/api/AnimationID.class net/runelite/api/EnumID.class net/runelite/api/FontID.class diff --git a/runelite-api/src/main/java/net/runelite/api/Client.java b/runelite-api/src/main/java/net/runelite/api/Client.java index 6dceaf0f0e..4c72f833a3 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -1916,4 +1916,22 @@ public interface Client extends GameEngine */ @Nullable ClanSettings getGuestClanSettings(); + + /** + * Get clan channel by id. + * @param clanId the clan id + * @return + * @see net.runelite.api.clan.ClanID + */ + @Nullable + ClanChannel getClanChannel(int clanId); + + /** + * Get clan settings by id + * @param clanId the clan id + * @return + * @see net.runelite.api.clan.ClanID + */ + @Nullable + ClanSettings getClanSettings(int clanId); } diff --git a/runelite-api/src/main/java/net/runelite/api/clan/ClanID.java b/runelite-api/src/main/java/net/runelite/api/clan/ClanID.java new file mode 100644 index 0000000000..5b0c59b37a --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/clan/ClanID.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021, Adam + * 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.clan; + +public final class ClanID +{ + /** + * The primary clan. + */ + public static final int CLAN = 0; + /** + * The group ironman clan. + */ + public static final int GROUP_IRONMAN = 1; +} From e60ce99081d5908cb3e2d7f87c9ce7cba0f9051b Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 30 Sep 2021 17:47:09 -0400 Subject: [PATCH 50/77] spec counter: add Dinh's bulwark --- .../runelite/client/plugins/specialcounter/SpecialWeapon.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialWeapon.java b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialWeapon.java index e638b1b713..2011a2e0e6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialWeapon.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialWeapon.java @@ -39,7 +39,8 @@ enum SpecialWeapon BANDOS_GODSWORD("Bandos Godsword", new int[]{ItemID.BANDOS_GODSWORD, ItemID.BANDOS_GODSWORD_OR}, true, SpecialCounterConfig::bandosGodswordThreshold), BARRELCHEST_ANCHOR("Barrelchest Anchor", new int[]{ItemID.BARRELCHEST_ANCHOR}, true, (c) -> 0), BONE_DAGGER("Bone Dagger", new int[]{ItemID.BONE_DAGGER, ItemID.BONE_DAGGER_P, ItemID.BONE_DAGGER_P_8876, ItemID.BONE_DAGGER_P_8878}, true, (c) -> 0), - DORGESHUUN_CROSSBOW("Dorgeshuun Crossbow", new int[]{ItemID.DORGESHUUN_CROSSBOW}, true, (c) -> 0); + DORGESHUUN_CROSSBOW("Dorgeshuun Crossbow", new int[]{ItemID.DORGESHUUN_CROSSBOW}, true, (c) -> 0), + BULWARK("Dinh's Bulwark", new int[]{ItemID.DINHS_BULWARK}, false, c -> 0); private final String name; private final int[] itemID; From b0cad55c4885a15cee6a683ab38af9e3641d1fc8 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Fri, 1 Oct 2021 10:38:04 +0200 Subject: [PATCH 51/77] client: Set toggle button size --- .../java/net/runelite/client/plugins/config/ConfigPanel.java | 1 + .../net/runelite/client/plugins/config/PluginToggleButton.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java index 27e8727cb2..0fa33cf1f5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java @@ -489,6 +489,7 @@ class ConfigPanel extends PluginPanel if (cid.getType() == boolean.class) { JCheckBox checkbox = new ToggleButton(); + checkbox.setPreferredSize(new Dimension(26, 25)); checkbox.setSelected(Boolean.parseBoolean(configManager.getConfiguration(cd.getGroup().value(), cid.getItem().keyName()))); checkbox.addActionListener(ae -> changeConfiguration(checkbox, cd, cid)); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java index a817f76778..ccdae93a7f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java @@ -36,7 +36,7 @@ class PluginToggleButton extends ToggleButton public PluginToggleButton() { super(); - setPreferredSize(new Dimension(25, 0)); + setPreferredSize(new Dimension(26, 25)); addItemListener(l -> updateTooltip()); updateTooltip(); From 51e984df20446eca2d32a971d88be6304d9fef2d Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Fri, 1 Oct 2021 11:20:25 +0200 Subject: [PATCH 52/77] mixins: get clan channel / clan setting by id --- .../net/runelite/mixins/RSClientMixin.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java index 8e654d6719..28b9893321 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -2233,6 +2233,20 @@ public abstract class RSClientMixin implements RSClient return getCurrentClanChannels()[0]; } + @Inject + @Override + public ClanChannel getClanChannel(int clanId) + { + ClanChannel[] clanChannels = client.getCurrentClanChannels(); + + if (clanId >= 0 && clanId < clanChannels.length) + { + return clanChannels[clanId]; + } + + return null; + } + @Inject @Override public ClanSettings getClanSettings() @@ -2240,6 +2254,20 @@ public abstract class RSClientMixin implements RSClient return getCurrentClanSettingsAry()[0]; } + @Inject + @Override + public ClanSettings getClanSettings(int clanId) + { + ClanSettings[] clanSettings = getCurrentClanSettingsAry(); + + if (clanId >= 0 && clanId < clanSettings.length) + { + return clanSettings[clanId]; + } + + return null; + } + @Inject @Override public ClanRank getClanRankFromRs(int rank) @@ -2307,6 +2335,8 @@ public abstract class RSClientMixin implements RSClient client.getCallbacks().post(new ClanChannelChanged(client.getClanChannel(), false)); } + + @Inject public static RSArchive[] archives = new RSArchive[21]; From 0c79f847c186627c255eb92382ccc91ba09c9fda Mon Sep 17 00:00:00 2001 From: Max Weber Date: Fri, 1 Oct 2021 04:35:44 -0600 Subject: [PATCH 53/77] rl-client/RSProfileType: add Shattered Relics profile type --- .../java/net/runelite/client/config/RuneScapeProfileType.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/config/RuneScapeProfileType.java b/runelite-client/src/main/java/net/runelite/client/config/RuneScapeProfileType.java index 8eba74cd4d..f219bf420e 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/RuneScapeProfileType.java +++ b/runelite-client/src/main/java/net/runelite/client/config/RuneScapeProfileType.java @@ -38,7 +38,8 @@ public enum RuneScapeProfileType BETA(client -> client.getWorldType().contains(WorldType.NOSAVE_MODE)), DEADMAN(client -> client.getWorldType().contains(WorldType.DEADMAN)), TRAILBLAZER_LEAGUE, - DEADMAN_REBORN(client -> client.getWorldType().contains(WorldType.SEASONAL)) + DEADMAN_REBORN, + SHATTERED_RELICS_LEAGUE(client -> client.getWorldType().contains(WorldType.SEASONAL)), ; private final Predicate test; From bb7cd404a7a1aaa6effefd3464bda01864775f32 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Fri, 1 Oct 2021 11:24:29 -0700 Subject: [PATCH 54/77] chat colors: Add engine message recoloring --- .../java/net/runelite/client/chat/ChatMessageManager.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java b/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java index 17502740ed..9012aa8227 100644 --- a/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java +++ b/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java @@ -435,11 +435,15 @@ public class ChatMessageManager { cacheColor(new ChatColor(ChatColorType.NORMAL, chatColorConfig.opaqueServerMessage(), false), ChatMessageType.GAMEMESSAGE); + cacheColor(new ChatColor(ChatColorType.NORMAL, chatColorConfig.opaqueServerMessage(), false), + ChatMessageType.ENGINE); } if (chatColorConfig.opaqueServerMessageHighlight() != null) { cacheColor(new ChatColor(ChatColorType.HIGHLIGHT, chatColorConfig.opaqueServerMessageHighlight(), false), ChatMessageType.GAMEMESSAGE); + cacheColor(new ChatColor(ChatColorType.HIGHLIGHT, chatColorConfig.opaqueServerMessageHighlight(), false), + ChatMessageType.ENGINE); } if (chatColorConfig.opaqueGameMessage() != null) { @@ -613,11 +617,15 @@ public class ChatMessageManager { cacheColor(new ChatColor(ChatColorType.NORMAL, chatColorConfig.transparentServerMessage(), true), ChatMessageType.GAMEMESSAGE); + cacheColor(new ChatColor(ChatColorType.NORMAL, chatColorConfig.transparentServerMessage(), true), + ChatMessageType.ENGINE); } if (chatColorConfig.transparentServerMessageHighlight() != null) { cacheColor(new ChatColor(ChatColorType.HIGHLIGHT, chatColorConfig.transparentServerMessageHighlight(), true), ChatMessageType.GAMEMESSAGE); + cacheColor(new ChatColor(ChatColorType.HIGHLIGHT, chatColorConfig.transparentServerMessageHighlight(), true), + ChatMessageType.ENGINE); } if (chatColorConfig.transparentGameMessage() != null) { From e98c3da758831e490028e12988bc7cf4a91e074f Mon Sep 17 00:00:00 2001 From: Max Weber Date: Fri, 1 Oct 2021 05:23:10 -0600 Subject: [PATCH 55/77] rl-client: use vanilla ItemComposition cache --- .../net/runelite/client/game/ItemManager.java | 49 +------------------ .../MenuEntrySwapperPlugin.java | 1 - 2 files changed, 2 insertions(+), 48 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java b/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java index fd1bb4e268..edb1659b89 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java @@ -52,12 +52,8 @@ import net.runelite.api.GameState; import net.runelite.api.ItemComposition; import static net.runelite.api.ItemID.*; import net.runelite.api.SpritePixels; -import net.runelite.api.events.GameStateChanged; -import net.runelite.api.events.PostItemComposition; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.RuneLiteConfig; -import net.runelite.client.eventbus.EventBus; -import net.runelite.client.eventbus.Subscribe; import net.runelite.client.util.AsyncBufferedImage; import net.runelite.http.api.item.ItemClient; import net.runelite.http.api.item.ItemPrice; @@ -92,7 +88,6 @@ public class ItemManager private Map itemPrices = Collections.emptyMap(); private Map itemStats = Collections.emptyMap(); private final LoadingCache itemImages; - private final LoadingCache itemCompositions; private final LoadingCache itemOutlines; // Worn items with weight reducing property have a different worn and inventory ItemID @@ -172,7 +167,7 @@ public class ItemManager @Inject public ItemManager(Client client, ScheduledExecutorService scheduledExecutorService, ClientThread clientThread, - OkHttpClient okHttpClient, EventBus eventBus, RuneLiteConfig runeLiteConfig) + OkHttpClient okHttpClient, RuneLiteConfig runeLiteConfig) { this.client = client; this.clientThread = clientThread; @@ -194,18 +189,6 @@ public class ItemManager } }); - itemCompositions = CacheBuilder.newBuilder() - .maximumSize(1024L) - .expireAfterAccess(1, TimeUnit.HOURS) - .build(new CacheLoader() - { - @Override - public ItemComposition load(Integer key) throws Exception - { - return client.getItemDefinition(key); - } - }); - itemOutlines = CacheBuilder.newBuilder() .maximumSize(128L) .expireAfterAccess(1, TimeUnit.HOURS) @@ -217,8 +200,6 @@ public class ItemManager return loadItemOutline(key.itemId, key.itemQuantity, key.outlineColor); } }); - - eventBus.register(this); } private void loadPrices() @@ -262,31 +243,6 @@ public class ItemManager } } - - @Subscribe - public void onGameStateChanged(final GameStateChanged event) - { - if (event.getGameState() == GameState.HOPPING || event.getGameState() == GameState.LOGIN_SCREEN) - { - itemCompositions.invalidateAll(); - } - } - - @Subscribe - public void onPostItemComposition(PostItemComposition event) - { - itemCompositions.put(event.getItemComposition().getId(), event.getItemComposition()); - } - - /** - * Invalidates internal item manager item composition cache (but not client item composition cache) - * @see Client#getItemCompositionCache() - */ - public void invalidateItemCompositionCache() - { - itemCompositions.invalidateAll(); - } - /** * Look up an item's price * @@ -396,8 +352,7 @@ public class ItemManager @Nonnull public ItemComposition getItemComposition(int itemId) { - assert client.isClientThread() : "getItemComposition must be called on client thread"; - return itemCompositions.getUnchecked(itemId); + return client.getItemDefinition(itemId); } /** diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java index 46d64e8785..5ee4e49684 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java @@ -458,7 +458,6 @@ public class MenuEntrySwapperPlugin extends Plugin private void resetItemCompositionCache() { - itemManager.invalidateItemCompositionCache(); client.getItemCompositionCache().reset(); } From 4ca3db63588e037bcd16fb4dec999a6ab057943e Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 1 Oct 2021 19:08:35 -0400 Subject: [PATCH 56/77] Fix ground marker minimap overlay position The ground marker minimap overlay gets a local point for the tile to mark from fromWorld() and passes it to localToMinimap() - but because the adjustment of -1, when the player position is subtracted from it to compute the minimap location it causes the computed position to be off by a full tile. Additionally, drawRect() width and height is inclusive so the width/height must be subtracted by 1 --- .../src/main/java/net/runelite/api/coords/LocalPoint.java | 4 ++-- .../java/net/runelite/client/ui/overlay/OverlayUtil.java | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/coords/LocalPoint.java b/runelite-api/src/main/java/net/runelite/api/coords/LocalPoint.java index 3a726fc765..b1fbb6eb5b 100644 --- a/runelite-api/src/main/java/net/runelite/api/coords/LocalPoint.java +++ b/runelite-api/src/main/java/net/runelite/api/coords/LocalPoint.java @@ -115,8 +115,8 @@ public class LocalPoint public static LocalPoint fromScene(int x, int y) { return new LocalPoint( - (x << Perspective.LOCAL_COORD_BITS) + (1 << Perspective.LOCAL_COORD_BITS - 1) - 1, - (y << Perspective.LOCAL_COORD_BITS) + (1 << Perspective.LOCAL_COORD_BITS - 1) - 1 + (x << Perspective.LOCAL_COORD_BITS) + (1 << Perspective.LOCAL_COORD_BITS - 1), + (y << Perspective.LOCAL_COORD_BITS) + (1 << Perspective.LOCAL_COORD_BITS - 1) ); } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java index df52467132..324b94259a 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java @@ -46,7 +46,6 @@ import net.runelite.client.util.ColorUtil; public class OverlayUtil { private static final int MINIMAP_DOT_RADIUS = 4; - private static final double UNIT = Math.PI / 1024.0d; public static void renderPolygon(Graphics2D graphics, Shape poly, Color color) { @@ -79,12 +78,12 @@ public class OverlayUtil public static void renderMinimapRect(Client client, Graphics2D graphics, Point center, int width, int height, Color color) { - double angle = client.getMapAngle() * UNIT; + double angle = client.getMapAngle() * Perspective.UNIT; graphics.setColor(color); graphics.rotate(angle, center.getX(), center.getY()); - graphics.drawRect(center.getX() - width / 2, center.getY() - height / 2, width, height); - graphics.rotate(-angle , center.getX(), center.getY()); + graphics.drawRect(center.getX() - width / 2, center.getY() - height / 2, width - 1, height - 1); + graphics.rotate(-angle, center.getX(), center.getY()); } public static void renderTextLocation(Graphics2D graphics, Point txtLoc, String text, Color color) From 5fc784f0823fdf0590fa391fe5413b6e4d565a17 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 3 Oct 2021 22:12:34 -0400 Subject: [PATCH 57/77] item charges: fix rof tracking with varrock platebody When the varrock armour effect triggers it will smelt two bars at once, using two charges, unless there is only one ore remaining where it will use only one charge. Co-authored-by: Jason Barr <58792686+JBarr2710@users.noreply.github.com> --- .../client/plugins/itemcharges/ItemChargePlugin.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java index c9a7d4ecd2..def7c13238 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java @@ -89,6 +89,7 @@ public class ItemChargePlugin extends Plugin "You can smelt ([0-9]+|one) more pieces? of iron ore before a ring melts\\."); private static final String RING_OF_FORGING_USED_TEXT = "You retrieve a bar of iron."; private static final String RING_OF_FORGING_BREAK_TEXT = "Your Ring of Forging has melted."; + private static final String RING_OF_FORGING_VARROCK_PLATEBODY = "The Varrock platebody enabled you to smelt your next ore simultaneously."; private static final Pattern AMULET_OF_CHEMISTRY_CHECK_PATTERN = Pattern.compile( "Your amulet of chemistry has (\\d) charges? left\\." ); @@ -317,8 +318,9 @@ public class ItemChargePlugin extends Plugin } updateRingOfForgingCharges(charges); } - else if (message.equals(RING_OF_FORGING_USED_TEXT)) + else if (message.equals(RING_OF_FORGING_USED_TEXT) || message.equals(RING_OF_FORGING_VARROCK_PLATEBODY)) { + final ItemContainer inventory = client.getItemContainer(InventoryID.INVENTORY); final ItemContainer equipment = client.getItemContainer(InventoryID.EQUIPMENT); // Determine if the player smelted with a Ring of Forging equipped. @@ -327,7 +329,7 @@ public class ItemChargePlugin extends Plugin return; } - if (equipment.contains(ItemID.RING_OF_FORGING)) + if (equipment.contains(ItemID.RING_OF_FORGING) && (message.equals(RING_OF_FORGING_USED_TEXT) || inventory.count(ItemID.IRON_ORE) > 1)) { int charges = Ints.constrainToRange(getItemCharges(ItemChargeConfig.KEY_RING_OF_FORGING) - 1, 0, MAX_RING_OF_FORGING_CHARGES); updateRingOfForgingCharges(charges); From 8649a197bea98c724d504beb901bc8758634ee06 Mon Sep 17 00:00:00 2001 From: Brett Date: Mon, 4 Oct 2021 08:14:23 -0700 Subject: [PATCH 58/77] slayer: Add duck as alternative for bird task (#14224) --- .../src/main/java/net/runelite/client/plugins/slayer/Task.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java index 4a079391a2..f6fb7dc445 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java @@ -55,7 +55,7 @@ enum Task BASILISKS("Basilisks", ItemID.BASILISK), BATS("Bats", ItemID.GIRAL_BAT_2, "Death wing"), BEARS("Bears", ItemID.ENSOULED_BEAR_HEAD), - BIRDS("Birds", ItemID.FEATHER, "Chicken", "Rooster", "Terrorbird", "Seagull", "Vulture"), + BIRDS("Birds", ItemID.FEATHER, "Chicken", "Rooster", "Terrorbird", "Seagull", "Vulture", "Duck"), BLACK_DEMONS("Black demons", ItemID.BLACK_DEMON_MASK), BLACK_DRAGONS("Black dragons", ItemID.BLACK_DRAGON_MASK, "Baby black dragon"), BLACK_KNIGHTS("Black Knights", ItemID.BLACK_FULL_HELM, "Black Knight"), From 185681fd2fa7e498f77a57dbcde80628c1019594 Mon Sep 17 00:00:00 2001 From: Arnaud Peralta Date: Mon, 4 Oct 2021 17:22:42 +0200 Subject: [PATCH 59/77] roof removal: Add Weiss override (#14177) --- .../client/plugins/roofremoval/overrides.jsonc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/roofremoval/overrides.jsonc b/runelite-client/src/main/resources/net/runelite/client/plugins/roofremoval/overrides.jsonc index f7a788b056..a8a0ce152d 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/roofremoval/overrides.jsonc +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/roofremoval/overrides.jsonc @@ -3298,5 +3298,15 @@ "z1": 1, "z2": 1 } + ], + "11325": [ // Weiss + { + "rx1": 43, + "ry1": 37, + "rx2": 46, + "ry2": 41, + "z1": 0, + "z2": 0 + } ] } From 1efdf4a6fd3a86b14ddb3abb256420dfc9489483 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Wed, 18 Nov 2020 21:34:17 -0800 Subject: [PATCH 60/77] cluescrolls: Add X Marks The Spot quest solutions --- .../plugins/cluescrolls/ClueScrollPlugin.java | 15 ++++++- .../plugins/cluescrolls/clues/CipherClue.java | 41 +++++++++++++------ .../cluescrolls/clues/CrypticClue.java | 3 +- .../plugins/cluescrolls/clues/MapClue.java | 4 +- 4 files changed, 47 insertions(+), 16 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java index 7cb988874c..bcc207325b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java @@ -316,11 +316,22 @@ public class ClueScrollPlugin extends Plugin { return; } - if (event.getMenuOption().equals("Read")) + + final boolean itemClicked = event.getMenuAction() == MenuAction.ITEM_FIRST_OPTION + || event.getMenuAction() == MenuAction.ITEM_SECOND_OPTION + || event.getMenuAction() == MenuAction.ITEM_THIRD_OPTION + || event.getMenuAction() == MenuAction.ITEM_FOURTH_OPTION + || event.getMenuAction() == MenuAction.ITEM_FIFTH_OPTION; + final boolean isXMarksTheSpotOrb = event.getId() == ItemID.MYSTERIOUS_ORB_23069; + + if (itemClicked && (isXMarksTheSpotOrb || event.getMenuOption().equals("Read"))) { final ItemComposition itemComposition = itemManager.getItemComposition(event.getId()); - if (itemComposition != null && (itemComposition.getName().startsWith("Clue scroll") || itemComposition.getName().startsWith("Challenge scroll"))) + if (isXMarksTheSpotOrb + || itemComposition.getName().startsWith("Clue scroll") + || itemComposition.getName().startsWith("Challenge scroll") + || itemComposition.getName().startsWith("Treasure scroll")) { clueItemId = itemComposition.getId(); updateClue(MapClue.forItemId(clueItemId)); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java index a8aff43840..e9fc62186f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java @@ -58,17 +58,29 @@ public class CipherClue extends ClueScroll implements TextClueScroll, NpcClueScr new CipherClue("GBJSZ RVFFO", "Fairy Queen", new WorldPoint(2347, 4435, 0), "Fairy Resistance Hideout"), new CipherClue("QSPGFTTPS HSBDLMFCPOF", "Professor Gracklebone", new WorldPoint(1625, 3802, 0), "Ground floor of Arceuus Library", "How many round tables can be found on this floor of the library?", "9"), new CipherClue("IWPPLQTP", "Gunnjorn", new WorldPoint(2541, 3548, 0), "Barbarian Outpost Agility course"), - new CipherClue("BSOPME MZETQPS", "Arnold Lydspor", new WorldPoint(2329, 3689, 0), "Piscatoris Fishing Colony general store/bank") + new CipherClue("BSOPME MZETQPS", "Arnold Lydspor", new WorldPoint(2329, 3689, 0), "Piscatoris Fishing Colony general store/bank"), + new CipherClue("ESBZOPS QJH QFO", new WorldPoint(3077, 3260, 0), "Inside of Martin the Master Gardener's pig pen in Draynor Village.") ); - private String text; - private String npc; - private WorldPoint location; - private String area; + private final String text; @Nullable - private String question; + private final String npc; + private final WorldPoint location; + private final String area; @Nullable - private String answer; + private final String question; + @Nullable + private final String answer; + + private CipherClue(String text, WorldPoint location, String area) + { + this.text = "The cipher reveals where to dig next: " + text; + this.npc = null; + this.location = location; + this.area = area; + this.question = null; + this.answer = null; + } private CipherClue(String text, String npc, WorldPoint location, String area) { @@ -89,11 +101,16 @@ public class CipherClue extends ClueScroll implements TextClueScroll, NpcClueScr public void makeOverlayHint(PanelComponent panelComponent, ClueScrollPlugin plugin) { panelComponent.getChildren().add(TitleComponent.builder().text("Cipher Clue").build()); - panelComponent.getChildren().add(LineComponent.builder().left("NPC:").build()); - panelComponent.getChildren().add(LineComponent.builder() - .left(getNpc()) - .leftColor(TITLED_CONTENT_COLOR) - .build()); + + final String clueNpc = getNpc(); + if (clueNpc != null) + { + panelComponent.getChildren().add(LineComponent.builder().left("NPC:").build()); + panelComponent.getChildren().add(LineComponent.builder() + .left(clueNpc) + .leftColor(TITLED_CONTENT_COLOR) + .build()); + } panelComponent.getChildren().add(LineComponent.builder().left("Location:").build()); panelComponent.getChildren().add(LineComponent.builder() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java index 0e8ce89b34..7c4b03c4c8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java @@ -325,7 +325,8 @@ public class CrypticClue extends ClueScroll implements TextClueScroll, NpcClueSc new CrypticClue("Search the crates in the fruit store just east of the Hosidius town centre.", CRATES_27533, new WorldPoint(1799, 3613, 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, 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("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."), + new CrypticClue("Within the town of Lumbridge lives a man named Bob. He walks out of his door and takes 1 step east, 7 steps north, 5 steps west and 1 step south. Once he arrives, he digs a hole and buries his treasure.", new WorldPoint(3230, 3209, 0), "Just west of the bush outside Bob's axe shop in Lumbridge.") ); private final String text; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java index 06334ab0ff..fcc6153f89 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java @@ -89,7 +89,9 @@ public class MapClue extends ClueScroll implements ObjectClueScroll new MapClue(CLUE_SCROLL_ELITE_19783, new WorldPoint(2202, 3062, 0), "Zul-Andra. Fairy ring BJS"), new MapClue(CLUE_SCROLL_ELITE_19784, new WorldPoint(1815, 3852, 0), "At the Soul Altar, north-east of the Arceuus essence mine."), new MapClue(CLUE_SCROLL_ELITE_19785, new WorldPoint(3538, 3208, 0), "East of Burgh de Rott."), - new MapClue(CLUE_SCROLL_ELITE_19786, new WorldPoint(2703, 2716, 0), CRATE_6616, "The crate in south-western Ape Atoll") + new MapClue(CLUE_SCROLL_ELITE_19786, new WorldPoint(2703, 2716, 0), CRATE_6616, "The crate in south-western Ape Atoll"), + new MapClue(TREASURE_SCROLL_23068, new WorldPoint(3203, 3213, 0), "Behind Lumbridge Castle, just outside the kitchen door"), + new MapClue(MYSTERIOUS_ORB_23069, new WorldPoint(3108, 3262, 0), "South-west of the wheat field east of Draynor Village.") ); private final int itemId; From 38f1d2e71fd6ed17bb56d0baad463feaac1a8575 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 2 Oct 2021 13:20:37 -0400 Subject: [PATCH 61/77] ui: recompute minimum size after frame restore Without this, the minimum size will be the same size as was prior to maximizing the frame. If the side bar or panel is opened or closed when maximized this can cause the minimum size to be incorrect after a restore. Co-authored-by: Mark Koester Co-authored-by: Jeremy Plsek --- .../main/java/net/runelite/client/ui/ClientUI.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java index fbb85f09bb..c887a54682 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java @@ -32,6 +32,7 @@ import java.awt.Component; import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; +import java.awt.Frame; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GraphicsConfiguration; @@ -361,6 +362,16 @@ public class ClientUI } }); + frame.addWindowStateListener(l -> + { + if (l.getNewState() == Frame.NORMAL) + { + // Recompute minimum size after a restore. + // Invoking this immediately causes the minimum size to be 8px too small with custom chrome on. + SwingUtilities.invokeLater(frame::revalidateMinimumSize); + } + }); + container = new JPanel(); container.setLayout(new BoxLayout(container, BoxLayout.X_AXIS)); container.add(new ClientPanel(client)); From 6f61e6f89c59d84d71596a53cf72c6fd3c2f4b4d Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Tue, 5 Oct 2021 02:41:58 +0200 Subject: [PATCH 62/77] project(rs-api): Fix virtual level up widgets --- .../src/main/java/net/runelite/rs/api/RSWidget.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java b/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java index a862644faa..8d4e81ad02 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java @@ -191,19 +191,19 @@ public interface RSWidget extends Widget @Override void setRotationX(int rotationX); - @Import("modelAngleY") + @Import("modelAngleZ") // Do not change @Override int getRotationY(); - @Import("modelAngleY") + @Import("modelAngleZ") // Do not change @Override void setRotationY(int rotationY); - @Import("modelAngleZ") + @Import("modelAngleY") // Do not change @Override int getRotationZ(); - @Import("modelAngleZ") + @Import("modelAngleY") // Do not change @Override void setRotationZ(int rotationZ); From c16172e508a802d57966b5c1d328de3cdb5f170e Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 5 Oct 2021 12:55:38 -0400 Subject: [PATCH 63/77] api: add widget classes to runtime exclusions --- runelite-api/pom.xml | 11 ++++++++++- .../net/runelite/api/widgets/ItemQuantityMode.java | 2 +- .../java/net/runelite/api/widgets/WidgetConfig.java | 2 +- .../main/java/net/runelite/api/widgets/WidgetID.java | 2 +- .../net/runelite/api/widgets/WidgetModalMode.java | 2 +- .../net/runelite/api/widgets/WidgetModelType.java | 2 +- 6 files changed, 15 insertions(+), 6 deletions(-) diff --git a/runelite-api/pom.xml b/runelite-api/pom.xml index 1b2e9d6de4..075a6201c9 100644 --- a/runelite-api/pom.xml +++ b/runelite-api/pom.xml @@ -72,7 +72,7 @@ maven-jar-plugin