Merge pull request #369 from sdburns1998/NPCStats-damagedrop

Plugin: xp drop change damage -> scraped npcstats and xpmodifier
This commit is contained in:
Lucwousin
2019-05-27 14:09:24 +02:00
committed by GitHub
14 changed files with 36108 additions and 1356 deletions

View File

@@ -1,5 +1,6 @@
/*
* Copyright (c) 2018, Adam <Adam@sigterm.info>
* Copyright (c) 2019, TheStonedTurtle <https://github.com/TheStonedTurtle>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -24,6 +25,7 @@
*/
package net.runelite.client.game;
import com.google.common.collect.ImmutableMap;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.InputStream;
@@ -33,34 +35,69 @@ import java.util.Map;
import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Singleton;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Singleton
public class NPCManager
{
private final Map<String, Integer> healthMap;
private final ImmutableMap<Integer, NPCStats> statsMap;
@Inject
private NPCManager()
{
final Gson gson = new Gson();
final Type typeToken = new TypeToken<Map<String, Integer>>()
final Type typeToken = new TypeToken<Map<Integer, NPCStats>>()
{
}.getType();
final InputStream healthFile = getClass().getResourceAsStream("/npc_health.json");
healthMap = gson.fromJson(new InputStreamReader(healthFile), typeToken);
final InputStream statsFile = getClass().getResourceAsStream("/npc_stats.json");
final Map<Integer, NPCStats> stats = gson.fromJson(new InputStreamReader(statsFile), typeToken);
statsMap = ImmutableMap.copyOf(stats);
}
/**
* Returns health for target NPC based on it's combat level and name
*
* @param name npc name
* @param combatLevel npc combat level
* @return health or null if HP is unknown
* Returns the {@link NPCStats} for target NPC id
* @param npcId NPC id
* @return the {@link NPCStats} or null if unknown
*/
@Nullable
public Integer getHealth(final String name, final int combatLevel)
public NPCStats getStats(final int npcId)
{
return healthMap.get(name + "_" + combatLevel);
return statsMap.get(npcId);
}
/**
* Returns health for target NPC ID
* @param npcId NPC id
* @return health or null if unknown
*/
@Nullable
public Integer getHealth(final int npcId)
{
final NPCStats s = statsMap.get(npcId);
if (s == null || s.getHitpoints() == -1)
{
return null;
}
return s.getHitpoints();
}
/**
* Returns the exp modifier for target NPC ID based on its stats.
* @param npcId NPC id
* @return npcs exp modifier. Assumes default xp rate if npc stats are unknown (returns 1)
*/
public double getXpModifier(final int npcId)
{
final NPCStats s = statsMap.get(npcId);
if (s == null)
{
return 1;
}
return s.calculateXpModifier();
}
}

View File

@@ -0,0 +1,79 @@
/*
* Copyright (c) 2019, TheStonedTurtle <https://github.com/TheStonedTurtle>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.game;
import lombok.Value;
@Value
public class NPCStats
{
private final String name;
private final int hitpoints;
private final int combatLevel;
private final int slayerLevel;
private final int attackLevel;
private final int strengthLevel;
private final int defenceLevel;
private final int rangeLevel;
private final int magicLevel;
private final int stab;
private final int slash;
private final int crush;
private final int range;
private final int magic;
private final int stabDef;
private final int slashDef;
private final int crushDef;
private final int rangeDef;
private final int magicDef;
private final int bonusAttack;
private final int bonusStrength;
private final int bonusRangeStrength;
private final int bonusMagicDamage;
private final boolean poisonImmune;
private final boolean venomImmune;
private final boolean dragon;
private final boolean demon;
private final boolean undead;
/**
* Based off the formula found here: http://services.runescape.com/m=forum/c=PLuJ4cy6gtA/forums.ws?317,318,712,65587452,209,337584542#209
* @return bonus XP modifier
*/
public double calculateXpModifier()
{
final double averageLevel = Math.floor((attackLevel + strengthLevel + defenceLevel + hitpoints) / 4);
final double averageDefBonus = Math.floor((stabDef + slashDef + crushDef) / 3);
return (1 + Math.floor(averageLevel * (averageDefBonus + bonusStrength + bonusAttack) / 5120) / 40);
}
}

View File

