loot manager: add support for nightmare

Co-authored-by: Hexagon <hexagon@fking.work>
This commit is contained in:
Adam
2020-02-09 18:53:49 -05:00
committed by Adam
parent e06fa3ba72
commit e806e1bc41

View File

@@ -38,12 +38,13 @@ import javax.inject.Singleton;
import lombok.extern.slf4j.Slf4j;
import net.runelite.api.AnimationID;
import net.runelite.api.Client;
import net.runelite.api.TileItem;
import net.runelite.api.ItemID;
import net.runelite.api.NPC;
import net.runelite.api.NPCComposition;
import net.runelite.api.NpcID;
import net.runelite.api.Player;
import net.runelite.api.Tile;
import net.runelite.api.TileItem;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldPoint;
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.ItemQuantityChanged;
import net.runelite.api.events.ItemSpawned;
import net.runelite.api.events.NpcChanged;
import net.runelite.api.events.NpcDespawned;
import net.runelite.api.events.PlayerDespawned;
import net.runelite.client.eventbus.EventBus;
@@ -73,6 +75,9 @@ public class LootManager
private WorldPoint playerLocationLastTick;
private WorldPoint krakenPlayerLocation;
private NPC delayedLootNpc;
private int delayedLootTickLimit;
@Inject
private LootManager(EventBus eventBus, Client client)
{
@@ -84,6 +89,13 @@ public class LootManager
public void onNpcDespawned(NpcDespawned npcDespawned)
{
final NPC npc = npcDespawned.getNpc();
if (npc == delayedLootNpc)
{
delayedLootNpc = null;
delayedLootTickLimit = 0;
}
if (!npc.isDead())
{
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
public void onGameTick(GameTick gameTick)
{
if (delayedLootNpc != null && delayedLootTickLimit-- > 0)
{
processDelayedLoot();
}
playerLocationLastTick = client.getLocalPlayer().getWorldLocation();
itemSpawns.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)
{
final LocalPoint location = LocalPoint.fromWorld(client, getDropLocation(npc, npc.getWorldLocation()));
@@ -316,4 +375,32 @@ public class LootManager
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());
}
}