Re-write lizardmanshaman plugin (#2175)
This commit is contained in:
@@ -335,6 +335,7 @@ public final class AnimationID
|
|||||||
|
|
||||||
// Lizardman shaman
|
// Lizardman shaman
|
||||||
public static final int LIZARDMAN_SHAMAN_SPAWN = 7157;
|
public static final int LIZARDMAN_SHAMAN_SPAWN = 7157;
|
||||||
|
public static final int LIZARDMAN_SHAMAN_SPAWN_EXPLOSION = 7159;
|
||||||
|
|
||||||
// Combat counter
|
// Combat counter
|
||||||
public static final int BARRAGE_ANIMATION = 1979;
|
public static final int BARRAGE_ANIMATION = 1979;
|
||||||
|
|||||||
@@ -0,0 +1,139 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, https://openosrs.com Dutta64
|
||||||
|
* 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.lizardmanshaman;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import net.runelite.client.config.Alpha;
|
||||||
|
import net.runelite.client.config.Config;
|
||||||
|
import net.runelite.client.config.ConfigGroup;
|
||||||
|
import net.runelite.client.config.ConfigItem;
|
||||||
|
import net.runelite.client.config.ConfigSection;
|
||||||
|
|
||||||
|
@ConfigGroup("lizardmanshaman")
|
||||||
|
public interface LizardmanShamanConfig extends Config
|
||||||
|
{
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
enum SpawnOverlayConfig
|
||||||
|
{
|
||||||
|
EXPLOSION_ONLY("Explosion Only"),
|
||||||
|
ALWAYS("Always"),
|
||||||
|
DISABLED("Disabled");
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ConfigSection(
|
||||||
|
keyName = "features",
|
||||||
|
name = "Features",
|
||||||
|
description = "Enable or disable plugin features.",
|
||||||
|
position = 0
|
||||||
|
)
|
||||||
|
default boolean features()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
keyName = "spawnOverlay",
|
||||||
|
name = "Spawn Overlay",
|
||||||
|
description = "Show an overlay for Spawn's explosion tiles.",
|
||||||
|
section = "features",
|
||||||
|
position = 1
|
||||||
|
)
|
||||||
|
default SpawnOverlayConfig showSpawnOverlay()
|
||||||
|
{
|
||||||
|
return SpawnOverlayConfig.ALWAYS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ConfigSection(
|
||||||
|
keyName = "colors",
|
||||||
|
name = "Colors",
|
||||||
|
description = "Customize overlay colors.",
|
||||||
|
position = 1
|
||||||
|
)
|
||||||
|
default boolean colors()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Alpha
|
||||||
|
@ConfigItem(
|
||||||
|
keyName = "explosionBorderColor",
|
||||||
|
name = "Explosion Border",
|
||||||
|
description = "Spawn explosion tiles overlay border.",
|
||||||
|
section = "colors",
|
||||||
|
position = 1
|
||||||
|
)
|
||||||
|
default Color explosionBorderColor()
|
||||||
|
{
|
||||||
|
return Color.RED;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Alpha
|
||||||
|
@ConfigItem(
|
||||||
|
keyName = "explosionFillColor",
|
||||||
|
name = "Explosion Fill",
|
||||||
|
description = "Spawn explosion tiles overlay fill.",
|
||||||
|
section = "colors",
|
||||||
|
position = 2
|
||||||
|
)
|
||||||
|
default Color explosionFillColor()
|
||||||
|
{
|
||||||
|
return new Color(255, 0, 0, 20);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Alpha
|
||||||
|
@ConfigItem(
|
||||||
|
keyName = "spawnWalkableBorderColor",
|
||||||
|
name = "Walkable Border",
|
||||||
|
description = "Spawn walkable tiles overlay border.",
|
||||||
|
section = "colors",
|
||||||
|
position = 3
|
||||||
|
)
|
||||||
|
default Color spawnWalkableBorderColor()
|
||||||
|
{
|
||||||
|
return Color.ORANGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Alpha
|
||||||
|
@ConfigItem(
|
||||||
|
keyName = "spawnWalkableFillColor",
|
||||||
|
name = "Walkable Fill",
|
||||||
|
description = "Spawn walkable tiles overlay fill.",
|
||||||
|
section = "colors",
|
||||||
|
position = 4
|
||||||
|
)
|
||||||
|
default Color spawnWalkableFillColor()
|
||||||
|
{
|
||||||
|
return new Color(255, 165, 0, 20);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,196 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, https://openosrs.com Dutta64
|
||||||
|
* 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.lizardmanshaman;
|
||||||
|
|
||||||
|
import java.awt.BasicStroke;
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.Polygon;
|
||||||
|
import java.awt.Shape;
|
||||||
|
import java.awt.Stroke;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import net.runelite.api.Actor;
|
||||||
|
import net.runelite.api.AnimationID;
|
||||||
|
import net.runelite.api.Client;
|
||||||
|
import net.runelite.api.NPC;
|
||||||
|
import net.runelite.api.Perspective;
|
||||||
|
import net.runelite.api.coords.LocalPoint;
|
||||||
|
import net.runelite.api.coords.WorldArea;
|
||||||
|
import static net.runelite.client.plugins.lizardmanshaman.LizardmanShamanConfig.SpawnOverlayConfig;
|
||||||
|
import net.runelite.client.ui.overlay.Overlay;
|
||||||
|
import net.runelite.client.ui.overlay.OverlayLayer;
|
||||||
|
import net.runelite.client.ui.overlay.OverlayPosition;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Singleton
|
||||||
|
class LizardmanShamanOverlay extends Overlay
|
||||||
|
{
|
||||||
|
private final Client client;
|
||||||
|
private final LizardmanShamanPlugin plugin;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private LizardmanShamanOverlay(final Client client, final LizardmanShamanPlugin plugin)
|
||||||
|
{
|
||||||
|
setPosition(OverlayPosition.DYNAMIC);
|
||||||
|
setLayer(OverlayLayer.ABOVE_SCENE);
|
||||||
|
this.client = client;
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dimension render(Graphics2D graphics)
|
||||||
|
{
|
||||||
|
if (!plugin.getSpawnOverlayConfig().equals(SpawnOverlayConfig.DISABLED))
|
||||||
|
{
|
||||||
|
renderValidMovement(graphics);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adapted from net.runelite.client.plugins.devtools.SceneOverlay
|
||||||
|
*
|
||||||
|
* @param graphics
|
||||||
|
*/
|
||||||
|
private void renderValidMovement(Graphics2D graphics)
|
||||||
|
{
|
||||||
|
for (NPC npc : client.getNpcs())
|
||||||
|
{
|
||||||
|
if (!isSpawnNpc(npc))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int dx = -1; dx <= 1; dx++)
|
||||||
|
{
|
||||||
|
for (int dy = -1; dy <= 1; dy++)
|
||||||
|
{
|
||||||
|
if (dx == 0 && dy == 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
renderTileIfValidForMovement(graphics, npc, dx, dy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adapted from net.runelite.client.plugins.devtools.SceneOverlay
|
||||||
|
*
|
||||||
|
* @param graphics
|
||||||
|
* @param actor
|
||||||
|
* @param dx
|
||||||
|
* @param dy
|
||||||
|
*/
|
||||||
|
private void renderTileIfValidForMovement(Graphics2D graphics, Actor actor, int dx, int dy)
|
||||||
|
{
|
||||||
|
WorldArea area = actor.getWorldArea();
|
||||||
|
|
||||||
|
if (area == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (area.canTravelInDirection(client, dx, dy))
|
||||||
|
{
|
||||||
|
LocalPoint lp = actor.getLocalLocation();
|
||||||
|
|
||||||
|
if (lp == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lp = new LocalPoint(
|
||||||
|
lp.getX() + dx * Perspective.LOCAL_TILE_SIZE + dx * Perspective.LOCAL_TILE_SIZE * (area.getWidth() - 1) / 2,
|
||||||
|
lp.getY() + dy * Perspective.LOCAL_TILE_SIZE + dy * Perspective.LOCAL_TILE_SIZE * (area.getHeight() - 1) / 2);
|
||||||
|
|
||||||
|
Polygon poly = Perspective.getCanvasTilePoly(client, lp);
|
||||||
|
|
||||||
|
if (poly == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isExplodingAnimation(actor))
|
||||||
|
{
|
||||||
|
renderPolygon(graphics, poly, 1, plugin.getExplosionBorderColor(), plugin.getExplosionFillColor());
|
||||||
|
}
|
||||||
|
else if (plugin.getSpawnOverlayConfig().equals(SpawnOverlayConfig.ALWAYS))
|
||||||
|
{
|
||||||
|
renderPolygon(graphics, poly, 1, plugin.getSpawnWalkableBorderColor(), plugin.getSpawnWalkableFillColor());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adapted from net.runelite.client.ui.overlay.OverlayUtil
|
||||||
|
*
|
||||||
|
* @param graphics
|
||||||
|
* @param poly
|
||||||
|
* @param strokeWidth
|
||||||
|
* @param strokeColor
|
||||||
|
* @param fillColor
|
||||||
|
*/
|
||||||
|
private static void renderPolygon(Graphics2D graphics, Shape poly, int strokeWidth, Color strokeColor, Color fillColor)
|
||||||
|
{
|
||||||
|
graphics.setColor(strokeColor);
|
||||||
|
final Stroke originalStroke = graphics.getStroke();
|
||||||
|
graphics.setStroke(new BasicStroke(strokeWidth));
|
||||||
|
graphics.draw(poly);
|
||||||
|
graphics.setColor(fillColor);
|
||||||
|
graphics.fill(poly);
|
||||||
|
graphics.setStroke(originalStroke);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the Actor's animation is exploding.
|
||||||
|
*
|
||||||
|
* @param actor an Actor object.
|
||||||
|
* @return true if the Actor is exploding, else returns false.
|
||||||
|
*/
|
||||||
|
private static boolean isExplodingAnimation(Actor actor)
|
||||||
|
{
|
||||||
|
return actor.getAnimation() == AnimationID.LIZARDMAN_SHAMAN_SPAWN_EXPLOSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the NPC is a Lizardman Shaman Spawn.
|
||||||
|
*
|
||||||
|
* @param npc an NPC object.
|
||||||
|
* @return true if the NPC is a lizardman shaman spawn, else returns false.
|
||||||
|
*/
|
||||||
|
private static boolean isSpawnNpc(NPC npc)
|
||||||
|
{
|
||||||
|
final int NPC_ID_SPAWN = 6768;
|
||||||
|
|
||||||
|
return npc.getId() == NPC_ID_SPAWN;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018, https://openosrs.com
|
* Copyright (c) 2018, https://openosrs.com Dutta64
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -22,74 +22,72 @@
|
|||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
package net.runelite.client.plugins.lizardmenshaman;
|
package net.runelite.client.plugins.lizardmanshaman;
|
||||||
|
|
||||||
import com.google.inject.Provides;
|
import com.google.inject.Provides;
|
||||||
import java.util.HashMap;
|
import java.awt.Color;
|
||||||
import java.util.Map;
|
import java.util.Objects;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
import lombok.AccessLevel;
|
import lombok.AccessLevel;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import net.runelite.api.Actor;
|
|
||||||
import static net.runelite.api.AnimationID.LIZARDMAN_SHAMAN_SPAWN;
|
|
||||||
import net.runelite.api.coords.LocalPoint;
|
|
||||||
import net.runelite.api.events.AnimationChanged;
|
|
||||||
import net.runelite.api.events.ChatMessage;
|
|
||||||
import net.runelite.client.Notifier;
|
|
||||||
import net.runelite.client.config.ConfigManager;
|
import net.runelite.client.config.ConfigManager;
|
||||||
import net.runelite.client.eventbus.Subscribe;
|
import net.runelite.client.eventbus.Subscribe;
|
||||||
import net.runelite.client.events.ConfigChanged;
|
import net.runelite.client.events.ConfigChanged;
|
||||||
import net.runelite.client.plugins.Plugin;
|
import net.runelite.client.plugins.Plugin;
|
||||||
import net.runelite.client.plugins.PluginDescriptor;
|
import net.runelite.client.plugins.PluginDescriptor;
|
||||||
import net.runelite.client.plugins.PluginType;
|
import net.runelite.client.plugins.PluginType;
|
||||||
|
import static net.runelite.client.plugins.lizardmanshaman.LizardmanShamanConfig.SpawnOverlayConfig;
|
||||||
import net.runelite.client.ui.overlay.OverlayManager;
|
import net.runelite.client.ui.overlay.OverlayManager;
|
||||||
|
|
||||||
@PluginDescriptor(
|
@PluginDescriptor(
|
||||||
name = "Lizard Shamans",
|
name = "Lizardman Shamans",
|
||||||
description = "Configures timer for lizardmen shaman spawns.",
|
description = "Display an overlay for spawn explosion tiles",
|
||||||
tags = {"shaman", "lizard", "lizardmen"},
|
tags = {"lizardman", "shaman", "lizard"},
|
||||||
type = PluginType.PVM,
|
type = PluginType.PVM,
|
||||||
enabledByDefault = false
|
enabledByDefault = false
|
||||||
)
|
)
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Singleton
|
@Singleton
|
||||||
public class LizardmenShamanPlugin extends Plugin
|
public class LizardmanShamanPlugin extends Plugin
|
||||||
{
|
{
|
||||||
private static final String SHAMAN = "Lizardman shaman";
|
private static final String CONFIG_GROUP_NAME = "lizardmanshaman";
|
||||||
private static final String MESSAGE = "A Lizardman shaman has summoned his spawn!";
|
|
||||||
|
|
||||||
@Getter(AccessLevel.PACKAGE)
|
@Getter(AccessLevel.PACKAGE)
|
||||||
private final Map<LocalPoint, LizardmenShamanSpawn> spawns = new HashMap<>();
|
private SpawnOverlayConfig spawnOverlayConfig;
|
||||||
|
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
|
private Color explosionBorderColor;
|
||||||
|
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
|
private Color explosionFillColor;
|
||||||
|
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
|
private Color spawnWalkableBorderColor;
|
||||||
|
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
|
private Color spawnWalkableFillColor;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private OverlayManager overlayManager;
|
private OverlayManager overlayManager;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private ShamanSpawnOverlay overlay;
|
private LizardmanShamanOverlay overlay;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private LizardmenShamanConfig config;
|
private LizardmanShamanConfig config;
|
||||||
|
|
||||||
@Inject
|
|
||||||
private Notifier notifier;
|
|
||||||
|
|
||||||
private boolean showTimer;
|
|
||||||
private boolean notifyOnSpawn;
|
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
LizardmenShamanConfig getConfig(ConfigManager configManager)
|
LizardmanShamanConfig getConfig(ConfigManager configManager)
|
||||||
{
|
{
|
||||||
return configManager.getConfig(LizardmenShamanConfig.class);
|
return configManager.getConfig(LizardmanShamanConfig.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void startUp()
|
protected void startUp()
|
||||||
{
|
{
|
||||||
|
initConfig();
|
||||||
this.showTimer = config.showTimer();
|
|
||||||
this.notifyOnSpawn = config.notifyOnSpawn();
|
|
||||||
|
|
||||||
overlayManager.add(overlay);
|
overlayManager.add(overlay);
|
||||||
}
|
}
|
||||||
@@ -98,43 +96,25 @@ public class LizardmenShamanPlugin extends Plugin
|
|||||||
protected void shutDown()
|
protected void shutDown()
|
||||||
{
|
{
|
||||||
overlayManager.remove(overlay);
|
overlayManager.remove(overlay);
|
||||||
spawns.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Subscribe
|
|
||||||
private void onChatMessage(ChatMessage event)
|
|
||||||
{
|
|
||||||
if (this.notifyOnSpawn && /* event.getType() == ChatMessageType.GAMEMESSAGE && */event.getMessage().contains(MESSAGE))
|
|
||||||
// ChatMessageType should probably be SPAM <- should be tested first though
|
|
||||||
{
|
|
||||||
notifier.notify(MESSAGE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Subscribe
|
|
||||||
private void onAnimationChanged(AnimationChanged event)
|
|
||||||
{
|
|
||||||
Actor actor = event.getActor();
|
|
||||||
if (actor == null || actor.getName() == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (actor.getName().equals(SHAMAN) && actor.getAnimation() == LIZARDMAN_SHAMAN_SPAWN && this.showTimer)
|
|
||||||
{
|
|
||||||
spawns.put(event.getActor().getLocalLocation(), new LizardmenShamanSpawn(8.4, null));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
private void onConfigChanged(ConfigChanged event)
|
private void onConfigChanged(ConfigChanged event)
|
||||||
{
|
{
|
||||||
if (!event.getGroup().equals("shaman"))
|
if (Objects.equals(event.getGroup(), CONFIG_GROUP_NAME))
|
||||||
{
|
{
|
||||||
return;
|
initConfig();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.showTimer = config.showTimer();
|
private void initConfig()
|
||||||
this.notifyOnSpawn = config.notifyOnSpawn();
|
{
|
||||||
|
this.spawnOverlayConfig = config.showSpawnOverlay();
|
||||||
|
|
||||||
|
this.explosionBorderColor = config.explosionBorderColor();
|
||||||
|
this.explosionFillColor = config.explosionFillColor();
|
||||||
|
|
||||||
|
this.spawnWalkableBorderColor = config.spawnWalkableBorderColor();
|
||||||
|
this.spawnWalkableFillColor = config.spawnWalkableFillColor();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2018, https://openosrs.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.lizardmenshaman;
|
|
||||||
|
|
||||||
import net.runelite.client.config.Config;
|
|
||||||
import net.runelite.client.config.ConfigGroup;
|
|
||||||
import net.runelite.client.config.ConfigItem;
|
|
||||||
|
|
||||||
@ConfigGroup("shaman")
|
|
||||||
public interface LizardmenShamanConfig extends Config
|
|
||||||
{
|
|
||||||
@ConfigItem(
|
|
||||||
position = 1,
|
|
||||||
keyName = "showTimer",
|
|
||||||
name = "Show timer",
|
|
||||||
description = "Display timer till for lizardman shaman spawns."
|
|
||||||
)
|
|
||||||
default boolean showTimer()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@ConfigItem(
|
|
||||||
position = 2,
|
|
||||||
keyName = "notifyOnSpawn",
|
|
||||||
name = "Notify on spawn",
|
|
||||||
description = "Notify user when lizardman summons spawns."
|
|
||||||
)
|
|
||||||
default boolean notifyOnSpawn()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2018, https://openosrs.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.lizardmenshaman;
|
|
||||||
|
|
||||||
import java.time.Instant;
|
|
||||||
import lombok.AccessLevel;
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import lombok.Setter;
|
|
||||||
|
|
||||||
@Getter(AccessLevel.PACKAGE)
|
|
||||||
@Setter(AccessLevel.PACKAGE)
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
@AllArgsConstructor
|
|
||||||
class LizardmenShamanSpawn
|
|
||||||
{
|
|
||||||
private final Instant start = Instant.now();
|
|
||||||
private double countdownTimer;
|
|
||||||
private Instant end;
|
|
||||||
}
|
|
||||||
@@ -1,114 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2018, https://openosrs.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.lizardmenshaman;
|
|
||||||
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.Dimension;
|
|
||||||
import java.awt.Graphics2D;
|
|
||||||
import java.time.Duration;
|
|
||||||
import java.time.Instant;
|
|
||||||
import javax.inject.Inject;
|
|
||||||
import javax.inject.Singleton;
|
|
||||||
import net.runelite.api.Client;
|
|
||||||
import net.runelite.api.Perspective;
|
|
||||||
import net.runelite.api.Point;
|
|
||||||
import net.runelite.client.ui.overlay.Overlay;
|
|
||||||
import net.runelite.client.ui.overlay.OverlayLayer;
|
|
||||||
import net.runelite.client.ui.overlay.OverlayPosition;
|
|
||||||
import net.runelite.client.ui.overlay.components.ProgressPieComponent;
|
|
||||||
|
|
||||||
@Singleton
|
|
||||||
class ShamanSpawnOverlay extends Overlay
|
|
||||||
{
|
|
||||||
private final Client client;
|
|
||||||
private final LizardmenShamanPlugin plugin;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
private ShamanSpawnOverlay(final Client client, final LizardmenShamanPlugin plugin)
|
|
||||||
{
|
|
||||||
setPosition(OverlayPosition.DYNAMIC);
|
|
||||||
setLayer(OverlayLayer.ABOVE_SCENE);
|
|
||||||
this.client = client;
|
|
||||||
this.plugin = plugin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Dimension render(Graphics2D graphics)
|
|
||||||
{
|
|
||||||
plugin.getSpawns().forEach((localPoint, spawn) ->
|
|
||||||
{
|
|
||||||
final Instant now = Instant.now();
|
|
||||||
final long startCountdown = Duration.between(spawn.getStart(), now).getSeconds();
|
|
||||||
final double certainSec = spawn.getCountdownTimer() - startCountdown;
|
|
||||||
|
|
||||||
if (certainSec <= 0 && spawn.getEnd() == null)
|
|
||||||
{
|
|
||||||
spawn.setEnd(Instant.now());
|
|
||||||
}
|
|
||||||
|
|
||||||
final ProgressPieComponent pieComponent = new ProgressPieComponent();
|
|
||||||
final Point loc = Perspective.localToCanvas(client, localPoint, client.getPlane());
|
|
||||||
|
|
||||||
if (loc == null || certainSec < 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
pieComponent.setPosition(loc);
|
|
||||||
pieComponent.setProgress(certainSec / spawn.getCountdownTimer());
|
|
||||||
if (certainSec > 4.8)
|
|
||||||
{
|
|
||||||
pieComponent.setFill(Color.GREEN);
|
|
||||||
pieComponent.setBorderColor(Color.GREEN);
|
|
||||||
pieComponent.render(graphics);
|
|
||||||
}
|
|
||||||
else if (certainSec > 3.6)
|
|
||||||
{
|
|
||||||
pieComponent.setFill(Color.YELLOW);
|
|
||||||
pieComponent.setBorderColor(Color.YELLOW);
|
|
||||||
pieComponent.render(graphics);
|
|
||||||
}
|
|
||||||
else if (certainSec > 2.4)
|
|
||||||
{
|
|
||||||
pieComponent.setFill(Color.ORANGE);
|
|
||||||
pieComponent.setBorderColor(Color.ORANGE);
|
|
||||||
pieComponent.render(graphics);
|
|
||||||
}
|
|
||||||
else if (certainSec > 1.2)
|
|
||||||
{
|
|
||||||
pieComponent.setFill(new Color(255, 140, 0));
|
|
||||||
pieComponent.setBorderColor(new Color(255, 140, 0));
|
|
||||||
pieComponent.render(graphics);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pieComponent.setFill(Color.RED);
|
|
||||||
pieComponent.setBorderColor(Color.RED);
|
|
||||||
pieComponent.render(graphics);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user