1 way PVP Safespots

1 way PVP Safespots
This commit is contained in:
Kyleeld
2019-04-23 09:48:19 +01:00
committed by GitHub
parent 0c35d18711
commit 3118be0896
3 changed files with 242 additions and 0 deletions

View File

@@ -0,0 +1,43 @@
package net.runelite.client.plugins.safespot;
import java.awt.Color;
import net.runelite.client.config.Config;
import net.runelite.client.config.ConfigGroup;
import net.runelite.client.config.ConfigItem;
@ConfigGroup("safespot")
public interface SafeSpotConfig extends Config
{
@ConfigItem(
position = 1,
keyName = "playerSafeSpots",
name = "Render for Players",
description = "Renders 1 way safe spots vs other players"
)
default boolean playerSafeSpots()
{
return true;
}
@ConfigItem(
position = 2,
keyName = "npcSafeSpots",
name = "Render for NPCs",
description = "Renders 1 way safe spots vs NPCs"
)
default boolean npcSafeSpots()
{
return false;
}
@ConfigItem(
position = 3,
keyName = "tileColor",
name = "Tile Color",
description = "Color of safe spot tile"
)
default Color tileColor()
{
return Color.MAGENTA;
}
}

View File

@@ -0,0 +1,58 @@
package net.runelite.client.plugins.safespot;
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.Perspective;
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 SafeSpotOverlay extends Overlay
{
private final Client client;
private final SafeSpotPlugin safeSpotPlugin;
private final SafeSpotConfig config;
@Inject
public SafeSpotOverlay(Client client, SafeSpotPlugin safeSpotPlugin, SafeSpotConfig config)
{
this.client = client;
this.safeSpotPlugin = safeSpotPlugin;
this.config = config;
setPosition(OverlayPosition.DYNAMIC);
setPriority(OverlayPriority.LOW);
setLayer(OverlayLayer.ABOVE_SCENE);
}
@Override
public Dimension render(Graphics2D graphics)
{
if (safeSpotPlugin.isSafeSpotsRenderable())
{
if(safeSpotPlugin.getSafeSpotList() != null)
{
if (safeSpotPlugin.getSafeSpotList().size() > 0)
{
safeSpotPlugin.getSafeSpotList().forEach(tile ->
{
if (tile != null && tile.getLocalLocation() != null)
{
final Polygon poly = Perspective.getCanvasTilePoly(client, tile.getLocalLocation());
if (poly != null)
{
OverlayUtil.renderPolygon(graphics, poly, config.tileColor());
}
}
});
}
}
}
return null;
}
}

View File

@@ -0,0 +1,141 @@
package net.runelite.client.plugins.safespot;
import com.google.inject.Provides;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import lombok.Getter;
import net.runelite.api.Actor;
import net.runelite.api.Client;
import net.runelite.api.NPC;
import net.runelite.api.Player;
import net.runelite.api.Tile;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldArea;
import net.runelite.api.coords.WorldPoint;
import net.runelite.api.events.GameTick;
import net.runelite.api.events.InteractingChanged;
import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.plugins.PluginManager;
import net.runelite.client.plugins.PluginType;
import net.runelite.client.ui.overlay.OverlayManager;
@PluginDescriptor(
name = "1 Way PVP Safe Spots",
description = "Renders tile overlays for one way safe spots",
tags = {"safe spot", "pvp", "safespots", "pklite"},
enabledByDefault = false,
type = PluginType.PVP
)
public class SafeSpotPlugin extends Plugin
{
@Inject
private Client client;
@Inject
OverlayManager overlayManager;
@Inject
private SafeSpotConfig config;
@Getter
private ArrayList<Tile> safeSpotList;
@Getter
private boolean safeSpotsRenderable = false;
private SafeSpotOverlay safeSpotOverlay;
private int tickCount = 0;
@Provides
SafeSpotConfig config(ConfigManager configManager)
{
return configManager.getConfig(SafeSpotConfig.class);
}
@Override
protected void startUp() throws Exception
{
safeSpotOverlay = new SafeSpotOverlay(client, this, config);
overlayManager.add(safeSpotOverlay);
}
@Override
protected void shutDown() throws Exception
{
overlayManager.remove(safeSpotOverlay);
}
@Subscribe
private void onInteractingChanged(InteractingChanged event)
{
if (event.getSource() != client.getLocalPlayer())
{
return;
}
if (event.getTarget() == null && (config.npcSafeSpots() || config.playerSafeSpots()))
{
tickCount = 10;
}
}
@Subscribe
public void onGameTick(GameTick event)
{
if (client.getLocalPlayer().getInteracting() != null)
{
if (client.getLocalPlayer().getInteracting() instanceof Player && config.playerSafeSpots())
{
safeSpotsRenderable = true;
updateSafeSpots();
}
if (client.getLocalPlayer().getInteracting() instanceof NPC && config.npcSafeSpots())
{
safeSpotsRenderable = true;
updateSafeSpots();
}
}
else
{
safeSpotsRenderable = false;
}
if (tickCount > 0)
{
tickCount--;
safeSpotsRenderable = true;
}
}
private void updateSafeSpots()
{
if (client.getLocalPlayer().getInteracting() != null)
{
Actor enemy = client.getLocalPlayer().getInteracting();
WorldArea worldArea = new WorldArea(enemy.getWorldLocation().getX() - 12,
enemy.getWorldLocation().getY() - 12, 24, 24, client.getPlane());
List<WorldPoint> worldPoints = worldArea.toWorldPointList();
safeSpotList = getSafeSpotList(enemy, worldPoints);
}
}
private ArrayList<Tile> getSafeSpotList(Actor actor, List<WorldPoint> worldPoints)
{
ArrayList<Tile> safeSpotList = new ArrayList<>();
Tile[][][] tiles = client.getScene().getTiles();
for (WorldPoint w:worldPoints)
{
LocalPoint toPoint = LocalPoint.fromWorld(client, w);
Tile fromTile = tiles[client.getPlane()][actor.getLocalLocation().getSceneX()]
[actor.getLocalLocation().getSceneY()];
Tile toTile = tiles[client.getPlane()][toPoint.getSceneX()]
[toPoint.getSceneY()];
if (toTile.hasLineOfSightTo(fromTile) && !fromTile.hasLineOfSightTo(toTile))
{
safeSpotList.add(toTile);
}
}
return safeSpotList;
}
}