package net.scapeemulator.game.dispatcher.item; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import net.scapeemulator.game.GameServer; import net.scapeemulator.game.model.Option; import net.scapeemulator.game.model.definition.ItemDefinitions; import net.scapeemulator.game.model.player.Player; import net.scapeemulator.game.model.player.SlottedItem; import net.scapeemulator.game.model.player.interfaces.Interface; import net.scapeemulator.game.model.player.inventory.Inventory; import net.scapeemulator.game.model.player.skills.magic.EffectItemSpell; import net.scapeemulator.game.model.player.skills.magic.Spell; import net.scapeemulator.game.model.player.skills.magic.Spellbook; import net.scapeemulator.game.util.HandlerContext; /** * @author Hadyn Richard */ public final class ItemDispatcher { /** * The mapping for all of the handler lists. */ private Map<Option, List<ItemHandler>> handlerLists = new HashMap<>(); /** * Constructs a new {@link ItemDispatcher}; */ public ItemDispatcher() { for (Option option : Option.values()) { if (option.equals(Option.ALL)) { continue; } handlerLists.put(option, new LinkedList<ItemHandler>()); } bind(new ItemEquipHandler()); } /** * Binds a handler to this dispatcher. * * @param handler the handler to bind */ public void bind(ItemHandler handler) { if (handler.getOption().equals(Option.ALL)) { for (Map.Entry<Option, List<ItemHandler>> entry : handlerLists.entrySet()) { entry.getValue().add(handler); } } else { List<ItemHandler> list = handlerLists.get(handler.getOption()); list.add(handler); } } private static boolean validateInventory(Inventory inventory, int id, int slot) { return inventory.get(slot) != null && inventory.get(slot).getId() == id; } /** * Gets the name of the option for an item. * * @param id the item id * @param option the option * @return the option name */ private static String getOptionName(int id, Option option) { String optionName = ItemDefinitions.forId(id).getInventoryOptions()[option.toInteger()]; return optionName == null ? "null" : optionName.toLowerCase(); } public void handle(Player player, int id, int slot, int hash, Option option) { if (player.actionsBlocked() || player.getInterfaceSet().getInventory().getCurrentId() != Interface.INVENTORY) { return; } List<ItemHandler> handlers = handlerLists.get(option); if (handlers != null) { Inventory inventory = player.getInventorySet().get(hash); if (inventory != player.getInventory() || !validateInventory(inventory, id, slot)) { return; } SlottedItem slottedItem = new SlottedItem(slot, inventory.get(slot)); String optionName = getOptionName(id, option); HandlerContext context = new HandlerContext(); for (ItemHandler handler : handlers) { /* Handle the message parameters */ handler.handle(player, slottedItem, optionName, context); if (context.doStop()) { break; } } } } public void handleMagic(Player player, int tabId, int spellId, int slot, int itemId) { System.out.println("[MagicOnItem] tab/spell: (" + tabId + "/" + spellId + ") slot/itemid: (" + slot + "/" + itemId + ")"); if (player.actionsBlocked()) { return; } Spellbook spellbook = player.getSpellbook(); if (tabId != spellbook.getInterfaceId()) { return; } if (!validateInventory(player.getInventory(), itemId, slot)) { return; } Spell spell = spellbook.getSpell(spellId); if (spell == null) { return; } switch (spell.getType()) { case ITEM: ((EffectItemSpell) spell).cast(player, itemId, slot); break; default: return; } } public static ItemDispatcher getInstance() { return GameServer.getInstance().getMessageDispatcher().getItemDispatcher(); } }