Guest User

Untitled

a guest
Jun 7th, 2015
346
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 61.66 KB | None | 0 0
  1. package server.model.players;
  2.  
  3. import java.util.concurrent.CopyOnWriteArrayList;
  4.  
  5. import server.model.players.PlayerSave;
  6. import server.model.players.Client;
  7. import server.model.players.PlayerHandler;
  8. import server.Config;
  9. import server.Server;
  10. import server.model.items.GameItem;
  11. import server.model.items.Item;
  12. import server.util.Misc;
  13. import server.world.ItemHandler;
  14.  
  15.  
  16. public class TradeAndDuel{
  17.  
  18.  
  19. private Client c;
  20. public TradeAndDuel(Client Client) {
  21. this.c = Client;
  22. }
  23.  
  24. /**
  25. * Trading By Ardi, Edited by Arras.
  26. **/
  27.  
  28. public CopyOnWriteArrayList<GameItem> offeredItems = new CopyOnWriteArrayList<GameItem>();
  29.  
  30. public void requestTrade(int id){
  31. Client o = (Client) PlayerHandler.players[id];
  32. if(c.isBanking) {
  33. c.sendMessage("You can't trade while in bank sir, sorry.");
  34. o.sendMessage("The player you tried to trade is banking, tell him to close bank please.");
  35. }
  36. if(c.playerRights == 2) {
  37. c.sendMessage("Administrator can't trade playerrs.");
  38. return;
  39. }
  40. try {
  41. if (o == null)
  42. return;
  43. else if (c.playerIsBusy())
  44. return;
  45. else if (o.playerIsBusy()) {
  46. c.sendMessage("Other player is busy at the moment.");
  47. return;
  48. } else if (System.currentTimeMillis() - c.logoutDelay < 10000) {
  49. c.sendMessage("You cannot trade anyone while incombat!");
  50. return;
  51. } else if (System.currentTimeMillis() - o.logoutDelay < 10000) {
  52. c.sendMessage("Other player is busy at the moment.");
  53. return;
  54. } else if (id == c.playerId)
  55. return;
  56. //else if (c.connectedFrom.equalsIgnoreCase(o.connectedFrom)) {
  57. //c.sendMessage("You cannot trade somebody from your own ip address.");
  58. //return;
  59. //}
  60. else if (c.inTrade) {
  61. c.getTradeAndDuel().declineTrade();
  62. }
  63. c.getTradeAndDuel().resetTrade();
  64. c.turnPlayerTo(o.absX, o.absY);
  65. c.tradeWith = id;
  66. if(!c.inTrade && o.tradeRequested && o.tradeWith == c.playerId) {
  67. c.getTradeAndDuel().openTrade();
  68. o.getTradeAndDuel().openTrade();
  69. } else if(!c.inTrade) {
  70.  
  71. c.tradeRequested = true;
  72. c.sendMessage("@or3@Sending Trade Request To " + Misc.optimizeText(o.playerName) + "...");
  73. o.sendMessage(c.playerName + ":tradereq:");
  74. }
  75. }
  76. catch (Exception e) {
  77. Misc.println("Error requesting trade.");
  78. }
  79. }
  80.  
  81. public void openTrade() {
  82. if(c.playerRights == 2) {
  83. c.sendMessage("Administrator can't trade playerrs.");
  84. return;
  85. }
  86. Client o = (Client) PlayerHandler.players[c.tradeWith];
  87.  
  88. if(o == null) {
  89. return;
  90. }
  91. if (c.isBanking || o.isBanking) {
  92. c.getPA().closeAllWindows();
  93. o.getPA().closeAllWindows();
  94. return;
  95. }
  96.  
  97. c.inTrade = true;
  98. c.canOffer = true;
  99. c.tradeStatus = 1;
  100. c.tradeRequested = false;
  101. c.getItems().resetItems(3322);
  102. resetTItems(3415);
  103. resetOTItems(3416);
  104. String out = o.playerName;
  105.  
  106. if(o.playerRights == 1) {
  107. out = "@cr1@" + out;
  108. }
  109. else if(o.playerRights == 2) {
  110. out = "@cr2@" + out;
  111. }
  112. c.getPA().sendFrame126("Trading with: " + o.playerName+" who has @gre@"+o.getItems().freeSlots()+"" ,3417);
  113. c.getPA().sendFrame126("", 3431);
  114. c.getPA().sendFrame126("Are you sure you want to make this trade?", 3535);
  115. c.getPA().sendFrame248(3323, 3321);
  116. }
  117.  
  118.  
  119.  
  120. public void resetTItems(int WriteFrame) {
  121. synchronized(c) {
  122. c.getOutStream().createFrameVarSizeWord(53);
  123. c.getOutStream().writeWord(WriteFrame);
  124. int len = offeredItems.toArray().length;
  125. int current = 0;
  126. c.getOutStream().writeWord(len);
  127. for (GameItem item : offeredItems) {
  128. if (item.amount > 254) {
  129. c.getOutStream().writeByte(255);
  130. c.getOutStream().writeDWord_v2(item.amount);
  131. } else {
  132. c.getOutStream().writeByte(item.amount);
  133. }
  134. c.getOutStream().writeWordBigEndianA(item.id + 1);
  135. current++;
  136. }
  137. if(current < 27) {
  138. for(int i = current; i < 28; i++) {
  139. c.getOutStream().writeByte(1);
  140. c.getOutStream().writeWordBigEndianA(-1);
  141. }
  142. }
  143. c.getOutStream().endFrameVarSizeWord();
  144. c.flushOutStream();
  145. }
  146. }
  147.  
  148. private boolean tradeContains(int itemID) {
  149. return tradeContains(itemID, 1);
  150. }
  151.  
  152. private boolean tradeContains(int itemID, int amount) {
  153. int count = 0;
  154. for (GameItem item : offeredItems) {
  155. if (item != null) {
  156. if (item.id == itemID) {
  157. count += item.amount;
  158. }
  159. }
  160. }
  161. return count >= amount;
  162. }
  163.  
  164. public boolean fromTrade(int itemID, int fromSlot, int amount) {
  165. Client o = (Client) PlayerHandler.players[c.tradeWith];
  166. if (o == null) {
  167. return false;
  168. }
  169. if (amount <= 0) {
  170. return false;
  171. }
  172. if (!c.inTrade || !c.canOffer) {
  173. declineTrade();
  174. return false;
  175. }
  176. if (!c.getTradeAndDuel().tradeContains(itemID)) {
  177. return false;
  178. }
  179. if(!c.getItems().playerHasItem(itemID, amount)) {
  180. return false;
  181. }
  182. if (amount <= 0) {
  183. return false;
  184. }
  185. /*
  186. * Else
  187. */
  188.  
  189. try {
  190. c.tradeConfirmed = false;
  191. o.tradeConfirmed = false;
  192. if (!Item.itemStackable[itemID]) {
  193. if (amount > 28) {
  194. amount = 28;
  195. }
  196. for (int a = 0; a < amount; a++) {
  197. for (GameItem item : offeredItems) {
  198. if (item.id == itemID) {
  199. if (!item.stackable) {
  200. offeredItems.remove(item);
  201. c.getItems().addItem(itemID, 1);
  202. } else if (item.amount > amount) {
  203. item.amount -= amount;
  204. c.getItems().addItem(itemID, amount);
  205. } else {
  206. amount = item.amount;
  207. offeredItems.remove(item);
  208. c.getItems().addItem(itemID, amount);
  209. }
  210. break;
  211. }
  212. }
  213. }
  214. }
  215. for (GameItem item : offeredItems) {
  216. if (item.id == itemID) {
  217. if (!item.stackable) {
  218. } else if (item.amount > amount) {
  219. item.amount -= amount;
  220. c.getItems().addItem(itemID, amount);
  221. } else {
  222. amount = item.amount;
  223. offeredItems.remove(item);
  224. c.getItems().addItem(itemID, amount);
  225.  
  226. }
  227. break;
  228. }
  229. }
  230. c.tradeConfirmed = false;
  231. o.tradeConfirmed = false;
  232. c.getItems().resetItems(3322);
  233. resetTItems(3415);
  234. o.getTradeAndDuel().resetOTItems(3416);
  235. //displayWAndI(c);
  236. c.getPA().sendFrame126("", 3431);
  237. o.getPA().sendFrame126("", 3431);
  238. } catch (Exception e) {
  239.  
  240. }
  241. return true;
  242. }
  243.  
  244. public boolean tradeItem(int itemID, int fromSlot, int amount) {
  245. Client o = (Client) PlayerHandler.players[c.tradeWith];
  246. if(o == null) {
  247. return false;
  248. }
  249.  
  250. for (int i : Config.ITEM_TRADEABLE) {
  251. if(i == itemID) {
  252. c.sendMessage("You can't trade this item.");
  253. return false;
  254. }
  255. }
  256.  
  257. if(!((c.playerItems[fromSlot] == itemID+1) && (c.playerItemsN[fromSlot] >= amount)))
  258. {
  259. c.sendMessage("You don't have that amount!");
  260. return false;
  261. }
  262. c.tradeConfirmed = false;
  263. o.tradeConfirmed = false;
  264. if(!Item.itemStackable[itemID] && !Item.itemIsNote[itemID]) {
  265. for(int a = 0; a < amount && a < 28; a++) {
  266. if(c.getItems().playerHasItem(itemID, 1)) {
  267. offeredItems.add(new GameItem(itemID, 1));
  268. c.getItems().deleteItem(itemID, c.getItems().getItemSlot(itemID), 1);
  269. o.getPA().sendFrame126("Trading with: " + c.playerName+" who has @gre@"+c.getItems().freeSlots()+"" ,3417);
  270. }
  271. }
  272. o.getPA().sendFrame126("Trading with: " + c.playerName+" who has @gre@"+c.getItems().freeSlots()+"" ,3417);
  273. c.getItems().resetItems(3322);
  274. resetTItems(3415);
  275. o.getTradeAndDuel().resetOTItems(3416);
  276. c.getPA().sendFrame126("", 3431);
  277. o.getPA().sendFrame126("", 3431);
  278. }
  279. int itemAmount = c.getItems().getItemCount(itemID);
  280. if (itemAmount < amount) {
  281. if (itemAmount <= 0)
  282. return false;
  283. amount = itemAmount;
  284. }
  285.  
  286. if (c.getItems().getItemCount(itemID) < amount) {
  287. amount = c.getItems().getItemCount(itemID);
  288. if (amount == 0)
  289. return false;
  290. }
  291. if(itemID != c.playerItems[fromSlot]-1) {
  292. return false;
  293. }
  294. if (amount > c.playerItemsN[fromSlot]) {
  295. return false;
  296. }
  297. if (!c.inTrade || !c.canOffer) {
  298. declineTrade();
  299. return false;
  300. }
  301. if(!c.getItems().playerHasItem(itemID, amount))
  302. return false;
  303.  
  304. if(Item.itemStackable[itemID] || Item.itemIsNote[itemID]) {
  305. boolean inTrade = false;
  306. for(GameItem item : offeredItems) {
  307. if(item.id == itemID) {
  308. inTrade = true;
  309. item.amount += amount;
  310. c.getItems().deleteItem2(itemID, amount);
  311. o.getPA().sendFrame126("Trading with: " + c.playerName+" who has @gre@"+c.getItems().freeSlots()+"" ,3417);
  312. break;
  313. }
  314. }
  315.  
  316. if(!inTrade) {
  317. offeredItems.add(new GameItem(itemID, amount));
  318. c.getItems().deleteItem2(itemID, amount);
  319. o.getPA().sendFrame126("Trading with: " + c.playerName+" who has @gre@"+c.getItems().freeSlots()+"" ,3417);
  320. }
  321. }
  322. o.getPA().sendFrame126("Trading with: " + c.playerName+" who has @gre@"+c.getItems().freeSlots()+"" ,3417);
  323. c.getItems().resetItems(3322);
  324. c.getItems().updateInventory();
  325. resetTItems(3415);
  326. o.getTradeAndDuel().resetOTItems(3416);
  327. c.getPA().sendFrame126("", 3431);
  328. o.getPA().sendFrame126("", 3431);
  329. return true;
  330. }
  331.  
  332.  
  333. public void resetTrade() {
  334. offeredItems.clear();
  335. c.inTrade = false;
  336. c.tradeWith = 0;
  337. c.canOffer = true;
  338. c.tradeConfirmed = false;
  339. c.tradeConfirmed2 = false;
  340. c.acceptedTrade = false;
  341. c.getPA().removeAllWindows();
  342. c.getPA().resetInterfaceStatus();
  343. c.tradeResetNeeded = false;
  344. c.getPA().sendFrame126("Are you sure you want to make this trade?", 3535);
  345. }
  346. public void declineTrade() {
  347. c.tradeStatus = 0;
  348. declineTrade(true);
  349. c.getItems().updateInventory();
  350. }
  351.  
  352.  
  353. public void declineTrade(boolean tellOther) {
  354. c.inTrade = false;
  355. c.getPA().removeAllWindows();
  356. Client o = (Client) PlayerHandler.players[c.tradeWith];
  357. if (o == null) {
  358. return;
  359. }
  360.  
  361. if(tellOther){
  362. o.getTradeAndDuel().declineTrade(false);
  363. o.getTradeAndDuel().c.getPA().removeAllWindows();
  364. }
  365.  
  366. for(GameItem item : offeredItems) {
  367. if(item.amount < 1) {
  368. continue;
  369. }
  370. if(item.stackable) {
  371. c.getItems().addItem(item.id, item.amount);
  372. } else {
  373. for(int i = 0; i < item.amount; i++) {
  374. c.getItems().addItem(item.id, 1);
  375. }
  376. }
  377. }
  378. c.canOffer = true;
  379. c.tradeConfirmed = false;
  380. c.tradeConfirmed2 = false;
  381. offeredItems.clear();
  382. c.getItems().updateInventory();
  383. c.tradeWith = 0;
  384. }
  385.  
  386.  
  387. public void resetOTItems(int WriteFrame) {
  388. synchronized(c) {
  389. Client o = (Client) PlayerHandler.players[c.tradeWith];
  390. if(o == null) {
  391. return;
  392. }
  393. c.getOutStream().createFrameVarSizeWord(53);
  394. c.getOutStream().writeWord(WriteFrame);
  395. int len = o.getTradeAndDuel().offeredItems.toArray().length;
  396. int current = 0;
  397. c.getOutStream().writeWord(len);
  398. for (GameItem item : o.getTradeAndDuel().offeredItems) {
  399. if (item.amount > 254) {
  400. c.getOutStream().writeByte(255); // item's stack count. if over 254, write byte 255
  401. c.getOutStream().writeDWord_v2(item.amount);
  402. } else {
  403. c.getOutStream().writeByte(item.amount);
  404. }
  405. c.getOutStream().writeWordBigEndianA(item.id + 1); // item id
  406. current++;
  407. }
  408. if(current < 27) {
  409. for(int i = current; i < 28; i++) {
  410. c.getOutStream().writeByte(1);
  411. c.getOutStream().writeWordBigEndianA(-1);
  412. }
  413. }
  414. c.getOutStream().endFrameVarSizeWord();
  415. c.flushOutStream();
  416. }
  417. }
  418.  
  419.  
  420. public void confirmScreen() {
  421. Client o = (Client) PlayerHandler.players[c.tradeWith];
  422. if(o == null) {
  423. return;
  424. }
  425. if (o.tradeWith != c.playerId) {
  426. return;
  427. }
  428. c.canOffer = false;
  429. c.getItems().resetItems(3214);
  430. String SendTrade = "Absolutely nothing!";
  431. String SendAmount = "";
  432. int Count = 0;
  433. for (GameItem item : offeredItems) {
  434. if (item.id > 0) {
  435. if (item.amount >= 1000 && item.amount < 1000000) {
  436. SendAmount = "@cya@" + (item.amount / 1000) + "K @whi@(" + Misc.format(item.amount) + ")";
  437. } else if (item.amount >= 1000000) {
  438. SendAmount = "@gre@" + (item.amount / 1000000) + " million @whi@(" + Misc.format(item.amount) + ")";
  439. } else {
  440. SendAmount = "" + Misc.format(item.amount);
  441. }
  442.  
  443. if(Count == 0) {
  444. SendTrade = c.getItems().getItemName(item.id);
  445. } else {
  446. SendTrade = SendTrade + "\\n" + c.getItems().getItemName(item.id);
  447. }
  448.  
  449. if (item.stackable) {
  450. SendTrade = SendTrade + " x " + SendAmount;
  451. }
  452. Count++;
  453. }
  454. }
  455.  
  456. c.getPA().sendFrame126(SendTrade, 3557);
  457. SendTrade = "Absolutely nothing!";
  458. SendAmount = "";
  459. Count = 0;
  460.  
  461. for (GameItem item : o.getTradeAndDuel().offeredItems) {
  462. if (item.id > 0) {
  463. if (item.amount >= 1000 && item.amount < 1000000) {
  464. SendAmount = "@cya@" + (item.amount / 1000) + "K @whi@(" + Misc.format(item.amount) + ")";
  465. } else if (item.amount >= 1000000) {
  466. SendAmount = "@gre@" + (item.amount / 1000000) + " million @whi@(" + Misc.format(item.amount) + ")";
  467. } else {
  468. SendAmount = "" + Misc.format(item.amount);
  469. }
  470. SendAmount = SendAmount;
  471.  
  472. if (Count == 0) {
  473. SendTrade = c.getItems().getItemName(item.id);
  474. } else {
  475. SendTrade = SendTrade + "\\n" + c.getItems().getItemName(item.id);
  476. }
  477. if (item.stackable) {
  478. SendTrade = SendTrade + " x " + SendAmount;
  479. }
  480. Count++;
  481. }
  482. }
  483. c.getPA().sendFrame126(SendTrade, 3558);
  484. c.getPA().sendFrame248(3443, 197);
  485. }
  486.  
  487.  
  488. public void giveItems() {
  489. Client o = (Client) PlayerHandler.players[c.tradeWith];
  490. if(o == null) {
  491. return;
  492. }
  493. if (o.tradeWith != c.playerId)
  494. return;
  495. try{
  496. for(GameItem item : o.getTradeAndDuel().offeredItems){
  497. if (item.id > 0) {
  498. c.getItems().addItem(item.id, item.amount);
  499. }
  500. }
  501.  
  502. c.getPA().removeAllWindows();
  503. c.tradeResetNeeded = true;
  504. PlayerSave.saveGame(c);
  505. PlayerSave.saveGame(o);
  506. c.getItems().updateInventory();
  507. } catch(Exception e){
  508. }
  509. }
  510.  
  511. /**
  512. * Dueling ~ Arras
  513. **/
  514.  
  515. public CopyOnWriteArrayList<GameItem> otherStakedItems = new CopyOnWriteArrayList<GameItem>();
  516. public CopyOnWriteArrayList<GameItem> stakedItems = new CopyOnWriteArrayList<GameItem>();
  517.  
  518. public void requestDuel(int id) {
  519. try {
  520. if (id == c.playerId) {
  521. return;
  522. }
  523. if (c.teleTimer > 0) {
  524. return;
  525. }
  526. Client o = (Client) PlayerHandler.players[id];
  527. if(o == null) {
  528. return;
  529. }
  530. if (c.playerIsBusy()) {
  531. c.sendMessage("Other player is busy at the moment.");
  532. return;
  533. }
  534. if (o.playerIsBusy()) {
  535. c.sendMessage("Other player is busy at the moment.");
  536. return;
  537. }
  538. resetDuel();
  539. resetDuelItems();
  540. c.duelingWith = id;
  541. c.duelRequested = true;
  542. if(c.duelStatus == 0 && o.duelStatus == 0 && c.duelRequested && o.duelRequested && c.duelingWith == o.getId() && o.duelingWith == c.getId()) {
  543. if(c.goodDistance(c.getX(), c.getY(), o.getX(), o.getY(), 1)) {
  544. c.getTradeAndDuel().openDuel();
  545. o.getTradeAndDuel().openDuel();
  546. } else {
  547. c.sendMessage("You need to get closer to your opponent to start the duel.");
  548. }
  549.  
  550. } else {
  551. c.sendMessage("Sending duel request...");
  552. o.sendMessage(c.playerName+":duelreq:");
  553. }
  554. } catch (Exception e) {
  555. Misc.println("Error requesting duel.");
  556. }
  557. }
  558.  
  559. public void openDuel() {
  560. Client o = (Client) PlayerHandler.players[c.duelingWith];
  561. if(o == null) {
  562. return;
  563. }
  564. if ((!c.inDuelArena() || !o.inDuelArena())) {
  565. return;
  566. }
  567.  
  568. c.duelStatus = 1;
  569. refreshduelRules();
  570. refreshDuelScreen();
  571. c.canOffer = true;
  572. for (int i = 0; i < c.playerEquipment.length; i++) {
  573. sendDuelEquipment(c.playerEquipment[i], c.playerEquipmentN[i], i);
  574. }
  575. c.getPA().sendFrame126("Dueling with: " + o.playerName + " (level-" + o.combatLevel + ")", 6671);
  576. c.getPA().sendFrame126("", 6684);
  577. c.getPA().sendFrame248(6575, 3321);
  578. c.getItems().resetItems(3322);
  579. }
  580.  
  581. public void sendDuelEquipment(int itemId, int amount, int slot) {
  582. synchronized(c) {
  583. if(itemId != 0) {
  584. c.getOutStream().createFrameVarSizeWord(34);
  585. c.getOutStream().writeWord(13824);
  586. c.getOutStream().writeByte(slot);
  587. c.getOutStream().writeWord(itemId+1);
  588.  
  589. if (amount > 254) {
  590. c.getOutStream().writeByte(255);
  591. c.getOutStream().writeDWord(amount);
  592. } else {
  593. c.getOutStream().writeByte(amount);
  594. }
  595. c.getOutStream().endFrameVarSizeWord();
  596. c.flushOutStream();
  597. }
  598. }
  599. }
  600.  
  601. public void refreshduelRules() {
  602. for(int i = 0; i < c.duelRule.length; i++) {
  603. c.duelRule[i] = false;
  604. }
  605. c.getPA().sendFrame87(286, 0);
  606. c.duelOption = 0;
  607. }
  608.  
  609. public void refreshDuelScreen() {
  610. synchronized(c) {
  611. Client o = (Client) PlayerHandler.players[c.duelingWith];
  612. if(o == null) {
  613. return;
  614. }
  615. c.getOutStream().createFrameVarSizeWord(53);
  616. c.getOutStream().writeWord(6669);
  617. c.getOutStream().writeWord(stakedItems.toArray().length);
  618. int current = 0;
  619. for(GameItem item : stakedItems) {
  620. if (item.amount > 254) {
  621. c.getOutStream().writeByte(255);
  622. c.getOutStream().writeDWord_v2(item.amount);
  623. } else {
  624. c.getOutStream().writeByte(item.amount);
  625. }
  626. if (item.id > Config.ITEM_LIMIT || item.id < 0) {
  627. item.id = Config.ITEM_LIMIT;
  628. }
  629. c.getOutStream().writeWordBigEndianA(item.id + 1);
  630.  
  631. current++;
  632. }
  633.  
  634. if(current < 27) {
  635. for(int i = current; i < 28; i++) {
  636. c.getOutStream().writeByte(1);
  637. c.getOutStream().writeWordBigEndianA(-1);
  638. }
  639. }
  640. c.getOutStream().endFrameVarSizeWord();
  641. c.flushOutStream();
  642.  
  643. c.getOutStream().createFrameVarSizeWord(53);
  644. c.getOutStream().writeWord(6670);
  645. c.getOutStream().writeWord(o.getTradeAndDuel().stakedItems.toArray().length);
  646. current = 0;
  647. for (GameItem item : o.getTradeAndDuel().stakedItems) {
  648. if (item.amount > 254) {
  649. c.getOutStream().writeByte(255);
  650. c.getOutStream().writeDWord_v2(item.amount);
  651. } else {
  652. c.getOutStream().writeByte(item.amount);
  653. }
  654. if (item.id > Config.ITEM_LIMIT || item.id < 0) {
  655. item.id = Config.ITEM_LIMIT;
  656. }
  657. c.getOutStream().writeWordBigEndianA(item.id + 1);
  658. current++;
  659. }
  660.  
  661. if(current < 27) {
  662. for(int i = current; i < 28; i++) {
  663. c.getOutStream().writeByte(1);
  664. c.getOutStream().writeWordBigEndianA(-1);
  665. }
  666. }
  667. c.getOutStream().endFrameVarSizeWord();
  668. c.flushOutStream();
  669. }
  670. }
  671.  
  672.  
  673. public void bothDeclineDuel() {
  674. Client c3 = (Client) PlayerHandler.players[c.duelingWith];
  675. declineDuel(true);
  676. c3.getTradeAndDuel().declineDuel(true);
  677. c.sendMessage("@red@The duel has been declined.");
  678. c3.sendMessage("@red@The duel has been declined.");
  679. }
  680.  
  681. public void declineDuel(boolean notifyOther) {
  682. Client o2 = (Client) PlayerHandler.players[c.duelingWith];
  683. if (c.duelStatus >= 5 || c.duelStatus == 0)
  684. return;
  685. if (notifyOther) {
  686. if (o2 != null && o2.duelingWith == c.playerId)
  687. o2.getTradeAndDuel().declineDuel(false);
  688. }
  689. c.getPA().resetInterfaceStatus();
  690. c.canOffer = true;
  691. c.duelStatus = 0;
  692. c.duelingWith = 0;
  693. c.duelSpaceReq = 0;
  694. c.duelRequested = false;
  695. for (GameItem item : stakedItems) {
  696. if (item.amount < 1)
  697. continue;
  698. if (Item.itemStackable[item.id] || Item.itemIsNote[item.id]) {
  699. c.getItems().forceAddItem(item.id, item.amount);
  700. } else {
  701. c.getItems().forceAddItem(item.id, 1);
  702. }
  703. }
  704. stakedItems.clear();
  705. for (int i = 0; i < c.duelRule.length; i++) {
  706. c.duelRule[i] = false;
  707. }
  708. c.sendMessage("@red@The duel has been declined.");
  709. o2.sendMessage("@red@The duel has been declined.");
  710. }
  711.  
  712.  
  713. public boolean stakeItem(int itemID, int fromSlot, int amount) {
  714.  
  715. for (int i : Config.ITEM_TRADEABLE) {
  716. if(i == itemID) {
  717. c.sendMessage("You can't stake this item.");
  718. return false;
  719. }
  720. }
  721. if(!c.getItems().playerHasItem(itemID, amount))
  722. return false;
  723. if (!c.getItems().playerHasItem(itemID)) {
  724. // valid the player has the item
  725. return false;
  726. }
  727. if (itemID != c.playerItems[fromSlot] - 1) {
  728. // validate that its the proper item
  729. return false;
  730. }
  731. if (itemID != 995 & c.playerItems[fromSlot] == 996) {
  732. return false;
  733. }
  734. int count = c.getItems().getItemAmount(itemID);
  735. if (amount > count) {
  736. amount = count;
  737. }
  738. if (amount <= 0) {
  739. return false;
  740. }
  741. if (itemID == 863 || itemID == 11230 || itemID == 869 || itemID == 868
  742. || itemID == 867 || itemID == 866 || itemID == 4740
  743. || itemID == 9244 || itemID == 11212 || itemID == 892
  744. || itemID == 9194 || itemID == 9243 || itemID == 9242
  745. || itemID == 9241 || itemID == 9240 || itemID == 9239
  746. || itemID == 882 || itemID == 884 || itemID == 886
  747. || itemID == 888 || itemID == 890) {
  748. c.sendMessage("You can't stake bolts, arrows or knifes.");
  749. return false;
  750. }
  751. if(c.playerRights == 2) {
  752. c.sendMessage("Administrator can't stake items in duel arena.");
  753. return false;
  754. }
  755. if(itemID == 4740 || itemID == 9244 || itemID == 11212 || itemID == 892 || itemID == 9194 || itemID == 9243 || itemID == 9242 || itemID == 9241 || itemID == 9240 || itemID == 9239 || itemID == 882 || itemID == 884 || itemID == 886 || itemID == 888 || itemID == 890) {
  756. c.sendMessage("You can't stake bolts or arrows.");
  757. return false;
  758. }
  759. if(!c.getItems().playerHasItem(itemID, amount)) {
  760. return false;
  761. }
  762. if (c.playerItems[fromSlot] - 1 != itemID && c.playerItems[fromSlot] != itemID) { // duel dupe fix by Aleksandr
  763. if (c.playerItems[fromSlot] == 0)
  764. return false;
  765. return false;
  766. }
  767. if (amount <= 0)
  768. return false;
  769. Client o = (Client) PlayerHandler.players[c.duelingWith];
  770. if (o == null ) {
  771. declineDuel();
  772. return false;
  773. }
  774. if (o.duelStatus <= 0 || c.duelStatus <= 0) {
  775. declineDuel();
  776. o.getTradeAndDuel().declineDuel();
  777. return false;
  778. }
  779. if (!c.canOffer) {
  780. return false;
  781. }
  782. if(!c.openDuel && !o.openDuel) {
  783. bothDeclineDuel();
  784. return false;
  785. }
  786. changeDuelStuff();
  787. if(!Item.itemStackable[itemID]) {
  788. for(int a = 0; a < amount; a++) {
  789. if(c.getItems().playerHasItem(itemID, 1)) {
  790. stakedItems.add(new GameItem(itemID, 1));
  791. c.getItems().deleteItem(itemID, c.getItems().getItemSlot(itemID), 1);
  792. }
  793. }
  794. c.getItems().resetItems(3214);
  795. c.getItems().resetItems(3322);
  796. o.getItems().resetItems(3214);
  797. o.getItems().resetItems(3322);
  798. refreshDuelScreen();
  799. o.getTradeAndDuel().refreshDuelScreen();
  800. c.getPA().sendFrame126("", 6684);
  801. o.getPA().sendFrame126("", 6684);
  802. }
  803.  
  804. if(!c.getItems().playerHasItem(itemID, amount)) {
  805. return false;
  806. }
  807. if (Item.itemStackable[itemID] || Item.itemIsNote[itemID]) {
  808. boolean found = false;
  809. for (GameItem item : stakedItems) {
  810. if (item.id == itemID) {
  811. found = true;
  812. item.amount += amount;
  813. c.getItems().deleteItem(itemID, fromSlot, amount);
  814. break;
  815. }
  816. }
  817. if (!found) {
  818. c.getItems().deleteItem(itemID, fromSlot, amount);
  819. stakedItems.add(new GameItem(itemID, amount));
  820. }
  821. }
  822.  
  823. c.getItems().resetItems(3214);
  824. c.getItems().resetItems(3322);
  825. o.getItems().resetItems(3214);
  826. o.getItems().resetItems(3322);
  827. refreshDuelScreen();
  828. o.getTradeAndDuel().refreshDuelScreen();
  829. c.getPA().sendFrame126("", 6684);
  830. o.getPA().sendFrame126("", 6684);
  831. return true;
  832. }
  833.  
  834.  
  835. public boolean fromDuel(int itemID, int fromSlot, int amount) {
  836. Client o = (Client) PlayerHandler.players[c.duelingWith];
  837. if (o == null ) {
  838. declineDuel();
  839. return false;
  840. }
  841. if (o.duelStatus <= 0 || c.duelStatus <= 0) {
  842. declineDuel();
  843. o.getTradeAndDuel().declineDuel();
  844. return false;
  845. }
  846. if(Item.itemStackable[itemID]) {
  847. if(c.getItems().freeSlots() - 1 < (c.duelSpaceReq)) {
  848. c.sendMessage("You have too many rules set to remove that item.");
  849. return false;
  850. }
  851. }
  852.  
  853. if(!c.canOffer){
  854. return false;
  855. }
  856.  
  857. changeDuelStuff();
  858. boolean goodSpace = true;
  859. if(!Item.itemStackable[itemID]) {
  860. for(int a = 0; a < amount; a++) {
  861. for (GameItem item : stakedItems) {
  862. if(item.id == itemID) {
  863. if(!item.stackable) {
  864. if(c.getItems().freeSlots() - 1 < (c.duelSpaceReq)) {
  865. goodSpace = false;
  866. break;
  867. }
  868. stakedItems.remove(item);
  869. c.getItems().addItem(itemID, 1);
  870. } else {
  871. if(c.getItems().freeSlots() - 1 < (c.duelSpaceReq)) {
  872. goodSpace = false;
  873. break;
  874. }
  875. if(item.amount > amount) {
  876. item.amount -= amount;
  877. c.getItems().addItem(itemID, amount);
  878. } else {
  879. if(c.getItems().freeSlots() - 1 < (c.duelSpaceReq)) {
  880. goodSpace = false;
  881. break;
  882. }
  883. amount = item.amount;
  884. stakedItems.remove(item);
  885. c.getItems().addItem(itemID, amount);
  886. }
  887. }
  888. break;
  889. }
  890. o.duelStatus = 1;
  891. c.duelStatus = 1;
  892. c.getItems().resetItems(3214);
  893. c.getItems().resetItems(3322);
  894. o.getItems().resetItems(3214);
  895. o.getItems().resetItems(3322);
  896. c.getTradeAndDuel().refreshDuelScreen();
  897. o.getTradeAndDuel().refreshDuelScreen();
  898. o.getPA().sendFrame126("", 6684);
  899. }
  900. }
  901. }
  902.  
  903. for (GameItem item : stakedItems) {
  904. if(item.id == itemID) {
  905. if(!item.stackable) {
  906. } else {
  907. if(item.amount > amount) {
  908. item.amount -= amount;
  909. c.getItems().addItem(itemID, amount);
  910. } else {
  911. amount = item.amount;
  912. stakedItems.remove(item);
  913. c.getItems().addItem(itemID, amount);
  914. }
  915. }
  916. break;
  917. }
  918. }
  919. o.duelStatus = 1;
  920. c.duelStatus = 1;
  921. c.getItems().resetItems(3214);
  922. c.getItems().resetItems(3322);
  923. o.getItems().resetItems(3214);
  924. o.getItems().resetItems(3322);
  925. c.getTradeAndDuel().refreshDuelScreen();
  926. o.getTradeAndDuel().refreshDuelScreen();
  927. o.getPA().sendFrame126("", 6684);
  928. if(!goodSpace) {
  929. c.sendMessage("You have too many rules set to remove that item.");
  930. return true;
  931. }
  932. return true;
  933. }
  934.  
  935. public void confirmDuel() {
  936. Client o = (Client) PlayerHandler.players[c.duelingWith];
  937. if(o == null) {
  938. declineDuel();
  939. return;
  940. }
  941. String itemId = "";
  942. for(GameItem item : stakedItems) {
  943. if(Item.itemStackable[item.id] || Item.itemIsNote[item.id]) {
  944. itemId += c.getItems().getItemName(item.id) + " x " + Misc.format(item.amount) +"\\n";
  945. } else {
  946. itemId += c.getItems().getItemName(item.id) + "\\n";
  947. }
  948. }
  949. c.getPA().sendFrame126(itemId, 6516);
  950. itemId = "";
  951. for(GameItem item : o.getTradeAndDuel().stakedItems) {
  952. if(Item.itemStackable[item.id] || Item.itemIsNote[item.id]) {
  953. itemId += c.getItems().getItemName(item.id) + " x " + Misc.format(item.amount) +"\\n";
  954. } else {
  955. itemId += c.getItems().getItemName(item.id) +"\\n";
  956. }
  957. }
  958. c.getPA().sendFrame126(itemId, 6517);
  959. c.getPA().sendFrame126("", 8242);
  960. for(int i = 8238; i <= 8253; i++) {
  961. c.getPA().sendFrame126("", i);
  962. }
  963. c.getPA().sendFrame126("Hitpoints will be restored.", 8250);
  964. c.getPA().sendFrame126("Boosted stats will be restored.", 8238);
  965. if(c.duelRule[8]) {
  966. c.getPA().sendFrame126("There will be obstacles in the arena.", 8239);
  967. }
  968. c.getPA().sendFrame126("", 8240);
  969. c.getPA().sendFrame126("", 8241);
  970.  
  971. String[] rulesOption = {"Players cannot forfeit!", "Players cannot move.", "Players cannot use range.", "Players cannot use melee.", "Players cannot use magic.", "Players cannot drink pots.", "Players cannot eat food.", "Players cannot use prayer."};
  972.  
  973. int lineNumber = 8242;
  974. for(int i = 0; i < 8; i++) {
  975. if(c.duelRule[i]) {
  976. c.getPA().sendFrame126(""+rulesOption[i], lineNumber);
  977. lineNumber ++;
  978. }
  979. }
  980. c.getPA().sendFrame126("", 6571);
  981. c.getPA().sendFrame248(6412, 197);
  982. //c.getPA().showInterface(6412);
  983. }
  984.  
  985.  
  986.  
  987. public void startDuel() {
  988. c.freezeTimer = 2;
  989. c.getPA().resetFollow();
  990. Client o = (Client) PlayerHandler.players[c.duelingWith];
  991. if (o.disconnected) {
  992. duelVictory();
  993. }
  994. if(o == null) {
  995. duelVictory();
  996. }
  997. c.headIconHints = 2;
  998. c.vengOn = false;
  999.  
  1000. if(c.duelRule[7]){
  1001. for(int p = 0; p < c.PRAYER.length; p++) { // reset prayer glows
  1002. c.prayerActive[p] = false;
  1003. c.getPA().sendFrame36(c.PRAYER_GLOW[p], 0);
  1004. }
  1005. c.headIcon = -1;
  1006. c.getPA().requestUpdates();
  1007. }
  1008. if(c.duelRule[11]) {
  1009. c.getItems().removeItem(c.playerEquipment[0], 0);
  1010. }
  1011. if(c.duelRule[12]) {
  1012. c.getItems().removeItem(c.playerEquipment[1], 1);
  1013. }
  1014. if(c.duelRule[13]) {
  1015. c.getItems().removeItem(c.playerEquipment[2], 2);
  1016. }
  1017. if(c.duelRule[14]) {
  1018. c.getItems().removeItem(c.playerEquipment[3], 3);
  1019. }
  1020. if(c.duelRule[15]) {
  1021. c.getItems().removeItem(c.playerEquipment[4], 4);
  1022. }
  1023. if(c.duelRule[16]) {
  1024. c.getItems().removeItem(c.playerEquipment[5], 5);
  1025. }
  1026. if(c.duelRule[17]) {
  1027. c.getItems().removeItem(c.playerEquipment[7], 7);
  1028. }
  1029. if(c.duelRule[18]) {
  1030. c.getItems().removeItem(c.playerEquipment[9], 9);
  1031. }
  1032. if(c.duelRule[19]) {
  1033. c.getItems().removeItem(c.playerEquipment[10], 10);
  1034. }
  1035. if(c.duelRule[20]) {
  1036. c.getItems().removeItem(c.playerEquipment[12], 12);
  1037. }
  1038. if(c.duelRule[21]) {
  1039. c.getItems().removeItem(c.playerEquipment[13], 13);
  1040. }
  1041. c.duelStatus = 5;
  1042. c.getPA().removeAllWindows();
  1043. c.specAmount = 10;
  1044. c.getItems().addSpecialBar(c.playerEquipment[c.playerWeapon]);
  1045.  
  1046. if(c.duelRule[8]){
  1047. if(c.duelRule[1]) {
  1048. c.getPA().movePlayer(c.duelTeleX, c.duelTeleY, 0);
  1049. } else {
  1050. c.getPA().movePlayer(3366 + Misc.random(12), 3246 + Misc.random(6), 0);
  1051. }
  1052. } else {
  1053. if(c.duelRule[1]) {
  1054. c.getPA().movePlayer(c.duelTeleX, c.duelTeleY, 0);
  1055. } else {
  1056. c.getPA().movePlayer(3335 + Misc.random(12), 3246 + Misc.random(6), 0);
  1057. }
  1058. }
  1059.  
  1060. c.getPA().createPlayerHints(10, o.playerId);
  1061. c.getPA().showOption(3, 0, "Attack", 1);
  1062. for (int i = 0; i < 20; i++) {
  1063. c.playerLevel[i] = c.getPA().getLevelForXP(c.playerXP[i]);
  1064. c.getPA().refreshSkill(i);
  1065. }
  1066. for(GameItem item : o.getTradeAndDuel().stakedItems) {
  1067. otherStakedItems.add(new GameItem(item.id, item.amount));
  1068. }
  1069. c.getPA().requestUpdates();
  1070. }
  1071.  
  1072.  
  1073. public void duelVictory() {
  1074. Client o = (Client) PlayerHandler.players[c.duelingWith];
  1075. if(o != null) {
  1076. c.getPA().sendFrame126(""+o.combatLevel, 6839);
  1077. c.getPA().sendFrame126(o.playerName, 6840);
  1078. o.duelStatus = 0;
  1079. c.freezeTimer = 3;
  1080. } else {
  1081. c.getPA().sendFrame126("", 6839);
  1082. c.getPA().sendFrame126("", 6840);
  1083. }
  1084. c.duelStatus = 6;
  1085. c.getCombat().resetPrayers();
  1086. for (int i = 0; i < 20; i++) {
  1087. c.playerLevel[i] = c.getPA().getLevelForXP(c.playerXP[i]);
  1088. c.getPA().refreshSkill(i);
  1089. }
  1090. c.getPA().refreshSkill(3);
  1091. //c.getPA().refreshSkill(i);
  1092. c.specAmount = 10;
  1093. c.getItems().addSpecialBar(c.playerEquipment[c.playerWeapon]);
  1094. duelRewardInterface();
  1095. PlayerSave.saveGame(c);
  1096. c.getPA().showInterface(6733);
  1097. c.getPA().movePlayer(3362, 3263, 0);
  1098. c.getPA().requestUpdates();
  1099. c.getPA().showOption(3, 0, "Challenge", 3);
  1100. c.getPA().createPlayerHints(10, -1);
  1101. c.canOffer = true;
  1102. c.duelSpaceReq = 0;
  1103. c.duelingWith = 0;
  1104. c.freezeTimer = 1;
  1105. c.getPA().resetFollow();
  1106. c.getCombat().resetPlayerAttack();
  1107. c.duelRequested = false;
  1108. PlayerSave.saveGame(c);
  1109. PlayerSave.saveGame(o);
  1110. }
  1111.  
  1112.  
  1113. public void duelRewardInterface() {
  1114. synchronized(c) {
  1115. c.getOutStream().createFrameVarSizeWord(53);
  1116. c.getOutStream().writeWord(6822);
  1117. c.getOutStream().writeWord(otherStakedItems.toArray().length);
  1118. for (GameItem item : otherStakedItems) {
  1119. if (item.amount > 254) {
  1120. c.getOutStream().writeByte(255);
  1121. c.getOutStream().writeDWord_v2(item.amount);
  1122. } else {
  1123. c.getOutStream().writeByte(item.amount);
  1124. }
  1125. if (item.id > Config.ITEM_LIMIT || item.id < 0) {
  1126. item.id = Config.ITEM_LIMIT;
  1127. }
  1128. c.getOutStream().writeWordBigEndianA(item.id + 1);
  1129. }
  1130. c.getOutStream().endFrameVarSizeWord();
  1131. c.flushOutStream();
  1132. }
  1133. }
  1134.  
  1135. public void claimStakedItems() {
  1136. for(GameItem item : otherStakedItems) {
  1137. if(item.id > 0 && item.amount > 0) {
  1138. if(Item.itemStackable[item.id]) {
  1139. if(!c.getItems().addItem(item.id, item.amount)) {
  1140. ItemHandler.createGroundItem(c, item.id, c.getX(), c.getY(), item.amount, c.getId());
  1141. }
  1142. } else {
  1143. int amount = item.amount;
  1144. for(int a = 1; a <= amount; a++) {
  1145. if(!c.getItems().addItem(item.id, 1)) {
  1146. ItemHandler.createGroundItem(c, item.id, c.getX(), c.getY(), 1, c.getId());
  1147. }
  1148. }
  1149. }
  1150. }
  1151. }
  1152. for(GameItem item : stakedItems) {
  1153. if(item.id > 0 && item.amount > 0) {
  1154. if(Item.itemStackable[item.id]) {
  1155. if(!c.getItems().addItem(item.id, item.amount)) {
  1156. ItemHandler.createGroundItem(c, item.id, c.getX(), c.getY(), item.amount, c.getId());
  1157. }
  1158. } else {
  1159. int amount = item.amount;
  1160. for(int a = 1; a <= amount; a++) {
  1161. if(!c.getItems().addItem(item.id, 1)) {
  1162. ItemHandler.createGroundItem(c, item.id, c.getX(), c.getY(), 1, c.getId());
  1163. }
  1164. }
  1165. }
  1166. }
  1167. }
  1168. resetDuel();
  1169. resetDuelItems();
  1170. c.duelStatus = 0;
  1171. }
  1172.  
  1173. public void declineDuel() {
  1174. c.getPA().removeAllWindows();
  1175. c.canOffer = true;
  1176. c.duelStatus = 0;
  1177. c.duelingWith = 0;
  1178. c.duelSpaceReq = 0;
  1179. c.duelRequested = false;
  1180. for(GameItem item : stakedItems) {
  1181. if(item.amount < 1) continue;
  1182. if(Item.itemStackable[item.id] || Item.itemIsNote[item.id]) {
  1183. c.getItems().addItem(item.id, item.amount);
  1184. } else {
  1185. c.getItems().addItem(item.id, 1);
  1186. }
  1187. }
  1188. stakedItems.clear();
  1189. for (int i = 0; i < c.duelRule.length; i++) {
  1190. c.duelRule[i] = false;
  1191. }
  1192. }
  1193.  
  1194. public void resetDuel() {
  1195. c.getPA().showOption(3, 0, "Challenge", 3);
  1196. c.headIconHints = 0;
  1197. for (int i = 0; i < c.duelRule.length; i++) {
  1198. c.duelRule[i] = false;
  1199. }
  1200. c.getPA().createPlayerHints(10, -1);
  1201. c.duelStatus = 0;
  1202. c.canOffer = true;
  1203. c.duelSpaceReq = 0;
  1204. c.duelingWith = 0;
  1205. c.freezeTimer = 1;
  1206. c.getPA().resetFollow();
  1207. c.getPA().requestUpdates();
  1208. c.getCombat().resetPlayerAttack();
  1209. c.duelRequested = false;
  1210. }
  1211.  
  1212. public void resetDuelItems() {
  1213. stakedItems.clear();
  1214. otherStakedItems.clear();
  1215. }
  1216.  
  1217. public void changeDuelStuff() {
  1218. Client o = (Client) PlayerHandler.players[c.duelingWith];
  1219. if(o == null) {
  1220. return;
  1221. }
  1222. o.duelStatus = 1;
  1223. c.duelStatus = 1;
  1224. o.getPA().sendFrame126("", 6684);
  1225. c.getPA().sendFrame126("", 6684);
  1226. }
  1227.  
  1228.  
  1229. public void selectRule(int i) { // rules
  1230. Client o = (Client) PlayerHandler.players[c.duelingWith];
  1231. if(o == null) {
  1232. return;
  1233. }
  1234. if (!c.canOffer)
  1235. return;
  1236. changeDuelStuff();
  1237. o.duelSlot = c.duelSlot;
  1238. if(i >= 11 && c.duelSlot > -1) {
  1239. if(c.playerEquipment[c.duelSlot] > 0) {
  1240. if(!c.duelRule[i]) {
  1241. c.duelSpaceReq++;
  1242. } else {
  1243. c.duelSpaceReq--;
  1244. }
  1245. }
  1246. if(o.playerEquipment[o.duelSlot] > 0) {
  1247. if(!o.duelRule[i]) {
  1248. o.duelSpaceReq++;
  1249. } else {
  1250. o.duelSpaceReq--;
  1251. }
  1252. }
  1253. }
  1254.  
  1255. if(i >= 11) {
  1256. if(c.getItems().freeSlots() < (c.duelSpaceReq ) || o.getItems().freeSlots() < (o.duelSpaceReq)) {
  1257. c.sendMessage("You or your opponent don't have the required space to set this rule.");
  1258. if(c.playerEquipment[c.duelSlot] > 0) {
  1259. c.duelSpaceReq--;
  1260. }
  1261. if(o.playerEquipment[o.duelSlot] > 0) {
  1262. o.duelSpaceReq--;
  1263. }
  1264. return;
  1265. }
  1266. }
  1267.  
  1268. if(!c.duelRule[i]) {
  1269. c.duelRule[i] = true;
  1270. c.duelOption += c.DUEL_RULE_ID[i];
  1271. } else {
  1272. c.duelRule[i] = false;
  1273. c.duelOption -= c.DUEL_RULE_ID[i];
  1274. }
  1275.  
  1276. c.getPA().sendFrame87(286, c.duelOption);
  1277. o.duelOption = c.duelOption;
  1278. o.duelRule[i] = c.duelRule[i];
  1279. o.getPA().sendFrame87(286, o.duelOption);
  1280.  
  1281. if(c.duelRule[8]){
  1282. if(c.duelRule[1]) {
  1283. c.duelTeleX = 3366 + Misc.random(12);
  1284. o.duelTeleX = c.duelTeleX-1;
  1285. c.duelTeleY = 3246 + Misc.random(6);
  1286. o.duelTeleY = c.duelTeleY;
  1287. }
  1288. } else {
  1289. if(c.duelRule[1]) {
  1290. c.duelTeleX = 3335 + Misc.random(12);
  1291. o.duelTeleX = c.duelTeleX-1;
  1292. c.duelTeleY = 3246 + Misc.random(6);
  1293. o.duelTeleY = c.duelTeleY;
  1294. }
  1295. }
  1296.  
  1297. }
  1298.  
  1299. }
Advertisement
Add Comment
Please, Sign In to add comment