Merge remote-tracking branch 'runelite/master'

This commit is contained in:
Owain van Brakel
2022-04-27 13:54:52 +02:00
20 changed files with 1729 additions and 202 deletions

View File

@@ -250,15 +250,6 @@ public enum ItemMapping
BLACK_MASK_I_25276, BLACK_MASK_1_I_25275, BLACK_MASK_2_I_25274, BLACK_MASK_3_I_25273, BLACK_MASK_4_I_25272, BLACK_MASK_5_I_25271, BLACK_MASK_6_I_25270, BLACK_MASK_7_I_25269, BLACK_MASK_8_I_25268, BLACK_MASK_9_I_25267, BLACK_MASK_10_I_25266,
TZTOK_SLAYER_HELMET, TZTOK_SLAYER_HELMET_I, TZTOK_SLAYER_HELMET_I_25902, VAMPYRIC_SLAYER_HELMET, VAMPYRIC_SLAYER_HELMET_I, VAMPYRIC_SLAYER_HELMET_I_25908, TZKAL_SLAYER_HELMET, TZKAL_SLAYER_HELMET_I, TZKAL_SLAYER_HELMET_I_25914),
// Pharaoh's Sceptres
ITEM_PHARAOHS_SCEPTRE_1(PHARAOHS_SCEPTRE, PHARAOHS_SCEPTRE_1),
ITEM_PHARAOHS_SCEPTRE_2(PHARAOHS_SCEPTRE, PHARAOHS_SCEPTRE_2),
ITEM_PHARAOHS_SCEPTRE_4(PHARAOHS_SCEPTRE, PHARAOHS_SCEPTRE_4),
ITEM_PHARAOHS_SCEPTRE_5(PHARAOHS_SCEPTRE, PHARAOHS_SCEPTRE_5),
ITEM_PHARAOHS_SCEPTRE_6(PHARAOHS_SCEPTRE, PHARAOHS_SCEPTRE_6),
ITEM_PHARAOHS_SCEPTRE_7(PHARAOHS_SCEPTRE, PHARAOHS_SCEPTRE_7),
ITEM_PHARAOHS_SCEPTRE_8(PHARAOHS_SCEPTRE, PHARAOHS_SCEPTRE_8),
// Revertible items
ITEM_HYDRA_LEATHER(HYDRA_LEATHER, FEROCIOUS_GLOVES),
ITEM_HYDRA_TAIL(HYDRA_TAIL, BONECRUSHER_NECKLACE),

View File

@@ -82,7 +82,7 @@ public class BankPlugin extends Plugin
private static final String SEED_VAULT_TITLE = "Seed Vault";
private static final String NUMBER_REGEX = "[0-9]+(\\.[0-9]+)?[kmb]?";
private static final Pattern VALUE_SEARCH_PATTERN = Pattern.compile("^(?<mode>ge|ha|alch)?" +
private static final Pattern VALUE_SEARCH_PATTERN = Pattern.compile("^(?<mode>qty|ge|ha|alch)?" +
" *(((?<op>[<>=]|>=|<=) *(?<num>" + NUMBER_REGEX + "))|" +
"((?<num1>" + NUMBER_REGEX + ") *- *(?<num2>" + NUMBER_REGEX + ")))$", Pattern.CASE_INSENSITIVE);
@@ -413,13 +413,26 @@ public class BankPlugin extends Plugin
final int qty = itemQuantities.count(itemId);
final long gePrice = (long) itemManager.getItemPrice(itemId) * qty;
final long haPrice = (long) itemComposition.getHaPrice() * qty;
final boolean isPlaceholder = itemComposition.getPlaceholderTemplateId() != -1;
long value = Math.max(gePrice, haPrice);
final String mode = matcher.group("mode");
if (mode != null)
{
value = mode.toLowerCase().equals("ge") ? gePrice : haPrice;
switch (mode.toLowerCase())
{
case "qty":
value = isPlaceholder ? 0 : qty;
break;
case "ge":
value = gePrice;
break;
case "ha":
case "alch":
value = haPrice;
break;
}
}
final String op = matcher.group("op");

View File

@@ -107,7 +107,7 @@ import org.apache.commons.text.WordUtils;
public class ChatCommandsPlugin extends Plugin
{
private static final Pattern KILLCOUNT_PATTERN = Pattern.compile("Your (?:completion count for |subdued |completed )?(.+?) (?:(?:kill|harvest|lap|completion) )?(?:count )?is: <col=ff0000>(\\d+)</col>");
private static final String TEAM_SIZES = "(?<teamsize>\\d+(?:\\+|-\\d+)? players|Solo)";
private static final String TEAM_SIZES = "(?<teamsize>\\d+(?:\\+|-\\d+)? players?|Solo)";
private static final Pattern RAIDS_PB_PATTERN = Pattern.compile("<col=ef20ff>Congratulations - your raid is complete!</col><br>Team size: <col=ff0000>" + TEAM_SIZES + "</col> Duration:</col> <col=ff0000>(?<pb>[0-9:]+(?:\\.[0-9]+)?)</col> \\(new personal best\\)</col>");
private static final Pattern RAIDS_DURATION_PATTERN = Pattern.compile("<col=ef20ff>Congratulations - your raid is complete!</col><br>Team size: <col=ff0000>" + TEAM_SIZES + "</col> Duration:</col> <col=ff0000>[0-9:.]+</col> Personal best: </col><col=ff0000>(?<pb>[0-9:]+(?:\\.[0-9]+)?)</col>");
private static final Pattern KILL_DURATION_PATTERN = Pattern.compile("(?i)(?:(?:Fight |Lap |Challenge |Corrupted challenge )?duration:|Subdued in|(?<!total )completion time:) <col=[0-9a-f]{6}>[0-9:.]+</col>\\. Personal best: (?:<col=ff0000>)?(?<pb>[0-9:]+(?:\\.[0-9]+)?)");
@@ -115,7 +115,7 @@ public class ChatCommandsPlugin extends Plugin
private static final Pattern DUEL_ARENA_WINS_PATTERN = Pattern.compile("You (were defeated|won)! You have(?: now)? won ([\\d,]+|one) duels?");
private static final Pattern DUEL_ARENA_LOSSES_PATTERN = Pattern.compile("You have(?: now)? lost ([\\d,]+|one) duels?");
private static final Pattern ADVENTURE_LOG_TITLE_PATTERN = Pattern.compile("The Exploits of (.+)");
private static final Pattern ADVENTURE_LOG_PB_PATTERN = Pattern.compile("Fastest (?:kill|run)(?: - \\(Team size: " + TEAM_SIZES + "\\))?: (?<time>[0-9:]+(?:\\.[0-9]+)?)");
private static final Pattern ADVENTURE_LOG_PB_PATTERN = Pattern.compile("Fastest (?:kill|run|Room time)(?: - \\(Team size: \\(?" + TEAM_SIZES + "\\)\\)?)?: (?<time>[0-9:]+(?:\\.[0-9]+)?)");
private static final Pattern HS_PB_PATTERN = Pattern.compile("Floor (?<floor>\\d) time: <col=ff0000>(?<floortime>[0-9:]+(?:\\.[0-9]+)?)</col>(?: \\(new personal best\\)|. Personal best: (?<floorpb>[0-9:]+(?:\\.[0-9]+)?))" +
"(?:<br>Overall time: <col=ff0000>(?<otime>[0-9:]+(?:\\.[0-9]+)?)</col>(?: \\(new personal best\\)|. Personal best: (?<opb>[0-9:]+(?:\\.[0-9]+)?)))?");
private static final Pattern HS_KC_FLOOR_PATTERN = Pattern.compile("You have completed Floor (\\d) of the Hallowed Sepulchre! Total completions: <col=ff0000>([0-9,]+)</col>\\.");
@@ -673,7 +673,6 @@ public class ChatCommandsPlugin extends Plugin
for (int i = 0; i < text.length; ++i)
{
String boss = longBossName(text[i]);
double pb = Double.MAX_VALUE;
for (i = i + 1; i < text.length; ++i)
{
@@ -683,19 +682,35 @@ public class ChatCommandsPlugin extends Plugin
break;
}
// Some bosses have multiple pbs for each team size, just use the lowest
Matcher matcher = ADVENTURE_LOG_PB_PATTERN.matcher(line);
if (matcher.find())
{
double s = timeStringToSeconds(matcher.group("time"));
pb = Math.min(pb, s);
}
}
final double s = timeStringToSeconds(matcher.group("time"));
String teamSize = matcher.group("teamsize");
if (teamSize != null)
{
// 3 player -> 3 players
// 1 player -> Solo
// Solo -> Solo
// 2 players -> 2 players
if (teamSize.equals("1 player"))
{
teamSize = "Solo";
}
else if (teamSize.endsWith("player"))
{
teamSize = teamSize + "s";
}
if (pb < Double.MAX_VALUE)
{
log.debug("Found adventure log PB for {}: {}", boss, pb);
setPb(boss, pb);
log.debug("Found team-size adventure log PB for {} {}: {}", boss, teamSize, s);
setPb(boss + " " + teamSize, s);
}
else
{
log.debug("Found adventure log PB for {}: {}", boss, s);
setPb(boss, s);
}
}
}
}
}

