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:
Adam
2019-10-17 18:50:25 -04:00
parent 38e3cd1ed3
commit f31e366da6

View File

@@ -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;
} }