diff --git a/data/events.xml b/data/events.xml index 58a458ff..ae5b4662 100644 --- a/data/events.xml +++ b/data/events.xml @@ -48,12 +48,14 @@ org.apollo.game.event.impl.ItemOptionEvent + org.apollo.game.event.handler.impl.ItemVerificationHandler org.apollo.game.event.handler.impl.EquipEventHandler org.apollo.game.event.impl.ItemActionEvent + org.apollo.game.event.handler.impl.ItemVerificationHandler org.apollo.game.event.handler.impl.RemoveEventHandler org.apollo.game.event.handler.impl.BankEventHandler diff --git a/src/org/apollo/game/event/handler/impl/EquipEventHandler.java b/src/org/apollo/game/event/handler/impl/EquipEventHandler.java index f15e60f9..f177c501 100644 --- a/src/org/apollo/game/event/handler/impl/EquipEventHandler.java +++ b/src/org/apollo/game/event/handler/impl/EquipEventHandler.java @@ -26,15 +26,15 @@ public final class EquipEventHandler extends EventHandler { int inventorySlot = event.getSlot(); Item equipping = player.getInventory().get(inventorySlot); int equippingId = equipping.getId(); - EquipmentDefinition equippingDef = EquipmentDefinition.lookup(equippingId); + EquipmentDefinition equippingDefinition = EquipmentDefinition.lookup(equippingId); - if (equippingDef == null) { + if (equippingDefinition == null) { ctx.breakHandlerChain(); return; } for (int id = 0; id < 5; id++) { - int requirement = equippingDef.getLevel(id); + int requirement = equippingDefinition.getLevel(id); if (player.getSkillSet().getSkill(id).getMaximumLevel() < requirement) { String skillName = Skill.getName(id); @@ -50,14 +50,12 @@ public final class EquipEventHandler extends EventHandler { Inventory inventory = player.getInventory(); Inventory equipment = player.getEquipment(); - // start - - int equipmentSlot = equippingDef.getSlot(); + int equipmentSlot = equippingDefinition.getSlot(); Item currentlyEquipped = equipment.get(equipmentSlot); if (equipping.getDefinition().isStackable() && (currentlyEquipped == null || currentlyEquipped.getId() == equippingId)) { - equipment.set(equippingDef.getSlot(), equipping); + equipment.set(equippingDefinition.getSlot(), equipping); inventory.reset(inventorySlot); ctx.breakHandlerChain(); return; @@ -66,7 +64,7 @@ public final class EquipEventHandler extends EventHandler { Item weapon = equipment.get(EquipmentConstants.WEAPON); Item shield = equipment.get(EquipmentConstants.SHIELD); - if (equippingDef.isTwoHanded()) { + if (equippingDefinition.isTwoHanded()) { int slotsRequired = weapon != null ? shield != null ? 1 : 0 : 0; if (inventory.freeSlots() < slotsRequired) { ctx.breakHandlerChain(); @@ -84,7 +82,7 @@ public final class EquipEventHandler extends EventHandler { inventory.add(weapon); } return; - } else if (equippingDef.getSlot() == EquipmentConstants.SHIELD && weapon != null + } else if (equippingDefinition.getSlot() == EquipmentConstants.SHIELD && weapon != null && EquipmentDefinition.lookup(weapon.getId()).isTwoHanded()) { equipment.set(EquipmentConstants.SHIELD, inventory.reset(inventorySlot)); inventory.add(equipment.reset(EquipmentConstants.WEAPON)); diff --git a/src/org/apollo/game/event/handler/impl/ItemVerificationHandler.java b/src/org/apollo/game/event/handler/impl/ItemVerificationHandler.java new file mode 100644 index 00000000..d29668cb --- /dev/null +++ b/src/org/apollo/game/event/handler/impl/ItemVerificationHandler.java @@ -0,0 +1,64 @@ +package org.apollo.game.event.handler.impl; + +import org.apollo.game.event.handler.EventHandler; +import org.apollo.game.event.handler.EventHandlerContext; +import org.apollo.game.event.impl.InventoryItemEvent; +import org.apollo.game.model.Inventory; +import org.apollo.game.model.Item; +import org.apollo.game.model.inter.bank.BankConstants; +import org.apollo.game.model.inv.SynchronizationInventoryListener; +import org.apollo.game.model.Player; + +/** + * An {@link EventHandler} which verifies {@link InventoryItemEvent}s. + * + * @author Chris Fletcher + */ +public final class ItemVerificationHandler extends EventHandler { + + /** + * Gets the inventory based on the interface id. + * + * @param player The player. + * @param interfaceId The interface id. + * @return The proper inventory. + * @throws IllegalArgumentException If the interface id is illegal. + */ + private static Inventory interfaceToInventory(Player player, int interfaceId) { + switch (interfaceId) { + + case SynchronizationInventoryListener.INVENTORY_ID: + case BankConstants.SIDEBAR_INVENTORY_ID: + return player.getInventory(); + + case SynchronizationInventoryListener.EQUIPMENT_ID: + return player.getEquipment(); + + case BankConstants.BANK_INVENTORY_ID: + return player.getBank(); + + default: + throw new IllegalArgumentException("Unknown interface id: " + interfaceId); + } + } + + /** + * Checks if the information provided by the event is valid, breaking the handler chain if it isn't. + */ + @Override + public void handle(EventHandlerContext ctx, Player player, InventoryItemEvent event) { + Inventory inventory = interfaceToInventory(player, event.getInterfaceId()); + + int slot = event.getSlot(); + if (slot < 0 || slot >= inventory.capacity()) { + ctx.breakHandlerChain(); + return; + } + + Item item = inventory.get(slot); + if (item == null || item.getId() != event.getId()) { + ctx.breakHandlerChain(); + } + } + +} \ No newline at end of file diff --git a/src/org/apollo/game/model/inter/bank/BankUtils.java b/src/org/apollo/game/model/inter/bank/BankUtils.java index 561928fa..66630547 100644 --- a/src/org/apollo/game/model/inter/bank/BankUtils.java +++ b/src/org/apollo/game/model/inter/bank/BankUtils.java @@ -32,14 +32,7 @@ public final class BankUtils { Inventory inventory = player.getInventory(); Inventory bank = player.getBank(); - if (slot < 0 || slot >= inventory.capacity()) { - return false; - } - Item item = inventory.get(slot); - if (item.getId() != id) { - return false; - } int newId = ItemDefinition.noteToItem(item.getId()); @@ -105,14 +98,7 @@ public final class BankUtils { Inventory inventory = player.getInventory(); Inventory bank = player.getBank(); - if (slot < 0 || slot >= bank.capacity()) { - return false; - } - Item item = bank.get(slot); - if (item == null || item.getId() != id) { - return false; - } if (amount >= item.getAmount()) { amount = item.getAmount();