Use NpcSpawned/Despawned events for checking clue NPCs
- Use NpcSpawn/Despawn events to set npcs to mark and hint arrow - When setting location hint arrows, check if NPC hint arrow for clue NPC is not already set Signed-off-by: Tomas Slusny <slusnucky@gmail.com>
This commit is contained in:
@@ -31,7 +31,10 @@ import com.google.inject.Provides;
|
|||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@@ -46,7 +49,6 @@ import net.runelite.api.ItemComposition;
|
|||||||
import net.runelite.api.ItemContainer;
|
import net.runelite.api.ItemContainer;
|
||||||
import net.runelite.api.ItemID;
|
import net.runelite.api.ItemID;
|
||||||
import net.runelite.api.NPC;
|
import net.runelite.api.NPC;
|
||||||
import net.runelite.api.Query;
|
|
||||||
import net.runelite.api.Scene;
|
import net.runelite.api.Scene;
|
||||||
import net.runelite.api.Tile;
|
import net.runelite.api.Tile;
|
||||||
import net.runelite.api.coords.LocalPoint;
|
import net.runelite.api.coords.LocalPoint;
|
||||||
@@ -57,7 +59,8 @@ import net.runelite.api.events.GameStateChanged;
|
|||||||
import net.runelite.api.events.GameTick;
|
import net.runelite.api.events.GameTick;
|
||||||
import net.runelite.api.events.ItemContainerChanged;
|
import net.runelite.api.events.ItemContainerChanged;
|
||||||
import net.runelite.api.events.MenuOptionClicked;
|
import net.runelite.api.events.MenuOptionClicked;
|
||||||
import net.runelite.api.queries.NPCQuery;
|
import net.runelite.api.events.NpcDespawned;
|
||||||
|
import net.runelite.api.events.NpcSpawned;
|
||||||
import net.runelite.api.widgets.Widget;
|
import net.runelite.api.widgets.Widget;
|
||||||
import net.runelite.api.widgets.WidgetInfo;
|
import net.runelite.api.widgets.WidgetInfo;
|
||||||
import net.runelite.client.config.ConfigManager;
|
import net.runelite.client.config.ConfigManager;
|
||||||
@@ -82,7 +85,6 @@ import net.runelite.client.plugins.cluescrolls.clues.ThreeStepCrypticClue;
|
|||||||
import net.runelite.client.ui.overlay.OverlayManager;
|
import net.runelite.client.ui.overlay.OverlayManager;
|
||||||
import net.runelite.client.ui.overlay.worldmap.WorldMapPointManager;
|
import net.runelite.client.ui.overlay.worldmap.WorldMapPointManager;
|
||||||
import net.runelite.client.util.ImageUtil;
|
import net.runelite.client.util.ImageUtil;
|
||||||
import net.runelite.client.util.QueryRunner;
|
|
||||||
import net.runelite.client.util.Text;
|
import net.runelite.client.util.Text;
|
||||||
import org.apache.commons.lang3.ArrayUtils;
|
import org.apache.commons.lang3.ArrayUtils;
|
||||||
|
|
||||||
@@ -100,7 +102,7 @@ public class ClueScrollPlugin extends Plugin
|
|||||||
private ClueScroll clue;
|
private ClueScroll clue;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private NPC[] npcsToMark;
|
private final List<NPC> npcsToMark = new ArrayList<>();
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private GameObject[] objectsToMark;
|
private GameObject[] objectsToMark;
|
||||||
@@ -121,9 +123,6 @@ public class ClueScrollPlugin extends Plugin
|
|||||||
@Inject
|
@Inject
|
||||||
private ItemManager itemManager;
|
private ItemManager itemManager;
|
||||||
|
|
||||||
@Inject
|
|
||||||
private QueryRunner queryRunner;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private OverlayManager overlayManager;
|
private OverlayManager overlayManager;
|
||||||
|
|
||||||
@@ -167,6 +166,7 @@ public class ClueScrollPlugin extends Plugin
|
|||||||
overlayManager.remove(clueScrollOverlay);
|
overlayManager.remove(clueScrollOverlay);
|
||||||
overlayManager.remove(clueScrollEmoteOverlay);
|
overlayManager.remove(clueScrollEmoteOverlay);
|
||||||
overlayManager.remove(clueScrollWorldOverlay);
|
overlayManager.remove(clueScrollWorldOverlay);
|
||||||
|
npcsToMark.clear();
|
||||||
resetClue(true);
|
resetClue(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -232,6 +232,32 @@ public class ClueScrollPlugin extends Plugin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onNpcSpawned(final NpcSpawned event)
|
||||||
|
{
|
||||||
|
final NPC npc = event.getNpc();
|
||||||
|
checkClueNPCs(clue, npc);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onNpcDespawned(final NpcDespawned event)
|
||||||
|
{
|
||||||
|
final boolean removed = npcsToMark.remove(event.getNpc());
|
||||||
|
|
||||||
|
if (removed)
|
||||||
|
{
|
||||||
|
if (npcsToMark.isEmpty())
|
||||||
|
{
|
||||||
|
client.clearHintArrow();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Always set hint arrow to first seen NPC
|
||||||
|
client.setHintArrow(npcsToMark.get(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void onConfigChanged(ConfigChanged event)
|
public void onConfigChanged(ConfigChanged event)
|
||||||
{
|
{
|
||||||
@@ -253,7 +279,6 @@ public class ClueScrollPlugin extends Plugin
|
|||||||
@Subscribe
|
@Subscribe
|
||||||
public void onGameTick(final GameTick event)
|
public void onGameTick(final GameTick event)
|
||||||
{
|
{
|
||||||
npcsToMark = null;
|
|
||||||
objectsToMark = null;
|
objectsToMark = null;
|
||||||
equippedItems = null;
|
equippedItems = null;
|
||||||
inventoryItems = null;
|
inventoryItems = null;
|
||||||
@@ -298,15 +323,16 @@ public class ClueScrollPlugin extends Plugin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we have location clue, set world location before all other types of clues
|
|
||||||
// to allow NPCs and objects to override it when needed
|
|
||||||
if (clue instanceof LocationClueScroll)
|
if (clue instanceof LocationClueScroll)
|
||||||
{
|
{
|
||||||
final WorldPoint location = ((LocationClueScroll) clue).getLocation();
|
final WorldPoint location = ((LocationClueScroll) clue).getLocation();
|
||||||
|
|
||||||
if (location != null)
|
if (location != null)
|
||||||
{
|
{
|
||||||
if (config.displayHintArrows())
|
// Only set the location hint arrow if we do not already have more accurate location
|
||||||
|
if (config.displayHintArrows()
|
||||||
|
&& (client.getHintArrowNpc() == null
|
||||||
|
|| !npcsToMark.contains(client.getHintArrowNpc())))
|
||||||
{
|
{
|
||||||
client.setHintArrow(location);
|
client.setHintArrow(location);
|
||||||
}
|
}
|
||||||
@@ -315,28 +341,6 @@ public class ClueScrollPlugin extends Plugin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (clue instanceof NpcClueScroll)
|
|
||||||
{
|
|
||||||
String[] npcs = ((NpcClueScroll) clue).getNpcs();
|
|
||||||
|
|
||||||
if (npcs.length > 0)
|
|
||||||
{
|
|
||||||
Query query = new NPCQuery().nameEquals(npcs);
|
|
||||||
npcsToMark = queryRunner.runQuery(query);
|
|
||||||
|
|
||||||
// Set hint arrow to first NPC found as there can only be 1 hint arrow
|
|
||||||
if (npcsToMark.length >= 1)
|
|
||||||
{
|
|
||||||
if (config.displayHintArrows())
|
|
||||||
{
|
|
||||||
client.setHintArrow(npcsToMark[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
addMapPoints(npcsToMark[0].getWorldLocation());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (clue instanceof EmoteClue)
|
if (clue instanceof EmoteClue)
|
||||||
{
|
{
|
||||||
ItemContainer equipment = client.getItemContainer(InventoryID.EQUIPMENT);
|
ItemContainer equipment = client.getItemContainer(InventoryID.EQUIPMENT);
|
||||||
@@ -435,6 +439,7 @@ public class ClueScrollPlugin extends Plugin
|
|||||||
clue = null;
|
clue = null;
|
||||||
worldMapPointManager.removeIf(ClueScrollWorldMapPoint.class::isInstance);
|
worldMapPointManager.removeIf(ClueScrollWorldMapPoint.class::isInstance);
|
||||||
worldMapPointsSet = false;
|
worldMapPointsSet = false;
|
||||||
|
npcsToMark.clear();
|
||||||
|
|
||||||
if (config.displayHintArrows())
|
if (config.displayHintArrows())
|
||||||
{
|
{
|
||||||
@@ -595,6 +600,45 @@ public class ClueScrollPlugin extends Plugin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void checkClueNPCs(ClueScroll clue, final NPC... npcs)
|
||||||
|
{
|
||||||
|
if (!(clue instanceof NpcClueScroll))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final NpcClueScroll npcClueScroll = (NpcClueScroll) clue;
|
||||||
|
|
||||||
|
if (npcClueScroll.getNpcs() == null || npcClueScroll.getNpcs().length == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (NPC npc : npcs)
|
||||||
|
{
|
||||||
|
if (npc == null || npc.getName() == null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (String npcName : npcClueScroll.getNpcs())
|
||||||
|
{
|
||||||
|
if (!Objects.equals(npc.getName(), npcName))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
npcsToMark.add(npc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!npcsToMark.isEmpty() && config.displayHintArrows())
|
||||||
|
{
|
||||||
|
// Always set hint arrow to first seen NPC
|
||||||
|
client.setHintArrow(npcsToMark.get(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void updateClue(final ClueScroll clue)
|
private void updateClue(final ClueScroll clue)
|
||||||
{
|
{
|
||||||
if (clue == null || clue == this.clue)
|
if (clue == null || clue == this.clue)
|
||||||
@@ -603,6 +647,7 @@ public class ClueScrollPlugin extends Plugin
|
|||||||
}
|
}
|
||||||
|
|
||||||
resetClue(false);
|
resetClue(false);
|
||||||
|
checkClueNPCs(clue, client.getCachedNPCs());
|
||||||
this.clue = clue;
|
this.clue = clue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user