View File

@@ -204,7 +204,7 @@ public class EmoteClue extends ClueScroll implements TextClueScroll, LocationClu
new EmoteClue("Wave in the Falador gem store. Equip a Mithril pickaxe, Black platebody and an Iron Kiteshield.", "Falador", NEAR_HERQUINS_SHOP_IN_FALADOR, new WorldPoint(2945, 3335, 0), WAVE, item(MITHRIL_PICKAXE), item(BLACK_PLATEBODY), item(IRON_KITESHIELD)),
new EmoteClue("Wave on Mudskipper Point. Equip a black cape, leather chaps and a steel mace.", "Mudskipper Point", MUDSKIPPER_POINT, new WorldPoint(2989, 3110, 0), WAVE, item(BLACK_CAPE), item(LEATHER_CHAPS), item(STEEL_MACE)),
new EmoteClue("Wave on the northern wall of Castle Drakan. Beware of double agents! Wear a dragon sq shield, splitbark body and any boater.", "Castle Drakan", NORTHERN_WALL_OF_CASTLE_DRAKAN, new WorldPoint(3562, 3379, 0), DOUBLE_AGENT_141, WAVE, any("Dragon sq shield", item(DRAGON_SQ_SHIELD), item(DRAGON_SQ_SHIELD_G)), item(SPLITBARK_BODY), any("Any boater", item(RED_BOATER), item(ORANGE_BOATER), item(GREEN_BOATER), item(BLUE_BOATER), item(BLACK_BOATER), item(PINK_BOATER), item(PURPLE_BOATER), item(WHITE_BOATER))),
new EmoteClue("Yawn in the 7th room of Pyramid Plunder. Beware of double agents! Equip a pharaoh sceptre and a full set of menaphite robes.", "Pyramid Plunder", _7TH_CHAMBER_OF_JALSAVRAH, new WorldPoint(1944, 4427, 0), DOUBLE_AGENT_141, YAWN, any("Pharaoh's sceptre", item(PHARAOHS_SCEPTRE), item(PHARAOHS_SCEPTRE_1), item(PHARAOHS_SCEPTRE_2), item(PHARAOHS_SCEPTRE_3), item(PHARAOHS_SCEPTRE_4), item(PHARAOHS_SCEPTRE_5), item(PHARAOHS_SCEPTRE_6), item(PHARAOHS_SCEPTRE_7), item(PHARAOHS_SCEPTRE_8)), any("Full set of menaphite robes", all(item(MENAPHITE_PURPLE_HAT), item(MENAPHITE_PURPLE_TOP), range(MENAPHITE_PURPLE_ROBE, MENAPHITE_PURPLE_KILT)), all(item(MENAPHITE_RED_HAT), item(MENAPHITE_RED_TOP), range(MENAPHITE_RED_ROBE, MENAPHITE_RED_KILT)))),
new EmoteClue("Yawn in the 7th room of Pyramid Plunder. Beware of double agents! Equip a pharaoh sceptre and a full set of menaphite robes.", "Pyramid Plunder", _7TH_CHAMBER_OF_JALSAVRAH, new WorldPoint(1944, 4427, 0), DOUBLE_AGENT_141, YAWN, any("Pharaoh's sceptre", item(PHARAOHS_SCEPTRE), item(PHARAOHS_SCEPTRE), item(PHARAOHS_SCEPTRE_9045), item(PHARAOHS_SCEPTRE_9046), item(PHARAOHS_SCEPTRE_9047), item(PHARAOHS_SCEPTRE_9048), item(PHARAOHS_SCEPTRE_9049), item(PHARAOHS_SCEPTRE_9050), item(PHARAOHS_SCEPTRE_9051), item(PHARAOHS_SCEPTRE_13074), item(PHARAOHS_SCEPTRE_13075), item(PHARAOHS_SCEPTRE_13077), item(PHARAOHS_SCEPTRE_13078), item(PHARAOHS_SCEPTRE_16176), item(PHARAOHS_SCEPTRE_21445), item(PHARAOHS_SCEPTRE_21446), item(PHARAOHS_SCEPTRE_26948), item(PHARAOHS_SCEPTRE_26950)), any("Full set of menaphite robes", all(item(MENAPHITE_PURPLE_HAT), item(MENAPHITE_PURPLE_TOP), range(MENAPHITE_PURPLE_ROBE, MENAPHITE_PURPLE_KILT)), all(item(MENAPHITE_RED_HAT), item(MENAPHITE_RED_TOP), range(MENAPHITE_RED_ROBE, MENAPHITE_RED_KILT)))),
new EmoteClue("Yawn in the Varrock library. Equip a green gnome robe top, HAM robe bottom and an iron warhammer.", "Varrock Castle", VARROCK_PALACE_LIBRARY, new WorldPoint(3209, 3492, 0), YAWN, item(GREEN_ROBE_TOP), item(HAM_ROBE), item(IRON_WARHAMMER)),
new EmoteClue("Yawn in Draynor Marketplace. Equip studded leather chaps, an iron kiteshield and a steel longsword.", "Draynor", DRAYNOR_VILLAGE_MARKET, new WorldPoint(3083, 3253, 0), YAWN, item(STUDDED_CHAPS), item(IRON_KITESHIELD), item(STEEL_LONGSWORD)),
new EmoteClue("Yawn in the Castle Wars lobby. Shrug before you talk to me. Equip a ruby amulet, a mithril scimitar and a Wilderness cape.", "Castle Wars", CASTLE_WARS_BANK, new WorldPoint(2440, 3092, 0), YAWN, SHRUG, item(RUBY_AMULET), item(MITHRIL_SCIMITAR), range("Any team cape", TEAM1_CAPE, TEAM50_CAPE)),