@@ -32,6 +32,13 @@ import net.runelite.client.config.ConfigItem;
@ConfigGroup("xpdrop")
public interface XpDropConfig extends Config
{
enum DamageMode
{
NONE,
ABOVE_OPPONENT,
IN_XP_DROP
}
@ConfigItem(
keyName = "hideSkillIcons",
name = "Hide skill icons",
@@ -93,9 +100,9 @@ public interface XpDropConfig extends Config
description = "Show what you hit next to the XP drop",
position = 5
)
default boolean showDamage()
default DamageMode showDamage()
{
return false;
return DamageMode.NONE;
}
@ConfigItem(

View File

@@ -51,7 +51,7 @@ class XpDropOverlay extends Overlay
@Override
public Dimension render(Graphics2D graphics)
{
if (config.showDamage())
if (plugin.getTickShow() > 0)
{
final Actor opponent = plugin.getLastOpponent();
if (opponent != null)

View File

@@ -1,4 +1,6 @@
/*
* Copyright (c) 2019, Owain van Brakel <https://github.com/Owain94>
* Copyright (c) 2019, TheStonedTurtle <https://github.com/TheStonedTurtle>
* Copyright (c) 2018, Cameron <https://github.com/noremac201>, SoyChai <https://github.com/SoyChai>
* All rights reserved.
*
@@ -25,8 +27,6 @@
package net.runelite.client.plugins.experiencedrop;
import com.google.inject.Provides;
import java.time.Duration;
import java.time.Instant;
import java.util.Arrays;
import java.util.EnumMap;
import java.util.Map;
@@ -36,43 +36,29 @@ import lombok.AccessLevel;
import lombok.Getter;
import net.runelite.api.Actor;
import net.runelite.api.Client;
import net.runelite.api.GameState;
import net.runelite.api.NPC;
import net.runelite.api.Player;
import static net.runelite.api.ScriptID.XPDROP_DISABLED;
import net.runelite.api.Skill;
import net.runelite.api.SpriteID;
import net.runelite.api.VarPlayer;
import net.runelite.api.Varbits;
import net.runelite.api.WorldType;
import net.runelite.api.events.ConfigChanged;
import net.runelite.api.events.ExperienceChanged;
import net.runelite.api.events.GameStateChanged;
import net.runelite.api.events.GameTick;
import net.runelite.api.events.InteractingChanged;
import net.runelite.api.events.VarbitChanged;
import net.runelite.api.events.ScriptCallbackEvent;
import net.runelite.api.events.WidgetHiddenChanged;
import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetID;
import net.runelite.api.widgets.WidgetInfo;
import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.game.HiscoreManager;
import net.runelite.client.game.NPCManager;
import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.plugins.attackstyles.AttackStyle;
import static net.runelite.client.plugins.attackstyles.AttackStyle.ACCURATE;
import static net.runelite.client.plugins.attackstyles.AttackStyle.AGGRESSIVE;
import static net.runelite.client.plugins.attackstyles.AttackStyle.CASTING;
import static net.runelite.client.plugins.attackstyles.AttackStyle.CONTROLLED;
import static net.runelite.client.plugins.attackstyles.AttackStyle.DEFENSIVE;
import static net.runelite.client.plugins.attackstyles.AttackStyle.DEFENSIVE_CASTING;
import static net.runelite.client.plugins.attackstyles.AttackStyle.LONGRANGE;
import static net.runelite.client.plugins.attackstyles.AttackStyle.OTHER;
import static net.runelite.client.plugins.attackstyles.AttackStyle.RANGING;
import net.runelite.client.plugins.attackstyles.WeaponType;
import net.runelite.client.ui.overlay.OverlayManager;
import net.runelite.client.util.Text;
import net.runelite.http.api.hiscore.HiscoreEndpoint;
import net.runelite.http.api.hiscore.HiscoreResult;
import net.runelite.client.util.ColorUtil;
@PluginDescriptor(
name = "XP Drop",
@@ -82,7 +68,8 @@ import net.runelite.http.api.hiscore.HiscoreResult;
public class XpDropPlugin extends Plugin
{
private static final int XPDROP_PADDING = 2; // space between xp drop icons
private static final Duration WAIT = Duration.ofSeconds(5);
private static final double HITPOINT_RATIO = 1.33; // Base rate of hp xp per point damage
private static final double DMM_MULTIPLIER_RATIO = 10;
@Inject
private Client client;
@@ -90,29 +77,8 @@ public class XpDropPlugin extends Plugin
@Inject
private XpDropConfig config;
private int tickCounter = 0;
private int previousExpGained;
private boolean hasHit = false;
private boolean hasDropped = false;
private boolean correctPrayer;
private Skill lastSkill = null;
private Map<Skill, Integer> previousSkillExpTable = new EnumMap<>(Skill.class);
private PrayerType currentTickPrayer;
private AttackStyle attackStyle;
private int attackStyleVarbit = -1;
private int equippedWeaponTypeVarbit = -1;
private int castingModeVarbit = -1;
private int opponentHealth = -1;
private int xpGains = 0;
private AttackStyle[] offensiveStyles = {ACCURATE, AGGRESSIVE, DEFENSIVE, CONTROLLED, RANGING, LONGRANGE, CASTING, DEFENSIVE_CASTING};
@Getter(AccessLevel.PACKAGE)
private int damage = 0;
@Getter(AccessLevel.PACKAGE)
private Actor lastOpponent;
private Instant lastTime;
@Inject
private NPCManager npcManager;
@Inject
private OverlayManager overlayManager;
@@ -120,11 +86,23 @@ public class XpDropPlugin extends Plugin
@Inject
private XpDropOverlay overlay;
@Inject
private NPCManager npcManager;
@Getter(AccessLevel.PACKAGE)
private int damage = 0;
@Inject
private HiscoreManager hiscoreManager;
@Getter(AccessLevel.PACKAGE)
private int tickShow = 0;
@Getter(AccessLevel.PACKAGE)
private Actor lastOpponent;
private int tickCounter = 0;
private int previousExpGained;
private boolean hasDropped = false;
private boolean correctPrayer;
private Skill lastSkill = null;
private Map<Skill, Integer> previousSkillExpTable = new EnumMap<>(Skill.class);
private PrayerType currentTickPrayer;
private XpDropConfig.DamageMode damageMode;
@Provides
XpDropConfig provideConfig(ConfigManager configManager)
@@ -135,20 +113,56 @@ public class XpDropPlugin extends Plugin
@Override
protected void startUp() throws Exception
{
lastOpponent = null;
overlayManager.add(overlay);
if (client.getGameState() == GameState.LOGGED_IN)
damageMode = config.showDamage();
if (damageMode == XpDropConfig.DamageMode.ABOVE_OPPONENT)
{
attackStyleVarbit = client.getVar(VarPlayer.ATTACK_STYLE);
equippedWeaponTypeVarbit = client.getVar(Varbits.EQUIPPED_WEAPON_TYPE);
castingModeVarbit = client.getVar(Varbits.DEFENSIVE_CASTING_MODE);
updateAttackStyle(
equippedWeaponTypeVarbit,
attackStyleVarbit,
castingModeVarbit);
overlayManager.add(overlay);
}
}
@Override
protected void shutDown() throws Exception
{
overlayManager.remove(overlay);
}
@Subscribe
public void onConfigChanged(ConfigChanged event)
{
if (!event.getGroup().equals("xpdrop"))
{
return;
}
if (damageMode != XpDropConfig.DamageMode.ABOVE_OPPONENT)
{
damageMode = config.showDamage();
if (damageMode == XpDropConfig.DamageMode.ABOVE_OPPONENT)
{
overlayManager.add(overlay);
}
}
else
{
damageMode = config.showDamage();
if (damageMode != XpDropConfig.DamageMode.ABOVE_OPPONENT)
{
overlayManager.remove(overlay);
}
}
}
@Subscribe
public void onGameStateChanged(GameStateChanged event)
{
damage = 0;
tickShow = 0;
}
@Subscribe
public void onWidgetHiddenChanged(WidgetHiddenChanged event)
{
@@ -277,40 +291,11 @@ public class XpDropPlugin extends Plugin
@Subscribe
public void onGameTick(GameTick tick)
{
// Detect hitting a 0
if (lastOpponent != null)
{
int health = calculateHealth(lastOpponent);
if (health != -1 && opponentHealth != -1 && health == opponentHealth && hasHit)
{
damage = 0;
hasHit = false;
}
}
lastOpponent = client.getLocalPlayer().getInteracting();
// Handle getting XP gains
if (hasDropped)
if (tickShow > 0)
{
if (xpGains != 0 && attackStyle.getSkills().length > 1 && attackStyle != LONGRANGE)
{
damage = (int) (xpGains / (attackStyle.getSkills().length * 1.3));
}
else if (xpGains != 0)
{
damage = xpGains / 4;
}
xpGains = 0;
hasDropped = false;
}
// Clear opponent
if (lastOpponent != null && lastTime != null && client.getLocalPlayer().getInteracting() == null)
{
if (Duration.between(lastTime, Instant.now()).compareTo(WAIT) > 0)
{
lastOpponent = null;
}
tickShow--;
}
currentTickPrayer = getActivePrayerType();
@@ -350,120 +335,95 @@ public class XpDropPlugin extends Plugin
Integer previous = previousSkillExpTable.put(skill, xp);
if (previous != null)
{
opponentHealth = calculateHealth(lastOpponent);
previousExpGained = xp - previous;
if (skill != Skill.HITPOINTS && Arrays.stream(offensiveStyles).anyMatch(attackStyle::equals))
{
xpGains += previousExpGained;
}
hasDropped = true;
hasHit = true;
}
}
private void updateAttackStyle(int equippedWeaponType, int attackStyleIndex, int castingMode)
{
AttackStyle[] attackStyles = WeaponType.getWeaponType(equippedWeaponType).getAttackStyles();
if (attackStyleIndex < attackStyles.length)
{
attackStyle = attackStyles[attackStyleIndex];
if (attackStyle == null)
{
attackStyle = OTHER;
}
else if ((attackStyle == CASTING) && (castingMode == 1))
{
attackStyle = DEFENSIVE_CASTING;
}
}
}
@Subscribe
public void onInteractingChanged(InteractingChanged event)
public void onScriptCallbackEvent(ScriptCallbackEvent e)
{
if (event.getSource() != client.getLocalPlayer())
if (config.showDamage() == XpDropConfig.DamageMode.NONE)
{
return;
}
Actor opponent = event.getTarget();
final String eventName = e.getEventName();
if (opponent == null)
// Handles Fake XP drops (Ironman, DMM Cap, 200m xp, etc)
if (eventName.equals("fakeXpDrop"))
{
lastTime = Instant.now();
return;
}
else if (opponent.getName().equalsIgnoreCase("fishing spot"))
{
lastTime = Instant.now().minus(WAIT);
return;
}
final int[] intStack = client.getIntStack();
final int intStackSize = client.getIntStackSize();
damage = 0;
lastOpponent = opponent;
opponentHealth = calculateHealth(opponent);
}
final int skillId = intStack[intStackSize - 2];
final Skill skill = Skill.values()[skillId];
private int calculateHealth(Actor target)
{
if (target == null || target.getName() == null)
{
return -1;
}
final int healthScale = target.getHealth();
final int healthRatio = target.getHealthRatio();
final String targetName = Text.removeTags(target.getName());
Integer maxHealth = -1;
if (target instanceof NPC)
{
maxHealth = npcManager.getHealth(targetName, target.getCombatLevel());
}
else if (target instanceof Player)
{
final HiscoreResult hiscoreResult = hiscoreManager.lookupAsync(targetName, HiscoreEndpoint.NORMAL);
if (hiscoreResult != null)
if (skill.equals(Skill.HITPOINTS))
{
final int hp = hiscoreResult.getHitpoints().getLevel();
if (hp > 0)
{
maxHealth = hp;
}
final int exp = intStack[intStackSize - 1];
calculateDamageDealt(exp);
}
}
if (healthRatio < 0 || healthScale <= 0 || maxHealth == null)
client.setIntStackSize(intStackSize - 2);
}
else if (eventName.equals("hpXpGained"))
{
return -1;
}
final int[] intStack = client.getIntStack();
final int intStackSize = client.getIntStackSize();
return (int) ((maxHealth * healthRatio / healthScale) + 0.5f);
final int exp = intStack[intStackSize - 1];
calculateDamageDealt(exp);
}
else if (eventName.equals("xpDropAddDamage") &&
damageMode == XpDropConfig.DamageMode.IN_XP_DROP &&
damage > 0)
{
final String[] stringStack = client.getStringStack();
final int stringStackSize = client.getStringStackSize();
StringBuilder builder = new StringBuilder()
.append(stringStack[stringStackSize - 1])
.append(ColorUtil.colorTag(config.getDamageColor()))
.append(" (").append(damage).append(")");
stringStack[stringStackSize - 1] = builder.toString();
}
}
@Subscribe
public void onVarbitChanged(VarbitChanged event)
private void calculateDamageDealt(int diff)
{
if (attackStyleVarbit == -1 || attackStyleVarbit != client.getVar(VarPlayer.ATTACK_STYLE))
double damageDealt = diff / HITPOINT_RATIO;
// DeadMan mode has an XP modifier
if (client.getWorldType().contains(WorldType.DEADMAN))
{
attackStyleVarbit = client.getVar(VarPlayer.ATTACK_STYLE);
updateAttackStyle(client.getVar(Varbits.EQUIPPED_WEAPON_TYPE), attackStyleVarbit,
client.getVar(Varbits.DEFENSIVE_CASTING_MODE));
damageDealt = damageDealt / DMM_MULTIPLIER_RATIO;
}
if (equippedWeaponTypeVarbit == -1 || equippedWeaponTypeVarbit != client.getVar(Varbits.EQUIPPED_WEAPON_TYPE))
// Some NPCs have an XP modifier, account for it here.
Actor a = client.getLocalPlayer().getInteracting();
if (!(a instanceof NPC) && !(a instanceof Player))
{
equippedWeaponTypeVarbit = client.getVar(Varbits.EQUIPPED_WEAPON_TYPE);
updateAttackStyle(equippedWeaponTypeVarbit, client.getVar(VarPlayer.ATTACK_STYLE),
client.getVar(Varbits.DEFENSIVE_CASTING_MODE));
// If we are interacting with nothing we may have clicked away at the perfect time fall back to last tick
if (!(lastOpponent instanceof NPC) && !(lastOpponent instanceof Player))
{
damage = (int) Math.rint(damageDealt);
tickShow = 3;
return;
}
a = lastOpponent;
}
if (castingModeVarbit == -1 || castingModeVarbit != client.getVar(Varbits.DEFENSIVE_CASTING_MODE))
if (a instanceof Player)
{
castingModeVarbit = client.getVar(Varbits.DEFENSIVE_CASTING_MODE);
updateAttackStyle(client.getVar(Varbits.EQUIPPED_WEAPON_TYPE), client.getVar(VarPlayer.ATTACK_STYLE),
castingModeVarbit);
damage = (int) Math.rint(damageDealt);
tickShow = 3;
return;
}
NPC target = (NPC) a;
damage = (int) Math.rint(damageDealt / npcManager.getXpModifier(target.getId()));
tickShow = 3;
}
}

View File

@@ -114,7 +114,7 @@ class OpponentInfoOverlay extends Overlay
lastMaxHealth = null;
if (opponent instanceof NPC)
{
lastMaxHealth = npcManager.getHealth(opponentName, opponent.getCombatLevel());
lastMaxHealth = npcManager.getHealth(((NPC) opponent).getId());
}
else if (opponent instanceof Player)
{

View File

@@ -39,7 +39,6 @@ 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.OverlayUtil;
import net.runelite.client.util.Text;
class TargetWeaknessOverlay extends Overlay
{
@@ -99,8 +98,7 @@ class TargetWeaknessOverlay extends Overlay
final int healthScale = target.getHealth();
final int healthRatio = target.getHealthRatio();
final String targetName = Text.removeTags(target.getName());
final Integer maxHealth = npcManager.getHealth(targetName, target.getCombatLevel());
final Integer maxHealth = npcManager.getHealth(target.getId());
if (healthRatio < 0 || healthScale <= 0 || maxHealth == null)
{

View File

@@ -326,7 +326,7 @@ public class XpTrackerPlugin extends Plugin
if (interacting instanceof NPC && COMBAT.contains(skill))
{
final NPC npc = (NPC) interacting;
xpState.updateNpcExperience(skill, npc, npcManager.getHealth(npc.getName(), npc.getCombatLevel()));
xpState.updateNpcExperience(skill, npc, npcManager.getHealth(npc.getId()));
}
final XpUpdateResult updateResult = xpState.updateSkill(skill, currentXp, startGoalXp, endGoalXp);
@@ -358,7 +358,7 @@ public class XpTrackerPlugin extends Plugin
for (Skill skill : COMBAT)
{
final XpUpdateResult updateResult = xpState.updateNpcKills(skill, npc, npcManager.getHealth(npc.getName(), npc.getCombatLevel()));
final XpUpdateResult updateResult = xpState.updateNpcKills(skill, npc, npcManager.getHealth(npc.getId()));
final boolean updated = XpUpdateResult.UPDATED.equals(updateResult);
xpPanel.updateSkillExperience(updated, xpPauseState.isPaused(skill), skill, xpState.getSkillSnapshot(skill));
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1 @@
32FBC48F8C6D8E62E02BCF09F444BA036F76133B6596396F0AB9E474687D9F3F

View File

@@ -0,0 +1,254 @@
.id 2091
.int_stack_count 2
.string_stack_count 0
.int_var_count 2
.string_var_count 0
iload 0
iload 1
sconst "fakeXpDrop"
runelite_callback ;
iconst 105
iconst 83
iconst 681
get_varc_int 207
coordx
enum
iload 0
if_icmpeq LABEL9
jump LABEL16
LABEL9:
get_varc_int 207
iconst 0
iconst 0
iload 1
movecoord
set_varc_int 207
jump LABEL216
LABEL16:
iconst 105
iconst 83
iconst 681
get_varc_int 208
coordx
enum
iload 0
if_icmpeq LABEL25
jump LABEL32
LABEL25:
get_varc_int 208
iconst 0
iconst 0
iload 1
movecoord
set_varc_int 208
jump LABEL216
LABEL32:
iconst 105
iconst 83
iconst 681
get_varc_int 209
coordx
enum
iload 0
if_icmpeq LABEL41
jump LABEL48
LABEL41:
get_varc_int 209
iconst 0
iconst 0
iload 1
movecoord
set_varc_int 209
jump LABEL216
LABEL48:
iconst 105
iconst 83
iconst 681
get_varc_int 210
coordx
enum
iload 0
if_icmpeq LABEL57
jump LABEL64
LABEL57:
get_varc_int 210
iconst 0
iconst 0
iload 1
movecoord
set_varc_int 210
jump LABEL216
LABEL64:
iconst 105
iconst 83
iconst 681
get_varc_int 211
coordx
enum
iload 0
if_icmpeq LABEL73
jump LABEL80
LABEL73:
get_varc_int 211
iconst 0
iconst 0
iload 1
movecoord
set_varc_int 211
jump LABEL216
LABEL80:
iconst 105
iconst 83
iconst 681
get_varc_int 212
coordx
enum
iload 0
if_icmpeq LABEL89
jump LABEL96
LABEL89:
get_varc_int 212
iconst 0
iconst 0
iload 1
movecoord
set_varc_int 212
jump LABEL216
LABEL96:
iconst 105
iconst 83
iconst 681
get_varc_int 213
coordx
enum
iload 0
if_icmpeq LABEL105
jump LABEL112
LABEL105:
get_varc_int 213
iconst 0
iconst 0
iload 1
movecoord
set_varc_int 213
jump LABEL216
LABEL112:
get_varc_int 207
iconst -1
if_icmpeq LABEL116
jump LABEL127
LABEL116:
iconst 0
iconst 83
iconst 105
iconst 81
iload 0
enum
iconst 0
iload 1
movecoord
set_varc_int 207
jump LABEL216
LABEL127:
get_varc_int 208
iconst -1
if_icmpeq LABEL131
jump LABEL142
LABEL131:
iconst 0
iconst 83
iconst 105
iconst 81
iload 0
enum
iconst 0
iload 1
movecoord
set_varc_int 208
jump LABEL216
LABEL142:
get_varc_int 209
iconst -1
if_icmpeq LABEL146
jump LABEL157
LABEL146:
iconst 0
iconst 83
iconst 105
iconst 81
iload 0
enum
iconst 0
iload 1
movecoord
set_varc_int 209
jump LABEL216
LABEL157:
get_varc_int 210
iconst -1
if_icmpeq LABEL161
jump LABEL172
LABEL161:
iconst 0
iconst 83
iconst 105
iconst 81
iload 0
enum
iconst 0
iload 1
movecoord
set_varc_int 210
jump LABEL216
LABEL172:
get_varc_int 211
iconst -1
if_icmpeq LABEL176
jump LABEL187
LABEL176:
iconst 0
iconst 83
iconst 105
iconst 81
iload 0
enum
iconst 0
iload 1
movecoord
set_varc_int 211
jump LABEL216
LABEL187:
get_varc_int 212
iconst -1
if_icmpeq LABEL191
jump LABEL202
LABEL191:
iconst 0
iconst 83
iconst 105
iconst 81
iload 0
enum
iconst 0
iload 1
movecoord
set_varc_int 212
jump LABEL216
LABEL202:
get_varc_int 213
iconst -1
if_icmpeq LABEL206
jump LABEL216
LABEL206:
iconst 0
iconst 83
iconst 105
iconst 81
iload 0
enum
iconst 0
iload 1
movecoord
set_varc_int 213
LABEL216:
return

View File

@@ -0,0 +1 @@
AAA12D64549A1E4573B242AD9D53D8B1A436B947CF55BACBA660812411750E20

View File

@@ -0,0 +1,905 @@
.id 1004
.int_stack_count 34
.string_stack_count 0
.int_var_count 48
.string_var_count 1
iload 0
iconst 1
if_icmpeq LABEL4
jump LABEL9
LABEL4:
get_varc_int 207
iconst -1
if_icmpeq LABEL8
jump LABEL9
LABEL8:
return
LABEL9:
iconst 23
iconst 1
add
istore 34
iload 34
define_array 83
iload 34
define_array 65641
iconst 0
istore 35
iconst 0
istore 36
iload 0
iconst 1
if_icmpeq LABEL25
jump LABEL71
LABEL25:
get_varc_int 207
iconst -1
if_icmpne LABEL29
jump LABEL70
LABEL29:
iload 35
iconst 105
iconst 83
iconst 681
get_varc_int 207
coordx
enum
set_array_int
iload 35
get_varc_int 207
coordy
set_array_int 1
iload 35
get_array_int
iconst -1
if_icmpne LABEL46
jump LABEL55
LABEL46:
iload 35
get_array_int 1
iconst 0
if_icmpgt LABEL51
jump LABEL55
LABEL51:
iload 35
iconst 1
add
istore 35
LABEL55:
get_varc_int 208
get_varc_int 209
get_varc_int 210
get_varc_int 211
get_varc_int 212
get_varc_int 213
iconst -1
set_varc_int 213
set_varc_int 212
set_varc_int 211
set_varc_int 210
set_varc_int 209
set_varc_int 208
set_varc_int 207
jump LABEL25
LABEL70:
jump LABEL508
LABEL71:
iconst 10
stat_xp
iload 25
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL80
jump LABEL90
LABEL80:
iload 35
iconst 10
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL90:
iconst 0
stat_xp
iload 11
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL99
jump LABEL109
LABEL99:
iload 35
iconst 0
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL109:
iconst 2
stat_xp
iload 12
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL118
jump LABEL128
LABEL118:
iload 35
iconst 2
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL128:
iconst 4
stat_xp
iload 13
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL137
jump LABEL147
LABEL137:
iload 35
iconst 4
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL147:
iconst 6
stat_xp
iload 14
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL156
jump LABEL166
LABEL156:
iload 35
iconst 6
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL166:
iconst 1
stat_xp
iload 15
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL175
jump LABEL185
LABEL175:
iload 35
iconst 1
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL185:
iconst 3
stat_xp
iload 16
sub
istore 36
iload 36
iconst 0
if_icmpgt HP_XP_GAINED
jump LABEL204
HP_XP_GAINED:
iload 35
iconst 3
set_array_int
iload 35
iload 36
sconst "hpXpGained"
runelite_callback
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL204:
iconst 5
stat_xp
iload 17
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL213
jump LABEL223
LABEL213:
iload 35
iconst 5
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL223:
iconst 16
stat_xp
iload 18
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL232
jump LABEL242
LABEL232:
iload 35
iconst 16
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL242:
iconst 15
stat_xp
iload 19
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL251
jump LABEL261
LABEL251:
iload 35
iconst 15
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL261:
iconst 17
stat_xp
iload 20
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL270
jump LABEL280
LABEL270:
iload 35
iconst 17
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL280:
iconst 12
stat_xp
iload 21
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL289
jump LABEL299
LABEL289:
iload 35
iconst 12
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL299:
iconst 20
stat_xp
iload 22
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL308
jump LABEL318
LABEL308:
iload 35
iconst 20
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL318:
iconst 14
stat_xp
iload 23
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL327
jump LABEL337
LABEL327:
iload 35
iconst 14
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL337:
iconst 13
stat_xp
iload 24
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL346
jump LABEL356
LABEL346:
iload 35
iconst 13
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL356:
iconst 7
stat_xp
iload 26
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL365
jump LABEL375
LABEL365:
iload 35
iconst 7
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL375:
iconst 11
stat_xp
iload 27
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL384
jump LABEL394
LABEL384:
iload 35
iconst 11
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL394:
iconst 8
stat_xp
iload 28
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL403
jump LABEL413
LABEL403:
iload 35
iconst 8
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL413:
iconst 9
stat_xp
iload 29
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL422
jump LABEL432
LABEL422:
iload 35
iconst 9
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL432:
iconst 18
stat_xp
iload 30
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL441
jump LABEL451
LABEL441:
iload 35
iconst 18
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL451:
iconst 19
stat_xp
iload 31
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL460
jump LABEL470
LABEL460:
iload 35
iconst 19
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL470:
iconst 22
stat_xp
iload 32
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL479
jump LABEL489
LABEL479:
iload 35
iconst 22
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL489:
iconst 21
stat_xp
iload 33
sub
istore 36
iload 36
iconst 0
if_icmpgt LABEL498
jump LABEL508
LABEL498:
iload 35
iconst 21
set_array_int
iload 35
iload 36
set_array_int 1
iload 35
iconst 1
add
istore 35
LABEL508:
iconst 0
istore 37
iconst 0
istore 38
iconst 494
istore 39
iconst 494
istore 40
iconst 16
istore 41
iconst 0
istore 42
iconst 0
istore 43
iconst 0
istore 44
iconst 0
istore 45
iconst 0
istore 46
iconst -1
istore 47
sconst ""
sstore 0
iload 35
iconst 0
if_icmpgt LABEL536
jump LABEL779
LABEL536:
iload 16
iconst 0
if_icmpgt LABEL540
jump LABEL779
LABEL540:
clientclock
get_varc_int 76
sub
iconst 10
if_icmpgt LABEL546
jump LABEL779
LABEL546:
get_varbit 4693
iconst 1
if_icmpeq LABEL550
jump LABEL561
LABEL550:
invoke 1972
iconst 0
if_icmpeq LABEL554
jump LABEL561
LABEL554:
iconst 495
iconst 495
iconst 25
istore 41
istore 40
istore 39
jump LABEL575
LABEL561:
get_varbit 4693
iconst 2
if_icmpeq LABEL565
jump LABEL575
LABEL565:
invoke 1972
iconst 0
if_icmpeq LABEL569
jump LABEL575
LABEL569:
iconst 496
iconst 496
iconst 25
istore 41
istore 40
istore 39
LABEL575:
iload 8
if_getheight
istore 42
iload 42
iconst 100
if_icmplt LABEL582
jump LABEL584
LABEL582:
iconst 100
istore 42
LABEL584:
iload 41
iconst 105
iconst 105
iconst 1171
get_varbit 4722
enum
multiply
iload 42
div
iconst 1
add
istore 43
LABEL596:
iload 37
iload 35
if_icmplt LABEL600
jump LABEL774
LABEL600:
iload 38
iconst 0
if_icmpeq LABEL604
jump LABEL613
LABEL604:
iload 0
iconst 0
if_icmpeq LABEL608
jump LABEL613
LABEL608:
iload 37
get_array_int
set_varc_int 72
iconst 1
istore 38
LABEL613:
get_varc_int 71
iconst 0
if_icmpgt LABEL617
jump LABEL628
LABEL617:
get_varc_int 71
clientclock
iload 43
sub
if_icmpgt LABEL623
jump LABEL628
LABEL623:
get_varc_int 71
iload 43
add
istore 44
jump LABEL630
LABEL628:
clientclock
istore 44
LABEL630:
iload 44
clientclock
iload 43
iload 10
multiply
add
if_icmplt LABEL638
jump LABEL771
LABEL638:
iconst 105
iconst 73
iconst 1163
get_varc_int 70
enum
istore 47
iconst 0
iload 47
if_sethide
iload 37
get_array_int 1
istore 46
iload 47
iconst 5
iconst 1
cc_create
iconst 83
iconst 100
iconst 255
iload 37
get_array_int
enum
cc_setgraphic
iconst 0
iconst 0
iconst 0
iconst 5
cc_setposition
iconst 1
cc_sethide
iconst 1
istore 45
iload 37
iconst 1
add
istore 37
LABEL674:
get_varbit 4696
iconst 1
if_icmpeq LABEL678
jump LABEL722
LABEL678:
iload 37
iload 35
if_icmplt LABEL682
jump LABEL722
LABEL682:
iload 45
iconst 5
if_icmplt LABEL686
jump LABEL722
LABEL686:
iload 46
iconst 1000000
if_icmplt LABEL690
jump LABEL722
LABEL690:
iload 46
iload 37
get_array_int 1
add
istore 46
iload 45
iconst 1
add
istore 45
iload 47
iconst 5
iload 45
cc_create
iconst 83
iconst 100
iconst 255
iload 37
get_array_int
enum
cc_setgraphic
iconst 0
iconst 0
iconst 0
iconst 5
cc_setposition
iconst 1
cc_sethide
iload 37
iconst 1
add
istore 37
jump LABEL674
LABEL722:
iload 46
sconst ","
invoke 46
sconst "xpDropAddDamage"
runelite_callback
sstore 0
iload 0
iconst 1
if_icmpeq LABEL730
jump LABEL735
LABEL730:
sconst "<img=11>"
sconst " "
sload 0
join_string 3
sstore 0
LABEL735:
iload 47
iconst 0
cc_find
iconst 1
if_icmpeq LABEL741
jump LABEL756
LABEL741:
sload 0
cc_settext
iconst 0
iconst 0
iconst 0
iconst 5
cc_setposition
iconst 1
cc_sethide
iload 47
iload 41
iload 39
iload 40
sload 0
invoke 996
LABEL756:
iconst 1005
iload 47
iload 44
sconst "Ii"
iload 47
if_setontimer
iload 44
set_varc_int 71
get_varc_int 70
iconst 1
add
iload 10
mod
set_varc_int 70
jump LABEL773
LABEL771:
iload 35
istore 37
LABEL773:
jump LABEL596
LABEL774:
iload 1
iload 3
iload 8
iload 9
invoke 997
LABEL779:
iload 0
iconst 0
if_icmpeq LABEL783
jump LABEL802
LABEL783:
iload 3
iload 4
iload 5
iload 6
iload 7
iload 8
iload 9
invoke 999
iload 1
iload 2
iload 3
iload 4
iload 5
iload 6
iload 7
iload 8
iload 9
iload 10
invoke 1003
LABEL802:
return