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.player.Player;
import net.scapeemulator.game.model.player.SlottedItem;
import net.scapeemulator.game.model.player.inventory.Inventory;
/**
* @author David Insley
*/
public final class ItemOnGroundItemDispatcher {
private Map<Integer, ItemOnGroundItemHandler> handlers = new HashMap<>();
public static ItemOnGroundItemDispatcher getInstance() {
return GameServer.getInstance().getMessageDispatcher().getItemOnGroundItemDispatcher();
}
public void bind(ItemOnGroundItemHandler handler) {
int hash = getHash(handler.getItemId(), handler.getGroundItemId());
handlers.put(hash, handler);
}
public void handle(Player player, int itemId, int slot, int x, int y, int groundItemId, int widgetHash) {
if (player.actionsBlocked()) {
return;
}
Position position = new Position(x, y, player.getPosition().getHeight());
if (!player.getPosition().isWithinScene(position)) {
return;
}
if (!World.getWorld().getGroundItems().contains(groundItemId, position, player)) {
return;
}
Inventory inventory = player.getInventorySet().get(widgetHash);
if (inventory == null || inventory != player.getInventory() || !inventory.verify(slot, itemId)) {
return;
}
SlottedItem item = new SlottedItem(slot, inventory.get(slot));
ItemOnGroundItemHandler handler = handlers.get(getHash(itemId, groundItemId));
if (handler != null) {
handler.handle(player, item, position);
} else {
player.sendMessage("Nothing interesting happens.");
}
}
private static int getHash(int itemId, int groundItemId) {
return itemId << 16 | groundItemId;
}
}