View File

@@ -266,14 +266,6 @@ enum ItemWithCharge
PASSAGE3(TELEPORT, NECKLACE_OF_PASSAGE3, 3),
PASSAGE4(TELEPORT, NECKLACE_OF_PASSAGE4, 4),
PASSAGE5(TELEPORT, NECKLACE_OF_PASSAGE5, 5),
PHARAO1(TELEPORT, PHARAOHS_SCEPTRE_1, 1),
PHARAO2(TELEPORT, PHARAOHS_SCEPTRE_2, 2),
PHARAO3(TELEPORT, PHARAOHS_SCEPTRE_3, 3),
PHARAO4(TELEPORT, PHARAOHS_SCEPTRE_4, 4),
PHARAO5(TELEPORT, PHARAOHS_SCEPTRE_5, 5),
PHARAO6(TELEPORT, PHARAOHS_SCEPTRE_6, 6),
PHARAO7(TELEPORT, PHARAOHS_SCEPTRE_7, 7),
PHARAO8(TELEPORT, PHARAOHS_SCEPTRE_8, 8),
PRAYER1(POTION, PRAYER_POTION1, 1),
PRAYER2(POTION, PRAYER_POTION2, 2),
PRAYER3(POTION, PRAYER_POTION3, 3),

View File

@@ -37,15 +37,9 @@ import lombok.Getter;
import net.runelite.api.Client;
import net.runelite.api.GameObject;
import net.runelite.api.GameState;
import static net.runelite.api.ItemID.PHARAOHS_SCEPTRE;
import static net.runelite.api.NullObjectID.*;
import static net.runelite.api.ObjectID.GRAND_GOLD_CHEST;
import static net.runelite.api.ObjectID.SARCOPHAGUS_21255;
import static net.runelite.api.ObjectID.SPEARTRAP_21280;
import static net.runelite.api.ObjectID.TOMB_DOOR_20948;
import static net.runelite.api.ObjectID.URN_21261;
import static net.runelite.api.ObjectID.URN_21262;
import static net.runelite.api.ObjectID.URN_21263;
import net.runelite.api.ItemID;
import net.runelite.api.NullObjectID;
import net.runelite.api.ObjectID;
import net.runelite.api.Tile;
import net.runelite.api.TileObject;
import net.runelite.api.Varbits;
@@ -78,21 +72,21 @@ public class PyramidPlunderPlugin extends Plugin
private static final Duration PYRAMID_PLUNDER_DURATION = Duration.of(501, RSTimeUnit.GAME_TICKS);
private static final int PYRAMID_PLUNDER_REGION = 7749;
static final Set<Integer> TOMB_DOOR_WALL_IDS = ImmutableSet.of(NULL_26618, NULL_26619, NULL_26620, NULL_26621);
static final int TOMB_DOOR_CLOSED_ID = TOMB_DOOR_20948;
static final Set<Integer> TOMB_DOOR_WALL_IDS = ImmutableSet.of(NullObjectID.NULL_26618, NullObjectID.NULL_26619, NullObjectID.NULL_26620, NullObjectID.NULL_26621);
static final int TOMB_DOOR_CLOSED_ID = ObjectID.TOMB_DOOR_20948;
static final int SPEARTRAP_ID = SPEARTRAP_21280;
static final int SPEARTRAP_ID = ObjectID.SPEARTRAP;
static final Set<Integer> URN_IDS = ImmutableSet.of(NULL_26580, NULL_26600, NULL_26601, NULL_26602,
NULL_26603, NULL_26604, NULL_26605, NULL_26606, NULL_26607, NULL_26608, NULL_26609, NULL_26610, NULL_26611,
NULL_26612, NULL_26613);
static final Set<Integer> URN_CLOSED_IDS = ImmutableSet.of(URN_21261, URN_21262, URN_21263);
static final Set<Integer> URN_IDS = ImmutableSet.of(NullObjectID.NULL_26580, NullObjectID.NULL_26600, NullObjectID.NULL_26601, NullObjectID.NULL_26602,
NullObjectID.NULL_26603, NullObjectID.NULL_26604, NullObjectID.NULL_26605, NullObjectID.NULL_26606, NullObjectID.NULL_26607, NullObjectID.NULL_26608,
NullObjectID.NULL_26609, NullObjectID.NULL_26610, NullObjectID.NULL_26611, NullObjectID.NULL_26612, NullObjectID.NULL_26613);
static final Set<Integer> URN_CLOSED_IDS = ImmutableSet.of(ObjectID.URN_21261, ObjectID.URN_21262, ObjectID.URN_21263);
static final int GRAND_GOLD_CHEST_ID = NULL_26616;
static final int GRAND_GOLD_CHEST_CLOSED_ID = GRAND_GOLD_CHEST;
static final int GRAND_GOLD_CHEST_ID = NullObjectID.NULL_26616;
static final int GRAND_GOLD_CHEST_CLOSED_ID = ObjectID.GRAND_GOLD_CHEST;
static final int SARCOPHAGUS_ID = NULL_26626;
static final int SARCOPHAGUS_CLOSED_ID = SARCOPHAGUS_21255;
static final int SARCOPHAGUS_ID = NullObjectID.NULL_26626;
static final int SARCOPHAGUS_CLOSED_ID = ObjectID.SARCOPHAGUS_21255;
@Inject
private Client client;
@@ -173,7 +167,7 @@ public class PyramidPlunderPlugin extends Plugin
{
int ppTimer = client.getVarbitValue(Varbits.PYRAMID_PLUNDER_TIMER);
Duration remaining = PYRAMID_PLUNDER_DURATION.minus(ppTimer, RSTimeUnit.GAME_TICKS);
timer = new PyramidPlunderTimer(remaining, itemManager.getImage(PHARAOHS_SCEPTRE), this,
timer = new PyramidPlunderTimer(remaining, itemManager.getImage(ItemID.PHARAOHS_SCEPTRE), this,
config, client);
infoBoxManager.addInfoBox(timer);
}

View File

@@ -738,7 +738,8 @@
],
"stone tablet": [
699,
22991
22991,
26954
],
"mixed chemicals": [
705,
@@ -1394,7 +1395,9 @@
25790,
25791,
25792,
26566
26566,
26943,
26944
],
"radimus notes": [
714,
@@ -1426,7 +1429,8 @@
755,
9633,
9649,
22475
22475,
26942
],
"book": [
757,
@@ -2490,7 +2494,8 @@
11027,
11028,
11029,
11030
11030,
26926
],
"banana": [
1963,
@@ -2508,7 +2513,12 @@
24994,
24996,
26417,
26419
26419,
26971,
26973,
26975,
26977,
26979
],
"empty cup": [
1980,
@@ -3326,10 +3336,6 @@
3716,
3743
],
"full bucket": [
3722,
4693
],
"sealed vase": [
3738,
3739,
@@ -5010,6 +5016,10 @@
10485,
10512
],
"chest": [
6759,
26955
],
"rat pole": [
6773,
6774,
@@ -6381,14 +6391,24 @@
],
"pharaohs sceptre": [
9044,
9045,
9046,
9047,
9048,
9049,
9050,
9051,
13074,
13075,
13076,
13077,
13078
13078,
16176,
21445,
21446,
26945,
26948,
26950
],
"emerald lantern": [
9064,
@@ -10387,6 +10407,10 @@
26256,
26258
],
"magical cleaning potion": [
26278,
26924
],
"secret santa present": [
26298,
26300,
@@ -10625,5 +10649,17 @@
26896,
26897,
26898
],
"vat": [
26932,
26933
],
"scarab emblem": [
26953,
26956
],
"circlet of water": [
26967,
26969
]
}

