inferno: add multiple jad support, prayer indicator, healer indicator (#1392)
* inferno: add multiple jads support, add healer indicators, add new prayer indicators * inferno: add config entries * inferno: reformatting * inferno: refactoring * inferno: refactoring
This commit is contained in:
@@ -28,12 +28,79 @@ import java.awt.Color;
|
|||||||
import net.runelite.client.config.Config;
|
import net.runelite.client.config.Config;
|
||||||
import net.runelite.client.config.ConfigGroup;
|
import net.runelite.client.config.ConfigGroup;
|
||||||
import net.runelite.client.config.ConfigItem;
|
import net.runelite.client.config.ConfigItem;
|
||||||
|
import net.runelite.client.config.Stub;
|
||||||
|
|
||||||
@ConfigGroup("inferno")
|
@ConfigGroup("inferno")
|
||||||
public interface InfernoConfig extends Config
|
public interface InfernoConfig extends Config
|
||||||
{
|
{
|
||||||
@ConfigItem(
|
@ConfigItem(
|
||||||
position = 0,
|
position = 0,
|
||||||
|
keyName = "prayer",
|
||||||
|
name = "Prayer",
|
||||||
|
description = ""
|
||||||
|
)
|
||||||
|
default Stub prayer()
|
||||||
|
{
|
||||||
|
return new Stub();
|
||||||
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
position = 1,
|
||||||
|
keyName = "Prayer Helper",
|
||||||
|
name = "Prayer Helper",
|
||||||
|
description = "Indicates the correct prayer"
|
||||||
|
)
|
||||||
|
default boolean showPrayerHelp()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
position = 2,
|
||||||
|
keyName = "prayerHelperMode",
|
||||||
|
name = "Prayer Helper Mode",
|
||||||
|
description = "Display prayer indicator in the prayer tab or in the bottom right corner of the screen"
|
||||||
|
)
|
||||||
|
default InfernoPrayerOverlayMode prayerOverlayMode()
|
||||||
|
{
|
||||||
|
return InfernoPrayerOverlayMode.PRAYER_TAB;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
position = 3,
|
||||||
|
keyName = "descendingBoxes",
|
||||||
|
name = "Descending Boxes",
|
||||||
|
description = "Draws timing boxes above the prayer icons, as if you were playing Piano Tiles"
|
||||||
|
)
|
||||||
|
default boolean descendingBoxes()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
position = 4,
|
||||||
|
keyName = "indicateWhenPrayingCorrectly",
|
||||||
|
name = "Indicate When Praying Correctly",
|
||||||
|
description = "Indicate the correct prayer, even if you are already praying that prayer"
|
||||||
|
)
|
||||||
|
default boolean indicateWhenPrayingCorrectly()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
position = 5,
|
||||||
|
keyName = "monsters",
|
||||||
|
name = "Monsters",
|
||||||
|
description = ""
|
||||||
|
)
|
||||||
|
default Stub monsters()
|
||||||
|
{
|
||||||
|
return new Stub();
|
||||||
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
position = 6,
|
||||||
keyName = "Nibbler Overlay",
|
keyName = "Nibbler Overlay",
|
||||||
name = "Nibbler Overlay",
|
name = "Nibbler Overlay",
|
||||||
description = "Shows if there are any Nibblers left"
|
description = "Shows if there are any Nibblers left"
|
||||||
@@ -44,18 +111,29 @@ public interface InfernoConfig extends Config
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ConfigItem(
|
@ConfigItem(
|
||||||
position = 1,
|
position = 7,
|
||||||
keyName = "Prayer Helper",
|
keyName = "indicateActiveHealers",
|
||||||
name = "Prayer Helper",
|
name = "Indicate Active Healers",
|
||||||
description = "Tells you what to flick in how many ticks"
|
description = "Indicate healers that are still healing Jad"
|
||||||
)
|
)
|
||||||
default boolean showPrayerHelp()
|
default boolean indicateActiveHealers()
|
||||||
{
|
{
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ConfigItem(
|
@ConfigItem(
|
||||||
position = 2,
|
position = 8,
|
||||||
|
keyName = "waves",
|
||||||
|
name = "Waves",
|
||||||
|
description = ""
|
||||||
|
)
|
||||||
|
default Stub waves()
|
||||||
|
{
|
||||||
|
return new Stub();
|
||||||
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
position = 9,
|
||||||
keyName = "waveDisplay",
|
keyName = "waveDisplay",
|
||||||
name = "Wave display",
|
name = "Wave display",
|
||||||
description = "Shows monsters that will spawn on the selected wave(s)."
|
description = "Shows monsters that will spawn on the selected wave(s)."
|
||||||
@@ -66,7 +144,7 @@ public interface InfernoConfig extends Config
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ConfigItem(
|
@ConfigItem(
|
||||||
position = 3,
|
position = 10,
|
||||||
keyName = "getWaveOverlayHeaderColor",
|
keyName = "getWaveOverlayHeaderColor",
|
||||||
name = "Wave Header",
|
name = "Wave Header",
|
||||||
description = "Color for Wave Header"
|
description = "Color for Wave Header"
|
||||||
@@ -77,7 +155,7 @@ public interface InfernoConfig extends Config
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ConfigItem(
|
@ConfigItem(
|
||||||
position = 4,
|
position = 11,
|
||||||
keyName = "getWaveTextColor",
|
keyName = "getWaveTextColor",
|
||||||
name = "Wave Text Color",
|
name = "Wave Text Color",
|
||||||
description = "Color for Wave Texts"
|
description = "Color for Wave Texts"
|
||||||
|
|||||||
@@ -1,81 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2019, Jacky <liangj97@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.inferno;
|
|
||||||
|
|
||||||
import java.awt.Dimension;
|
|
||||||
import java.awt.Graphics2D;
|
|
||||||
import javax.inject.Inject;
|
|
||||||
import javax.inject.Singleton;
|
|
||||||
import net.runelite.api.Client;
|
|
||||||
import net.runelite.client.ui.overlay.Overlay;
|
|
||||||
import net.runelite.client.ui.overlay.OverlayPosition;
|
|
||||||
import net.runelite.client.ui.overlay.components.PanelComponent;
|
|
||||||
import net.runelite.client.ui.overlay.components.table.TableAlignment;
|
|
||||||
import net.runelite.client.ui.overlay.components.table.TableComponent;
|
|
||||||
|
|
||||||
@Singleton
|
|
||||||
public class InfernoInfobox extends Overlay
|
|
||||||
{
|
|
||||||
private final Client client;
|
|
||||||
private final InfernoPlugin plugin;
|
|
||||||
|
|
||||||
private final PanelComponent panelComponent = new PanelComponent();
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
public InfernoInfobox(final Client client, final InfernoPlugin plugin)
|
|
||||||
{
|
|
||||||
this.client = client;
|
|
||||||
this.plugin = plugin;
|
|
||||||
setPosition(OverlayPosition.TOP_LEFT);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Dimension render(Graphics2D graphics)
|
|
||||||
{
|
|
||||||
if (!plugin.isShowPrayerHelp() || client.getMapRegions()[0] != 9043)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
panelComponent.getChildren().clear();
|
|
||||||
TableComponent tableComponent = new TableComponent();
|
|
||||||
tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT);
|
|
||||||
|
|
||||||
for (int i = plugin.getPriorityNPC().length; i > 0; i--)
|
|
||||||
{
|
|
||||||
if (plugin.getPriorityNPC()[i - 1] == null)
|
|
||||||
{
|
|
||||||
tableComponent.addRow(Integer.toString(i), "-");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tableComponent.addRow(plugin.getPriorityNPC()[i - 1].getName(), plugin.getPriorityNPC()[i - 1].getAttackstyle().getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
panelComponent.getChildren().add(tableComponent);
|
|
||||||
return panelComponent.render(graphics);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -24,30 +24,63 @@
|
|||||||
*/
|
*/
|
||||||
package net.runelite.client.plugins.inferno;
|
package net.runelite.client.plugins.inferno;
|
||||||
|
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.Getter;
|
||||||
import net.runelite.api.AnimationID;
|
import net.runelite.api.AnimationID;
|
||||||
|
import net.runelite.api.NPC;
|
||||||
import net.runelite.api.Prayer;
|
import net.runelite.api.Prayer;
|
||||||
|
|
||||||
public enum InfernoJadAttack
|
@Getter(AccessLevel.PACKAGE)
|
||||||
|
public class InfernoJad
|
||||||
{
|
{
|
||||||
MAGIC(AnimationID.JALTOK_JAD_MAGE_ATTACK, Prayer.PROTECT_FROM_MAGIC),
|
private static final int TICKS_AFTER_ANIMATION = 4;
|
||||||
RANGE(AnimationID.JALTOK_JAD_RANGE_ATTACK, Prayer.PROTECT_FROM_MISSILES);
|
|
||||||
|
|
||||||
private final int animation;
|
private NPC npc;
|
||||||
private final Prayer prayer;
|
private Attack nextAttack;
|
||||||
|
private int ticksTillNextAttack;
|
||||||
|
|
||||||
InfernoJadAttack(final int animation, final Prayer prayer)
|
InfernoJad(NPC npc)
|
||||||
{
|
{
|
||||||
this.animation = animation;
|
this.npc = npc;
|
||||||
this.prayer = prayer;
|
nextAttack = null;
|
||||||
|
ticksTillNextAttack = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getAnimation()
|
void updateNextAttack(Attack nextAttack)
|
||||||
{
|
{
|
||||||
return animation;
|
this.nextAttack = nextAttack;
|
||||||
|
this.ticksTillNextAttack = TICKS_AFTER_ANIMATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Prayer getPrayer()
|
void gameTick()
|
||||||
{
|
{
|
||||||
return prayer;
|
if (ticksTillNextAttack < 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.ticksTillNextAttack--;
|
||||||
|
|
||||||
|
if (ticksTillNextAttack < 0)
|
||||||
|
{
|
||||||
|
nextAttack = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
|
enum Attack
|
||||||
|
{
|
||||||
|
MAGIC(AnimationID.JALTOK_JAD_MAGE_ATTACK, Prayer.PROTECT_FROM_MAGIC),
|
||||||
|
RANGE(AnimationID.JALTOK_JAD_RANGE_ATTACK, Prayer.PROTECT_FROM_MISSILES);
|
||||||
|
|
||||||
|
private final int animation;
|
||||||
|
private final Prayer prayer;
|
||||||
|
|
||||||
|
Attack(final int animation, final Prayer prayer)
|
||||||
|
{
|
||||||
|
this.animation = animation;
|
||||||
|
this.prayer = prayer;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,7 +62,28 @@ public class InfernoJadOverlay extends Overlay
|
|||||||
@Override
|
@Override
|
||||||
public Dimension render(Graphics2D graphics)
|
public Dimension render(Graphics2D graphics)
|
||||||
{
|
{
|
||||||
final InfernoJadAttack attack = plugin.getAttack();
|
if (!plugin.isShowPrayerHelp() || (plugin.getPrayerOverlayMode() != InfernoPrayerOverlayMode.BOTTOM_RIGHT
|
||||||
|
&& plugin.getPrayerOverlayMode() != InfernoPrayerOverlayMode.BOTH))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
InfernoJad.Attack attack = null;
|
||||||
|
int leastTicks = 999;
|
||||||
|
|
||||||
|
for (InfernoJad jad : plugin.getJads())
|
||||||
|
{
|
||||||
|
if (jad.getNextAttack() == null || jad.getTicksTillNextAttack() < 1)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (jad.getTicksTillNextAttack() < leastTicks)
|
||||||
|
{
|
||||||
|
leastTicks = jad.getTicksTillNextAttack();
|
||||||
|
attack = jad.getNextAttack();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (attack == null)
|
if (attack == null)
|
||||||
{
|
{
|
||||||
@@ -80,9 +101,9 @@ public class InfernoJadOverlay extends Overlay
|
|||||||
return imagePanelComponent.render(graphics);
|
return imagePanelComponent.render(graphics);
|
||||||
}
|
}
|
||||||
|
|
||||||
private BufferedImage getPrayerImage(InfernoJadAttack attack)
|
private BufferedImage getPrayerImage(InfernoJad.Attack attack)
|
||||||
{
|
{
|
||||||
final int prayerSpriteID = attack == InfernoJadAttack.MAGIC ? SpriteID.PRAYER_PROTECT_FROM_MAGIC : SpriteID.PRAYER_PROTECT_FROM_MISSILES;
|
final int prayerSpriteID = attack == InfernoJad.Attack.MAGIC ? SpriteID.PRAYER_PROTECT_FROM_MAGIC : SpriteID.PRAYER_PROTECT_FROM_MISSILES;
|
||||||
return spriteManager.getSprite(prayerSpriteID, 0);
|
return spriteManager.getSprite(prayerSpriteID, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,8 +29,8 @@ import java.awt.Color;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.ListIterator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
import lombok.AccessLevel;
|
import lombok.AccessLevel;
|
||||||
@@ -86,7 +86,7 @@ public class InfernoPlugin extends Plugin
|
|||||||
private InfernoJadOverlay jadOverlay;
|
private InfernoJadOverlay jadOverlay;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private InfernoInfobox infernoInfobox;
|
private InfernoPrayerOverlay prayerOverlay;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private InfernoNibblerOverlay nibblerOverlay;
|
private InfernoNibblerOverlay nibblerOverlay;
|
||||||
@@ -101,40 +101,46 @@ public class InfernoPlugin extends Plugin
|
|||||||
private int currentWave = -1;
|
private int currentWave = -1;
|
||||||
|
|
||||||
@Getter(AccessLevel.PACKAGE)
|
@Getter(AccessLevel.PACKAGE)
|
||||||
private Map<NPC, InfernoNPC> monsters;
|
private final Map<NPC, InfernoNPC> monsters = new HashMap<>();
|
||||||
|
|
||||||
@Getter(AccessLevel.PACKAGE)
|
@Getter(AccessLevel.PACKAGE)
|
||||||
private Map<Integer, ArrayList<InfernoNPC>> monsterCurrentAttackMap;
|
private final Map<Integer, ArrayList<InfernoNPC>> monsterCurrentAttackMap = new HashMap<>(6);
|
||||||
|
|
||||||
@Getter(AccessLevel.PACKAGE)
|
@Getter(AccessLevel.PACKAGE)
|
||||||
private List<NPC> nibblers;
|
private final List<NPC> nibblers = new ArrayList<>();
|
||||||
|
|
||||||
@Getter(AccessLevel.PACKAGE)
|
@Getter(AccessLevel.PACKAGE)
|
||||||
private InfernoNPC[] priorityNPC;
|
private final InfernoNPC[] priorityNPC = new InfernoNPC[4];
|
||||||
|
|
||||||
@Getter(AccessLevel.PACKAGE)
|
@Getter(AccessLevel.PACKAGE)
|
||||||
@Nullable
|
private final List<InfernoJad> jads = new ArrayList<>();
|
||||||
private InfernoJadAttack attack;
|
|
||||||
|
|
||||||
private NPC jad;
|
@Getter(AccessLevel.PACKAGE)
|
||||||
|
private final List<NPC> activeHealers = new ArrayList<>();
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private long lastTick;
|
||||||
|
|
||||||
@Getter(AccessLevel.PACKAGE)
|
@Getter(AccessLevel.PACKAGE)
|
||||||
private int currentWaveNumber;
|
private int currentWaveNumber;
|
||||||
|
|
||||||
private final List<Actor> waveMonsters;
|
private final List<Actor> waveMonsters = new ArrayList<>();
|
||||||
|
|
||||||
public InfernoPlugin()
|
|
||||||
{
|
|
||||||
waveMonsters = new ArrayList<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Getter(AccessLevel.PACKAGE)
|
@Getter(AccessLevel.PACKAGE)
|
||||||
private boolean displayNibblerOverlay;
|
private boolean displayNibblerOverlay;
|
||||||
@Getter(AccessLevel.PACKAGE)
|
@Getter(AccessLevel.PACKAGE)
|
||||||
private boolean showPrayerHelp;
|
private boolean showPrayerHelp;
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
|
private InfernoPrayerOverlayMode prayerOverlayMode;
|
||||||
private InfernoWaveDisplayMode waveDisplay;
|
private InfernoWaveDisplayMode waveDisplay;
|
||||||
private Color getWaveOverlayHeaderColor;
|
private Color getWaveOverlayHeaderColor;
|
||||||
private Color getWaveTextColor;
|
private Color getWaveTextColor;
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
|
private boolean descendingBoxes;
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
|
private boolean indicateWhenPrayingCorrectly;
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
|
private boolean indicateActiveHealers;
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
InfernoConfig provideConfig(ConfigManager configManager)
|
InfernoConfig provideConfig(ConfigManager configManager)
|
||||||
@@ -153,7 +159,6 @@ public class InfernoPlugin extends Plugin
|
|||||||
if (isInInferno())
|
if (isInInferno())
|
||||||
{
|
{
|
||||||
overlayManager.add(infernoOverlay);
|
overlayManager.add(infernoOverlay);
|
||||||
overlayManager.add(infernoInfobox);
|
|
||||||
overlayManager.add(nibblerOverlay);
|
overlayManager.add(nibblerOverlay);
|
||||||
|
|
||||||
if (this.waveDisplay != InfernoWaveDisplayMode.NONE)
|
if (this.waveDisplay != InfernoWaveDisplayMode.NONE)
|
||||||
@@ -162,21 +167,16 @@ public class InfernoPlugin extends Plugin
|
|||||||
}
|
}
|
||||||
|
|
||||||
overlayManager.add(jadOverlay);
|
overlayManager.add(jadOverlay);
|
||||||
|
overlayManager.add(prayerOverlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
waveOverlay.setWaveHeaderColor(this.getWaveOverlayHeaderColor);
|
waveOverlay.setWaveHeaderColor(this.getWaveOverlayHeaderColor);
|
||||||
waveOverlay.setWaveTextColor(this.getWaveTextColor);
|
waveOverlay.setWaveTextColor(this.getWaveTextColor);
|
||||||
|
|
||||||
monsters = new HashMap<>();
|
|
||||||
monsterCurrentAttackMap = new HashMap<>(6);
|
|
||||||
|
|
||||||
for (int i = 1; i <= 6; i++)
|
for (int i = 1; i <= 6; i++)
|
||||||
{
|
{
|
||||||
monsterCurrentAttackMap.put(i, new ArrayList<>());
|
monsterCurrentAttackMap.put(i, new ArrayList<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
nibblers = new ArrayList<>();
|
|
||||||
priorityNPC = new InfernoNPC[4];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -184,14 +184,11 @@ public class InfernoPlugin extends Plugin
|
|||||||
{
|
{
|
||||||
eventBus.unregister(this);
|
eventBus.unregister(this);
|
||||||
|
|
||||||
overlayManager.remove(infernoInfobox);
|
|
||||||
overlayManager.remove(infernoOverlay);
|
overlayManager.remove(infernoOverlay);
|
||||||
overlayManager.remove(nibblerOverlay);
|
overlayManager.remove(nibblerOverlay);
|
||||||
overlayManager.remove(waveOverlay);
|
overlayManager.remove(waveOverlay);
|
||||||
overlayManager.remove(jadOverlay);
|
overlayManager.remove(jadOverlay);
|
||||||
jad = null;
|
overlayManager.remove(prayerOverlay);
|
||||||
attack = null;
|
|
||||||
monsters = null;
|
|
||||||
currentWaveNumber = -1;
|
currentWaveNumber = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -256,7 +253,7 @@ public class InfernoPlugin extends Plugin
|
|||||||
|
|
||||||
if (id == NpcID.JALTOKJAD || id == NpcID.JALTOKJAD_7704)
|
if (id == NpcID.JALTOKJAD || id == NpcID.JALTOKJAD_7704)
|
||||||
{
|
{
|
||||||
jad = event.getNpc();
|
jads.add(new InfernoJad(npc));
|
||||||
}
|
}
|
||||||
|
|
||||||
final Actor actor = event.getActor();
|
final Actor actor = event.getActor();
|
||||||
@@ -286,11 +283,17 @@ public class InfernoPlugin extends Plugin
|
|||||||
nibblers.remove(npc);
|
nibblers.remove(npc);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (jad == event.getNpc())
|
final ListIterator<InfernoJad> iter = jads.listIterator();
|
||||||
|
while (iter.hasNext())
|
||||||
{
|
{
|
||||||
jad = null;
|
final InfernoJad possibleJad = iter.next();
|
||||||
attack = null;
|
|
||||||
|
if (possibleJad.getNpc() == npc)
|
||||||
|
{
|
||||||
|
iter.remove();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final Actor actor = event.getActor();
|
final Actor actor = event.getActor();
|
||||||
if (actor != null)
|
if (actor != null)
|
||||||
{
|
{
|
||||||
@@ -308,17 +311,16 @@ public class InfernoPlugin extends Plugin
|
|||||||
if (!isInInferno())
|
if (!isInInferno())
|
||||||
{
|
{
|
||||||
currentWaveNumber = -1;
|
currentWaveNumber = -1;
|
||||||
overlayManager.remove(infernoInfobox);
|
|
||||||
overlayManager.remove(infernoOverlay);
|
overlayManager.remove(infernoOverlay);
|
||||||
overlayManager.remove(nibblerOverlay);
|
overlayManager.remove(nibblerOverlay);
|
||||||
overlayManager.remove(waveOverlay);
|
overlayManager.remove(waveOverlay);
|
||||||
overlayManager.remove(jadOverlay);
|
overlayManager.remove(jadOverlay);
|
||||||
|
overlayManager.remove(prayerOverlay);
|
||||||
}
|
}
|
||||||
else if (currentWaveNumber == -1)
|
else if (currentWaveNumber == -1)
|
||||||
{
|
{
|
||||||
currentWaveNumber = 1;
|
currentWaveNumber = 1;
|
||||||
overlayManager.add(infernoOverlay);
|
overlayManager.add(infernoOverlay);
|
||||||
overlayManager.add(infernoInfobox);
|
|
||||||
overlayManager.add(nibblerOverlay);
|
overlayManager.add(nibblerOverlay);
|
||||||
|
|
||||||
if (this.waveDisplay != InfernoWaveDisplayMode.NONE)
|
if (this.waveDisplay != InfernoWaveDisplayMode.NONE)
|
||||||
@@ -327,6 +329,7 @@ public class InfernoPlugin extends Plugin
|
|||||||
}
|
}
|
||||||
|
|
||||||
overlayManager.add(jadOverlay);
|
overlayManager.add(jadOverlay);
|
||||||
|
overlayManager.add(prayerOverlay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -355,6 +358,24 @@ public class InfernoPlugin extends Plugin
|
|||||||
|
|
||||||
clearMapAndPriority();
|
clearMapAndPriority();
|
||||||
|
|
||||||
|
lastTick = System.currentTimeMillis();
|
||||||
|
|
||||||
|
for (InfernoJad jad : jads)
|
||||||
|
{
|
||||||
|
jad.gameTick();
|
||||||
|
}
|
||||||
|
|
||||||
|
activeHealers.clear();
|
||||||
|
for (NPC npc : client.getNpcs())
|
||||||
|
{
|
||||||
|
if (npc.getId() != NpcID.YTHURKOT_7701 || npc.getInteracting() == client.getLocalPlayer())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
activeHealers.add(npc);
|
||||||
|
}
|
||||||
|
|
||||||
for (InfernoNPC monster : monsters.values())
|
for (InfernoNPC monster : monsters.values())
|
||||||
{
|
{
|
||||||
calculateDistanceToPlayer(monster);
|
calculateDistanceToPlayer(monster);
|
||||||
@@ -417,18 +438,26 @@ public class InfernoPlugin extends Plugin
|
|||||||
|
|
||||||
private void onAnimationChanged(final AnimationChanged event)
|
private void onAnimationChanged(final AnimationChanged event)
|
||||||
{
|
{
|
||||||
if (event.getActor() != jad)
|
InfernoJad jad = null;
|
||||||
|
|
||||||
|
for (InfernoJad possibleJad : jads)
|
||||||
{
|
{
|
||||||
return;
|
if (possibleJad.getNpc() == event.getActor())
|
||||||
|
{
|
||||||
|
jad = possibleJad;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (jad.getAnimation() == InfernoJadAttack.MAGIC.getAnimation())
|
if (jad != null)
|
||||||
{
|
{
|
||||||
attack = InfernoJadAttack.MAGIC;
|
if (event.getActor().getAnimation() == InfernoJad.Attack.MAGIC.getAnimation())
|
||||||
}
|
{
|
||||||
else if (jad.getAnimation() == InfernoJadAttack.RANGE.getAnimation())
|
jad.updateNextAttack(InfernoJad.Attack.MAGIC);
|
||||||
{
|
}
|
||||||
attack = InfernoJadAttack.RANGE;
|
else if (event.getActor().getAnimation() == InfernoJad.Attack.RANGE.getAnimation())
|
||||||
|
{
|
||||||
|
jad.updateNextAttack(InfernoJad.Attack.RANGE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -515,8 +544,12 @@ public class InfernoPlugin extends Plugin
|
|||||||
{
|
{
|
||||||
this.displayNibblerOverlay = config.displayNibblerOverlay();
|
this.displayNibblerOverlay = config.displayNibblerOverlay();
|
||||||
this.showPrayerHelp = config.showPrayerHelp();
|
this.showPrayerHelp = config.showPrayerHelp();
|
||||||
|
this.prayerOverlayMode = config.prayerOverlayMode();
|
||||||
this.waveDisplay = config.waveDisplay();
|
this.waveDisplay = config.waveDisplay();
|
||||||
this.getWaveOverlayHeaderColor = config.getWaveOverlayHeaderColor();
|
this.getWaveOverlayHeaderColor = config.getWaveOverlayHeaderColor();
|
||||||
this.getWaveTextColor = config.getWaveTextColor();
|
this.getWaveTextColor = config.getWaveTextColor();
|
||||||
|
this.descendingBoxes = config.descendingBoxes();
|
||||||
|
this.indicateWhenPrayingCorrectly = config.indicateWhenPrayingCorrectly();
|
||||||
|
this.indicateActiveHealers = config.indicateActiveHealers();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,138 @@
|
|||||||
|
package net.runelite.client.plugins.inferno;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.Polygon;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import net.runelite.api.Client;
|
||||||
|
import net.runelite.api.NPC;
|
||||||
|
import net.runelite.api.Prayer;
|
||||||
|
import net.runelite.api.widgets.Widget;
|
||||||
|
import net.runelite.api.widgets.WidgetInfo;
|
||||||
|
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 InfernoPrayerOverlay extends Overlay
|
||||||
|
{
|
||||||
|
private static final int TICK_PIXEL_SIZE = 60;
|
||||||
|
private static final int BLOB_WIDTH = 10;
|
||||||
|
private static final int BLOB_HEIGHT = 5;
|
||||||
|
|
||||||
|
private final InfernoPlugin plugin;
|
||||||
|
private final Client client;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private InfernoPrayerOverlay(final Client client, final InfernoPlugin plugin)
|
||||||
|
{
|
||||||
|
setPosition(OverlayPosition.DYNAMIC);
|
||||||
|
setLayer(OverlayLayer.ABOVE_WIDGETS);
|
||||||
|
setPriority(OverlayPriority.HIGHEST);
|
||||||
|
|
||||||
|
this.client = client;
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dimension render(Graphics2D graphics)
|
||||||
|
{
|
||||||
|
if (client.getWidget(WidgetInfo.PRAYER_PROTECT_FROM_MAGIC).isHidden()
|
||||||
|
|| client.getWidget(WidgetInfo.PRAYER_PROTECT_FROM_MISSILES).isHidden())
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
InfernoJad.Attack prayerForAttack = null;
|
||||||
|
|
||||||
|
if (client.isPrayerActive(Prayer.PROTECT_FROM_MAGIC))
|
||||||
|
{
|
||||||
|
prayerForAttack = InfernoJad.Attack.MAGIC;
|
||||||
|
}
|
||||||
|
else if (client.isPrayerActive(Prayer.PROTECT_FROM_MISSILES))
|
||||||
|
{
|
||||||
|
prayerForAttack = InfernoJad.Attack.RANGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
InfernoJad.Attack closestAttack = null;
|
||||||
|
int leastTicks = 999;
|
||||||
|
|
||||||
|
for (InfernoJad jad : plugin.getJads())
|
||||||
|
{
|
||||||
|
if (jad.getNextAttack() == null || jad.getTicksTillNextAttack() < 1)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (jad.getTicksTillNextAttack() < leastTicks)
|
||||||
|
{
|
||||||
|
leastTicks = jad.getTicksTillNextAttack();
|
||||||
|
closestAttack = jad.getNextAttack();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!plugin.isDescendingBoxes() || !plugin.isShowPrayerHelp()
|
||||||
|
|| (plugin.getPrayerOverlayMode() != InfernoPrayerOverlayMode.PRAYER_TAB
|
||||||
|
&& plugin.getPrayerOverlayMode() != InfernoPrayerOverlayMode.BOTH))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Widget prayerWidget = jad.getNextAttack() == InfernoJad.Attack.MAGIC
|
||||||
|
? client.getWidget(WidgetInfo.PRAYER_PROTECT_FROM_MAGIC) : client.getWidget(WidgetInfo.PRAYER_PROTECT_FROM_MISSILES);
|
||||||
|
int baseX = (int) prayerWidget.getBounds().getX();
|
||||||
|
baseX += prayerWidget.getBounds().getWidth() / 2;
|
||||||
|
baseX -= BLOB_WIDTH / 2;
|
||||||
|
|
||||||
|
int baseY = (int) prayerWidget.getBounds().getY() - jad.getTicksTillNextAttack() * TICK_PIXEL_SIZE - BLOB_HEIGHT;
|
||||||
|
baseY += TICK_PIXEL_SIZE - ((plugin.getLastTick() + 600 - System.currentTimeMillis()) / 600.0 * TICK_PIXEL_SIZE);
|
||||||
|
|
||||||
|
final Polygon blob = new Polygon(new int[]{0, BLOB_WIDTH, BLOB_WIDTH, 0}, new int[]{0, 0, BLOB_HEIGHT, BLOB_HEIGHT}, 4);
|
||||||
|
blob.translate(baseX, baseY);
|
||||||
|
|
||||||
|
OverlayUtil.renderPolygon(graphics, blob, Color.ORANGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (plugin.isShowPrayerHelp() && closestAttack != null
|
||||||
|
&& (closestAttack != prayerForAttack || plugin.isIndicateWhenPrayingCorrectly())
|
||||||
|
&& (plugin.getPrayerOverlayMode() == InfernoPrayerOverlayMode.PRAYER_TAB
|
||||||
|
|| plugin.getPrayerOverlayMode() == InfernoPrayerOverlayMode.BOTH))
|
||||||
|
{
|
||||||
|
final Widget prayerWidget = closestAttack == InfernoJad.Attack.MAGIC
|
||||||
|
? client.getWidget(WidgetInfo.PRAYER_PROTECT_FROM_MAGIC) : client.getWidget(WidgetInfo.PRAYER_PROTECT_FROM_MISSILES);
|
||||||
|
final Polygon prayer = new Polygon(
|
||||||
|
new int[]{0, (int) prayerWidget.getBounds().getWidth(), (int) prayerWidget.getBounds().getWidth(), 0},
|
||||||
|
new int[]{0, 0, (int) prayerWidget.getBounds().getHeight(), (int) prayerWidget.getBounds().getHeight()},
|
||||||
|
4);
|
||||||
|
prayer.translate((int) prayerWidget.getBounds().getX(), (int) prayerWidget.getBounds().getY());
|
||||||
|
|
||||||
|
Color prayerColor;
|
||||||
|
if (closestAttack == prayerForAttack)
|
||||||
|
{
|
||||||
|
prayerColor = Color.GREEN;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
prayerColor = Color.RED;
|
||||||
|
}
|
||||||
|
|
||||||
|
OverlayUtil.renderPolygon(graphics, prayer, prayerColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (plugin.isIndicateActiveHealers())
|
||||||
|
{
|
||||||
|
for (NPC healer : plugin.getActiveHealers())
|
||||||
|
{
|
||||||
|
if (healer.getConvexHull() == null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
OverlayUtil.renderPolygon(graphics, healer.getConvexHull(), Color.CYAN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package net.runelite.client.plugins.inferno;
|
||||||
|
|
||||||
|
enum InfernoPrayerOverlayMode
|
||||||
|
{
|
||||||
|
PRAYER_TAB,
|
||||||
|
BOTTOM_RIGHT,
|
||||||
|
BOTH
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user