package com.asteria.net.message.impl; import com.asteria.game.character.player.Player; import com.asteria.game.item.Item; import com.asteria.game.item.ItemDefinition; import com.asteria.game.shop.Shop; import com.asteria.net.message.InputMessageListener; import com.asteria.net.message.MessageBuilder; /** * The message sent from the client when a player operates an item on an * interface. * * @author lare96 <http://github.com/lare96> */ public final class ItemInterfaceMessage implements InputMessageListener { @Override public void handleMessage(Player player, int opcode, int size, MessageBuilder payload) { if (player.isDisabled()) return; switch (opcode) { case 145: firstSlot(player, payload); break; case 117: secondSlot(player, payload); break; case 43: thirdSlot(player, payload); break; case 129: fourthSlot(player, payload); break; case 41: equipItem(player, payload); break; case 214: swapSlots(player, payload); break; } } /** * Handles the first item slot click on an interface. * * @param player * the player to handle this for. * @param payload * the payloadfer for reading the sent data. */ private void firstSlot(Player player, MessageBuilder payload) { int interfaceId = payload.getShort(com.asteria.net.ValueType.A); int slot = payload.getShort(com.asteria.net.ValueType.A); int itemId = payload.getShort(com.asteria.net.ValueType.A); if (interfaceId < 0 || slot < 0 || itemId < 0) return; player.setSkillAction(false); switch (interfaceId) { case 1688: player.getEquipment().unequipItem(slot, true); player.getCombatBuilder().cooldown(true); break; case 5064: player.getBank().depositFromInventory(slot, 1); break; case 5382: player.getBank().withdraw(slot, 1, true); break; case 3900: Shop.SHOPS.get(player.getOpenShop()).sendPurchasePrice(player, new Item(itemId)); break; case 3823: Shop.SHOPS.get(player.getOpenShop()).sendSellingPrice(player, new Item(itemId)); break; case 3322: player.getTradeSession().add(new Item(itemId, 1), slot); break; case 3415: player.getTradeSession().remove(new Item(itemId, 1)); break; } } /** * Handles the second item slot click on an interface. * * @param player * the player to handle this for. * @param payload * the payloadfer for reading the sent data. */ private void secondSlot(Player player, MessageBuilder payload) { int interfaceId = payload.getShort(true, com.asteria.net.ValueType.A, com.asteria.net.ByteOrder.LITTLE); int itemId = payload.getShort(true, com.asteria.net.ValueType.A, com.asteria.net.ByteOrder.LITTLE); int slot = payload.getShort(true, com.asteria.net.ByteOrder.LITTLE); if (interfaceId < 0 || slot < 0 || itemId < 0) return; switch (interfaceId) { case 5064: player.getBank().depositFromInventory(slot, 5); break; case 5382: player.getBank().withdraw(slot, 5, true); break; case 3900: Shop.SHOPS.get(player.getOpenShop()).purchase(player, new Item(itemId, 1)); break; case 3823: Shop.SHOPS.get(player.getOpenShop()).sell(player, new Item(itemId, 1), slot); break; case 3322: player.getTradeSession().add(new Item(itemId, 5), slot); break; case 3415: player.getTradeSession().remove(new Item(itemId, 5)); break; } } /** * Handles the third item slot click on an interface. * * @param player * the player to handle this for. * @param payload * the payloadfer for reading the sent data. */ private void thirdSlot(Player player, MessageBuilder payload) { int interfaceId = payload.getShort(com.asteria.net.ByteOrder.LITTLE); int itemId = payload.getShort(com.asteria.net.ValueType.A); int slot = payload.getShort(com.asteria.net.ValueType.A); if (interfaceId < 0 || slot < 0 || itemId < 0) return; switch (interfaceId) { case 5064: player.getBank().depositFromInventory(slot, 10); break; case 5382: player.getBank().withdraw(slot, 10, true); break; case 3900: Shop.SHOPS.get(player.getOpenShop()).purchase(player, new Item(itemId, 5)); break; case 3823: Shop.SHOPS.get(player.getOpenShop()).sell(player, new Item(itemId, 5), slot); break; case 3322: player.getTradeSession().add(new Item(itemId, 10), slot); break; case 3415: player.getTradeSession().remove(new Item(itemId, 10)); break; } } /** * Handles the fourth item slot click on an interface. * * @param player * the player to handle this for. * @param payload * the payloadfer for reading the sent data. */ private void fourthSlot(Player player, MessageBuilder payload) { int slot = payload.getShort(com.asteria.net.ValueType.A); int interfaceId = payload.getShort(); int itemId = payload.getShort(com.asteria.net.ValueType.A); if (interfaceId < 0 || slot < 0 || itemId < 0) return; switch (interfaceId) { case 5064: player.getBank().depositFromInventory(slot, player.getInventory().amount(player.getInventory().getId(slot))); break; case 5382: int amount = 0; if (player.isWithdrawAsNote()) { amount = player.getBank().amount(itemId); } else { Item itemWithdrew = new Item(itemId, 1); amount = ItemDefinition.DEFINITIONS[itemWithdrew.getId()].isStackable() ? player.getBank().amount(itemId) : 28; } player.getBank().withdraw(slot, amount, true); break; case 3900: Shop.SHOPS.get(player.getOpenShop()).purchase(player, new Item(itemId, 10)); break; case 3823: Shop.SHOPS.get(player.getOpenShop()).sell(player, new Item(itemId, 10), slot); break; case 3322: player.getTradeSession().add(new Item(itemId, player.getInventory().amount(itemId)), slot); break; case 3415: player.getTradeSession().remove(new Item(itemId, player.getTradeSession().getContainer().amount(itemId))); break; } } /** * Handles the equipping of an item for {@code player}. * * @param player * the player to handle this for. * @param payload * the payloadfer for reading the sent data. */ private void equipItem(Player player, MessageBuilder payload) { int itemId = payload.getShort(false); int slot = payload.getShort(false, com.asteria.net.ValueType.A); int interfaceId = payload.getShort(false, com.asteria.net.ValueType.A); if (interfaceId < 0 || slot < 0 || itemId < 0) return; switch (itemId) { } player.getEquipment().equipItem(slot); player.setSkillAction(false); player.getCombatBuilder().cooldown(true); } /** * Handles the swapping of items on an interface for {@code player}. * * @param player * the player to handle this for. * @param payload * the payloadfer for reading the sent data. */ private void swapSlots(Player player, MessageBuilder payload) { int interfaceId = payload.getShort(com.asteria.net.ValueType.A, com.asteria.net.ByteOrder.LITTLE); payload.get(com.asteria.net.ValueType.C); int fromSlot = payload.getShort(com.asteria.net.ValueType.A, com.asteria.net.ByteOrder.LITTLE); int toSlot = payload.getShort(com.asteria.net.ByteOrder.LITTLE); if (interfaceId < 0 || fromSlot < 0 || toSlot < 0) return; switch (interfaceId) { case 3214: player.getInventory().swap(fromSlot, toSlot); player.getInventory().refresh(); break; case 5382: if (player.isInsertItem()) { player.getBank().swap(fromSlot, toSlot); } else { player.getBank().transfer(fromSlot, toSlot); } player.getBank().refresh(); break; } } }