package net.scapeemulator.game.model.player; import net.scapeemulator.game.content.grandexchange.GEOffer; import net.scapeemulator.game.content.grandexchange.OfferType; import net.scapeemulator.game.model.ExtendedOption; import net.scapeemulator.game.model.World; import net.scapeemulator.game.model.definition.ItemDefinitions; import net.scapeemulator.game.msg.impl.GrandExchangeUpdateMessage; import net.scapeemulator.game.msg.impl.ScriptMessage; import net.scapeemulator.game.msg.impl.inter.InterfaceAccessMessage; import net.scapeemulator.game.msg.impl.inter.InterfaceItemsMessage; import net.scapeemulator.game.msg.impl.inter.InterfaceOpenMessage; import net.scapeemulator.game.msg.impl.inter.InterfaceVisibleMessage; public class GrandExchangeHandler extends ScriptInputListenerAdapter { private Player player; private GEOffer[] playerOffers; private int activeItemId; private int price; private int amount; private int activeSlot; private OfferType type; private boolean searchOpen; private int customInputId; GrandExchangeHandler(Player player) { this.player = player; } public void init() { playerOffers = World.getWorld().getGrandExchange().getPlayerOffers(player.getDatabaseId()); for (GEOffer offer : playerOffers) { if (offer != null) { player.send(new GrandExchangeUpdateMessage(offer)); } } } public void handleOfferInventoryClick(int childId, int dynamicId) { if (player.getInterfaceSet().getInventory().getCurrentId() != 107 || childId != 18 || dynamicId < 0 || dynamicId > 27) { return; } Item item = player.getInventory().get(dynamicId); if (item == null) { return; } activeItemId = item.getDefinition().getUnnotedItemId(); setItemExamine("ID " + activeItemId + ": " + ItemDefinitions.forId(activeItemId).getName()); player.getStateSet().setState(1109, activeItemId); } public void handleMainInterface(int childId, ExtendedOption option) { if (player.getInterfaceSet().getWindow().getCurrentId() != 105) { return; } switch (childId) { case 18: case 34: if (option == ExtendedOption.ONE) { openOfferInterface((childId - 18) / 16); } else { abortOffer((childId - 18) / 16); } break; case 50: case 69: case 88: case 107: if (option == ExtendedOption.ONE) { openOfferInterface(((childId - 50) / 19) + 2); } else { abortOffer(((childId - 50) / 19) + 2); } break; case 30: case 31: case 46: case 47: newOfferInterface((childId - 30) / 16, OfferType.values()[(childId - 30) % 16]); break; case 62: case 63: case 81: case 82: case 100: case 101: case 119: case 120: newOfferInterface(((childId - 62) / 19) + 2, OfferType.values()[(childId - 62) % 19]); break; case 127: showInterface(); break; case 157: modifyAmount(-1, false); break; case 159: modifyAmount(1, false); break; case 162: case 164: case 166: modifyAmount((int) Math.pow(10, (childId - 162) / 2), type == OfferType.SELL); break; case 168: // Buy 1000, Sell all if (type == OfferType.BUY) { modifyAmount(1000, false); } else { modifyAmount(player.getInventory().getAmountNotedAndUnnoted(activeItemId), true); } break; case 170: // custom amount case 185: // custom price customInputId = childId; player.getScriptInput().showIntegerScriptInput("Enter " + (customInputId == 170 ? "amount" : "price") + ":", this); break; case 171: modifyPrice(-1); break; case 173: modifyPrice(1); break; case 177: // Market lowest break; case 180: // Market mid break; case 183: // Market highest break; case 190: submitOffer(); break; case 194: openSearch(); break; case 203: abortOffer(activeSlot); break; case 209: if (option == ExtendedOption.ONE) { collect(true, true); } else { collect(true, false); } break; case 211: collect(false, false); break; } } public void submitOffer() { if (activeItemId < 1 || amount < 1 || price < 1) { showInterface(); return; } if (type == OfferType.BUY) { int totalPrice = amount * price; if (player.getInventory().getAmount(995) < totalPrice) { player.sendMessage("You do not have enough coins to create this offer."); return; } player.getInventory().remove(new Item(995, totalPrice)); } else { Item toRemove = new Item(activeItemId, amount); if (player.getInventory().getAmountNotedAndUnnoted(toRemove.getId()) < toRemove.getAmount()) { player.sendMessage("You do not have that many items to offer."); return; } Item removed = player.getInventory().remove(toRemove); if (removed == null || !removed.equals(toRemove)) { if (toRemove.getDefinition().isStackable()) { System.out.println("This should never happen! Please report. ID: " + toRemove.getId() + " " + player.getDisplayName()); return; } toRemove = new Item(toRemove.getDefinition().getNotedItemId(), removed != null ? toRemove.getAmount() - removed.getAmount() : toRemove.getAmount()); removed = player.getInventory().remove(toRemove); if (!removed.equals(toRemove)) { return; } } } playerOffers[activeSlot] = World.getWorld().getGrandExchange().placeOffer(player.getDatabaseId(), activeSlot, type, activeItemId, price, amount, System.currentTimeMillis()); player.send(new GrandExchangeUpdateMessage(playerOffers[activeSlot])); showInterface(); } public void showInterface() { resetItemStats(); player.getStateSet().setState(563, 4194304); player.getStateSet().setState(1112, -1); player.getStateSet().setState(1113, -1); player.setInterfaceText(105, 14, "Item Exchange"); player.getInterfaceSet().openWindow(105); player.send(new InterfaceAccessMessage(105, 209, -1, -1, 6)); player.send(new InterfaceAccessMessage(105, 211, -1, -1, 6)); } public void abortOffer(int slot) { GEOffer offer = playerOffers[slot]; offer.abort(); if (playerOffers[slot].finished()) { removeOffer(slot); } else { player.send(new GrandExchangeUpdateMessage(offer)); sendUnclaimedSlots(); } } public void removeOffer(int slot) { player.send(new GrandExchangeUpdateMessage(GEOffer.clearSlot(slot))); World.getWorld().getGrandExchange().removeOffer(playerOffers[slot]); playerOffers[slot] = null; } public void openOfferInterface(int slot) { activeSlot = slot; activeItemId = playerOffers[activeSlot].getItemId(); setItemExamine("ID " + activeItemId + ": " + ItemDefinitions.forId(activeItemId).getName()); sendUnclaimedSlots(); player.getStateSet().setState(1112, slot); } public void collect(boolean itemSlot, boolean noted) { GEOffer offer = playerOffers[activeSlot]; if (itemSlot) { if (noted) { Item remaining = player.getInventory().add(new Item(ItemDefinitions.forId(offer.getItemId()).getNotedItemId(), offer.getUnclaimedItems())); if (remaining != null) { offer.setUnclaimedItems(remaining.getAmount()); } else { offer.setUnclaimedItems(0); } } else { Item remaining = player.getInventory().add(new Item(offer.getItemId(), offer.getUnclaimedItems())); if (remaining != null) { offer.setUnclaimedItems(remaining.getAmount()); } else { offer.setUnclaimedItems(0); } } } else { Item remaining = player.getInventory().add(new Item(995, offer.getUnclaimedCoins())); if (remaining != null) { offer.setUnclaimedCoins(remaining.getAmount()); } else { offer.setUnclaimedCoins(0); } } if (offer.finished()) { removeOffer(activeSlot); showInterface(); } else { sendUnclaimedSlots(); } } public void sendUnclaimedSlots() { GEOffer offer = playerOffers[activeSlot]; Item[] unclaimed = { new Item(offer.getUnclaimedItems() > 0 ? offer.getItemId() : -1, offer.getUnclaimedItems()), new Item(offer.getUnclaimedCoins() > 0 ? 995 : -1, offer.getUnclaimedCoins()) }; player.send(new InterfaceItemsMessage(523 + activeSlot, unclaimed)); } public void newOfferInterface(int slot, OfferType type) { resetItemStats(); this.type = type; activeSlot = slot; player.getStateSet().setState(1112, slot); player.getStateSet().setState(1113, type.ordinal()); if (type == OfferType.BUY) { openSearch(); } else { // TODO fix player.getInterfaceSet().openInventory(107); player.send(new ScriptMessage(149, "IviiiIsssss", "", "", "", "", "Offer", -1, 0, 7, 4, 93, 107 << 16 | 18)); // player.send(new InterfaceItemsMessage(107, 18, 93, player.getInventory().toArray())); player.send(new InterfaceVisibleMessage(107, 0, false)); player.send(new InterfaceAccessMessage(107, 18, 0, 27, 1026)); } } public void setItemExamine(String s) { player.setInterfaceText(105, 142, s); } public void modifyPrice(int value) { price += value; if (price < 1) { price = 1; } player.getStateSet().setState(1111, price); } public void setPrice(int value) { if (value < 1) { return; } price = value; player.getStateSet().setState(1111, price); } public void modifyAmount(int value, boolean set) { if (!set) { amount += value; } else { amount = value; } if (amount < 1) { amount = 1; } player.getStateSet().setState(1110, amount); } public void setAmount(int value) { if (value < 1) { return; } amount = value; player.getStateSet().setState(1110, amount); } public void openSearch() { player.send(new InterfaceOpenMessage(752, 6, 389, 6)); player.send(new ScriptMessage(570, "s", "Grand Exchange Item Search")); searchOpen = true; } public void searchComplete(int itemId) { if (!searchOpen) { return; } activeItemId = itemId; player.getStateSet().setState(1109, activeItemId); setItemExamine("ID " + activeItemId + ": " + ItemDefinitions.forId(activeItemId).getName()); searchOpen = false; } public void resetItemStats() { activeItemId = -1; price = 1; amount = 1; player.getStateSet().setState(1109, activeItemId); player.getStateSet().setState(1110, amount); player.getStateSet().setState(1111, price); player.getStateSet().setState(1114, 1); player.getStateSet().setState(1115, 1); player.getStateSet().setState(1116, Integer.MAX_VALUE); } @Override public void intInputReceived(int value) { if (customInputId == 170) { setAmount(value); } else if (customInputId == 185) { setPrice(value); } customInputId = 0; } }