random events: fix menu being hidden for own events
This changes the plugin to work by just using interact change events, which will happen regardless of the spawn events and whether or not it is interacting at the time of spawn. This fixes two bugs in the existing implementation: 1) not updating lastEventTick on interact change, causing currentRandomEvent to get timed out near immediately 2) not sending notifications for npcs which spawn while interacting
This commit is contained in:
@@ -28,20 +28,18 @@ package net.runelite.client.plugins.randomevents;
|
|||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.inject.Provides;
|
import com.google.inject.Provides;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import net.runelite.api.Actor;
|
import net.runelite.api.Actor;
|
||||||
import net.runelite.api.Client;
|
import net.runelite.api.Client;
|
||||||
import net.runelite.api.MenuAction;
|
import net.runelite.api.MenuAction;
|
||||||
import net.runelite.api.NPC;
|
import net.runelite.api.NPC;
|
||||||
import net.runelite.api.NpcID;
|
import net.runelite.api.NpcID;
|
||||||
import net.runelite.api.Player;
|
import net.runelite.api.Player;
|
||||||
import net.runelite.api.events.GameTick;
|
|
||||||
import net.runelite.api.events.InteractingChanged;
|
import net.runelite.api.events.InteractingChanged;
|
||||||
import net.runelite.api.events.MenuEntryAdded;
|
import net.runelite.api.events.MenuEntryAdded;
|
||||||
import net.runelite.api.events.NpcSpawned;
|
import net.runelite.api.events.NpcDespawned;
|
||||||
import net.runelite.client.Notifier;
|
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;
|
||||||
@@ -53,6 +51,7 @@ import net.runelite.client.plugins.PluginDescriptor;
|
|||||||
description = "Notify when random events appear and remove talk/dismiss options on events that aren't yours.",
|
description = "Notify when random events appear and remove talk/dismiss options on events that aren't yours.",
|
||||||
enabledByDefault = false
|
enabledByDefault = false
|
||||||
)
|
)
|
||||||
|
@Slf4j
|
||||||
public class RandomEventPlugin extends Plugin
|
public class RandomEventPlugin extends Plugin
|
||||||
{
|
{
|
||||||
private static final Set<Integer> EVENT_NPCS = ImmutableSet.of(
|
private static final Set<Integer> EVENT_NPCS = ImmutableSet.of(
|
||||||
@@ -85,10 +84,8 @@ public class RandomEventPlugin extends Plugin
|
|||||||
);
|
);
|
||||||
private static final int RANDOM_EVENT_TIMEOUT = 150;
|
private static final int RANDOM_EVENT_TIMEOUT = 150;
|
||||||
|
|
||||||
private Map<NPC, Integer> spawnedNpcs = new HashMap<>();
|
|
||||||
private NPC currentRandomEvent;
|
private NPC currentRandomEvent;
|
||||||
// event npcs teleport to you to stay in range, we need to throttle spawns
|
private int lastNotificationTick = -RANDOM_EVENT_TIMEOUT; // to avoid double notifications
|
||||||
private int lastEventTick = -RANDOM_EVENT_TIMEOUT;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private Client client;
|
private Client client;
|
||||||
@@ -108,34 +105,8 @@ public class RandomEventPlugin extends Plugin
|
|||||||
@Override
|
@Override
|
||||||
protected void shutDown() throws Exception
|
protected void shutDown() throws Exception
|
||||||
{
|
{
|
||||||
lastEventTick = 0;
|
lastNotificationTick = 0;
|
||||||
currentRandomEvent = null;
|
currentRandomEvent = null;
|
||||||
spawnedNpcs.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Subscribe
|
|
||||||
public void onNpcSpawned(NpcSpawned event)
|
|
||||||
{
|
|
||||||
NPC npc = event.getNpc();
|
|
||||||
|
|
||||||
if (!EVENT_NPCS.contains(npc.getId()))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// only occasionally do event npcs spawn with non-null interacting
|
|
||||||
if (npc.getInteracting() == client.getLocalPlayer())
|
|
||||||
{
|
|
||||||
if (client.getTickCount() - lastEventTick > RANDOM_EVENT_TIMEOUT)
|
|
||||||
{
|
|
||||||
currentRandomEvent = npc;
|
|
||||||
lastEventTick = client.getTickCount();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
spawnedNpcs.put(npc, client.getTickCount());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
@@ -143,31 +114,36 @@ public class RandomEventPlugin extends Plugin
|
|||||||
{
|
{
|
||||||
Actor source = event.getSource();
|
Actor source = event.getSource();
|
||||||
Actor target = event.getTarget();
|
Actor target = event.getTarget();
|
||||||
|
Player player = client.getLocalPlayer();
|
||||||
|
|
||||||
if (spawnedNpcs.containsKey(source))
|
// Check that the npc is interacting with the player and the player isn't interacting with the npc, so
|
||||||
|
// that the notification doesn't fire from talking to other user's randoms
|
||||||
|
if (target != player || player.getInteracting() == source || !(source instanceof NPC) || !EVENT_NPCS.contains(((NPC) source).getId()))
|
||||||
{
|
{
|
||||||
Player player = client.getLocalPlayer();
|
return;
|
||||||
if (player == target && client.getTickCount() - lastEventTick > RANDOM_EVENT_TIMEOUT)
|
}
|
||||||
|
|
||||||
|
log.debug("Random event spawn: {}", source.getName());
|
||||||
|
|
||||||
|
currentRandomEvent = (NPC) source;
|
||||||
|
|
||||||
|
if (client.getTickCount() - lastNotificationTick > RANDOM_EVENT_TIMEOUT)
|
||||||
|
{
|
||||||
|
lastNotificationTick = client.getTickCount();
|
||||||
|
|
||||||
|
if (shouldNotify(currentRandomEvent.getId()))
|
||||||
{
|
{
|
||||||
currentRandomEvent = (NPC) source;
|
notifier.notify("Random event spawned: " + currentRandomEvent.getName());
|
||||||
if (shouldNotify(currentRandomEvent.getId()))
|
|
||||||
{
|
|
||||||
notifier.notify("Random event spawned: " + currentRandomEvent.getName());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void onGameTick(GameTick event)
|
public void onNpcDespawned(NpcDespawned npcDespawned)
|
||||||
{
|
{
|
||||||
if (!spawnedNpcs.isEmpty())
|
NPC npc = npcDespawned.getNpc();
|
||||||
{
|
|
||||||
// allow 2 ticks for interacting to get set
|
|
||||||
spawnedNpcs.entrySet().removeIf(entry -> client.getTickCount() - entry.getValue() >= 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (client.getTickCount() - lastEventTick > RANDOM_EVENT_TIMEOUT)
|
if (npc == currentRandomEvent)
|
||||||
{
|
{
|
||||||
currentRandomEvent = null;
|
currentRandomEvent = null;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user