Merge branch 'runelite' into question_mark_full_stop
# Conflicts: # runelite-client/src/main/java/com/openosrs/client/game/NPCStats.java # runelite-client/src/main/java/net/runelite/client/plugins/Plugin.java
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import groovy.json.JsonOutput
|
||||
import org.gradle.api.DefaultTask
|
||||
import org.gradle.api.file.RegularFileProperty
|
||||
import org.gradle.api.tasks.*
|
||||
@@ -117,11 +118,13 @@ open class BootstrapTask @Inject constructor(@Input val type: String) : DefaultT
|
||||
"artifacts" to getArtifacts()
|
||||
).toString()
|
||||
|
||||
val prettyJson = JsonOutput.prettyPrint(json)
|
||||
|
||||
val bootstrapDir = File("${project.buildDir}/bootstrap")
|
||||
bootstrapDir.mkdirs()
|
||||
|
||||
File(bootstrapDir, "bootstrap-${type}.json").printWriter().use { out ->
|
||||
out.println(json)
|
||||
out.println(prettyJson)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ package net.runelite.api;
|
||||
* Note: This class is not complete and may not contain a specific animation
|
||||
* required.
|
||||
*/
|
||||
public class AnimationID
|
||||
public final class AnimationID
|
||||
{
|
||||
public static final int IDLE = -1;
|
||||
public static final int HERBLORE_PESTLE_AND_MORTAR = 364;
|
||||
@@ -251,4 +251,257 @@ public class AnimationID
|
||||
|
||||
// POH Animations
|
||||
public static final int INCENSE_BURNER = 3687;
|
||||
}
|
||||
|
||||
//OPENOSRS
|
||||
|
||||
// NPC animations
|
||||
public static final int FISHING_TRAILBLAZER_HARPOON_2 = 8785;
|
||||
|
||||
public static final int CRYSTALLINE_RAT_DEATH = 8334;
|
||||
public static final int CRYSTALLINE_BAT_DEATH = 4917;
|
||||
public static final int CRYSTALLINE_WOLF_DEATH = 8335;
|
||||
public static final int CRYSTALLINE_SPIDER_DEATH = 8338;
|
||||
public static final int CRYSTALLINE_UNICORN_DEATH = 6377;
|
||||
public static final int CRYSTALLINE_DRAGON_DEATH = 92;
|
||||
public static final int CRYSTALLINE_BEAR_DEATH = 4929;
|
||||
public static final int CRYSTALLINE_DARK_BEAST_DEATH = 2733;
|
||||
public static final int CORRUPTED_SCORPION_DEATH = 6256;
|
||||
|
||||
public static final int TABLET_TELEPORT = 4069;
|
||||
|
||||
public static final int THIEVING_STALL = 832;
|
||||
public static final int PICKPOCKET_SUCCESS = 881;
|
||||
public static final int PULL_LEVER = 2140;
|
||||
public static final int STANDARD_PURPLE_TELEPORT = 714;
|
||||
public static final int ECTOPHIAL_TELEPORT = 878;
|
||||
public static final int FAIRY_RING_TELEPORT = 3265;
|
||||
public static final int SCROLL_TELEPORT = 3864;
|
||||
public static final int XERICS_TALISMAN_TELEPORT = 3865;
|
||||
public static final int WILDERNESS_OBELISK_TELEPORT = 3945;
|
||||
public static final int SEED_POD_TELEPORT = 4544;
|
||||
|
||||
//block animations for players and perhaps npcs as well?
|
||||
public static final int BLOCK_DEFENDER = 4177;
|
||||
public static final int BLOCK_NO_SHIELD = 420;
|
||||
public static final int BLOCK_SHIELD = 1156;
|
||||
public static final int BLOCK_SWORD = 388;
|
||||
public static final int BLOCK_UNARMED = 424; // Same Animation as failed pickpocked
|
||||
|
||||
public static final int NIGHTMARE_DEATH = 8612;
|
||||
public static final int LOW_LEVEL_MAGIC_ATTACK = 1162;
|
||||
public static final int HIGH_LEVEL_MAGIC_ATTACK = 1167;
|
||||
public static final int BLOWPIPE_ATTACK = 5061;
|
||||
|
||||
// NPC animations
|
||||
public static final int BLACKJACK_KO = 838;
|
||||
|
||||
// Fight Caves
|
||||
public static final int TZTOK_JAD_MELEE_ATTACK = 2655;
|
||||
public static final int TOK_XIL_RANGE_ATTACK = 2633;
|
||||
public static final int TOK_XIL_MELEE_ATTACK = 2628;
|
||||
public static final int KET_ZEK_MELEE_ATTACK = 2644;
|
||||
public static final int KET_ZEK_MAGE_ATTACK = 2647;
|
||||
public static final int MEJ_KOT_MELEE_ATTACK = 2637;
|
||||
public static final int MEJ_KOT_HEAL_ATTACK = 2639;
|
||||
|
||||
// Vorkath
|
||||
public static final int VORKATH_WAKE_UP = 7950;
|
||||
public static final int VORKATH_DEATH = 7949;
|
||||
public static final int VORKATH_SLASH_ATTACK = 7951;
|
||||
public static final int VORKATH_ATTACK = 7952;
|
||||
public static final int VORKATH_FIRE_BOMB_OR_SPAWN_ATTACK = 7960;
|
||||
public static final int VORKATH_ACID_ATTACK = 7957;
|
||||
|
||||
// Tekton
|
||||
public static final int TEKTON_ANVIL = 7475;
|
||||
public static final int TEKTON_AUTO1 = 7482;
|
||||
public static final int TEKTON_AUTO2 = 7483;
|
||||
public static final int TEKTON_AUTO3 = 7484;
|
||||
public static final int TEKTON_FAST_AUTO1 = 7478;
|
||||
public static final int TEKTON_FAST_AUTO2 = 7488;
|
||||
public static final int TEKTON_ENRAGE_AUTO1 = 7492;
|
||||
public static final int TEKTON_ENRAGE_AUTO2 = 7493;
|
||||
public static final int TEKTON_ENRAGE_AUTO3 = 7494;
|
||||
|
||||
// Hydra
|
||||
public static final int HYDRA_WALKING = 8232;
|
||||
public static final int HYDRA_IDLE = 8233;
|
||||
public static final int HYDRA_POISON_1 = 8234;
|
||||
public static final int HYDRA_RANGED_1 = 8235;
|
||||
public static final int HYDRA_MAGIC_1 = 8236;
|
||||
public static final int HYDRA_1_1 = 8237;
|
||||
public static final int HYDRA_1_2 = 8238;
|
||||
public static final int HYDRA_LIGHTNING = 8241;
|
||||
public static final int HYDRA_RANGED_2 = 8242;
|
||||
public static final int HYDRA_MAGIC_2 = 8243;
|
||||
public static final int HYDRA_2_1 = 8244;
|
||||
public static final int HYDRA_2_2 = 8245;
|
||||
public static final int HYDRA_FIRE = 8248;
|
||||
public static final int HYDRA_RANGED_3 = 8249;
|
||||
public static final int HYDRA_MAGIC_3 = 8250;
|
||||
public static final int HYDRA_3_1 = 8251;
|
||||
public static final int HYDRA_3_2 = 8252;
|
||||
public static final int HYDRA_MAGIC_4 = 8254;
|
||||
public static final int HYDRA_POISON_4 = 8254;
|
||||
public static final int HYDRA_RANGED_4 = 8255;
|
||||
public static final int HYDRA_RANGED_OR_POISON_ATTACK = 8256;
|
||||
public static final int HYDRA_4_1 = 8257;
|
||||
public static final int HYDRA_4_2 = 8258;
|
||||
|
||||
// Inferno animations
|
||||
public static final int JAL_NIB = 7574;
|
||||
public static final int JAL_MEJRAH = 7578;
|
||||
public static final int JAL_MEJRAH_STAND = 7577;
|
||||
public static final int JAL_AK_RANGE_ATTACK = 7581;
|
||||
public static final int JAL_AK_MELEE_ATTACK = 7582;
|
||||
public static final int JAL_AK_MAGIC_ATTACK = 7583;
|
||||
public static final int JAL_IMKOT = 7597;
|
||||
public static final int JAL_XIL_MELEE_ATTACK = 7604;
|
||||
public static final int JAL_XIL_RANGE_ATTACK = 7605;
|
||||
public static final int JAL_ZEK_MAGE_ATTACK = 7610;
|
||||
public static final int JAL_ZEK_MELEE_ATTACK = 7612;
|
||||
public static final int JALTOK_JAD_MELEE_ATTACK = 7590;
|
||||
public static final int JALTOK_JAD_MAGE_ATTACK = 7592;
|
||||
public static final int JALTOK_JAD_RANGE_ATTACK = 7593;
|
||||
public static final int TZKAL_ZUK = 7566;
|
||||
public static final int JAL_MEJJAK = 2858;
|
||||
|
||||
// General Graardor
|
||||
public static final int MINION_AUTO1 = 6154;
|
||||
public static final int MINION_AUTO2 = 6156;
|
||||
public static final int MINION_AUTO3 = 7071;
|
||||
public static final int MINION_AUTO4 = 7073;
|
||||
public static final int GENERAL_AUTO1 = 7018;
|
||||
public static final int GENERAL_AUTO2 = 7020;
|
||||
public static final int GENERAL_AUTO3 = 7021;
|
||||
|
||||
// Kr'il Tsutsaroth
|
||||
public static final int ZAMMY_GENERIC_AUTO = 64;
|
||||
public static final int KRIL_AUTO = 6948;
|
||||
public static final int KRIL_SPEC = 6950;
|
||||
public static final int ZAKL_AUTO = 7077;
|
||||
public static final int BALFRUG_AUTO = 4630;
|
||||
|
||||
// Commander Zilyana
|
||||
public static final int ZILYANA_MELEE_AUTO = 6964;
|
||||
public static final int ZILYANA_AUTO = 6967;
|
||||
public static final int ZILYANA_SPEC = 6970;
|
||||
public static final int STARLIGHT_AUTO = 6376;
|
||||
public static final int BREE_AUTO = 7026;
|
||||
public static final int GROWLER_AUTO = 7037;
|
||||
|
||||
// Kree'arra
|
||||
public static final int KREE_RANGED = 6978;
|
||||
public static final int SKREE_AUTO = 6955;
|
||||
public static final int GEERIN_AUTO = 6956;
|
||||
public static final int GEERIN_FLINCH = 6958;
|
||||
public static final int KILISA_AUTO = 6957;
|
||||
|
||||
// Vetion
|
||||
public static final int VETION_EARTHQUAKE = 5507;
|
||||
|
||||
// Zulrah
|
||||
public static final int ZULRAH_DEATH = 5804;
|
||||
public static final int ZULRAH_PHASE = 5072;
|
||||
|
||||
//Dagannoth Kings
|
||||
public static final int DAG_REX = 2853;
|
||||
public static final int DAG_PRIME = 2854;
|
||||
public static final int DAG_SUPREME = 2855;
|
||||
|
||||
// Lizardman shaman
|
||||
public static final int LIZARDMAN_SHAMAN_SPAWN = 7157;
|
||||
public static final int LIZARDMAN_SHAMAN_SPAWN_EXPLOSION = 7159;
|
||||
|
||||
// Cerberus
|
||||
public static final int CERBERUS_MAGIC_ATTACK = 4489;
|
||||
public static final int CERBERUS_RANGED_ATTACK = 4490;
|
||||
public static final int CERBERUS_MELEE_ATTACK = 4491;
|
||||
public static final int CERBERUS_LAVA_ATTACK = 4493;
|
||||
public static final int CERBERUS_SUMMON_GHOSTS = 4494;
|
||||
|
||||
// Gauntlet Hunleff
|
||||
public static final int HUNLEFF_TRAMPLE = 8420;
|
||||
public static final int HUNLEFF_ATTACK = 8419;
|
||||
public static final int HUNLEFF_TORNADO = 8418;
|
||||
public static final int HUNLLEF_SWITCH_TO_MAGIC = 8754;
|
||||
public static final int HUNLLEF_SWITCH_TO_RANGED = 8755;
|
||||
|
||||
//Zalcano
|
||||
public static final int ZALCANO_KNOCKED_DOWN = 8437;
|
||||
public static final int ZALCANO_WAKEUP = 8439;
|
||||
public static final int ZALCANO_ROCK_GLOWING = 8448;
|
||||
|
||||
// Theatre of Blood - Sugadinti Maiden
|
||||
public static final int SUGADINTI_MAIDEN_BLOOD_SPLAT_ATTACK = 8091;
|
||||
public static final int SUGADINTI_MAIDEN_MAGIC_ATTACK = 8092;
|
||||
public static final int SUGADINTI_MAIDEN_DEATH = 8094;
|
||||
|
||||
// Theatre of Blood - Pestilent Bloat
|
||||
public static final int BLOAT_SLEEP = 8082;
|
||||
|
||||
// Theatre of Blood - Sotetseg
|
||||
public static final int SOTETSEG_MELEE_ATTACK = 8138;
|
||||
public static final int SOTETSEG_REGULAR_PROJECTILE_ATTACK = 8139;
|
||||
|
||||
// Theatre of Blood - Verzik Vitur
|
||||
public static final int VERZIK_PHASE_1_MAGIC_ATTACK = 8109;
|
||||
public static final int VERZIK_PHASE_1_MAGIC_ATTACK_CHANNEL = 8110;
|
||||
public static final int VERZIK_CHANGE_TO_PHASE_2 = 8111;
|
||||
public static final int VERZIK_PHASE_2_MAGIC_ATTACK = 8114;
|
||||
public static final int VERZIK_PHASE_2_BELLY_FLOP_ATTACK_1 = 8116;
|
||||
public static final int VERZIK_PHASE_2_HEALING_CHANNEL = 8117;
|
||||
public static final int VERZIK_PHASE_2_BELLY_FLOP_ATTACK_2 = 8118;
|
||||
public static final int VERZIK_CHANGE_TO_PHASE_3 = 8119;
|
||||
public static final int VERZIK_PHASE_3_MELEE_ATTACK = 8123;
|
||||
public static final int VERZIK_PHASE_3_MAGIC_ATTACK = 8124;
|
||||
public static final int VERZIK_PHASE_3_RANGED_ATTACK = 8125;
|
||||
public static final int VERZIK_PHASE_3_GREEN_POOL_ATTACK = 8126;
|
||||
public static final int VERZIK_PHASE_3_WEB_ATTACK = 8127;
|
||||
public static final int VERZIK_DEATH_1 = 8128;
|
||||
public static final int VERZIK_DEATH_2 = 8129;
|
||||
|
||||
// The Nightmare of Ashihama
|
||||
public static final int NIGHTMARE_SPAWN_SLEEPWALKERS = 8572;
|
||||
public static final int NIGHTMARE_FLOATY = 8592;
|
||||
public static final int NIGHTMARE_WALKING = 8592;
|
||||
public static final int NIGHTMARE_IDLE = 8593;
|
||||
public static final int NIGHTMARE_MELEE_ATTACK = 8594;
|
||||
public static final int NIGHTMARE_MAGIC_ATTACK = 8595;
|
||||
public static final int NIGHTMARE_RANGED_ATTACK = 8596;
|
||||
public static final int NIGHTMARE_SURGE_ATTACK = 8597;
|
||||
public static final int NIGHTMARE_GHOST_AOE_ATTACK = 8598;
|
||||
public static final int NIGHTMARE_CURSE_PRAYERS_ATTACK = 8599;
|
||||
public static final int NIGHTMARE_SPAWN_INFECTIOUS_SPORES = 8600;
|
||||
public static final int NIGHTMARE_SPAWN_ROOM_SECTION_FLOWERS = 8601;
|
||||
public static final int NIGHTMARE_CHANNEL_DEVASTATING_ATTACK = 8604;
|
||||
public static final int NIGHTMARE_SWITCH_TO_DEVIL_PHASE = 8605;
|
||||
public static final int NIGHTMARE_PARASITE_ATTACK = 8606;
|
||||
public static final int NIGHTMARE_JUMP_DOWN = 8607;
|
||||
public static final int NIGHTMARE_SINK_DOWN = 8608;
|
||||
public static final int NIGHTMARE_JUMP_UP = 8609;
|
||||
public static final int NIGHTMARE_JUMP_UP_2 = 8610;
|
||||
public static final int NIGHTMARE_WAKE_UP = 8611;
|
||||
|
||||
//Supplies Tracker
|
||||
public static final int ONEHAND_SLASH_SWORD_ANIMATION = 390;
|
||||
public static final int ONEHAND_STAB_SWORD_ANIMATION = 386;
|
||||
public static final int SCYTHE_OF_VITUR_ANIMATION = 8056;
|
||||
public static final int LOW_LEVEL_STANDARD_SPELLS = 711;
|
||||
public static final int WAVE_SPELL_ANIMATION = 727;
|
||||
public static final int SURGE_SPELL_ANIMATION = 7855;
|
||||
public static final int HIGH_ALCH_ANIMATION = 713;
|
||||
public static final int LUNAR_HUMIDIFY = 6294;
|
||||
public static final int PRAY_AT_ALTAR = 645;
|
||||
public static final int ENSOULED_HEADS_ANIMATION = 7198;
|
||||
|
||||
// Weapon attack animations
|
||||
public static final int ONEHAND_SLASH_AXE_ANIMATION = 395;
|
||||
public static final int ONEHAND_CRUSH_PICKAXE_ANIMATION = 400;
|
||||
public static final int ONEHAND_CRUSH_AXE_ANIMATION = 401;
|
||||
public static final int UNARMED_PUNCH_ANIMATION = 422;
|
||||
public static final int UNARMED_KICK_ANIMATION = 423;
|
||||
public static final int BOW_ATTACK_ANIMATION = 426;
|
||||
public static final int ONEHAND_STAB_HALBERD_ANIMATION = 428;
|
||||
public static final int ONEHAND_SLASH_HALBERD_ANIMATION = 440;
|
||||
}
|
||||
@@ -571,7 +571,7 @@ public enum Varbits
|
||||
EXPLORER_RING_ALCHS(4554),
|
||||
EXPLORER_RING_RUNENERGY(4553),
|
||||
|
||||
|
||||
WINTERTODT_TIMER(7980),
|
||||
|
||||
/**
|
||||
* League relics
|
||||
@@ -610,76 +610,102 @@ public enum Varbits
|
||||
PVP_SPEC_ORB(8121),
|
||||
|
||||
//OPENOSRS
|
||||
/*
|
||||
* Kharedst's Memoirs Teleport Item
|
||||
*/
|
||||
KHAREDSTS_MEMOIRS_CHARGES(6035),
|
||||
|
||||
/**
|
||||
* Grand Exchange
|
||||
*/
|
||||
GRAND_EXCHANGE_PRICE_PER_ITEM(4398),
|
||||
|
||||
/*
|
||||
* Kharedst's Memoirs Teleport Item
|
||||
*/
|
||||
KHAREDSTS_MEMOIRS_CHARGES(6035),
|
||||
|
||||
LMS_POISON_PROGRESS(5317),
|
||||
|
||||
/**
|
||||
* The y coordinate of the final safespace (world coord)
|
||||
* Locked Prayers
|
||||
* 0-7 = Locked
|
||||
* 8 = Unlocked
|
||||
*/
|
||||
LMS_SAFE_Y(5320),
|
||||
CHIVPIETY_UNLOCKED(3909),
|
||||
|
||||
/**
|
||||
* 1 is true, 0 is false.
|
||||
* Locked Prayers
|
||||
* 0 = Locked
|
||||
* 1 = Unlocked
|
||||
*/
|
||||
GAUNTLET_FINAL_ROOM_ENTERED(9177),
|
||||
|
||||
RIGOUR_UNLOCKED(5451),
|
||||
AUGURY_UNLOCKED(5452),
|
||||
PRESERVE_UNLOCKED(5453),
|
||||
|
||||
/**
|
||||
* 1 is true, 0 is false.
|
||||
* Theatre of Blood 1=In Party, 2=Inside/Spectator, 3=Dead Spectating
|
||||
*/
|
||||
GAUNTLET_ENTERED(9178),
|
||||
|
||||
WITHDRAW_X_AMOUNT(3960),
|
||||
|
||||
IN_PVP_AREA(8121),
|
||||
BLOAT_DOOR(6447),
|
||||
|
||||
/**
|
||||
* Value of hotkey varbits can be 0-13
|
||||
* 0 corresponds to no hotkey set
|
||||
* 1-12 correspond to F1-F12 respectively
|
||||
* 13 corresponds to escape
|
||||
* Theatre of Blood orb varbits each number stands for the player's health on a scale of 1-27 (I think), 0 hides the orb
|
||||
*/
|
||||
COMBAT_TAB_HOTKEY(4675),
|
||||
STATS_TAB_HOTKEY(4676),
|
||||
QUESTS_TAB_HOTKEY(4677),
|
||||
INVENTORY_TAB_HOTKEY(4678),
|
||||
EQUIPMENT_TAB_HOTKEY(4679),
|
||||
PRAYER_TAB_HOTKEY(4680),
|
||||
SPELLBOOK_TAB_HOTKEY(4682),
|
||||
FRIENDS_TAB_HOTKEY(4684),
|
||||
ACCOUNT_MANAGEMENT_TAB_HOTKEY(6517),
|
||||
LOGOUT_TAB_HOTKEY(4689),
|
||||
OPTIONS_TAB_HOTKEY(4686),
|
||||
EMOTES_TAB_HOTKEY(4687),
|
||||
CLAN_TAB_HOTKEY(4683),
|
||||
MUSIC_TAB_HOTKEY(4688),
|
||||
THEATRE_OF_BLOOD_ORB_1(6442),
|
||||
THEATRE_OF_BLOOD_ORB_2(6443),
|
||||
THEATRE_OF_BLOOD_ORB_3(6444),
|
||||
THEATRE_OF_BLOOD_ORB_4(6445),
|
||||
THEATRE_OF_BLOOD_ORB_5(6446),
|
||||
|
||||
/**
|
||||
* Chat Notifications settings
|
||||
* <br>
|
||||
* LOOT_DROP_NOTIFICATIONS: 1 is true, 0 is false
|
||||
* LOOT_DROP_NOTIFICATIONS_VALUE: gp value
|
||||
* UNTRADEABLE_LOOT_NOTIFICATIONS: 1 is true, 0 is false
|
||||
* BOSS_KILL_COUNT_UPDATES: 1 is filtered, 0 is unfiltered
|
||||
* DROP_ITEM_WARNINGS: 1 is true, 0 is false
|
||||
* DROP_ITEM_WARNINGS_VALUE: gp value
|
||||
* Nightmare Zone
|
||||
*/
|
||||
LOOT_DROP_NOTIFICATIONS(5399),
|
||||
LOOT_DROP_NOTIFICATIONS_VALUE(5400),
|
||||
UNTRADEABLE_LOOT_NOTIFICATIONS(5402),
|
||||
BOSS_KILL_COUNT_UPDATES(4930),
|
||||
DROP_ITEM_WARNINGS(5411),
|
||||
DROP_ITEM_WARNINGS_VALUE(5412),
|
||||
/**
|
||||
NMZ_OVERLOAD(3955),
|
||||
|
||||
/**
|
||||
* Pyramid plunder
|
||||
*/
|
||||
PYRAMID_PLUNDER_SARCO_OPEN(2362),
|
||||
PYRAMID_PLUNDER_CHEST_OPEN(2363),
|
||||
|
||||
/**
|
||||
* In the Wilderness
|
||||
*/
|
||||
IN_THE_WILDERNESS(5963),
|
||||
|
||||
/**
|
||||
* Kingdom Management
|
||||
*/
|
||||
KINGDOM_WORKERS_WOOD(81),
|
||||
KINGDOM_WORKERS_HERBS(82),
|
||||
KINGDOM_WORKERS_FISHING(83),
|
||||
KINGDOM_WORKERS_MINING(84),
|
||||
KINGDOM_WORKERS_FISH_COOKED_BUTTON(135), // 0 - Raw, 1 - Cooked
|
||||
KINGDOM_WORKERS_HARDWOOD(2131),
|
||||
KINGDOM_WORKERS_FARM(2132),
|
||||
KINGDOM_WORKERS_HARDWOOD_BUTTON(2133), // 0 - Mahogany, 1 - Teak, 2 - Both
|
||||
KINGDOM_WORKERS_HERBS_BUTTON(2134), // 0 - Herbs, 1 - Flax
|
||||
|
||||
/**
|
||||
* Varbit used for Slayer reward points
|
||||
*/
|
||||
SLAYER_REWARD_POINTS(4068),
|
||||
|
||||
/**
|
||||
* 0 = standard
|
||||
* 1 = ancients
|
||||
* 2 = lunars
|
||||
* 3 = arrceus
|
||||
**/
|
||||
SPELLBOOK(4070),
|
||||
|
||||
/**
|
||||
* Bank settings/flags
|
||||
**/
|
||||
BANK_NOTE_FLAG(3958),
|
||||
|
||||
|
||||
/**
|
||||
* Spells being auto-casted
|
||||
*/
|
||||
AUTO_CAST_SPELL(276),
|
||||
|
||||
/**
|
||||
* Temple Trekking
|
||||
*/
|
||||
TREK_POINTS(1955),
|
||||
@@ -796,8 +822,6 @@ public enum Varbits
|
||||
*/
|
||||
BUILDING_MODE(2176),
|
||||
|
||||
WINTERTODT_TIMER(7980),
|
||||
|
||||
/**
|
||||
* 1 if in game, 0 if not
|
||||
*/
|
||||
@@ -813,81 +837,64 @@ public enum Varbits
|
||||
*/
|
||||
LMS_SAFE_X(5316),
|
||||
|
||||
LMS_POISON_PROGRESS(5317),
|
||||
|
||||
/**
|
||||
* Locked Prayers
|
||||
* 0-7 = Locked
|
||||
* 8 = Unlocked
|
||||
* The y coordinate of the final safespace (world coord)
|
||||
*/
|
||||
CHIVPIETY_UNLOCKED(3909),
|
||||
LMS_SAFE_Y(5320),
|
||||
|
||||
/**
|
||||
* Locked Prayers
|
||||
* 0 = Locked
|
||||
* 1 = Unlocked
|
||||
* 1 is true, 0 is false.
|
||||
*/
|
||||
GAUNTLET_FINAL_ROOM_ENTERED(9177),
|
||||
|
||||
RIGOUR_UNLOCKED(5451),
|
||||
AUGURY_UNLOCKED(5452),
|
||||
PRESERVE_UNLOCKED(5453),
|
||||
|
||||
/**
|
||||
* Spells being auto-casted
|
||||
* 1 is true, 0 is false.
|
||||
*/
|
||||
AUTO_CAST_SPELL(276),
|
||||
GAUNTLET_ENTERED(9178),
|
||||
|
||||
WITHDRAW_X_AMOUNT(3960),
|
||||
|
||||
IN_PVP_AREA(8121),
|
||||
|
||||
/**
|
||||
* Theatre of Blood 1=In Party, 2=Inside/Spectator, 3=Dead Spectating
|
||||
* Value of hotkey varbits can be 0-13
|
||||
* 0 corresponds to no hotkey set
|
||||
* 1-12 correspond to F1-F12 respectively
|
||||
* 13 corresponds to escape
|
||||
*/
|
||||
BLOAT_DOOR(6447),
|
||||
COMBAT_TAB_HOTKEY(4675),
|
||||
STATS_TAB_HOTKEY(4676),
|
||||
QUESTS_TAB_HOTKEY(4677),
|
||||
INVENTORY_TAB_HOTKEY(4678),
|
||||
EQUIPMENT_TAB_HOTKEY(4679),
|
||||
PRAYER_TAB_HOTKEY(4680),
|
||||
SPELLBOOK_TAB_HOTKEY(4682),
|
||||
FRIENDS_TAB_HOTKEY(4684),
|
||||
ACCOUNT_MANAGEMENT_TAB_HOTKEY(6517),
|
||||
LOGOUT_TAB_HOTKEY(4689),
|
||||
OPTIONS_TAB_HOTKEY(4686),
|
||||
EMOTES_TAB_HOTKEY(4687),
|
||||
CLAN_TAB_HOTKEY(4683),
|
||||
MUSIC_TAB_HOTKEY(4688),
|
||||
|
||||
/**
|
||||
* Theatre of Blood orb varbits each number stands for the player's health on a scale of 1-27 (I think), 0 hides the orb
|
||||
* Chat Notifications settings
|
||||
* <br>
|
||||
* LOOT_DROP_NOTIFICATIONS: 1 is true, 0 is false
|
||||
* LOOT_DROP_NOTIFICATIONS_VALUE: gp value
|
||||
* UNTRADEABLE_LOOT_NOTIFICATIONS: 1 is true, 0 is false
|
||||
* BOSS_KILL_COUNT_UPDATES: 1 is filtered, 0 is unfiltered
|
||||
* DROP_ITEM_WARNINGS: 1 is true, 0 is false
|
||||
* DROP_ITEM_WARNINGS_VALUE: gp value
|
||||
*/
|
||||
THEATRE_OF_BLOOD_ORB_1(6442),
|
||||
THEATRE_OF_BLOOD_ORB_2(6443),
|
||||
THEATRE_OF_BLOOD_ORB_3(6444),
|
||||
THEATRE_OF_BLOOD_ORB_4(6445),
|
||||
THEATRE_OF_BLOOD_ORB_5(6446),
|
||||
|
||||
//NMZ
|
||||
NMZ_OVERLOAD(3955),
|
||||
|
||||
//Pyramid Plunder
|
||||
PYRAMID_PLUNDER_SARCO_OPEN(2362),
|
||||
PYRAMID_PLUNDER_CHEST_OPEN(2363),
|
||||
|
||||
/**
|
||||
* Varbit used for Slayer reward points
|
||||
*/
|
||||
SLAYER_REWARD_POINTS(4068),
|
||||
|
||||
/**
|
||||
* 0 = standard
|
||||
* 1 = ancients
|
||||
* 2 = lunars
|
||||
* 3 = arrceus
|
||||
**/
|
||||
SPELLBOOK(4070),
|
||||
|
||||
/**
|
||||
* Bank settings/flags
|
||||
**/
|
||||
BANK_NOTE_FLAG(3958),
|
||||
|
||||
KINGDOM_WORKERS_WOOD(81),
|
||||
KINGDOM_WORKERS_HERBS(82),
|
||||
KINGDOM_WORKERS_FISHING(83),
|
||||
KINGDOM_WORKERS_MINING(84),
|
||||
KINGDOM_WORKERS_FISH_COOKED_BUTTON(135), // 0 - Raw, 1 - Cooked
|
||||
KINGDOM_WORKERS_HARDWOOD(2131),
|
||||
KINGDOM_WORKERS_FARM(2132),
|
||||
KINGDOM_WORKERS_HARDWOOD_BUTTON(2133), // 0 - Mahogany, 1 - Teak, 2 - Both
|
||||
KINGDOM_WORKERS_HERBS_BUTTON(2134), // 0 - Herbs, 1 - Flax
|
||||
|
||||
/**
|
||||
* In the Wilderness
|
||||
*/
|
||||
IN_THE_WILDERNESS(5963),
|
||||
LOOT_DROP_NOTIFICATIONS(5399),
|
||||
LOOT_DROP_NOTIFICATIONS_VALUE(5400),
|
||||
UNTRADEABLE_LOOT_NOTIFICATIONS(5402),
|
||||
BOSS_KILL_COUNT_UPDATES(4930),
|
||||
DROP_ITEM_WARNINGS(5411),
|
||||
DROP_ITEM_WARNINGS_VALUE(5412),
|
||||
;
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (c) 2018, Adam <Adam@sigterm.info>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.runelite.api.events;
|
||||
|
||||
import net.runelite.api.widgets.Widget;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* An event where the hidden state of a {@link Widget} has been modified.
|
||||
*/
|
||||
@Data
|
||||
public class WidgetHiddenChanged implements Event
|
||||
{
|
||||
/**
|
||||
* The affected widget.
|
||||
*/
|
||||
private Widget widget;
|
||||
/**
|
||||
* The new hidden state of the widget.
|
||||
*/
|
||||
private boolean hidden;
|
||||
}
|
||||
@@ -138,4 +138,37 @@ public class OverlayUtil extends net.runelite.client.ui.overlay.OverlayUtil
|
||||
graphics.fill(poly);
|
||||
graphics.setStroke(originalStroke);
|
||||
}
|
||||
|
||||
public static void renderAreaTilePolygon(Graphics2D graphics, Shape poly, Color color)
|
||||
{
|
||||
graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), 10));
|
||||
graphics.fill(poly);
|
||||
}
|
||||
|
||||
public static void renderFullLine(Graphics2D graphics, int[][] line, Color color)
|
||||
{
|
||||
graphics.setColor(color);
|
||||
final Stroke originalStroke = graphics.getStroke();
|
||||
graphics.setStroke(new BasicStroke(2));
|
||||
graphics.drawLine(line[0][0], line[0][1], line[1][0], line[1][1]);
|
||||
graphics.setStroke(originalStroke);
|
||||
}
|
||||
|
||||
public static void renderDashedLine(Graphics2D graphics, int[][] line, Color color)
|
||||
{
|
||||
graphics.setColor(color);
|
||||
final Stroke originalStroke = graphics.getStroke();
|
||||
graphics.setStroke(new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{9}, 0));
|
||||
graphics.drawLine(line[0][0], line[0][1], line[1][0], line[1][1]);
|
||||
graphics.setStroke(originalStroke);
|
||||
}
|
||||
|
||||
public static void renderOutlinePolygon(Graphics2D graphics, Shape poly, Color color)
|
||||
{
|
||||
graphics.setColor(color);
|
||||
final Stroke originalStroke = graphics.getStroke();
|
||||
graphics.setStroke(new BasicStroke(2));
|
||||
graphics.draw(poly);
|
||||
graphics.setStroke(originalStroke);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright (c) 2019, TheStonedTurtle <https://github.com/TheStonedTurtle>
|
||||
* 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.ui.overlay.components.table;
|
||||
|
||||
public enum TableAlignment
|
||||
{
|
||||
LEFT,
|
||||
CENTER,
|
||||
RIGHT
|
||||
}
|
||||
@@ -0,0 +1,465 @@
|
||||
/*
|
||||
* Copyright (c) 2018, Jordan Atwood <jordan.atwood423@gmail.com>
|
||||
* Copyright (c) 2019, TheStonedTurtle <https://github.com/TheStonedTurtle>
|
||||
* 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.ui.overlay.components.table;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.FontMetrics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Point;
|
||||
import java.awt.Rectangle;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import lombok.Getter;
|
||||
import lombok.NonNull;
|
||||
import lombok.Setter;
|
||||
import net.runelite.api.util.Text;
|
||||
import net.runelite.client.ui.overlay.components.ComponentConstants;
|
||||
import net.runelite.client.ui.overlay.components.LayoutableRenderableEntity;
|
||||
import net.runelite.client.ui.overlay.components.TextComponent;
|
||||
|
||||
@Setter
|
||||
public class TableComponent implements LayoutableRenderableEntity
|
||||
{
|
||||
private static final TableElement EMPTY_ELEMENT = TableElement.builder().build();
|
||||
|
||||
@Getter
|
||||
private final List<TableElement> columns = new ArrayList<>();
|
||||
@Getter
|
||||
private final List<TableRow> rows = new ArrayList<>();
|
||||
|
||||
@Getter
|
||||
private final Rectangle bounds = new Rectangle();
|
||||
|
||||
private TableAlignment defaultAlignment = TableAlignment.LEFT;
|
||||
private Color defaultColor = Color.WHITE;
|
||||
private Dimension gutter = new Dimension(3, 0);
|
||||
private Point preferredLocation = new Point();
|
||||
private Dimension preferredSize = new Dimension(ComponentConstants.STANDARD_WIDTH, 0);
|
||||
|
||||
@Override
|
||||
public Dimension render(final Graphics2D graphics)
|
||||
{
|
||||
final FontMetrics metrics = graphics.getFontMetrics();
|
||||
final TableRow colRow = TableRow.builder().elements(this.columns).build();
|
||||
final int[] columnWidths = getColumnWidths(metrics, colRow);
|
||||
|
||||
graphics.translate(preferredLocation.x, preferredLocation.y);
|
||||
|
||||
// Display the columns first
|
||||
int height = displayRow(graphics, colRow, 0, columnWidths, metrics);
|
||||
|
||||
for (TableRow row : this.rows)
|
||||
{
|
||||
height = displayRow(graphics, row, height, columnWidths, metrics);
|
||||
}
|
||||
|
||||
graphics.translate(-preferredLocation.x, -preferredLocation.y);
|
||||
|
||||
final Dimension dimension = new Dimension(preferredSize.width, height);
|
||||
bounds.setLocation(preferredLocation);
|
||||
bounds.setSize(dimension);
|
||||
|
||||
return dimension;
|
||||
}
|
||||
|
||||
private int displayRow(Graphics2D graphics, TableRow row, int height, int[] columnWidths, FontMetrics metrics)
|
||||
{
|
||||
int x = 0;
|
||||
int startingRowHeight = height;
|
||||
|
||||
final List<TableElement> elements = row.getElements();
|
||||
for (int i = 0; i < elements.size(); i++)
|
||||
{
|
||||
int y = startingRowHeight;
|
||||
final TableElement cell = elements.get(i);
|
||||
|
||||
final String content = cell.getContent();
|
||||
if (content == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
final String[] lines = lineBreakText(content, columnWidths[i], metrics);
|
||||
final TableAlignment alignment = getCellAlignment(row, i);
|
||||
final Color color = getCellColor(row, i);
|
||||
|
||||
for (String line : lines)
|
||||
{
|
||||
final int alignmentOffset = getAlignedPosition(line, alignment, columnWidths[i], metrics);
|
||||
final TextComponent leftLineComponent = new TextComponent();
|
||||
y += metrics.getHeight();
|
||||
|
||||
leftLineComponent.setPosition(new Point(x + alignmentOffset, y));
|
||||
leftLineComponent.setText(line);
|
||||
leftLineComponent.setColor(color);
|
||||
leftLineComponent.render(graphics);
|
||||
}
|
||||
height = Math.max(height, y);
|
||||
x += columnWidths[i] + gutter.width;
|
||||
}
|
||||
|
||||
return height + gutter.height;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the width that each column should take up
|
||||
* Based on https://stackoverflow.com/questions/22206825/algorithm-for-calculating-variable-column-widths-for-set-table-width
|
||||
*
|
||||
* @param metrics
|
||||
* @return int[] of column width
|
||||
*/
|
||||
private int[] getColumnWidths(final FontMetrics metrics, final TableRow columnRow)
|
||||
{
|
||||
int numCols = columns.size();
|
||||
for (final TableRow r : rows)
|
||||
{
|
||||
numCols = Math.max(r.getElements().size(), numCols);
|
||||
}
|
||||
|
||||
int[] maxtextw = new int[numCols]; // max text width over all rows
|
||||
int[] maxwordw = new int[numCols]; // max width of longest word
|
||||
boolean[] flex = new boolean[numCols]; // is column flexible?
|
||||
boolean[] wrap = new boolean[numCols]; // can column be wrapped?
|
||||
int[] finalcolw = new int[numCols]; // final width of columns
|
||||
|
||||
final List<TableRow> rows = new ArrayList<>(this.rows);
|
||||
rows.add(columnRow);
|
||||
|
||||
for (final TableRow r : rows)
|
||||
{
|
||||
final List<TableElement> elements = r.getElements();
|
||||
for (int col = 0; col < elements.size(); col++)
|
||||
{
|
||||
final TableElement ele = elements.get(col);
|
||||
final String cell = ele.getContent();
|
||||
if (cell == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
final int cellWidth = getTextWidth(metrics, cell);
|
||||
|
||||
maxtextw[col] = Math.max(maxtextw[col], cellWidth);
|
||||
for (String word : cell.split(" "))
|
||||
{
|
||||
maxwordw[col] = Math.max(maxwordw[col], getTextWidth(metrics, word));
|
||||
}
|
||||
|
||||
if (maxtextw[col] == cellWidth)
|
||||
{
|
||||
wrap[col] = cell.contains(" ");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int left = preferredSize.width - (numCols - 1) * gutter.width;
|
||||
final double avg = left / numCols;
|
||||
int nflex = 0;
|
||||
|
||||
// Determine whether columns should be flexible and assign width of non-flexible cells
|
||||
for (int col = 0; col < numCols; col++)
|
||||
{
|
||||
// This limit can be adjusted as needed
|
||||
final double maxNonFlexLimit = 1.5 * avg;
|
||||
|
||||
flex[col] = maxtextw[col] > maxNonFlexLimit;
|
||||
if (flex[col])
|
||||
{
|
||||
nflex++;
|
||||
}
|
||||
else
|
||||
{
|
||||
finalcolw[col] = maxtextw[col];
|
||||
left -= finalcolw[col];
|
||||
}
|
||||
}
|
||||
|
||||
// If there is not enough space, make columns that could be word-wrapped flexible too
|
||||
if (left < nflex * avg)
|
||||
{
|
||||
for (int col = 0; col < numCols; col++)
|
||||
{
|
||||
if (!flex[col] && wrap[col])
|
||||
{
|
||||
left += finalcolw[col];
|
||||
finalcolw[col] = 0;
|
||||
flex[col] = true;
|
||||
nflex++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Calculate weights for flexible columns. The max width is capped at the table width to
|
||||
// treat columns that have to be wrapped more or less equal
|
||||
int tot = 0;
|
||||
for (int col = 0; col < numCols; col++)
|
||||
{
|
||||
if (flex[col])
|
||||
{
|
||||
maxtextw[col] = Math.min(maxtextw[col], preferredSize.width);
|
||||
tot += maxtextw[col];
|
||||
}
|
||||
}
|
||||
|
||||
// Now assign the actual width for flexible columns. Make sure that it is at least as long
|
||||
// as the longest word length
|
||||
for (int col = 0; col < numCols; col++)
|
||||
{
|
||||
if (flex[col])
|
||||
{
|
||||
finalcolw[col] = left * maxtextw[col] / tot;
|
||||
finalcolw[col] = Math.max(finalcolw[col], maxwordw[col]);
|
||||
left -= finalcolw[col];
|
||||
}
|
||||
}
|
||||
|
||||
// When the sum of column widths is less than the total space available, distribute the
|
||||
// extra space equally across all columns
|
||||
final int extraPerCol = left / numCols;
|
||||
for (int col = 0; col < numCols; col++)
|
||||
{
|
||||
finalcolw[col] += extraPerCol;
|
||||
left -= extraPerCol;
|
||||
}
|
||||
// Add any remainder to the right-most column
|
||||
finalcolw[finalcolw.length - 1] += left;
|
||||
|
||||
return finalcolw;
|
||||
}
|
||||
|
||||
private static int getTextWidth(final FontMetrics metrics, final String cell)
|
||||
{
|
||||
return metrics.stringWidth(Text.removeTags(cell));
|
||||
}
|
||||
|
||||
private static String[] lineBreakText(final String text, final int maxWidth, final FontMetrics metrics)
|
||||
{
|
||||
final String[] words = text.split(" ");
|
||||
|
||||
if (words.length == 0)
|
||||
{
|
||||
return new String[0];
|
||||
}
|
||||
|
||||
final StringBuilder wrapped = new StringBuilder(words[0]);
|
||||
int spaceLeft = maxWidth - getTextWidth(metrics, wrapped.toString());
|
||||
|
||||
for (int i = 1; i < words.length; i++)
|
||||
{
|
||||
final String word = words[i];
|
||||
final int wordLen = getTextWidth(metrics, word);
|
||||
final int spaceWidth = metrics.stringWidth(" ");
|
||||
|
||||
if (wordLen + spaceWidth > spaceLeft)
|
||||
{
|
||||
wrapped.append("\n").append(word);
|
||||
spaceLeft = maxWidth - wordLen;
|
||||
}
|
||||
else
|
||||
{
|
||||
wrapped.append(" ").append(word);
|
||||
spaceLeft -= spaceWidth + wordLen;
|
||||
}
|
||||
}
|
||||
|
||||
return wrapped.toString().split("\n");
|
||||
}
|
||||
|
||||
public boolean isEmpty()
|
||||
{
|
||||
return columns.size() == 0 || rows.size() == 0;
|
||||
}
|
||||
|
||||
private void ensureColumnSize(final int size)
|
||||
{
|
||||
while (size > columns.size())
|
||||
{
|
||||
columns.add(TableElement.builder().build());
|
||||
}
|
||||
}
|
||||
|
||||
private static int getAlignedPosition(final String str, final TableAlignment alignment, final int columnWidth, final FontMetrics metrics)
|
||||
{
|
||||
final int stringWidth = getTextWidth(metrics, str);
|
||||
int offset = 0;
|
||||
|
||||
switch (alignment)
|
||||
{
|
||||
case LEFT:
|
||||
break;
|
||||
case CENTER:
|
||||
offset = (columnWidth / 2) - (stringWidth / 2);
|
||||
break;
|
||||
case RIGHT:
|
||||
offset = columnWidth - stringWidth;
|
||||
break;
|
||||
}
|
||||
return offset;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the color for the specified table element.
|
||||
* Priority order: cell->row->column->default
|
||||
*
|
||||
* @param row TableRow element
|
||||
* @param colIndex column index
|
||||
*/
|
||||
private Color getCellColor(final TableRow row, final int colIndex)
|
||||
{
|
||||
final List<TableElement> rowElements = row.getElements();
|
||||
final TableElement cell = colIndex < rowElements.size() ? rowElements.get(colIndex) : EMPTY_ELEMENT;
|
||||
final TableElement column = colIndex < columns.size() ? columns.get(colIndex) : EMPTY_ELEMENT;
|
||||
|
||||
return firstNonNull(
|
||||
cell.getColor(),
|
||||
row.getRowColor(),
|
||||
column.getColor(),
|
||||
defaultColor);
|
||||
}
|
||||
|
||||
private void setColumnAlignment(final int col, final TableAlignment alignment)
|
||||
{
|
||||
assert columns.size() > col;
|
||||
columns.get(col).setAlignment(alignment);
|
||||
}
|
||||
|
||||
public void setColumnAlignments(@Nonnull final TableAlignment... alignments)
|
||||
{
|
||||
ensureColumnSize(alignments.length);
|
||||
for (int i = 0; i < alignments.length; i++)
|
||||
{
|
||||
setColumnAlignment(i, alignments[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the alignment for the specified table element.
|
||||
* Priority order: cell->row->column->default
|
||||
*
|
||||
* @param row TableRow element
|
||||
* @param colIndex column index
|
||||
*/
|
||||
private TableAlignment getCellAlignment(final TableRow row, final int colIndex)
|
||||
{
|
||||
final List<TableElement> rowElements = row.getElements();
|
||||
final TableElement cell = colIndex < rowElements.size() ? rowElements.get(colIndex) : EMPTY_ELEMENT;
|
||||
final TableElement column = colIndex < columns.size() ? columns.get(colIndex) : EMPTY_ELEMENT;
|
||||
|
||||
return firstNonNull(
|
||||
cell.getAlignment(),
|
||||
row.getRowAlignment(),
|
||||
column.getAlignment(),
|
||||
defaultAlignment);
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
private static <T> T firstNonNull(@Nullable T... elements)
|
||||
{
|
||||
if (elements == null || elements.length == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
T cur = elements[0];
|
||||
while (cur == null && i < elements.length)
|
||||
{
|
||||
cur = elements[i];
|
||||
i++;
|
||||
}
|
||||
|
||||
return cur;
|
||||
}
|
||||
|
||||
// Helper functions for cleaner overlay code
|
||||
public void addRow(@Nonnull final String... cells)
|
||||
{
|
||||
final List<TableElement> elements = new ArrayList<>();
|
||||
for (final String cell : cells)
|
||||
{
|
||||
elements.add(TableElement.builder().content(cell).build());
|
||||
}
|
||||
|
||||
final TableRow row = TableRow.builder().build();
|
||||
row.setElements(elements);
|
||||
|
||||
this.rows.add(row);
|
||||
}
|
||||
|
||||
private void addRows(@Nonnull final String[]... rows)
|
||||
{
|
||||
for (String[] row : rows)
|
||||
{
|
||||
addRow(row);
|
||||
}
|
||||
}
|
||||
|
||||
public void addRows(@NonNull final TableRow... rows)
|
||||
{
|
||||
this.rows.addAll(Arrays.asList(rows));
|
||||
}
|
||||
|
||||
public void setRows(@Nonnull final String[]... elements)
|
||||
{
|
||||
this.rows.clear();
|
||||
addRows(elements);
|
||||
}
|
||||
|
||||
public void setRows(@Nonnull final TableRow... elements)
|
||||
{
|
||||
this.rows.clear();
|
||||
this.rows.addAll(Arrays.asList(elements));
|
||||
}
|
||||
|
||||
private void addColumn(@Nonnull final String col)
|
||||
{
|
||||
this.columns.add(TableElement.builder().content(col).build());
|
||||
}
|
||||
|
||||
public void addColumns(@NonNull final TableElement... columns)
|
||||
{
|
||||
this.columns.addAll(Arrays.asList(columns));
|
||||
}
|
||||
|
||||
public void setColumns(@Nonnull final TableElement... elements)
|
||||
{
|
||||
this.columns.clear();
|
||||
this.columns.addAll(Arrays.asList(elements));
|
||||
}
|
||||
|
||||
public void setColumns(@Nonnull final String... columns)
|
||||
{
|
||||
this.columns.clear();
|
||||
for (String col : columns)
|
||||
{
|
||||
addColumn(col);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (c) 2019, TheStonedTurtle <https://github.com/TheStonedTurtle>
|
||||
* 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.ui.overlay.components.table;
|
||||
|
||||
import java.awt.Color;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
public class TableElement
|
||||
{
|
||||
TableAlignment alignment;
|
||||
Color color;
|
||||
String content;
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright (c) 2019, TheStonedTurtle <https://github.com/TheStonedTurtle>
|
||||
* 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.ui.overlay.components.table;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
public class TableRow
|
||||
{
|
||||
Color rowColor;
|
||||
TableAlignment rowAlignment;
|
||||
@Builder.Default
|
||||
List<TableElement> elements = Collections.emptyList();
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright (c) 2018, Connor <contact@connor-parks.email>
|
||||
* 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.util;
|
||||
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.datatransfer.DataFlavor;
|
||||
import java.awt.datatransfer.StringSelection;
|
||||
import java.awt.datatransfer.Transferable;
|
||||
import java.awt.datatransfer.UnsupportedFlavorException;
|
||||
import java.io.IOException;
|
||||
|
||||
public class Clipboard
|
||||
{
|
||||
public static String retrieve()
|
||||
{
|
||||
Transferable contents = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
|
||||
|
||||
if (contents == null || !contents.isDataFlavorSupported(DataFlavor.stringFlavor))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
return (String) contents.getTransferData(DataFlavor.stringFlavor);
|
||||
}
|
||||
catch (UnsupportedFlavorException | IOException ex)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static void store(String contents)
|
||||
{
|
||||
final StringSelection selection = new StringSelection(contents);
|
||||
|
||||
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(selection, null);
|
||||
}
|
||||
}
|
||||
@@ -28,6 +28,7 @@ import com.google.inject.Binder;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Module;
|
||||
import org.pf4j.ExtensionPoint;
|
||||
import net.runelite.client.RuneLite;
|
||||
|
||||
public abstract class Plugin implements Module, ExtensionPoint
|
||||
{
|
||||
@@ -50,8 +51,20 @@ public abstract class Plugin implements Module, ExtensionPoint
|
||||
{
|
||||
}
|
||||
|
||||
// This should never be null when we are using it
|
||||
public final Injector getInjector()
|
||||
{
|
||||
if (injector == null)
|
||||
{
|
||||
Module pluginModule = (Binder binder) ->
|
||||
{
|
||||
binder.bind((Class<Plugin>) this.getClass()).toInstance(this);
|
||||
binder.install(this);
|
||||
};
|
||||
Injector pluginInjector = RuneLite.getInjector().createChildInjector(pluginModule);
|
||||
pluginInjector.injectMembers(this);
|
||||
injector = pluginInjector;
|
||||
}
|
||||
return injector;
|
||||
}
|
||||
|
||||
|
||||
@@ -164,20 +164,7 @@ public class PluginManager
|
||||
try
|
||||
{
|
||||
Injector injector = plugin.getInjector();
|
||||
if (injector == null)
|
||||
{
|
||||
// Create injector for the module
|
||||
Module pluginModule = (Binder binder) ->
|
||||
{
|
||||
// Since the plugin itself is a module, it won't bind itself, so we'll bind it here
|
||||
binder.bind((Class<Plugin>) plugin.getClass()).toInstance(plugin);
|
||||
binder.install(plugin);
|
||||
};
|
||||
Injector pluginInjector = RuneLite.getInjector().createChildInjector(pluginModule);
|
||||
pluginInjector.injectMembers(plugin);
|
||||
plugin.injector = pluginInjector;
|
||||
injector = pluginInjector;
|
||||
}
|
||||
|
||||
for (Key<?> key : injector.getBindings().keySet())
|
||||
{
|
||||
Class<?> type = key.getTypeLiteral().getRawType();
|
||||
@@ -207,25 +194,7 @@ public class PluginManager
|
||||
plugins = getPlugins();
|
||||
}
|
||||
plugins.forEach(pl ->
|
||||
{
|
||||
//TODO: Not sure why this is necessary but it is. The Injector isn't null when its handed off from our ExternalPluginManager.
|
||||
// Hopefully we can figure out the root cause of the underlying issue.
|
||||
if (pl.injector == null)
|
||||
{
|
||||
// Create injector for the module
|
||||
Module pluginModule = (Binder binder) ->
|
||||
{
|
||||
// Since the plugin itself is a module, it won't bind itself, so we'll bind it here
|
||||
binder.bind((Class<Plugin>) pl.getClass()).toInstance(pl);
|
||||
binder.install(pl);
|
||||
};
|
||||
Injector pluginInjector = RuneLite.getInjector().createChildInjector(pluginModule);
|
||||
pluginInjector.injectMembers(pl);
|
||||
pl.injector = pluginInjector;
|
||||
}
|
||||
|
||||
injectors.add(pl.getInjector());
|
||||
});
|
||||
injectors.add(pl.getInjector()));
|
||||
|
||||
List<Config> list = new ArrayList<>();
|
||||
for (Injector injector : injectors)
|
||||
|
||||
@@ -152,7 +152,7 @@ public class MenuEntrySwapperPlugin extends Plugin
|
||||
@Getter
|
||||
private boolean configuringShiftClick = false;
|
||||
|
||||
private final Multimap<String, Swap> swaps = LinkedHashMultimap.create();
|
||||
private static final Multimap<String, Swap> swaps = LinkedHashMultimap.create();
|
||||
private final ArrayListMultimap<String, Integer> optionIndexes = ArrayListMultimap.create();
|
||||
|
||||
@Provides
|
||||
@@ -361,7 +361,7 @@ public class MenuEntrySwapperPlugin extends Plugin
|
||||
swap("eat", "guzzle", config::swapRockCake);
|
||||
}
|
||||
|
||||
private void swap(String option, String swappedOption, Supplier<Boolean> enabled)
|
||||
public static void swap(String option, String swappedOption, Supplier<Boolean> enabled)
|
||||
{
|
||||
swap(option, alwaysTrue(), swappedOption, enabled);
|
||||
}
|
||||
@@ -371,7 +371,7 @@ public class MenuEntrySwapperPlugin extends Plugin
|
||||
swap(option, equalTo(target), swappedOption, enabled);
|
||||
}
|
||||
|
||||
private void swap(String option, Predicate<String> targetPredicate, String swappedOption, Supplier<Boolean> enabled)
|
||||
private static void swap(String option, Predicate<String> targetPredicate, String swappedOption, Supplier<Boolean> enabled)
|
||||
{
|
||||
swaps.put(option, new Swap(alwaysTrue(), targetPredicate, swappedOption, enabled, true));
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@ import net.runelite.api.HashTable;
|
||||
import net.runelite.api.Node;
|
||||
import net.runelite.api.Point;
|
||||
import net.runelite.api.WidgetNode;
|
||||
import net.runelite.api.events.WidgetHiddenChanged;
|
||||
import net.runelite.api.events.WidgetPositioned;
|
||||
import net.runelite.api.mixins.Copy;
|
||||
import net.runelite.api.mixins.FieldHook;
|
||||
@@ -74,6 +75,48 @@ public abstract class RSWidgetMixin implements RSWidget
|
||||
rl$y = -1;
|
||||
}
|
||||
|
||||
@Inject
|
||||
@Override
|
||||
public void broadcastHidden(boolean hidden)
|
||||
{
|
||||
WidgetHiddenChanged event = new WidgetHiddenChanged();
|
||||
event.setWidget(this);
|
||||
event.setHidden(hidden);
|
||||
|
||||
client.getCallbacks().post(event);
|
||||
|
||||
RSWidget[] children = getChildren();
|
||||
|
||||
if (children != null)
|
||||
{
|
||||
// recursive through children
|
||||
for (RSWidget child : children)
|
||||
{
|
||||
// if the widget is hidden it will not magically unhide from its parent changing
|
||||
if (child == null || child.isSelfHidden())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
child.broadcastHidden(hidden);
|
||||
}
|
||||
}
|
||||
|
||||
// make sure we iterate nested children as well
|
||||
// cannot be null
|
||||
Widget[] nestedChildren = getNestedChildren();
|
||||
|
||||
for (Widget nestedChild : nestedChildren)
|
||||
{
|
||||
if (nestedChild == null || nestedChild.isSelfHidden())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
((RSWidget) nestedChild).broadcastHidden(hidden);
|
||||
}
|
||||
}
|
||||
|
||||
@Inject
|
||||
@Override
|
||||
public void setRenderParentId(int parentId)
|
||||
|
||||
@@ -588,4 +588,6 @@ public interface RSWidget extends Widget
|
||||
@Import("onVarTransmit")
|
||||
@Override
|
||||
void setOnVarTransmitListener(Object[] o);
|
||||
|
||||
void broadcastHidden(boolean hidden);
|
||||
}
|
||||
Reference in New Issue
Block a user