package net.scapeemulator.game.dispatcher.item; import java.util.HashMap; import java.util.Map; import net.scapeemulator.game.GameServer; import net.scapeemulator.game.model.Position; import net.scapeemulator.game.model.World; import net.scapeemulator.game.model.object.GroundObjectList; import net.scapeemulator.game.model.object.GroundObjectList.GroundObject; import net.scapeemulator.game.model.player.Player; import net.scapeemulator.game.model.player.SlottedItem; import net.scapeemulator.game.model.player.action.ReachObjectAction; import net.scapeemulator.game.model.player.inventory.Inventory; /** * @author Hadyn Richard */ public final class ItemOnObjectDispatcher { private Map<Integer, ItemOnObjectHandler> handlers = new HashMap<>(); public ItemOnObjectDispatcher() { } /** * Shortcut method to get the GameServer instance of this dispatcher. * * @return the GameServer instance of the ItemOnObjectDispatcher */ public static ItemOnObjectDispatcher getInstance() { return GameServer.getInstance().getMessageDispatcher().getItemOnObjectDispatcher(); } public void bind(ItemOnObjectHandler handler) { int hash = getHash(handler.getItemId(), handler.getObjectId()); handlers.put(hash, handler); } public void unbindAll() { handlers.clear(); } public void handle(Player player, int objectId, Position position, int hash, int itemId, int slot) { if (player.actionsBlocked()) { return; } GroundObjectList groundObjects = World.getWorld().getGroundObjects(); GroundObject object = groundObjects.get(objectId, position); if (object == null) { return; } Inventory inventory = player.getInventorySet().get(hash); /* Validate the inventory */ if (inventory == null || inventory != player.getInventory() || !inventory.verify(slot, itemId)) { return; } SlottedItem item = new SlottedItem(slot, inventory.get(slot)); ItemOnObjectHandler handler = handlers.get(getHash(itemId, objectId)); if (handler != null) { handler.handle(player, object, item); } else { player.startAction(new ReachObjectAction(1, false, player, object, 1, true) { @Override public void executeAction() { player.turnToPosition(object.getCenterPosition()); player.sendMessage("Nothing interesting happens."); stop(); } }); if (player.getRights() > 0) { System.out.println("Item on Object: " + item.getItem().getId() + " on " + object.getId()); } } } private static int getHash(int itemId, int objectId) { return itemId << 16 | objectId; } }