Guest User

Shop.java

a guest
Jul 19th, 2012
641
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.83 KB | None | 0 0
  1. package com.rs.game.player.content;
  2.  
  3. import java.util.concurrent.CopyOnWriteArrayList;
  4.  
  5. import com.rs.cache.loaders.ItemDefinitions;
  6. import com.rs.game.item.Item;
  7. import com.rs.game.player.Player;
  8. import com.rs.utils.ItemExamines;
  9. import com.rs.utils.ItemSetsKeyGenerator;
  10.  
  11. public class Shop {
  12.  
  13.     private static final int MAIN_STOCK_ITEMS_KEY = ItemSetsKeyGenerator.generateKey();
  14.  
  15.     private static final int MAX_SHOP_ITEMS = 40;
  16.     public static final int COINS = 995;
  17.  
  18.     private String name;
  19.     private Item[] mainStock;
  20.     private int[] defaultQuantity;
  21.     private Item[] generalStock;
  22.     private int money;
  23.     private CopyOnWriteArrayList<Player> viewingPlayers;
  24.  
  25.     public Shop(String name, int money, Item[] mainStock, boolean isGeneralStore) {
  26.         viewingPlayers = new CopyOnWriteArrayList<Player>();
  27.         this.name = name;
  28.         this.money = money;
  29.         this.mainStock = mainStock;
  30.         defaultQuantity = new int[mainStock.length];
  31.         for (int i = 0; i < defaultQuantity.length; i++)
  32.             defaultQuantity[i] = mainStock[i].getAmount();
  33.         if (isGeneralStore && mainStock.length < MAX_SHOP_ITEMS)
  34.             generalStock = new Item[MAX_SHOP_ITEMS - mainStock.length];
  35.     }
  36.  
  37.     public boolean isGeneralStore() {
  38.         return generalStock != null;
  39.     }
  40.  
  41.     public void addPlayer(final Player player) {
  42.         viewingPlayers.add(player);
  43.         player.getTemporaryAttributtes().put("Shop", this);
  44.         player.setCloseInterfacesEvent(new Runnable() {
  45.             @Override
  46.             public void run() {
  47.                 viewingPlayers.remove(player);
  48.                 player.getTemporaryAttributtes().remove("Shop");
  49.                 if ((boolean) player.getTemporaryAttributtes().get("shop_buying") == false) //if in sell tab
  50.                     player.getTemporaryAttributtes().put("update_shop", false);
  51.                 player.getTemporaryAttributtes().remove("amount_shop");
  52.             }
  53.         });
  54.         player.getPackets().sendConfig(118, MAIN_STOCK_ITEMS_KEY);
  55.         player.getPackets().sendConfig(1496, -1);
  56.         player.getPackets().sendConfig(532, money);
  57.         sendStore(player);
  58.         player.getPackets().sendGlobalConfig(199, -1);
  59.         player.getInterfaceManager().sendInterface(1265);
  60.         for (int i = 0; i < MAX_SHOP_ITEMS; i++)
  61.             player.getPackets().sendGlobalConfig(946 + i, i < defaultQuantity.length ? defaultQuantity[i]: generalStock != null ? 0 : -1);// prices
  62.         player.getPackets().sendGlobalConfig(1241, 16750848);
  63.         player.getPackets().sendGlobalConfig(1242, 15439903);
  64.         player.getPackets().sendGlobalConfig(741, -1);
  65.         player.getPackets().sendGlobalConfig(743, -1);
  66.         player.getPackets().sendGlobalConfig(744, 0);
  67.         if (generalStock != null)
  68.             player.getPackets().sendHideIComponent(1265, 19, false);
  69.         player.getPackets().sendIComponentSettings(1265, 20, 0, getStoreSize() * 6, 1150);
  70.         player.getPackets().sendIComponentSettings(1265, 26, 0, getStoreSize() * 6, 82903066);
  71.         sendInventory(player);
  72.         player.getPackets().sendIComponentText(1265, 85, name);
  73.         if (player.getTemporaryAttributtes().get("update_shop") == null)
  74.             player.getTemporaryAttributtes().put("shop_buying", true);
  75.         else
  76.             player.getTemporaryAttributtes().put("shop_buying", false);
  77.         player.getTemporaryAttributtes().put("amount_shop", 1);
  78.     }
  79.  
  80.     public void sendInventory(Player player) {
  81.         player.getInterfaceManager().sendInventoryInterface(1266);
  82.         player.getPackets().sendItems(93, player.getInventory().getItems());
  83.         player.getPackets().sendUnlockIComponentOptionSlots(1266, 0, 0, 27, 0,
  84.                 1, 2, 3, 4, 5);
  85.         player.getPackets().sendInterSetItemsOptionsScript(1266, 0, 93, 4, 7,
  86.                 "Value", "Sell 1", "Sell 5", "Sell 10", "Sell 50", "Examine");
  87.     }
  88.     //cid 67
  89.     public void buy(Player player, int slotId, int quantity) {
  90.         if (slotId >= getStoreSize())
  91.             return;
  92.         Item item = slotId >= mainStock.length ? generalStock[slotId - mainStock.length] : mainStock[slotId];
  93.         if (item == null)
  94.             return;
  95.         if (item.getAmount() == 0) {
  96.             player.getPackets().sendGameMessage("There is no stock of that item at the moment.");
  97.             return;
  98.         }
  99.         //int dq = slotId >= mainStock.length ? 0 : defaultQuantity[slotId]; not sure what is this
  100.         int price = getBuyPrice(item);
  101.         int amountCoins = player.getInventory().getItems().getNumberOf(money);
  102.         int maxQuantity = amountCoins / price;
  103.         int buyQ = item.getAmount() > quantity ? quantity : item.getAmount();
  104.         boolean enoughCoins = maxQuantity >= buyQ;
  105.         if (!enoughCoins) {
  106.             player.getPackets().sendGameMessage("You don't have enough coins.");
  107.             buyQ = maxQuantity;
  108.         } else if (quantity > buyQ)
  109.             player.getPackets().sendGameMessage(
  110.                     "The shop has run out of stock.");
  111.         if (item.getDefinitions().isStackable()) {
  112.             if (player.getInventory().getFreeSlots() < 1) {
  113.                 player.getPackets().sendGameMessage(
  114.                         "Not enough space in your inventory.");
  115.                 return;
  116.             }
  117.         } else {
  118.             int freeSlots = player.getInventory().getFreeSlots();
  119.             if (buyQ > freeSlots) {
  120.                 buyQ = freeSlots;
  121.                 player.getPackets().sendGameMessage(
  122.                         "Not enough space in your inventory.");
  123.             }
  124.         }
  125.         if (buyQ != 0) {
  126.             int totalPrice = price * buyQ;
  127.             player.getInventory().deleteItem(money, totalPrice);
  128.             player.getInventory().addItem(item.getId(), buyQ);
  129.             item.setAmount(item.getAmount() - buyQ);
  130.             if (item.getAmount() <= 0 && slotId >= mainStock.length)
  131.                 generalStock[slotId - mainStock.length] = null;
  132.             refreshShop();
  133.             sendInventory(player);
  134.         }
  135.     }
  136.  
  137.     public void restoreItems() {
  138.         boolean needRefresh = false;
  139.         for (int i = 0; i < mainStock.length; i++) {
  140.             if (mainStock[i].getAmount() < defaultQuantity[i]) {
  141.                 mainStock[i].setAmount(mainStock[i].getAmount() + 1);
  142.                 needRefresh = true;
  143.             } else if (mainStock[i].getAmount() > defaultQuantity[i]) {
  144.                 mainStock[i].setAmount(mainStock[i].getAmount() + -1);
  145.                 needRefresh = true;
  146.             }
  147.         }
  148.         if (generalStock != null) {
  149.             for (int i = 0; i < generalStock.length; i++) {
  150.                 Item item = generalStock[i];
  151.                 if (item == null)
  152.                     continue;
  153.                 item.setAmount(item.getAmount() - 1);
  154.                 if (item.getAmount() <= 0)
  155.                     generalStock[i] = null;
  156.                 needRefresh = true;
  157.             }
  158.         }
  159.         if (needRefresh)
  160.             refreshShop();
  161.     }
  162.  
  163.     private boolean addItem(int itemId, int quantity) {
  164.         for (Item item : mainStock) {
  165.             if (item.getId() == itemId) {
  166.                 item.setAmount(item.getAmount() + quantity);
  167.                 refreshShop();
  168.                 return true;
  169.             }
  170.         }
  171.         if (generalStock != null) {
  172.             for (Item item : generalStock) {
  173.                 if (item == null)
  174.                     continue;
  175.                 if (item.getId() == itemId) {
  176.                     item.setAmount(item.getAmount() + quantity);
  177.                     refreshShop();
  178.                     return true;
  179.                 }
  180.             }
  181.             for (int i = 0; i < generalStock.length; i++) {
  182.                 if (generalStock[i] == null) {
  183.                     generalStock[i] = new Item(itemId, quantity);
  184.                     refreshShop();
  185.                     return true;
  186.                 }
  187.             }
  188.         }
  189.         return false;
  190.     }
  191.  
  192.     public void sell(Player player, int slotId, int quantity) {
  193.         if (player.getInventory().getItemsContainerSize() < slotId)
  194.             return;
  195.         Item item = player.getInventory().getItem(slotId);
  196.         if (item == null)
  197.             return;
  198.         int originalId = item.getId();
  199.         if (item.getDefinitions().isNoted())
  200.             item = new Item(item.getDefinitions().getCertId(), item.getAmount());
  201.         if (item.getDefinitions().isDestroyItem()
  202.                 || ItemConstants.getItemDefaultCharges(item.getId()) != -1
  203.                 || !ItemConstants.isTradeable(item) || item.getId() == money) {
  204.             player.getPackets().sendGameMessage("You can't sell this item.");
  205.             return;
  206.         }
  207.         int dq = getDefaultQuantity(item.getId());
  208.         if (dq == -1 && generalStock == null) {
  209.             player.getPackets().sendGameMessage(
  210.                     "You can't sell this item to this shop.");
  211.             return;
  212.         }
  213.         int price = getSellPrice(item, dq);
  214.         int numberOff = player.getInventory().getItems()
  215.                 .getNumberOf(originalId);
  216.         if (quantity > numberOff)
  217.             quantity = numberOff;
  218.         if (!addItem(item.getId(), quantity)) {
  219.             player.getPackets().sendGameMessage("Shop is currently full.");
  220.             return;
  221.         }
  222.         player.getInventory().deleteItem(originalId, quantity);
  223.         player.getInventory().addItem(money, price * quantity);
  224.     }
  225.  
  226.     public void sendValue(Player player, int slotId) {
  227.         if (player.getInventory().getItemsContainerSize() < slotId)
  228.             return;
  229.         Item item = player.getInventory().getItem(slotId);
  230.         if (item == null)
  231.             return;
  232.         if (item.getDefinitions().isNoted())
  233.             item = new Item(item.getDefinitions().getCertId(), item.getAmount());
  234.         if (item.getDefinitions().isNoted() || !ItemConstants.isTradeable(item)
  235.                 || item.getId() == money) {
  236.             player.getPackets().sendGameMessage("You can't sell this item.");
  237.             return;
  238.         }
  239.         int dq = getDefaultQuantity(item.getId());
  240.         if (dq == -1 && generalStock == null) {
  241.             player.getPackets().sendGameMessage(
  242.                     "You can't sell this item to this shop.");
  243.             return;
  244.         }
  245.         int price = getSellPrice(item, dq);
  246.         player.getPackets().sendGameMessage(
  247.                 item.getDefinitions().getName()
  248.                 + ": shop will buy for: "
  249.                 + price
  250.                 + " "
  251.                 + ItemDefinitions.getItemDefinitions(money).getName()
  252.                 .toLowerCase()
  253.                 + ". Right-click the item to sell.");
  254.     }
  255.  
  256.     public int getDefaultQuantity(int itemId) {
  257.         for (int i = 0; i < mainStock.length; i++)
  258.             if (mainStock[i].getId() == itemId)
  259.                 return defaultQuantity[i];
  260.         return -1;
  261.     }
  262.  
  263.     public void sendInfo(Player player, int slotId, boolean isBuying) {
  264.         if (slotId >= getStoreSize())
  265.             return;
  266.         Item[] stock = isBuying ? mainStock : player.getInventory().getItems().getItems();
  267.         Item item = slotId >= stock.length ? generalStock[slotId - stock.length] : stock[slotId];
  268.         if (item == null)
  269.             return;
  270.         int price = getBuyPrice(item);
  271.         player.getPackets().sendGameMessage(item.getDefinitions().getName() + ": shop will " + (isBuying ? "sell" : "buy") +" for " + price + " " + ItemDefinitions.getItemDefinitions(money).getName().toLowerCase() + ".");
  272.     }
  273.  
  274.     public int getBuyPrice(Item item) {
  275.         int price = item.getDefinitions().getValue();
  276.         if (price == 0)
  277.             price = 1;
  278.         return price; // TODO formula
  279.     }
  280.  
  281.     public int getSellPrice(Item item, int dq) {
  282.         return item.getDefinitions().getValue() / 2; // TODO formula
  283.     }
  284.  
  285.     public void sendExamine(Player player, int slotId) {
  286.         if (slotId >= getStoreSize())
  287.             return;
  288.         Item item = slotId >= mainStock.length ? generalStock[slotId
  289.                                                               - mainStock.length] : mainStock[slotId];
  290.         if (item == null)
  291.             return;
  292.         player.getPackets().sendGameMessage(ItemExamines.getExamine(item));
  293.     }
  294.  
  295.     public void refreshShop() {
  296.         for (Player player : viewingPlayers) {
  297.             sendStore(player);
  298.             player.getPackets().sendIComponentSettings(620, 25, 0,
  299.                     getStoreSize() * 6, 1150);
  300.         }
  301.     }
  302.  
  303.     public int getStoreSize() {
  304.         return mainStock.length
  305.                 + (generalStock != null ? generalStock.length : 0);
  306.     }
  307.  
  308.     public void sendStore(Player player) {
  309.         Item[] stock = new Item[mainStock.length
  310.                                 + (generalStock != null ? generalStock.length : 0)];
  311.         System.arraycopy(mainStock, 0, stock, 0, mainStock.length);
  312.         if (generalStock != null)
  313.             System.arraycopy(generalStock, 0, stock, mainStock.length,
  314.                     generalStock.length);
  315.         player.getPackets().sendItems(MAIN_STOCK_ITEMS_KEY, stock);
  316.     }
  317.  
  318.     public void sendSellStore(Player player, Item[] inventory) {
  319.         Item[] stock = new Item[inventory.length + (generalStock != null ? generalStock.length : 0)];
  320.         System.arraycopy(inventory, 0, stock, 0, inventory.length);
  321.         if (generalStock != null)
  322.             System.arraycopy(generalStock, 0, stock, inventory.length, generalStock.length);
  323.         player.getPackets().sendItems(MAIN_STOCK_ITEMS_KEY, stock);
  324.     }
  325.  
  326.     /**
  327.      * Checks if the player is buying an item or selling it.
  328.      * @param player The player
  329.      * @param slotId The slot id
  330.      * @param amount The amount
  331.      */
  332.     public void handleShop(Player player, int slotId, int amount) {
  333.         boolean isBuying = player.getTemporaryAttributtes().get("shop_buying") != null;
  334.         if (isBuying)
  335.             buy(player, slotId, amount);
  336.         else
  337.             sell(player, slotId, amount);
  338.     }
  339.  
  340.     public Item[] getMainStock() {
  341.         return this.mainStock;
  342.     }
  343.  
  344. }
Advertisement
Add Comment
Please, Sign In to add comment