Guest User

Untitled

a guest
Jul 17th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.69 KB | None | 0 0
  1. package com.rs.game.player.content;
  2.  
  3. import java.util.HashMap;
  4. import java.util.concurrent.CopyOnWriteArrayList;
  5.  
  6. import com.rs.cache.loaders.ItemDefinitions;
  7. import com.rs.game.item.Item;
  8. import com.rs.game.player.CombatDefinitions;
  9. import com.rs.game.player.Player;
  10. import com.rs.game.player.Skills;
  11. import com.rs.utils.ItemBonuses;
  12. import com.rs.utils.ItemExamines;
  13. import com.rs.utils.ItemSetsKeyGenerator;
  14.  
  15. public class Shop {
  16.  
  17. private static final int MAIN_STOCK_ITEMS_KEY = ItemSetsKeyGenerator
  18. .generateKey();
  19.  
  20. private static final int MAX_SHOP_ITEMS = 40;
  21. public static final int COINS = 995;
  22.  
  23. private String name;
  24. private Item[] mainStock;
  25. private int[] defaultQuantity;
  26. private Item[] generalStock;
  27. private int money;
  28. private CopyOnWriteArrayList<Player> viewingPlayers;
  29.  
  30. public Shop(String name, int money, Item[] mainStock, boolean isGeneralStore) {
  31. viewingPlayers = new CopyOnWriteArrayList<Player>();
  32. this.name = name;
  33. this.money = money;
  34. this.mainStock = mainStock;
  35. defaultQuantity = new int[mainStock.length];
  36. for (int i = 0; i < defaultQuantity.length; i++)
  37. defaultQuantity[i] = mainStock[i].getAmount();
  38. if (isGeneralStore && mainStock.length < MAX_SHOP_ITEMS)
  39. generalStock = new Item[MAX_SHOP_ITEMS - mainStock.length];
  40. }
  41.  
  42. public boolean isGeneralStore() {
  43. return generalStock != null;
  44. }
  45.  
  46. public void addPlayer(final Player player) {
  47. viewingPlayers.add(player);
  48. player.getTemporaryAttributtes().put("Shop", this);
  49. player.setCloseInterfacesEvent(new Runnable() {
  50. @Override
  51. public void run() {
  52. viewingPlayers.remove(player);
  53. player.getTemporaryAttributtes().remove("Shop");
  54. }
  55. });
  56.  
  57. player.getPackets().sendConfig(118, MAIN_STOCK_ITEMS_KEY); // sets
  58. // mainstock
  59. // items set
  60. player.getPackets().sendConfig(1496, -1); // sets samples items set
  61. player.getPackets().sendConfig(532, money);
  62. sendStore(player);
  63. player.getPackets().sendGlobalConfig(199, -1);// unknown
  64. player.getInterfaceManager().sendInterface(620); // opens shop
  65. for (int i = 0; i < MAX_SHOP_ITEMS; i++)
  66. player.getPackets().sendGlobalConfig(
  67. 946 + i,
  68. i < defaultQuantity.length ? defaultQuantity[i]
  69. : generalStock != null ? 0 : -1);// prices
  70. player.getPackets().sendGlobalConfig(1241, 16750848);// unknown
  71. player.getPackets().sendGlobalConfig(1242, 15439903);// unknown
  72. player.getPackets().sendGlobalConfig(741, -1);// unknown
  73. player.getPackets().sendGlobalConfig(743, -1);// unknown
  74. player.getPackets().sendGlobalConfig(744, 0);// unknown
  75. if (generalStock != null)
  76. player.getPackets().sendHideIComponent(620, 19, false); // unlocks
  77. // general
  78. // store
  79. // icon
  80. player.getPackets().sendIComponentSettings(620, 25, 0,
  81. getStoreSize() * 6, 1150); // unlocks stock slots
  82. sendInventory(player);
  83. player.getPackets().sendIComponentText(620, 20, name);
  84. }
  85.  
  86. public void sendInventory(Player player) {
  87. player.getInterfaceManager().sendInventoryInterface(621);
  88. player.getPackets().sendItems(93, player.getInventory().getItems());
  89. player.getPackets().sendUnlockIComponentOptionSlots(621, 0, 0, 27, 0,
  90. 1, 2, 3, 4, 5);
  91. player.getPackets().sendInterSetItemsOptionsScript(621, 0, 93, 4, 7,
  92. "Value", "Sell 1", "Sell 5", "Sell 10", "Sell 50", "Examine");
  93. }
  94.  
  95. public int getSlotId(int clickSlotId) {
  96. return clickSlotId / 6;
  97. }
  98.  
  99. public void buy(Player player, int clickSlot, int quantity) {
  100. int slotId = getSlotId(clickSlot);
  101. if (slotId >= getStoreSize())
  102. return;
  103. Item item = slotId >= mainStock.length ? generalStock[slotId
  104. - mainStock.length] : mainStock[slotId];
  105. if (item == null)
  106. return;
  107. if (item.getAmount() == 0) {
  108. player.getPackets().sendGameMessage(
  109. "There is no stock of that item at the moment.");
  110. return;
  111. }
  112. int dq = slotId >= mainStock.length ? 0 : defaultQuantity[slotId];
  113. int price = getBuyPrice(item, dq);
  114. int amountCoins = player.getInventory().getItems().getNumberOf(money);
  115. int maxQuantity = amountCoins / price;
  116. int buyQ = item.getAmount() > quantity ? quantity : item.getAmount();
  117.  
  118. boolean enoughCoins = maxQuantity >= buyQ;
  119. if (!enoughCoins) {
  120. player.getPackets().sendGameMessage("You don't have enough coins.");
  121. buyQ = maxQuantity;
  122. } else if (quantity > buyQ)
  123. player.getPackets().sendGameMessage(
  124. "The shop has run out of stock.");
  125. if (item.getDefinitions().isStackable()) {
  126. if (player.getInventory().getFreeSlots() < 1) {
  127. player.getPackets().sendGameMessage(
  128. "Not enough space in your inventory.");
  129. return;
  130. }
  131. } else {
  132. int freeSlots = player.getInventory().getFreeSlots();
  133. if (buyQ > freeSlots) {
  134. buyQ = freeSlots;
  135. player.getPackets().sendGameMessage(
  136. "Not enough space in your inventory.");
  137. }
  138. }
  139. if (buyQ != 0) {
  140. int totalPrice = price * buyQ;
  141. player.getInventory().deleteItem(money, totalPrice);
  142. player.getInventory().addItem(item.getId(), buyQ);
  143. item.setAmount(item.getAmount() - buyQ);
  144. if (item.getAmount() <= 0 && slotId >= mainStock.length)
  145. generalStock[slotId - mainStock.length] = null;
  146. refreshShop();
  147. sendInventory(player);
  148. }
  149. }
  150.  
  151. public void restoreItems() {
  152. boolean needRefresh = false;
  153. for (int i = 0; i < mainStock.length; i++) {
  154. if (mainStock[i].getAmount() < defaultQuantity[i]) {
  155. mainStock[i].setAmount(mainStock[i].getAmount() + 1);
  156. needRefresh = true;
  157. } else if (mainStock[i].getAmount() > defaultQuantity[i]) {
  158. mainStock[i].setAmount(mainStock[i].getAmount() + -1);
  159. needRefresh = true;
  160. }
  161. }
  162. if (generalStock != null) {
  163. for (int i = 0; i < generalStock.length; i++) {
  164. Item item = generalStock[i];
  165. if (item == null)
  166. continue;
  167. item.setAmount(item.getAmount() - 1);
  168. if (item.getAmount() <= 0)
  169. generalStock[i] = null;
  170. needRefresh = true;
  171. }
  172. }
  173. if (needRefresh)
  174. refreshShop();
  175. }
  176.  
  177. private boolean addItem(int itemId, int quantity) {
  178. for (Item item : mainStock) {
  179. if (item.getId() == itemId) {
  180. item.setAmount(item.getAmount() + quantity);
  181. refreshShop();
  182. return true;
  183. }
  184. }
  185. if (generalStock != null) {
  186. for (Item item : generalStock) {
  187. if (item == null)
  188. continue;
  189. if (item.getId() == itemId) {
  190. item.setAmount(item.getAmount() + quantity);
  191. refreshShop();
  192. return true;
  193. }
  194. }
  195. for (int i = 0; i < generalStock.length; i++) {
  196. if (generalStock[i] == null) {
  197. generalStock[i] = new Item(itemId, quantity);
  198. refreshShop();
  199. return true;
  200. }
  201. }
  202. }
  203. return false;
  204. }
  205.  
  206. public void sell(Player player, int slotId, int quantity) {
  207. if (player.getInventory().getItemsContainerSize() < slotId)
  208. return;
  209. Item item = player.getInventory().getItem(slotId);
  210. if (item == null)
  211. return;
  212. int originalId = item.getId();
  213. if (item.getDefinitions().isNoted())
  214. item = new Item(item.getDefinitions().getCertId(), item.getAmount());
  215. if (item.getDefinitions().isDestroyItem()
  216. || ItemConstants.getItemDefaultCharges(item.getId()) != -1
  217. || !ItemConstants.isTradeable(item) || item.getId() == money) {
  218. player.getPackets().sendGameMessage("You can't sell this item.");
  219. return;
  220. }
  221. int dq = getDefaultQuantity(item.getId());
  222. if (dq == 0 && generalStock == null) {
  223. player.getPackets().sendGameMessage(
  224. "You can't sell this item to this shop.");
  225. return;
  226. }
  227. int price = getSellPrice(item, dq);
  228. int numberOff = player.getInventory().getItems()
  229. .getNumberOf(originalId);
  230. if (quantity > numberOff)
  231. quantity = numberOff;
  232. if (!addItem(item.getId(), quantity)) {
  233. player.getPackets().sendGameMessage("Shop is currently full.");
  234. return;
  235. }
  236. player.getInventory().deleteItem(originalId, quantity);
  237. player.getInventory().addItem(money, price * quantity);
  238. }
  239.  
  240. public void sendValue(Player player, int slotId) {
  241. if (player.getInventory().getItemsContainerSize() < slotId)
  242. return;
  243. Item item = player.getInventory().getItem(slotId);
  244. if (item == null)
  245. return;
  246. if (item.getDefinitions().isNoted())
  247. item = new Item(item.getDefinitions().getCertId(), item.getAmount());
  248. if (item.getDefinitions().isNoted() || !ItemConstants.isTradeable(item)
  249. || item.getId() == money) {
  250. player.getPackets().sendGameMessage("You can't sell this item.");
  251. return;
  252. }
  253. int dq = getDefaultQuantity(item.getId());
  254. if (dq == 0 && generalStock == null) {
  255. player.getPackets().sendGameMessage(
  256. "You can't sell this item to this shop.");
  257. return;
  258. }
  259. int price = getSellPrice(item, dq);
  260. player.getPackets().sendGameMessage(
  261. item.getDefinitions().getName()
  262. + ": shop will buy for: "
  263. + price
  264. + " "
  265. + ItemDefinitions.getItemDefinitions(money).getName()
  266. .toLowerCase()
  267. + ". Right-click the item to sell.");
  268. }
  269.  
  270. public int getDefaultQuantity(int itemId) {
  271. for (int i = 0; i < mainStock.length; i++)
  272. if (mainStock[i].getId() == itemId)
  273. return defaultQuantity[i];
  274. return 0;
  275. }
  276.  
  277. public void sendInfo(Player player, int clickSlot) {
  278. int slotId = getSlotId(clickSlot);
  279. if (slotId >= getStoreSize())
  280. return;
  281. Item item = slotId >= mainStock.length ? generalStock[slotId
  282. - mainStock.length] : mainStock[slotId];
  283. if (item == null)
  284. return;
  285. player.getTemporaryAttributtes().put("ShopSelectedSlot", clickSlot);
  286. int dq = slotId >= mainStock.length ? 0 : defaultQuantity[slotId];
  287. int price = getBuyPrice(item, dq);
  288. player.getPackets().sendGameMessage(
  289. item.getDefinitions().getName()
  290. + ": currently costs "
  291. + price
  292. + " "
  293. + ItemDefinitions.getItemDefinitions(money).getName()
  294. .toLowerCase() + ".");
  295. player.getInterfaceManager().sendInventoryInterface(449);
  296. player.getPackets().sendGlobalConfig(741, item.getId());
  297. player.getPackets().sendGlobalConfig(743, money);
  298. player.getPackets().sendUnlockIComponentOptionSlots(449, 15, -1, 0, 0,
  299. 1, 2, 3, 4); // unlocks buy
  300. player.getPackets().sendGlobalConfig(744, price);
  301. player.getPackets().sendGlobalConfig(745, 0);
  302. player.getPackets().sendGlobalConfig(746, -1);
  303. player.getPackets().sendGlobalConfig(168, 98);
  304. player.getPackets().sendGlobalString(25, ItemExamines.getExamine(item));
  305. player.getPackets().sendGlobalString(34, ""); // quest id for some items
  306. int[] bonuses = ItemBonuses.getItemBonuses(item.getId());
  307. if (bonuses != null) {
  308. HashMap<Integer, Integer> requiriments = item.getDefinitions()
  309. .getWearingSkillRequiriments();
  310. if (requiriments != null && !requiriments.isEmpty()) {
  311. String reqsText = "";
  312. for (int skillId : requiriments.keySet()) {
  313. if (skillId > 24 || skillId < 0)
  314. continue;
  315. int level = requiriments.get(skillId);
  316. if (level < 0 || level > 120)
  317. continue;
  318. boolean hasReq = player.getSkills().getLevelForXp(skillId) >= level;
  319. reqsText += "<br>"
  320. + (hasReq ? "<col=00ff00>" : "<col=ff0000>")
  321. + "Level " + level + " "
  322. + Skills.SKILL_NAME[skillId];
  323. }
  324. player.getPackets().sendGlobalString(26,
  325. "<br>Worn on yourself, requiring: " + reqsText);
  326. } else
  327. player.getPackets()
  328. .sendGlobalString(26, "<br>Worn on yourself");
  329. player.getPackets().sendGlobalString(
  330. 35,
  331. "<br>Attack<br><col=ffff00>+"
  332. + bonuses[CombatDefinitions.STAB_ATTACK]
  333. + "<br><col=ffff00>+"
  334. + bonuses[CombatDefinitions.SLASH_ATTACK]
  335. + "<br><col=ffff00>+"
  336. + bonuses[CombatDefinitions.CRUSH_ATTACK]
  337. + "<br><col=ffff00>+"
  338. + bonuses[CombatDefinitions.MAGIC_ATTACK]
  339. + "<br><col=ffff00>+"
  340. + bonuses[CombatDefinitions.RANGE_ATTACK]
  341. + "<br><col=ffff00>---" + "<br>Strength"
  342. + "<br>Ranged Strength" + "<br>Magic Damage"
  343. + "<br>Absorve Melee" + "<br>Absorve Magic"
  344. + "<br>Absorve Ranged" + "<br>Prayer Bonus");
  345. player.getPackets()
  346. .sendGlobalString(36,
  347. "<br><br>Stab<br>Slash<br>Crush<br>Magic<br>Ranged<br>Summoning");
  348. player.getPackets().sendGlobalString(
  349. 52,
  350. "<<br>Defence<br><col=ffff00>+"
  351. + bonuses[CombatDefinitions.STAB_DEF]
  352. + "<br><col=ffff00>+"
  353. + bonuses[CombatDefinitions.SLASH_DEF]
  354. + "<br><col=ffff00>+"
  355. + bonuses[CombatDefinitions.CRUSH_DEF]
  356. + "<br><col=ffff00>+"
  357. + bonuses[CombatDefinitions.MAGIC_DEF]
  358. + "<br><col=ffff00>+"
  359. + bonuses[CombatDefinitions.RANGE_DEF]
  360. + "<br><col=ffff00>+"
  361. + bonuses[CombatDefinitions.SUMMONING_DEF]
  362. + "<br><col=ffff00>+"
  363. + bonuses[CombatDefinitions.STRENGTH_BONUS]
  364. + "<br><col=ffff00>"
  365. + bonuses[CombatDefinitions.RANGED_STR_BONUS]
  366. + "<br><col=ffff00>"
  367. + bonuses[CombatDefinitions.MAGIC_DAMAGE]
  368. + "%<br><col=ffff00>"
  369. + bonuses[CombatDefinitions.ABSORVE_MELEE_BONUS]
  370. + "%<br><col=ffff00>"
  371. + bonuses[CombatDefinitions.ABSORVE_MAGE_BONUS]
  372. + "%<br><col=ffff00>"
  373. + bonuses[CombatDefinitions.ABSORVE_RANGE_BONUS]
  374. + "%<br><col=ffff00>"
  375. + bonuses[CombatDefinitions.PRAYER_BONUS]);
  376. } else
  377. player.getPackets().sendGlobalString(26, "");
  378.  
  379. }
  380.  
  381. public int getBuyPrice(Item item, int dq) {
  382. switch (item.getId()) {
  383. case 4151:
  384. item.getDefinitions().setValue(4500000);
  385. break;
  386. case 21777: //arma
  387. item.getDefinitions().setValue(1500000);
  388. break;
  389. case 15486: //sol
  390. item.getDefinitions().setValue(1200000);
  391. break;
  392. case 11235:
  393. item.getDefinitions().setValue(1100000);
  394. break;
  395. case 868:
  396. item.getDefinitions().setValue(800);
  397. }
  398. int price = item.getDefinitions().getValue();
  399. if (price == 0)
  400. price = 1;
  401. return price; // TODO formula
  402. }
  403.  
  404. public int getSellPrice(Item item, int dq) {
  405. switch (item.getId()) {
  406. case 4151:
  407. item.getDefinitions().setValue(4500000);
  408. break;
  409. case 21777: //arma
  410. item.getDefinitions().setValue(1500000);
  411. break;
  412. case 15486: //sol
  413. item.getDefinitions().setValue(1200000);
  414. break;
  415. case 11235:
  416. item.getDefinitions().setValue(1100000);
  417. break;
  418. case 868:
  419. item.getDefinitions().setValue(800);
  420. }
  421. return item.getDefinitions().getValue() / 2; // TODO formula
  422. }
  423.  
  424. public void sendExamine(Player player, int clickSlot) {
  425. int slotId = getSlotId(clickSlot);
  426. if (slotId >= getStoreSize())
  427. return;
  428. Item item = slotId >= mainStock.length ? generalStock[slotId
  429. - mainStock.length] : mainStock[slotId];
  430. if (item == null)
  431. return;
  432. player.getPackets().sendGameMessage(ItemExamines.getExamine(item));
  433. }
  434.  
  435. public void refreshShop() {
  436. for (Player player : viewingPlayers) {
  437. sendStore(player);
  438. player.getPackets().sendIComponentSettings(620, 25, 0,
  439. getStoreSize() * 6, 1150);
  440. }
  441. }
  442.  
  443. public int getStoreSize() {
  444. return mainStock.length
  445. + (generalStock != null ? generalStock.length : 0);
  446. }
  447.  
  448. public void sendStore(Player player) {
  449. Item[] stock = new Item[mainStock.length
  450. + (generalStock != null ? generalStock.length : 0)];
  451. System.arraycopy(mainStock, 0, stock, 0, mainStock.length);
  452. if (generalStock != null)
  453. System.arraycopy(generalStock, 0, stock, mainStock.length,
  454. generalStock.length);
  455. player.getPackets().sendItems(MAIN_STOCK_ITEMS_KEY, stock);
  456. }
  457.  
  458. }
Add Comment
Please, Sign In to add comment