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.DefaultTask
|
||||||
import org.gradle.api.file.RegularFileProperty
|
import org.gradle.api.file.RegularFileProperty
|
||||||
import org.gradle.api.tasks.*
|
import org.gradle.api.tasks.*
|
||||||
@@ -117,11 +118,13 @@ open class BootstrapTask @Inject constructor(@Input val type: String) : DefaultT
|
|||||||
"artifacts" to getArtifacts()
|
"artifacts" to getArtifacts()
|
||||||
).toString()
|
).toString()
|
||||||
|
|
||||||
|
val prettyJson = JsonOutput.prettyPrint(json)
|
||||||
|
|
||||||
val bootstrapDir = File("${project.buildDir}/bootstrap")
|
val bootstrapDir = File("${project.buildDir}/bootstrap")
|
||||||
bootstrapDir.mkdirs()
|
bootstrapDir.mkdirs()
|
||||||
|
|
||||||
File(bootstrapDir, "bootstrap-${type}.json").printWriter().use { out ->
|
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
|
* Note: This class is not complete and may not contain a specific animation
|
||||||
* required.
|
* required.
|
||||||
*/
|
*/
|
||||||
public class AnimationID
|
public final class AnimationID
|
||||||
{
|
{
|
||||||
public static final int IDLE = -1;
|
public static final int IDLE = -1;
|
||||||
public static final int HERBLORE_PESTLE_AND_MORTAR = 364;
|
public static final int HERBLORE_PESTLE_AND_MORTAR = 364;
|
||||||
@@ -251,4 +251,257 @@ public class AnimationID
|
|||||||
|
|
||||||
// POH Animations
|
// POH Animations
|
||||||
public static final int INCENSE_BURNER = 3687;
|
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_ALCHS(4554),
|
||||||
EXPLORER_RING_RUNENERGY(4553),
|
EXPLORER_RING_RUNENERGY(4553),
|
||||||
|
|
||||||
|
WINTERTODT_TIMER(7980),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* League relics
|
* League relics
|
||||||
@@ -610,76 +610,102 @@ public enum Varbits
|
|||||||
PVP_SPEC_ORB(8121),
|
PVP_SPEC_ORB(8121),
|
||||||
|
|
||||||
//OPENOSRS
|
//OPENOSRS
|
||||||
|
/*
|
||||||
|
* Kharedst's Memoirs Teleport Item
|
||||||
|
*/
|
||||||
|
KHAREDSTS_MEMOIRS_CHARGES(6035),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Grand Exchange
|
* Grand Exchange
|
||||||
*/
|
*/
|
||||||
GRAND_EXCHANGE_PRICE_PER_ITEM(4398),
|
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),
|
BLOAT_DOOR(6447),
|
||||||
|
|
||||||
WITHDRAW_X_AMOUNT(3960),
|
|
||||||
|
|
||||||
IN_PVP_AREA(8121),
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Value of hotkey varbits can be 0-13
|
* 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
|
||||||
* 0 corresponds to no hotkey set
|
|
||||||
* 1-12 correspond to F1-F12 respectively
|
|
||||||
* 13 corresponds to escape
|
|
||||||
*/
|
*/
|
||||||
COMBAT_TAB_HOTKEY(4675),
|
THEATRE_OF_BLOOD_ORB_1(6442),
|
||||||
STATS_TAB_HOTKEY(4676),
|
THEATRE_OF_BLOOD_ORB_2(6443),
|
||||||
QUESTS_TAB_HOTKEY(4677),
|
THEATRE_OF_BLOOD_ORB_3(6444),
|
||||||
INVENTORY_TAB_HOTKEY(4678),
|
THEATRE_OF_BLOOD_ORB_4(6445),
|
||||||
EQUIPMENT_TAB_HOTKEY(4679),
|
THEATRE_OF_BLOOD_ORB_5(6446),
|
||||||
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),
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Chat Notifications settings
|
* Nightmare Zone
|
||||||
* <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
|
|
||||||
*/
|
*/
|
||||||
LOOT_DROP_NOTIFICATIONS(5399),
|
NMZ_OVERLOAD(3955),
|
||||||
LOOT_DROP_NOTIFICATIONS_VALUE(5400),
|
|
||||||
UNTRADEABLE_LOOT_NOTIFICATIONS(5402),
|
/**
|
||||||
BOSS_KILL_COUNT_UPDATES(4930),
|
* Pyramid plunder
|
||||||
DROP_ITEM_WARNINGS(5411),
|
*/
|
||||||
DROP_ITEM_WARNINGS_VALUE(5412),
|
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
|
* Temple Trekking
|
||||||
*/
|
*/
|
||||||
TREK_POINTS(1955),
|
TREK_POINTS(1955),
|
||||||
@@ -796,8 +822,6 @@ public enum Varbits
|
|||||||
*/
|
*/
|
||||||
BUILDING_MODE(2176),
|
BUILDING_MODE(2176),
|
||||||
|
|
||||||
WINTERTODT_TIMER(7980),
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 1 if in game, 0 if not
|
* 1 if in game, 0 if not
|
||||||
*/
|
*/
|
||||||
@@ -813,81 +837,64 @@ public enum Varbits
|
|||||||
*/
|
*/
|
||||||
LMS_SAFE_X(5316),
|
LMS_SAFE_X(5316),
|
||||||
|
|
||||||
|
LMS_POISON_PROGRESS(5317),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Locked Prayers
|
* The y coordinate of the final safespace (world coord)
|
||||||
* 0-7 = Locked
|
|
||||||
* 8 = Unlocked
|
|
||||||
*/
|
*/
|
||||||
CHIVPIETY_UNLOCKED(3909),
|
LMS_SAFE_Y(5320),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Locked Prayers
|
* 1 is true, 0 is false.
|
||||||
* 0 = Locked
|
|
||||||
* 1 = Unlocked
|
|
||||||
*/
|
*/
|
||||||
|
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),
|
LOOT_DROP_NOTIFICATIONS(5399),
|
||||||
THEATRE_OF_BLOOD_ORB_2(6443),
|
LOOT_DROP_NOTIFICATIONS_VALUE(5400),
|
||||||
THEATRE_OF_BLOOD_ORB_3(6444),
|
UNTRADEABLE_LOOT_NOTIFICATIONS(5402),
|
||||||
THEATRE_OF_BLOOD_ORB_4(6445),
|
BOSS_KILL_COUNT_UPDATES(4930),
|
||||||
THEATRE_OF_BLOOD_ORB_5(6446),
|
DROP_ITEM_WARNINGS(5411),
|
||||||
|
DROP_ITEM_WARNINGS_VALUE(5412),
|
||||||
//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),
|
|
||||||
;
|
;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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.fill(poly);
|
||||||
graphics.setStroke(originalStroke);
|
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.Injector;
|
||||||
import com.google.inject.Module;
|
import com.google.inject.Module;
|
||||||
import org.pf4j.ExtensionPoint;
|
import org.pf4j.ExtensionPoint;
|
||||||
|
import net.runelite.client.RuneLite;
|
||||||
|
|
||||||
public abstract class Plugin implements Module, ExtensionPoint
|
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()
|
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;
|
return injector;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -164,20 +164,7 @@ public class PluginManager
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
Injector injector = plugin.getInjector();
|
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())
|
for (Key<?> key : injector.getBindings().keySet())
|
||||||
{
|
{
|
||||||
Class<?> type = key.getTypeLiteral().getRawType();
|
Class<?> type = key.getTypeLiteral().getRawType();
|
||||||
@@ -207,25 +194,7 @@ public class PluginManager
|
|||||||
plugins = getPlugins();
|
plugins = getPlugins();
|
||||||
}
|
}
|
||||||
plugins.forEach(pl ->
|
plugins.forEach(pl ->
|
||||||
{
|
injectors.add(pl.getInjector()));
|
||||||
//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());
|
|
||||||
});
|
|
||||||
|
|
||||||
List<Config> list = new ArrayList<>();
|
List<Config> list = new ArrayList<>();
|
||||||
for (Injector injector : injectors)
|
for (Injector injector : injectors)
|
||||||
|
|||||||
@@ -152,7 +152,7 @@ public class MenuEntrySwapperPlugin extends Plugin
|
|||||||
@Getter
|
@Getter
|
||||||
private boolean configuringShiftClick = false;
|
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();
|
private final ArrayListMultimap<String, Integer> optionIndexes = ArrayListMultimap.create();
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@@ -361,7 +361,7 @@ public class MenuEntrySwapperPlugin extends Plugin
|
|||||||
swap("eat", "guzzle", config::swapRockCake);
|
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);
|
swap(option, alwaysTrue(), swappedOption, enabled);
|
||||||
}
|
}
|
||||||
@@ -371,7 +371,7 @@ public class MenuEntrySwapperPlugin extends Plugin
|
|||||||
swap(option, equalTo(target), swappedOption, enabled);
|
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));
|
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.Node;
|
||||||
import net.runelite.api.Point;
|
import net.runelite.api.Point;
|
||||||
import net.runelite.api.WidgetNode;
|
import net.runelite.api.WidgetNode;
|
||||||
|
import net.runelite.api.events.WidgetHiddenChanged;
|
||||||
import net.runelite.api.events.WidgetPositioned;
|
import net.runelite.api.events.WidgetPositioned;
|
||||||
import net.runelite.api.mixins.Copy;
|
import net.runelite.api.mixins.Copy;
|
||||||
import net.runelite.api.mixins.FieldHook;
|
import net.runelite.api.mixins.FieldHook;
|
||||||
@@ -74,6 +75,48 @@ public abstract class RSWidgetMixin implements RSWidget
|
|||||||
rl$y = -1;
|
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
|
@Inject
|
||||||
@Override
|
@Override
|
||||||
public void setRenderParentId(int parentId)
|
public void setRenderParentId(int parentId)
|
||||||
|
|||||||
@@ -588,4 +588,6 @@ public interface RSWidget extends Widget
|
|||||||
@Import("onVarTransmit")
|
@Import("onVarTransmit")
|
||||||
@Override
|
@Override
|
||||||
void setOnVarTransmitListener(Object[] o);
|
void setOnVarTransmitListener(Object[] o);
|
||||||
|
|
||||||
|
void broadcastHidden(boolean hidden);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user