loot manager: add support for nightmare
Co-authored-by: Hexagon <hexagon@fking.work>
This commit is contained in:
@@ -38,12 +38,13 @@ import javax.inject.Singleton;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import net.runelite.api.AnimationID;
|
import net.runelite.api.AnimationID;
|
||||||
import net.runelite.api.Client;
|
import net.runelite.api.Client;
|
||||||
import net.runelite.api.TileItem;
|
|
||||||
import net.runelite.api.ItemID;
|
import net.runelite.api.ItemID;
|
||||||
import net.runelite.api.NPC;
|
import net.runelite.api.NPC;
|
||||||
|
import net.runelite.api.NPCComposition;
|
||||||
import net.runelite.api.NpcID;
|
import net.runelite.api.NpcID;
|
||||||
import net.runelite.api.Player;
|
import net.runelite.api.Player;
|
||||||
import net.runelite.api.Tile;
|
import net.runelite.api.Tile;
|
||||||
|
import net.runelite.api.TileItem;
|
||||||
import net.runelite.api.coords.LocalPoint;
|
import net.runelite.api.coords.LocalPoint;
|
||||||
import net.runelite.api.coords.WorldPoint;
|
import net.runelite.api.coords.WorldPoint;
|
||||||
import net.runelite.api.events.AnimationChanged;
|
import net.runelite.api.events.AnimationChanged;
|
||||||
@@ -51,6 +52,7 @@ import net.runelite.api.events.GameTick;
|
|||||||
import net.runelite.api.events.ItemDespawned;
|
import net.runelite.api.events.ItemDespawned;
|
||||||
import net.runelite.api.events.ItemQuantityChanged;
|
import net.runelite.api.events.ItemQuantityChanged;
|
||||||
import net.runelite.api.events.ItemSpawned;
|
import net.runelite.api.events.ItemSpawned;
|
||||||
|
import net.runelite.api.events.NpcChanged;
|
||||||
import net.runelite.api.events.NpcDespawned;
|
import net.runelite.api.events.NpcDespawned;
|
||||||
import net.runelite.api.events.PlayerDespawned;
|
import net.runelite.api.events.PlayerDespawned;
|
||||||
import net.runelite.client.eventbus.EventBus;
|
import net.runelite.client.eventbus.EventBus;
|
||||||
@@ -73,6 +75,9 @@ public class LootManager
|
|||||||
private WorldPoint playerLocationLastTick;
|
private WorldPoint playerLocationLastTick;
|
||||||
private WorldPoint krakenPlayerLocation;
|
private WorldPoint krakenPlayerLocation;
|
||||||
|
|
||||||
|
private NPC delayedLootNpc;
|
||||||
|
private int delayedLootTickLimit;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private LootManager(EventBus eventBus, Client client)
|
private LootManager(EventBus eventBus, Client client)
|
||||||
{
|
{
|
||||||
@@ -84,6 +89,13 @@ public class LootManager
|
|||||||
public void onNpcDespawned(NpcDespawned npcDespawned)
|
public void onNpcDespawned(NpcDespawned npcDespawned)
|
||||||
{
|
{
|
||||||
final NPC npc = npcDespawned.getNpc();
|
final NPC npc = npcDespawned.getNpc();
|
||||||
|
|
||||||
|
if (npc == delayedLootNpc)
|
||||||
|
{
|
||||||
|
delayedLootNpc = null;
|
||||||
|
delayedLootTickLimit = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (!npc.isDead())
|
if (!npc.isDead())
|
||||||
{
|
{
|
||||||
int id = npc.getId();
|
int id = npc.getId();
|
||||||
@@ -219,14 +231,61 @@ public class LootManager
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onNpcChanged(NpcChanged npcChanged)
|
||||||
|
{
|
||||||
|
final NPC npc = npcChanged.getNpc();
|
||||||
|
if (npc.getId() == NpcID.THE_NIGHTMARE_9433)
|
||||||
|
{
|
||||||
|
delayedLootNpc = npc;
|
||||||
|
delayedLootTickLimit = 15;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void onGameTick(GameTick gameTick)
|
public void onGameTick(GameTick gameTick)
|
||||||
{
|
{
|
||||||
|
if (delayedLootNpc != null && delayedLootTickLimit-- > 0)
|
||||||
|
{
|
||||||
|
processDelayedLoot();
|
||||||
|
}
|
||||||
|
|
||||||
playerLocationLastTick = client.getLocalPlayer().getWorldLocation();
|
playerLocationLastTick = client.getLocalPlayer().getWorldLocation();
|
||||||
|
|
||||||
itemSpawns.clear();
|
itemSpawns.clear();
|
||||||
killPoints.clear();
|
killPoints.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void processDelayedLoot()
|
||||||
|
{
|
||||||
|
final WorldPoint adjacentLootTile = getAdjacentSquareLootTile(delayedLootNpc);
|
||||||
|
final LocalPoint localPoint = LocalPoint.fromWorld(client, adjacentLootTile);
|
||||||
|
|
||||||
|
if (localPoint == null)
|
||||||
|
{
|
||||||
|
log.debug("Scene changed away from delayed loot location");
|
||||||
|
delayedLootNpc = null;
|
||||||
|
delayedLootTickLimit = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final int sceneX = localPoint.getSceneX();
|
||||||
|
final int sceneY = localPoint.getSceneY();
|
||||||
|
final int packed = sceneX << 8 | sceneY;
|
||||||
|
final List<ItemStack> itemStacks = itemSpawns.get(packed);
|
||||||
|
if (itemStacks.isEmpty())
|
||||||
|
{
|
||||||
|
// no loot yet
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
log.debug("Got delayed loot stack from {}: {}", delayedLootNpc.getName(), itemStacks);
|
||||||
|
eventBus.post(new NpcLootReceived(delayedLootNpc, itemStacks));
|
||||||
|
|
||||||
|
delayedLootNpc = null;
|
||||||
|
delayedLootTickLimit = 0;
|
||||||
|
}
|
||||||
|
|
||||||
private void processNpcLoot(NPC npc)
|
private void processNpcLoot(NPC npc)
|
||||||
{
|
{
|
||||||
final LocalPoint location = LocalPoint.fromWorld(client, getDropLocation(npc, npc.getWorldLocation()));
|
final LocalPoint location = LocalPoint.fromWorld(client, getDropLocation(npc, npc.getWorldLocation()));
|
||||||
@@ -316,4 +375,32 @@ public class LootManager
|
|||||||
|
|
||||||
return worldLocation;
|
return worldLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private WorldPoint getAdjacentSquareLootTile(NPC npc)
|
||||||
|
{
|
||||||
|
final NPCComposition composition = npc.getComposition();
|
||||||
|
final WorldPoint worldLocation = npc.getWorldLocation();
|
||||||
|
int x = worldLocation.getX();
|
||||||
|
int y = worldLocation.getY();
|
||||||
|
|
||||||
|
if (playerLocationLastTick.getX() < x)
|
||||||
|
{
|
||||||
|
x -= 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
x += Math.min(playerLocationLastTick.getX() - x, composition.getSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (playerLocationLastTick.getY() < y)
|
||||||
|
{
|
||||||
|
y -= 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
y += Math.min(playerLocationLastTick.getY() - y, composition.getSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
return new WorldPoint(x, y, worldLocation.getPlane());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user