Merge branch 'master' of https://github.com/runelite-extended/runelite into pvpupdate

This commit is contained in:
James Munson
2019-04-20 15:42:39 -07:00
34 changed files with 4101 additions and 1068 deletions

View File

@@ -57,6 +57,10 @@ public enum InventoryID
* Chambers of Xeric chest inventory.
*/
CHAMBERS_OF_XERIC_CHEST(581),
/**
* Looting Bag inventory
*/
LOOTING_BAG(516),
/**
* Theater of Blood reward chest inventory (Raids 2)
*/
@@ -78,4 +82,4 @@ public enum InventoryID
{
return id;
}
}
}

View File

@@ -32,472 +32,471 @@ import lombok.Getter;
*/
@AllArgsConstructor
@Getter
public enum Varbits
{
/*
* If chatbox is transparent or not
*/
TRANSPARENT_CHATBOX(4608),
public enum Varbits {
/*
* If chatbox is transparent or not
*/
TRANSPARENT_CHATBOX(4608),
/*
* If the player has an active stamina potion effect or not
*/
RUN_SLOWED_DEPLETION_ACTIVE(25),
/*
* If the player has an active stamina potion effect or not
*/
RUN_SLOWED_DEPLETION_ACTIVE(25),
/**
* If scrollbar in resizable mode chat is on the left
*/
CHAT_SCROLLBAR_ON_LEFT(6374),
/**
* If scrollbar in resizable mode chat is on the left
*/
CHAT_SCROLLBAR_ON_LEFT(6374),
/**
* Runepouch
*/
RUNE_POUCH_RUNE1(29),
RUNE_POUCH_RUNE2(1622),
RUNE_POUCH_RUNE3(1623),
RUNE_POUCH_AMOUNT1(1624),
RUNE_POUCH_AMOUNT2(1625),
RUNE_POUCH_AMOUNT3(1626),
/**
* Runepouch
*/
RUNE_POUCH_RUNE1(29),
RUNE_POUCH_RUNE2(1622),
RUNE_POUCH_RUNE3(1623),
RUNE_POUCH_AMOUNT1(1624),
RUNE_POUCH_AMOUNT2(1625),
RUNE_POUCH_AMOUNT3(1626),
/**
* Prayers
*/
QUICK_PRAYER(4103),
PRAYER_THICK_SKIN(4104),
PRAYER_BURST_OF_STRENGTH(4105),
PRAYER_CLARITY_OF_THOUGHT(4106),
PRAYER_SHARP_EYE(4122),
PRAYER_MYSTIC_WILL(4123),
PRAYER_ROCK_SKIN(4107),
PRAYER_SUPERHUMAN_STRENGTH(4108),
PRAYER_IMPROVED_REFLEXES(4109),
PRAYER_RAPID_RESTORE(4110),
PRAYER_RAPID_HEAL(4111),
PRAYER_PROTECT_ITEM(4112),
PRAYER_HAWK_EYE(4124),
PRAYER_MYSTIC_LORE(4125),
PRAYER_STEEL_SKIN(4113),
PRAYER_ULTIMATE_STRENGTH(4114),
PRAYER_INCREDIBLE_REFLEXES(4115),
PRAYER_PROTECT_FROM_MAGIC(4116),
PRAYER_PROTECT_FROM_MISSILES(4117),
PRAYER_PROTECT_FROM_MELEE(4118),
PRAYER_EAGLE_EYE(4126),
PRAYER_MYSTIC_MIGHT(4127),
PRAYER_RETRIBUTION(4119),
PRAYER_REDEMPTION(4120),
PRAYER_SMITE(4121),
PRAYER_CHIVALRY(4128),
PRAYER_PIETY(4129),
PRAYER_PRESERVE(5466),
PRAYER_RIGOUR(5464),
PRAYER_AUGURY(5465),
/**
* Prayers
*/
QUICK_PRAYER(4103),
PRAYER_THICK_SKIN(4104),
PRAYER_BURST_OF_STRENGTH(4105),
PRAYER_CLARITY_OF_THOUGHT(4106),
PRAYER_SHARP_EYE(4122),
PRAYER_MYSTIC_WILL(4123),
PRAYER_ROCK_SKIN(4107),
PRAYER_SUPERHUMAN_STRENGTH(4108),
PRAYER_IMPROVED_REFLEXES(4109),
PRAYER_RAPID_RESTORE(4110),
PRAYER_RAPID_HEAL(4111),
PRAYER_PROTECT_ITEM(4112),
PRAYER_HAWK_EYE(4124),
PRAYER_MYSTIC_LORE(4125),
PRAYER_STEEL_SKIN(4113),
PRAYER_ULTIMATE_STRENGTH(4114),
PRAYER_INCREDIBLE_REFLEXES(4115),
PRAYER_PROTECT_FROM_MAGIC(4116),
PRAYER_PROTECT_FROM_MISSILES(4117),
PRAYER_PROTECT_FROM_MELEE(4118),
PRAYER_EAGLE_EYE(4126),
PRAYER_MYSTIC_MIGHT(4127),
PRAYER_RETRIBUTION(4119),
PRAYER_REDEMPTION(4120),
PRAYER_SMITE(4121),
PRAYER_CHIVALRY(4128),
PRAYER_PIETY(4129),
PRAYER_PRESERVE(5466),
PRAYER_RIGOUR(5464),
PRAYER_AUGURY(5465),
/**
* Diary Entries
*/
DIARY_ARDOUGNE_EASY(4458),
DIARY_ARDOUGNE_MEDIUM(4459),
DIARY_ARDOUGNE_HARD(4460),
DIARY_ARDOUGNE_ELITE(4461),
/**
* Diary Entries
*/
DIARY_ARDOUGNE_EASY(4458),
DIARY_ARDOUGNE_MEDIUM(4459),
DIARY_ARDOUGNE_HARD(4460),
DIARY_ARDOUGNE_ELITE(4461),
DIARY_DESERT_EASY(4483),
DIARY_DESERT_MEDIUM(4484),
DIARY_DESERT_HARD(4485),
DIARY_DESERT_ELITE(4486),
DIARY_DESERT_EASY(4483),
DIARY_DESERT_MEDIUM(4484),
DIARY_DESERT_HARD(4485),
DIARY_DESERT_ELITE(4486),
DIARY_FALADOR_EASY(4462),
DIARY_FALADOR_MEDIUM(4463),
DIARY_FALADOR_HARD(4464),
DIARY_FALADOR_ELITE(4465),
DIARY_FALADOR_EASY(4462),
DIARY_FALADOR_MEDIUM(4463),
DIARY_FALADOR_HARD(4464),
DIARY_FALADOR_ELITE(4465),
DIARY_FREMENNIK_EASY(4491),
DIARY_FREMENNIK_MEDIUM(4492),
DIARY_FREMENNIK_HARD(4493),
DIARY_FREMENNIK_ELITE(4494),
DIARY_FREMENNIK_EASY(4491),
DIARY_FREMENNIK_MEDIUM(4492),
DIARY_FREMENNIK_HARD(4493),
DIARY_FREMENNIK_ELITE(4494),
DIARY_KANDARIN_EASY(4475),
DIARY_KANDARIN_MEDIUM(4476),
DIARY_KANDARIN_HARD(4477),
DIARY_KANDARIN_ELITE(4478),
DIARY_KANDARIN_EASY(4475),
DIARY_KANDARIN_MEDIUM(4476),
DIARY_KANDARIN_HARD(4477),
DIARY_KANDARIN_ELITE(4478),
DIARY_KARAMJA_EASY(3578),
DIARY_KARAMJA_MEDIUM(3599),
DIARY_KARAMJA_HARD(3611),
DIARY_KARAMJA_ELITE(4566),
DIARY_KARAMJA_EASY(3578),
DIARY_KARAMJA_MEDIUM(3599),
DIARY_KARAMJA_HARD(3611),
DIARY_KARAMJA_ELITE(4566),
DIARY_LUMBRIDGE_EASY(4495),
DIARY_LUMBRIDGE_MEDIUM(4496),
DIARY_LUMBRIDGE_HARD(4497),
DIARY_LUMBRIDGE_ELITE(4498),
DIARY_LUMBRIDGE_EASY(4495),
DIARY_LUMBRIDGE_MEDIUM(4496),
DIARY_LUMBRIDGE_HARD(4497),
DIARY_LUMBRIDGE_ELITE(4498),
DIARY_MORYTANIA_EASY(4487),
DIARY_MORYTANIA_MEDIUM(4488),
DIARY_MORYTANIA_HARD(4489),
DIARY_MORYTANIA_ELITE(4490),
DIARY_MORYTANIA_EASY(4487),
DIARY_MORYTANIA_MEDIUM(4488),
DIARY_MORYTANIA_HARD(4489),
DIARY_MORYTANIA_ELITE(4490),
DIARY_VARROCK_EASY(4479),
DIARY_VARROCK_MEDIUM(4480),
DIARY_VARROCK_HARD(4481),
DIARY_VARROCK_ELITE(4482),
DIARY_VARROCK_EASY(4479),
DIARY_VARROCK_MEDIUM(4480),
DIARY_VARROCK_HARD(4481),
DIARY_VARROCK_ELITE(4482),
DIARY_WESTERN_EASY(4471),
DIARY_WESTERN_MEDIUM(4472),
DIARY_WESTERN_HARD(4473),
DIARY_WESTERN_ELITE(4474),
DIARY_WESTERN_EASY(4471),
DIARY_WESTERN_MEDIUM(4472),
DIARY_WESTERN_HARD(4473),
DIARY_WESTERN_ELITE(4474),
DIARY_WILDERNESS_EASY(4466),
DIARY_WILDERNESS_MEDIUM(4467),
DIARY_WILDERNESS_HARD(4468),
DIARY_WILDERNESS_ELITE(4469),
DIARY_WILDERNESS_EASY(4466),
DIARY_WILDERNESS_MEDIUM(4467),
DIARY_WILDERNESS_HARD(4468),
DIARY_WILDERNESS_ELITE(4469),
/**
* Kourend house favours
*/
KOUREND_FAVOR_ARCEUUS(4896),
KOUREND_FAVOR_HOSIDIUS(4895),
KOUREND_FAVOR_LOVAKENGJ(4898),
KOUREND_FAVOR_PISCARILIUS(4899),
KOUREND_FAVOR_SHAYZIEN(4894),
/**
* Kourend house favours
*/
KOUREND_FAVOR_ARCEUUS(4896),
KOUREND_FAVOR_HOSIDIUS(4895),
KOUREND_FAVOR_LOVAKENGJ(4898),
KOUREND_FAVOR_PISCARILIUS(4899),
KOUREND_FAVOR_SHAYZIEN(4894),
/**
* Equipped weapon type
*/
EQUIPPED_WEAPON_TYPE(357),
/**
* Equipped weapon type
*/
EQUIPPED_WEAPON_TYPE(357),
/**
* Defensive casting mode
*/
DEFENSIVE_CASTING_MODE(2668),
/**
* Defensive casting mode
*/
DEFENSIVE_CASTING_MODE(2668),
/**
* Options
*/
SIDE_PANELS(4607),
/**
* Options
*/
SIDE_PANELS(4607),
/**
* Herbiboar Trails
*/
HB_TRAIL_31303(5737),
HB_TRAIL_31306(5738),
HB_TRAIL_31309(5739),
HB_TRAIL_31312(5740),
HB_TRAIL_31315(5741),
HB_TRAIL_31318(5742),
HB_TRAIL_31321(5743),
HB_TRAIL_31324(5744),
HB_TRAIL_31327(5745),
HB_TRAIL_31330(5746),
/**
* Herbiboar Trails
*/
HB_TRAIL_31303(5737),
HB_TRAIL_31306(5738),
HB_TRAIL_31309(5739),
HB_TRAIL_31312(5740),
HB_TRAIL_31315(5741),
HB_TRAIL_31318(5742),
HB_TRAIL_31321(5743),
HB_TRAIL_31324(5744),
HB_TRAIL_31327(5745),
HB_TRAIL_31330(5746),
HB_TRAIL_31333(5768),
HB_TRAIL_31336(5769),
HB_TRAIL_31339(5770),
HB_TRAIL_31342(5771),
HB_TRAIL_31345(5772),
HB_TRAIL_31348(5773),
HB_TRAIL_31351(5774),
HB_TRAIL_31354(5775),
HB_TRAIL_31357(5776),
HB_TRAIL_31360(5777),
HB_TRAIL_31333(5768),
HB_TRAIL_31336(5769),
HB_TRAIL_31339(5770),
HB_TRAIL_31342(5771),
HB_TRAIL_31345(5772),
HB_TRAIL_31348(5773),
HB_TRAIL_31351(5774),
HB_TRAIL_31354(5775),
HB_TRAIL_31357(5776),
HB_TRAIL_31360(5777),
HB_TRAIL_31363(5747),
HB_TRAIL_31366(5748),
HB_TRAIL_31369(5749),
HB_TRAIL_31372(5750),
HB_TRAIL_31363(5747),
HB_TRAIL_31366(5748),
HB_TRAIL_31369(5749),
HB_TRAIL_31372(5750),
HB_FINISH(5766),
HB_STARTED(5767), //not working
HB_FINISH(5766),
HB_STARTED(5767), //not working
/**
* Barbarian Assault
*/
IN_GAME_BA(3923),
/**
* Barbarian Assault
*/
IN_GAME_BA(3923),
/**
* 0 = Outside wilderness
* 1 = In wilderness
*/
IN_WILDERNESS(5963),
/**
* 0 = Outside wilderness
* 1 = In wilderness
*/
IN_WILDERNESS(5963),
/**
* Fishing Trawler
* FISHING_TRAWLER_ACTIVITY Expected values: 0-255
*/
FISHING_TRAWLER_ACTIVITY(3377),
/**
* Fishing Trawler
* FISHING_TRAWLER_ACTIVITY Expected values: 0-255
*/
FISHING_TRAWLER_ACTIVITY(3377),
/**
* Blast Furnace Bar Dispenser
*
* These are the expected values:
* 0 = No bars being processed
* 1 = Ores are being processed on the conveyor belt, bar dispenser cannot be checked
* 2 = Bars are cooling down
* 3 = Bars can be collected
*/
BAR_DISPENSER(936),
/**
* Blast Furnace Bar Dispenser
* <p>
* These are the expected values:
* 0 = No bars being processed
* 1 = Ores are being processed on the conveyor belt, bar dispenser cannot be checked
* 2 = Bars are cooling down
* 3 = Bars can be collected
*/
BAR_DISPENSER(936),
/**
* Motherlode mine sack
*/
SACK_NUMBER(5558),
SACK_UPGRADED(5556),
/**
* Motherlode mine sack
*/
SACK_NUMBER(5558),
SACK_UPGRADED(5556),
/**
* Experience tracker
*
* EXPERIENCE_TRACKER_POSITION expected values:
* 0 = Right
* 1 = Middle
* 2 = Left
*/
EXPERIENCE_TRACKER_POSITION(4692),
EXPERIENCE_TRACKER_COUNTER(4697),
EXPERIENCE_TRACKER_PROGRESS_BAR(4698),
/**
* Experience tracker
* <p>
* EXPERIENCE_TRACKER_POSITION expected values:
* 0 = Right
* 1 = Middle
* 2 = Left
*/
EXPERIENCE_TRACKER_POSITION(4692),
EXPERIENCE_TRACKER_COUNTER(4697),
EXPERIENCE_TRACKER_PROGRESS_BAR(4698),
/**
* Experience drop color
*/
EXPERIENCE_DROP_COLOR(4695),
/**
* Experience drop color
*/
EXPERIENCE_DROP_COLOR(4695),
/**
* Tithe Farm
*/
TITHE_FARM_SACK_AMOUNT(4900),
TITHE_FARM_SACK_ICON(5370),
TITHE_FARM_POINTS(4893),
/**
* Blast Mine
*/
BLAST_MINE_COAL(4924),
BLAST_MINE_GOLD(4925),
BLAST_MINE_MITHRIL(4926),
BLAST_MINE_ADAMANTITE(4921),
BLAST_MINE_RUNITE(4922),
/**
* Tithe Farm
*/
TITHE_FARM_SACK_AMOUNT(4900),
TITHE_FARM_SACK_ICON(5370),
TITHE_FARM_POINTS(4893),
/**
* Raids
*/
IN_RAID(5432),
TOTAL_POINTS(5431),
PERSONAL_POINTS(5422),
RAID_PARTY_SIZE(5424),
/**
* Blast Mine
*/
BLAST_MINE_COAL(4924),
BLAST_MINE_GOLD(4925),
BLAST_MINE_MITHRIL(4926),
BLAST_MINE_ADAMANTITE(4921),
BLAST_MINE_RUNITE(4922),
/**
* Theatre of Blood 1=In Party, 2=Inside/Spectator, 3=Dead Spectating
*/
THEATRE_OF_BLOOD(6440),
/**
* Raids
*/
IN_RAID(5432),
TOTAL_POINTS(5431),
PERSONAL_POINTS(5422),
RAID_PARTY_SIZE(5424),
/**
* Nightmare Zone
*/
NMZ_ABSORPTION(3956),
NMZ_POINTS(3949),
/**
* Theatre of Blood 1=In Party, 2=Inside/Spectator, 3=Dead Spectating
*/
THEATRE_OF_BLOOD(6440),
/**
* Blast Furnace
*/
BLAST_FURNACE_COPPER_ORE(959),
BLAST_FURNACE_TIN_ORE(950),
BLAST_FURNACE_IRON_ORE(951),
BLAST_FURNACE_COAL(949),
BLAST_FURNACE_MITHRIL_ORE(952),
BLAST_FURNACE_ADAMANTITE_ORE(953),
BLAST_FURNACE_RUNITE_ORE(954),
BLAST_FURNACE_SILVER_ORE(956),
BLAST_FURNACE_GOLD_ORE(955),
/**
* Nightmare Zone
*/
NMZ_ABSORPTION(3956),
NMZ_POINTS(3949),
BLAST_FURNACE_BRONZE_BAR(941),
BLAST_FURNACE_IRON_BAR(942),
BLAST_FURNACE_STEEL_BAR(943),
BLAST_FURNACE_MITHRIL_BAR(944),
BLAST_FURNACE_ADAMANTITE_BAR(945),
BLAST_FURNACE_RUNITE_BAR(946),
BLAST_FURNACE_SILVER_BAR(948),
BLAST_FURNACE_GOLD_BAR(947),
/**
* Blast Furnace
*/
BLAST_FURNACE_COPPER_ORE(959),
BLAST_FURNACE_TIN_ORE(950),
BLAST_FURNACE_IRON_ORE(951),
BLAST_FURNACE_COAL(949),
BLAST_FURNACE_MITHRIL_ORE(952),
BLAST_FURNACE_ADAMANTITE_ORE(953),
BLAST_FURNACE_RUNITE_ORE(954),
BLAST_FURNACE_SILVER_ORE(956),
BLAST_FURNACE_GOLD_ORE(955),
BLAST_FURNACE_COFFER(5357),
BLAST_FURNACE_BRONZE_BAR(941),
BLAST_FURNACE_IRON_BAR(942),
BLAST_FURNACE_STEEL_BAR(943),
BLAST_FURNACE_MITHRIL_BAR(944),
BLAST_FURNACE_ADAMANTITE_BAR(945),
BLAST_FURNACE_RUNITE_BAR(946),
BLAST_FURNACE_SILVER_BAR(948),
BLAST_FURNACE_GOLD_BAR(947),
/**
* Pyramid plunder
*/
PYRAMID_PLUNDER_TIMER(2375),
PYRAMID_PLUNDER_ROOM(2377),
BLAST_FURNACE_COFFER(5357),
/**
* Barrows
*/
BARROWS_KILLED_AHRIM(457),
BARROWS_KILLED_DHAROK(458),
BARROWS_KILLED_GUTHAN(459),
BARROWS_KILLED_KARIL(460),
BARROWS_KILLED_TORAG(461),
BARROWS_KILLED_VERAC(462),
BARROWS_REWARD_POTENTIAL(463),
BARROWS_NPCS_SLAIN(464),
/**
* Pyramid plunder
*/
PYRAMID_PLUNDER_TIMER(2375),
PYRAMID_PLUNDER_ROOM(2377),
/**
* Spicy stew ingredients
*/
SPICY_STEW_RED_SPICES(1879),
SPICY_STEW_YELLOW_SPICES(1880),
SPICY_STEW_BROWN_SPICES(1881),
SPICY_STEW_ORANGE_SPICES(1882),
/**
* Barrows
*/
BARROWS_KILLED_AHRIM(457),
BARROWS_KILLED_DHAROK(458),
BARROWS_KILLED_GUTHAN(459),
BARROWS_KILLED_KARIL(460),
BARROWS_KILLED_TORAG(461),
BARROWS_KILLED_VERAC(462),
BARROWS_REWARD_POTENTIAL(463),
BARROWS_NPCS_SLAIN(464),
/**
* Multicombat area
*/
MULTICOMBAT_AREA(4605),
/**
* Spicy stew ingredients
*/
SPICY_STEW_RED_SPICES(1879),
SPICY_STEW_YELLOW_SPICES(1880),
SPICY_STEW_BROWN_SPICES(1881),
SPICY_STEW_ORANGE_SPICES(1882),
/**
* In the Wilderness
*/
IN_THE_WILDERNESS(5963),
/**
* Multicombat area
*/
MULTICOMBAT_AREA(4605),
/**
* Kingdom Management
*/
KINGDOM_FAVOR(72),
KINGDOM_COFFER(74),
/**
* In the Wilderness
*/
IN_THE_WILDERNESS(5963),
/**
* The Hand in the Sand quest status
*/
QUEST_THE_HAND_IN_THE_SAND(1527),
/**
* Kingdom Management
*/
KINGDOM_FAVOR(72),
KINGDOM_COFFER(74),
/**
* Daily Tasks (Collection availability)
*/
DAILY_HERB_BOXES_COLLECTED(3961),
DAILY_STAVES_COLLECTED(4539),
DAILY_ESSENCE_COLLECTED(4547),
DAILY_RUNES_COLLECTED(4540),
DAILY_SAND_COLLECTED(4549),
DAILY_FLAX_STATE(4559),
/**
* This varbit tracks how much bonemeal has been redeemed from Robin
* The player gets 13 for each diary completed above and including Medium, for a maxiumum of 39
*/
DAILY_BONEMEAL_STATE(4543),
/**
* The Hand in the Sand quest status
*/
QUEST_THE_HAND_IN_THE_SAND(1527),
/**
* Fairy Ring
*/
FAIR_RING_LAST_DESTINATION(5374),
FAIRY_RING_DIAL_ADCB(3985), //Left dial
FAIRY_RIGH_DIAL_ILJK(3986), //Middle dial
FAIRY_RING_DIAL_PSRQ(3987), //Right dial
/**
* Daily Tasks (Collection availability)
*/
DAILY_HERB_BOXES_COLLECTED(3961),
DAILY_STAVES_COLLECTED(4539),
DAILY_ESSENCE_COLLECTED(4547),
DAILY_RUNES_COLLECTED(4540),
DAILY_SAND_COLLECTED(4549),
DAILY_FLAX_STATE(4559),
/**
* This varbit tracks how much bonemeal has been redeemed from Robin
* The player gets 13 for each diary completed above and including Medium, for a maxiumum of 39
*/
DAILY_BONEMEAL_STATE(4543),
/**
* Transmog controllers for farming
*/
FARMING_4771(4771),
FARMING_4772(4772),
FARMING_4773(4773),
FARMING_4774(4774),
FARMING_4775(4775),
FARMING_7904(7904),
FARMING_7905(7905),
FARMING_7906(7906),
FARMING_7907(7907),
FARMING_7908(7908),
FARMING_7909(7909),
FARMING_7910(7910),
FARMING_7911(7911),
/**
* Fairy Ring
*/
FAIR_RING_LAST_DESTINATION(5374),
FAIRY_RING_DIAL_ADCB(3985), //Left dial
FAIRY_RIGH_DIAL_ILJK(3986), //Middle dial
FAIRY_RING_DIAL_PSRQ(3987), //Right dial
/**
* Transmog controllers for grapes
*/
GRAPES_4953(4953),
GRAPES_4954(4954),
GRAPES_4955(4955),
GRAPES_4956(4956),
GRAPES_4957(4957),
GRAPES_4958(4958),
GRAPES_4959(4959),
GRAPES_4960(4960),
GRAPES_4961(4961),
GRAPES_4962(4962),
GRAPES_4963(4963),
GRAPES_4964(4964),
/**
* Transmog controllers for farming
*/
FARMING_4771(4771),
FARMING_4772(4772),
FARMING_4773(4773),
FARMING_4774(4774),
FARMING_4775(4775),
FARMING_7904(7904),
FARMING_7905(7905),
FARMING_7906(7906),
FARMING_7907(7907),
FARMING_7908(7908),
FARMING_7909(7909),
FARMING_7910(7910),
FARMING_7911(7911),
/**
* Automatically weed farming patches
*/
AUTOWEED(5557),
/**
* Transmog controllers for grapes
*/
GRAPES_4953(4953),
GRAPES_4954(4954),
GRAPES_4955(4955),
GRAPES_4956(4956),
GRAPES_4957(4957),
GRAPES_4958(4958),
GRAPES_4959(4959),
GRAPES_4960(4960),
GRAPES_4961(4961),
GRAPES_4962(4962),
GRAPES_4963(4963),
GRAPES_4964(4964),
/**
* The varbit that stores the players {@code AccountType}.
*/
ACCOUNT_TYPE(1777),
/**
* Automatically weed farming patches
*/
AUTOWEED(5557),
/**
* The varbit that stores the oxygen percentage for player
*/
OXYGEN_LEVEL(5811),
/**
* Corp beast damage
*/
CORP_DAMAGE(999),
/**
* The varbit that stores the players {@code AccountType}.
*/
ACCOUNT_TYPE(1777),
/**
* Toggleable slayer unlocks
*/
SUPERIOR_ENABLED(5362),
FOSSIL_ISLAND_WYVERN_DISABLE(6251),
/**
* The varbit that stores the oxygen percentage for player
*/
OXYGEN_LEVEL(5811),
CURRENT_BANK_TAB(4150),
/**
* Corp beast damage
*/
CORP_DAMAGE(999),
WORLDHOPPER_FAVROITE_1(4597),
WORLDHOPPER_FAVROITE_2(4598),
/**
* Toggleable slayer unlocks
*/
SUPERIOR_ENABLED(5362),
FOSSIL_ISLAND_WYVERN_DISABLE(6251),
/**
* Vengeance is active
*/
VENGEANCE_ACTIVE(2450),
CURRENT_BANK_TAB(4150),
/**
* Spell cooldowns
*/
VENGEANCE_COOLDOWN(2451),
WORLDHOPPER_FAVROITE_1(4597),
WORLDHOPPER_FAVROITE_2(4598),
/**
* Amount of items in each bank tab
*/
BANK_TAB_ONE_COUNT(4171),
BANK_TAB_TWO_COUNT(4172),
BANK_TAB_THREE_COUNT(4173),
BANK_TAB_FOUR_COUNT(4174),
BANK_TAB_FIVE_COUNT(4175),
BANK_TAB_SIX_COUNT(4176),
BANK_TAB_SEVEN_COUNT(4177),
BANK_TAB_EIGHT_COUNT(4178),
BANK_TAB_NINE_COUNT(4179),
/**
* Vengeance is active
*/
VENGEANCE_ACTIVE(2450),
/**
* Type of GE offer currently being created
* 0 = buy
* 1 = sell
*/
GE_OFFER_CREATION_TYPE(4397),
/**
* Spell cooldowns
*/
VENGEANCE_COOLDOWN(2451),
/**
* The active tab within the quest interface
*/
QUEST_TAB(8168),
/**
* Temple Trekking
*/
TREK_POINTS(1955),
TREK_STARTED(1956),
TREK_EVENT(1958),
TREK_STATUS(6719);
/**
* Amount of items in each bank tab
*/
BANK_TAB_ONE_COUNT(4171),
BANK_TAB_TWO_COUNT(4172),
BANK_TAB_THREE_COUNT(4173),
BANK_TAB_FOUR_COUNT(4174),
BANK_TAB_FIVE_COUNT(4175),
BANK_TAB_SIX_COUNT(4176),
BANK_TAB_SEVEN_COUNT(4177),
BANK_TAB_EIGHT_COUNT(4178),
BANK_TAB_NINE_COUNT(4179),
/**
* Type of GE offer currently being created
* 0 = buy
* 1 = sell
*/
GE_OFFER_CREATION_TYPE(4397),
/**
* The raw varbit ID.
*/
private final int id;
/**
* The active tab within the quest interface
*/
QUEST_TAB(8168),
/**
* Temple Trekking
*/
TREK_POINTS(1955),
TREK_STARTED(1956),
TREK_EVENT(1958),
TREK_STATUS(6719),
BLOAT_ENTERED_ROOM(6447);
/**
* The raw varbit ID.
*/
private final int id;
}

View File

@@ -44,7 +44,6 @@ public class EquipmentInspectorPanel extends PluginPanel
c.weightx = 1;
c.gridx = 0;
c.gridy = 0;
header = new JPanel();
header.setLayout(new BorderLayout());
header.setBorder(new CompoundBorder(
@@ -53,9 +52,7 @@ public class EquipmentInspectorPanel extends PluginPanel
nameLabel = new JLabel(NO_PLAYER_SELECTED);
nameLabel.setForeground(Color.WHITE);
header.add(nameLabel, BorderLayout.CENTER);
layout.setHorizontalGroup(layout.createParallelGroup()
.addComponent(equipmentPanels)
.addComponent(header)
@@ -65,7 +62,6 @@ public class EquipmentInspectorPanel extends PluginPanel
.addGap(10)
.addComponent(equipmentPanels)
);
update(new HashMap<>(), "");
}
@@ -79,7 +75,6 @@ public class EquipmentInspectorPanel extends PluginPanel
{
nameLabel.setText("Player: " + playerName);
}
SwingUtilities.invokeLater(() ->
{
equipmentPanels.removeAll();

View File

@@ -3,7 +3,10 @@ package net.runelite.client.plugins.equipmentinspector;
import com.google.inject.Provides;
import lombok.extern.slf4j.Slf4j;
import net.runelite.api.*;
import net.runelite.api.ChatMessageType;
import net.runelite.api.Client;
import net.runelite.api.ItemComposition;
import net.runelite.api.Player;
import net.runelite.api.events.PlayerMenuOptionClicked;
import net.runelite.api.kit.KitType;
import net.runelite.client.chat.ChatColorType;
@@ -18,11 +21,10 @@ import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.ui.ClientToolbar;
import net.runelite.client.ui.NavigationButton;
import net.runelite.client.util.ImageUtil;
import net.runelite.client.util.Text;
import net.runelite.http.api.item.ItemPrice;
import javax.annotation.Nullable;
import javax.imageio.ImageIO;
import javax.inject.Inject;
import javax.swing.*;
import java.awt.image.BufferedImage;
@@ -32,211 +34,195 @@ import java.util.*;
import java.util.concurrent.ScheduledExecutorService;
@PluginDescriptor(
name = "Equipment Inspector",
description = "Inspects enemy equipment",
enabledByDefault = false,
type = "utility"
name = "Equipment Inspector",
enabledByDefault = false,
type = "utility"
)
@Slf4j
public class EquipmentInspectorPlugin extends Plugin {
private static final String INSPECT_EQUIPMENT = "Gear";
private static final String KICK_OPTION = "Kick";
private static final String INSPECT_EQUIPMENT = "Gear";
private static final String KICK_OPTION = "Kick";
@Inject
@Nullable
private Client client;
@Inject
@Nullable
private Client client;
@Inject
private ItemManager itemManager;
@Inject
private ItemManager itemManager;
@Inject
private EquipmentInspectorConfig config;
@Inject
private EquipmentInspectorConfig config;
@Inject
private ChatMessageManager chatMessageManager;
@Inject
private MenuManager menuManager;
@Inject
private ChatMessageManager chatMessageManager;
@Inject
private MenuManager menuManager;
@Inject
private ScheduledExecutorService executor;
@Inject
private ScheduledExecutorService executor;
@Inject
private ClientToolbar pluginToolbar;
@Inject
private ClientToolbar pluginToolbar;
private NavigationButton navButton;
private EquipmentInspectorPanel equipmentInspectorPanel;
private int TotalPrice = 0;
private int Prot1 = 0;
private int Prot2 = 0;
private int Prot3 = 0;
private int Prot4 = 0;
@Provides
EquipmentInspectorConfig provideConfig(ConfigManager configManager)
{
return configManager.getConfig(EquipmentInspectorConfig.class);
}
@Provides
EquipmentInspectorConfig provideConfig(ConfigManager configManager) {
return configManager.getConfig(EquipmentInspectorConfig.class);
}
private NavigationButton navButton;
private EquipmentInspectorPanel equipmentInspectorPanel;
private int TotalPrice = 0;
private int Prot1 = 0;
private int Prot2 = 0;
private int Prot3 = 0;
private int Prot4 = 0;
@Override
protected void startUp() throws Exception {
equipmentInspectorPanel = injector.getInstance(EquipmentInspectorPanel.class);
if (client != null) {
menuManager.addPlayerMenuItem(INSPECT_EQUIPMENT);
}
//synchronized (ImageIO.class)
//{
final BufferedImage icon = ImageUtil.getResourceStreamFromClass(this.getClass(), "normal.png");
//}
navButton = NavigationButton.builder()
.tooltip("Equipment Inspector")
.icon(icon)
.priority(5)
.panel(equipmentInspectorPanel)
.build();
@Override
protected void startUp() throws Exception
{
pluginToolbar.addNavigation(navButton);
equipmentInspectorPanel = injector.getInstance(EquipmentInspectorPanel.class);
if(client != null) {
menuManager.addPlayerMenuItem(INSPECT_EQUIPMENT);
}
}
BufferedImage icon;
synchronized (ImageIO.class)
{
icon = ImageIO.read(getClass().getResourceAsStream("normal.png"));
}
@Override
protected void shutDown() throws Exception {
navButton = NavigationButton.builder()
.tooltip("Equipment Inspector")
.icon(icon)
.priority(5)
.panel(equipmentInspectorPanel)
.build();
menuManager.removePlayerMenuItem(INSPECT_EQUIPMENT);
}
@Subscribe
public void onPlayerMenuOptionClicked(PlayerMenuOptionClicked event) {
if (event.getMenuOption().equals(INSPECT_EQUIPMENT)) {
pluginToolbar.addNavigation(navButton);
executor.execute(() ->
{
try {
SwingUtilities.invokeAndWait(() ->
{
if (!navButton.isSelected()) {
navButton.getOnSelect().run();
}
});
} catch (InterruptedException | InvocationTargetException e) {
}
throw new RuntimeException(e);
@Override
protected void shutDown() throws Exception
{
}
String playerName = Text.removeTags(event.getMenuTarget());
// The player menu uses a non-breaking space in the player name, we need to replace this to compare
// against the playerName in the player cache.
String finalPlayerName = playerName.replace('\u00A0', ' ');
System.out.println(finalPlayerName);
List<Player> players = client.getPlayers();
Optional<Player> targetPlayer = players.stream()
.filter(Objects::nonNull)
.filter(p -> p.getName().equals(finalPlayerName)).findFirst();
menuManager.removePlayerMenuItem(INSPECT_EQUIPMENT);
}
if (targetPlayer.isPresent()) {
TotalPrice = 0;
Prot1 = 0;
Prot2 = 0;
Prot3 = 0;
Prot4 = 0;
Player p = targetPlayer.get();
Map<KitType, ItemComposition> playerEquipment = new HashMap<>();
@Subscribe
public void onPlayerMenuOptionClicked(PlayerMenuOptionClicked event)
{
if (event.getMenuOption().equals(INSPECT_EQUIPMENT))
{
for (KitType kitType : KitType.values()) {
int itemId = p.getPlayerComposition().getEquipmentId(kitType);
if (itemId != -1) {
ItemComposition itemComposition = client.getItemDefinition(itemId);
playerEquipment.put(kitType, itemComposition);
int ItemPrice = itemManager.getItemPrice(itemId);
TotalPrice += ItemPrice;
if (ItemPrice > Prot1) {
Prot4 = Prot3;
Prot3 = Prot2;
Prot2 = Prot1;
Prot1 = ItemPrice;
} else if (ItemPrice > Prot2) {
Prot4 = Prot3;
Prot3 = Prot2;
Prot2 = ItemPrice;
} else if (ItemPrice > Prot3) {
Prot4 = Prot3;
Prot3 = ItemPrice;
} else if (ItemPrice > Prot4) {
Prot4 = ItemPrice;
}
}
}
int IgnoredItems = config.protecteditems();
if (IgnoredItems != 0 && IgnoredItems != 1 && IgnoredItems != 2 && IgnoredItems != 3) {
IgnoredItems = 4;
executor.execute(() ->
{
try
{
SwingUtilities.invokeAndWait(() ->
{
if (!navButton.isSelected())
{
navButton.getOnSelect().run();
}
});
}
catch (InterruptedException | InvocationTargetException e)
{
}
if (config.ShowValue()) {
switch (IgnoredItems) {
case 1:
TotalPrice = TotalPrice - Prot1;
break;
case 2:
TotalPrice = TotalPrice - Prot1;
TotalPrice = TotalPrice - Prot2;
throw new RuntimeException(e);
break;
case 3:
TotalPrice = TotalPrice - Prot1;
TotalPrice = TotalPrice - Prot2;
TotalPrice = TotalPrice - Prot3;
break;
case 4:
TotalPrice = TotalPrice - Prot1;
TotalPrice = TotalPrice - Prot2;
TotalPrice = TotalPrice - Prot3;
TotalPrice = TotalPrice - Prot4;
break;
}
String StringPrice = "";
if (!config.ExactValue()) {
TotalPrice = TotalPrice / 1000;
StringPrice = NumberFormat.getIntegerInstance().format(TotalPrice);
StringPrice = StringPrice + 'K';
}
if (config.ExactValue()) {
StringPrice = NumberFormat.getIntegerInstance().format(TotalPrice);
}
chatMessageManager.queue(QueuedMessage.builder()
.type(ChatMessageType.FRIENDSCHATNOTIFICATION)
.runeLiteFormattedMessage(new ChatMessageBuilder()
.append(ChatColorType.HIGHLIGHT)
.append("Risked Value: ")
.append(ChatColorType.NORMAL)
.append(StringPrice)
.build())
.build());
}
equipmentInspectorPanel.update(playerEquipment, playerName);
}
String playerName = Text.removeTags(event.getMenuTarget());
// The player menu uses a non-breaking space in the player name, we need to replace this to compare
// against the playerName in the player cache.
String finalPlayerName = playerName.replace('\u00A0', ' ');
System.out.println(finalPlayerName);
List<Player> players = client.getPlayers();
Optional<Player> targetPlayer = players.stream()
.filter(Objects::nonNull)
.filter(p -> p.getName().equals(finalPlayerName)).findFirst();
if (targetPlayer.isPresent())
{
TotalPrice = 0;
Prot1 = 0;
Prot2 = 0;
Prot3 = 0;
Prot4 = 0;
Player p = targetPlayer.get();
Map<KitType, ItemComposition> playerEquipment = new HashMap<>();
for (KitType kitType : KitType.values())
{
int itemId = p.getPlayerComposition().getEquipmentId(kitType);
if (itemId != -1)
{
ItemComposition itemComposition = client.getItemDefinition(itemId);
playerEquipment.put(kitType, itemComposition);
int ItemPrice = itemManager.getItemPrice(itemId);
TotalPrice += ItemPrice;
if (ItemPrice > Prot1 ) {
Prot4 = Prot3;
Prot3 = Prot2;
Prot2 = Prot1;
Prot1 = ItemPrice;
} else if (ItemPrice > Prot2){
Prot4 = Prot3;
Prot3 = Prot2;
Prot2 = ItemPrice;
} else if (ItemPrice > Prot3){
Prot4 = Prot3;
Prot3 = ItemPrice;
} else if (ItemPrice > Prot4){
Prot4 = ItemPrice;
}
}
}
int IgnoredItems = config.protecteditems();
if (IgnoredItems != 0 && IgnoredItems != 1 && IgnoredItems != 2 && IgnoredItems != 3) {
IgnoredItems = 4;
}
if (config.ShowValue()) {
switch (IgnoredItems) {
case 1:
TotalPrice = TotalPrice - Prot1;
break;
case 2:
TotalPrice = TotalPrice - Prot1;
TotalPrice = TotalPrice - Prot2;
break;
case 3:
TotalPrice = TotalPrice - Prot1;
TotalPrice = TotalPrice - Prot2;
TotalPrice = TotalPrice - Prot3;
break;
case 4:
TotalPrice = TotalPrice - Prot1;
TotalPrice = TotalPrice - Prot2;
TotalPrice = TotalPrice - Prot3;
TotalPrice = TotalPrice - Prot4;
break;
}
String StringPrice = "";
if (!config.ExactValue()) {
TotalPrice = TotalPrice / 1000;
StringPrice = NumberFormat.getIntegerInstance().format(TotalPrice);
StringPrice = StringPrice + 'K';
}
if (config.ExactValue()) {
StringPrice = NumberFormat.getIntegerInstance().format(TotalPrice);
}
chatMessageManager.queue(QueuedMessage.builder()
.type(ChatMessageType.FRIENDSCHATNOTIFICATION)
.runeLiteFormattedMessage(new ChatMessageBuilder()
.append(ChatColorType.HIGHLIGHT)
.append("Risked Value: ")
.append(ChatColorType.NORMAL)
.append(StringPrice)
.build())
.build());
}
equipmentInspectorPanel.update(playerEquipment, playerName);
}
});
}
}
}
}
});
}
}
}

View File

@@ -15,7 +15,8 @@ class ItemPanel extends JPanel
ItemPanel(ItemComposition item, KitType kitType, AsyncBufferedImage icon)
{
setBorder(new EmptyBorder(3, 3, 3, 3));
setBorder(new EmptyBorder(3, 3, 3, 3));
setBackground(ColorScheme.DARK_GRAY_COLOR);
GroupLayout layout = new GroupLayout(this);

View File

@@ -16,6 +16,7 @@ import net.runelite.client.plugins.PluginDescriptor;
name = "fKeyRemapping",
description = "Used for interface hotkeys",
tags = {"hotkey", "remapping"},
type = "utility",
enabledByDefault = true
)
public class fKeyRemappingPlugin extends Plugin

View File

@@ -0,0 +1,123 @@
/*
* Copyright (c) 2018 AWPH-I
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.lootingbagviewer;
import net.runelite.api.Client;
import net.runelite.api.InventoryID;
import net.runelite.api.Item;
import net.runelite.api.ItemContainer;
import net.runelite.client.game.ItemManager;
import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayPosition;
import net.runelite.client.ui.overlay.components.ImageComponent;
import net.runelite.client.ui.overlay.components.PanelComponent;
import javax.inject.Inject;
import java.awt.*;
import java.awt.image.BufferedImage;
class LootingBagViewerOverlay extends Overlay
{
private static final int INVENTORY_SIZE = 28;
private static final int PLACEHOLDER_WIDTH = 36;
private static final int PLACEHOLDER_HEIGHT = 32;
private static final ImageComponent PLACEHOLDER_IMAGE = new ImageComponent(new BufferedImage(PLACEHOLDER_WIDTH, PLACEHOLDER_HEIGHT, BufferedImage.TYPE_4BYTE_ABGR));
private final Client client;
private final ItemManager itemManager;
private final PanelComponent panelComponent = new PanelComponent();
private ItemContainer itemContainer;
private Item[] items;
@Inject
private LootingBagViewerOverlay(Client client, ItemManager itemManager)
{
setPosition(OverlayPosition.BOTTOM_RIGHT);
panelComponent.setWrapping(4);
panelComponent.setGap(new Point(6, 4));
panelComponent.setOrientation(PanelComponent.Orientation.HORIZONTAL);
this.itemManager = itemManager;
this.client = client;
}
@Override
public Dimension render(Graphics2D graphics)
{
if (itemContainer == null)
{
if(client.getItemContainer(InventoryID.LOOTING_BAG) != null) {
itemContainer = client.getItemContainer(InventoryID.LOOTING_BAG);
items = itemContainer.getItems();
}
return null;
}
else if(itemContainer != null && client.getItemContainer(InventoryID.LOOTING_BAG) != null)
{
itemContainer = client.getItemContainer(InventoryID.LOOTING_BAG);
Item[] tempItems = itemContainer.getItems();
for(int i = 0; i < items.length; i++)
{
if(!items[i].equals(tempItems[i]))
{
items = tempItems;
}
}
}
panelComponent.getChildren().clear();
for (int i = 0; i < INVENTORY_SIZE; i++)
{
if (i < items.length)
{
final Item item = items[i];
if (item.getQuantity() > 0)
{
final BufferedImage image = getImage(item);
if (image != null)
{
panelComponent.getChildren().add(new ImageComponent(image));
continue;
}
}
}
// put a placeholder image so each item is aligned properly and the panel is not resized
panelComponent.getChildren().add(PLACEHOLDER_IMAGE);
}
return panelComponent.render(graphics);
}
private BufferedImage getImage(Item item)
{
return itemManager.getImage(item.getId(), item.getQuantity(), item.getQuantity() > 1);
}
}

View File

@@ -0,0 +1,60 @@
/*
* Copyright (c) 2018 AWPH-I
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.lootingbagviewer;
import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.ui.overlay.OverlayManager;
import javax.inject.Inject;
@PluginDescriptor(
name = "PvP Looting Bag Viewer",
description = "Add an overlay showing the contents of your looting bag",
tags = {"alternate", "items", "overlay", "second"},
type = "utility",
enabledByDefault = false
)
public class LootingBagViewerPlugin extends Plugin
{
@Inject
private net.runelite.client.plugins.lootingbagviewer.LootingBagViewerOverlay overlay;
@Inject
private OverlayManager overlayManager;
@Override
public void startUp()
{
overlayManager.add(overlay);
}
@Override
public void shutDown()
{
overlayManager.remove(overlay);
}
}

View File

@@ -0,0 +1,193 @@
/*
* Copyright (c) 2018, Tim Lehner <Timothy.Lehner.2011@live.rhul.ac.uk>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.raidsthieving.BatSolver;
import java.util.Map;
import java.util.HashSet;
import java.util.HashMap;
import java.util.TreeSet;
import java.util.List;
import java.util.ArrayList;
import static net.runelite.client.plugins.raidsthieving.BatSolver.SolutionSet.SOLUTION_SETS;
public class BatSolver
{
private Map<Integer, Integer> numberOfSolutionsWithPoison;
private final SolutionSet solution;
private final HashSet<Integer> grubsChests;
public BatSolver(ThievingRoomType roomType)
{
solution = new SolutionSet(roomType);
grubsChests = new HashSet<>();
}
public void addEmptyChest(int chestId)
{
// When a new empty chest is found, add it to the current solution set
solution.addEmptyChest(chestId);
calculateChanceOfPoison();
}
public void addGrubsChest(int chestId)
{
// When a chest with grubs is found, keep track of it to invalidate solutions
grubsChests.add(chestId);
calculateChanceOfPoison();
}
public TreeSet<Integer> matchSolutions()
{
TreeSet<Integer> possibleEmptyChests = new TreeSet<>();
for (SolutionSet knownSolution : SolutionSet.SOLUTION_SETS)
{
if (knownSolution.getType() == solution.getType() && matchSolution(knownSolution))
{
possibleEmptyChests.addAll(knownSolution.getEmptyChests());
}
}
return possibleEmptyChests;
}
private boolean matchSolution(SolutionSet testSolution)
{
for (Integer grubsChest : grubsChests)
{
if (testSolution.containsChest(grubsChest))
{
// If one of the chests is known to have grubs, it cannot be a solution
return false;
}
}
boolean matchesAll = true;
boolean everMatched = false;
for (int i : solution.getEmptyChests())
{
if (!testSolution.containsChest(i))
{
matchesAll = false;
}
else
{
everMatched = true;
}
}
return matchesAll && everMatched;
}
public ThievingRoomType getType()
{
return solution.getType();
}
public void calculateChanceOfPoison()
{
if (getType() == null)
{
numberOfSolutionsWithPoison = null;
return;
}
numberOfSolutionsWithPoison = new HashMap<>();
for (SolutionSet sol : getPosssibleSolutions())
{
if (getType() == sol.getType() && (solution.getEmptyChests().size() == 0 || matchSolution(sol)))
{
for (Integer i : sol.getEmptyChests())
{
if (numberOfSolutionsWithPoison.containsKey(i))
{
numberOfSolutionsWithPoison.put(i, numberOfSolutionsWithPoison.get(i) + 1);
}
else
{
numberOfSolutionsWithPoison.put(i, 1);
}
}
}
}
}
private List<SolutionSet> getPosssibleSolutions()
{
List<SolutionSet> possibleSolutions = new ArrayList<>();
for (SolutionSet soln : SOLUTION_SETS)
{
// Check if we've found grubs in one of the chests, invalidating it as an solution
boolean foundMatch = false;
for (int i : grubsChests)
{
if (soln.containsChest(i))
{
foundMatch = true;
}
}
if (!foundMatch)
{
possibleSolutions.add(soln);
}
}
return possibleSolutions;
}
public double relativeLikelihoodPoison(int chestId)
{
// Returns a double between 0 and 1 of how likely the chest has poison based on the number of possible solutions
// Uses a Sigmoid like function to give good contrast in drawn opacity,
// perhaps could be changed to something more accurate quantitavely.
if (numberOfSolutionsWithPoison == null)
{
calculateChanceOfPoison();
}
if (numberOfSolutionsWithPoison == null)
{
return 1.0;
}
int mostFrequentPoison = 0;
for (Map.Entry<Integer, Integer> entry : numberOfSolutionsWithPoison.entrySet())
{
if (entry.getValue() > mostFrequentPoison)
{
mostFrequentPoison = entry.getValue();
}
}
int timesFound = 0;
if (numberOfSolutionsWithPoison.containsKey(chestId))
{
timesFound = numberOfSolutionsWithPoison.get(chestId);
}
double chestChance = (double) (timesFound) / (double) (mostFrequentPoison);
return 1. / (1 + Math.exp(5 - 10 * chestChance));
}
public int getNumberOfEmptyChests()
{
return solution.getEmptyChests().size();
}
}

View File

@@ -0,0 +1,261 @@
/*
* Copyright (c) 2018, Tim Lehner <Timothy.Lehner.2011@live.rhul.ac.uk>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.raidsthieving.BatSolver;
import net.runelite.client.plugins.raidsthieving.InstancePoint;
import net.runelite.client.plugins.raidsthieving.ThievingChest;
import java.util.HashMap;
import java.util.Map;
public class ChestIdentifier
{
public ChestIdentifier(ThievingRoomType roomType)
{
chestIds = new HashMap<>();
switch (roomType)
{
case LEFT_TURN:
chestIds.put(new InstancePoint(3283, 5379), 1);
chestIds.put(new InstancePoint(3285, 5380), 2);
chestIds.put(new InstancePoint(3279, 5381), 3);
chestIds.put(new InstancePoint(3287, 5382), 4);
chestIds.put(new InstancePoint(3281, 5382), 5);
chestIds.put(new InstancePoint(3284, 5383), 6);
chestIds.put(new InstancePoint(3283, 5384), 7);
chestIds.put(new InstancePoint(3286, 5384), 8);
chestIds.put(new InstancePoint(3288, 5384), 9);
chestIds.put(new InstancePoint(3277, 5385), 10);
chestIds.put(new InstancePoint(3280, 5385), 11);
chestIds.put(new InstancePoint(3285, 5386), 12);
chestIds.put(new InstancePoint(3290, 5386), 13);
chestIds.put(new InstancePoint(3275, 5387), 14);
chestIds.put(new InstancePoint(3287, 5387), 15);
chestIds.put(new InstancePoint(3288, 5387), 16);
chestIds.put(new InstancePoint(3281, 5388), 17);
chestIds.put(new InstancePoint(3291, 5388), 18);
chestIds.put(new InstancePoint(3280, 5389), 19);
chestIds.put(new InstancePoint(3285, 5389), 20);
chestIds.put(new InstancePoint(3289, 5389), 21);
chestIds.put(new InstancePoint(3283, 5390), 22);
chestIds.put(new InstancePoint(3285, 5390), 23);
chestIds.put(new InstancePoint(3288, 5390), 24);
chestIds.put(new InstancePoint(3290, 5390), 25);
chestIds.put(new InstancePoint(3282, 5391), 26);
chestIds.put(new InstancePoint(3289, 5391), 27);
chestIds.put(new InstancePoint(3292, 5391), 28);
chestIds.put(new InstancePoint(3279, 5392), 29);
chestIds.put(new InstancePoint(3276, 5393), 30);
chestIds.put(new InstancePoint(3279, 5393), 31);
chestIds.put(new InstancePoint(3284, 5393), 32);
chestIds.put(new InstancePoint(3285, 5393), 33);
chestIds.put(new InstancePoint(3291, 5393), 34);
chestIds.put(new InstancePoint(3275, 5394), 35);
chestIds.put(new InstancePoint(3277, 5394), 36);
chestIds.put(new InstancePoint(3288, 5394), 37);
chestIds.put(new InstancePoint(3276, 5395), 38);
chestIds.put(new InstancePoint(3281, 5395), 39);
chestIds.put(new InstancePoint(3285, 5395), 40);
chestIds.put(new InstancePoint(3287, 5395), 41);
chestIds.put(new InstancePoint(3289, 5395), 42);
chestIds.put(new InstancePoint(3274, 5396), 43);
chestIds.put(new InstancePoint(3283, 5396), 44);
chestIds.put(new InstancePoint(3285, 5396), 45);
chestIds.put(new InstancePoint(3288, 5396), 46);
chestIds.put(new InstancePoint(3272, 5397), 47);
chestIds.put(new InstancePoint(3280, 5397), 48);
chestIds.put(new InstancePoint(3277, 5398), 49);
chestIds.put(new InstancePoint(3281, 5398), 50);
chestIds.put(new InstancePoint(3284, 5398), 51);
chestIds.put(new InstancePoint(3276, 5399), 52);
chestIds.put(new InstancePoint(3278, 5399), 53);
chestIds.put(new InstancePoint(3283, 5399), 54);
chestIds.put(new InstancePoint(3285, 5399), 55);
chestIds.put(new InstancePoint(3277, 5400), 56);
chestIds.put(new InstancePoint(3284, 5400), 57);
chestIds.put(new InstancePoint(3288, 5400), 58);
chestIds.put(new InstancePoint(3281, 5401), 59);
chestIds.put(new InstancePoint(3286, 5401), 60);
chestIds.put(new InstancePoint(3279, 5402), 61);
chestIds.put(new InstancePoint(3285, 5402), 62);
chestIds.put(new InstancePoint(3280, 5403), 63);
chestIds.put(new InstancePoint(3283, 5403), 64);
break;
case RIGHT_TURN:
chestIds.put(new InstancePoint(3338, 5405), 1);
chestIds.put(new InstancePoint(3334, 5405), 2);
chestIds.put(new InstancePoint(3342, 5404), 3);
chestIds.put(new InstancePoint(3340, 5404), 4);
chestIds.put(new InstancePoint(3345, 5403), 5);
chestIds.put(new InstancePoint(3334, 5403), 6);
chestIds.put(new InstancePoint(3330, 5403), 7);
chestIds.put(new InstancePoint(3343, 5402), 8);
chestIds.put(new InstancePoint(3342, 5402), 9);
chestIds.put(new InstancePoint(3339, 5402), 10);
chestIds.put(new InstancePoint(3338, 5402), 11);
chestIds.put(new InstancePoint(3336, 5402), 12);
chestIds.put(new InstancePoint(3347, 5401), 13);
chestIds.put(new InstancePoint(3330, 5401), 14);
chestIds.put(new InstancePoint(3345, 5400), 15);
chestIds.put(new InstancePoint(3341, 5400), 16);
chestIds.put(new InstancePoint(3337, 5400), 17);
chestIds.put(new InstancePoint(3334, 5400), 18);
chestIds.put(new InstancePoint(3345, 5399), 19);
chestIds.put(new InstancePoint(3343, 5399), 20);
chestIds.put(new InstancePoint(3340, 5399), 21);
chestIds.put(new InstancePoint(3335, 5399), 22);
chestIds.put(new InstancePoint(3331, 5399), 23);
chestIds.put(new InstancePoint(3338, 5398), 24);
chestIds.put(new InstancePoint(3337, 5398), 25);
chestIds.put(new InstancePoint(3345, 5397), 26);
chestIds.put(new InstancePoint(3341, 5397), 27);
chestIds.put(new InstancePoint(3334, 5397), 28);
chestIds.put(new InstancePoint(3331, 5397), 29);
chestIds.put(new InstancePoint(3346, 5396), 30);
chestIds.put(new InstancePoint(3343, 5396), 31);
chestIds.put(new InstancePoint(3339, 5396), 32);
chestIds.put(new InstancePoint(3335, 5396), 33);
chestIds.put(new InstancePoint(3333, 5396), 34);
chestIds.put(new InstancePoint(3340, 5395), 35);
chestIds.put(new InstancePoint(3337, 5395), 36);
chestIds.put(new InstancePoint(3334, 5395), 37);
chestIds.put(new InstancePoint(3345, 5394), 38);
chestIds.put(new InstancePoint(3342, 5394), 39);
chestIds.put(new InstancePoint(3332, 5394), 40);
chestIds.put(new InstancePoint(3343, 5393), 41);
chestIds.put(new InstancePoint(3341, 5393), 42);
chestIds.put(new InstancePoint(3338, 5393), 43);
chestIds.put(new InstancePoint(3335, 5393), 44);
chestIds.put(new InstancePoint(3334, 5393), 45);
chestIds.put(new InstancePoint(3346, 5392), 46);
chestIds.put(new InstancePoint(3342, 5392), 47);
chestIds.put(new InstancePoint(3332, 5392), 48);
chestIds.put(new InstancePoint(3350, 5391), 49);
chestIds.put(new InstancePoint(3346, 5391), 50);
chestIds.put(new InstancePoint(3340, 5391), 51);
chestIds.put(new InstancePoint(3339, 5391), 52);
chestIds.put(new InstancePoint(3336, 5391), 53);
chestIds.put(new InstancePoint(3333, 5391), 54);
chestIds.put(new InstancePoint(3349, 5390), 55);
chestIds.put(new InstancePoint(3343, 5390), 56);
chestIds.put(new InstancePoint(3337, 5390), 57);
chestIds.put(new InstancePoint(3335, 5390), 58);
chestIds.put(new InstancePoint(3344, 5389), 59);
chestIds.put(new InstancePoint(3340, 5389), 60);
chestIds.put(new InstancePoint(3336, 5389), 61);
chestIds.put(new InstancePoint(3333, 5389), 62);
chestIds.put(new InstancePoint(3346, 5388), 63);
chestIds.put(new InstancePoint(3340, 5387), 64);
chestIds.put(new InstancePoint(3337, 5386), 65);
chestIds.put(new InstancePoint(3333, 5386), 66);
chestIds.put(new InstancePoint(3338, 5385), 67);
chestIds.put(new InstancePoint(3336, 5385), 68);
chestIds.put(new InstancePoint(3337, 5384), 69);
chestIds.put(new InstancePoint(3340, 5382), 70);
chestIds.put(new InstancePoint(3334, 5383), 71);
chestIds.put(new InstancePoint(3340, 5379), 72);
chestIds.put(new InstancePoint(3338, 5380), 73);
chestIds.put(new InstancePoint(3336, 5381), 74);
break;
case STRAIGHT:
chestIds.put(new InstancePoint(3308, 5378), 1);
chestIds.put(new InstancePoint(3305, 5379), 2);
chestIds.put(new InstancePoint(3307, 5379), 3);
chestIds.put(new InstancePoint(3304, 5381), 4);
chestIds.put(new InstancePoint(3310, 5381), 5);
chestIds.put(new InstancePoint(3302, 5382), 6);
chestIds.put(new InstancePoint(3307, 5382), 7);
chestIds.put(new InstancePoint(3312, 5382), 8);
chestIds.put(new InstancePoint(3317, 5382), 9);
chestIds.put(new InstancePoint(3319, 5382), 10);
chestIds.put(new InstancePoint(3304, 5383), 11);
chestIds.put(new InstancePoint(3305, 5383), 12);
chestIds.put(new InstancePoint(3307, 5383), 13);
chestIds.put(new InstancePoint(3310, 5383), 14);
chestIds.put(new InstancePoint(3315, 5383), 15);
chestIds.put(new InstancePoint(3320, 5383), 16);
chestIds.put(new InstancePoint(3300, 5384), 17);
chestIds.put(new InstancePoint(3309, 5384), 18);
chestIds.put(new InstancePoint(3311, 5384), 19);
chestIds.put(new InstancePoint(3313, 5384), 20);
chestIds.put(new InstancePoint(3317, 5384), 21);
chestIds.put(new InstancePoint(3318, 5384), 22);
chestIds.put(new InstancePoint(3302, 5385), 23);
chestIds.put(new InstancePoint(3306, 5385), 24);
chestIds.put(new InstancePoint(3310, 5385), 25);
chestIds.put(new InstancePoint(3313, 5385), 26);
chestIds.put(new InstancePoint(3320, 5385), 27);
chestIds.put(new InstancePoint(3302, 5386), 28);
chestIds.put(new InstancePoint(3305, 5386), 29);
chestIds.put(new InstancePoint(3316, 5386), 30);
chestIds.put(new InstancePoint(3321, 5386), 31);
chestIds.put(new InstancePoint(3300, 5387), 32);
chestIds.put(new InstancePoint(3308, 5387), 33);
chestIds.put(new InstancePoint(3314, 5387), 34);
chestIds.put(new InstancePoint(3317, 5387), 35);
chestIds.put(new InstancePoint(3301, 5388), 36);
chestIds.put(new InstancePoint(3306, 5388), 37);
chestIds.put(new InstancePoint(3312, 5388), 38);
chestIds.put(new InstancePoint(3322, 5388), 39);
chestIds.put(new InstancePoint(3309, 5389), 40);
chestIds.put(new InstancePoint(3311, 5389), 41);
chestIds.put(new InstancePoint(3313, 5389), 42);
chestIds.put(new InstancePoint(3316, 5389), 43);
chestIds.put(new InstancePoint(3320, 5389), 44);
chestIds.put(new InstancePoint(3300, 5390), 45);
chestIds.put(new InstancePoint(3303, 5390), 46);
chestIds.put(new InstancePoint(3304, 5390), 47);
chestIds.put(new InstancePoint(3312, 5390), 48);
chestIds.put(new InstancePoint(3320, 5390), 49);
chestIds.put(new InstancePoint(3307, 5391), 50);
chestIds.put(new InstancePoint(3310, 5391), 51);
chestIds.put(new InstancePoint(3317, 5391), 52);
chestIds.put(new InstancePoint(3318, 5391), 53);
chestIds.put(new InstancePoint(3323, 5391), 54);
chestIds.put(new InstancePoint(3301, 5392), 55);
chestIds.put(new InstancePoint(3303, 5392), 56);
chestIds.put(new InstancePoint(3309, 5392), 57);
chestIds.put(new InstancePoint(3314, 5392), 58);
chestIds.put(new InstancePoint(3322, 5392), 59);
chestIds.put(new InstancePoint(3305, 5393), 60);
chestIds.put(new InstancePoint(3307, 5393), 61);
chestIds.put(new InstancePoint(3316, 5393), 62);
chestIds.put(new InstancePoint(3309, 5394), 63);
chestIds.put(new InstancePoint(3312, 5394), 64);
chestIds.put(new InstancePoint(3322, 5394), 65);
chestIds.put(new InstancePoint(3310, 5379), 66);
break;
}
}
public int indentifyChest(ThievingChest chest)
{
int id = chestIds.get(chest.getInstancePoint());
chest.setChestId(id);
return id;
}
private Map<InstancePoint, Integer> chestIds;
}

View File

@@ -0,0 +1,165 @@
/*
* Copyright (c) 2018, Tim Lehner <Timothy.Lehner.2011@live.rhul.ac.uk>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.raidsthieving.BatSolver;
import lombok.Getter;
import java.util.HashSet;
import java.util.Arrays;
import java.util.Set;
// Each Thieving room has 4 empty chests
// User-reported data shows these 4 come in groups,
//
// e.g. if there is an empty chest in L room chest 1, the other empty chests could be 16, 17, 38, 54, 55
// See https://dikkenoob.github.io/ for more information
public class SolutionSet
{
public static final SolutionSet[] SOLUTION_SETS =
{
new SolutionSet(ThievingRoomType.LEFT_TURN, 1, 16, 17, 55),
new SolutionSet(ThievingRoomType.LEFT_TURN, 1, 17, 38, 54),
new SolutionSet(ThievingRoomType.LEFT_TURN, 2, 7, 21, 37),
new SolutionSet(ThievingRoomType.LEFT_TURN, 3, 5, 19, 30),
new SolutionSet(ThievingRoomType.LEFT_TURN, 3, 11, 15, 40),
new SolutionSet(ThievingRoomType.LEFT_TURN, 4, 22, 27, 46),
new SolutionSet(ThievingRoomType.LEFT_TURN, 5, 9, 19, 45),
new SolutionSet(ThievingRoomType.LEFT_TURN, 6, 24, 26, 41),
new SolutionSet(ThievingRoomType.LEFT_TURN, 6, 26, 32, 52),
new SolutionSet(ThievingRoomType.LEFT_TURN, 7, 13, 44, 59),
new SolutionSet(ThievingRoomType.LEFT_TURN, 8, 14, 41, 43),
new SolutionSet(ThievingRoomType.LEFT_TURN, 8, 10, 28, 33),
new SolutionSet(ThievingRoomType.LEFT_TURN, 8, 31, 47, 50),
new SolutionSet(ThievingRoomType.LEFT_TURN, 10, 35, 54, 63),
new SolutionSet(ThievingRoomType.LEFT_TURN, 10, 30, 32, 59),
new SolutionSet(ThievingRoomType.LEFT_TURN, 12, 40, 53, 56),
new SolutionSet(ThievingRoomType.LEFT_TURN, 12, 13, 42, 54),
new SolutionSet(ThievingRoomType.LEFT_TURN, 13, 22, 27, 46),
new SolutionSet(ThievingRoomType.LEFT_TURN, 14, 18, 23, 51),
new SolutionSet(ThievingRoomType.LEFT_TURN, 15, 43, 44, 58),
new SolutionSet(ThievingRoomType.LEFT_TURN, 15, 16, 42, 45),
new SolutionSet(ThievingRoomType.LEFT_TURN, 20, 29, 45, 51),
new SolutionSet(ThievingRoomType.LEFT_TURN, 20, 25, 32, 34),
new SolutionSet(ThievingRoomType.LEFT_TURN, 20, 28, 51, 62),
new SolutionSet(ThievingRoomType.LEFT_TURN, 21, 39, 41, 58),
new SolutionSet(ThievingRoomType.LEFT_TURN, 22, 25, 54, 64),
new SolutionSet(ThievingRoomType.LEFT_TURN, 23, 31, 47, 55),
new SolutionSet(ThievingRoomType.LEFT_TURN, 23, 33, 37, 60),
new SolutionSet(ThievingRoomType.LEFT_TURN, 24, 34, 55),
new SolutionSet(ThievingRoomType.LEFT_TURN, 26, 50, 63, 27),
new SolutionSet(ThievingRoomType.LEFT_TURN, 29, 39, 41, 61),
new SolutionSet(ThievingRoomType.LEFT_TURN, 33, 46, 52, 57),
new SolutionSet(ThievingRoomType.LEFT_TURN, 34, 45, 49, 60),
new SolutionSet(ThievingRoomType.LEFT_TURN, 36, 40, 42, 62),
new SolutionSet(ThievingRoomType.LEFT_TURN, 37, 38, 51, 64),
new SolutionSet(ThievingRoomType.LEFT_TURN, 48, 53, 55, 56),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 1, 6, 28, 41),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 1, 42, 55, 60),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 2, 10, 31, 44),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 2, 33, 51, 68),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 3, 31, 43, 46),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 3, 5, 21, 48),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 4, 20, 24, 33),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 4, 38, 47),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 5, 21, 48),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 5, 17, 35, 63),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 7, 17, 45, 47),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 7, 37, 41, 52),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 8, 13, 40, 42),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 8, 20, 24, 30),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 9, 15, 23, 35),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 11, 13, 21, 50),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 11, 18, 37, 39),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 12, 14, 27, 34),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 14, 45, 67, 71),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 16, 22, 29, 32),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 18, 28, 31, 64),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 19, 21, 63, 69),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 20, 51, 68, 72),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 22, 29, 56, 61),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 23, 53, 66, 74),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 26, 35, 53, 59),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 27, 30, 55, 57),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 31, 58, 60, 73),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 34, 57, 58, 70),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 38, 56, 61, 70),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 40, 54, 65, 72),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 42, 46, 65),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 47, 49, 66, 67),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 48, 62, 69),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 9, 19, 32, 41),
new SolutionSet(ThievingRoomType.RIGHT_TURN, 16, 26, 36, 39),
new SolutionSet(ThievingRoomType.STRAIGHT, 1, 39, 43, 51),
new SolutionSet(ThievingRoomType.STRAIGHT, 2, 15, 20, 53),
new SolutionSet(ThievingRoomType.STRAIGHT, 3, 10, 42, 44),
new SolutionSet(ThievingRoomType.STRAIGHT, 4, 14, 38, 52),
new SolutionSet(ThievingRoomType.STRAIGHT, 5, 6, 35, 41),
new SolutionSet(ThievingRoomType.STRAIGHT, 7, 16, 34, 49),
new SolutionSet(ThievingRoomType.STRAIGHT, 9, 12, 26, 27),
new SolutionSet(ThievingRoomType.STRAIGHT, 13, 25, 30, 31),
new SolutionSet(ThievingRoomType.STRAIGHT, 15, 20, 53),
new SolutionSet(ThievingRoomType.STRAIGHT, 17, 24, 34, 58),
new SolutionSet(ThievingRoomType.STRAIGHT, 18, 23, 35, 57),
new SolutionSet(ThievingRoomType.STRAIGHT, 19, 26, 47, 65),
new SolutionSet(ThievingRoomType.STRAIGHT, 21, 33, 36, 61),
new SolutionSet(ThievingRoomType.STRAIGHT, 21, 54, 66),
new SolutionSet(ThievingRoomType.STRAIGHT, 22, 25, 46, 55),
new SolutionSet(ThievingRoomType.STRAIGHT, 24, 34, 58),
new SolutionSet(ThievingRoomType.STRAIGHT, 28, 40, 52, 62),
new SolutionSet(ThievingRoomType.STRAIGHT, 29, 41, 42, 63),
new SolutionSet(ThievingRoomType.STRAIGHT, 30, 32, 37, 64),
new SolutionSet(ThievingRoomType.STRAIGHT, 39, 43, 51),
new SolutionSet(ThievingRoomType.STRAIGHT, 43, 45, 50, 60),
new SolutionSet(ThievingRoomType.STRAIGHT, 51, 53, 56, 59)
};
SolutionSet(ThievingRoomType type)
{
this.type = type;
emptyChests = new HashSet<>();
}
private SolutionSet(ThievingRoomType type, Integer... emptyChests)
{
this.type = type;
this.emptyChests = new HashSet<>(Arrays.asList(emptyChests));
}
public void addEmptyChest(int chestId)
{
emptyChests.add(chestId);
}
public boolean containsChest(int chestId)
{
return emptyChests.contains(chestId);
}
@Getter
private ThievingRoomType type;
@Getter
private Set<Integer> emptyChests;
}

View File

@@ -0,0 +1,61 @@
/*
* Copyright (c) 2018, Tim Lehner <Timothy.Lehner.2011@live.rhul.ac.uk>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.raidsthieving.BatSolver;
// There are three distinct Thieving rooms, distinguished by the position of the entrance relative to the exit
// e.g. If you enter the room and must turn left to get to the exit and trough, this is a LEFT_TURN
import net.runelite.client.plugins.raidsthieving.InstancePoint;
public enum ThievingRoomType
{
LEFT_TURN(3271, 5389),
RIGHT_TURN(3350, 5399),
STRAIGHT(3317, 5397);
private final int x;
private final int y;
ThievingRoomType(int x, int y)
{
this.x = x;
this.y = y;
}
public static ThievingRoomType IdentifyByInstancePoint(InstancePoint point)
{
for (ThievingRoomType type : ThievingRoomType.values())
{
if (Math.abs(type.x - point.getX()) <= 1 &&
Math.abs(type.y - point.getY()) <= 1)
{
return type;
}
}
return null;
}
}

View File

@@ -0,0 +1,172 @@
/*
* Copyright (c) 2018, Tim Lehner <Timothy.Lehner.2011@live.rhul.ac.uk>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.raidsthieving;
import net.runelite.api.Client;
import net.runelite.api.Perspective;
import net.runelite.api.Point;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldPoint;
import net.runelite.client.plugins.raidsthieving.BatSolver.BatSolver;
import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayLayer;
import net.runelite.client.ui.overlay.OverlayPosition;
import net.runelite.client.ui.overlay.components.ProgressPieComponent;
import javax.inject.Inject;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.util.Map;
import java.util.TreeSet;
/**
* Represents the overlay that shows timers on traps that are placed by the
* player.
*/
public class ChestOverlay extends Overlay
{
private final Client client;
private final RaidsThievingPlugin plugin;
private final RaidsThievingConfig config;
@Inject
ChestOverlay(Client client, RaidsThievingPlugin plugin, RaidsThievingConfig config)
{
setPosition(OverlayPosition.DYNAMIC);
setLayer(OverlayLayer.ABOVE_SCENE);
this.plugin = plugin;
this.config = config;
this.client = client;
}
@Override
public Dimension render(Graphics2D graphics)
{
drawChests(graphics);
return null;
}
/**
* Updates the timer colors.
*/
public void updateConfig()
{
}
/**
* Iterates over all the traps that were placed by the local player, and
* draws a circle or a timer on the trap, depending on the trap state.
*
* @param graphics
*/
private void drawChests(Graphics2D graphics)
{
for (Map.Entry<WorldPoint, ThievingChest> entry : plugin.getChests().entrySet())
{
ThievingChest chest = entry.getValue();
WorldPoint pos = entry.getKey();
if (chest != null)
{
if (!plugin.isBatsFound() && !chest.isEverOpened())
{
if (shouldDrawChest(pos))
{
Color drawColor = new Color(config.getPotentialBatColor().getRed(),
config.getPotentialBatColor().getGreen(),
config.getPotentialBatColor().getBlue(),
getChestOpacity(pos));
drawCircleOnTrap(graphics, chest, drawColor);
}
}
if (chest.isPoison())
{
drawCircleOnTrap(graphics, chest, config.getPoisonTrapColor());
}
}
}
}
private boolean shouldDrawChest(WorldPoint chestPos)
{
if (plugin.numberOfEmptyChestsFound() == 0)
{
return true;
}
int chestId = plugin.getChestId(chestPos);
BatSolver solver = plugin.getSolver();
if (solver != null && chestId != -1)
{
TreeSet<Integer> matches = solver.matchSolutions();
return matches.contains(chestId) || matches.size() == 0;
}
return true;
}
/**
* Draws a timer on a given trap.
*
* @param graphics
* @param chest The chest on which the circle needs to be drawn
* @param fill The fill color of the timer
*/
private void drawCircleOnTrap(Graphics2D graphics, ThievingChest chest, Color fill)
{
if (chest.getLocalPoint().getPlane() != client.getPlane())
{
return;
}
LocalPoint localLoc = LocalPoint.fromWorld(client, chest.getLocalPoint());
if (localLoc == null)
{
return;
}
Point loc = Perspective.localToCanvas(client, localLoc, chest.getLocalPoint().getPlane());
ProgressPieComponent pie = new ProgressPieComponent();
pie.setFill(fill);
pie.setBorderColor(Color.BLACK);
pie.setPosition(loc);
pie.setProgress(1);
if (graphics != null && loc != null)
{
pie.render(graphics);
}
}
private int getChestOpacity(WorldPoint chestPos)
{
int chestId = plugin.getChestId(chestPos);
BatSolver solver = plugin.getSolver();
if (solver != null && chestId != -1)
{
return (int) (255 * solver.relativeLikelihoodPoison(chestId));
}
return 255;
}
}

View File

@@ -0,0 +1,98 @@
package net.runelite.client.plugins.raidsthieving;
import lombok.Getter;
import net.runelite.api.Client;
import net.runelite.api.Point;
import net.runelite.api.coords.WorldPoint;
import java.util.Objects;
/**
* Represents a point in the instance chunk, invariant of rotation.
*/
@Getter
public class InstancePoint
{
private static final int CHUNK_SIZE = 8;
private static final double CHUNK_OFFSET = 3.5;
public InstancePoint(int x, int y, int rot)
{
this.x = x;
this.y = y;
this.rot = rot;
}
public InstancePoint(int x, int y)
{
this.x = x;
this.y = y;
this.rot = 0;
}
public static InstancePoint buildFromPoint(WorldPoint worldPoint, Client client)
{
Point point = new Point(worldPoint.getX(), worldPoint.getY());
Point base = new Point(client.getBaseX(), client.getBaseY());
int plane = worldPoint.getPlane();
int deltaX = point.getX() - base.getX();
int deltaY = point.getY() - base.getY();
int chunkIndexX = deltaX / CHUNK_SIZE;
int chunkIndexY = deltaY / CHUNK_SIZE;
int chunkData = client.getInstanceTemplateChunks()[plane][chunkIndexX][chunkIndexY];
int rotation = chunkData >> 1 & 0x3;
int y = (chunkData >> 3 & 0x7FF) * 8;
int x = (chunkData >> 14 & 0x3FF) * 8;
return buildFromTile(base, point, rotation, new Point(x, y));
}
public static InstancePoint buildFromTile(Point base, Point tile, int rot, Point chunkOrigin)
{
int deltaX = tile.getX() - base.getX();
int deltaY = tile.getY() - base.getY();
double chunkOffsetX = (deltaX % CHUNK_SIZE) - CHUNK_OFFSET;
double chunkOffsetY = (deltaY % CHUNK_SIZE) - CHUNK_OFFSET;
for (int i = 0; i < rot; i++)
{
double temp = chunkOffsetX;
chunkOffsetX = -chunkOffsetY;
chunkOffsetY = temp;
}
chunkOffsetX += CHUNK_OFFSET;
chunkOffsetY += CHUNK_OFFSET;
int invariantChunkOffsetX = (int) chunkOffsetX;
int invariantChunkOffsetY = (int) chunkOffsetY;
return new InstancePoint(
chunkOrigin.getX() + invariantChunkOffsetX,
chunkOrigin.getY() + invariantChunkOffsetY,
rot);
}
@Override
public boolean equals(Object o)
{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
InstancePoint that = (InstancePoint) o;
return x == that.x &&
y == that.y;
}
@Override
public int hashCode()
{
return Objects.hash(x, y);
}
private int x;
private int y;
private int rot;
}

View File

@@ -0,0 +1,67 @@
/*
* Copyright (c) 2017, Tim Lehner <Timothy.Lehner.2011@live.rhul.ac.uk>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.raidsthieving;
import net.runelite.client.config.Config;
import net.runelite.client.config.ConfigGroup;
import net.runelite.client.config.ConfigItem;
import java.awt.Color;
@ConfigGroup("raidsthievingplugin")
public interface RaidsThievingConfig extends Config
{
@ConfigItem(
position = 1,
keyName = "hexColorPotentialBat",
name = "Potential Bat",
description = "Color of marker for chests which could have bat"
)
default Color getPotentialBatColor()
{
return Color.YELLOW;
}
@ConfigItem(
position = 2,
keyName = "hexColorPoison",
name = "Poison trap",
description = "Color of chest with poison"
)
default Color getPoisonTrapColor()
{
return Color.GREEN;
}
@ConfigItem(
position = 5,
keyName = "batNotify",
name = "Notify when found",
description = "Send notification if you see bats being found."
)
default boolean batFoundNotify()
{
return false;
}
}

View File

@@ -0,0 +1,35 @@
/*
* Copyright (c) 2017, Tim Lehner <Timothy.Lehner.2011@live.rhul.ac.uk>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.raidsthieving;
public class RaidsThievingConstants
{
public static final int CLOSED_CHEST_ID = 29742;
public static final int OPEN_EMPTY_CHEST = 29743;
public static final int OPEN_FULL_CHEST_1 = 29744;
public static final int OPEN_FULL_CHEST_2 = 29745;
public static final int EMPTY_TROUGH = 29746;
public static final int[] STORAGE = {29769, 29770, 29771, 29772};
}

View File

@@ -0,0 +1,271 @@
/*
* Copyright (c) 2017, Tim Lehner <Timothy.Lehner.2011@live.rhul.ac.uk>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.raidsthieving;
import com.google.inject.Provides;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client;
import net.runelite.api.GameObject;
import net.runelite.api.GraphicsObject;
import net.runelite.api.Varbits;
import net.runelite.api.coords.WorldPoint;
import net.runelite.api.events.ConfigChanged;
import net.runelite.api.events.GameObjectSpawned;
import net.runelite.api.events.GraphicsObjectCreated;
import net.runelite.api.events.VarbitChanged;
import net.runelite.client.Notifier;
import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.plugins.raidsthieving.BatSolver.BatSolver;
import net.runelite.client.plugins.raidsthieving.BatSolver.ChestIdentifier;
import net.runelite.client.plugins.raidsthieving.BatSolver.ThievingRoomType;
import net.runelite.client.ui.overlay.OverlayManager;
import javax.inject.Inject;
import java.text.MessageFormat;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@PluginDescriptor(
name = "Raids Bat Finder",
description = "Tracks which chests need to be searched for bats and which poison",
tags = {"overlay", "skilling", "raid"},
type = "PVM"
)
public class RaidsThievingPlugin extends Plugin
{
@Inject
private Client client;
@Inject
private OverlayManager overlayManager;
@Inject
private ChestOverlay overlay;
@Inject
private Notifier notifier;
@Inject
private RaidsThievingConfig config;
@Getter
private final Map<WorldPoint, ThievingChest> chests = new HashMap<>();
@Getter
private Instant lastActionTime = Instant.ofEpochMilli(0);
private boolean inRaidChambers;
@Getter
private boolean batsFound;
@Getter
private BatSolver solver;
@Getter
private ChestIdentifier mapper;
@Provides
RaidsThievingConfig provideConfig(ConfigManager configManager)
{
return configManager.getConfig(RaidsThievingConfig.class);
}
@Override
protected void startUp()
{
overlayManager.add(overlay);
overlay.updateConfig();
reset();
}
@Override
protected void shutDown() throws Exception
{
overlayManager.remove(overlay);
lastActionTime = Instant.ofEpochMilli(0);
chests.clear();
}
@Subscribe
public void onGameObjectSpawned(GameObjectSpawned event)
{
GameObject obj = event.getGameObject();
WorldPoint loc = obj.getWorldLocation();
InstancePoint absLoc = InstancePoint.buildFromPoint(loc, client);
if (obj.getId() == RaidsThievingConstants.EMPTY_TROUGH)
{
ThievingRoomType type = ThievingRoomType.IdentifyByInstancePoint(absLoc);
if (type != null)
{
solver = new BatSolver(type);
mapper = new ChestIdentifier(type);
for (ThievingChest chest : chests.values())
{
mapper.indentifyChest(chest);
}
}
else
{
log.error(MessageFormat.format("Unable to identify room type with: {0} {1} {2} {3} {4}.",
loc.getX(), loc.getY(), absLoc.getX(), absLoc.getY(), absLoc.getRot()));
log.error("Please report this @https://github.com/runelite/runelite/pull/4914!");
}
}
if (obj.getId() == RaidsThievingConstants.CLOSED_CHEST_ID)
{
if (!chests.containsKey(loc))
{
ThievingChest chest = new ThievingChest(obj, absLoc);
if (mapper != null)
{
mapper.indentifyChest(chest);
}
chests.put(loc, chest);
}
else
{
checkForBats();
}
}
if (obj.getId() == RaidsThievingConstants.OPEN_FULL_CHEST_1 ||
obj.getId() == RaidsThievingConstants.OPEN_FULL_CHEST_2)
{
ThievingChest chest = chests.get(obj.getWorldLocation());
// We found a chest that has grubs
log.info(MessageFormat.format("Found grubs at {0}, {1} chestId: {2}", loc.getX(), loc.getY(), chest.getChestId()));
if (solver != null && chest.getChestId() != -1)
{
chest.setEverOpened(true);
solver.addGrubsChest(chest.getChestId());
}
checkForBats();
}
if (obj.getId() == RaidsThievingConstants.OPEN_EMPTY_CHEST)
{
ThievingChest chest = chests.get(obj.getWorldLocation());
// We found a chest that could have poison
if (solver != null && chest.getChestId() != -1)
{
chest.setEmpty(true);
chest.setEverOpened(true);
solver.addEmptyChest(chest.getChestId());
}
}
}
@Subscribe
public void onGraphicsObjectCreated(GraphicsObjectCreated event)
{
GraphicsObject obj = event.getGraphicsObject();
if (obj.getId() == 184)
{
log.debug("Found poison splat");
WorldPoint loc = WorldPoint.fromLocal(client, obj.getLocation());
chests.get(loc).setPoison(true);
}
}
@Subscribe
public void onVarbitChanged(VarbitChanged event)
{
boolean setting = client.getVar(Varbits.IN_RAID) == 1;
if (inRaidChambers != setting)
{
inRaidChambers = setting;
reset();
}
}
@Subscribe
public void onConfigChanged(ConfigChanged event)
{
if (event.getGroup().equals("raidsthievingplugin"))
{
overlay.updateConfig();
}
}
private void reset()
{
chests.clear();
batsFound = false;
solver = null;
mapper = null;
}
public int numberOfEmptyChestsFound()
{
int total = 0;
for (ThievingChest chest : chests.values())
{
if (chest.isEmpty())
{
total++;
}
}
return total;
}
private boolean checkForBats()
{
for (ThievingChest chest : chests.values())
{
if (chest.isEmpty() && !chest.isPoison())
{
batsFound = true;
if (config.batFoundNotify())
{
notifier.notify("Bats have been found!");
}
return true;
}
}
return false;
}
public int getChestId(WorldPoint worldPoint)
{
return chests.get(worldPoint).getChestId();
}
}

View File

@@ -0,0 +1,78 @@
/*
* Copyright (c) 2019, Tim Lehner <Timothy.Lehner.2011@live.rhul.ac.uk>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.raidsthieving;
import lombok.Getter;
import lombok.Setter;
import net.runelite.api.GameObject;
import net.runelite.api.coords.WorldPoint;
/**
* Wrapper class for a GameObject that represents a chest in the thieving room of Chambers of Xeric.
*/
@Getter
public class ThievingChest
{
/**
* If the chest has never been opened, it could have bats.
*/
@Setter
private boolean everOpened;
/**
* If the chest is empty, it could have bats.
*/
@Setter
private boolean empty;
/**
* If the chest contains a poison trap instead.
*/
@Setter
private boolean poison;
@Setter
private int chestId;
private final WorldPoint localPoint;
private final InstancePoint instancePoint;
/**
* Constructor for a ThievingChest object
*
* @param gameObject The gameobject thats corresponds with this trap.
*/
ThievingChest(GameObject gameObject, InstancePoint instancePoint)
{
this.everOpened = false;
this.poison = false;
this.empty = false;
localPoint = gameObject.getWorldLocation();
this.instancePoint = instancePoint;
this.chestId = -1;
}
}

View File

@@ -0,0 +1,48 @@
/*
* Copyright (c) 2018, Infinitay <https://github.com/Infinitay>
* Copyright (c) 2018, Shaun Dreclin <https://github.com/ShaunDreclin>
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.rememberclan;
import net.runelite.client.config.Config;
import net.runelite.client.config.ConfigGroup;
import net.runelite.client.config.ConfigItem;
@ConfigGroup("rememberclan")
public interface RememberClanConfig extends Config
{
@ConfigItem(
position = 1,
keyName = "clanname",
name = "Clan Name",
description = "Clanname to always remember"
)
default String clanname()
{
return "";
}
}

View File

@@ -0,0 +1,79 @@
/*
* Copyright (c) 2018, Infinitay <https://github.com/Infinitay>
* Copyright (c) 2018, Shaun Dreclin <https://github.com/ShaunDreclin>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.rememberclan;
import com.google.inject.Provides;
import javax.inject.Inject;
import net.runelite.api.*;
import net.runelite.api.events.GameStateChanged;
import net.runelite.api.events.GameTick;
import net.runelite.api.vars.AccountType;
import net.runelite.client.chat.ChatColorType;
import net.runelite.client.chat.ChatMessageBuilder;
import net.runelite.client.chat.ChatMessageManager;
import net.runelite.client.chat.QueuedMessage;
import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor;
@PluginDescriptor(
name = "Remember Clan",
description = "Remember a specific clan!",
type = "utility",
enabledByDefault = false
)
public class RememberClanPlugin extends Plugin
{
@Inject
private Client client;
@Inject
private RememberClanConfig config;
@Inject
private ChatMessageManager chatMessageManager;
private boolean loggingIn;
@Provides
RememberClanConfig provideConfig(ConfigManager configManager)
{
return configManager.getConfig(RememberClanConfig.class);
}
@Subscribe
public void onGameTick(GameTick event)
{
client.setVar(VarClientStr.RECENT_CLAN_CHAT,config.clanname());
}
}

View File

@@ -0,0 +1,93 @@
/*
* Copyright (c) 2019, FlaxOnEm <flax.on.em@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.stronghold;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import net.runelite.api.widgets.Widget;
import java.util.HashMap;
import java.util.Map;
@Getter
@RequiredArgsConstructor
enum StrongholdAnswer {
PAIR_0("To pass you must answer me this: Hey adventurer!<br>You've been randomly selected for a prize of 1 year of<br>free membership! I'm just going to need some of your<br>account details so I can put it on your account!", "No way! I'm reporting you to Jagex!"),
PAIR_1("To pass you must answer me this: Can I leave my<br>account logged in while I'm out of the room?", "No."),
PAIR_2("To pass you must answer me this: How do I remove a<br>hijacker from my account?", "Use the Account Recovery System."),
PAIR_3("To pass you must answer me this: What do you do if<br>someone asks you for your password or bank PIN to<br>make you a player moderator?", "Don't give them the information and send an 'Abuse report'."),
PAIR_4("To pass you must answer me this: You're watching a<br>stream by someone claiming to be Jagex offering double<br>xp. What do you do?", "Report the stream as a scam. Real Jagex streams have a 'verified' mark."),
PAIR_5("To pass you must answer me this: My friend asks me<br>for my password so that he can do a difficult quest for<br>me. Do I give it to them?", "Don't give them my password."),
PAIR_6("To pass you must answer me this: Who can I give my<br>password to?", "Nobody."),
PAIR_7("To pass you must answer me this: How do I set up<br>two-factor authentication for my Old School RuneScape<br>account?", "Through account settings on oldschool.runescape.com."),
PAIR_8("To pass you must answer me this: What is an example<br>of a good bank PIN?", "The birthday of a famous person or event."),
PAIR_9("To pass you must answer me this: What should you do<br>if your real-life friend asks for your password so he<br>can check your stats?", "Don't give out your password to anyone. Not even close friends."),
PAIR_A("To pass you must answer me this: A player tells you to<br>search for a video online, click the link in the description<br>and comment on the forum post to win a cash prize.<br>What do you do?", "Report the player for phishing."),
PAIR_B("To pass you must answer me this: You have been<br>offered an opportunity to check out a free giveaway or<br>double XP signup via email or in game chat. What<br>should I do?", "Report the incident and do not click any links."),
PAIR_C("To pass you must answer me this: How do I set a<br>bank PIN?", "Talk to any banker."),
PAIR_D("To pass you must answer me this: What do I do if a<br>moderator asks me for my account details?", "Politely tell them no and then use the 'Report Abuse' button."),
PAIR_E("To pass you must answer me this: You are part way<br>through the Stronghold of Security when you have to<br>answer another question. After you answer the question,<br>you should...", "Read the text and follow the advice given."),
PAIR_F("To pass you must answer me this: Will Jagex prevent<br>me from saying my PIN in game?", "No."),
PAIR_G("that sound?", "No way! You'll just take my gold for your own! Reported!"),
PAIR_H("To pass you must answer me this: What should I do if<br>I receive an email asking me to verify my identity or<br>Account details due to suspicious activity?", "Don't click any links, forward the email to reportphishing@jagex.com."),
PAIR_I("To pass you must answer me this: A website claims that<br>they can make me a player moderator. What should I<br>do?", "Inform Jagex by emailing reportphishing@jagex.com."),
PAIR_J("react?", "Don't share your information and report the player."),
PAIR_K("To pass you must answer me this: What do you do if<br>someone asks you for your password or bank PIN to<br>make you a member for free?", "Don't tell them anything and click the 'Report Abuse' button."),
PAIR_L("To pass you must answer me this: Is it OK to buy an<br>Old School RuneScape account?", "No, you should never buy an account."),
PAIR_M("To pass you must answer me this: You have been<br>offered an opportunity to check out a free giveaway or<br>double XP signup via social media or stream. What<br>should I do?", "Report the incident and do not click any links."),
PAIR_N("To pass you must answer me this: Where is it safe to<br>use my Old School RuneScape password?", "Only on the Old School RuneScape website."),
PAIR_O("To pass you must answer me this: What is the best<br>way to secure your account?", "Authenticator and two-step login on my registered email."),
PAIR_P("To pass you must answer me this: Who is it ok to<br>share my account with?", "Nobody."),
PAIR_Q("To pass you must answer me this: What should you do<br>if another player messages you recommending a website<br>to purchase items and/or gold?", "Do not visit the website and report the player who messaged you."),
PAIR_R("To pass you must answer me this: Whose responsibility<br>is it to keep your account secure?", "Me."),
PAIR_S("To pass you must answer me this: Is it safe to pay<br>someone to level your account?", "No, you should never allow anyone to level your account."),
PAIR_T("To pass you must answer me this: What do I do if my<br>account is compromised?", "Secure my device and reset my password."),
PAIR_U("respond?", "Decline the offer and report that player."),
PAIR_V("To pass you must answer me this: A player says that<br>Jagex prevents you from saying your password<br>backwards in game. What do you do?", "Don't type in my password backwards and report the player."),
PAIR_W("To pass you must answer me this: What do I do if I<br>think I have a keylogger or virus?", "Virus scan my device then change my password."),
PAIR_X("To pass you must answer me this: What is the best<br>security step you can take to keep your registered<br>email secure?", "Set up 2 step authentication with my email provider.");
static final Map<String, String> MATCHES = new HashMap<>();
static {
for (StrongholdAnswer strongholdAnswer : StrongholdAnswer.values()) {
MATCHES.put(strongholdAnswer.question, strongholdAnswer.answer);
}
}
private final String question;
private final String answer;
static Widget findCorrect(final String question, final Widget[] widgets) {
final String s = MATCHES.get(question);
for (Widget widget: widgets) {
if (widget != null && widget.getText().equals(s))
return widget;
}
return null;
}
}

View File

@@ -0,0 +1,108 @@
/*
* Copyright (c) 2019, FlaxOnEm <flax.on.em@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.stronghold;
import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client;
import net.runelite.api.events.ClientTick;
import net.runelite.api.events.WidgetLoaded;
import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetID;
import net.runelite.api.widgets.WidgetInfo;
import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.util.ColorUtil;
import javax.inject.Inject;
import java.awt.Color;
@PluginDescriptor(
name = "Stronghold",
description = "Highlights the correct answer to Stronghold of Security questions",
tags = {"stronghold", "security", "overlay", "answer", "highlight"},
type = "utility"
)
@Slf4j
public class StrongholdPlugin extends Plugin {
private static final Color ANSWER_COLOR = new Color(230, 0, 230);
@Inject
private Client client;
private boolean queueNPCDialogue;
private boolean queueNPCOption;
private String questionCache;
@Subscribe
public void onWidgetLoaded(WidgetLoaded widgetLoaded) {
switch (widgetLoaded.getGroupId()) {
case WidgetID.DIALOG_NPC_GROUP_ID:
queueNPCDialogue = true;
break;
case WidgetID.DIALOG_OPTION_GROUP_ID:
queueNPCOption = true;
break;
}
}
@Subscribe
public void onClientTick(ClientTick t) {
if (queueNPCDialogue) {
queueNPCDialogue = false;
onNPCDialogue();
}
if (queueNPCOption) {
queueNPCOption = false;
onNPCOption();
}
}
private void onNPCDialogue() {
final Widget debugWidget = client.getWidget(WidgetInfo.DIALOG_NPC_TEXT);
final String npcText = debugWidget.getText();
if (StrongholdAnswer.MATCHES.containsKey(npcText))
questionCache = npcText;
}
private void onNPCOption() {
if (questionCache == null)
return;
final Widget optionsWidget = client.getWidget(WidgetInfo.DIALOG_OPTION);
if (optionsWidget == null)
return;
final Widget[] widgets = optionsWidget.getParent().getChildren();
final Widget answerWidget = StrongholdAnswer.findCorrect(questionCache, widgets);
questionCache = null;
if (answerWidget == null)
return;
final String answerText = answerWidget.getText();
answerWidget.setText(ColorUtil.wrapWithColorTag(answerText, ANSWER_COLOR));
}
}

View File

@@ -0,0 +1,164 @@
/*
* Copyright (c) 2018, Andrew EP | ElPinche256 <https://github.com/ElPinche256>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.warindicators;
import java.awt.Color;
import net.runelite.client.config.Config;
import net.runelite.client.config.ConfigGroup;
import net.runelite.client.config.ConfigItem;
@ConfigGroup("warIndicators")
public interface WarIndicatorConfig extends Config
{
@ConfigItem(
position = 0,
keyName = "highLightCallers",
name = "Highlight Callers",
description = "Highlight listed caller(s)"
)
default boolean highLightCallers()
{
return true;
}
@ConfigItem(
position = 1,
keyName = "callerColor",
name = "Caller(s) Color",
description = "Color to highlight caller's name"
)
default Color getCallerColor()
{
return new Color(36, 255, 237);
}
@ConfigItem(
position = 2,
keyName = "callerMinimap",
name = "Callers on Minimap",
description = "Show your caller(s) on the minimap"
)
default boolean callerMinimap()
{
return false;
}
@ConfigItem(
position = 3,
keyName = "callerTile",
name = "Show Caller's Tile",
description = "Show the tile your target is standing on"
)
default boolean callerTile()
{
return false;
}
@ConfigItem(
position = 4,
keyName = "activeCallers",
name = "Callers",
description = "Adds a user to your caller list. Format: (caller), (caller)"
)
default String getActiveCallers()
{
return "";
}
@ConfigItem(
position = 5,
keyName = "activeCallers",
name = "",
description = ""
)
void setActiveCallers(String key);
@ConfigItem(
position = 6,
keyName = "highlightSnipes",
name = "Highlight Targets",
description = "Highlight listed target(s)"
)
default boolean highlightSnipes()
{
return true;
}
@ConfigItem(
position = 7,
keyName = "snipeColor",
name = "Target(s) Color",
description = "Color to highlight target name"
)
default Color getSnipeColor()
{
return new Color(255, 0, 0);
}
@ConfigItem(
position = 8,
keyName = "snipeMinimap",
name = "Targets on Minimap",
description = "Show your target on the minimap"
)
default boolean snipeMinimap()
{
return false;
}
@ConfigItem(
position = 9,
keyName = "snipeTile",
name = "Show Target's Tile",
description = "Show the tile your target is standing on"
)
default boolean snipeTile()
{
return false;
}
@ConfigItem(
position = 10,
keyName = "targetedSnipes",
name = "Targets",
description = "Adds a user to your snipe list. Format: (target), (target)"
)
default String getTargetedSnipes()
{
return "";
}
@ConfigItem(
position = 11,
keyName = "targetedSnipes",
name = "",
description = ""
)
void setTargetedSnipe(String key);
}

View File

@@ -0,0 +1,87 @@
/*
* Copyright (c) 2018, Andrew EP | ElPinche256 <https://github.com/ElPinche256>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.warindicators;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import javax.inject.Inject;
import javax.inject.Singleton;
import net.runelite.api.Player;
import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayLayer;
import net.runelite.client.ui.overlay.OverlayPosition;
import net.runelite.client.ui.overlay.OverlayPriority;
import net.runelite.client.ui.overlay.OverlayUtil;
import org.apache.commons.lang3.ArrayUtils;
@Singleton
public class WarIndicatorMiniMapOverlay extends Overlay
{
private final WarIndicatorService warIndicatorService;
private final WarIndicatorConfig config;
@Inject
private WarIndicatorMiniMapOverlay(WarIndicatorConfig config, WarIndicatorService warIndicatorService)
{
this.config = config;
this.warIndicatorService = warIndicatorService;
setLayer(OverlayLayer.ABOVE_WIDGETS);
setPosition(OverlayPosition.DYNAMIC);
setPriority(OverlayPriority.HIGH);
}
@Override
public Dimension render(Graphics2D graphics)
{
warIndicatorService.forEachPlayer((player, color) -> renderPlayerOverlay(graphics, player, color));
return null;
}
private void renderPlayerOverlay(Graphics2D graphics, Player actor, Color color)
{
final String name = actor.getName().replace('\u00A0', ' ');
final net.runelite.api.Point minimapLocation = actor.getMinimapLocation();
String[] callers = config.getActiveCallers().split(", ");
String[] targets = config.getTargetedSnipes().split(", ");
if (config.callerMinimap() && ArrayUtils.contains(callers, actor.getName()))
{
if (minimapLocation != null)
{
OverlayUtil.renderTextLocation(graphics, minimapLocation, name, color);
}
}
if (config.snipeMinimap() && ArrayUtils.contains(targets, actor.getName()))
{
if (minimapLocation != null)
{
OverlayUtil.renderTextLocation(graphics, minimapLocation, name, color);
}
}
}
}

View File

@@ -0,0 +1,101 @@
/*
* Copyright (c) 2018, Andrew EP | ElPinche256 <https://github.com/ElPinche256>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.warindicators;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Polygon;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.apache.commons.lang3.ArrayUtils;
import net.runelite.api.Player;
import net.runelite.api.Point;
import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayLayer;
import net.runelite.client.ui.overlay.OverlayPosition;
import net.runelite.client.ui.overlay.OverlayPriority;
import net.runelite.client.ui.overlay.OverlayUtil;
@Singleton
public class WarIndicatorOverlay extends Overlay
{
private final WarIndicatorService warIndicatorService;
private final WarIndicatorConfig config;
@Inject
private WarIndicatorOverlay(WarIndicatorConfig config, WarIndicatorService warIndicatorService)
{
this.config = config;
this.warIndicatorService = warIndicatorService;
setLayer(OverlayLayer.ABOVE_SCENE);
setPosition(OverlayPosition.DYNAMIC);
setPriority(OverlayPriority.HIGH);
}
@Override
public Dimension render(Graphics2D graphics)
{
warIndicatorService.forEachPlayer((player, color) -> renderPlayerOverlay(graphics, player, color));
return null;
}
private void renderPlayerOverlay(Graphics2D graphics, Player actor, Color color)
{
if (!config.highlightSnipes() && !config.highLightCallers())
{
return;
}
Polygon poly = actor.getCanvasTilePoly();
String[] callers = config.getActiveCallers().split(", ");
String[] targets = config.getTargetedSnipes().split(", ");
if (config.callerTile() && ArrayUtils.contains(callers, actor.getName()))
{
if (poly != null)
{
OverlayUtil.renderPolygon(graphics, poly, color);
}
}
if (config.snipeTile() && ArrayUtils.contains(targets, actor.getName()))
{
if (poly != null)
{
OverlayUtil.renderPolygon(graphics, poly, color);
}
}
String name = actor.getName().replace('\u00A0', ' ');
int offset = actor.getLogicalHeight() + 40;
Point textLocation = actor.getCanvasTextLocation(graphics, name, offset);
if (textLocation != null)
{
OverlayUtil.renderTextLocation(graphics, textLocation, name, color);
}
}
}

View File

@@ -0,0 +1,171 @@
/*
* Copyright (c) 2018, Andrew EP | ElPinche256 <https://github.com/ElPinche256>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.warindicators;
import com.google.common.collect.Sets;
import com.google.common.eventbus.Subscribe;
import com.google.inject.Provides;
import java.awt.Color;
import java.util.Collection;
import javax.inject.Inject;
import org.apache.commons.lang3.ArrayUtils;
import net.runelite.api.Client;
import static net.runelite.api.MenuAction.FOLLOW;
import static net.runelite.api.MenuAction.ITEM_USE_ON_PLAYER;
import static net.runelite.api.MenuAction.PLAYER_EIGTH_OPTION;
import static net.runelite.api.MenuAction.PLAYER_FIFTH_OPTION;
import static net.runelite.api.MenuAction.PLAYER_FIRST_OPTION;
import static net.runelite.api.MenuAction.PLAYER_FOURTH_OPTION;
import static net.runelite.api.MenuAction.PLAYER_SECOND_OPTION;
import static net.runelite.api.MenuAction.PLAYER_SEVENTH_OPTION;
import static net.runelite.api.MenuAction.PLAYER_SIXTH_OPTION;
import static net.runelite.api.MenuAction.PLAYER_THIRD_OPTION;
import static net.runelite.api.MenuAction.SPELL_CAST_ON_PLAYER;
import static net.runelite.api.MenuAction.TRADE;
import net.runelite.api.MenuEntry;
import net.runelite.api.Player;
import net.runelite.api.events.MenuEntryAdded;
import net.runelite.client.config.ConfigManager;
import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayManager;
@PluginDescriptor(
name = "War calling indicators",
description = "War War War.",
tags = {"skill", "total", "max", "PVP"},
type = "PVP",
enabledByDefault = false
)
public class WarIndicatorPlugin extends Plugin
{
@Inject
private OverlayManager overlayManager;
@Inject
private WarIndicatorConfig config;
@Inject
private WarIndicatorOverlay warIndicatorOverlay;
@Inject
private WarIndicatorMiniMapOverlay warIndicatorMiniMapOverlay;
@Inject
private Client client;
@Provides
WarIndicatorConfig provideConfig(ConfigManager configManager)
{
return configManager.getConfig(WarIndicatorConfig.class);
}
@Override
protected void startUp() throws Exception
{
overlayManager.add(warIndicatorOverlay);
overlayManager.add(warIndicatorMiniMapOverlay);
}
@Override
protected void shutDown() throws Exception
{
overlayManager.remove(warIndicatorOverlay);
overlayManager.remove(warIndicatorMiniMapOverlay);
}
@Subscribe
public void onMenuEntryAdd(MenuEntryAdded menuEntryAdded)
{
int type = menuEntryAdded.getType();
if (type >= 2000)
{
type -= 2000;
}
int identifier = menuEntryAdded.getIdentifier();
if (type == FOLLOW.getId() || type == TRADE.getId()
|| type == SPELL_CAST_ON_PLAYER.getId()
|| type == ITEM_USE_ON_PLAYER.getId()
|| type == PLAYER_FIRST_OPTION.getId()
|| type == PLAYER_SECOND_OPTION.getId()
|| type == PLAYER_THIRD_OPTION.getId()
|| type == PLAYER_FOURTH_OPTION.getId()
|| type == PLAYER_FIFTH_OPTION.getId()
|| type == PLAYER_SIXTH_OPTION.getId()
|| type == PLAYER_SEVENTH_OPTION.getId()
|| type == PLAYER_EIGTH_OPTION.getId())
{
Player[] players = client.getCachedPlayers();
Player player = null;
String player2 = null;
String[] callers = config.getActiveCallers().split(", ");
String[] targets = config.getTargetedSnipes().split(", ");
if (identifier >= 0 && identifier < players.length)
{
player = players[identifier];
player2 = players[identifier].getName();
}
if (player == null)
{
return;
}
Color color = null;
if (config.highLightCallers() && ArrayUtils.contains(callers, player2))
{
color = config.getCallerColor();
}
if (config.highlightSnipes() && ArrayUtils.contains(targets, player2))
{
color = config.getSnipeColor();
}
if (color != null)
{
MenuEntry[] menuEntries = client.getMenuEntries();
MenuEntry lastEntry = menuEntries[menuEntries.length - 1];
String target = lastEntry.getTarget();
int idx = target.indexOf('>');
if (idx != -1)
{
target = target.substring(idx + 1);
}
lastEntry.setTarget("<col=" + Integer.toHexString(color.getRGB() & 0xFFFFFF) + ">" + target);
client.setMenuEntries(menuEntries);
}
}
}
}

View File

@@ -0,0 +1,106 @@
/*
* Copyright (c) 2018, Andrew EP | ElPinche256 <https://github.com/ElPinche256>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.warindicators;
import net.runelite.api.Client;
import net.runelite.api.Player;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.awt.*;
import java.util.function.BiConsumer;
@Singleton
public class WarIndicatorService
{
private final Client client;
private final WarIndicatorConfig config;
@Inject
private WarIndicatorService(Client client, WarIndicatorConfig config)
{
this.config = config;
this.client = client;
}
public void forEachPlayer(final BiConsumer<Player, Color> consumer)
{
if (!config.highlightSnipes() && !config.highLightCallers())
{
return;
}
if (config.highlightSnipes())
{
for (Player player : client.getPlayers())
{
if (player == null || player.getName() == null)
{
continue;
}
String[] targets = config.getTargetedSnipes().split(", ");
if (targets == null)
{
return;
}
for (int i = 0; i < targets.length; i++)
{
if (player.getName().equalsIgnoreCase(targets[i]))
{
consumer.accept(player, config.getSnipeColor());
}
}
}
}
if (config.highLightCallers())
{
for (Player player : client.getPlayers())
{
if (player == null || player.getName() == null)
{
continue;
}
String[] callers = config.getActiveCallers().split(", ");
if (callers == null)
{
return;
}
for (int i = 0; i < callers.length; i++)
{
if (player.getName().equalsIgnoreCase(callers[i]))
{
consumer.accept(player, config.getCallerColor());
}
}
}
}
}
}

View File

@@ -0,0 +1,83 @@
package net.runelite.client.plugins.ztob;
import net.runelite.api.Client;
import net.runelite.api.Perspective;
import net.runelite.api.Point;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldPoint;
import net.runelite.client.ui.overlay.*;
import javax.inject.Inject;
import java.awt.*;
public class BloatTimerOverlay extends Overlay {
private final Client client;
private final TheatrePlugin plugin;
private final TheatreConfig config;
@Inject
private BloatTimerOverlay(Client client, TheatrePlugin plugin, TheatreConfig config) {
this.client = client;
this.plugin = plugin;
this.config = config;
setPosition(OverlayPosition.DYNAMIC);
setPriority(OverlayPriority.HIGH);
setLayer(OverlayLayer.ABOVE_SCENE);
}
public Dimension render(Graphics2D graphics) {
if (config.bloatTimer()) {
final String tickCounter = String.valueOf(plugin.bloatTimer);
int secondConversion = (int) (plugin.bloatTimer * .6);
if (plugin.getBloat_NPC() != null) {
Point canvasPoint = plugin.getBloat_NPC().getCanvasTextLocation(graphics, tickCounter, 60);
if (plugin.bloatTimer <= 37) {
renderTextLocation(graphics, tickCounter + "( " + secondConversion + " )", 15, Font.BOLD, Color.WHITE, canvasPoint);
} else {
renderTextLocation(graphics, tickCounter + "( " + secondConversion + " )", 15, Font.BOLD, Color.RED, canvasPoint);
}
}
}
return null;
}
private void drawTile(Graphics2D graphics, WorldPoint point, Color color, int strokeWidth, int outlineAlpha, int fillAlpha) {
WorldPoint playerLocation = client.getLocalPlayer().getWorldLocation();
if (point.distanceTo(playerLocation) >= 32) {
return;
}
LocalPoint lp = LocalPoint.fromWorld(client, point);
if (lp == null) {
return;
}
Polygon poly = Perspective.getCanvasTilePoly(client, lp);
if (poly == null) {
return;
}
//OverlayUtil.renderPolygon(graphics, poly, color);
graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), outlineAlpha));
graphics.setStroke(new BasicStroke(strokeWidth));
graphics.draw(poly);
graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), fillAlpha));
graphics.fill(poly);
}
private void renderTextLocation(Graphics2D graphics, String txtString, int fontSize, int fontStyle, Color fontColor, net.runelite.api.Point canvasPoint) {
graphics.setFont(new Font("Arial", fontStyle, fontSize));
if (canvasPoint != null) {
final net.runelite.api.Point canvasCenterPoint = new net.runelite.api.Point(
canvasPoint.getX(),
canvasPoint.getY());
final net.runelite.api.Point canvasCenterPoint_shadow = new Point(
canvasPoint.getX() + 1,
canvasPoint.getY() + 1);
OverlayUtil.renderTextLocation(graphics, canvasCenterPoint_shadow, txtString, Color.BLACK);
OverlayUtil.renderTextLocation(graphics, canvasCenterPoint, txtString, fontColor);
}
}
}

View File

@@ -14,15 +14,16 @@ import net.runelite.client.config.ConfigItem;
@ConfigGroup("Theatre")
public interface TheatreConfig extends Config
{
public interface TheatreConfig extends Config {
@ConfigItem(
position = 0,
keyName = "MaidenBlood",
name = "Maiden blood attack",
description = ""
)
default boolean MaidenBlood(){ return false; }
default boolean MaidenBlood() {
return true;
}
@ConfigItem(
position = 1,
@@ -30,109 +31,181 @@ public interface TheatreConfig extends Config
name = "Maiden blood spawns",
description = ""
)
default boolean MaidenSpawns(){ return false; }
default boolean MaidenSpawns() {
return true;
}
@ConfigItem(
position = 2,
keyName = "BloatIndicator",
name = "Bloat indicator",
name = "Bloat Indicator",
description = ""
)
default boolean BloatIndicator(){ return false; }
default boolean BloatIndicator() {
return true;
}
@ConfigItem(
position = 3,
keyName = "BloatHands",
name = "Bloat Falling Hands",
keyName = "bloat Timer",
name = "Bloat Timer",
description = ""
)
default boolean BloatHands(){ return false; }
default boolean bloatTimer() {
return true;
}
@ConfigItem(
position = 4,
keyName = "bloatFeet",
name = "Bloat Feet",
description = ""
)
default boolean bloatFeetIndicator() {
return true;
}
@ConfigItem(
position = 5,
keyName = "NyloPillars",
name = "Nylocas pillar health",
description = ""
)
default boolean NyloPillars(){ return false; }
default boolean NyloPillars() {
return true;
}
@ConfigItem(
position = 5,
position = 6,
keyName = "NyloBlasts",
name = "Nylocas explosions",
description = ""
)
default boolean NyloBlasts(){ return false; }
default boolean NyloBlasts() {
return true;
}
@ConfigItem(
position = 6,
position = 7,
keyName = "NyloMenu",
name = "Hide Attack options for Nylocas",
description = ""
)
default boolean NyloMenu() {
return true;
}
@ConfigItem(
position = 8,
keyName = "SotetsegMaze1",
name = "Sotetseg maze",
description = ""
)
default boolean SotetsegMaze1(){ return false; }
default boolean SotetsegMaze1() {
return true;
}
@ConfigItem(
position = 7,
position = 9,
keyName = "SotetsegMaze2",
name = "Sotetseg maze (solo mode)",
description = ""
)
default boolean SotetsegMaze2(){ return false; }
@ConfigItem(
position = 8,
keyName = "SotetsegTick",
name = "Sotetseg tick eat",
description = ""
)
default boolean SotetsegTick(){ return false; }
@ConfigItem(
position = 9,
keyName = "XarpusExhumed",
name = "Xarpus exhumed",
description = ""
)
default boolean XarpusExhumed(){ return false; }
default boolean SotetsegMaze2() {
return true;
}
@ConfigItem(
position = 10,
keyName = "XarpusTick",
name = "Xarpus tick",
keyName = "XarpusExhumed",
name = "Xarpus Exhumed",
description = ""
)
default boolean XarpusTick(){ return false; }
default boolean XarpusExhumed() {
return true;
}
@ConfigItem(
position = 11,
keyName = "VerzikCupcakes",
name = "Verzik cupcakes",
description = " "
keyName = "XarpusTick",
name = "Xarpus Tick",
description = ""
)
default boolean VerzikCupcakes(){ return false; }
default boolean XarpusTick() {
return false;
}
@ConfigItem(
position = 12,
keyName = "VerzikTick",
name = "Verzik p3 tick",
keyName = "xarpusExhumes",
name = "Xarpus Exhume Counter",
description = ""
)
default boolean VerzikTick(){ return false; }
default boolean XarpusExhumeOverlay() {
return false;
}
@ConfigItem(
position = 13,
keyName = "VerzikMelee",
name = "Verzik p3 melee range",
keyName = "VerzikCupcakes",
name = "Verzik Projectile Markers",
description = ""
)
default boolean VerzikMelee(){ return false; }
default boolean VerzikCupcakes() {
return false;
}
@ConfigItem(
position = 14,
keyName = "VerzikYellow",
name = "Verzik yellow timing",
keyName = "VerzikTick",
name = "Verzik P3 Tick",
description = ""
)
default boolean VerzikYellow(){ return false; }
}
default boolean VerzikTick() {
return false;
}
@ConfigItem(
position = 15,
keyName = "VerzikMelee",
name = "Verzik P3 Melee Range",
description = ""
)
default boolean VerzikMelee() {
return false;
}
@ConfigItem(
position = 16,
keyName = "VerzikYellow",
name = "Verzik Yellow Timing",
description = ""
)
default boolean VerzikYellow() {
return false;
}
@ConfigItem(
position = 17,
keyName = "Verzik Nylo",
name = "Verzik Nylo Overlay",
description = ""
)
default boolean NyloTargetOverlay() {
return false;
}
@ConfigItem(
position = 18,
keyName = "VerzikTankTile",
name = "Verzik P3 Tile Overlay",
description = ""
)
default boolean verzikTankTile() {
return true;
}
}

View File

@@ -8,27 +8,21 @@
package net.runelite.client.plugins.ztob;
import net.runelite.api.Point;
import net.runelite.api.*;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldArea;
import net.runelite.api.coords.WorldPoint;
import net.runelite.client.ui.overlay.*;
import javax.inject.Inject;
import java.awt.*;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import net.runelite.api.*;
import net.runelite.api.Point;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldArea;
import net.runelite.api.coords.WorldPoint;
import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayLayer;
import net.runelite.client.ui.overlay.OverlayPosition;
import net.runelite.client.ui.overlay.OverlayPriority;
import net.runelite.client.ui.overlay.OverlayUtil;
public class TheatreOverlay extends Overlay {
private final Client client;
private final TheatrePlugin plugin;
private final TheatreConfig config;
@@ -43,69 +37,71 @@ public class TheatreOverlay extends Overlay {
}
@Override
public Dimension render(Graphics2D graphics)
{
if (plugin.isRunMaiden())
{
if (config.MaidenBlood())
{
for (WorldPoint point : plugin.getMaiden_BloodSpatters())
{
drawTile(graphics, point, new Color(0,150,200), 2, 150, 10);
public Dimension render(Graphics2D graphics) {
if (plugin.isRunMaiden()) {
if (config.MaidenBlood()) {
for (WorldPoint point : plugin.getMaiden_BloodSpatters()) {
drawTile(graphics, point, new Color(36, 248, 229), 2, 150, 10);
}
}
if (config.MaidenSpawns())
{
for (WorldPoint point : plugin.getMaiden_SpawnLocations())
{
drawTile(graphics, point, new Color(0,150,200), 2, 180, 20);
if (config.MaidenSpawns()) {
for (WorldPoint point : plugin.getMaiden_SpawnLocations()) {
drawTile(graphics, point, new Color(36, 248, 229), 2, 180, 20);
}
for (WorldPoint point : plugin.getMaiden_SpawnLocations2())
{
drawTile(graphics, point, new Color(0,150,200), 1,120, 10);
for (WorldPoint point : plugin.getMaiden_SpawnLocations2()) {
drawTile(graphics, point, new Color(36, 248, 229), 1, 120, 10);
}
}
}
if (plugin.isRunBloat())
{
if (plugin.isRunBloat() && config.BloatIndicator()) {
if (config.bloatFeetIndicator()) {
if (plugin.getTemp().size() > 0) {
if (plugin.isTempFlag()) {
for (WorldPoint point : plugin.getTemp()) {
if (config.BloatHands())
{
for (WorldPoint p : plugin.getBloat_Hands())
{
drawTile(graphics, p, Color.BLACK,3,255,0);
drawTile(graphics, point, Color.black, 4, 255, 0);
}
}
} else if (plugin.getTemp2().size() > 0) {
if (plugin.isTemp2Flag()) {
for (WorldPoint point : plugin.getTemp2()) {
drawTile(graphics, point, Color.black, 4, 255, 0);
}
}
}
}
if(config.BloatIndicator()) {
NPC bloat = plugin.getBloat_NPC();
int state = plugin.getBloat_State();
if (bloat == null) {
return null;
}
switch (state) {
case 2:
renderNpcOverlay(graphics, bloat, Color.GREEN, 3, 150, 0);
break;
case 3:
renderNpcOverlay(graphics, bloat, Color.YELLOW, 3, 150, 0);
break;
default:
renderNpcOverlay(graphics, bloat, new Color(223, 109, 255), 3, 150, 0);
break;
}
NPC bloat = plugin.getBloat_NPC();
int state = plugin.getBloat_State();
if (bloat == null) {
return null;
}
switch (state) {
case 2:
renderNpcOverlay(graphics, bloat, Color.GREEN, 3, 150, 0);
break;
case 3:
renderNpcOverlay(graphics, bloat, Color.YELLOW, 3, 150, 0);
break;
default:
renderNpcOverlay(graphics, bloat, new Color(223, 109, 255), 3, 150, 0);
break;
}
}
if (plugin.isRunNylocas())
{
if (config.NyloPillars())
{
if (plugin.isRunNylocas()) {
if (config.NyloPillars()) {
Map<NPC, Integer> pillars = plugin.getNylocas_Pillars();
for (NPC npc : pillars.keySet()) {
final int health = pillars.get(npc);
final String healthStr = String.valueOf(health) + "%";
final String healthStr = health + "%";
WorldPoint p = npc.getWorldLocation();
LocalPoint lp = LocalPoint.fromWorld(client, p.getX() + 1, p.getY() + 1);
final double rMod = 130.0 * health / 100.0;
@@ -118,41 +114,34 @@ public class TheatreOverlay extends Overlay {
}
}
if (config.NyloBlasts())
{
if (config.NyloBlasts()) {
final Map<NPC, Integer> npcMap = plugin.getNylocas_Map();
for (NPC npc : npcMap.keySet())
{
for (NPC npc : npcMap.keySet()) {
int ticksLeft = npcMap.get(npc);
if (ticksLeft > -1) {
if (ticksLeft <= 6) {
Color color = new Color(255, 255,0 ,180);
Color color = new Color(255, 255, 0, 180);
int outlineWidth = 2;
int outlineAlpha = 150;
renderNpcOverlay(graphics, npc, color, outlineWidth, outlineAlpha, 0);
renderNpcOverlay(graphics, npc, color, outlineWidth, outlineAlpha, 15);
}
}
}
}
}
if (plugin.isRunSotetseg())
{
if (config.SotetsegMaze1())
{
if (plugin.isRunSotetseg()) {
if (config.SotetsegMaze1()) {
int i = 1;
for (GroundObject z : plugin.getRedTiles().keySet())
{
Polygon poly = z.getCanvasTilePoly();
if (poly != null)
{
for (GroundObject o : plugin.getRedTiles().keySet()) {
Polygon poly = o.getCanvasTilePoly();
if (poly != null) {
graphics.setColor(Color.WHITE);
graphics.setStroke(new BasicStroke(2));
graphics.draw(poly);
}
Point textLocation = z.getCanvasTextLocation(graphics, String.valueOf(i), 0);
if (textLocation != null)
{
Point textLocation = o.getCanvasTextLocation(graphics, String.valueOf(i), 0);
if (textLocation != null) {
OverlayUtil.renderTextLocation(graphics, textLocation, String.valueOf(i), Color.WHITE);
}
@@ -160,111 +149,111 @@ public class TheatreOverlay extends Overlay {
}
}
if (config.SotetsegMaze2())
{
for (WorldPoint p : plugin.getRedTilesOverworld())
{
if (config.SotetsegMaze2()) {
for (WorldPoint p : plugin.getRedTilesOverworld()) {
drawTile(graphics, p, Color.WHITE, 2, 255, 10);
}
}
if (config.SotetsegTick()) {
NPC boss = plugin.getSotetseg_NPC();
int eattick = plugin.getTickTillEat();
if (eattick > -1)
{
final String eatTicksStr = String.valueOf(eattick);
Point canvasPoint = boss.getCanvasTextLocation(graphics, eatTicksStr, 130);
renderTextLocation(graphics, eatTicksStr, 12, Font.BOLD, Color.WHITE, canvasPoint);
}
}
}
if (plugin.isRunXarpus())
{
if (plugin.isRunXarpus()) {
NPC boss = plugin.getXarpus_NPC();
if (boss.getId() == NpcID.XARPUS_8340 && !plugin.isXarpus_Stare() && config.XarpusTick())
{
if (boss.getId() == NpcID.XARPUS_8340 && !plugin.isXarpus_Stare() && config.XarpusTick()) {
int tick = plugin.getXarpus_TicksUntilShoot();
if (tick < 1)
{
if (tick < 1) {
tick = tick % 4 + 4;
}
final String ticksLeftStr = String.valueOf(tick);
Point canvasPoint = boss.getCanvasTextLocation(graphics, ticksLeftStr, 130);
renderTextLocation(graphics, ticksLeftStr, 12, Font.BOLD, Color.WHITE, canvasPoint);
}
if (boss.getId() == NpcID.XARPUS_8339 && config.XarpusExhumed())
{
for (GroundObject o : plugin.getXarpus_Exhumeds().keySet())
{
if (boss.getId() == NpcID.XARPUS_8339 && config.XarpusExhumed()) {
for (GroundObject o : plugin.getXarpus_Exhumeds().keySet()) {
Polygon poly = o.getCanvasTilePoly();
if (poly != null)
{
if (poly != null) {
graphics.setColor(new Color(0, 255, 0, 130));
graphics.setStroke(new BasicStroke(1));
graphics.draw(poly);
}
}
for (Map.Entry<GroundObject, Integer> exhumes : plugin.getXarpusExhumedsTimer().entrySet()) {
final String ticksremaining = String.valueOf(exhumes.getValue());
if (Integer.valueOf(ticksremaining) > 0) {
GroundObject ex = exhumes.getKey();
Point point = ex.getCanvasTextLocation(graphics, ticksremaining, 0);
renderTextLocation(graphics, ticksremaining, 12, Font.BOLD, Color.white, point);
}
}
}
}
if (plugin.isRunVerzik())
{
if (config.VerzikCupcakes())
{
for (WorldPoint p : plugin.getVerzik_RangeProjectiles().values())
{
if (plugin.isRunVerzik()) {
if (config.VerzikCupcakes()) {
for (WorldPoint p : plugin.getVerzik_RangeProjectiles().values()) {
drawTile(graphics, p, Color.RED, 2, 180, 50);
}
}
if (config.VerzikYellow())
{
for (WorldPoint p : plugin.getVerzik_YellowTiles())
{
drawTile(graphics, p, Color.YELLOW,3,255,0);
if (config.VerzikYellow()) {
for (WorldPoint p : plugin.getVerzik_YellowTiles()) {
drawTile(graphics, p, Color.YELLOW, 3, 255, 0);
Projectile yellowBall = plugin.getVerzik_YellowBall();
if (yellowBall != null)
{
final int ticksToImpact = yellowBall.getRemainingCycles()/30;
if (yellowBall != null) {
final int ticksToImpact = yellowBall.getRemainingCycles() / 30;
final String countdownStr = String.valueOf(ticksToImpact);
Point canvasPoint = Perspective.getCanvasTextLocation(client, graphics, LocalPoint.fromWorld(client, p), countdownStr, 0);
renderTextLocation(graphics, countdownStr, 12, Font.BOLD, Color.WHITE, canvasPoint);
}
}
}
if (plugin.getVerzik_NPC_P3() != null) {
final NPC boss = plugin.getVerzik_NPC_P3();
if (boss.getId() == NpcID.VERZIK_VITUR_8374)
{
if (config.VerzikTick())
{
final int ticksLeft = plugin.getP3_TicksUntilAttack();
if (ticksLeft > 0 && ticksLeft < 8)
{
final String ticksLeftStr = String.valueOf(ticksLeft);
Point canvasPoint = boss.getCanvasTextLocation(graphics, ticksLeftStr, 60);
renderTextLocation(graphics, ticksLeftStr, 15, Font.BOLD, Color.WHITE, canvasPoint);
}
final NPC boss = plugin.getVerzik_NPC();
if (boss.getId() == NpcID.VERZIK_VITUR_8374) {
if (config.verzikTankTile()) {
renderNpcOverlay(graphics, boss, new Color(75, 0, 130), 1, 255, 0);
}
if (config.VerzikTick()) {
final int ticksLeft = plugin.getP3_TicksUntilAttack();
if (ticksLeft > 0 && ticksLeft < 8) {
final String ticksLeftStr = String.valueOf(ticksLeft);
Point canvasPoint = boss.getCanvasTextLocation(graphics, ticksLeftStr, 60);
renderTextLocation(graphics, ticksLeftStr, 15, Font.BOLD, Color.WHITE, canvasPoint);
}
}
if (config.VerzikMelee() && boss.getAnimation() != 8127)
{
List<WorldPoint> meleeRange = getHitSquares(boss.getWorldLocation(), 7, 1, false);
if (config.VerzikMelee()) {
List<WorldPoint> meleeRange = getHitSquares(boss.getWorldLocation(), 7, 1, false);
for (WorldPoint p : meleeRange)
{
drawTile(graphics, p, Color.WHITE, 1,155, 10);
}
for (WorldPoint p : meleeRange) {
drawTile(graphics, p, Color.WHITE, 1, 155, 10);
}
}
}
if (boss.getAnimation() == 8117) {
final int ticksLeft = plugin.getRedCrabsTimer();
if (ticksLeft > 0) {
final String ticksLeftStr = String.valueOf(ticksLeft);
Point canvasPoint = boss.getCanvasTextLocation(graphics, ticksLeftStr, 60);
renderTextLocation(graphics, ticksLeftStr, 15, Font.BOLD, Color.WHITE, canvasPoint);
}
}
}
return null;
}
@@ -290,19 +279,16 @@ public class TheatreOverlay extends Overlay {
graphics.fill(poly);
}
private void renderNpcOverlay(Graphics2D graphics, NPC actor, Color color, int outlineWidth, int outlineAlpha, int fillAlpha)
{
private void renderNpcOverlay(Graphics2D graphics, NPC actor, Color color, int outlineWidth, int outlineAlpha, int fillAlpha) {
int size = 1;
NPCComposition composition = actor.getTransformedComposition();
if (composition != null)
{
if (composition != null) {
size = composition.getSize();
}
LocalPoint lp = actor.getLocalLocation();
Polygon tilePoly = Perspective.getCanvasTileAreaPoly(client, lp, size);
if (tilePoly != null)
{
if (tilePoly != null) {
graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), outlineAlpha));
graphics.setStroke(new BasicStroke(outlineWidth));
graphics.draw(tilePoly);
@@ -311,37 +297,31 @@ public class TheatreOverlay extends Overlay {
}
}
private void renderTextLocation(Graphics2D graphics, String txtString, int fontSize, int fontStyle, Color fontColor, Point canvasPoint)
{
private void renderTextLocation(Graphics2D graphics, String txtString, int fontSize, int fontStyle, Color fontColor, Point canvasPoint) {
graphics.setFont(new Font("Arial", fontStyle, fontSize));
if (canvasPoint != null)
{
if (canvasPoint != null) {
final Point canvasCenterPoint = new Point(
canvasPoint.getX(),
canvasPoint.getY());
final Point canvasCenterPoint_shadow = new Point(
canvasPoint.getX() + 1,
canvasPoint.getY() + 1) ;
canvasPoint.getY() + 1);
OverlayUtil.renderTextLocation(graphics, canvasCenterPoint_shadow, txtString, Color.BLACK);
OverlayUtil.renderTextLocation(graphics, canvasCenterPoint, txtString, fontColor);
}
}
private List<WorldPoint> getHitSquares(WorldPoint npcLoc, int npcSize, int thickness, boolean includeUnder)
{
private List<WorldPoint> getHitSquares(WorldPoint npcLoc, int npcSize, int thickness, boolean includeUnder) {
List<WorldPoint> little = new WorldArea(npcLoc, npcSize, npcSize).toWorldPointList();
List<WorldPoint> big = new WorldArea(npcLoc.getX()-thickness, npcLoc.getY()-thickness, npcSize + (thickness * 2), npcSize + (thickness * 2), npcLoc.getPlane()).toWorldPointList();
if (!includeUnder)
{
for (Iterator<WorldPoint> it = big.iterator(); it.hasNext();)
{
List<WorldPoint> big = new WorldArea(npcLoc.getX() - thickness, npcLoc.getY() - thickness, npcSize + (thickness * 2), npcSize + (thickness * 2), npcLoc.getPlane()).toWorldPointList();
if (!includeUnder) {
for (Iterator<WorldPoint> it = big.iterator(); it.hasNext(); ) {
WorldPoint p = it.next();
if (little.contains(p))
{
if (little.contains(p)) {
it.remove();
}
}
}
return big;
}
}
}

View File

@@ -0,0 +1,68 @@
package net.runelite.client.plugins.ztob;
import com.google.inject.Inject;
import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayMenuEntry;
import net.runelite.client.ui.overlay.OverlayPosition;
import net.runelite.client.ui.overlay.components.LineComponent;
import net.runelite.client.ui.overlay.components.PanelComponent;
import net.runelite.client.ui.overlay.components.TitleComponent;
import java.awt.*;
import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG;
import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE;
public class TheatreXarpusOverlay extends Overlay {
private final TheatrePlugin plugin;
private final TheatreConfig config;
PanelComponent panelComponent = new PanelComponent();
@Inject
private TheatreXarpusOverlay(TheatrePlugin plugin, TheatreConfig config) {
super(plugin);
setPosition(OverlayPosition.ABOVE_CHATBOX_RIGHT);
setPosition(OverlayPosition.DYNAMIC);
setPosition(OverlayPosition.DETACHED);
this.plugin = plugin;
this.config = config;
getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "Theatre xarpus overlay"));
}
@Override
public Dimension render(Graphics2D graphics) {
if (plugin.isRunXarpus()) {
if (config.XarpusExhumeOverlay()) {
if (plugin.getXarpus_NPC().getId() == 8339) {
panelComponent.getChildren().clear();
String overlayTitle = "Exhume Counter";
// Build overlay title
panelComponent.getChildren().add(TitleComponent.builder()
.text(overlayTitle)
.color(Color.GREEN)
.build());
//Set the size of overlay
panelComponent.setPreferredSize(new Dimension(
graphics.getFontMetrics().stringWidth(overlayTitle) + 30, 0
));
panelComponent.getChildren().add(LineComponent.builder()
.left("Exhumes: ")
.right(String.valueOf(plugin.getExhumecount()))
.build());
}
}
return panelComponent.render(graphics);
}
return null;
}
}

View File

@@ -0,0 +1,81 @@
package net.runelite.client.plugins.ztob;
import net.runelite.api.Client;
import net.runelite.api.NPC;
import net.runelite.api.Point;
import net.runelite.client.ui.overlay.*;
import javax.inject.Inject;
import java.awt.*;
public class VerzikNyloOverlay extends Overlay {
private final Client client;
private final TheatrePlugin plugin;
private final TheatreConfig config;
@Inject
private VerzikNyloOverlay(Client client, TheatrePlugin plugin, TheatreConfig config) {
this.client = client;
this.plugin = plugin;
this.config = config;
setPosition(OverlayPosition.DYNAMIC);
setPriority(OverlayPriority.HIGH);
setLayer(OverlayLayer.ABOVE_SCENE);
}
public Dimension render(Graphics2D graphics) {
if (plugin.isRunVerzik()) {
if (config.NyloTargetOverlay()) {
if (plugin.getCrabList().size() > 0) {
for (NPC npc : plugin.getCrabList()) {
if (npc.isDead()) {
continue;
}
String renderText = "";
if (npc.getInteracting() != null) {
renderText = npc.getInteracting().getName();
Point point = npc.getCanvasTextLocation(graphics, npc.getInteracting().getName(), 0);
if (npc.getInteracting().getName().toLowerCase().equals(client.getLocalPlayer().getName().toLowerCase())) {
point = npc.getCanvasTextLocation(graphics, client.getLocalPlayer().getName(), 0);
renderText = "YOU NIGGA RUN!";
} else if (npc.getInteracting().getName().toLowerCase().equals("afyy")) {
point = npc.getCanvasTextLocation(graphics, "Ricecup", 0);
renderText = "Ricecup";
}
if (renderText.equals("YOU NIGGA RUN!")) {
renderTextLocation(graphics, renderText, 12, Font.BOLD, Color.RED, point);
} else {
renderTextLocation(graphics, renderText, 12, Font.BOLD, Color.GREEN, point);
}
}
}
}
}
}
return null;
}
private void renderTextLocation(Graphics2D graphics, String txtString, int fontSize, int fontStyle, Color fontColor, Point canvasPoint) {
graphics.setFont(new Font("Arial", fontStyle, fontSize));
if (canvasPoint != null) {
final Point canvasCenterPoint = new Point(
canvasPoint.getX(),
canvasPoint.getY());
final Point canvasCenterPoint_shadow = new Point(
canvasPoint.getX() + 1,
canvasPoint.getY() + 1);
OverlayUtil.renderTextLocation(graphics, canvasCenterPoint_shadow, txtString, Color.BLACK);
OverlayUtil.renderTextLocation(graphics, canvasCenterPoint, txtString, fontColor);
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 624 B