View File

@@ -1 +1 @@
3FA5FFC8DB18A42971CED41A9BC7CEA407A0EC98061D56B2822F66CD910E4BAF
7295A7B0C6DEBDBAB737A307974DAEF4AFD7DBD011B30AC45D2972FE75C54868

View File

@@ -1,21 +1,21 @@
.id 3238
.int_stack_count 4
.int_stack_count 5
.string_stack_count 0
.int_var_count 5 ; +1 for filter result
.int_var_count 6 ; +1 for filter result
.string_var_count 0
iconst -1 ; set to 1 to hide, 0 to show
iconst -1 ; set to 1 to hide, 0 to show
iload 0 ; quest struct
sconst "questFilter"
runelite_callback
runelite_callback
pop_int ; quest struct
istore 4 ; save result
istore 5 ; save result
; compare with -1
iload 4 ; load result
iconst -1
iload 5 ; load result
iconst -1
if_icmpeq continue
; return value
iload 4
return
iload 5
return
continue:
iload 0
@@ -48,12 +48,12 @@ LABEL22:
iconst 1
return
LABEL24:
iload 1
iconst 0
iload 4
iconst 1
if_icmpeq LABEL28
jump LABEL34
LABEL28:
get_varbit 13775
get_varbit 13890
iconst 1
if_icmpeq LABEL32
jump LABEL34
@@ -62,11 +62,11 @@ LABEL32:
return
LABEL34:
iload 1
iconst 1
iconst 0
if_icmpeq LABEL38
jump LABEL44
LABEL38:
get_varbit 13776
get_varbit 13775
iconst 1
if_icmpeq LABEL42
jump LABEL44
@@ -75,11 +75,11 @@ LABEL42:
return
LABEL44:
iload 1
iconst 2
iconst 1
if_icmpeq LABEL48
jump LABEL54
LABEL48:
get_varbit 13777
get_varbit 13776
iconst 1
if_icmpeq LABEL52
jump LABEL54
@@ -88,41 +88,54 @@ LABEL52:
return
LABEL54:
iload 1
iconst 1
if_icmpeq LABEL58
jump LABEL68
LABEL58:
get_varbit 13778
iconst 2
if_icmpeq LABEL58
jump LABEL64
LABEL58:
get_varbit 13777
iconst 1
if_icmpeq LABEL62
jump LABEL68
jump LABEL64
LABEL62:
iload 2
iconst 0
if_icmpeq LABEL66
jump LABEL68
LABEL66:
iconst 1
return
LABEL68:
LABEL64:
iload 1
iconst 1
if_icmpeq LABEL72
jump LABEL82
LABEL72:
get_varbit 13779
if_icmpeq LABEL68
jump LABEL78
LABEL68:
get_varbit 13778
iconst 2
if_icmpeq LABEL76
jump LABEL82
LABEL76:
iload 3
if_icmpeq LABEL72
jump LABEL78
LABEL72:
iload 2
iconst 0
if_icmpeq LABEL80
jump LABEL82
LABEL80:
if_icmpeq LABEL76
jump LABEL78
LABEL76:
iconst 1
return
LABEL78:
iload 1
iconst 1
if_icmpeq LABEL82
jump LABEL92
LABEL82:
get_varbit 13779
iconst 2
if_icmpeq LABEL86
jump LABEL92
LABEL86:
iload 3
iconst 0
if_icmpeq LABEL90
jump LABEL92
LABEL90:
iconst 1
return
LABEL92:
iconst 0
return
iconst -1

View File

