package net.scapeemulator.game.dispatcher.item; import java.util.HashMap; import java.util.Map; import net.scapeemulator.game.GameServer; import net.scapeemulator.game.model.World; import net.scapeemulator.game.model.npc.NPC; import net.scapeemulator.game.model.player.Player; import net.scapeemulator.game.model.player.SlottedItem; import net.scapeemulator.game.model.player.inventory.Inventory; /** * @author David Insley */ public final class ItemOnNPCDispatcher { private Map<Integer, ItemOnNPCHandler> handlers = new HashMap<>(); public static ItemOnNPCDispatcher getInstance() { return GameServer.getInstance().getMessageDispatcher().getItemOnNPCDispatcher(); } public void bind(ItemOnNPCHandler handler) { int hash = getHash(handler.getItemId(), handler.getNPCId()); handlers.put(hash, handler); } public void handle(Player player, int itemId, int slot, int npcIndex, int hash) { if (player.actionsBlocked()) { return; } NPC npc = World.getWorld().getNpcs().get(npcIndex); if (npc == null || !player.getPosition().isWithinScene(npc.getPosition()) || npc.isHidden()) { return; } Inventory inventory = player.getInventorySet().get(hash); if (inventory == null || inventory != player.getInventory() || !inventory.verify(slot, itemId)) { return; } SlottedItem item = new SlottedItem(slot, inventory.get(slot)); ItemOnNPCHandler handler = handlers.get(getHash(itemId, npc.getType())); if (handler != null) { handler.handle(player, item, npc); } else { player.sendMessage("Nothing interesting happens."); } } private static int getHash(int itemId, int npcId) { return itemId << 16 | npcId; } }