@@ -0,0 +1,345 @@
/*
* Copyright (c) 2018, Ron Young <https://github.com/raiyni>
* 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.game;
import java.util.LinkedHashMap;
import java.util.Map;
import static net.runelite.api.ItemID.*;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class ItemVariationMappingTest
{
private static final Map<Integer, Integer> ITEMS_MAP = new LinkedHashMap<Integer, Integer>()
{{
put(_12_ANCHOVY_PIZZA, ANCHOVY_PIZZA);
put(_12_MEAT_PIZZA, MEAT_PIZZA);
put(_12_PINEAPPLE_PIZZA, PINEAPPLE_PIZZA);
put(_12_PLAIN_PIZZA, PLAIN_PIZZA);
put(ADAMANT_PLATELEGS_T, ADAMANT_PLATELEGS);
put(ADAMANT_PLATESKIRT_T, ADAMANT_PLATESKIRT);
put(AGILITY_CAPET, AGILITY_CAPE);
put(AGILITY_MIX1, AGILITY_MIX2);
put(AGILITY_MIX2, AGILITY_MIX2);
put(AHRIMS_ROBETOP_100, AHRIMS_ROBETOP);
put(AHRIMS_ROBETOP_25, AHRIMS_ROBETOP);
put(AHRIMS_ROBETOP_50, AHRIMS_ROBETOP);
put(AHRIMS_ROBETOP_75, AHRIMS_ROBETOP);
put(AHRIMS_STAFF_0, AHRIMS_STAFF);
put(AMULET_OF_GLORY5, AMULET_OF_GLORY);
put(AMULET_OF_GLORY6, AMULET_OF_GLORY);
put(AMULET_OF_MAGIC_T, AMULET_OF_MAGIC);
put(ANCIENT_PAGE_1, ANCIENT_PAGE);
put(ANCIENT_PAGE_2, ANCIENT_PAGE);
put(ANTIDOTE2, ANTIDOTE_UNF);
put(ANTIDOTE3, ANTIDOTE_UNF);
put(ANTIDOTE4, ANTIDOTE_UNF);
put(ANTIDOTE1_5958, ANTIDOTE_UNF);
put(ANTIDOTE2_5956, ANTIDOTE_UNF);
put(APPLES2, APPLES1);
put(APPLES3, APPLES1);
put(APPLES4, APPLES1);
put(APPLES5, APPLES1);
put(ARCHERS_RING_I, ARCHERS_RING);
put(ASGARNIAN_ALEM4, ASGARNIAN_ALE);
put(ATTACK_CAPET, ATTACK_CAPE);
put(ATTACK_MIX1, ATTACK_MIX2);
put(ATTACK_MIX2, ATTACK_MIX2);
put(ATTACK_POTION1, ATTACK_POTION3);
put(BANANAS2, BANANAS1);
put(BANANAS3, BANANAS1);
put(BANANAS4, BANANAS1);
put(BANANAS5, BANANAS1);
put(BANDOS_PAGE_1, BANDOS_PAGE_1);
put(BLACK_KITESHIELD_T, BLACK_KITESHIELD);
put(BLACK_MASK_1, BLACK_MASK_10);
put(BLACK_MASK_2, BLACK_MASK_10);
put(BLACK_MASK_3, BLACK_MASK_10);
put(BLACK_MASK_4, BLACK_MASK_10);
put(BLUE_SKIRT_T, BLUE_SKIRT);
put(BLUE_WIZARD_HAT_T, BLUE_WIZARD_HAT);
put(BLUE_WIZARD_ROBE_T, BLUE_WIZARD_ROBE);
put(BOOK_PAGE_1, BOOK_PAGE_1);
put(BOOK_PAGE_2, BOOK_PAGE_1);
put(BROODOO_SHIELD_9, BROODOO_SHIELD_10);
put(BROWN_SPICE_1, BROWN_SPICE_4);
put(BROWN_SPICE_2, BROWN_SPICE_4);
put(BROWN_SPICE_3, BROWN_SPICE_4);
put(BROWN_SPICE_4, BROWN_SPICE_4);
put(CASKET_ELITE, CASKET);
put(CASKET_HARD, CASKET);
put(CASKET_MEDIUM, CASKET);
put(CASTLE_SKETCH_1, CASTLE_SKETCH_1);
put(CASTLE_SKETCH_2, CASTLE_SKETCH_1);
put(CHEFS_DELIGHTM2, CHEFS_DELIGHT);
put(CHEFS_DELIGHTM3, CHEFS_DELIGHT);
put(CHEFS_DELIGHTM4, CHEFS_DELIGHT);
put(CIDER1, CIDER);
put(CIDER2, CIDER);
put(CLUE_NEST_ELITE, CLUE_NEST_EASY);
put(CLUE_NEST_HARD, CLUE_NEST_EASY);
put(CLUE_NEST_MEDIUM, CLUE_NEST_EASY);
put(CLUE_SCROLL_EASY, CLUE_SCROLL);
put(CLUE_SCROLL_ELITE, CLUE_SCROLL);
put(COMMORB_V2, COMMORB_V2);
put(COMPOST_POTION1, COMPOST_POTION4);
put(COMPOST_POTION2, COMPOST_POTION4);
put(COMPOST_POTION3, COMPOST_POTION4);
put(COMPOST_POTION4, COMPOST_POTION4);
put(CRYSTAL_BOW_510_I, NEW_CRYSTAL_BOW);
put(CRYSTAL_BOW_510, NEW_CRYSTAL_BOW);
put(CRYSTAL_BOW_610_I, NEW_CRYSTAL_BOW);
put(CRYSTAL_BOW_610, NEW_CRYSTAL_BOW);
put(CRYSTAL_BOW_710_I, NEW_CRYSTAL_BOW);
put(CRYSTAL_HALBERD_510_I, NEW_CRYSTAL_HALBERD_FULL_I);
put(CRYSTAL_HALBERD_510, NEW_CRYSTAL_HALBERD_FULL_I);
put(CRYSTAL_HALBERD_610_I, NEW_CRYSTAL_HALBERD_FULL_I);
put(CRYSTAL_HALBERD_610, NEW_CRYSTAL_HALBERD_FULL_I);
put(CRYSTAL_HALBERD_710_I, NEW_CRYSTAL_HALBERD_FULL_I);
put(CRYSTAL_SHIELD_510_I, NEW_CRYSTAL_SHIELD);
put(CRYSTAL_SHIELD_510, NEW_CRYSTAL_SHIELD);
put(CRYSTAL_SHIELD_610_I, NEW_CRYSTAL_SHIELD);
put(CRYSTAL_SHIELD_610, NEW_CRYSTAL_SHIELD);
put(CRYSTAL_SHIELD_710_I, NEW_CRYSTAL_SHIELD);
put(DEFENCE_POTION2, DEFENCE_POTION3);
put(DEFENCE_POTION3, DEFENCE_POTION3);
put(DEFENCE_POTION4, DEFENCE_POTION3);
put(DESERT_AMULET_1, DESERT_AMULET);
put(DESERT_AMULET_2, DESERT_AMULET);
put(DHAROKS_PLATEBODY_50, DHAROKS_PLATEBODY);
put(DHAROKS_PLATEBODY_75, DHAROKS_PLATEBODY);
put(DHAROKS_PLATELEGS_0, DHAROKS_PLATELEGS);
put(DHAROKS_PLATELEGS_100, DHAROKS_PLATELEGS);
put(DHAROKS_PLATELEGS_25, DHAROKS_PLATELEGS);
put(DRAGON_BITTERM3, DRAGON_BITTER);
put(DRAGON_BITTERM4, DRAGON_BITTER);
put(DRAGON_DEFENDER_T, DRAGON_DEFENDER);
put(DRAGONSTONE_BOLTS, DRAGONSTONE_BOLTS_E);
put(DRAGONSTONE_DRAGON_BOLTS, DRAGONSTONE_DRAGON_BOLTS_E);
put(ENCHANTED_LYRE2, ENCHANTED_LYRE);
put(ENCHANTED_LYRE3, ENCHANTED_LYRE);
put(ENCHANTED_LYRE4, ENCHANTED_LYRE);
put(ENCHANTED_LYRE5, ENCHANTED_LYRE);
put(ENERGY_MIX1, ENERGY_MIX2);
put(EXTENDED_SUPER_ANTIFIRE_MIX1, EXTENDED_SUPER_ANTIFIRE_MIX2);
put(EXTENDED_SUPER_ANTIFIRE_MIX2, EXTENDED_SUPER_ANTIFIRE_MIX2);
put(EXTENDED_SUPER_ANTIFIRE1, EXTENDED_SUPER_ANTIFIRE4);
put(EXTENDED_SUPER_ANTIFIRE2, EXTENDED_SUPER_ANTIFIRE4);
put(EXTENDED_SUPER_ANTIFIRE3, EXTENDED_SUPER_ANTIFIRE4);
put(FRAGMENT_1, FRAGMENT_1);
put(FRAGMENT_2, FRAGMENT_1);
put(FRAGMENT_3, FRAGMENT_1);
put(FREMENNIK_SEA_BOOTS_1, FREMENNIK_SEA_BOOTS);
put(FREMENNIK_SEA_BOOTS_2, FREMENNIK_SEA_BOOTS);
put(GAMES_NECKLACE3, GAMES_NECKLACE8);
put(GAMES_NECKLACE4, GAMES_NECKLACE8);
put(GAMES_NECKLACE5, GAMES_NECKLACE8);
put(GAMES_NECKLACE6, GAMES_NECKLACE8);
put(GAMES_NECKLACE7, GAMES_NECKLACE8);
put(GREENMANS_ALE4, GREENMANS_ALE);
put(GREENMANS_ALEM1, GREENMANS_ALE);
put(GREENMANS_ALEM2, GREENMANS_ALE);
put(GREENMANS_ALEM3, GREENMANS_ALE);
put(GREENMANS_ALEM4, GREENMANS_ALE);
put(GUTHANS_PLATEBODY_75, GUTHANS_PLATEBODY);
put(GUTHANS_WARSPEAR_0, GUTHANS_WARSPEAR);
put(GUTHANS_WARSPEAR_100, GUTHANS_WARSPEAR);
put(GUTHANS_WARSPEAR_25, GUTHANS_WARSPEAR);
put(GUTHANS_WARSPEAR_50, GUTHANS_WARSPEAR);
put(HALF_A_GARDEN_PIE, PART_GARDEN_PIE);
put(HALF_A_MEAT_PIE, MEAT_PIE);
put(MUSHROOM_PIE, HALF_A_MUSHROOM_PIE);
put(HALF_A_REDBERRY_PIE, REDBERRY_PIE);
put(HALF_A_ROCK, ROCK);
put(HUNTING_MIX1, HUNTING_MIX2);
put(HUNTING_MIX2, HUNTING_MIX2);
put(IMPINABOX1, IMPINABOX2);
put(IMPINABOX2, IMPINABOX2);
put(IRON_FULL_HELM_T, IRON_FULL_HELM);
put(KARILS_COIF_100, KARILS_COIF);
put(KARILS_COIF_25, KARILS_COIF);
put(KARILS_COIF_50, KARILS_COIF);
put(KARILS_COIF_75, KARILS_COIF);
put(KARILS_CROSSBOW_0, KARILS_CROSSBOW);
put(KEY_MEDIUM, KEY);
put(KODAI_POTION_1, KODAI_POTION_1);
put(KODAI_POTION_2, KODAI_POTION_1);
put(KODAI_POTION_3, KODAI_POTION_1);
put(KODAI_POTION_4, KODAI_POTION_1);
put(MAGIC_POTION1, MAGIC_POTION4);
put(MAGIC_POTION2, MAGIC_POTION4);
put(MAGIC_POTION3, MAGIC_POTION4);
put(MAGIC_POTION4, MAGIC_POTION4);
put(MAGIC_SHORTBOW_I, MAGIC_SHORTBOW_U);
put(MITHRIL_FULL_HELM_T, MITHRIL_FULL_HELM);
put(MITHRIL_KITESHIELD_T, MITHRIL_KITESHIELD);
put(MITHRIL_PLATEBODY_T, MITHRIL_PLATEBODY);
put(MITHRIL_PLATELEGS_T, MITHRIL_PLATELEGS);
put(MITHRIL_PLATESKIRT_T, MITHRIL_PLATESKIRT);
put(NECKLACE_OF_PASSAGE1, NECKLACE_OF_PASSAGE5);
put(NECKLACE_OF_PASSAGE2, NECKLACE_OF_PASSAGE5);
put(NECKLACE_OF_PASSAGE3, NECKLACE_OF_PASSAGE5);
put(NECKLACE_OF_PASSAGE4, NECKLACE_OF_PASSAGE5);
put(NECKLACE_OF_PASSAGE5, NECKLACE_OF_PASSAGE5);
put(OLIVE_OIL4, OLIVE_OIL4);
put(ONIONS1, ONIONS1);
put(ONIONS2, ONIONS1);
put(ONIONS3, ONIONS1);
put(ONIONS4, ONIONS1);
put(ORANGES3, ORANGES1);
put(ORANGES4, ORANGES1);
put(ORANGES5, ORANGES1);
put(OVERLOAD_1, OVERLOAD_4);
put(OVERLOAD_2, OVERLOAD_4);
put(PRAEL_BAT_1, PRAEL_BAT_1);
put(PRAYER_CAPET, PRAYER_CAPE);
put(PRAYER_ENHANCE_1_20965, PRAYER_ENHANCE_1);
put(PRAYER_ENHANCE_2_20966, PRAYER_ENHANCE_1);
put(PRAYER_ENHANCE_3_20967, PRAYER_ENHANCE_1);
put(RANGING_MIX1, RANGING_MIX2);
put(RANGING_MIX2, RANGING_MIX2);
put(RANGING_POTION1, RANGING_POTION3);
put(RANGING_POTION2, RANGING_POTION3);
put(RANGING_POTION3, RANGING_POTION3);
put(RED_DHIDE_BODY_T, RED_DHIDE_BODY);
put(RED_DHIDE_CHAPS_T, RED_DHIDE_CHAPS);
put(RED_SLAYER_HELMET_I, SLAYER_HELMET);
put(RED_SPICE_1, RED_SPICE_4);
put(RED_SPICE_2, RED_SPICE_4);
put(RESTORE_MIX1, RESTORE_MIX2);
put(RESTORE_MIX2, RESTORE_MIX2);
put(RESTORE_POTION1, RESTORE_POTION3);
put(RESTORE_POTION2, RESTORE_POTION3);
put(RESTORE_POTION3, RESTORE_POTION3);
put(RING_OF_DUELING5, RING_OF_DUELING8);
put(RING_OF_DUELING6, RING_OF_DUELING8);
put(RING_OF_DUELING7, RING_OF_DUELING8);
put(RING_OF_DUELING8, RING_OF_DUELING8);
put(RING_OF_RETURNING1, RING_OF_RETURNING5);
put(ROD_OF_IVANDIS_4, ROD_OF_IVANDIS_10);
put(ROD_OF_IVANDIS_5, ROD_OF_IVANDIS_10);
put(ROD_OF_IVANDIS_6, ROD_OF_IVANDIS_10);
put(ROD_OF_IVANDIS_7, ROD_OF_IVANDIS_10);
put(ROD_OF_IVANDIS_8, ROD_OF_IVANDIS_10);
put(SACRED_OIL3, SACRED_OIL4);
put(SACRED_OIL4, SACRED_OIL4);
put(SALVE_AMULET_E, SALVE_AMULET);
put(SALVE_AMULETI, SALVE_AMULET);
put(SANDSTONE_1KG, SANDSTONE_1KG);
put(SARADOMIN_PAGE_4, SARADOMIN_PAGE_1);
put(SEERS_RING_I, SEERS_RING);
put(SHAYZIEN_BOOTS_1, SHAYZIEN_BOOTS_1);
put(SHAYZIEN_BOOTS_2, SHAYZIEN_BOOTS_1);
put(SHAYZIEN_BOOTS_3, SHAYZIEN_BOOTS_1);
put(SHAYZIEN_HELM_4, SHAYZIEN_HELM_1);
put(SHAYZIEN_HELM_5, SHAYZIEN_HELM_1);
put(SHAYZIEN_PLATEBODY_1, SHAYZIEN_PLATEBODY_1);
put(SHAYZIEN_PLATEBODY_2, SHAYZIEN_PLATEBODY_1);
put(SHAYZIEN_PLATEBODY_3, SHAYZIEN_PLATEBODY_1);
put(SHAYZIEN_SUPPLY_GREAVES_4, SHAYZIEN_SUPPLY_GREAVES_1);
put(SHAYZIEN_SUPPLY_GREAVES_5, SHAYZIEN_SUPPLY_GREAVES_1);
put(SHAYZIEN_SUPPLY_HELM_1, SHAYZIEN_SUPPLY_HELM_1);
put(SHAYZIEN_SUPPLY_HELM_2, SHAYZIEN_SUPPLY_HELM_1);
put(SHAYZIEN_SUPPLY_HELM_3, SHAYZIEN_SUPPLY_HELM_1);
put(SHEEP_BONES_4, SHEEP_BONES_1);
put(SINHAZA_SHROUD_TIER_1, SINHAZA_SHROUD_TIER_1);
put(SINHAZA_SHROUD_TIER_2, SINHAZA_SHROUD_TIER_1);
put(SINHAZA_SHROUD_TIER_3, SINHAZA_SHROUD_TIER_1);
put(SINHAZA_SHROUD_TIER_4, SINHAZA_SHROUD_TIER_1);
put(SLAYER_RING_6, SLAYER_RING_8);
put(SLAYER_RING_7, SLAYER_RING_8);
put(SLAYER_RING_8, SLAYER_RING_8);
put(SLAYER_RING_ETERNAL, SLAYER_RING_8);
put(SLAYERS_RESPITE1, SLAYERS_RESPITE);
put(STAMINA_POTION4, STAMINA_POTION4);
put(STASH_UNITS_EASY, STASH_UNITS_EASY);
put(STASH_UNITS_ELITE, STASH_UNITS_EASY);
put(STASH_UNITS_HARD, STASH_UNITS_EASY);
put(STASH_UNITS_MASTER, STASH_UNITS_EASY);
put(STRENGTH_POTION1, STRENGTH_POTION4);
put(STRENGTH_POTION2, STRENGTH_POTION4);
put(STRENGTH_POTION3, STRENGTH_POTION4);
put(STRENGTH_POTION4, STRENGTH_POTION4);
put(STUDDED_BODY_T, STUDDED_BODY);
put(SUPER_DEF_MIX1, SUPER_DEF_MIX2);
put(SUPER_DEF_MIX2, SUPER_DEF_MIX2);
put(SUPER_DEFENCE1, SUPER_DEFENCE3);
put(SUPER_DEFENCE2, SUPER_DEFENCE3);
put(SUPER_DEFENCE3, SUPER_DEFENCE3);
put(SUPER_RESTORE_MIX1, SUPER_RESTORE_MIX2);
put(SUPER_RESTORE_MIX2, SUPER_RESTORE_MIX2);
put(SUPER_RESTORE1, SUPER_RESTORE4);
put(SUPER_RESTORE2, SUPER_RESTORE4);
put(SUPER_RESTORE3, SUPER_RESTORE4);
put(TEAK_SHELVES_2, TEAK_SHELVES_1);
put(TELEPORT_CRYSTAL_1, TELEPORT_CRYSTAL_4);
put(TELEPORT_CRYSTAL_2, TELEPORT_CRYSTAL_4);
put(TELEPORT_CRYSTAL_3, TELEPORT_CRYSTAL_4);
put(TELEPORT_CRYSTAL_4, TELEPORT_CRYSTAL_4);
put(TOPAZ_BOLTS, TOPAZ_BOLTS_E);
put(TOPAZ_DRAGON_BOLTS, TOPAZ_DRAGON_BOLTS_E);
put(TORAGS_HAMMERS_0, TORAGS_HAMMERS);
put(TORAGS_HAMMERS_100, TORAGS_HAMMERS);
put(TORAGS_HAMMERS_25, TORAGS_HAMMERS);
put(TORAGS_PLATELEGS_50, TORAGS_PLATELEGS);
put(TORAGS_PLATELEGS_75, TORAGS_PLATELEGS);
put(TREASONOUS_RING_I, TREASONOUS_RING);
put(TRIDENT_OF_THE_SEAS_E, TRIDENT_OF_THE_SEAS_FULL);
put(TRIDENT_OF_THE_SWAMP_E, TRIDENT_OF_THE_SWAMP);
put(VERACS_BRASSARD_50, VERACS_BRASSARD);
put(VERACS_BRASSARD_75, VERACS_BRASSARD);
put(VERACS_FLAIL_0, VERACS_FLAIL);
put(VERACS_FLAIL_100, VERACS_FLAIL);
put(VERACS_FLAIL_25, VERACS_FLAIL);
put(VOID_SEAL1, VOID_SEAL8);
put(VOID_SEAL2, VOID_SEAL8);
put(VOID_SEAL3, VOID_SEAL8);
put(VOID_SEAL4, VOID_SEAL8);
put(VOID_SEAL5, VOID_SEAL8);
put(WATERSKIN3, WATERSKIN4);
put(WATERSKIN4, WATERSKIN4);
put(WESTERN_BANNER_1, WESTERN_BANNER);
put(WESTERN_BANNER_2, WESTERN_BANNER);
put(WESTERN_BANNER_3, WESTERN_BANNER);
put(YELLOW_SPICE_2, YELLOW_SPICE_4);
put(YELLOW_SPICE_3, YELLOW_SPICE_4);
put(YELLOW_SPICE_4, YELLOW_SPICE_4);
put(ZAMORAK_BREW1, ZAMORAK_BREW3);
put(ZAMORAK_BREW2, ZAMORAK_BREW3);
}};
@Test
public void testMappedNames()
{
ITEMS_MAP.forEach((key, value) ->
{
assertEquals(value, (Integer) ItemVariationMapping.map(key));
});
}
}

View File

@@ -0,0 +1,143 @@
/*
* Copyright (c) 2019, Ron Young <https://github.com/raiyni>
* Copyright (c) 2019, Adam <Adam@sigterm.info>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.bank;
import com.google.common.collect.ImmutableList;
import com.google.inject.Guice;
import com.google.inject.testing.fieldbinder.Bind;
import com.google.inject.testing.fieldbinder.BoundFieldModule;
import javax.inject.Inject;
import net.runelite.api.Client;
import net.runelite.api.InventoryID;
import net.runelite.api.Item;
import net.runelite.api.ItemComposition;
import net.runelite.api.ItemContainer;
import net.runelite.api.ItemID;
import net.runelite.client.game.ItemManager;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class BankPluginTest
{
@Mock
@Bind
private Client client;
@Mock
@Bind
private ItemManager itemManager;
@Mock
@Bind
private BankConfig bankConfig;
@Inject
private BankPlugin bankPlugin;
@Before
public void before()
{
Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this);
}
@Test
public void testValueSearch()
{
int itemId = ItemID.ABYSSAL_WHIP;
ItemContainer itemContainer = mock(ItemContainer.class);
when(itemContainer.getItems()).thenReturn(new Item[]{new Item(itemId, 30)});
when(client.getItemContainer(InventoryID.BANK)).thenReturn(itemContainer);
ItemComposition comp = mock(ItemComposition.class);
// 60k HA price * 30 = 1.8m
when(comp.getHaPrice())
.thenReturn(60_000);
// 400k GE Price * 30 = 12m
when(itemManager.getItemPrice(itemId))
.thenReturn(400_000);
when(itemManager.getItemComposition(itemId))
.thenReturn(comp);
assertTrue(bankPlugin.valueSearch(itemId, ">500k"));
assertTrue(bankPlugin.valueSearch(itemId, "< 5.5b"));
assertTrue(bankPlugin.valueSearch(itemId, "500k - 20.6m"));
assertTrue(bankPlugin.valueSearch(itemId, "ha=1.8m"));
assertTrue(bankPlugin.valueSearch(itemId, "ha 500k - 20.6m"));
assertTrue(bankPlugin.valueSearch(itemId, "ha > 940k"));
assertTrue(bankPlugin.valueSearch(itemId, "qty=0"));
assertTrue(bankPlugin.valueSearch(itemId, "qty<600"));
assertFalse(bankPlugin.valueSearch(itemId, "<500k"));
assertFalse(bankPlugin.valueSearch(itemId, "ha >2m"));
assertFalse(bankPlugin.valueSearch(itemId, "ge > 0.02b"));
assertFalse(bankPlugin.valueSearch(itemId, "qty=1"));
assertFalse(bankPlugin.valueSearch(itemId, "qty>30"));
assertFalse(bankPlugin.valueSearch(itemId, "1000k"));
}
@Test
public void testCalculate()
{
Item coins = new Item(ItemID.COINS_995, Integer.MAX_VALUE);
Item whip = new Item(ItemID.ABYSSAL_WHIP, 1_000_000_000);
Item[] items = ImmutableList.of(
coins,
whip
).toArray(new Item[0]);
ItemComposition whipComp = mock(ItemComposition.class);
when(whipComp.getHaPrice())
.thenReturn(4); // 4 * 1m overflows
when(itemManager.getItemComposition(ItemID.ABYSSAL_WHIP))
.thenReturn(whipComp);
when(itemManager.getItemPrice(ItemID.ABYSSAL_WHIP))
.thenReturn(3); // 1b * 3 overflows
final ContainerPrices prices = bankPlugin.calculate(items);
assertNotNull(prices);
assertTrue(prices.getHighAlchPrice() > Integer.MAX_VALUE);
assertTrue(prices.getGePrice() > Integer.MAX_VALUE);
}
}

View File

@@ -1087,6 +1087,10 @@ public class ChatCommandsPluginTest
"Theatre of Blood",
"Fastest Room time (former): <col=ffffff>18:45</col>",
"Fastest Wave time (former): <col=ffffff>22:01</col>",
"Fastest Room time - (Team size: (1 player): <col=ffffff>1:01:57.00</col>",
"Fastest Overall time - (Team size: 1 player): <col=ffffff>1:06:40.20</col>",
"Fastest Room time - (Team size: (2 player): <col=ffffff>22:43.80</col>",
"Fastest Overall time - (Team size: 2 player): <col=ffffff>27:36.60</col>",
"Fastest Room time - (Team size: (3 player): <col=ffffff>19:50</col>",
"Fastest Overall time - (Team size: 3 player): <col=ffffff>22:47</col>",
"Fastest Room time - (Team size: (4 player): <col=ffffff>17:38</col>",
@@ -1138,7 +1142,10 @@ public class ChatCommandsPluginTest
verify(configManager).setRSProfileConfiguration("personalbest", "tztok-jad", 2033.0);
verify(configManager).setRSProfileConfiguration("personalbest", "tempoross", 234.0);
verify(configManager).setRSProfileConfiguration("personalbest", "chambers of xeric", 1360.0); // the lowest time
verify(configManager).setRSProfileConfiguration("personalbest", "chambers of xeric solo", 60 * 28 + 7.);
verify(configManager).setRSProfileConfiguration("personalbest", "chambers of xeric 2 players", 60 * 24 + 40.);
verify(configManager).setRSProfileConfiguration("personalbest", "theatre of blood solo", 3600 + 60 + 57.);
verify(configManager).setRSProfileConfiguration("personalbest", "theatre of blood 3 players", 19 * 60 + 50.);
}
@Test