Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2019
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 151.96 KB | None | 0 0
  1. package ethos.model.players;
  2.  
  3. import java.io.BufferedWriter;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. import java.util.ArrayList;
  7. import java.util.Arrays;
  8. import java.util.List;
  9. import java.util.Objects;
  10. import java.util.Optional;
  11. import java.util.Random;
  12. import java.util.concurrent.TimeUnit;
  13.  
  14. import ethos.clip.ObjectDef;
  15. import ethos.model.npcs.bosses.vorkath.Vorkath;
  16. import org.apache.commons.lang3.ArrayUtils;
  17.  
  18. import ethos.Config;
  19. import ethos.Server;
  20. import ethos.clip.PathChecker;
  21. import ethos.clip.Region;
  22. import ethos.event.CycleEvent;
  23. import ethos.event.CycleEventContainer;
  24. import ethos.event.CycleEventHandler;
  25. import ethos.event.DelayEvent;
  26. import ethos.event.impl.WheatPortalEvent;
  27. import ethos.model.content.RunePouch;
  28. import ethos.model.content.LootingBag.LootingBag;
  29. import ethos.model.content.achievement_diary.wilderness.WildernessDiaryEntry;
  30. import ethos.model.content.bonus.DoubleExperience;
  31. import ethos.model.content.instances.InstancedArea;
  32. import ethos.model.content.instances.InstancedAreaManager;
  33. import ethos.model.content.kill_streaks.Killstreak;
  34. import ethos.model.entity.Entity;
  35. import ethos.model.holiday.HolidayController;
  36. import ethos.model.holiday.halloween.HalloweenDeathCycleEvent;
  37. import ethos.model.items.EquipmentSet;
  38. import ethos.model.items.GameItem;
  39. import ethos.model.items.Item;
  40. import ethos.model.items.ItemAssistant;
  41. import ethos.model.items.ItemDefinition;
  42. import ethos.model.items.bank.BankTab;
  43. import ethos.model.minigames.bounty_hunter.TargetState;
  44. import ethos.model.minigames.lighthouse.DisposeType;
  45. import ethos.model.minigames.pest_control.PestControl;
  46. import ethos.model.minigames.pk_arena.Highpkarena;
  47. import ethos.model.minigames.pk_arena.Lowpkarena;
  48. import ethos.model.minigames.rfd.DisposeTypes;
  49. import ethos.model.multiplayer_session.MultiplayerSessionFinalizeType;
  50. import ethos.model.multiplayer_session.MultiplayerSessionStage;
  51. import ethos.model.multiplayer_session.MultiplayerSessionType;
  52. import ethos.model.multiplayer_session.duel.DuelSession;
  53. import ethos.model.multiplayer_session.duel.DuelSessionRules.Rule;
  54. import ethos.model.npcs.NPC;
  55. import ethos.model.npcs.NPCHandler;
  56. import ethos.model.npcs.bosses.zulrah.Zulrah;
  57. import ethos.model.npcs.instance.InstanceSoloFight;
  58. import ethos.model.players.combat.Damage;
  59. import ethos.model.players.combat.Degrade;
  60. import ethos.model.players.combat.Hitmark;
  61. import ethos.model.players.combat.Degrade.DegradableItem;
  62. import ethos.model.players.combat.effects.DragonfireShieldEffect;
  63. import ethos.model.players.combat.magic.MagicData;
  64. import ethos.model.players.combat.magic.NonCombatSpells;
  65. import ethos.model.players.mode.ModeType;
  66. import ethos.model.players.skills.Cooking;
  67. import ethos.model.players.skills.Fishing;
  68. import ethos.model.players.skills.Skill;
  69. import ethos.model.players.skills.SkillHandler;
  70. import ethos.model.players.skills.Smelting;
  71. import ethos.model.players.skills.Smelting.Bars;
  72. import ethos.model.players.skills.crafting.CraftingData;
  73. import ethos.model.players.skills.crafting.Enchantment;
  74. import ethos.model.players.skills.mining.Mineral;
  75. import ethos.model.players.skills.slayer.Task;
  76. import ethos.model.players.skills.woodcutting.Tree;
  77. import ethos.model.shops.ShopAssistant;
  78. import ethos.net.outgoing.messages.ComponentVisibility;
  79. import ethos.util.Misc;
  80. import ethos.util.Stream;
  81. import ethos.world.Clan;
  82.  
  83. public class PlayerAssistant {
  84.  
  85. private final Player c;
  86.  
  87. public PlayerAssistant(Player Client) {
  88. this.c = Client;
  89. }
  90.  
  91. public int CraftInt, Dcolor, FletchInt;
  92.  
  93. public void destroyItem() {
  94.  
  95. int itemId = c.droppedItem;
  96. if (c.getItems().playerHasItem(itemId) && itemId != -1
  97. && c.playerItemsN[c.getItems().getItemSlot(itemId)] > 0) {
  98. @SuppressWarnings("unused")
  99. String itemName = ItemAssistant.getItemName(itemId);
  100. c.getItems().deleteItem(itemId, c.getItems().getItemSlot(itemId),
  101. c.playerItemsN[c.getItems().getItemSlot(itemId)]);
  102. // c.sendMessage("Your " + itemName + " vanishes as you drop it on the
  103. // ground.");
  104. removeAllWindows();
  105. }
  106. }
  107.  
  108. /**
  109. * Retribution
  110. *
  111. * @param i
  112. * Player i
  113. * @return Return statement
  114. */
  115. private boolean checkRetributionReqsSingle(int i) {
  116. if (c.inPits && PlayerHandler.getPlayers().get(i).inPits || PlayerHandler.getPlayers().get(i).inDuel) {
  117. if (PlayerHandler.getPlayers().get(i) != null || i == c.getIndex())
  118. return true;
  119. }
  120. int combatDif1 = c.getCombat().getCombatDifference(c.combatLevel,
  121. PlayerHandler.getPlayers().get(i).combatLevel);
  122. if (PlayerHandler.getPlayers().get(i) == null || i != c.getIndex()
  123. || !PlayerHandler.getPlayers().get(i).inWild() || combatDif1 > c.wildLevel
  124. || combatDif1 > PlayerHandler.getPlayers().get(i).wildLevel) {
  125. return false;
  126. }
  127. if (Config.SINGLE_AND_MULTI_ZONES) {
  128. if (!PlayerHandler.getPlayers().get(i).inMulti()) {
  129. if (PlayerHandler.getPlayers().get(i).underAttackBy == c.getIndex()
  130. || PlayerHandler.getPlayers().get(i).underAttackBy <= 0
  131. || PlayerHandler.getPlayers().get(i).getIndex() == c.underAttackBy || c.underAttackBy <= 0) {
  132. return false;
  133. }
  134. }
  135. }
  136. return true;
  137. }
  138.  
  139. public void appendRetribution(Player o) {
  140. System.out.println("here");
  141. if (o != null && checkRetributionReqsSingle(c.getIndex())) {
  142. System.out.println("here1");
  143. if (!c.goodDistance(o.getX(), o.getY(), c.getX(), c.getY(), 1))
  144. return;
  145. int damage = (int) (getLevelForXP(c.playerXP[5]) * 2.50 / 10);
  146. if (o.getLevelForXP(c.playerXP[3]) - damage < 0) {
  147. damage = o.getLevelForXP(c.playerXP[3]);
  148. }
  149. System.out.println("here2");
  150. c.gfx0(437);
  151. c.appendDamage(damage, Hitmark.HIT);
  152. c.getPA().refreshSkill(3);
  153. c.totalPlayerDamageDealt += damage;
  154. }
  155. }
  156.  
  157. public void sendPlayerObjectAnimation(Player player, int x, int y, int animation, int type, int orientation,
  158. int height) {
  159. if (player == null)
  160. return;
  161. // if (p.getPosition().isViewableFrom(position)) {
  162. player.getOutStream().createFrame(85);
  163. player.getOutStream().writeByteC(y - (player.mapRegionY * 8));
  164. player.getOutStream().writeByteC(x - (player.mapRegionX * 8));
  165. player.getOutStream().createFrame(160);
  166. player.getOutStream().writeByteS(((0 & 7) << 4) + (0 & 7));
  167. player.getOutStream().writeByteS((type << 2) + (orientation & 3));
  168. player.getOutStream().writeWordA(animation);
  169. // }
  170. }
  171.  
  172. public void destroyInterface(String config) {// Destroy item created by Remco
  173. int itemId = c.droppedItem;
  174. String itemName = ItemAssistant.getItemName(c.droppedItem);
  175. String[][] info = { // The info the dialogue gives
  176. { "Are you sure you want to " + config + " this item?", "14174" }, { "Yes.", "14175" },
  177. { "No.", "14176" }, { "", "14177" }, { "If you wish to remove this confirmation,", "14182" },
  178. { "simply type ::toggledrop.", "14183" }, { itemName, "14184" } };
  179. sendFrame34(itemId, 0, 14171, 1);
  180. for (String[] anInfo : info)
  181. sendFrame126(anInfo[0], Integer.parseInt(anInfo[1]));
  182. sendFrame164(14170);
  183. }
  184.  
  185. public void imbuedHeart() {
  186. c.playerLevel[6] += imbuedHeartStats();
  187. c.getPA().refreshSkill(6);
  188. c.gfx0(1316);
  189. c.sendMessage("Imbued Heart");
  190. }
  191.  
  192. private int imbuedHeartStats() {
  193. int increaseBy;
  194. int skill = 6;
  195. increaseBy = (int) (c.getLevelForXP(c.playerXP[skill]) * .10);
  196. if (c.playerLevel[skill] + increaseBy > c.getLevelForXP(c.playerXP[skill]) + increaseBy + 1) {
  197. return c.getLevelForXP(c.playerXP[skill]) + increaseBy - c.playerLevel[skill];
  198. }
  199. return increaseBy;
  200. }
  201.  
  202. public void assembleSlayerHelmet() {
  203. if (!c.getSlayer().isHelmetCreatable()) {
  204. c.sendMessage("You don't have the knowledge to do this. You must learn how to first.");
  205. return;
  206. }
  207. if (c.playerLevel[Player.playerCrafting] < 55) {
  208. c.sendMessage("@blu@You need a crafting level of 55 to assemble a slayer helmet.");
  209. return;
  210. }
  211. if (c.getItems().playerHasItem(4166) && c.getItems().playerHasItem(4168) && c.getItems().playerHasItem(4164)
  212. && c.getItems().playerHasItem(4551) && c.getItems().playerHasItem(8901)) {
  213. c.sendMessage("@blu@You assemble the pieces and create a full slayer helmet!");
  214. c.getItems().deleteItem(4166, 1);
  215. c.getItems().deleteItem(4164, 1);
  216. c.getItems().deleteItem(4168, 1);
  217. c.getItems().deleteItem(4551, 1);
  218. c.getItems().deleteItem(8901, 1);
  219. c.getItems().addItem(11864, 1);
  220. } else {
  221. c.sendMessage(
  222. "You need a @blu@Facemask@bla@, @blu@Nose peg@bla@, @blu@Spiny helmet@bla@ and @blu@Earmuffs");
  223. c.sendMessage("@bla@in order to assemble a slayer helmet.");
  224. }
  225. }
  226.  
  227. public long lastReward = System.currentTimeMillis();
  228.  
  229. public void otherInv(Player c, Player o) {
  230. if (o == c || o == null || c == null)
  231. return;
  232. int[] backupItems = c.playerItems;
  233. int[] backupItemsN = c.playerItemsN;
  234. c.playerItems = o.playerItems;
  235. c.playerItemsN = o.playerItemsN;
  236. c.getItems().resetItems(3214);
  237. c.playerItems = backupItems;
  238. c.playerItemsN = backupItemsN;
  239. }
  240.  
  241. public void multiWay(int i1) {
  242. // synchronized(c) {
  243. c.outStream.createFrame(61);
  244. c.outStream.writeByte(i1);
  245. c.updateRequired = true;
  246. c.setAppearanceUpdateRequired(true);
  247.  
  248. }
  249.  
  250. private final int[] backupItems = new int[Config.BANK_SIZE];
  251. private final int[] backupItemsN = new int[Config.BANK_SIZE];
  252.  
  253. public void otherBank(Player c, Player o) {
  254. if (o == c || o == null || c == null) {
  255. return;
  256. }
  257.  
  258. for (int i = 0; i < o.bankItems.length; i++) {
  259. backupItems[i] = c.bankItems[i];
  260. backupItemsN[i] = c.bankItemsN[i];
  261. c.bankItemsN[i] = o.bankItemsN[i];
  262. c.bankItems[i] = o.bankItems[i];
  263. }
  264. openUpBank();
  265.  
  266. for (int i = 0; i < o.bankItems.length; i++) {
  267. c.bankItemsN[i] = backupItemsN[i];
  268. c.bankItems[i] = backupItems[i];
  269. }
  270. }
  271.  
  272. public void sendString(final String s, final int id) {
  273. if (c.getOutStream() != null && c != null) {
  274. c.getOutStream().createFrameVarSizeWord(126);
  275. c.getOutStream().writeString(s);
  276. c.getOutStream().writeWordA(id);
  277. c.getOutStream().endFrameVarSizeWord();
  278. c.flushOutStream();
  279. }
  280.  
  281. }
  282.  
  283. /**
  284. * Changes the main displaying sprite on an interface. The index represents the
  285. * location of the new sprite in the index of the sprite array.
  286. *
  287. * @param componentId
  288. * the interface
  289. * @param index
  290. * the index in the array
  291. */
  292. public void sendChangeSprite(int componentId, byte index) {
  293. if (c == null || c.getOutStream() == null) {
  294. return;
  295. }
  296. Stream stream = c.getOutStream();
  297. stream.createFrame(7);
  298. stream.writeDWord(componentId);
  299. stream.writeByte(index);
  300. c.flushOutStream();
  301. }
  302.  
  303. public static void sendItems(Player player, int componentId, List<GameItem> items, int capacity) {
  304. if (player == null || player.getOutStream() == null) {
  305. return;
  306. }
  307. player.getOutStream().createFrameVarSizeWord(53);
  308. player.getOutStream().writeWord(componentId);
  309. int length = items.size();
  310. int current = 0;
  311. player.getOutStream().writeWord(length);
  312. for (GameItem item : items) {
  313. if (item.getAmount() > 254) {
  314. player.getOutStream().writeByte(255);
  315. player.getOutStream().writeDWord_v2(item.getAmount());
  316. } else {
  317. player.getOutStream().writeByte(item.getAmount());
  318. }
  319. player.getOutStream().writeWordBigEndianA(item.getId() + 1);
  320. current++;
  321. }
  322. for (; current < capacity; current++) {
  323. player.getOutStream().writeByte(1);
  324. player.getOutStream().writeWordBigEndianA(-1);
  325. }
  326. player.getOutStream().endFrameVarSizeWord();
  327. player.flushOutStream();
  328. }
  329.  
  330. public void removeAllItems() {
  331. for (int i = 0; i < c.playerItems.length; i++) {
  332. c.playerItems[i] = 0;
  333. }
  334. for (int i = 0; i < c.playerItemsN.length; i++) {
  335. c.playerItemsN[i] = 0;
  336. }
  337. c.getItems().resetItems(3214);
  338. }
  339.  
  340. public void setConfig(int id, int state) {
  341. // synchronized (c) {
  342. if (c.getOutStream() != null && c != null) {
  343. c.getOutStream().createFrame(36);
  344. c.getOutStream().writeWordBigEndian(id);
  345. c.getOutStream().writeByte(state);
  346. c.flushOutStream();
  347. }
  348. // }
  349. }
  350.  
  351. public double getAgilityRunRestore(Player c) {
  352. return 2260 - (c.playerLevel[16] * 10);
  353. }
  354.  
  355. public void itemOnInterface(int interfaceChild, int zoom, int itemId) {
  356. if (c.getOutStream() != null && c != null) {
  357. c.getOutStream().createFrame(246);
  358. c.getOutStream().writeWordBigEndian(interfaceChild);
  359. c.getOutStream().writeWord(zoom);
  360. c.getOutStream().writeWord(itemId);
  361. c.flushOutStream();
  362. }
  363. }
  364.  
  365. public void itemOnInterface(int item, int amount, int frame, int slot) {
  366. c.outStream.createFrameVarSizeWord(34);
  367. c.outStream.writeWord(frame);
  368. c.outStream.writeByte(slot);
  369. c.outStream.writeWord(item + 1);
  370. c.outStream.writeByte(255);
  371. c.outStream.writeDWord(amount);
  372. c.outStream.endFrameVarSizeWord();
  373. }
  374.  
  375. public void playerWalk(int x, int y) {
  376. PathFinder.getPathFinder().findRoute(c, x, y, true, 1, 1);
  377. }
  378.  
  379. /**
  380. * If the player is using melee and is standing diagonal from the opponent, then
  381. * move towards opponent.
  382. */
  383.  
  384. public void movePlayerDiagonal(int i) {
  385. Player c2 = PlayerHandler.players[i];
  386. boolean hasMoved = false;
  387. int c2X = c2.getX();
  388. int c2Y = c2.getY();
  389. if (c.goodDistance(c2X, c2Y, c.getX(), c.getY(), 1)) {
  390. if (c.getX() != c2.getX() && c.getY() != c2.getY()) {
  391. if (c.getX() > c2.getX() && !hasMoved) {
  392. if (Region.getClipping(c.getX() - 1, c.getY(), c.heightLevel, -1, 0)) {
  393. hasMoved = true;
  394. walkTo(-1, 0);
  395. }
  396. } else if (c.getX() < c2.getX() && !hasMoved) {
  397. if (Region.getClipping(c.getX() + 1, c.getY(), c.heightLevel, 1, 0)) {
  398. hasMoved = true;
  399. walkTo(1, 0);
  400. }
  401. }
  402.  
  403. if (c.getY() > c2.getY() && !hasMoved) {
  404. if (Region.getClipping(c.getX(), c.getY() - 1, c.heightLevel, 0, -1)) {
  405. walkTo(0, -1);
  406. }
  407. } else if (c.getY() < c2.getY() && !hasMoved) {
  408. if (Region.getClipping(c.getX(), c.getY() + 1, c.heightLevel, 0, 1)) {
  409. walkTo(0, 1);
  410. }
  411. }
  412. }
  413. }
  414. }
  415.  
  416. public Clan getClan() {
  417. if (Server.clanManager.clanExists(c.playerName)) {
  418. return Server.clanManager.getClan(c.playerName);
  419. }
  420. return null;
  421. }
  422.  
  423. public void sendClan(String name, String message, String clan, int rights) {
  424. if (rights >= 3)
  425. rights--;
  426. c.outStream.createFrameVarSizeWord(217);
  427. c.outStream.writeString(name);
  428. c.outStream.writeString(Misc.formatPlayerName(message));
  429. c.outStream.writeString(clan);
  430. c.outStream.writeWord(rights);
  431. c.outStream.endFrameVarSize();
  432. }
  433.  
  434. public void clearClanChat() {
  435. c.clanId = -1;
  436. c.getPA().sendString("Talking in: ", 18139);
  437. c.getPA().sendString("Owner: ", 18140);
  438. for (int j = 18144; j < 18244; j++) {
  439. c.getPA().sendString("", j);
  440. }
  441. }
  442.  
  443. public void setClanData() {
  444. boolean exists = Server.clanManager.clanExists(c.playerName);
  445. if (!exists || c.clan == null) {
  446. sendString("Join chat", 18135);
  447. sendString("Talking in: Not in chat", 18139);
  448. sendString("Owner: None", 18140);
  449. }
  450. if (!exists) {
  451. sendString("Chat Disabled", 18306);
  452. String title = "";
  453. for (int id = 18307; id < 18317; id += 3) {
  454. if (id == 18307) {
  455. title = "Anyone";
  456. } else if (id == 18310) {
  457. title = "Anyone";
  458. } else if (id == 18313) {
  459. title = "General+";
  460. } else if (id == 18316) {
  461. title = "Only Me";
  462. }
  463. sendString(title, id + 2);
  464. }
  465. for (int index = 0; index < 100; index++) {
  466. sendString("", 18323 + index);
  467. }
  468. for (int index = 0; index < 100; index++) {
  469. sendString("", 18424 + index);
  470. }
  471. return;
  472. }
  473. Clan clan = Server.clanManager.getClan(c.playerName);
  474. sendString(clan.getTitle(), 18306);
  475. String title = "";
  476. for (int id = 18307; id < 18317; id += 3) {
  477. if (id == 18307) {
  478. title = clan.getRankTitle(clan.whoCanJoin)
  479. + (clan.whoCanJoin > Clan.Rank.ANYONE && clan.whoCanJoin < Clan.Rank.OWNER ? "+" : "");
  480. } else if (id == 18310) {
  481. title = clan.getRankTitle(clan.whoCanTalk)
  482. + (clan.whoCanTalk > Clan.Rank.ANYONE && clan.whoCanTalk < Clan.Rank.OWNER ? "+" : "");
  483. } else if (id == 18313) {
  484. title = clan.getRankTitle(clan.whoCanKick)
  485. + (clan.whoCanKick > Clan.Rank.ANYONE && clan.whoCanKick < Clan.Rank.OWNER ? "+" : "");
  486. } else if (id == 18316) {
  487. title = clan.getRankTitle(clan.whoCanBan)
  488. + (clan.whoCanBan > Clan.Rank.ANYONE && clan.whoCanBan < Clan.Rank.OWNER ? "+" : "");
  489. }
  490. sendString(title, id + 2);
  491. }
  492. if (clan.rankedMembers != null) {
  493. for (int index = 0; index < 100; index++) {
  494. if (index < clan.rankedMembers.size()) {
  495. sendString("<clan=" + clan.ranks.get(index) + ">" + clan.rankedMembers.get(index), 18323 + index);
  496. } else {
  497. sendString("", 18323 + index);
  498. }
  499. }
  500. }
  501. if (clan.bannedMembers != null) {
  502. for (int index = 0; index < 100; index++) {
  503. if (index < clan.bannedMembers.size()) {
  504. sendString(clan.bannedMembers.get(index), 18424 + index);
  505. } else {
  506. sendString("", 18424 + index);
  507. }
  508. }
  509. }
  510. }
  511.  
  512. public void resetAutocast() {
  513. c.autocastId = -1;
  514. c.autocasting = false;
  515. c.setSidebarInterface(0, 328);
  516. c.getPA().sendFrame36(108, 0);
  517. c.getItems().sendWeapon(c.playerEquipment[c.playerWeapon],
  518. ItemAssistant.getItemName(c.playerEquipment[c.playerWeapon]));
  519. c.getPA().sendAutocastState(false);
  520. }
  521.  
  522. public int getItemSlot(int itemID) {
  523. for (int i = 0; i < c.playerItems.length; i++) {
  524. if ((c.playerItems[i] - 1) == itemID) {
  525. return i;
  526. }
  527. }
  528. return -1;
  529. }
  530.  
  531. public boolean isItemInBag(int itemID) {
  532. for (int i = 0; i < c.playerItems.length; i++) {
  533. if ((c.playerItems[i] - 1) == itemID) {
  534. return true;
  535. }
  536. }
  537. return false;
  538. }
  539.  
  540. public int freeSlots() {
  541. int freeS = 0;
  542. for (int i = 0; i < c.playerItems.length; i++) {
  543. if (c.playerItems[i] <= 0) {
  544. freeS++;
  545. }
  546. }
  547. return freeS;
  548. }
  549.  
  550. public void turnTo(int pointX, int pointY) {
  551. c.focusPointX = 2 * pointX + 1;
  552. c.focusPointY = 2 * pointY + 1;
  553. c.updateRequired = true;
  554. }
  555.  
  556. public void movePlayerUnconditionally(int x, int y, int h) {
  557. c.resetWalkingQueue();
  558. c.teleportToX = x;
  559. c.teleportToY = y;
  560. c.heightLevel = h;
  561. c.teleTimer = 4;
  562. requestUpdates();
  563. c.lastMove = System.currentTimeMillis();
  564. }
  565.  
  566. public void movePlayer(int x, int y) {
  567. movePlayer(x, y, c.heightLevel);
  568. }
  569.  
  570. public void movePlayer(int x, int y, int h) {
  571. if (c.inDuelArena() || Server.getMultiplayerSessionListener().inAnySession(c)) {
  572. if (!c.isDead) {
  573. return;
  574. }
  575. }
  576. if (c.getBankPin().requiresUnlock()) {
  577. c.getBankPin().open(2);
  578. return;
  579. }
  580. if (System.currentTimeMillis() - c.lastSpear < 3000) {
  581. c.sendMessage("You're trying to move too fast.");
  582. return;
  583. }
  584. if (c.morphed) {
  585. c.sendMessage("You cannot do this now.");
  586. return;
  587. }
  588. if (c.getSlayer().superiorSpawned) {
  589. c.getSlayer().superiorSpawned = false;
  590. }
  591. c.resetWalkingQueue();
  592. c.getCombat().resetPlayerAttack();
  593. c.teleportToX = x;
  594. c.teleportToY = y;
  595. c.heightLevel = h;
  596. c.teleTimer = 2;
  597. requestUpdates();
  598. }
  599.  
  600. public void movePlayer(Coordinate coord) {
  601. movePlayer(coord.getX(), coord.getY(), coord.getH());
  602. }
  603.  
  604. public void movePlayerDuel(int x, int y, int h) {
  605. DuelSession session = (DuelSession) Server.getMultiplayerSessionListener().getMultiplayerSession(c,
  606. MultiplayerSessionType.DUEL);
  607. if (Objects.nonNull(session) && session.getStage().getStage() == MultiplayerSessionStage.FURTHER_INTERATION
  608. && Boundary.isIn(c, Boundary.DUEL_ARENA)) {
  609. return;
  610. }
  611. c.resetWalkingQueue();
  612. c.teleportToX = x;
  613. c.teleportToY = y;
  614. c.heightLevel = h;
  615. requestUpdates();
  616. }
  617.  
  618. public int getX() {
  619. return absX;
  620. }
  621.  
  622. public int getY() {
  623. return absY;
  624. }
  625.  
  626. private int absX;
  627. private int absY;
  628. public int heightLevel;
  629.  
  630. public static void sendQuest(Player client, String s, int i) {
  631. client.getOutStream().createFrameVarSizeWord(126);
  632. client.getOutStream().writeString(s);
  633. client.getOutStream().writeWordA(i);
  634. client.getOutStream().endFrameVarSizeWord();
  635. client.flushOutStream();
  636. }
  637.  
  638. public void sendStillGraphics(int id, int heightS, int y, int x, int timeBCS) {
  639. c.getOutStream().createFrame(85);
  640. c.getOutStream().writeByteC(y - (c.mapRegionY * 8));
  641. c.getOutStream().writeByteC(x - (c.mapRegionX * 8));
  642. c.getOutStream().createFrame(4);
  643. c.getOutStream().writeByte(0);// Tiles away (X >> 4 + Y & 7)
  644. // //Tiles away from
  645. // absX and absY.
  646. c.getOutStream().writeWord(id); // Graphic ID.
  647. c.getOutStream().writeByte(heightS); // Height of the graphic when
  648. // cast.
  649. c.getOutStream().writeWord(timeBCS); // Time before the graphic
  650. // plays.
  651. c.flushOutStream();
  652. }
  653.  
  654. public void createArrow(int type, int id) {
  655. if (c != null) {
  656. c.getOutStream().createFrame(254); // The packet ID
  657. c.getOutStream().writeByte(type); // 1=NPC, 10=Player
  658. c.getOutStream().writeWord(id); // NPC/Player ID
  659. c.getOutStream().write3Byte(0); // Junk
  660. }
  661. }
  662.  
  663. public void createArrow(int x, int y, int height, int pos) {
  664. if (c != null) {
  665. c.getOutStream().createFrame(254); // The packet ID
  666. c.getOutStream().writeByte(pos); // Position on Square(2 = middle, 3
  667. // = west, 4 = east, 5 = south,
  668. // 6 = north)
  669. c.getOutStream().writeWord(x); // X-Coord of Object
  670. c.getOutStream().writeWord(y); // Y-Coord of Object
  671. c.getOutStream().writeByte(height); // Height off Ground
  672. }
  673. }
  674.  
  675. public void loadQuests() {
  676.  
  677. }
  678.  
  679. public void sendFrame126(String s, int id) {
  680. if (s == null) {
  681. return;
  682. }
  683. if (!c.checkPacket126Update(s, id) && !s.startsWith("www")) {
  684. return;
  685. }
  686. if (c.getOutStream() != null && c != null) {
  687. c.getOutStream().createFrameVarSizeWord(126);
  688. c.getOutStream().writeString(s);
  689. c.getOutStream().writeWordA(id);
  690. c.getOutStream().endFrameVarSizeWord();
  691. c.flushOutStream();
  692. }
  693.  
  694. }
  695.  
  696. public void sendLink(String s) {
  697. if (c.getOutStream() != null && c != null) {
  698. c.getOutStream().createFrameVarSizeWord(187);
  699. c.getOutStream().writeString(s);
  700. }
  701. }
  702.  
  703. public void setSkillLevel(int skillNum, int currentLevel, int XP) {
  704. if (c.getOutStream() != null && c != null) {
  705. c.getOutStream().createFrame(134);
  706. if(skillNum==21){
  707. skillNum=22;
  708. }
  709. c.getOutStream().writeByte(skillNum);
  710. c.getOutStream().writeDWord_v1(XP);
  711. c.getOutStream().writeByte(currentLevel);
  712. c.flushOutStream();
  713. }
  714. }
  715.  
  716. public void sendFrame106(int sideIcon) {
  717. // synchronized(c) {
  718. if (c.getOutStream() != null && c != null) {
  719. c.getOutStream().createFrame(106);
  720. c.getOutStream().writeByteC(sideIcon);
  721. c.flushOutStream();
  722. requestUpdates();
  723. }
  724. }
  725.  
  726. public void sendFrame107() {
  727. // synchronized(c) {
  728. if (c.getOutStream() != null && c != null) {
  729. c.getOutStream().createFrame(107);
  730. c.flushOutStream();
  731. }
  732. // }
  733. }
  734.  
  735. public void sendFrame36(int id, int state) {
  736. // synchronized(c) {
  737. if (c.getOutStream() != null && c != null) {
  738. c.getOutStream().createFrame(36);
  739. c.getOutStream().writeWordBigEndian(id);
  740. c.getOutStream().writeByte(state);
  741. c.flushOutStream();
  742. }
  743.  
  744. }
  745.  
  746. public void sendFrame185(int Frame) {
  747. // synchronized(c) {
  748. if (c.getOutStream() != null && c != null) {
  749. c.getOutStream().createFrame(185);
  750. c.getOutStream().writeWordBigEndianA(Frame);
  751. }
  752.  
  753. }
  754.  
  755. public void showInterface(int interfaceid) {
  756. if (Server.getMultiplayerSessionListener().inSession(c, MultiplayerSessionType.TRADE)) {
  757. Server.getMultiplayerSessionListener().finish(c, MultiplayerSessionFinalizeType.WITHDRAW_ITEMS);
  758. return;
  759. }
  760. if (c.viewingLootBag || c.addingItemsToLootBag || c.viewingRunePouch) {
  761. c.sendMessage("You should stop what you are doing before continuing.");
  762. return;
  763. }
  764. if (c.getOutStream() != null && c != null) {
  765. c.setInterfaceOpen(interfaceid);
  766. c.getOutStream().createFrame(97);
  767. c.getOutStream().writeWord(interfaceid);
  768. c.flushOutStream();
  769. }
  770. }
  771.  
  772. public void sendFrame248(int MainFrame, int SubFrame) {
  773. // synchronized(c) {
  774. if (c.getOutStream() != null && c != null) {
  775. c.getOutStream().createFrame(248);
  776. c.getOutStream().writeWordA(MainFrame);
  777. c.getOutStream().writeWord(SubFrame);
  778. c.flushOutStream();
  779.  
  780. }
  781. }
  782.  
  783. public void sendFrame246(int MainFrame, int SubFrame, int SubFrame2) {
  784. // synchronized(c) {
  785. if (c.getOutStream() != null && c != null) {
  786. c.getOutStream().createFrame(246);
  787. c.getOutStream().writeWordBigEndian(MainFrame);
  788. c.getOutStream().writeWord(SubFrame);
  789. c.getOutStream().writeWord(SubFrame2);
  790. c.flushOutStream();
  791. }
  792. }
  793.  
  794. public void sendFrame171(int state, int componentId) {
  795. if (c.getPacketDropper().requiresUpdate(171, new ComponentVisibility(state, componentId))) {
  796. if (c.getOutStream() != null && c != null) {
  797. c.getOutStream().createFrame(171);
  798. c.getOutStream().writeByte(state);
  799. c.getOutStream().writeWord(componentId);
  800. c.flushOutStream();
  801. }
  802. }
  803. }
  804.  
  805. public void sendFrame200(int MainFrame, int SubFrame) {
  806. // synchronized(c) {
  807. if (c.getOutStream() != null && c != null) {
  808. c.getOutStream().createFrame(200);
  809. c.getOutStream().writeWord(MainFrame);
  810. c.getOutStream().writeWord(SubFrame);
  811. c.flushOutStream();
  812. }
  813. }
  814.  
  815. public void sendFrame70(int i, int o, int id) {
  816. // synchronized(c) {
  817. if (c.getOutStream() != null && c != null) {
  818. c.getOutStream().createFrame(70);
  819. c.getOutStream().writeWord(i);
  820. c.getOutStream().writeWordBigEndian(o);
  821. c.getOutStream().writeWordBigEndian(id);
  822. c.flushOutStream();
  823. }
  824.  
  825. }
  826.  
  827. public void sendFrame75(int MainFrame, int SubFrame) {
  828. // synchronized(c) {
  829. if (c.getOutStream() != null && c != null) {
  830. c.getOutStream().createFrame(75);
  831. c.getOutStream().writeWordBigEndianA(MainFrame);
  832. c.getOutStream().writeWordBigEndianA(SubFrame);
  833. c.flushOutStream();
  834. }
  835.  
  836. }
  837.  
  838. public void sendFrame164(int Frame) {
  839. // synchronized(c) {
  840. if (c.getOutStream() != null && c != null) {
  841. c.getOutStream().createFrame(164);
  842. c.getOutStream().writeWordBigEndian_dup(Frame);
  843. c.flushOutStream();
  844. }
  845.  
  846. }
  847.  
  848. public void sendFrame87(int id, int state) {
  849. // synchronized(c) {
  850. if (c.getOutStream() != null && c != null) {
  851. c.getOutStream().createFrame(87);
  852. c.getOutStream().writeWordBigEndian_dup(id);
  853. c.getOutStream().writeDWord_v1(state);
  854. c.flushOutStream();
  855. }
  856.  
  857. }
  858.  
  859. public void sendPM(long name, int rights, byte[] chatMessage) {
  860. c.getOutStream().createFrameVarSize(196);
  861. c.getOutStream().writeQWord(name);
  862. c.getOutStream().writeDWord(new Random().nextInt());
  863. c.getOutStream().writeByte(rights);
  864. c.getOutStream().writeBytes(chatMessage, chatMessage.length, 0);
  865. c.getOutStream().endFrameVarSize();
  866. }
  867.  
  868. public void createPlayerHints(int type, int id) {
  869. if (c.getOutStream() != null && c != null) {
  870. c.getOutStream().createFrame(254);
  871. c.getOutStream().writeByte(type);
  872. c.getOutStream().writeWord(id);
  873. c.getOutStream().write3Byte(0);
  874. c.flushOutStream();
  875. }
  876. }
  877.  
  878. public void createObjectHints(int x, int y, int height, int pos) {
  879. // synchronized(c) {
  880. if (c.getOutStream() != null && c != null) {
  881. c.getOutStream().createFrame(254);
  882. c.getOutStream().writeByte(pos);
  883. c.getOutStream().writeWord(x);
  884. c.getOutStream().writeWord(y);
  885. c.getOutStream().writeByte(height);
  886. c.flushOutStream();
  887. }
  888.  
  889. }
  890.  
  891. private void sendAutocastState(boolean state) {
  892. if (c == null || c.disconnected || c.getSession() == null) {
  893. return;
  894. }
  895. Stream stream = c.getOutStream();
  896. if (stream == null) {
  897. return;
  898. }
  899. stream.createFrame(15);
  900. stream.writeByte(state ? 1 : 0);
  901. c.flushOutStream();
  902. }
  903.  
  904. public void sendFriend(long friend, int world) {
  905. c.getOutStream().createFrame(50);
  906. c.getOutStream().writeQWord(friend);
  907. c.getOutStream().writeByte(world);
  908.  
  909. }
  910.  
  911. public void removeAllWindows() {
  912. // synchronized(c) {
  913. if (c.getOutStream() != null && c != null) {
  914. c.getPA().resetVariables();
  915. c.getOutStream().createFrame(219);
  916. c.flushOutStream();
  917. c.nextChat = 0;
  918. c.dialogueOptions = 0;
  919. }
  920. resetVariables();
  921. }
  922.  
  923. public void closeAllWindows() {
  924. if (c.getOutStream() != null && c != null) {
  925. c.getOutStream().createFrame(219);
  926. c.flushOutStream();
  927. c.isBanking = false;
  928. c.inSafeBox = false;
  929. c.viewingLootBag = false;
  930. c.addingItemsToLootBag = false;
  931. c.viewingRunePouch = false;
  932. c.nextChat = 0;
  933. c.dialogueOptions = 0;
  934. c.placeHolderWarning = false;
  935. resetVariables();
  936. }
  937. }
  938.  
  939. public void sendFrame34(int id, int slot, int column, int amount) {
  940. // synchronized(c) {
  941. if (c.getOutStream() != null && c != null) {
  942. c.outStream.createFrameVarSizeWord(34); // init item to smith screen
  943. c.outStream.writeWord(column); // Column Across Smith Screen
  944. c.outStream.writeByte(4); // Total Rows?
  945. c.outStream.writeDWord(slot); // Row Down The Smith Screen
  946. c.outStream.writeWord(id + 1); // item
  947. c.outStream.writeByte(amount); // how many there are?
  948. c.outStream.endFrameVarSizeWord();
  949. }
  950.  
  951. }
  952.  
  953. public void walkableInterface(int id) {
  954. // synchronized(c) {
  955. if (c.getOutStream() != null && c != null) {
  956. c.getOutStream().createFrame(208);
  957. c.getOutStream().writeWordBigEndian_dup(id);
  958. c.flushOutStream();
  959. }
  960.  
  961. }
  962.  
  963. public void shakeScreen(int verticleAmount, int verticleSpeed, int horizontalAmount, int horizontalSpeed) {
  964. if (c != null && c.getOutStream() != null) {
  965. c.getOutStream().createFrame(35);
  966. c.getOutStream().writeByte(verticleAmount);
  967. c.getOutStream().writeByte(verticleSpeed);
  968. c.getOutStream().writeByte(horizontalAmount);
  969. c.getOutStream().writeByte(horizontalSpeed);
  970. c.flushOutStream();
  971. }
  972. }
  973.  
  974. public void resetShaking() {
  975. shakeScreen(1, 1, 1, 1);
  976. }
  977.  
  978. public int mapStatus = 0;
  979.  
  980. public void sendFrame99(int state) { // used for disabling map
  981. // synchronized(c) {
  982. if (c != null && c.getOutStream() != null) {
  983. c.getOutStream().createFrame(99);
  984. c.getOutStream().writeByte(state);
  985. c.flushOutStream();
  986. }
  987. }
  988.  
  989. public void sendCrashFrame() {
  990. if (c.getOutStream() != null && c != null) {
  991. c.getOutStream().createFrame(123);
  992. c.flushOutStream();
  993. }
  994. }
  995.  
  996. /**
  997. * Reseting animations for everyone
  998. **/
  999.  
  1000. private void frame1() {
  1001. // synchronized(c) {
  1002. for (int i = 0; i < Config.MAX_PLAYERS; i++) {
  1003. if (PlayerHandler.players[i] != null) {
  1004. Player person = PlayerHandler.players[i];
  1005. if (person != null) {
  1006. if (person.getOutStream() != null && !person.disconnected) {
  1007. if (c.distanceToPoint(person.getX(), person.getY()) <= 25) {
  1008. person.getOutStream().createFrame(1);
  1009. person.flushOutStream();
  1010. person.getPA().requestUpdates();
  1011. }
  1012. }
  1013. }
  1014.  
  1015. }
  1016. }
  1017. }
  1018.  
  1019. /**
  1020. * Creating projectile
  1021. **/
  1022. private void createProjectile(int x, int y, int offX, int offY, int angle, int speed, int gfxMoving,
  1023. int startHeight, int endHeight, int lockon, int time) {
  1024. // synchronized(c) {
  1025. if (c.getOutStream() != null && c != null) {
  1026. c.getOutStream().createFrame(85);
  1027. c.getOutStream().writeByteC((y - (c.getMapRegionY() * 8)) - 2);
  1028. c.getOutStream().writeByteC((x - (c.getMapRegionX() * 8)) - 3);
  1029. c.getOutStream().createFrame(117);
  1030. c.getOutStream().writeByte(angle);
  1031. c.getOutStream().writeByte(offY);
  1032. c.getOutStream().writeByte(offX);
  1033. c.getOutStream().writeWord(lockon);
  1034. c.getOutStream().writeWord(gfxMoving);
  1035. c.getOutStream().writeByte(startHeight);
  1036. c.getOutStream().writeByte(endHeight);
  1037. c.getOutStream().writeWord(time);
  1038. c.getOutStream().writeWord(speed);
  1039. c.getOutStream().writeByte(16);
  1040. c.getOutStream().writeByte(64);
  1041. c.flushOutStream();
  1042.  
  1043. }
  1044. }
  1045.  
  1046. private void createProjectile2(int x, int y, int offX, int offY, int angle, int speed, int gfxMoving,
  1047. int startHeight, int endHeight, int lockon, int time, int slope) {
  1048. // synchronized(c) {
  1049. if (c.getOutStream() != null && c != null) {
  1050. c.getOutStream().createFrame(85);
  1051. c.getOutStream().writeByteC((y - (c.getMapRegionY() * 8)) - 2);
  1052. c.getOutStream().writeByteC((x - (c.getMapRegionX() * 8)) - 3);
  1053. c.getOutStream().createFrame(117);
  1054. c.getOutStream().writeByte(angle);
  1055. c.getOutStream().writeByte(offY);
  1056. c.getOutStream().writeByte(offX);
  1057. c.getOutStream().writeWord(lockon);
  1058. c.getOutStream().writeWord(gfxMoving);
  1059. c.getOutStream().writeByte(startHeight);
  1060. c.getOutStream().writeByte(endHeight);
  1061. c.getOutStream().writeWord(time);
  1062. c.getOutStream().writeWord(speed);
  1063. c.getOutStream().writeByte(slope);
  1064. c.getOutStream().writeByte(64);
  1065. c.flushOutStream();
  1066. }
  1067.  
  1068. }
  1069.  
  1070. public void createProjectile3(int casterY, int casterX, int offsetY, int offsetX, int gfxMoving, int StartHeight,
  1071. int endHeight, int speed, int AtkIndex) {
  1072. for (int i = 1; i < Config.MAX_PLAYERS; i++) {
  1073. if (PlayerHandler.players[i] != null) {
  1074. Player p = PlayerHandler.players[i];
  1075. if (p.WithinDistance(c.absX, c.absY, p.absX, p.absY, 60)) {
  1076. if (p.heightLevel == c.heightLevel) {
  1077. if (PlayerHandler.players[i] != null && !PlayerHandler.players[i].disconnected) {
  1078. p.outStream.createFrame(85);
  1079. p.outStream.writeByteC((casterY - (p.mapRegionY * 8)) - 2);
  1080. p.outStream.writeByteC((casterX - (p.mapRegionX * 8)) - 3);
  1081. p.outStream.createFrame(117);
  1082. p.outStream.writeByte(50);
  1083. p.outStream.writeByte(offsetY);
  1084. p.outStream.writeByte(offsetX);
  1085. p.outStream.writeWord(AtkIndex);
  1086. p.outStream.writeWord(gfxMoving);
  1087. p.outStream.writeByte(StartHeight);
  1088. p.outStream.writeByte(endHeight);
  1089. p.outStream.writeWord(51);
  1090. p.outStream.writeWord(speed);
  1091. p.outStream.writeByte(16);
  1092. p.outStream.writeByte(64);
  1093. }
  1094. }
  1095. }
  1096. }
  1097. }
  1098. }
  1099.  
  1100. public void createPlayersProjectile(int x, int y, int offX, int offY, int angle, int speed, int gfxMoving,
  1101. int startHeight, int endHeight, int lockon, int time, int delay) {
  1102. if (delay <= 0) {
  1103. createPlayersProjectile(x, y, offX, offY, angle, speed, gfxMoving, startHeight, endHeight, lockon, time);
  1104. } else {
  1105. Server.getEventHandler().submit(new DelayEvent(delay) {
  1106. @Override
  1107. public void onExecute() {
  1108. createPlayersProjectile(x, y, offX, offY, angle, speed, gfxMoving, startHeight, endHeight, lockon,
  1109. time);
  1110. }
  1111. });
  1112. }
  1113. }
  1114. public void mysteryBoxItemOnInterface(int item, int amount , int frame, int slot) {
  1115. if (c.getOutStream() != null && c != null) {
  1116. c.getOutStream().createFrameVarSizeWord(34);
  1117. c.getOutStream().writeWord(frame);
  1118. c.getOutStream().writeByte(slot);
  1119. c.getOutStream().writeWord(item + 1);
  1120. c.getOutStream().writeByte(255);
  1121. c.getOutStream().writeDWord(amount);
  1122. c.getOutStream().endFrameVarSizeWord();
  1123. }
  1124. }
  1125.  
  1126. public void createPlayersProjectile(int x, int y, int offX, int offY, int angle, int speed, int gfxMoving,
  1127. int startHeight, int endHeight, int lockon, int time) {
  1128. for (int i = 0; i < Config.MAX_PLAYERS; i++) {
  1129. Player p = PlayerHandler.players[i];
  1130. if (p != null) {
  1131. if (p.getOutStream() != null) {
  1132. if (p.distanceToPoint(x, y) <= 25) {
  1133. if (p.heightLevel == c.heightLevel)
  1134. p.getPA().createProjectile(x, y, offX, offY, angle, speed, gfxMoving, startHeight,
  1135. endHeight, lockon, time);
  1136. }
  1137. }
  1138. }
  1139. }
  1140. }
  1141.  
  1142. public void createPlayersProjectile2(int x, int y, int offX, int offY, int angle, int speed, int gfxMoving,
  1143. int startHeight, int endHeight, int lockon, int time, int slope) {
  1144. // synchronized(c) {
  1145. for (int i = 0; i < Config.MAX_PLAYERS; i++) {
  1146. Player p = PlayerHandler.players[i];
  1147. if (p != null) {
  1148. if (p.getOutStream() != null) {
  1149. if (p.distanceToPoint(x, y) <= 25 && c.heightLevel == p.heightLevel) {
  1150. p.getPA().createProjectile2(x, y, offX, offY, angle, speed, gfxMoving, startHeight, endHeight,
  1151. lockon, time, slope);
  1152. }
  1153. }
  1154. }
  1155.  
  1156. }
  1157. }
  1158.  
  1159. /**
  1160. ** GFX
  1161. **/
  1162. public void stillGfx(int id, int x, int y, int height, int time) {
  1163. // synchronized(c) {
  1164. if (c.getOutStream() != null && c != null) {
  1165. c.getOutStream().createFrame(85);
  1166. c.getOutStream().writeByteC(y - (c.getMapRegionY() * 8));
  1167. c.getOutStream().writeByteC(x - (c.getMapRegionX() * 8));
  1168. c.getOutStream().createFrame(4);
  1169. c.getOutStream().writeByte(0);
  1170. c.getOutStream().writeWord(id);
  1171. c.getOutStream().writeByte(height);
  1172. c.getOutStream().writeWord(time);
  1173. c.flushOutStream();
  1174. }
  1175.  
  1176. }
  1177.  
  1178. public void useChargeSkills() {
  1179. int[][] skillsNeck = { { 11968, 11970, 5 }, { 11970, 11105, 4 }, { 11105, 11107, 3 }, { 11107, 11109, 2 },
  1180. { 11109, 11111, 1 }, { 11111, 11113, 0 } };
  1181. for (int[] aSkillsNeck : skillsNeck) {
  1182. if (c.itemUsing == aSkillsNeck[0]) {
  1183. if (c.isOperate) {
  1184. c.getItems().deleteItem(aSkillsNeck[0], 1);
  1185. c.getItems().addItem(aSkillsNeck[1], 1);
  1186. }
  1187. if (aSkillsNeck[2] > 1) {
  1188. c.sendMessage("Your amulet has " + aSkillsNeck[2] + " charges left.");
  1189. } else {
  1190. c.sendMessage("Your amulet has " + aSkillsNeck[2] + " charge left.");
  1191. }
  1192. }
  1193. }
  1194. // c.getItems().updateSlot(c.playerAmulet);
  1195. c.isOperate = false;
  1196. c.itemUsing = -1;
  1197. }
  1198.  
  1199. public void stillGfx(int id, int x, int y, int height, int time, byte face) {
  1200. // synchronized(c) {
  1201. if (c.getOutStream() != null && c != null) {
  1202. c.getOutStream().createFrame(85);
  1203. c.getOutStream().writeByteC(y - (c.getMapRegionY() * 8));
  1204. c.getOutStream().writeByteC(x - (c.getMapRegionX() * 8));
  1205. c.getOutStream().createFrame(4);
  1206. c.getOutStream().writeByte(face);
  1207. c.getOutStream().writeWord(id);
  1208. c.getOutStream().writeByte(height);
  1209. c.getOutStream().writeWord(time);
  1210. c.flushOutStream();
  1211. }
  1212.  
  1213. }
  1214.  
  1215. // creates gfx for everyone
  1216. public void createPlayersStillGfx(int id, int x, int y, int height, int time) {
  1217. for (int i = 0; i < Config.MAX_PLAYERS; i++) {
  1218. Player p = PlayerHandler.players[i];
  1219. if (p != null) {
  1220. if (p.getOutStream() != null) {
  1221. if (p.distanceToPoint(x, y) <= 25) {
  1222. p.getPA().stillGfx(id, x, y, height, time);
  1223. }
  1224. }
  1225. }
  1226. }
  1227. }
  1228.  
  1229. /**
  1230. * Objects, add and remove
  1231. **/
  1232. public void object(int objectId, int objectX, int objectY, int face, int objectType) {
  1233. Region.addWorldObject(objectId, objectX, objectY, c.heightLevel, face);
  1234. // synchronized(c) {
  1235. if (c.getOutStream() != null && c != null) {
  1236. c.getOutStream().createFrame(85);
  1237. c.getOutStream().writeByteC(objectY - (c.getMapRegionY() * 8));
  1238. c.getOutStream().writeByteC(objectX - (c.getMapRegionX() * 8));
  1239. c.getOutStream().createFrame(101);
  1240. c.getOutStream().writeByteC((objectType << 2) + (face & 3));
  1241. c.getOutStream().writeByte(0);
  1242.  
  1243. if (objectId != -1) { // removing
  1244. c.getOutStream().createFrame(151);
  1245. c.getOutStream().writeByteS(0);
  1246. c.getOutStream().writeWordBigEndian(objectId);
  1247. c.getOutStream().writeByteS((objectType << 2) + (face & 3));
  1248. }
  1249. c.flushOutStream();
  1250. }
  1251.  
  1252. }
  1253.  
  1254. public void checkObjectSpawn(int objectId, int objectX, int objectY, int face, int objectType) {
  1255. Region.addWorldObject(objectId, objectX, objectY, c.heightLevel, face); // height
  1256. // level
  1257. // should
  1258. // be
  1259. // a
  1260. // param
  1261. // :s
  1262. if (c.distanceToPoint(objectX, objectY) > 60)
  1263. return;
  1264. // synchronized(c) {
  1265. if (c.getOutStream() != null && c != null) {
  1266. c.getOutStream().createFrame(85);
  1267. c.getOutStream().writeByteC(objectY - (c.getMapRegionY() * 8));
  1268. c.getOutStream().writeByteC(objectX - (c.getMapRegionX() * 8));
  1269. c.getOutStream().createFrame(101);
  1270. c.getOutStream().writeByteC((objectType << 2) + (face & 3));
  1271. c.getOutStream().writeByte(0);
  1272.  
  1273. if (objectId != -1) { // removing
  1274. c.getOutStream().createFrame(151);
  1275. c.getOutStream().writeByteS(0);
  1276. c.getOutStream().writeWordBigEndian(objectId);
  1277. c.getOutStream().writeByteS((objectType << 2) + (face & 3));
  1278. }
  1279. c.flushOutStream();
  1280. }
  1281.  
  1282. }
  1283.  
  1284. /**
  1285. * Show option, attack, trade, follow etc
  1286. **/
  1287. private String optionType = "null";
  1288.  
  1289. public void showOption(int i, int l, String s, int a) {
  1290. // synchronized(c) {
  1291. if (c.getOutStream() != null && c != null) {
  1292. if (!optionType.equalsIgnoreCase(s)) {
  1293. optionType = s;
  1294. c.getOutStream().createFrameVarSize(104);
  1295. c.getOutStream().writeByteC(i);
  1296. c.getOutStream().writeByteA(l);
  1297. c.getOutStream().writeString(s);
  1298. c.getOutStream().endFrameVarSize();
  1299. c.flushOutStream();
  1300. }
  1301.  
  1302. }
  1303. }
  1304.  
  1305. /**
  1306. * Open bank
  1307. **/
  1308. public void sendFrame34a(int frame, int item, int slot, int amount) {
  1309. c.outStream.createFrameVarSizeWord(34);
  1310. c.outStream.writeWord(frame);
  1311. c.outStream.writeByte(slot);
  1312. c.outStream.writeWord(item + 1);
  1313. c.outStream.writeByte(255);
  1314. c.outStream.writeDWord(amount);
  1315. c.outStream.endFrameVarSizeWord();
  1316. }
  1317.  
  1318. public void openUpBank() {
  1319. if (c.getTutorial().isActive()) {
  1320. c.getTutorial().refresh();
  1321. return;
  1322. }
  1323. c.getPA().sendChangeSprite(58014, c.placeHolders ? (byte) 1 : (byte) 0);
  1324. if (c.viewingLootBag || c.addingItemsToLootBag || c.viewingRunePouch) {
  1325. c.sendMessage("You should stop what you are doing before opening the bank.");
  1326. return;
  1327. }
  1328. resetVariables();
  1329. if (c.getBankPin().isLocked() && c.getBankPin().getPin().trim().length() > 0) {
  1330. c.getBankPin().open(2);
  1331. c.isBanking = false;
  1332. c.inSafeBox = false;
  1333. return;
  1334. }
  1335. if (c.takeAsNote)
  1336. sendFrame36(116, 1);
  1337. else
  1338. sendFrame36(116, 0);
  1339.  
  1340. if (c.inWild() && !(c.getRights().isOrInherits(Right.ADMINISTRATOR))) {
  1341. c.sendMessage("You can't bank in the wilderness!");
  1342. return;
  1343. }
  1344. if (!c.getMode().isBankingPermitted()) {
  1345. c.sendMessage("Your game mode prohibits use of the banking system.");
  1346. return;
  1347. }
  1348. if (Server.getMultiplayerSessionListener().inSession(c, MultiplayerSessionType.TRADE)) {
  1349. Server.getMultiplayerSessionListener().finish(c, MultiplayerSessionFinalizeType.WITHDRAW_ITEMS);
  1350. return;
  1351. }
  1352. DuelSession duelSession = (DuelSession) Server.getMultiplayerSessionListener().getMultiplayerSession(c,
  1353. MultiplayerSessionType.DUEL);
  1354. if (Objects.nonNull(duelSession) && duelSession.getStage().getStage() > MultiplayerSessionStage.REQUEST) {
  1355. if (duelSession.getStage().getStage() < MultiplayerSessionStage.FURTHER_INTERATION) {
  1356. duelSession.finish(MultiplayerSessionFinalizeType.WITHDRAW_ITEMS);
  1357. } else {
  1358. c.sendMessage("You cannot bank whilst dueling.");
  1359. return;
  1360. }
  1361. }
  1362. if (c.getBank().getBankSearch().isSearching()) {
  1363. c.getBank().getBankSearch().reset();
  1364. }
  1365. c.getPA().sendFrame126("Search", 58063);
  1366. if (c.getOutStream() != null && c != null) {
  1367. c.isBanking = true;
  1368. c.getItems().resetItems(5064);
  1369. c.getItems().resetBank();
  1370. c.getItems().resetTempItems();
  1371. c.getOutStream().createFrame(248);
  1372. c.getOutStream().writeWordA(5292);// ok perfect
  1373. c.getOutStream().writeWord(5063);
  1374. c.flushOutStream();
  1375. }
  1376. }
  1377.  
  1378. public boolean viewingOtherBank;
  1379. private final BankTab[] backupTabs = new BankTab[9];
  1380.  
  1381. public void resetOtherBank() {
  1382. for (int i = 0; i < backupTabs.length; i++)
  1383. c.getBank().setBankTab(i, backupTabs[i]);
  1384. viewingOtherBank = false;
  1385. removeAllWindows();
  1386. c.isBanking = false;
  1387. c.inSafeBox = false;
  1388. c.getBank().setCurrentBankTab(c.getBank().getBankTab()[0]);
  1389. c.getItems().resetBank();
  1390. c.sendMessage("You are no longer viewing another players bank.");
  1391. }
  1392.  
  1393. public void openOtherBank(Player otherPlayer) {
  1394. if (otherPlayer == null)
  1395. return;
  1396.  
  1397. if (c.getPA().viewingOtherBank) {
  1398. c.getPA().resetOtherBank();
  1399. return;
  1400. }
  1401. if (otherPlayer.getPA().viewingOtherBank) {
  1402. c.sendMessage("That player is viewing another players bank, please wait.");
  1403. return;
  1404. }
  1405. for (int i = 0; i < backupTabs.length; i++)
  1406. backupTabs[i] = c.getBank().getBankTab(i);
  1407. for (int i = 0; i < otherPlayer.getBank().getBankTab().length; i++)
  1408. c.getBank().setBankTab(i, otherPlayer.getBank().getBankTab(i));
  1409. c.getBank().setCurrentBankTab(c.getBank().getBankTab(0));
  1410. viewingOtherBank = true;
  1411. openUpBank();
  1412. }
  1413.  
  1414. public void potionPoisonHeal(int itemId, int itemSlot, int newItemId, int healType) {
  1415.  
  1416. DuelSession session = (DuelSession) Server.getMultiplayerSessionListener().getMultiplayerSession(c,
  1417. MultiplayerSessionType.DUEL);
  1418. if (!Objects.isNull(session)) {
  1419. if (session.getRules().contains(Rule.NO_DRINKS)) {
  1420. c.sendMessage("Drinks have been disabled for this duel.");
  1421. return;
  1422. }
  1423. }
  1424. if (!c.isDead && System.currentTimeMillis() - c.foodDelay > 2000) {
  1425. if (c.getItems().playerHasItem(itemId, 1, itemSlot)) {
  1426. c.sendMessage("You drink the " + ItemAssistant.getItemName(itemId).toLowerCase() + ".");
  1427. c.foodDelay = System.currentTimeMillis();
  1428. // Actions
  1429. if (healType == 1) {
  1430. // Cures The Poison
  1431. } else if (healType == 2) {
  1432. // Cures The Poison + protects from getting poison again
  1433. }
  1434. c.startAnimation(0x33D);
  1435. c.getItems().deleteItem(itemId, itemSlot, 1);
  1436. c.getItems().addItem(newItemId, 1);
  1437. requestUpdates();
  1438. }
  1439. }
  1440. }
  1441.  
  1442. /*
  1443. * Vengeance
  1444. */
  1445.  
  1446. public void castVengeance() {
  1447. c.usingMagic = true;
  1448. if (c.playerLevel[1] < 40) {
  1449. c.sendMessage("You need a defence level of 40 to cast this spell.");
  1450. return;
  1451. }
  1452. if (System.currentTimeMillis() - c.lastCast < 30000) {
  1453. c.sendMessage("You can only cast vengeance every 30 seconds.");
  1454. return;
  1455. }
  1456. if (c.vengOn) {
  1457. c.sendMessage("You already have vengeance casted.");
  1458. return;
  1459. }
  1460. DuelSession session = (DuelSession) Server.getMultiplayerSessionListener().getMultiplayerSession(c,
  1461. MultiplayerSessionType.DUEL);
  1462. if (!Objects.isNull(session)) {
  1463. if (session.getRules().contains(Rule.NO_MAGE)) {
  1464. c.sendMessage("You can't cast this spell because magic has been disabled.");
  1465. return;
  1466. }
  1467. }
  1468. if (!c.getCombat().checkMagicReqs(55)) {
  1469. return;
  1470. }
  1471. c.getPA().sendGameTimer(ClientGameTimer.VENGEANCE, TimeUnit.SECONDS, 30);
  1472. c.startAnimation(4410);
  1473. c.gfx100(726);
  1474. addSkillXP(c.getMode().isOsrs() ? 112 : 10000, 6, true);
  1475. refreshSkill(6);
  1476. c.vengOn = true;
  1477. c.usingMagic = false;
  1478. c.lastCast = System.currentTimeMillis();
  1479. }
  1480.  
  1481. /**
  1482. * Magic on items
  1483. **/
  1484. public void alchemy(int itemId, String alch) {
  1485.  
  1486. if (c.inClanWars() || c.inClanWarsSafe()) {
  1487. c.sendMessage("@cr10@There is no need to do this here.");
  1488. return;
  1489. }
  1490.  
  1491. switch (alch) {
  1492. case "low":
  1493. if (System.currentTimeMillis() - c.alchDelay > 1000) {
  1494. for (int[] items : EquipmentSet.IRON_MAN_ARMOUR.getEquipment()) {
  1495. if (Misc.linearSearch(items, itemId) > -1) {
  1496. c.sendMessage("You cannot alch iron man amour.");
  1497. return;
  1498. }
  1499. }
  1500. for (int[] items : EquipmentSet.ULTIMATE_IRON_MAN_ARMOUR.getEquipment()) {
  1501. if (Misc.linearSearch(items, itemId) > -1) {
  1502. c.sendMessage("You cannot alch ultimate iron man amour.");
  1503. return;
  1504. }
  1505. }
  1506. if (itemId == LootingBag.LOOTING_BAG || itemId == RunePouch.RUNE_POUCH_ID) {
  1507. c.sendMessage("This kind of sorcery cannot happen.");
  1508. return;
  1509. }
  1510. if (!c.getCombat().checkMagicReqs(49)) {
  1511. return;
  1512. }
  1513. if (!c.getItems().playerHasItem(itemId, 1) || itemId == 995) {
  1514. return;
  1515. }
  1516. if (Boundary.isIn(c, Boundary.FOUNTAIN_OF_RUNE_BOUNDARY)) {
  1517. c.getDiaryManager().getWildernessDiary().progress(WildernessDiaryEntry.LOW_ALCH);
  1518. }
  1519. c.getItems().deleteItem(itemId, 1);
  1520. c.getItems().addItem(995, ShopAssistant.getItemShopValue(itemId) / 3);
  1521. c.startAnimation(MagicData.MAGIC_SPELLS[49][2]);
  1522. c.gfx100(MagicData.MAGIC_SPELLS[49][3]);
  1523. c.alchDelay = System.currentTimeMillis();
  1524. sendFrame106(6);
  1525. addSkillXP(MagicData.MAGIC_SPELLS[49][7] * (c.getMode().getType().equals(ModeType.OSRS) ? 1 : 125), 6,
  1526. true);
  1527. refreshSkill(6);
  1528. }
  1529. break;
  1530.  
  1531. case "high":
  1532. if (System.currentTimeMillis() - c.alchDelay > 2000) {
  1533. for (int[] items : EquipmentSet.IRON_MAN_ARMOUR.getEquipment()) {
  1534. if (Misc.linearSearch(items, itemId) > -1) {
  1535. c.sendMessage("You cannot alch iron man amour.");
  1536. break;
  1537. }
  1538. }
  1539. for (int[] items : EquipmentSet.ULTIMATE_IRON_MAN_ARMOUR.getEquipment()) {
  1540. if (Misc.linearSearch(items, itemId) > -1) {
  1541. c.sendMessage("You cannot alch ultimate iron man amour.");
  1542. break;
  1543. }
  1544. }
  1545. if (itemId == LootingBag.LOOTING_BAG || itemId == RunePouch.RUNE_POUCH_ID) {
  1546. c.sendMessage("This kind of sorcery cannot happen.");
  1547. break;
  1548. }
  1549. if (!c.getCombat().checkMagicReqs(50)) {
  1550. break;
  1551. }
  1552. if (!c.getItems().playerHasItem(itemId, 1) || itemId == 995) {
  1553. break;
  1554. }
  1555. c.getItems().deleteItem(itemId, 1);
  1556. c.getItems().addItem(995, (int) (ShopAssistant.getItemShopValue(itemId) * .75));
  1557. c.startAnimation(MagicData.MAGIC_SPELLS[50][2]);
  1558. c.gfx100(MagicData.MAGIC_SPELLS[50][3]);
  1559. c.alchDelay = System.currentTimeMillis();
  1560. c.droppedItem = -1;
  1561. c.droppingItem = false;
  1562. sendFrame106(6);
  1563. addSkillXP(MagicData.MAGIC_SPELLS[50][7] * (c.getMode().getType().equals(ModeType.OSRS) ? 1 : 125), 6,
  1564. true);
  1565. refreshSkill(6);
  1566. }
  1567. break;
  1568. }
  1569. }
  1570.  
  1571. public void magicOnItems(int slot, int itemId, int spellId) {
  1572.  
  1573. NonCombatSpells.attemptDate(c, spellId);
  1574.  
  1575. switch (spellId) {
  1576.  
  1577. case 1173:
  1578. NonCombatSpells.superHeatItem(c, itemId);
  1579. break;
  1580.  
  1581. case 1162: // low alch
  1582. alchemy(itemId, "low");
  1583. break;
  1584.  
  1585. case 1178: // high alch
  1586. c.droppedItem = itemId;
  1587. c.droppingItem = false;
  1588. if (c.showDropWarning()) {
  1589. c.getPA().destroyInterface("alch");
  1590. return;
  1591. }
  1592. alchemy(itemId, "high");
  1593. break;
  1594.  
  1595. case 1155: // Lvl-1 enchant sapphire
  1596. case 1165: // Lvl-2 enchant emerald
  1597. case 1176: // Lvl-3 enchant ruby
  1598. case 1180: // Lvl-4 enchant diamond
  1599. case 1187: // Lvl-5 enchant dragonstone
  1600. case 6003: // Lvl-6 enchant onyx
  1601. Enchantment.getSingleton().enchantItem(c, itemId, spellId);
  1602. enchantBolt(spellId, itemId, 28);
  1603. break;
  1604. }
  1605. }
  1606.  
  1607. private final int[][] boltData = { { 1155, 879, 9, 9236 }, { 1155, 9337, 17, 9240 }, { 1165, 9335, 19, 9237 },
  1608. { 1165, 880, 29, 9238 }, { 1165, 9338, 37, 9241 }, { 1176, 9336, 39, 9239 }, { 1176, 9339, 59, 9242 },
  1609. { 1180, 9340, 67, 9243 }, { 1187, 9341, 78, 9244 }, { 6003, 9342, 97, 9245 } };
  1610.  
  1611. public int[][] runeData = { { 1155, 555, 1, -1, -1 }, { 1165, 556, 3, -1, -1 }, { 1176, 554, 5, -1, -1 },
  1612. { 1180, 557, 10, -1, -1 }, { 1187, 555, 15, 557, 15 }, { 6003, 554, 20, 557, 20 } };
  1613.  
  1614. private void enchantBolt(int spell, int bolt, int amount) {
  1615.  
  1616. for (int[] aBoltData : boltData) {
  1617. if (spell == aBoltData[0]) {
  1618. if (bolt == aBoltData[1]) {
  1619. switch (spell) {
  1620. case 1155:
  1621. if (!c.getCombat().checkMagicReqs(56)) {
  1622. return;
  1623. }
  1624. break;
  1625. case 1165:
  1626. if (!c.getCombat().checkMagicReqs(57)) {
  1627. return;
  1628. }
  1629. break;
  1630. case 1176:
  1631. if (!c.getCombat().checkMagicReqs(58)) {
  1632. return;
  1633. }
  1634. break;
  1635. case 1180:
  1636. if (!c.getCombat().checkMagicReqs(59)) {
  1637. return;
  1638. }
  1639. break;
  1640. case 1187:
  1641. if (!c.getCombat().checkMagicReqs(60)) {
  1642. return;
  1643. }
  1644. break;
  1645. case 6003:
  1646. if (!c.getCombat().checkMagicReqs(61)) {
  1647. return;
  1648. }
  1649. break;
  1650. }
  1651. if (!c.getItems().playerHasItem(aBoltData[1], amount))
  1652. amount = c.getItems().getItemAmount(bolt);
  1653. c.getItems().deleteItem(aBoltData[1], c.getItems().getItemSlot(aBoltData[1]), amount);
  1654. c.getPA().addSkillXP(aBoltData[2] * amount, 6, true);
  1655. c.getItems().addItem(aBoltData[3], amount);
  1656. c.getPA().sendFrame106(6);
  1657. return;
  1658. }
  1659. }
  1660. }
  1661. }
  1662.  
  1663. public void yell(String msg) {
  1664. for (int j = 0; j < PlayerHandler.players.length; j++) {
  1665. if (PlayerHandler.players[j] != null) {
  1666. Player c2 = PlayerHandler.players[j];
  1667. c2.sendMessage(msg);
  1668. }
  1669. }
  1670. }
  1671.  
  1672. public void applyDead() {
  1673. c.getPA().sendFrame126(":quicks:off", -1);
  1674. c.isFullHelm = Item.isFullHat(c.playerEquipment[c.playerHat]);
  1675. c.isFullMask = Item.isFullMask(c.playerEquipment[c.playerHat]);
  1676. c.isFullBody = Item.isFullBody(c.playerEquipment[c.playerChest]);
  1677. c.getPA().requestUpdates();
  1678. c.respawnTimer = 15;
  1679. c.isDead = false;
  1680. c.graceSum = 0;
  1681. c.freezeTimer = 1;
  1682. c.recoilHits = 0;
  1683. DuelSession duelSession = (DuelSession) Server.getMultiplayerSessionListener().getMultiplayerSession(c,
  1684. MultiplayerSessionType.DUEL);
  1685. if (Objects.nonNull(duelSession)
  1686. && duelSession.getStage().getStage() < MultiplayerSessionStage.FURTHER_INTERATION) {
  1687. duelSession = null;
  1688. }
  1689. if (c.inClanWars() || c.inClanWarsSafe()) {
  1690. resetDeath();
  1691. }
  1692. if (c.getSlayer().superiorSpawned) {
  1693. c.getSlayer().superiorSpawned = false;
  1694. }
  1695. if (Objects.isNull(duelSession)) {
  1696. Entity killer = c.calculateKiller();
  1697. if (killer != null) {
  1698. c.setKiller(killer);
  1699. if (killer instanceof Player) {
  1700. Player playerKiller = (Player) killer;
  1701. c.killerId = killer.getIndex();
  1702. if (c.killerId != c.getIndex()) {
  1703. if (c.inWild()) {
  1704. if (HolidayController.HALLOWEEN.isActive()) {
  1705. CycleEventHandler.getSingleton().addEvent(c,
  1706. new HalloweenDeathCycleEvent(c, playerKiller), 6);
  1707. }
  1708. if (!Boundary.isIn(c, Boundary.SAFEPK)) {
  1709. if (c.getItems().playerHasItem(11941)) {
  1710. c.getLootingBag().onDeath(c, "PVP");
  1711. }
  1712. if (c.getItems().playerHasItem(12791)) {
  1713. c.getRunePouch().onDeath(c, "PVP");
  1714. }
  1715. if (c.getItems().playerHasItem(13226)) {
  1716. c.getHerbSack().onDeath(c, "PVP");
  1717. }
  1718. if (c.getItems().playerHasItem(12020)) {
  1719. c.getGemBag().onDeath(c, "PVP");
  1720. }
  1721. }
  1722. if (playerKiller.inClanWars()) {
  1723. playerKiller.getItems()
  1724. .addSpecialBar(playerKiller.playerEquipment[playerKiller.playerWeapon]);
  1725. playerKiller.specAmount = 10;
  1726. }
  1727. if (!playerKiller.getPlayerKills().killedRecently(c.connectedFrom)
  1728. && !playerKiller.getMacAddress().equals(c.getMacAddress())) {
  1729. playerKiller.getPlayerKills().add(c.connectedFrom);
  1730. c.deathcount++;
  1731. playerKiller.killcount++;
  1732. playerKiller.refreshQuestTab(0);
  1733. playerKiller.refreshQuestTab(7);
  1734. playerKiller.getPA().sendFrame126("@or1@Hunter KS: @gre@"
  1735. + playerKiller.getKillstreak().getAmount(Killstreak.Type.HUNTER) + "@or1@, "
  1736. + "Rogue KS: @gre@"
  1737. + playerKiller.getKillstreak().getAmount(Killstreak.Type.ROGUE), 29165);
  1738.  
  1739. /*
  1740. * Killing targets
  1741. */
  1742. if (Config.BOUNTY_HUNTER_ACTIVE) {
  1743. c.getBH().dropPlayerEmblem(playerKiller);
  1744. if (c.getBH().hasTarget()
  1745. && c.getBH().getTarget().getName().equalsIgnoreCase(playerKiller.playerName)
  1746. && playerKiller.getBH().hasTarget() && playerKiller.getBH().getTarget()
  1747. .getName().equalsIgnoreCase(c.playerName)) {
  1748. playerKiller.getBH().setCurrentHunterKills(
  1749. playerKiller.getBH().getCurrentHunterKills() + 1);
  1750. if (playerKiller.getBH().getCurrentHunterKills() > playerKiller.getBH()
  1751. .getRecordHunterKills()) {
  1752. playerKiller.getBH()
  1753. .setRecordHunterKills(playerKiller.getBH().getCurrentHunterKills());
  1754. }
  1755. playerKiller.getKillstreak().increase(Killstreak.Type.HUNTER);
  1756. playerKiller.getBH().upgradePlayerEmblem();
  1757. playerKiller.getBH()
  1758. .setTotalHunterKills(playerKiller.getBH().getTotalHunterKills() + 1);
  1759. playerKiller.getBH().removeTarget();
  1760. c.getBH().removeTarget();
  1761. playerKiller.getBH().setTargetState(TargetState.RECENT_TARGET_KILL);
  1762. playerKiller.sendMessage(
  1763. "<col=255>You have killed your target: " + c.playerName + ".");
  1764. } else {
  1765. playerKiller.getKillstreak().increase(Killstreak.Type.ROGUE);
  1766. playerKiller.getBH()
  1767. .setCurrentRogueKills(playerKiller.getBH().getCurrentRogueKills() + 1);
  1768. playerKiller.getBH()
  1769. .setTotalRogueKills(playerKiller.getBH().getTotalRogueKills() + 1);
  1770. if (playerKiller.getBH().getCurrentRogueKills() > playerKiller.getBH()
  1771. .getRecordRogueKills()) {
  1772. playerKiller.getBH()
  1773. .setRecordRogueKills(playerKiller.getBH().getCurrentRogueKills());
  1774. }
  1775. }
  1776. playerKiller.getBH().updateStatisticsUI();
  1777. playerKiller.getBH().updateTargetUI();
  1778. }
  1779.  
  1780. int opponentKillstreak = c.getKillstreak().getAmount(Killstreak.Type.HUNTER);
  1781.  
  1782. if (Boundary.isIn(c, Boundary.SAFEPK)) {
  1783. if (opponentKillstreak > 1) {
  1784. // playerKiller.sendMessage("You receive an additional 5 PK tickets, your
  1785. // opponent had a killstreak of " + opponentKillstreak + ".");
  1786. // PlayerHandler.executeGlobalMessage("<col=CC0000>" +
  1787. // WordUtils.capitalize(playerKiller.playerName) + "</col><col=255>" + " has
  1788. // ended </col><col=CC0000>" + WordUtils.capitalize(c.playerName) +
  1789. // "</col><col=255>'s" + " hunter killstreak of " + opponentKillstreak + ".");
  1790. playerKiller.getItems().addItemUnderAnyCircumstance(2996,
  1791. Config.DOUBLE_PKP ? 10 : 5);
  1792. }
  1793. if (playerKiller.inClanWars()) {
  1794. if (!playerKiller.getItems().addItem(13307, 5)) {
  1795. Server.itemHandler.createGroundItem(playerKiller, 13307,
  1796. playerKiller.getX(), playerKiller.getY(), playerKiller.heightLevel,
  1797. 5);
  1798. }
  1799. } else {
  1800. playerKiller.pkp += Config.BONUS_WEEKEND && !Config.DOUBLE_PKP ? 6
  1801. : Config.DOUBLE_PKP ? 8 : 4;
  1802. playerKiller.refreshQuestTab(0);
  1803. }
  1804. } else {
  1805. if (opponentKillstreak > 1) {
  1806. // playerKiller.sendMessage("You receive an additional 5 PK tickets, your
  1807. // opponent had a killstreak of " + opponentKillstreak + ".");
  1808. // PlayerHandler.executeGlobalMessage("<col=CC0000>" +
  1809. // WordUtils.capitalize(playerKiller.playerName) + "</col><col=255>" + " has
  1810. // ended </col><col=CC0000>" + WordUtils.capitalize(c.playerName) +
  1811. // "</col><col=255>'s" + " hunter killstreak of " + opponentKillstreak + ".");
  1812. playerKiller.getItems().addItemUnderAnyCircumstance(2996,
  1813. Config.DOUBLE_PKP ? 10 : 5);
  1814. }
  1815. if (playerKiller.inClanWars()) {
  1816. if (!playerKiller.getItems().addItem(13307, 5)) {
  1817. Server.itemHandler.createGroundItem(playerKiller, 13307,
  1818. playerKiller.getX(), playerKiller.getY(), playerKiller.heightLevel,
  1819. 5);
  1820. }
  1821. } else {
  1822. playerKiller.pkp += Config.BONUS_WEEKEND && !Config.DOUBLE_PKP ? 6
  1823. : Config.DOUBLE_PKP ? 8 : 4;
  1824. RightGroup rights = c.getRights();
  1825. playerKiller.refreshQuestTab(0);
  1826. }
  1827. RightGroup rights = playerKiller.getRights();
  1828. int bonuspkp = 0;
  1829. bonuspkp+= rights.contains(Right.LEGENDARY) ? 4 : 0 ;
  1830. bonuspkp+= rights.contains(Right.EXTREME_DONATOR) ? 3 : 0 ;
  1831. bonuspkp+= rights.contains(Right.SUPER_DONATOR) ? 2 : 0 ;
  1832. bonuspkp+= rights.contains(Right.DONATOR) ? 1 : 0 ;
  1833.  
  1834. playerKiller.pkp+=bonuspkp;
  1835. if(bonuspkp > 0) {
  1836. playerKiller.sendMessage("@red@@cr22@You receive " + bonuspkp + " because of your donator rank!");
  1837. }
  1838. }
  1839. c.getKillstreak().resetAll();
  1840. c.getPA().loadQuests();
  1841. playerKiller.updateQuestTab();
  1842. playerKiller.getPA().loadQuests();
  1843. } else {
  1844. if (playerKiller.inClanWars() || playerKiller.inClanWarsSafe()) {
  1845. playerKiller.sendMessage(
  1846. "You do not get any blood money as you have recently defeated @blu@"
  1847. + Misc.optimizeText(c.playerName) + "@bla@.");
  1848. } else {
  1849. playerKiller.sendMessage(
  1850. "You do not get any PK Points as you have recently defeated @blu@"
  1851. + Misc.optimizeText(c.playerName) + "@bla@.");
  1852. }
  1853. }
  1854. }
  1855. PlayerSave.saveGame(playerKiller);
  1856. }
  1857. } else if (killer instanceof NPC) {
  1858. if (!Boundary.isIn(c, Boundary.FIGHT_CAVE) && !Boundary.isIn(c, Zulrah.BOUNDARY)
  1859. && !Boundary.isIn(c, Boundary.KRAKEN_CAVE) && !Boundary.isIn(c, Boundary.RFD)
  1860. && !Boundary.isIn(c, Boundary.LIGHTHOUSE) && !Boundary.isIn(c, Boundary.CERBERUS_BOSSROOMS)
  1861. && !Boundary.isIn(c, Boundary.SKOTIZO_BOSSROOM)) {
  1862. if (c.getItems().playerHasItem(11941)) {
  1863. c.getLootingBag().onDeath(c, "MOB");
  1864. }
  1865. if (c.getItems().playerHasItem(12791)) {
  1866. c.getRunePouch().onDeath(c, "MOB");
  1867. }
  1868. if (c.getItems().playerHasItem(13226)) {
  1869. c.getHerbSack().onDeath(c, "MOB");
  1870. }
  1871. if (c.getItems().playerHasItem(12020)) {
  1872. c.getGemBag().onDeath(c, "MOB");
  1873. }
  1874. }
  1875. }
  1876. c.sendMessage("Oh dear you are dead!");
  1877. }
  1878. }
  1879.  
  1880. /*
  1881. * Reset bounty hunter statistics
  1882. */
  1883. if (Config.BOUNTY_HUNTER_ACTIVE) {
  1884. c.getBH().setCurrentHunterKills(0);
  1885. c.getBH().setCurrentRogueKills(0);
  1886. c.getBH().updateStatisticsUI();
  1887. c.getBH().updateTargetUI();
  1888. }
  1889. c.faceUpdate(0);
  1890. c.stopMovement();
  1891.  
  1892. /*
  1893. * Death within the duel arena
  1894. */
  1895. if (duelSession != null && duelSession.getStage().getStage() == MultiplayerSessionStage.FURTHER_INTERATION) {
  1896. if (!duelSession.getWinner().isPresent()) {
  1897. c.sendMessage("You have lost the duel!");
  1898.  
  1899. c.setDuelLossCounter(c.getDuelLossCounter() + 1);
  1900. c.sendMessage("You have now lost a total of @blu@" + c.getDuelLossCounter() + " @bla@ duels.");
  1901. Player opponent = duelSession.getOther(c);
  1902. opponent.logoutDelay = System.currentTimeMillis();
  1903. if (!duelSession.getWinner().isPresent()) {
  1904. duelSession.setWinner(opponent);
  1905. }
  1906. PlayerSave.saveGame(opponent);
  1907. } else {
  1908. c.sendMessage("Congratulations, you have won the duel.");
  1909. }
  1910. c.logoutDelay = System.currentTimeMillis();
  1911. }
  1912. c.startAnimation(2304);
  1913. resetDeath();
  1914. }
  1915.  
  1916. private void resetDeath() {
  1917. c.playerStandIndex = 808;
  1918. c.playerWalkIndex = 819;
  1919. c.playerRunIndex = 824;
  1920. PlayerSave.saveGame(c);
  1921. c.getPA().requestUpdates();
  1922. removeAllWindows();
  1923. closeAllWindows();
  1924. resetFollowers();
  1925. c.getItems().addSpecialBar(c.playerEquipment[c.playerWeapon]);
  1926. c.specAmount = 10;
  1927. c.attackTimer = 10;
  1928. c.respawnTimer = 15;
  1929. c.lastVeng = 0;
  1930. c.recoilHits = 0;
  1931. c.graceSum = 0;
  1932. c.freezeTimer = 1;
  1933. c.vengOn = false;
  1934. c.isDead = false;
  1935. c.tradeResetNeeded = true;
  1936. c.doubleHit = false;
  1937. }
  1938.  
  1939. public void resetTb() {
  1940. c.teleBlockLength = 0;
  1941. c.teleBlockDelay = 0;
  1942. }
  1943.  
  1944. private void resetFollowers() {
  1945. for (int j = 0; j < PlayerHandler.players.length; j++) {
  1946. if (PlayerHandler.players[j] != null) {
  1947. if (PlayerHandler.players[j].followId == c.getIndex()) {
  1948. Player c = PlayerHandler.players[j];
  1949. c.getPA().resetFollow();
  1950. }
  1951. }
  1952. }
  1953. }
  1954. public void sendSpecialAttack(int amount, int specialEnabled) {
  1955. if (c.getOutStream() != null && c != null) {
  1956. c.getOutStream().createFrame(204);
  1957. c.getOutStream().writeByte(amount);
  1958. c.getOutStream().writeByte(specialEnabled);
  1959. c.flushOutStream();
  1960. }
  1961. }
  1962. /**
  1963. * Handles what happens after a player death
  1964. */
  1965. public void giveLife() {
  1966. // Set the visual masks of a player
  1967. c.isFullHelm = Item.isFullHat(c.playerEquipment[c.playerHat]);
  1968. c.isFullMask = Item.isFullMask(c.playerEquipment[c.playerHat]);
  1969. c.isFullBody = Item.isFullBody(c.playerEquipment[c.playerChest]);
  1970. c.isDead = false;
  1971. c.faceUpdate(-1);
  1972. c.freezeTimer = 1;
  1973. c.setTektonDamageCounter(0);
  1974. c.setSkeletalMysticDamageCounter(0);
  1975. c.setGlodDamageCounter(0);
  1976. c.setIceQueenDamageCounter(0);
  1977. c.refreshQuestTab(7);
  1978.  
  1979. // If a player is in any of these areas, their items will not be dropped to
  1980. // themselves nor others
  1981. if (!c.inDuelArena() && !Boundary.isIn(c, Boundary.DUEL_ARENA)&& !Vorkath.inVorkath(c)
  1982.  
  1983. && !Boundary.isIn(c, Boundary.FIGHT_CAVE) && !Boundary.isIn(c, Boundary.LIGHTHOUSE)
  1984. && !Boundary.isIn(c, PestControl.GAME_BOUNDARY) && !c.inSafemode()
  1985. && !Boundary.isIn(c, Boundary.INFERNO) && !Boundary.isIn(c, Zulrah.BOUNDARY)
  1986. && !Boundary.isIn(c, Boundary.CERBERUS_BOSSROOMS) && !Boundary.isIn(c, Boundary.SKOTIZO_BOSSROOM)
  1987. && !Boundary.isIn(c, Boundary.RFD) && !Boundary.isIn(c, Boundary.OLM)
  1988. && !Boundary.isIn(c, Boundary.RAIDS) && Lowpkarena.getState(c) == null
  1989. && Highpkarena.getState(c) == null) {
  1990.  
  1991. // If any items are on this list, delete them
  1992. for (int itemId : Config.DROP_AND_DELETE_ON_DEATH) {
  1993. if (c.getItems().isWearingItem(itemId)) {
  1994. int slot = c.getItems().getItemSlot(itemId);
  1995. if (slot != -1) {
  1996. c.getItems().removeItem(itemId, slot);
  1997. }
  1998. }
  1999. if (c.getItems().playerHasItem(itemId)) {
  2000. c.getItems().deleteItem2(itemId, c.getItems().getItemAmount(itemId));
  2001. }
  2002. }
  2003.  
  2004. // Get the killer
  2005. Entity killer = c.getKiller();
  2006.  
  2007. // Degrade, unequip venomous items
  2008. c.getCombat().degradeVenemousItems(killer);
  2009.  
  2010. // If a player is not an ultimate ironman, update the items kept on death
  2011. if (!c.getMode().isUltimateIronman()) {
  2012. c.getItems().resetKeepItems();
  2013. c.updateItemsOnDeath();
  2014. }
  2015. // Handles the items kept on death
  2016. for (int item = 0; item < Config.ITEMS_KEPT_ON_DEATH.length; item++) {
  2017. int itemId = Config.ITEMS_KEPT_ON_DEATH[item];
  2018. int itemAmount = c.getItems().getItemAmount(itemId) + c.getItems().getWornItemAmount(itemId);
  2019. if (c.getItems().playerHasItem(itemId) || c.getItems().isWearingItem(itemId)) {
  2020. if (c.getMode().isUltimateIronman()) {
  2021. Server.itemHandler.createGroundItem(c, itemId, c.getX(), c.getY(), c.heightLevel, itemAmount,
  2022. c.getIndex());
  2023. } else if (c.inClanWars() || c.inClanWarsSafe()) {
  2024. Server.itemHandler.createGroundItem(c, itemId, c.getX(), c.getY(), c.heightLevel, itemAmount,
  2025. c.getIndex());
  2026. } else {
  2027. c.getItems().sendItemToAnyTab(itemId, 1);
  2028. }
  2029. }
  2030. }
  2031.  
  2032. // If ultimate ironman, delete all items and drop all of them
  2033. if (c.getMode().isUltimateIronman()) {
  2034. c.getItems().deleteAllItems();
  2035. c.getItems().dropAllItems();
  2036.  
  2037. // Otherwise, drop them
  2038. } else {
  2039. c.getItems().dropAllItems();
  2040. c.getItems().deleteAllItems();
  2041. // If a player is not skulled he will keep 3 items
  2042. if (!c.isSkulled) {
  2043. for (int i1 = 0; i1 < 3; i1++) {
  2044. if (c.itemKeptId[i1] > 0) {
  2045. c.getItems().addItem(c.itemKeptId[i1], 1);
  2046. }
  2047. }
  2048. }
  2049. // If protect item is active, one extra item will be kept
  2050. if (c.prayerActive[10]) {
  2051. if (c.itemKeptId[3] > 0) {
  2052. c.getItems().addItem(c.itemKeptId[3], 1);
  2053. }
  2054. }
  2055. c.getItems().resetKeepItems();
  2056. }
  2057. /*
  2058. * } else if (c.inPits) { Server.fightPits.removePlayerFromPits(c.playerId);
  2059. * c.pitsStatus = 1;
  2060. */
  2061. } else if (Boundary.isIn(c, Boundary.PEST_CONTROL_AREA)) {
  2062. c.getPA().movePlayer(2657, 2639, 0);
  2063. } else if (Boundary.isIn(c, Boundary.RAIDS)) {
  2064. c.getPA().movePlayer(c.getRaids().getStartLocation().getX(),c.getRaids().getStartLocation().getY(),c.getRaids().getHeight(c.getRaids().raidLeader));
  2065. c.getRaids().currentRoom=0;
  2066. } else if (Boundary.isIn(c, Boundary.OLM)) {
  2067. c.getPA().movePlayer(c.getRaids().getStartLocation().getX(),c.getRaids().getStartLocation().getY(),c.getRaids().getHeight(c.getRaids().raidLeader));
  2068. }
  2069. if (Boundary.isIn(c, PestControl.GAME_BOUNDARY)) {
  2070. c.getPA().movePlayer(2656 + Misc.random(2), 2614 - Misc.random(3), 0);
  2071. } else if (Boundary.isIn(c, Zulrah.BOUNDARY)) {
  2072. c.getPA().movePlayer(Config.START_LOCATION_X, Config.START_LOCATION_X, 0);
  2073. InstancedArea instance = c.getZulrahEvent().getInstancedZulrah();
  2074. if (instance != null) {
  2075. InstancedAreaManager.getSingleton().disposeOf(instance);
  2076. }
  2077. c.getZulrahLostItems().store();
  2078. c.talkingNpc = 2040;
  2079. c.getDH().sendNpcChat("It looks like Zulrah beat you.", "I'll give you back your items for 500,000GP.",
  2080. "Talk to me when you're ready.");
  2081. } else if (Boundary.isIn(c, Boundary.CERBERUS_BOSSROOMS)) {
  2082. c.getPA().movePlayer(1309, 1250, 0);
  2083. c.getCerberusLostItems().store();
  2084. c.talkingNpc = 5870;
  2085. c.getDH().sendNpcChat("It looks like Cerberus beat you.", "I'll give you back your items for 500,000GP.",
  2086. "Talk to me when you're ready.");
  2087. } else if (Boundary.isIn(c, Boundary.SKOTIZO_BOSSROOM)) {
  2088. c.getPA().movePlayer(1665, 10045, 0);
  2089. c.getSkotizoLostItems().store();
  2090. c.talkingNpc = 7283;
  2091. c.getDH().sendNpcChat("It looks like Skotizo beat you.", "I'll give you back your items for 500,000GP.",
  2092. "Talk to me when you're ready.");
  2093. } else if (Boundary.isIn(c, Boundary.DUEL_ARENA)) {
  2094. DuelSession duelSession = (DuelSession) Server.getMultiplayerSessionListener().getMultiplayerSession(c,
  2095. MultiplayerSessionType.DUEL);
  2096. if (Objects.nonNull(duelSession)
  2097. && duelSession.getStage().getStage() == MultiplayerSessionStage.FURTHER_INTERATION) {
  2098. Player opponent = duelSession.getWinner().get();
  2099. if (opponent != null) {
  2100. opponent.getPA().createPlayerHints(10, -1);
  2101. duelSession.finish(MultiplayerSessionFinalizeType.GIVE_ITEMS);
  2102. }
  2103. }
  2104. } else if (Boundary.isIn(c, Boundary.LIGHTHOUSE) && c.getDagannothMother() != null) {
  2105. c.getDagannothMother().end(DisposeType.INCOMPLETE);
  2106. } else if (Boundary.isIn(c, Boundary.RFD) && c.getrecipeForDisaster() != null) {
  2107. c.getrecipeForDisaster().end(DisposeTypes.INCOMPLETE);
  2108. } else if (Boundary.isIn(c, Boundary.FIGHT_CAVE)) {
  2109. c.getFightCave().handleDeath();
  2110. } else if (Boundary.isIn(c, Boundary.INFERNO)) {
  2111. c.getInfernoMinigame().handleDeath();
  2112. } else if (Boundary.isIn(c, Boundary.RAIDS)) {
  2113. c.getPA().movePlayer(c.getRaids().getStartLocation().getX(),c.getRaids().getStartLocation().getY(),c.getRaids().getHeight(c.getRaids().raidLeader));
  2114. } else if (Boundary.isIn(c, Boundary.OLM)) {
  2115. c.getPA().movePlayer(c.getRaids().getStartLocation().getX(),c.getRaids().getStartLocation().getY(),c.getRaids().getHeight(c.getRaids().raidLeader));
  2116. } else if (Highpkarena.getState(c) != null) {
  2117. Highpkarena.handleDeath(c);
  2118. } else if (Lowpkarena.getState(c) != null) {
  2119. Lowpkarena.handleDeath(c);
  2120. } else if (c.inClanWars() || c.inClanWarsSafe()) {
  2121. movePlayer(c.absX, 4759, 0);
  2122. } else if (Boundary.isIn(c, Boundary.SAFEPKSAFE)) {
  2123. movePlayer(Config.RESPAWN_X, Config.RESPAWN_Y, 0);
  2124. c.isSkulled = false;
  2125. c.skullTimer = 0;
  2126. c.attackedPlayers.clear();
  2127. removeAllWindows();
  2128. closeAllWindows();
  2129. } else {
  2130. movePlayer(Config.RESPAWN_X, Config.RESPAWN_Y, 0);
  2131. c.isSkulled = false;
  2132. c.skullTimer = 0;
  2133. c.attackedPlayers.clear();
  2134. removeAllWindows();
  2135. closeAllWindows();
  2136. }
  2137. c.getCombat().resetPrayers();
  2138. for (int i = 0; i < 20; i++) {
  2139. c.playerLevel[i] = getLevelForXP(c.playerXP[i]);
  2140. c.getPA().refreshSkill(i);
  2141. }
  2142. c.startAnimation(65535);
  2143. updateLife();
  2144. }
  2145.  
  2146. /**
  2147. * Update and reset certain objects of an account
  2148. */
  2149. private void updateLife() {
  2150. PlayerSave.saveGame(c);
  2151. c.resetDamageTaken();
  2152. c.getCombat().resetPlayerAttack();
  2153. frame1();
  2154. resetTb();
  2155. c.isSkulled = false;
  2156. c.attackedPlayers.clear();
  2157. c.headIconPk = -1;
  2158. c.skullTimer = -1;
  2159. c.getHealth().reset();
  2160. c.getHealth().removeAllStatuses();
  2161. c.getHealth().removeAllImmunities();
  2162. requestUpdates();
  2163. c.tradeResetNeeded = true;
  2164. }
  2165.  
  2166. /**
  2167. * Teleporting
  2168. *
  2169. * @param homeTeleport
  2170. * TODO
  2171. **/
  2172. public void spellTeleport(int x, int y, int height, boolean homeTeleport) {
  2173. if (Lowpkarena.getState(c) != null || Highpkarena.getState(c) != null) {
  2174. c.sendMessage("You can't teleport from a Pk event!");
  2175. return;
  2176. }
  2177. c.getPA().startTeleport(x, y, height, c.playerMagicBook == 1 ? "ancient" : "modern", homeTeleport);
  2178. if (c.getSlayer().superiorSpawned) {
  2179. c.getSlayer().superiorSpawned = false;
  2180. }
  2181. }
  2182.  
  2183. public void startLeverTeleport(int x, int y, int height) {
  2184. if (System.currentTimeMillis() - c.teleBlockDelay < c.teleBlockLength) {
  2185. c.sendMessage("You are teleblocked and can't teleport.");
  2186. return;
  2187. }
  2188. if (c.inClanWars() || c.inClanWarsSafe()) {
  2189. c.sendMessage("@cr10@You can not teleport from here, speak to the doomsayer to leave.");
  2190. return;
  2191. }
  2192. if (Boundary.isIn(c, Boundary.ICE_PATH) || Boundary.isIn(c, Boundary.ICE_PATH_TOP) && c.heightLevel > 0) {
  2193. c.sendMessage("The cold from the ice-path is preventing you from teleporting.");
  2194. return;
  2195. }
  2196. if (c.getBankPin().requiresUnlock()) {
  2197. c.getBankPin().open(2);
  2198. return;
  2199. }
  2200. if (Boundary.isIn(c, Boundary.RAIDS)) {
  2201. c.getPotions().resetOverload();
  2202. }
  2203. if (c.getSlayer().superiorSpawned) {
  2204. c.getSlayer().superiorSpawned = false;
  2205. }
  2206. if (Lowpkarena.getState(c) != null || Highpkarena.getState(c) != null) {
  2207. c.sendMessage("You can't teleport from a Pk event!");
  2208. return;
  2209. }
  2210. if (!c.isDead && c.teleTimer == 0 && c.respawnTimer == -6) {
  2211. if (c.playerIndex > 0 || c.npcIndex > 0)
  2212. c.getCombat().resetPlayerAttack();
  2213. c.stopMovement();
  2214. removeAllWindows();
  2215. c.teleX = x;
  2216. c.teleY = y;
  2217. c.npcIndex = 0;
  2218. c.playerIndex = 0;
  2219. c.faceUpdate(0);
  2220. c.teleHeight = height;
  2221. c.startAnimation(2140);
  2222. c.teleTimer = 8;
  2223. c.setTektonDamageCounter(0);
  2224. c.setGlodDamageCounter(0);
  2225. c.setIceQueenDamageCounter(0);
  2226. c.setSkeletalMysticDamageCounter(0);
  2227. c.sendMessage("You pull the lever..");
  2228. }
  2229. c.getSkilling().stop();
  2230. if (Server.getMultiplayerSessionListener().inAnySession(c)) {
  2231. Server.getMultiplayerSessionListener().finish(c, MultiplayerSessionFinalizeType.WITHDRAW_ITEMS);
  2232. }
  2233. if (c.getSkotizo() != null) {
  2234. InstancedAreaManager.getSingleton().disposeOf(c.getSkotizo());
  2235. }
  2236. }
  2237.  
  2238. public boolean morphPermissions() {
  2239. if (c.morphed) {
  2240. return false;
  2241. }
  2242. if (c.inWild()) {
  2243. return false;
  2244. }
  2245. if (System.currentTimeMillis() - c.lastSpear < 3000) {
  2246. c.sendMessage("You cannot do this now.");
  2247. return false;
  2248. }
  2249. if (Boundary.isIn(c, Boundary.DUEL_ARENA)) {
  2250. DuelSession session = (DuelSession) Server.getMultiplayerSessionListener().getMultiplayerSession(c,
  2251. MultiplayerSessionType.DUEL);
  2252. if (Objects.nonNull(session)) {
  2253. c.sendMessage("You cannot do this here.");
  2254. return false;
  2255. }
  2256. }
  2257. if (c.getBankPin().requiresUnlock()) {
  2258. c.getBankPin().open(2);
  2259. return false;
  2260. }
  2261. if (Boundary.isIn(c, Boundary.LIGHTHOUSE)) {
  2262. c.sendMessage("You cannot do this here.");
  2263. return false;
  2264. }
  2265. if (Boundary.isIn(c, Boundary.RFD)) {
  2266. c.sendMessage("You cannot do this here.");
  2267. return false;
  2268. }
  2269. if (Boundary.isIn(c, Boundary.FIGHT_CAVE)) {
  2270. c.sendMessage("You cannot do this here.");
  2271. return false;
  2272. }
  2273. if (Boundary.isIn(c, Boundary.ICE_PATH) || Boundary.isIn(c, Boundary.ICE_PATH_TOP) && c.heightLevel > 0) {
  2274. c.sendMessage("You cannot do this here.");
  2275. return false;
  2276. }
  2277. if (Server.getMultiplayerSessionListener().inAnySession(c)) {
  2278. c.sendMessage("You cannot do this now.");
  2279. return false;
  2280. }
  2281. return true;
  2282. }
  2283.  
  2284. public boolean canTeleport(String type) {
  2285. if (c.morphed) {
  2286. c.sendMessage("You cannot do this now.");
  2287. return false;
  2288. }
  2289. if (c.inClanWars() || c.inClanWarsSafe()) {
  2290. c.sendMessage("@cr10@You can not teleport from here, speak to the doomsayer to leave.");
  2291. return false;
  2292. }
  2293. if (System.currentTimeMillis() - c.lastSpear < 3000) {
  2294. c.sendMessage("You are stunned and can not teleport!");
  2295. return false;
  2296. }
  2297. if (Boundary.isIn(c, Boundary.DUEL_ARENA)) {
  2298. DuelSession session = (DuelSession) Server.getMultiplayerSessionListener().getMultiplayerSession(c,
  2299. MultiplayerSessionType.DUEL);
  2300. if (Objects.nonNull(session)) {
  2301. c.sendMessage("You cannot teleport whilst in a duel.");
  2302. return false;
  2303. }
  2304. }
  2305. if (Lowpkarena.getState(c) != null || Highpkarena.getState(c) != null) {
  2306. c.sendMessage("You can't teleport from a Pk event!");
  2307. return false;
  2308. }
  2309. if (c.getBankPin().requiresUnlock()) {
  2310. c.getBankPin().open(2);
  2311. return false;
  2312. }
  2313. if (Boundary.isIn(c, Boundary.LIGHTHOUSE)) {
  2314. c.sendMessage("You cannot teleport from here, use the ladder.");
  2315. return false;
  2316. }
  2317. if (Boundary.isIn(c, Boundary.RFD)) {
  2318. c.sendMessage("You cannot teleport from here, use the portal.");
  2319. return false;
  2320. }
  2321. if (Boundary.isIn(c, Boundary.FIGHT_CAVE)) {
  2322. c.sendMessage("You cannot teleport out of fight caves.");
  2323. return false;
  2324. }
  2325. if (Boundary.isIn(c, Boundary.ICE_PATH) || Boundary.isIn(c, Boundary.ICE_PATH_TOP) && c.heightLevel > 0) {
  2326. c.sendMessage("The cold from the ice-path is preventing you from teleporting.");
  2327. return false;
  2328. }
  2329. if (Server.getMultiplayerSessionListener().inAnySession(c)) {
  2330. c.sendMessage("You must finish what you're doing before you can teleport.");
  2331. return false;
  2332. }
  2333. if (c.isInJail() && !(c.getRights().isOrInherits(Right.MODERATOR))) {
  2334. c.sendMessage("You cannot teleport out of jail.");
  2335. return false;
  2336. }
  2337. if (c.inWild()) {
  2338. if (!type.equals("glory")) {
  2339. if (c.wildLevel > Config.NO_TELEPORT_WILD_LEVEL) {
  2340. c.sendMessage(
  2341. "You can't teleport above level " + Config.NO_TELEPORT_WILD_LEVEL + " in the wilderness.");
  2342. c.getPA().closeAllWindows();
  2343. return false;
  2344. }
  2345. } else {
  2346. if (c.wildLevel > 30) {
  2347. c.sendMessage("You can't teleport above level 30 in the wilderness.");
  2348. c.getPA().closeAllWindows();
  2349. return false;
  2350. }
  2351. }
  2352. }
  2353. if (System.currentTimeMillis() - c.teleBlockDelay < c.teleBlockLength) {
  2354. c.sendMessage("You are teleblocked and can't teleport.");
  2355. return false;
  2356. }
  2357. return true;
  2358. }
  2359.  
  2360. public void startTeleport(int x, int y, int height, String teleportType, boolean homeTeleport) {
  2361. c.isWc = false;
  2362. if (c.morphed) {
  2363. c.sendMessage("You cannot do this now.");
  2364. return;
  2365. }
  2366. if (c.inClanWars() || c.inClanWarsSafe()) {
  2367. c.sendMessage("@cr10@You can not teleport from here, speak to the doomsayer to leave.");
  2368. return;
  2369. }
  2370. if (c.stopPlayerSkill) {
  2371. SkillHandler.resetPlayerSkillVariables(c);
  2372. c.stopPlayerSkill = false;
  2373. }
  2374. if (c.isForceMovementActive()) {
  2375. return;
  2376. }
  2377. resetVariables();
  2378. SkillHandler.isSkilling[12] = false;
  2379. if (System.currentTimeMillis() - c.lastSpear < 3000) {
  2380. c.sendMessage("You are stunned and can not teleport!");
  2381. return;
  2382. }
  2383. if (c.getBankPin().requiresUnlock()) {
  2384. c.getBankPin().open(2);
  2385. return;
  2386. }
  2387. if (Server.getMultiplayerSessionListener().inAnySession(c)) {
  2388. c.sendMessage("You must finish what you're doing first.");
  2389. return;
  2390. }
  2391. if (Boundary.isIn(c, Boundary.LIGHTHOUSE)) {
  2392. c.sendMessage("You cannot teleport from here, use the ladder.");
  2393. return;
  2394. }
  2395. if (Boundary.isIn(c, Boundary.RAIDS)) {
  2396. c.getPotions().resetOverload();
  2397. }
  2398. if (Boundary.isIn(c, Boundary.RFD)) {
  2399. c.sendMessage("You cannot teleport from here, use the portal.");
  2400. return;
  2401. }
  2402. if (Boundary.isIn(c, Boundary.FIGHT_CAVE)) {
  2403. c.sendMessage("You cannot teleport out of fight caves.");
  2404. return;
  2405. }
  2406. if (Lowpkarena.getState(c) != null || Highpkarena.getState(c) != null) {
  2407. c.sendMessage("You can't teleport from a Pk event!");
  2408. return;
  2409. }
  2410. if (Boundary.isIn(c, Boundary.ICE_PATH) || Boundary.isIn(c, Boundary.ICE_PATH_TOP) && c.heightLevel > 0) {
  2411. c.sendMessage("The cold from the ice-path is preventing you from teleporting.");
  2412. return;
  2413. }
  2414. if (c.isInJail() && !(c.getRights().isOrInherits(Right.MODERATOR))) {
  2415. c.sendMessage("You cannot teleport out of jail.");
  2416. return;
  2417. }
  2418. if (c.isDead) {
  2419. return;
  2420. }
  2421. if (c.inWild() && !(c.getRights().isOrInherits(Right.MODERATOR))) {
  2422. if (!teleportType.equals("glory") && !teleportType.equals("obelisk")) {
  2423. if (c.wildLevel > Config.NO_TELEPORT_WILD_LEVEL) {
  2424. c.sendMessage(
  2425. "You can't teleport above level " + Config.NO_TELEPORT_WILD_LEVEL + " in the wilderness.");
  2426. c.getPA().closeAllWindows();
  2427. return;
  2428. }
  2429. } else if (!teleportType.equals("obelisk")) {
  2430. if (c.wildLevel > 30) {
  2431. c.sendMessage("You can't teleport above level 30 in the wilderness.");
  2432. c.getPA().closeAllWindows();
  2433. return;
  2434. }
  2435. }
  2436. }
  2437. if (System.currentTimeMillis() - c.teleBlockDelay < c.teleBlockLength) {
  2438. c.sendMessage("You are teleblocked and can't teleport.");
  2439. return;
  2440. }
  2441. if (c.getSlayer().superiorSpawned) {
  2442. c.getSlayer().superiorSpawned = false;
  2443. }
  2444. if (!c.isDead && c.teleTimer == 0 && c.respawnTimer == -6) {
  2445. if (c.playerIndex > 0 || c.npcIndex > 0) {
  2446. c.getCombat().resetPlayerAttack();
  2447. }
  2448. c.stopMovement();
  2449. removeAllWindows();
  2450. c.teleX = x;
  2451. c.teleY = y;
  2452. c.npcIndex = 0;
  2453. c.playerIndex = 0;
  2454. c.faceUpdate(0);
  2455. c.teleHeight = height;
  2456. c.setTektonDamageCounter(0);
  2457. c.setGlodDamageCounter(0);
  2458. c.setIceQueenDamageCounter(0);
  2459. c.setSkeletalMysticDamageCounter(0);
  2460. if (teleportType.equalsIgnoreCase("modern") || teleportType.equals("glory")) {
  2461. c.startAnimation(714);
  2462. c.teleTimer = 11;
  2463. c.teleGfx = 308;
  2464. c.teleEndAnimation = 715;
  2465. } else if (teleportType.equalsIgnoreCase("ancient")) {
  2466. c.startAnimation(1979);
  2467. c.teleGfx = 0;
  2468. c.teleTimer = 9;
  2469. c.teleEndAnimation = 0;
  2470. c.gfx0(392);
  2471. } else if (teleportType.equals("obelisk")) {
  2472. c.startAnimation(1816);
  2473. c.teleTimer = 11;
  2474. c.teleGfx = 661;
  2475. c.teleEndAnimation = 65535;
  2476. } else if (teleportType.equals("puropuro")) {
  2477. c.startAnimation(6724);
  2478. c.gfx0(1118);
  2479. c.teleTimer = 13;
  2480. c.teleEndAnimation = 65535;
  2481. }
  2482. if (!homeTeleport) {
  2483. c.lastTeleportX = x;
  2484. c.lastTeleportY = y;
  2485. c.lastTeleportZ = height;
  2486. }
  2487. c.getSkilling().stop();
  2488. if (Server.getMultiplayerSessionListener().inAnySession(c)) {
  2489. Server.getMultiplayerSessionListener().finish(c, MultiplayerSessionFinalizeType.WITHDRAW_ITEMS);
  2490. return;
  2491. }
  2492. if (c.getSkotizo() != null) {
  2493. InstancedAreaManager.getSingleton().disposeOf(c.getSkotizo());
  2494. }
  2495. }
  2496. }
  2497.  
  2498. public void teleTabTeleport(int x, int y, int height, String teleportType) {
  2499. if (Server.getMultiplayerSessionListener().inAnySession(c)) {
  2500. c.sendMessage("You cannot teleport until you finish what you're doing.");
  2501. return;
  2502. }
  2503. if (c.inClanWars() || c.inClanWarsSafe()) {
  2504. c.sendMessage("@cr10@You can not teleport from here, speak to the doomsayer to leave.");
  2505. return;
  2506. }
  2507. if (c.inWild() && c.wildLevel > Config.NO_TELEPORT_WILD_LEVEL) {
  2508. c.sendMessage("You can't teleport above level " + Config.NO_TELEPORT_WILD_LEVEL + " in the wilderness.");
  2509. return;
  2510. }
  2511. if (c.morphed) {
  2512. c.sendMessage("You cannot do this now.");
  2513. return;
  2514. }
  2515. if (Boundary.isIn(c, Boundary.RAIDS)) {
  2516. c.getPotions().resetOverload();
  2517. }
  2518. if (c.getBankPin().requiresUnlock()) {
  2519. c.getBankPin().open(2);
  2520. return;
  2521. }
  2522. if (System.currentTimeMillis() - c.teleBlockDelay < c.teleBlockLength) {
  2523. c.sendMessage("You are teleblocked and can't teleport.");
  2524. return;
  2525. }
  2526. if (Boundary.isIn(c, Boundary.LIGHTHOUSE)) {
  2527. c.sendMessage("You cannot teleport from here, use the ladder.");
  2528. return;
  2529. }
  2530. if (Boundary.isIn(c, Boundary.RFD)) {
  2531. c.sendMessage("You cannot teleport from here, use the portal.");
  2532. return;
  2533. }
  2534. if (Boundary.isIn(c, Boundary.FIGHT_CAVE)) {
  2535. c.sendMessage("You cannot teleport out of fight caves.");
  2536. return;
  2537. }
  2538. if (Boundary.isIn(c, Boundary.ICE_PATH) || Boundary.isIn(c, Boundary.ICE_PATH_TOP) && c.heightLevel > 0) {
  2539. c.sendMessage("The cold from the ice-path is preventing you from teleporting.");
  2540. return;
  2541. }
  2542. if (Lowpkarena.getState(c) != null || Highpkarena.getState(c) != null) {
  2543. c.sendMessage("You can't teleport from a Pk event!");
  2544. return;
  2545. }
  2546. if (c.isDead) {
  2547. return;
  2548. }
  2549. if (c.getSlayer().superiorSpawned) {
  2550. c.getSlayer().superiorSpawned = false;
  2551. }
  2552. if (!c.isDead && c.teleTimer == 0 && c.respawnTimer == -6) {
  2553. if (c.playerIndex > 0 || c.npcIndex > 0)
  2554. c.getCombat().resetPlayerAttack();
  2555. c.stopMovement();
  2556. removeAllWindows();
  2557. c.teleX = x;
  2558. c.teleY = y;
  2559. c.npcIndex = 0;
  2560. c.playerIndex = 0;
  2561. c.faceUpdate(0);
  2562. c.teleHeight = height;
  2563. c.setTektonDamageCounter(0);
  2564. c.setGlodDamageCounter(0);
  2565. c.setIceQueenDamageCounter(0);
  2566. c.setSkeletalMysticDamageCounter(0);
  2567. c.getSkilling().stop();
  2568. if (teleportType.equalsIgnoreCase("teleTab")) {
  2569. c.startAnimation(4731);
  2570. c.teleEndAnimation = 0;
  2571. c.teleTimer = 8;
  2572. c.gfx0(678);
  2573. }
  2574. }
  2575. if (c.getSkotizo() != null) {
  2576. InstancedAreaManager.getSingleton().disposeOf(c.getSkotizo());
  2577. }
  2578. }
  2579.  
  2580. public void startTeleport2(int x, int y, int height) {
  2581. if (Server.getMultiplayerSessionListener().inAnySession(c)) {
  2582. c.sendMessage("You cannot teleport until you finish what you're doing.");
  2583. return;
  2584. }
  2585. if (c.inClanWars() || c.inClanWarsSafe()) {
  2586. c.sendMessage("@cr10@You can not teleport from here, speak to the doomsayer to leave.");
  2587. return;
  2588. }
  2589. if (System.currentTimeMillis() - c.lastSpear < 3000) {
  2590. c.sendMessage("You are stunned and can not teleport!");
  2591. return;
  2592. }
  2593. if (c.morphed) {
  2594. c.sendMessage("You cannot do this now.");
  2595. return;
  2596. }
  2597. if (Boundary.isIn(c, Boundary.RAIDS)) {
  2598. c.getPotions().resetOverload();
  2599. }
  2600. if (c.getBankPin().requiresUnlock()) {
  2601. c.getBankPin().open(2);
  2602. return;
  2603. }
  2604. if (Boundary.isIn(c, Boundary.LIGHTHOUSE)) {
  2605. c.sendMessage("You cannot teleport from here, use the ladder.");
  2606. return;
  2607. }
  2608. if (Boundary.isIn(c, Boundary.RFD)) {
  2609. c.sendMessage("You cannot teleport from here, use the portal.");
  2610. return;
  2611. }
  2612. if (System.currentTimeMillis() - c.teleBlockDelay < c.teleBlockLength) {
  2613. c.sendMessage("You are teleblocked and can't teleport.");
  2614. return;
  2615. }
  2616. if (Boundary.isIn(c, Boundary.FIGHT_CAVE)) {
  2617. c.sendMessage("You cannot teleport out of fight caves.");
  2618. return;
  2619. }
  2620. if (Boundary.isIn(c, Boundary.ICE_PATH) || Boundary.isIn(c, Boundary.ICE_PATH_TOP) && c.heightLevel > 0) {
  2621. c.sendMessage("The cold from the ice-path is preventing you from teleporting.");
  2622. return;
  2623. }
  2624. if (Lowpkarena.getState(c) != null || Highpkarena.getState(c) != null) {
  2625. c.sendMessage("You can't teleport from a Pk event!");
  2626. return;
  2627. }
  2628. if (c.isDead) {
  2629. return;
  2630. }
  2631. if (!c.isDead && c.teleTimer == 0) {
  2632. c.stopMovement();
  2633. removeAllWindows();
  2634. c.teleX = x;
  2635. c.teleY = y;
  2636. c.npcIndex = 0;
  2637. c.playerIndex = 0;
  2638. c.faceUpdate(0);
  2639. c.teleHeight = height;
  2640. c.startAnimation(714);
  2641. c.teleTimer = 9;
  2642. c.teleGfx = 308;
  2643. c.teleEndAnimation = 715;
  2644. c.setTektonDamageCounter(0);
  2645. c.setGlodDamageCounter(0);
  2646. c.setIceQueenDamageCounter(0);
  2647. c.setSkeletalMysticDamageCounter(0);
  2648. c.getSkilling().stop();
  2649. }
  2650. if (c.getSkotizo() != null) {
  2651. InstancedAreaManager.getSingleton().disposeOf(c.getSkotizo());
  2652. }
  2653. }
  2654.  
  2655. public void processTeleport() {
  2656. if (c.isDead) {
  2657. return;
  2658. }
  2659. c.teleportToX = c.teleX;
  2660. c.teleportToY = c.teleY;
  2661. c.heightLevel = c.teleHeight;
  2662. if (c.teleEndAnimation > 0) {
  2663. c.startAnimation(c.teleEndAnimation);
  2664. }
  2665. }
  2666.  
  2667. public void followNpc() {
  2668. if (NPCHandler.npcs[c.followId2] == null || NPCHandler.npcs[c.followId2].isDead) {
  2669. c.followId2 = 0;
  2670. return;
  2671. }
  2672. if (c.morphed) {
  2673. return;
  2674. }
  2675. if (c.freezeTimer > 0) {
  2676. return;
  2677. }
  2678. if (c.isDead || c.playerLevel[3] <= 0)
  2679. return;
  2680.  
  2681. NPC npc = NPCHandler.npcs[c.followId2];
  2682. int otherX = NPCHandler.npcs[c.followId2].getX();
  2683. int otherY = NPCHandler.npcs[c.followId2].getY();
  2684.  
  2685. double distanceToNpc = npc.getDistance(c.absX, c.absY);
  2686.  
  2687. boolean withinDistance = distanceToNpc <= 2;
  2688. boolean hallyDistance = distanceToNpc <= 2;
  2689. boolean bowDistance = distanceToNpc <= 8;
  2690. boolean rangeWeaponDistance = distanceToNpc <= 4;
  2691. boolean sameSpot = c.absX == otherX && c.absY == otherY;
  2692. if (!c.goodDistance(otherX, otherY, c.getX(), c.getY(), 25)) {
  2693. c.followId2 = 0;
  2694. return;
  2695. }
  2696.  
  2697. c.faceUpdate(c.followId2);
  2698. if (distanceToNpc <= 1) {
  2699. if (!npc.insideOf(c.absX, c.absY)) {
  2700. if (npc.getSize() == 0) {
  2701. stopDiagonal(otherX, otherY);
  2702. }
  2703. return;
  2704. }
  2705. }
  2706.  
  2707. boolean projectile = c.usingOtherRangeWeapons || c.usingBow || c.usingMagic || c.autocasting
  2708. || c.getCombat().usingCrystalBow();
  2709. if (!projectile
  2710. || projectile && (PathChecker.isProjectilePathClear(c.absX, c.absY, c.heightLevel, otherX, otherY)
  2711. || PathChecker.isProjectilePathClear(otherX, otherY, c.heightLevel, c.absX, c.absY))) {
  2712.  
  2713. if (Misc.distance(c.getX(), c.getY(), otherX, otherY) == 1.0) {
  2714. return;
  2715. }
  2716.  
  2717. if (c.playerEquipment[c.playerWeapon] == 11907
  2718. || c.playerEquipment[c.playerWeapon] == 12899 && bowDistance && !sameSpot) {
  2719. return;
  2720. }
  2721.  
  2722. if ((c.usingBow || c.mageFollow || c.autocasting) && bowDistance && !sameSpot) {
  2723. return;
  2724. }
  2725.  
  2726. if (c.getCombat().usingHally() && hallyDistance && !sameSpot) {
  2727. return;
  2728. }
  2729.  
  2730. if ((c.usingBallista || c.usingRangeWeapon) && rangeWeaponDistance && !sameSpot) {
  2731. return;
  2732. }
  2733.  
  2734. }
  2735.  
  2736. final int x = c.absX;
  2737. final int y = c.absY;
  2738. final int z = c.heightLevel;
  2739. // XXX Add water npcs here
  2740. final boolean inWater = npc.npcType == 2042 || npc.npcType == 2043 || npc.npcType == 2044 || npc.npcType == 1739
  2741. || npc.npcType == 1740 || npc.npcType == 1741 || npc.npcType == 1742;
  2742.  
  2743. if (!inWater) {
  2744. double lowDist = 99999;
  2745. int lowX = 0;
  2746. int lowY = 0;
  2747. int x3 = otherX;
  2748. int y3 = otherY - 1;
  2749. final int loop = npc.getSize();
  2750.  
  2751. for (int k = 0; k < 4; k++) {
  2752. for (int i = 0; i < loop - (k == 0 ? 1 : 0); i++) {
  2753. if (k == 0) {
  2754. x3++;
  2755. } else if (k == 1) {
  2756. if (i == 0) {
  2757. x3++;
  2758. }
  2759. y3++;
  2760. } else if (k == 2) {
  2761. if (i == 0) {
  2762. y3++;
  2763. }
  2764. x3--;
  2765. } else if (k == 3) {
  2766. if (i == 0) {
  2767. x3--;
  2768. }
  2769. y3--;
  2770. }
  2771.  
  2772. if (Misc.distance(x3, y3, x, y) < lowDist) {
  2773. if (!projectile && PathChecker.isMeleePathClear(x3, y3, z, otherX, otherY)
  2774. || projectile && PathChecker.isProjectilePathClear(x3, y3, z, otherX, otherY)) {
  2775. if (PathFinder.getPathFinder().accessable(c, x3, y3)) {
  2776. lowDist = Misc.distance(x3, y3, x, y);
  2777. lowX = x3;
  2778. lowY = y3;
  2779. }
  2780. }
  2781. }
  2782. }
  2783. }
  2784.  
  2785. if (lowX != 0 && lowY != 0) {
  2786. PathFinder.getPathFinder().findRoute(c, lowX, lowY, true, 18, 18);
  2787. } else {
  2788. PathFinder.getPathFinder().findRoute(c, npc.absX, npc.absY, true, 18, 18);
  2789. }
  2790.  
  2791. } else {
  2792.  
  2793. if (otherX == c.absX && otherY == c.absY) {
  2794. int r = Misc.random(3);
  2795. switch (r) {
  2796. case 0:
  2797. playerWalk(0, -1);
  2798. break;
  2799. case 1:
  2800. playerWalk(0, 1);
  2801. break;
  2802. case 2:
  2803. playerWalk(1, 0);
  2804. break;
  2805. case 3:
  2806. playerWalk(-1, 0);
  2807. break;
  2808. }
  2809. } else if (c.isRunning2 && !withinDistance) {
  2810. if (otherY > c.getY() && otherX == c.getX()) {
  2811. // walkTo(0, getMove(c.getY(), otherY - 1) + getMove(c.getY(),
  2812. // otherY - 1));
  2813. playerWalk(otherX, otherY - 1);
  2814. } else if (otherY < c.getY() && otherX == c.getX()) {
  2815. // walkTo(0, getMove(c.getY(), otherY + 1) + getMove(c.getY(),
  2816. // otherY + 1));
  2817. playerWalk(otherX, otherY + 1);
  2818. } else if (otherX > c.getX() && otherY == c.getY()) {
  2819. // walkTo(getMove(c.getX(), otherX - 1) + getMove(c.getX(),
  2820. // otherX - 1), 0);
  2821. playerWalk(otherX - 1, otherY);
  2822. } else if (otherX < c.getX() && otherY == c.getY()) {
  2823. // walkTo(getMove(c.getX(), otherX + 1) + getMove(c.getX(),
  2824. // otherX + 1), 0);
  2825. playerWalk(otherX + 1, otherY);
  2826. } else if (otherX < c.getX() && otherY < c.getY()) {
  2827. // walkTo(getMove(c.getX(), otherX + 1) + getMove(c.getX(),
  2828. // otherX + 1), getMove(c.getY(), otherY + 1) +
  2829. // getMove(c.getY(), otherY + 1));
  2830. playerWalk(otherX + 1, otherY + 1);
  2831. } else if (otherX > c.getX() && otherY > c.getY()) {
  2832. // walkTo(getMove(c.getX(), otherX - 1) + getMove(c.getX(),
  2833. // otherX - 1), getMove(c.getY(), otherY - 1) +
  2834. // getMove(c.getY(), otherY - 1));
  2835. playerWalk(otherX - 1, otherY - 1);
  2836. } else if (otherX < c.getX() && otherY > c.getY()) {
  2837. // walkTo(getMove(c.getX(), otherX + 1) + getMove(c.getX(),
  2838. // otherX + 1), getMove(c.getY(), otherY - 1) +
  2839. // getMove(c.getY(), otherY - 1));
  2840. playerWalk(otherX + 1, otherY - 1);
  2841. } else if (otherX > c.getX() && otherY < c.getY()) {
  2842. // walkTo(getMove(c.getX(), otherX + 1) + getMove(c.getX(),
  2843. // otherX + 1), getMove(c.getY(), otherY - 1) +
  2844. // getMove(c.getY(), otherY - 1));
  2845. playerWalk(otherX + 1, otherY - 1);
  2846. }
  2847. } else {
  2848. if (otherY > c.getY() && otherX == c.getX()) {
  2849. // walkTo(0, getMove(c.getY(), otherY - 1));n
  2850. playerWalk(otherX, otherY - 1);
  2851. } else if (otherY < c.getY() && otherX == c.getX()) {
  2852. // walkTo(0, getMove(c.getY(), otherY + 1));
  2853. playerWalk(otherX, otherY + 1);
  2854. } else if (otherX > c.getX() && otherY == c.getY()) {
  2855. // walkTo(getMove(c.getX(), otherX - 1), 0);
  2856. playerWalk(otherX - 1, otherY);
  2857. } else if (otherX < c.getX() && otherY == c.getY()) {
  2858. // walkTo(getMove(c.getX(), otherX + 1), 0);
  2859. playerWalk(otherX + 1, otherY);
  2860. } else if (otherX < c.getX() && otherY < c.getY()) {
  2861. // walkTo(getMove(c.getX(), otherX + 1), getMove(c.getY(),
  2862. // otherY + 1));
  2863. playerWalk(otherX + 1, otherY + 1);
  2864. } else if (otherX > c.getX() && otherY > c.getY()) {
  2865. // walkTo(getMove(c.getX(), otherX - 1), getMove(c.getY(),
  2866. // otherY - 1));
  2867. playerWalk(otherX - 1, otherY - 1);
  2868. } else if (otherX < c.getX() && otherY > c.getY()) {
  2869. // walkTo(getMove(c.getX(), otherX + 1), getMove(c.getY(),
  2870. // otherY - 1));
  2871. playerWalk(otherX + 1, otherY - 1);
  2872. } else if (otherX > c.getX() && otherY < c.getY()) {
  2873. // walkTo(getMove(c.getX(), otherX - 1), getMove(c.getY(),
  2874. // otherY + 1));
  2875. playerWalk(otherX - 1, otherY + 1);
  2876. }
  2877. }
  2878. }
  2879. }
  2880.  
  2881. /**
  2882. * Following
  2883. **/
  2884.  
  2885. public void followPlayer() {
  2886. if (PlayerHandler.players[c.followId] == null || PlayerHandler.players[c.followId].isDead) {
  2887. c.followId = 0;
  2888. return;
  2889. }
  2890. if (c.morphed) {
  2891. return;
  2892. }
  2893. if (c.freezeTimer > 0) {
  2894. return;
  2895. }
  2896. if (Boundary.isIn(c, Boundary.DUEL_ARENA)) {
  2897. DuelSession session = (DuelSession) Server.getMultiplayerSessionListener().getMultiplayerSession(c,
  2898. MultiplayerSessionType.DUEL);
  2899. if (!Objects.isNull(session)) {
  2900. if (session.getRules().contains(Rule.NO_MOVEMENT)) {
  2901. c.followId = 0;
  2902. return;
  2903. }
  2904. }
  2905. }
  2906. if (inPitsWait()) {
  2907. c.followId = 0;
  2908. }
  2909.  
  2910. if (c.isDead || c.getHealth().getAmount() <= 0)
  2911. return;
  2912. if (System.currentTimeMillis() - c.lastSpear < 3000) {
  2913. c.sendMessage("You are stunned, you cannot move.");
  2914. c.followId = 0;
  2915. return;
  2916. }
  2917. final int otherX = PlayerHandler.players[c.followId].getX();
  2918. final int otherY = PlayerHandler.players[c.followId].getY();
  2919.  
  2920. boolean sameSpot = (c.absX == otherX && c.absY == otherY);
  2921.  
  2922. boolean hallyDistance = c.goodDistance(otherX, otherY, c.getX(), c.getY(), 2);
  2923. @SuppressWarnings("unused")
  2924. boolean withinDistance = c.goodDistance(otherX, otherY, c.getX(), c.getY(), 2);
  2925. boolean rangeWeaponDistance = c.goodDistance(otherX, otherY, c.getX(), c.getY(), 4);
  2926. boolean bowDistance = c.goodDistance(otherX, otherY, c.getX(), c.getY(), 6);
  2927.  
  2928. if (!c.goodDistance(otherX, otherY, c.getX(), c.getY(), 25)) {
  2929. c.followId = 0;
  2930. return;
  2931. }
  2932.  
  2933. boolean projectile = c.usingOtherRangeWeapons || c.usingBow || c.usingMagic || c.getCombat().usingCrystalBow();
  2934. if (!projectile
  2935. || projectile && (PathChecker.isProjectilePathClear(c.absX, c.absY, c.heightLevel, otherX, otherY)
  2936. || PathChecker.isProjectilePathClear(otherX, otherY, c.heightLevel, c.absX, c.absY))) {
  2937.  
  2938. if (Misc.distance(c.getX(), c.getY(), otherX, otherY) == 1.0) {
  2939. return;
  2940. }
  2941.  
  2942. if ((c.usingBow || c.mageFollow || (c.playerIndex > 0 && c.autocastId > 0)) && bowDistance && !sameSpot) {
  2943. return;
  2944. }
  2945.  
  2946. if (c.getCombat().usingHally() && hallyDistance && !sameSpot) {
  2947. return;
  2948. }
  2949.  
  2950. if (c.usingBallista || c.usingRangeWeapon && rangeWeaponDistance && !sameSpot) {
  2951. return;
  2952. }
  2953.  
  2954. }
  2955.  
  2956. c.faceUpdate(c.followId + 32768);
  2957. if (otherX == c.absX && otherY == c.absY) {
  2958. int r = Misc.random(3);
  2959. switch (r) {
  2960. case 0:
  2961. if (Region.canMove(c.absX, c.absY, c.absX, c.absY - 1, c.heightLevel, 1, 1))
  2962. walkTo(0, -1);
  2963. break;
  2964. case 1:
  2965. if (Region.canMove(c.absX, c.absY, c.absX, c.absY + 1, c.heightLevel, 1, 1))
  2966. walkTo(0, 1);
  2967. break;
  2968. case 2:
  2969. if (Region.canMove(c.absX, c.absY, c.absX + 1, c.absY, c.heightLevel, 1, 1))
  2970. walkTo(1, 0);
  2971. break;
  2972. case 3:
  2973. if (Region.canMove(c.absX, c.absY, c.absX - 1, c.absY, c.heightLevel, 1, 1))
  2974. walkTo(-1, 0);
  2975. break;
  2976. }
  2977. } else {
  2978. int lowX = 0;
  2979. int lowY = 0;
  2980. double lowDist = 0;
  2981.  
  2982. int[][] nondiags = { { 0, -1 }, { 0, 1 }, { -1, 0 }, { 1, 0 }, };
  2983. for (int[] nondiag : nondiags) {
  2984. int x2 = otherX + nondiag[0];
  2985. int y2 = otherY + nondiag[1];
  2986. if (lowDist == 0 || Misc.distance(c.absX, c.absY, x2, y2) < lowDist) {
  2987. if (PathFinder.getPathFinder().accessable(c, x2, y2)) {
  2988. lowX = x2;
  2989. lowY = y2;
  2990. lowDist = Misc.distance(c.absX, c.absY, x2, y2);
  2991. }
  2992. }
  2993. }
  2994.  
  2995. if (lowX != 0 && lowY != 0) {
  2996. playerWalk(lowX, lowY);
  2997. } else {
  2998. playerWalk(otherX, otherY);
  2999. }
  3000. }
  3001. c.faceUpdate(c.followId + 32768);
  3002. }
  3003.  
  3004. public int getRunningMove(int i, int j) {
  3005. if (j - i > 2)
  3006. return 2;
  3007. else if (j - i < -2)
  3008. return -2;
  3009. else
  3010. return j - i;
  3011. }
  3012.  
  3013. public void sendStatement(String s) {
  3014. sendFrame126(s, 357);
  3015. sendFrame126("Click here to continue", 358);
  3016. sendFrame164(356);
  3017. }
  3018.  
  3019. public void resetFollow() {
  3020. c.followId = 0;
  3021. c.followId2 = 0;
  3022. c.mageFollow = false;
  3023. if (c.outStream != null) {
  3024. c.outStream.createFrame(174);
  3025. c.outStream.writeWord(0);
  3026. c.outStream.writeByte(0);
  3027. c.outStream.writeWord(1);
  3028. }
  3029. }
  3030.  
  3031. public void walkTo3(int i, int j) {
  3032. c.newWalkCmdSteps = 0;
  3033. if (++c.newWalkCmdSteps > 50)
  3034. c.newWalkCmdSteps = 0;
  3035. int k = c.absX + i;
  3036. k -= c.mapRegionX * 8;
  3037. c.getNewWalkCmdX()[0] = c.getNewWalkCmdY()[0] = tmpNWCX[0] = tmpNWCY[0] = 0;
  3038. int l = c.absY + j;
  3039. l -= c.mapRegionY * 8;
  3040. c.isRunning2 = false;
  3041. c.isRunning = false;
  3042. c.getNewWalkCmdX()[0] += k;
  3043. c.getNewWalkCmdY()[0] += l;
  3044. c.poimiY = l;
  3045. c.poimiX = k;
  3046. }
  3047.  
  3048. private final int[] tmpNWCX = new int[50];
  3049. private final int[] tmpNWCY = new int[50];
  3050.  
  3051. public void walkTo(int i, int j) {
  3052. c.newWalkCmdSteps = 0;
  3053. if (++c.newWalkCmdSteps > 50)
  3054. c.newWalkCmdSteps = 0;
  3055. int k = c.getX() + i;
  3056. k -= c.mapRegionX * 8;
  3057. c.getNewWalkCmdX()[0] = c.getNewWalkCmdY()[0] = 0;
  3058. int l = c.getY() + j;
  3059. l -= c.mapRegionY * 8;
  3060.  
  3061. for (int n = 0; n < c.newWalkCmdSteps; n++) {
  3062. c.getNewWalkCmdX()[n] += k;
  3063. c.getNewWalkCmdY()[n] += l;
  3064. }
  3065. }
  3066.  
  3067. public void walkTo2(int i, int j) {
  3068. if (c.freezeDelay > 0)
  3069. return;
  3070. c.newWalkCmdSteps = 0;
  3071. if (++c.newWalkCmdSteps > 50)
  3072. c.newWalkCmdSteps = 0;
  3073. int k = c.getX() + i;
  3074. k -= c.mapRegionX * 8;
  3075. c.getNewWalkCmdX()[0] = c.getNewWalkCmdY()[0] = 0;
  3076. int l = c.getY() + j;
  3077. l -= c.mapRegionY * 8;
  3078.  
  3079. for (int n = 0; n < c.newWalkCmdSteps; n++) {
  3080. c.getNewWalkCmdX()[n] += k;
  3081. c.getNewWalkCmdY()[n] += l;
  3082. }
  3083. }
  3084.  
  3085. private void stopDiagonal(int otherX, int otherY) {
  3086. if (c.freezeDelay > 0)
  3087. return;
  3088. if (c.freezeTimer > 0) // player can't move
  3089. return;
  3090. c.newWalkCmdSteps = 1;
  3091. int xMove = otherX - c.getX();
  3092. int yMove = 0;
  3093. if (xMove == 0)
  3094. yMove = otherY - c.getY();
  3095. /*
  3096. * if (!clipHor) { yMove = 0; } else if (!clipVer) { xMove = 0; }
  3097. */
  3098.  
  3099. int k = c.getX() + xMove;
  3100. k -= c.mapRegionX * 8;
  3101. c.getNewWalkCmdX()[0] = c.getNewWalkCmdY()[0] = 0;
  3102. int l = c.getY() + yMove;
  3103. l -= c.mapRegionY * 8;
  3104.  
  3105. for (int n = 0; n < c.newWalkCmdSteps; n++) {
  3106. c.getNewWalkCmdX()[n] += k;
  3107. c.getNewWalkCmdY()[n] += l;
  3108. }
  3109.  
  3110. }
  3111.  
  3112. public void walkToCheck(int i, int j) {
  3113. if (c.freezeDelay > 0)
  3114. return;
  3115. c.newWalkCmdSteps = 0;
  3116. if (++c.newWalkCmdSteps > 50)
  3117. c.newWalkCmdSteps = 0;
  3118. int k = c.getX() + i;
  3119. k -= c.mapRegionX * 8;
  3120. c.getNewWalkCmdX()[0] = c.getNewWalkCmdY()[0] = 0;
  3121. int l = c.getY() + j;
  3122. l -= c.mapRegionY * 8;
  3123.  
  3124. for (int n = 0; n < c.newWalkCmdSteps; n++) {
  3125. c.getNewWalkCmdX()[n] += k;
  3126. c.getNewWalkCmdY()[n] += l;
  3127. }
  3128. }
  3129.  
  3130. public int getMove(int place1, int place2) {
  3131. if (System.currentTimeMillis() - c.lastSpear < 3000)
  3132. return 0;
  3133. if ((place1 - place2) == 0) {
  3134. return 0;
  3135. } else if ((place1 - place2) < 0) {
  3136. return 1;
  3137. } else if ((place1 - place2) > 0) {
  3138. return -1;
  3139. }
  3140. return 0;
  3141. }
  3142.  
  3143. public boolean fullVeracs() {
  3144. return c.playerEquipment[c.playerHat] == 4753 && c.playerEquipment[c.playerChest] == 4757
  3145. && c.playerEquipment[c.playerLegs] == 4759 && c.playerEquipment[c.playerWeapon] == 4755;
  3146. }
  3147.  
  3148. public boolean fullGuthans() {
  3149. return c.playerEquipment[c.playerHat] == 4724 && c.playerEquipment[c.playerChest] == 4728
  3150. && c.playerEquipment[c.playerLegs] == 4730 && c.playerEquipment[c.playerWeapon] == 4726;
  3151. }
  3152.  
  3153. public void requestUpdates() {
  3154. // if (!c.initialized) {
  3155. // return;
  3156. // }
  3157. c.updateRequired = true;
  3158. c.setAppearanceUpdateRequired(true);
  3159. }
  3160.  
  3161. /*
  3162. * public void Obelisks(int id) { if (!c.getItems().playerHasItem(id)) {
  3163. * c.getItems().addItem(id, 1); } }
  3164. */
  3165.  
  3166. public void levelUp(int skill) {
  3167. int totalLevel = (getLevelForXP(c.playerXP[0]) + getLevelForXP(c.playerXP[1]) + getLevelForXP(c.playerXP[2])
  3168. + getLevelForXP(c.playerXP[3]) + getLevelForXP(c.playerXP[4]) + getLevelForXP(c.playerXP[5])
  3169. + getLevelForXP(c.playerXP[6]) + getLevelForXP(c.playerXP[7]) + getLevelForXP(c.playerXP[8])
  3170. + getLevelForXP(c.playerXP[9]) + getLevelForXP(c.playerXP[10]) + getLevelForXP(c.playerXP[11])
  3171. + getLevelForXP(c.playerXP[12]) + getLevelForXP(c.playerXP[13]) + getLevelForXP(c.playerXP[14])
  3172. + getLevelForXP(c.playerXP[15]) + getLevelForXP(c.playerXP[16]) + getLevelForXP(c.playerXP[17])
  3173. + getLevelForXP(c.playerXP[18]) + getLevelForXP(c.playerXP[19]) + getLevelForXP(c.playerXP[20])
  3174. + getLevelForXP(c.playerXP[21]));
  3175. sendFrame126("" + totalLevel, 3984);
  3176. switch (skill) {
  3177. case 0:
  3178. sendFrame126("Congratulations, you just advanced an attack level!", 6248);
  3179. sendFrame126("Your attack level is now " + getLevelForXP(c.playerXP[skill]) + ".", 6249);
  3180. c.sendMessage("Congratulations, you just advanced an attack level.");
  3181. sendFrame164(6247);
  3182. break;
  3183.  
  3184. case 1:
  3185. sendFrame126("Congratulations, you just advanced a defence level!", 6254);
  3186. sendFrame126("Your defence level is now " + getLevelForXP(c.playerXP[skill]) + ".", 6255);
  3187. c.sendMessage("Congratulations, you just advanced a defence level.");
  3188. sendFrame164(6253);
  3189. break;
  3190.  
  3191. case 2:
  3192. sendFrame126("Congratulations, you just advanced a strength level!", 6207);
  3193. sendFrame126("Your strength level is now " + getLevelForXP(c.playerXP[skill]) + ".", 6208);
  3194. c.sendMessage("Congratulations, you just advanced a strength level.");
  3195. sendFrame164(6206);
  3196. break;
  3197.  
  3198. case 3:
  3199. c.getHealth().setMaximum(c.getLevelForXP(c.playerXP[c.playerHitpoints]));
  3200. sendFrame126("Congratulations, you just advanced a hitpoints level!", 6217);
  3201. sendFrame126("Your hitpoints level is now " + getLevelForXP(c.playerXP[skill]) + ".", 6218);
  3202. c.sendMessage("Congratulations, you just advanced a hitpoints level.");
  3203. sendFrame164(6216);
  3204. break;
  3205.  
  3206. case 4:
  3207. c.sendMessage("Congratulations, you just advanced a ranging level.");
  3208. break;
  3209.  
  3210. case 5:
  3211. sendFrame126("Congratulations, you just advanced a prayer level!", 6243);
  3212. sendFrame126("Your prayer level is now " + getLevelForXP(c.playerXP[skill]) + ".", 6244);
  3213. c.sendMessage("Congratulations, you just advanced a prayer level.");
  3214. sendFrame164(6242);
  3215. break;
  3216.  
  3217. case 6:
  3218. sendFrame126("Congratulations, you just advanced a magic level!", 6212);
  3219. sendFrame126("Your magic level is now " + getLevelForXP(c.playerXP[skill]) + ".", 6213);
  3220. c.sendMessage("Congratulations, you just advanced a magic level.");
  3221. sendFrame164(6211);
  3222. break;
  3223.  
  3224. case 7:
  3225. sendFrame126("Congratulations, you just advanced a cooking level!", 6227);
  3226. sendFrame126("Your cooking level is now " + getLevelForXP(c.playerXP[skill]) + ".", 6228);
  3227. c.sendMessage("Congratulations, you just advanced a cooking level.");
  3228. sendFrame164(6226);
  3229. break;
  3230.  
  3231. case 8:
  3232. sendFrame126("Congratulations, you just advanced a woodcutting level!", 4273);
  3233. sendFrame126("Your woodcutting level is now " + getLevelForXP(c.playerXP[skill]) + ".", 4274);
  3234. c.sendMessage("Congratulations, you just advanced a woodcutting level.");
  3235. sendFrame164(4272);
  3236. break;
  3237.  
  3238. case 9:
  3239. sendFrame126("Congratulations, you just advanced a fletching level!", 6232);
  3240. sendFrame126("Your fletching level is now " + getLevelForXP(c.playerXP[skill]) + ".", 6233);
  3241. c.sendMessage("Congratulations, you just advanced a fletching level.");
  3242. sendFrame164(6231);
  3243. break;
  3244.  
  3245. case 10:
  3246. sendFrame126("Congratulations, you just advanced a fishing level!", 6259);
  3247. sendFrame126("Your fishing level is now " + getLevelForXP(c.playerXP[skill]) + ".", 6260);
  3248. c.sendMessage("Congratulations, you just advanced a fishing level.");
  3249. sendFrame164(6258);
  3250. break;
  3251.  
  3252. case 11:
  3253. sendFrame126("Congratulations, you just advanced a fire making level!", 4283);
  3254. sendFrame126("Your firemaking level is now " + getLevelForXP(c.playerXP[skill]) + ".", 4284);
  3255. c.sendMessage("Congratulations, you just advanced a fire making level.");
  3256. sendFrame164(4282);
  3257. break;
  3258.  
  3259. case 12:
  3260. sendFrame126("Congratulations, you just advanced a crafting level!", 6264);
  3261. sendFrame126("Your crafting level is now " + getLevelForXP(c.playerXP[skill]) + ".", 6265);
  3262. c.sendMessage("Congratulations, you just advanced a crafting level.");
  3263. sendFrame164(6263);
  3264. break;
  3265.  
  3266. case 13:
  3267. sendFrame126("Congratulations, you just advanced a smithing level!", 6222);
  3268. sendFrame126("Your smithing level is now " + getLevelForXP(c.playerXP[skill]) + ".", 6223);
  3269. c.sendMessage("Congratulations, you just advanced a smithing level.");
  3270. sendFrame164(6221);
  3271. break;
  3272.  
  3273. case 14:
  3274. sendFrame126("Congratulations, you just advanced a mining level!", 4417);
  3275. sendFrame126("Your mining level is now " + getLevelForXP(c.playerXP[skill]) + ".", 4438);
  3276. c.sendMessage("Congratulations, you just advanced a mining level.");
  3277. sendFrame164(4416);
  3278. break;
  3279.  
  3280. case 15:
  3281. sendFrame126("Congratulations, you just advanced a herblore level!", 6238);
  3282. sendFrame126("Your herblore level is now " + getLevelForXP(c.playerXP[skill]) + ".", 6239);
  3283. c.sendMessage("Congratulations, you just advanced a herblore level.");
  3284. sendFrame164(6237);
  3285. break;
  3286.  
  3287. case 16:
  3288. sendFrame126("Congratulations, you just advanced a agility level!", 4278);
  3289. sendFrame126("Your agility level is now " + getLevelForXP(c.playerXP[skill]) + ".", 4279);
  3290. c.sendMessage("Congratulations, you just advanced an agility level.");
  3291. sendFrame164(4277);
  3292. break;
  3293.  
  3294. case 17:
  3295. sendFrame126("Congratulations, you just advanced a thieving level!", 4263);
  3296. sendFrame126("Your theiving level is now " + getLevelForXP(c.playerXP[skill]) + ".", 4264);
  3297. c.sendMessage("Congratulations, you just advanced a thieving level.");
  3298. sendFrame164(4261);
  3299. break;
  3300.  
  3301. case 18:
  3302. sendFrame126("Congratulations, you just advanced a slayer level!", 12123);
  3303. sendFrame126("Your slayer level is now " + getLevelForXP(c.playerXP[skill]) + ".", 12124);
  3304. c.sendMessage("Congratulations, you just advanced a slayer level.");
  3305. sendFrame164(12122);
  3306. break;
  3307.  
  3308. case 19:
  3309. c.sendMessage("Congratulations! You've just advanced a Farming level.");
  3310. break;
  3311.  
  3312. case 20:
  3313. sendFrame126("Congratulations, you just advanced a runecrafting level!", 4268);
  3314. sendFrame126("Your runecrafting level is now " + getLevelForXP(c.playerXP[skill]) + ".", 4269);
  3315. c.sendMessage("Congratulations, you just advanced a runecrafting level.");
  3316. sendFrame164(4267);
  3317. break;
  3318.  
  3319. case 21:
  3320. case 22:
  3321. c.sendMessage("Congratulations! You've just advanced a Hunter level.");
  3322. break;
  3323. }
  3324. if (c.maxRequirements(c)) {
  3325. PlayerHandler
  3326. .executeGlobalMessage("@red@" + Misc.capitalize(c.playerName) + " has reached max total level!");
  3327. }
  3328. if (getLevelForXP(c.playerXP[skill]) == 99) {
  3329. Skill s = Skill.forId(skill);
  3330. PlayerHandler.executeGlobalMessage(
  3331. "@red@" + Misc.capitalize(c.playerName) + " has reached level 99 " + s.toString() + "!");
  3332. }
  3333. c.dialogueAction = 0;
  3334. c.nextChat = 0;
  3335. }
  3336.  
  3337. public void refreshSkill(int i) {
  3338. c.combatLevel = c.calculateCombatLevel();
  3339. switch (i) {
  3340. case 0:
  3341. sendFrame126("" + c.playerLevel[0] + "", 4004);
  3342. sendFrame126("" + getLevelForXP(c.playerXP[0]) + "", 4005);
  3343. sendFrame126("" + c.playerXP[0] + "", 4044);
  3344. sendFrame126("" + getXPForLevel(getLevelForXP(c.playerXP[0]) + 1) + "", 4045);
  3345. requestUpdates();
  3346. break;
  3347.  
  3348. case 1:
  3349. sendFrame126("" + c.playerLevel[1] + "", 4008);
  3350. sendFrame126("" + getLevelForXP(c.playerXP[1]) + "", 4009);
  3351. sendFrame126("" + c.playerXP[1] + "", 4056);
  3352. sendFrame126("" + getXPForLevel(getLevelForXP(c.playerXP[1]) + 1) + "", 4057);
  3353. break;
  3354.  
  3355. case 2:
  3356. sendFrame126("" + c.playerLevel[2] + "", 4006);
  3357. sendFrame126("" + getLevelForXP(c.playerXP[2]) + "", 4007);
  3358. sendFrame126("" + c.playerXP[2] + "", 4050);
  3359. sendFrame126("" + getXPForLevel(getLevelForXP(c.playerXP[2]) + 1) + "", 4051);
  3360. break;
  3361.  
  3362. case 3:
  3363. sendFrame126("" + c.getHealth().getAmount() + "", 4016);
  3364. sendFrame126("" + getLevelForXP(c.playerXP[3]) + "", 4017);
  3365. sendFrame126("" + c.playerXP[3] + "", 4080);
  3366. sendFrame126("" + getXPForLevel(getLevelForXP(c.playerXP[3]) + 1) + "", 4081);
  3367. break;
  3368.  
  3369. case 4:
  3370. sendFrame126("" + c.playerLevel[4] + "", 4010);
  3371. sendFrame126("" + getLevelForXP(c.playerXP[4]) + "", 4011);
  3372. sendFrame126("" + c.playerXP[4] + "", 4062);
  3373. sendFrame126("" + getXPForLevel(getLevelForXP(c.playerXP[4]) + 1) + "", 4063);
  3374. break;
  3375.  
  3376. case 5:
  3377. sendFrame126("" + c.playerLevel[5] + "", 4012);
  3378. sendFrame126("" + getLevelForXP(c.playerXP[5]) + "", 4013);
  3379. sendFrame126("" + c.playerXP[5] + "", 4068);
  3380. sendFrame126("" + getXPForLevel(getLevelForXP(c.playerXP[5]) + 1) + "", 4069);
  3381. sendFrame126("" + c.playerLevel[5] + "/" + getLevelForXP(c.playerXP[5]) + "", 687);// Prayer
  3382. // frame
  3383. break;
  3384.  
  3385. case 6:
  3386. sendFrame126("" + c.playerLevel[6] + "", 4014);
  3387. sendFrame126("" + getLevelForXP(c.playerXP[6]) + "", 4015);
  3388. sendFrame126("" + c.playerXP[6] + "", 4074);
  3389. sendFrame126("" + getXPForLevel(getLevelForXP(c.playerXP[6]) + 1) + "", 4075);
  3390. break;
  3391.  
  3392. case 7:
  3393. sendFrame126("" + c.playerLevel[7] + "", 4034);
  3394. sendFrame126("" + getLevelForXP(c.playerXP[7]) + "", 4035);
  3395. sendFrame126("" + c.playerXP[7] + "", 4134);
  3396. sendFrame126("" + getXPForLevel(getLevelForXP(c.playerXP[7]) + 1) + "", 4135);
  3397. break;
  3398.  
  3399. case 8:
  3400. sendFrame126("" + c.playerLevel[8] + "", 4038);
  3401. sendFrame126("" + getLevelForXP(c.playerXP[8]) + "", 4039);
  3402. sendFrame126("" + c.playerXP[8] + "", 4146);
  3403. sendFrame126("" + getXPForLevel(getLevelForXP(c.playerXP[8]) + 1) + "", 4147);
  3404. break;
  3405.  
  3406. case 9:
  3407. sendFrame126("" + c.playerLevel[9] + "", 4026);
  3408. sendFrame126("" + getLevelForXP(c.playerXP[9]) + "", 4027);
  3409. sendFrame126("" + c.playerXP[9] + "", 4110);
  3410. sendFrame126("" + getXPForLevel(getLevelForXP(c.playerXP[9]) + 1) + "", 4111);
  3411. break;
  3412.  
  3413. case 10:
  3414. sendFrame126("" + c.playerLevel[10] + "", 4032);
  3415. sendFrame126("" + getLevelForXP(c.playerXP[10]) + "", 4033);
  3416. sendFrame126("" + c.playerXP[10] + "", 4128);
  3417. sendFrame126("" + getXPForLevel(getLevelForXP(c.playerXP[10]) + 1) + "", 4129);
  3418. break;
  3419.  
  3420. case 11:
  3421. sendFrame126("" + c.playerLevel[11] + "", 4036);
  3422. sendFrame126("" + getLevelForXP(c.playerXP[11]) + "", 4037);
  3423. sendFrame126("" + c.playerXP[11] + "", 4140);
  3424. sendFrame126("" + getXPForLevel(getLevelForXP(c.playerXP[11]) + 1) + "", 4141);
  3425. break;
  3426.  
  3427. case 12:
  3428. sendFrame126("" + c.playerLevel[12] + "", 4024);
  3429. sendFrame126("" + getLevelForXP(c.playerXP[12]) + "", 4025);
  3430. sendFrame126("" + c.playerXP[12] + "", 4104);
  3431. sendFrame126("" + getXPForLevel(getLevelForXP(c.playerXP[12]) + 1) + "", 4105);
  3432. break;
  3433.  
  3434. case 13:
  3435. sendFrame126("" + c.playerLevel[13] + "", 4030);
  3436. sendFrame126("" + getLevelForXP(c.playerXP[13]) + "", 4031);
  3437. sendFrame126("" + c.playerXP[13] + "", 4122);
  3438. sendFrame126("" + getXPForLevel(getLevelForXP(c.playerXP[13]) + 1) + "", 4123);
  3439. break;
  3440.  
  3441. case 14:
  3442. sendFrame126("" + c.playerLevel[14] + "", 4028);
  3443. sendFrame126("" + getLevelForXP(c.playerXP[14]) + "", 4029);
  3444. sendFrame126("" + c.playerXP[14] + "", 4116);
  3445. sendFrame126("" + getXPForLevel(getLevelForXP(c.playerXP[14]) + 1) + "", 4117);
  3446. break;
  3447.  
  3448. case 15:
  3449. sendFrame126("" + c.playerLevel[15] + "", 4020);
  3450. sendFrame126("" + getLevelForXP(c.playerXP[15]) + "", 4021);
  3451. sendFrame126("" + c.playerXP[15] + "", 4092);
  3452. sendFrame126("" + getXPForLevel(getLevelForXP(c.playerXP[15]) + 1) + "", 4093);
  3453. break;
  3454.  
  3455. case 16:
  3456. sendFrame126("" + c.playerLevel[16] + "", 4018);
  3457. sendFrame126("" + getLevelForXP(c.playerXP[16]) + "", 4019);
  3458. sendFrame126("" + c.playerXP[16] + "", 4086);
  3459. sendFrame126("" + getXPForLevel(getLevelForXP(c.playerXP[16]) + 1) + "", 4087);
  3460. break;
  3461.  
  3462. case 17:
  3463. sendFrame126("" + c.playerLevel[17] + "", 4022);
  3464. sendFrame126("" + getLevelForXP(c.playerXP[17]) + "", 4023);
  3465. sendFrame126("" + c.playerXP[17] + "", 4098);
  3466. sendFrame126("" + getXPForLevel(getLevelForXP(c.playerXP[17]) + 1) + "", 4099);
  3467. break;
  3468.  
  3469. case 18:
  3470. sendFrame126("" + c.playerLevel[18] + "", 12166);
  3471. sendFrame126("" + getLevelForXP(c.playerXP[18]) + "", 12167);
  3472. sendFrame126("" + c.playerXP[18] + "", 12171);
  3473. sendFrame126("" + getXPForLevel(getLevelForXP(c.playerXP[18]) + 1) + "", 12172);
  3474. break;
  3475.  
  3476. case 19:
  3477. sendFrame126("" + c.playerLevel[19] + "", 13926);
  3478. sendFrame126("" + getLevelForXP(c.playerXP[19]) + "", 13927);
  3479. sendFrame126("" + c.playerXP[19] + "", 13921);
  3480. sendFrame126("" + getXPForLevel(getLevelForXP(c.playerXP[19]) + 1) + "", 13922);
  3481. break;
  3482.  
  3483. case 20:
  3484. case 21:
  3485. case 22:
  3486. sendFrame126("" + c.playerLevel[20] + "", 4152);
  3487. sendFrame126("" + getLevelForXP(c.playerXP[20]) + "", 4153);
  3488. sendFrame126("" + c.playerXP[20] + "", 4157);
  3489. sendFrame126("" + getXPForLevel(getLevelForXP(c.playerXP[20]) + 1) + "", 4159);
  3490. break;
  3491. }
  3492. }
  3493.  
  3494. public int getXPForLevel(int level) {
  3495. int points = 0;
  3496. int output = 0;
  3497.  
  3498. for (int lvl = 1; lvl <= level; lvl++) {
  3499. points += Math.floor(lvl + 300.0 * Math.pow(2.0, lvl / 7.0));
  3500. if (lvl >= level)
  3501. return output;
  3502. output = (int) Math.floor(points / 4);
  3503. }
  3504. return 0;
  3505. }
  3506.  
  3507. public int getLevelForXP(int exp) {
  3508. int points = 0;
  3509. int output;
  3510. if (exp > 13034430)
  3511. return 99;
  3512. for (int lvl = 1; lvl <= 99; lvl++) {
  3513. points += Math.floor(lvl + 300.0 * Math.pow(2.0, lvl / 7.0));
  3514. output = (int) Math.floor(points / 4);
  3515. if (output >= exp) {
  3516. return lvl;
  3517. }
  3518. }
  3519. return 0;
  3520. }
  3521.  
  3522. public boolean addSkillXP(int amount, int skill, boolean dropExperience) {
  3523. if (c.skillLock[skill]) {
  3524. return false;
  3525. }
  3526. if (Boundary.isIn(c, Boundary.FOUNTAIN_OF_RUNE_BOUNDARY)) {
  3527. return false;
  3528. }
  3529. if (c.expLock && skill <= 6) {
  3530. return false;
  3531. }
  3532. if (amount + c.playerXP[skill] < 0) {
  3533. return false;
  3534. }
  3535. // Amount applied
  3536.  
  3537. // If within thedonator zone, VIP accounts get bonus xp while bonus weekend is
  3538. // off
  3539. if (Boundary.isIn(c, Boundary.DONATOR_ZONE) && c.getRights().isOrInherits(Right.DONATOR)
  3540. && !DoubleExperience.isDoubleExperience(c)) {
  3541. amount *= Config.SERVER_EXP_BONUS_WEEKEND_BOOSTED;
  3542.  
  3543. // If within thedonator zone, VIP accounts get bonus xp while bonus weekend is
  3544. // on
  3545. } else if (Boundary.isIn(c, Boundary.DONATOR_ZONE) && c.getRights().isOrInherits(Right.DONATOR)
  3546. && DoubleExperience.isDoubleExperience(c)) {
  3547. amount *= Config.SERVER_EXP_BONUS_WEEKEND_BOOSTED + Config.SERVER_EXP_BONUS;
  3548.  
  3549. // If bonus weekend is enabled but no vote bonus xp is active, you get reg bonus
  3550. // (20%)
  3551. } else if (DoubleExperience.isDoubleExperience(c) && c.bonusXpTime == 0) {
  3552. amount *= Config.SERVER_EXP_BONUS_WEEKEND;
  3553.  
  3554. // If bonus weekend is enabled and vote bonus xp is active, you get additional
  3555. // bonus (35%)
  3556. } else if (DoubleExperience.isDoubleExperience(c) && c.bonusXpTime > 0) {
  3557. amount *= Config.SERVER_EXP_BONUS_WEEKEND_BOOSTED;
  3558.  
  3559. // If bonus weekend is disabled and vote bonus xp is active, you get reg vote
  3560. // bonus (15%)
  3561. } else if (!DoubleExperience.isDoubleExperience(c) && c.bonusXpTime > 0) {
  3562. amount *= Config.SERVER_EXP_BONUS_BOOSTED;
  3563.  
  3564. // If wogw bonus xp is enabled and vote bonus is active, you get additional
  3565. // bonus (35%)
  3566. } else if (Config.BONUS_XP_WOGW && c.bonusXpTime > 0) {
  3567. amount *= Config.SERVER_EXP_BONUS_BOOSTED;
  3568. // If wogw bonus xp is enabled and bonus weekend is active, you get additional
  3569. // bonus (35%)
  3570. } else if (Config.BONUS_XP_WOGW && DoubleExperience.isDoubleExperience(c)) {
  3571. amount *= Config.SERVER_EXP_BONUS_BOOSTED;
  3572. // Else (20%)
  3573. } else if (Config.BONUS_XP_WOGW && c.bonusXpTime == 0 && !DoubleExperience.isDoubleExperience(c)) {
  3574. amount *= Config.SERVER_EXP_BONUS_WEEKEND;
  3575.  
  3576. // OSRS Modes receive only 1x the experience
  3577. } else if (c.getMode().getType().equals(ModeType.OSRS)) {
  3578. amount *= Config.SERVER_EXP_BONUS;
  3579.  
  3580. // If none of the above are applied, regular experience is given
  3581. } else {
  3582. amount *= Config.SERVER_EXP_BONUS;
  3583. }
  3584.  
  3585. if (dropExperience) {
  3586. c.getPA().sendExperienceDrop(true, amount, skill);
  3587. }
  3588.  
  3589. int oldLevel = getLevelForXP(c.playerXP[skill]);
  3590. int oldExperience = c.playerXP[skill];
  3591. if (oldExperience < 200_000_000 && oldExperience + amount >= 200_000_000) {
  3592. Skill s = Skill.forId(skill);
  3593. PlayerHandler.executeGlobalMessage(
  3594. "@red@" + Misc.capitalize(c.playerName) + " has reached 200M XP in " + s.toString() + "!");
  3595. }
  3596. amount = amount * 2;
  3597. if (c.playerXP[skill] + amount > 200000000) {
  3598. c.playerXP[skill] = 200000000;
  3599. } else {
  3600. c.playerXP[skill] += amount;
  3601. }
  3602. if (oldLevel < getLevelForXP(c.playerXP[skill])) {
  3603. if (c.playerLevel[skill] < c.getLevelForXP(c.playerXP[skill]) && skill != 3 && skill != 5)
  3604. c.playerLevel[skill] = c.getLevelForXP(c.playerXP[skill]);
  3605. c.combatLevel = c.calculateCombatLevel();
  3606. c.getPA().sendFrame126("Combat Level: " + c.combatLevel + "", 3983);
  3607. levelUp(skill);
  3608. if (getLevelForXP(c.playerXP[skill]) == 99) {
  3609. // TODO Skill Activity feed
  3610. }
  3611. c.gfx100(199);
  3612. requestUpdates();
  3613. }
  3614. setSkillLevel(skill, c.playerLevel[skill], c.playerXP[skill]);
  3615. refreshSkill(skill);
  3616. return true;
  3617. }
  3618.  
  3619. private static final int[] Runes = { 4740, 558, 560, 565 };
  3620. private static final int[] Pots = {};
  3621.  
  3622. public int randomRunes() {
  3623. return Runes[(int) (Math.random() * Runes.length)];
  3624. }
  3625.  
  3626. public int randomPots() {
  3627. return Pots[(int) (Math.random() * Pots.length)];
  3628. }
  3629.  
  3630. /**
  3631. * Show an arrow icon on the selected player.
  3632. *
  3633. * @Param i - Either 0 or 1; 1 is arrow, 0 is none.
  3634. * @Param j - The player/Npc that the arrow will be displayed above.
  3635. * @Param k - Keep this set as 0
  3636. * @Param l - Keep this set as 0
  3637. */
  3638. public void drawHeadicon(int i, int j, int k, int l) {
  3639. // synchronized(c) {
  3640. c.outStream.createFrame(254);
  3641. c.outStream.writeByte(i);
  3642.  
  3643. if (i == 1 || i == 10) {
  3644. c.outStream.writeWord(j);
  3645. c.outStream.writeWord(k);
  3646. c.outStream.writeByte(l);
  3647. } else {
  3648. c.outStream.writeWord(k);
  3649. c.outStream.writeWord(l);
  3650. c.outStream.writeByte(j);
  3651. }
  3652.  
  3653. }
  3654.  
  3655. public int getNpcId(int id) {
  3656. for (int i = 0; i < NPCHandler.maxNPCs; i++) {
  3657. if (NPCHandler.npcs[i] != null) {
  3658. if (NPCHandler.npcs[i].getIndex() == id) {
  3659. return i;
  3660. }
  3661. }
  3662. }
  3663. return -1;
  3664. }
  3665.  
  3666. public void removeObject(int x, int y) {
  3667. object(-1, x, y, 10, 10);
  3668. }
  3669.  
  3670. private void objectToRemove(int X, int Y) {
  3671. object(-1, X, Y, 10, 10);
  3672. }
  3673.  
  3674. private void objectToRemove2(int X, int Y) {
  3675. object(-1, X, Y, -1, 0);
  3676. }
  3677.  
  3678. public void removeObjects() {
  3679. objectToRemove(2638, 4688);
  3680. objectToRemove2(2635, 4693);
  3681. objectToRemove2(2634, 4693);
  3682.  
  3683.  
  3684.  
  3685. }
  3686. public void updateQuestTab(){
  3687. sendFrame126("@or1@Varrock", 29480);
  3688. sendFrame126("@or1@Ardougne", 29481);
  3689. sendFrame126("@or1@Desert", 29482);
  3690. sendFrame126("@or1@Falador", 29483);
  3691. sendFrame126("@or1@Fremnnik", 29484);
  3692. sendFrame126("@or1@Kandarin", 29485);
  3693. sendFrame126("@or1@Karamja", 29486);
  3694. sendFrame126("@or1@Lumbridge & Draynor", 29487);
  3695. sendFrame126("@or1@Morytania", 29488);
  3696. sendFrame126("@or1@Western", 29489);
  3697. sendFrame126("@or1@Wilderness", 29490);
  3698. }
  3699. public void handleGlory(int gloryId) {
  3700. if (Server.getMultiplayerSessionListener().inAnySession(c)) {
  3701. c.sendMessage("You cannot do that right now.");
  3702. return;
  3703. }
  3704. c.getDH().sendOption4("Edgeville", "Karamja", "Draynor", "Al Kharid");
  3705. c.sendMessage("You rub the amulet...");
  3706. c.usingGlory = true;
  3707. }
  3708.  
  3709. public void handleSkills(int skillsId) {
  3710. if (Server.getMultiplayerSessionListener().inAnySession(c)) {
  3711. c.sendMessage("You cannot do that right now.");
  3712. return;
  3713. }
  3714. c.getDH().sendOption4("Land's End", "Piscarilius Mining", "Resource Area", "Beach Bank");
  3715. c.sendMessage("You rub the amulet...");
  3716. c.usingSkills = true;
  3717. }
  3718.  
  3719. public void resetVariables() {
  3720. if (c.playerIsCrafting) {
  3721. CraftingData.resetCrafting(c);
  3722. }
  3723. if (c.playerSkilling[9]) {
  3724. c.playerSkilling[9] = false;
  3725. }
  3726. if (c.isBanking) {
  3727. c.isBanking = false;
  3728. }
  3729. c.viewingRunePouch = false;
  3730. if (c.viewingLootBag || c.addingItemsToLootBag)
  3731. c.getLootingBag().closeLootbag();
  3732. c.inSafeBox = false;
  3733. c.usingGlory = false;
  3734. c.usingSkills = false;
  3735. c.smeltInterface = false;
  3736. if (c.dialogueAction > -1) {
  3737. c.dialogueAction = -1;
  3738. }
  3739. if (c.teleAction > -1) {
  3740. c.teleAction = -1;
  3741. }
  3742. if (c.battlestaffDialogue) {
  3743. c.battlestaffDialogue = false;
  3744. }
  3745. if (c.craftDialogue) {
  3746. c.craftDialogue = false;
  3747. }
  3748. c.setInterfaceOpen(-1);
  3749. CycleEventHandler.getSingleton().stopEvents(c, CycleEventHandler.Event.BONE_ON_ALTAR);
  3750. }
  3751.  
  3752. public boolean inPitsWait() {
  3753. return c.getX() <= 2404 && c.getX() >= 2394 && c.getY() <= 5175 && c.getY() >= 5169;
  3754. }
  3755.  
  3756. public void castleWarsObjects() {
  3757. object(-1, 2373, 3119, -3, 10);
  3758. object(-1, 2372, 3119, -3, 10);
  3759. }
  3760.  
  3761. public double getAgilityRunRestore() {
  3762. return 2260 - (c.playerLevel[16] * 10);
  3763. }
  3764.  
  3765. public boolean checkForFlags() {
  3766. int[][] itemsToCheck = { { 995, 100000000 }, { 35, 5 }, { 667, 5 }, { 2402, 5 }, { 746, 5 }, { 4151, 150 },
  3767. { 565, 100000 }, { 560, 100000 }, { 555, 300000 }, { 11235, 10 } };
  3768. for (int[] anItemsToCheck : itemsToCheck) {
  3769. if (anItemsToCheck[1] < c.getItems().getTotalCount(anItemsToCheck[0]))
  3770. return true;
  3771. }
  3772. return false;
  3773. }
  3774.  
  3775. public int totalLevel() {
  3776. int total = 0;
  3777. for (int i = 0; i <= 21; i++) {
  3778.  
  3779. total += getLevelForXP(c.playerXP[i]);
  3780. }
  3781. return total;
  3782. }
  3783.  
  3784. public int xpTotal() {
  3785. int xp = 0;
  3786. for (int i = 0; i <= 21; i++) {
  3787. xp += c.playerXP[i];
  3788. }
  3789. return xp;
  3790. }
  3791.  
  3792. public long getTotalXP() {
  3793. return Arrays.stream(c.playerXP).asLongStream().sum();
  3794. }
  3795.  
  3796. public void addStarter() {
  3797. c.setDropWarning(false);
  3798. List<String> starters = Server.getServerData().getStarters();
  3799. long occurances = starters.stream().filter(data -> data.equals(c.getMacAddress())).count();
  3800.  
  3801. if(c.receivedStarter){
  3802. return;
  3803. }
  3804. if (occurances >= 3) {
  3805. c.sendMessage("@red@You have already received 3 starters.");
  3806. return;
  3807. }
  3808. c.receivedStarter=true;
  3809. c.getItems().addItem(3847, 1);
  3810. c.getItems().addItem(995, 250000);
  3811. c.getItems().addItem(8013, 50);
  3812. c.getItems().addItem(380, 100);
  3813. c.getItems().addItem(1323, 1);
  3814. c.getItems().addItem(1333, 1);
  3815. c.getItems().addItem(841, 1);
  3816. c.getItems().addItem(1381, 1);
  3817. c.getItems().addItem(1153, 1);
  3818. c.getItems().addItem(1115, 1);
  3819. c.getItems().addItem(1067, 1);
  3820. c.getItems().addItem(1191, 1);
  3821. c.getItems().addItem(579, 1);
  3822. c.getItems().addItem(577, 1);
  3823. c.getItems().addItem(1011, 1);
  3824. c.getItems().addItem(13660, 1);
  3825. c.getItems().addItem(1169, 1);
  3826. c.getItems().addItem(1129, 1);
  3827. c.getItems().addItem(1095, 1);
  3828. c.getItems().addItem(1063, 1);
  3829. c.getItems().addItem(863, 100);
  3830. c.getItems().addItem(882, 100);
  3831. PlayerHandler.executeGlobalMessage("[@blu@New Player@bla@] " + Misc.capitalizeJustFirst(c.playerName) + " @bla@has logged in! Welcome!");
  3832. Server.getServerData().addStarter(c.getMacAddress());
  3833. }
  3834.  
  3835. public void logStuck() {
  3836. String filePath = "./Data/stucklog.txt";
  3837. BufferedWriter bw = null;
  3838.  
  3839. try {
  3840. bw = new BufferedWriter(new FileWriter(filePath, true));
  3841. bw.write("[" + c.playerName + "]: " + "[" + c.connectedFrom + "] " + ": " + " X: " + c.getX() + " Y: "
  3842. + c.getY() + "]");
  3843. bw.newLine();
  3844. bw.flush();
  3845. } catch (IOException ioe) {
  3846. ioe.printStackTrace();
  3847. } finally {
  3848. if (bw != null) {
  3849. try {
  3850. bw.close();
  3851. } catch (IOException ignored) {
  3852. }
  3853. }
  3854. }
  3855. }
  3856.  
  3857. public void logEmote(int id, String information) {
  3858. String filePath = "./Data/" + c.playerName + ".txt";
  3859. BufferedWriter bw = null;
  3860.  
  3861. try {
  3862. bw = new BufferedWriter(new FileWriter(filePath, true));
  3863. bw.write("[" + id + "] - " + information);
  3864. bw.newLine();
  3865. bw.flush();
  3866. } catch (IOException ioe) {
  3867. ioe.printStackTrace();
  3868. } finally {
  3869. if (bw != null) {
  3870. try {
  3871. bw.close();
  3872. } catch (IOException ignored) {
  3873. }
  3874. }
  3875. }
  3876. }
  3877.  
  3878. public void sendFrame34P2(int item, int slot, int frame, int amount) {
  3879. c.outStream.createFrameVarSizeWord(34);
  3880. c.outStream.writeWord(frame);
  3881. c.outStream.writeByte(slot);
  3882. c.outStream.writeWord(item + 1);
  3883. c.outStream.writeByte(255);
  3884. c.outStream.writeDWord(amount);
  3885. c.outStream.endFrameVarSizeWord();
  3886. }
  3887.  
  3888. public int getWearingAmount() {
  3889. int count = 0;
  3890. for (int j = 0; j < c.playerEquipment.length; j++) {
  3891. if (c.playerEquipment[j] > 0)
  3892. count++;
  3893. }
  3894. return count;
  3895. }
  3896.  
  3897. public static boolean ringOfCharosTeleport(final Player player) {
  3898. Task task = player.getSlayer().getTask().orElse(null);
  3899.  
  3900. if (task == null) {
  3901. player.sendMessage("You need a slayer task to use this.");
  3902. return false;
  3903. }
  3904. if (player.inWild()) {
  3905. player.sendMessage("You cannot use this from the wilderness.");
  3906. return false;
  3907. }
  3908. int x = task.getTeleportLocation()[0];
  3909. int y = task.getTeleportLocation()[1];
  3910. int z = task.getTeleportLocation()[2];
  3911. if (x == -1 && y == -1 && z == -1) {
  3912. player.sendMessage("This task cannot be easily teleported to.");
  3913. return false;
  3914. }
  3915.  
  3916. player.sendMessage("You are teleporting to your task of " + task.getPrimaryName() + ".");
  3917. player.getPA().startTeleport(x, y, z, "modern", false);
  3918. return true;
  3919. }
  3920.  
  3921. public void useOperate(int itemId) {
  3922. ItemDefinition def = ItemDefinition.forId(itemId);
  3923. Optional<DegradableItem> d = DegradableItem.forId(itemId);
  3924. if (d.isPresent()) {
  3925. Degrade.checkPercentage(c, itemId);
  3926. return;
  3927. }
  3928. switch (itemId) {
  3929. case 9948: // Teleport to puro puro
  3930. case 9949:
  3931. if (WheatPortalEvent.xLocation > 0 && WheatPortalEvent.yLocation > 0) {
  3932. c.getPA().spellTeleport(WheatPortalEvent.xLocation + 1, WheatPortalEvent.yLocation + 1, 0, false);
  3933. } else {
  3934. c.sendMessage("There is currently no portal available, wait 5 minutes.");
  3935. return;
  3936. }
  3937. break;
  3938. case 12904:
  3939. c.sendMessage(
  3940. "The toxic staff of the dead has " + c.getToxicStaffOfTheDeadCharge() + " charges remaining.");
  3941. break;
  3942. case 13199:
  3943. case 13197:
  3944. c.sendMessage("The " + def.getName() + " has " + c.getSerpentineHelmCharge() + " charges remaining.");
  3945. break;
  3946. case 11907:
  3947. case 12899:
  3948. int charge = itemId == 11907 ? c.getTridentCharge() : c.getToxicTridentCharge();
  3949. c.sendMessage("The " + def.getName() + " has " + charge + " charges remaining.");
  3950. break;
  3951. case 12926:
  3952. def = ItemDefinition.forId(c.getToxicBlowpipeAmmo());
  3953. c.sendMessage("The blowpipe has " + c.getToxicBlowpipeAmmoAmount() + " " + def.getName() + " and "
  3954. + c.getToxicBlowpipeCharge() + " charge remaining.");
  3955. break;
  3956. case 19675:
  3957. c.sendMessage("Your Arclight has " + c.getArcLightCharge() + " charges remaining.");
  3958. break;
  3959. case 12931:
  3960. def = ItemDefinition.forId(itemId);
  3961. if (def == null) {
  3962. return;
  3963. }
  3964. c.sendMessage("The " + def.getName() + " has " + c.getSerpentineHelmCharge() + " charge remaining.");
  3965. break;
  3966.  
  3967. case 13136:
  3968. if (c.inClanWars() || c.inClanWarsSafe()) {
  3969. c.sendMessage("@cr10@You can not teleport from here, speak to the doomsayer to leave.");
  3970. return;
  3971. }
  3972. if (Server.getMultiplayerSessionListener().inAnySession(c)) {
  3973. c.sendMessage("You cannot do that right now.");
  3974. return;
  3975. }
  3976. if (c.wildLevel > Config.NO_TELEPORT_WILD_LEVEL) {
  3977. c.sendMessage(
  3978. "You can't teleport above level " + Config.NO_TELEPORT_WILD_LEVEL + " in the wilderness.");
  3979. return;
  3980. }
  3981. c.getPA().spellTeleport(3426, 2927, 0, false);
  3982. break;
  3983.  
  3984. case 13125:
  3985. case 13126:
  3986. case 13127:
  3987. if (c.getRunEnergy() < 100) {
  3988. if (c.getRechargeItems().useItem(itemId)) {
  3989. c.getRechargeItems().replenishRun(50);
  3990. }
  3991. } else {
  3992. c.sendMessage("You already have full run energy.");
  3993. return;
  3994. }
  3995. break;
  3996.  
  3997. case 13128:
  3998. if (c.getRunEnergy() < 100) {
  3999. if (c.getRechargeItems().useItem(itemId)) {
  4000. c.getRechargeItems().replenishRun(100);
  4001. }
  4002. } else {
  4003. c.sendMessage("You already have full run energy.");
  4004. return;
  4005. }
  4006. break;
  4007.  
  4008. case 13117:
  4009. if (c.playerLevel[5] < c.getPA().getLevelForXP(c.playerXP[5])) {
  4010. if (c.getRechargeItems().useItem(itemId)) {
  4011. c.getRechargeItems().replenishPrayer(4);
  4012. }
  4013. } else {
  4014. c.sendMessage("You already have full prayer points.");
  4015. return;
  4016. }
  4017. break;
  4018. case 13118:
  4019. if (c.playerLevel[5] < c.getPA().getLevelForXP(c.playerXP[5])) {
  4020. if (c.getRechargeItems().useItem(itemId)) {
  4021. c.getRechargeItems().replenishPrayer(2);
  4022. }
  4023. } else {
  4024. c.sendMessage("You already have full prayer points.");
  4025. return;
  4026. }
  4027. break;
  4028. case 13119:
  4029. case 13120:
  4030. if (c.playerLevel[5] < c.getPA().getLevelForXP(c.playerXP[5])) {
  4031. if (c.getRechargeItems().useItem(itemId)) {
  4032. c.getRechargeItems().replenishPrayer(1);
  4033. }
  4034. } else {
  4035. c.sendMessage("You already have full prayer points.");
  4036. return;
  4037. }
  4038. break;
  4039. case 13111:
  4040. if (c.getRechargeItems().useItem(itemId)) {
  4041. c.getPA().spellTeleport(3236, 3946, 0, false);
  4042. }
  4043. break;
  4044. case 10507:
  4045. if (c.getItems().isWearingItem(10507)) {
  4046. if (System.currentTimeMillis() - c.lastPerformedEmote < 2500)
  4047. return;
  4048. c.startAnimation(6382);
  4049. c.gfx0(263);
  4050. c.lastPerformedEmote = System.currentTimeMillis();
  4051. }
  4052. break;
  4053.  
  4054. case 20243:
  4055. if (System.currentTimeMillis() - c.lastPerformedEmote < 2500)
  4056. return;
  4057. c.startAnimation(7268);
  4058. c.lastPerformedEmote = System.currentTimeMillis();
  4059. break;
  4060.  
  4061. case 4212:
  4062. case 4214:
  4063. case 4215:
  4064. case 4216:
  4065. case 4217:
  4066. case 4218:
  4067. case 4219:
  4068. case 4220:
  4069. case 4221:
  4070. case 4222:
  4071. case 4223:
  4072. c.sendMessage("You currently have " + (250 - c.crystalBowArrowCount)
  4073. + " charges left before degradation to " + (c.playerEquipment[3] == 4223 ? "Crystal seed"
  4074. : ItemAssistant.getItemName(c.playerEquipment[3] + 1)));
  4075. break;
  4076.  
  4077. case 11864:
  4078. case 11865:
  4079. case 19639:
  4080. case 19641:
  4081. case 19643:
  4082. case 19645:
  4083. case 19647:
  4084. case 19649:
  4085. if (!c.getSlayer().getTask().isPresent()) {
  4086. c.sendMessage("You do not have a task!");
  4087. return;
  4088. }
  4089. c.sendMessage("I currently have @blu@" + c.getSlayer().getTaskAmount() + " "
  4090. + c.getSlayer().getTask().get().getPrimaryName() + "@bla@ to kill.");
  4091. c.getPA().closeAllWindows();
  4092. break;
  4093.  
  4094. case 4202:
  4095. case 9786:
  4096. case 9787:
  4097. ringOfCharosTeleport(c);
  4098. break;
  4099.  
  4100. case 11283:
  4101. case 11284:
  4102. if (Boundary.isIn(c, Zulrah.BOUNDARY) || Boundary.isIn(c, Boundary.CERBERUS_BOSSROOMS)
  4103. || Boundary.isIn(c, Boundary.SKOTIZO_BOSSROOM)) {
  4104. return;
  4105. }
  4106. DragonfireShieldEffect dfsEffect = new DragonfireShieldEffect();
  4107. if (c.npcIndex <= 0 && c.playerIndex <= 0) {
  4108. return;
  4109. }
  4110. if (c.getHealth().getAmount() <= 0 || c.isDead) {
  4111. return;
  4112. }
  4113. if (dfsEffect.isExecutable(c)) {
  4114. Damage damage = new Damage(Misc.random(25));
  4115. if (c.playerIndex > 0) {
  4116. Player target = PlayerHandler.players[c.playerIndex];
  4117. if (Objects.isNull(target)) {
  4118. return;
  4119. }
  4120. c.attackTimer = 7;
  4121. dfsEffect.execute(c, target, damage);
  4122. c.setLastDragonfireShieldAttack(System.currentTimeMillis());
  4123. } else if (c.npcIndex > 0) {
  4124. NPC target = NPCHandler.npcs[c.npcIndex];
  4125. if (Objects.isNull(target)) {
  4126. return;
  4127. }
  4128. c.attackTimer = 7;
  4129. dfsEffect.execute(c, target, damage);
  4130. c.setLastDragonfireShieldAttack(System.currentTimeMillis());
  4131. }
  4132. }
  4133. break;
  4134.  
  4135. case 1712:
  4136. case 1710:
  4137. case 1708:
  4138. case 1706:
  4139. if (c.inClanWars() || c.inClanWarsSafe()) {
  4140. c.sendMessage("@cr10@You can not teleport from here, speak to the doomsayer to leave.");
  4141. return;
  4142. }
  4143. c.getPA().handleGlory(itemId);
  4144. c.itemUsing = itemId;
  4145. c.isOperate = true;
  4146. break;
  4147. case 11968:
  4148. case 11970:
  4149. case 11105:
  4150. case 11107:
  4151. case 11109:
  4152. case 11111:
  4153. if (c.inClanWars() || c.inClanWarsSafe()) {
  4154. c.sendMessage("@cr10@You can not teleport from here, speak to the doomsayer to leave.");
  4155. return;
  4156. }
  4157. c.getPA().handleSkills(itemId);
  4158. c.itemUsing = itemId;
  4159. c.isOperate = true;
  4160. break;
  4161. case 2552:
  4162. case 2554:
  4163. case 2556:
  4164. case 2558:
  4165. case 2560:
  4166. case 2562:
  4167. case 2564:
  4168. case 2566:
  4169. c.getPA().spellTeleport(3304, 3130, 0, false);
  4170. break;
  4171.  
  4172. /*
  4173. * Max capes
  4174. */
  4175. case 13280:
  4176. case 13329:
  4177. case 13337:
  4178. case 13331:
  4179. case 13333:
  4180. case 13335:
  4181. case 20760:
  4182. c.getDH().sendDialogues(76, 1);
  4183. break;
  4184.  
  4185. /*
  4186. * Crafting cape
  4187. */
  4188. case 9780:
  4189. case 9781:
  4190. c.getPA().startTeleport(2936, 3283, 0, "modern", false);
  4191. break;
  4192.  
  4193. /*
  4194. * Magic skillcape
  4195. */
  4196. case 9762:
  4197. case 9763:
  4198. if (!Boundary.isIn(c, Boundary.EDGEVILLE_PERIMETER)) {
  4199. c.sendMessage("This cape can only be operated within the edgeville perimeter.");
  4200. return;
  4201. }
  4202. if (c.inWild()) {
  4203. return;
  4204. }
  4205. if (c.playerMagicBook == 0) {
  4206. c.playerMagicBook = 1;
  4207. c.setSidebarInterface(6, 12855);
  4208. c.autocasting = false;
  4209. c.sendMessage("An ancient wisdomin fills your mind.");
  4210. c.getPA().resetAutocast();
  4211. } else if (c.playerMagicBook == 1) {
  4212. c.sendMessage("You switch to the lunar spellbook.");
  4213. c.setSidebarInterface(6, 29999);
  4214. c.playerMagicBook = 2;
  4215. c.autocasting = false;
  4216. c.autocastId = -1;
  4217. c.getPA().resetAutocast();
  4218. } else if (c.playerMagicBook == 2) {
  4219. c.setSidebarInterface(6, 1151);
  4220. c.playerMagicBook = 0;
  4221. c.autocasting = false;
  4222. c.sendMessage("You feel a drain on your memory.");
  4223. c.autocastId = -1;
  4224. c.getPA().resetAutocast();
  4225. }
  4226. break;
  4227. }
  4228. }
  4229.  
  4230. public void getSpeared(int otherX, int otherY, int distance) {
  4231. int x = c.absX - otherX;
  4232. int y = c.absY - otherY;
  4233. int xOffset = 0;
  4234. int yOffset = 0;
  4235. DuelSession session = (DuelSession) Server.getMultiplayerSessionListener().getMultiplayerSession(c,
  4236. MultiplayerSessionType.DUEL);
  4237. if (Objects.nonNull(session) && session.getStage().getStage() == MultiplayerSessionStage.FURTHER_INTERATION) {
  4238. c.sendMessage("You cannot use this special whilst in the duel arena.");
  4239. return;
  4240. }
  4241. if (x > 0) {
  4242. if (Region.getClipping(c.getX() + distance, c.getY(), c.heightLevel, 1, 0)) {
  4243. xOffset = distance;
  4244. }
  4245. } else if (x < 0) {
  4246. if (Region.getClipping(c.getX() - distance, c.getY(), c.heightLevel, -1, 0)) {
  4247. xOffset = -distance;
  4248. }
  4249. }
  4250. if (y > 0) {
  4251. if (Region.getClipping(c.getX(), c.getY() + distance, c.heightLevel, 0, 1)) {
  4252. yOffset = distance;
  4253. }
  4254. } else if (y < 0) {
  4255. if (Region.getClipping(c.getX(), c.getY() - distance, c.heightLevel, 0, -1)) {
  4256. yOffset = -distance;
  4257. }
  4258. }
  4259. moveCheck(xOffset, yOffset, distance);
  4260. c.lastSpear = System.currentTimeMillis();
  4261. }
  4262.  
  4263. private void moveCheck(int x, int y, int distance) {
  4264. PathFinder.getPathFinder().findRoute(c, c.getX() + x, c.getY() + y, true, 1, 1);
  4265. }
  4266.  
  4267. public void resetTzhaar() {
  4268. c.waveId = -1;
  4269. c.tzhaarToKill = -1;
  4270. c.tzhaarKilled = -1;
  4271. }
  4272.  
  4273. public boolean checkForPlayer(int x, int y) {
  4274. for (Player p : PlayerHandler.players) {
  4275. if (p != null) {
  4276. if (p.getX() == x && p.getY() == y)
  4277. return true;
  4278. }
  4279. }
  4280. return false;
  4281. }
  4282.  
  4283. public void checkPouch(int i) {
  4284. if (i < 0)
  4285. return;
  4286. c.sendMessage("This pouch has " + c.pouches[i] + " rune ess in it.");
  4287. }
  4288.  
  4289. public void fillPouch(int i) {
  4290. if (i < 0)
  4291. return;
  4292. int toAdd = c.POUCH_SIZE[i] - c.pouches[i];
  4293. if (toAdd > c.getItems().getItemAmount(1436)) {
  4294. toAdd = c.getItems().getItemAmount(1436);
  4295. }
  4296. if (toAdd > c.POUCH_SIZE[i] - c.pouches[i])
  4297. toAdd = c.POUCH_SIZE[i] - c.pouches[i];
  4298. if (toAdd > 0) {
  4299. c.getItems().deleteItem(1436, toAdd);
  4300. c.pouches[i] += toAdd;
  4301. }
  4302. }
  4303.  
  4304. public void emptyPouch(int i) {
  4305. if (i < 0)
  4306. return;
  4307. int toAdd = c.pouches[i];
  4308. if (toAdd > c.getItems().freeSlots()) {
  4309. toAdd = c.getItems().freeSlots();
  4310. }
  4311. if (toAdd > 0) {
  4312. c.getItems().addItem(1436, toAdd);
  4313. c.pouches[i] -= toAdd;
  4314. }
  4315. }
  4316.  
  4317. /*
  4318. * public void fixAllBarrows() { int totalCost = 0; int cashAmount =
  4319. * c.getItems().getItemAmount(995); for (int j = 0; j < c.playerItems.length;
  4320. * j++) { boolean breakOut = false; for (int i = 0; i <
  4321. * c.getItems().brokenBarrows.length; i++) { if (c.playerItems[j]-1 ==
  4322. * c.getItems().brokenBarrows[i][1]) { if (totalCost + 80000 > cashAmount) {
  4323. * breakOut = true; c.sendMessage("You have run out of money."); break; } else {
  4324. * totalCost += 80000; } c.playerItems[j] = c.getItems().brokenBarrows[i][0]+1;
  4325. * } } if (breakOut) break; } if (totalCost > 0) c.getItems().deleteItem(995,
  4326. * c.getItems().getItemSlot(995), totalCost); }
  4327. */
  4328.  
  4329. public void handleLoginText() {
  4330. // modern
  4331. c.getPA().sendFrame126("Teleport name", 1300); // varrock
  4332. c.getPA().sendFrame126("Description", 1301); // varrock description
  4333. c.getPA().sendFrame126("Teleport name", 1325); // lumbridge
  4334. c.getPA().sendFrame126("Description", 1326); // lumbridge description
  4335. c.getPA().sendFrame126("Teleport name", 1350); // falador
  4336. c.getPA().sendFrame126("Description", 1351); // falador description
  4337. c.getPA().sendFrame126("Teleport name", 1382); // camelot
  4338. c.getPA().sendFrame126("Description", 1383); // camelot description
  4339. c.getPA().sendFrame126("Teleport name", 1415); // ardougne
  4340. c.getPA().sendFrame126("Description", 1416); // ardougne description
  4341. c.getPA().sendFrame126("Teleport name", 1454); // watchtower
  4342. c.getPA().sendFrame126("Description", 1455); // watchtower description
  4343. c.getPA().sendFrame126("Teleport name", 7457); // trollheim
  4344. c.getPA().sendFrame126("Description", 7458); // trollheim description
  4345. c.getPA().sendFrame126("Teleport name", 18472); // ape atoll
  4346. c.getPA().sendFrame126("Description", 18473); // ape atoll description
  4347.  
  4348. }
  4349.  
  4350. public void handleWeaponStyle() {
  4351. if (c.fightMode == 0) {
  4352. c.getPA().sendFrame36(43, c.fightMode);
  4353. } else if (c.fightMode == 1) {
  4354. c.getPA().sendFrame36(43, 3);
  4355. } else if (c.fightMode == 2) {
  4356. c.getPA().sendFrame36(43, 1);
  4357. } else if (c.fightMode == 3) {
  4358. c.getPA().sendFrame36(43, 2);
  4359. }
  4360. }
  4361.  
  4362. /**
  4363. *
  4364. * @author Jason MacKeigan (http://www.rune-server.org/members/jason)
  4365. * @date Sep 26, 2014, 12:57:42 PM
  4366. */
  4367. public enum PointExchange {
  4368. PK_POINTS, VOTE_POINTS, BLOOD_POINTS
  4369. }
  4370.  
  4371. /**
  4372. * Exchanges all items in the player owners inventory to a specific to whatever
  4373. * the exchange specifies. Its up to the switch statement to make the
  4374. * conversion.
  4375. *
  4376. * @param pointVar
  4377. * the point exchange we're trying to make
  4378. * @param itemId
  4379. * the item id being exchanged
  4380. * @param exchangeRate
  4381. * the exchange rate for each item
  4382. */
  4383. public void exchangeItems(PointExchange pointVar, int itemId, int exchangeRate) {
  4384. try {
  4385. int amount = c.getItems().getItemAmount(itemId);
  4386. String pointAlias = Misc.capitalizeJustFirst(pointVar.name().toLowerCase().replaceAll("_", " "));
  4387. if (exchangeRate <= 0 || itemId < 0) {
  4388. throw new IllegalStateException();
  4389. }
  4390. if (amount <= 0) {
  4391. c.getDH().sendStatement("You do not have the items required to exchange", "for " + pointAlias + ".");
  4392. c.nextChat = -1;
  4393. return;
  4394. }
  4395. int exchange = amount * exchangeRate;
  4396. // int total = amount;
  4397. c.getItems().deleteItem2(itemId, amount);
  4398. switch (pointVar) {
  4399. case PK_POINTS:
  4400. c.pkp += exchange;
  4401. c.refreshQuestTab(0);
  4402. break;
  4403.  
  4404. case VOTE_POINTS:
  4405. c.votePoints += exchange;
  4406. c.refreshQuestTab(2);
  4407. break;
  4408. case BLOOD_POINTS:
  4409. c.bloodPoints += amount;
  4410. exchange = amount;
  4411. break;
  4412. }
  4413. c.getDH().sendStatement("You exchange " + amount + " currency for " + exchange + " " + pointAlias + ".");
  4414. c.nextChat = -1;
  4415. } catch (IllegalStateException exception) {
  4416. Misc.println("WARNING: Illegal state has been reached.");
  4417. exception.printStackTrace();
  4418. System.out.println("PlayerAssistant - Check for error");
  4419. }
  4420. }
  4421.  
  4422. /**
  4423. * Sends some information to the client about screen fading.
  4424. *
  4425. * @param text
  4426. * the text that will be displayed in the center of the screen
  4427. * @param state
  4428. * the state should be either 0, -1, or 1.
  4429. * @param seconds
  4430. * the amount of time in seconds it takes for the fade to transition.
  4431. * <p>
  4432. * If the state is -1 then the screen fades from black to
  4433. * transparent. When the state is +1 the screen fades from
  4434. * transparent to black. If the state is 0 all drawing is stopped.
  4435. */
  4436. public void sendScreenFade(String text, int state, int seconds) {
  4437. if (c == null || c.getOutStream() == null) {
  4438. return;
  4439. }
  4440. if (seconds < 1 && state != 0) {
  4441. throw new IllegalArgumentException("The amount of seconds cannot be less than one.");
  4442. }
  4443. c.getOutStream().createFrameVarSize(9);
  4444. c.getOutStream().writeString(text);
  4445. c.getOutStream().writeByte(state);
  4446. c.getOutStream().writeByte(seconds);
  4447. c.getOutStream().endFrameVarSize();
  4448. }
  4449.  
  4450. public void stillCamera(int x, int y, int height, int speed, int angle) {
  4451. c.outStream.createFrame(177);
  4452. c.outStream.writeByte(x / 64);
  4453. c.outStream.writeByte(y / 64);
  4454. c.outStream.writeWord(height);
  4455. c.outStream.writeByte(speed);
  4456. c.outStream.writeByte(angle);
  4457. }
  4458.  
  4459. public void spinCamera(int i1, int i2, int i3, int i4, int i5) {
  4460. c.outStream.createFrame(166);
  4461. c.outStream.writeByte(i1);
  4462. c.outStream.writeByte(i2);
  4463. c.outStream.writeWord(i3);
  4464. c.outStream.writeByte(i4);
  4465. c.outStream.writeByte(i5);
  4466. }
  4467.  
  4468. public void resetCamera() {
  4469. c.outStream.createFrame(107);
  4470. c.updateRequired = true;
  4471. c.appearanceUpdateRequired = true;
  4472. }
  4473.  
  4474. /*
  4475. * c.getHealth().removeAllStatuses(); c.getHealth().reset(); c.setRunEnergy(99);
  4476. * c.sendMessage("@red@Your hitpoints and run energy have been restored!"); if
  4477. * (c.specRestore > 0) { c.sendMessage("You have to wait another " +
  4478. * c.specRestore + " seconds to restore special."); } else { c.specRestore =
  4479. * 120; c.specAmount = 10.0;
  4480. * c.getItems().addSpecialBar(c.playerEquipment[c.playerWeapon]); c.
  4481. * sendMessage("Your special attack has been restored. You can restore it again in 3 minutes."
  4482. * ); }
  4483. */
  4484.  
  4485. public static void switchSpellBook(Player c) {
  4486. switch (c.playerMagicBook) {
  4487. case 0:
  4488. c.playerMagicBook = 1;
  4489. c.setSidebarInterface(6, 838);
  4490. c.sendMessage("An ancient wisdomin fills your mind.");
  4491. break;
  4492. case 1:
  4493. c.sendMessage("You switch to the lunar spellbook.");
  4494. c.setSidebarInterface(6, 29999);
  4495. c.playerMagicBook = 2;
  4496. break;
  4497. case 2:
  4498. c.setSidebarInterface(6, 938);
  4499. c.playerMagicBook = 0;
  4500. c.sendMessage("You feel a drain on your memory.");
  4501. break;
  4502. }
  4503. }
  4504.  
  4505. public static void refreshHealthWithoutPenalty(Player c) {
  4506. c.getHealth().setAmount(c.getHealth().getMaximum() + 2);
  4507. c.playerLevel[5] = c.getPA().getLevelForXP(c.playerXP[5]) + 2;
  4508. c.startAnimation(645);
  4509. c.setRunEnergy(100);
  4510. c.getPA().refreshSkill(5);
  4511. c.sendMessage("You recharge your hitpoints, prayer and run energy.");
  4512. }
  4513.  
  4514. public static void refreshSpecialAndHealth(Player c) {
  4515. c.getHealth().removeAllStatuses();
  4516. c.getHealth().reset();
  4517. c.setRunEnergy(100);
  4518. c.sendMessage("@red@Your hitpoints and run energy have been restored!");
  4519. if (c.specRestore > 0) {
  4520. c.sendMessage("You have to wait another " + c.specRestore + " seconds to restore special.");
  4521. } else {
  4522. c.specRestore = 120;
  4523. c.specAmount = 10.0;
  4524. c.getItems().addSpecialBar(c.playerEquipment[c.playerWeapon]);
  4525. c.sendMessage("Your special attack has been restored. You can restore it again in 3 minutes.");
  4526. }
  4527. }
  4528.  
  4529. public void icePath() {
  4530. int random = Misc.random(20);
  4531. if (random == 5) {
  4532. c.startAnimation(767);
  4533. c.appendDamage(Misc.random(1) + 1, Hitmark.HIT);
  4534. c.resetWalkingQueue();
  4535. c.forcedChat("Ouch!");
  4536. }
  4537. }
  4538.  
  4539. public static void noteItems(Player player, int item) {
  4540. ItemDefinition definition = ItemDefinition.forId(item);
  4541. ItemDefinition notedDefinition = ItemDefinition.forId(item + 1);
  4542. if (definition == null || notedDefinition == null
  4543. || !notedDefinition.getName().contains(definition.getName())) {
  4544. player.sendMessage("You cannot note this item, it is unnotable.");
  4545. return;
  4546. }
  4547. if (!player.getItems().playerHasItem(item, 1)) {
  4548. return;
  4549. }
  4550. for (int index = 0; index < player.playerItems.length; index++) {
  4551. int amount = player.playerItemsN[index];
  4552. if (player.playerItems[index] == item + 1 && amount > 0) {
  4553. player.getItems().deleteItem(item, index, amount);
  4554. player.getItems().addItem(item + 1, amount);
  4555. }
  4556. }
  4557. player.getDH().sendStatement("You note all your " + definition.getName() + ".");
  4558. player.nextChat = -1;
  4559. }
  4560.  
  4561. public static void decantHerbs(Player player, int item) {
  4562. ItemDefinition definition = ItemDefinition.forId(item);
  4563. ItemDefinition notedDefinition = ItemDefinition.forId(item + 1);
  4564. if (definition == null || notedDefinition == null
  4565. || !notedDefinition.getName().contains(definition.getName())) {
  4566. player.sendMessage("You cannot note this item, it is unnotable.");
  4567. return;
  4568. }
  4569. if (!(item >= 249) || !(item <= 270) && !(item == 2481) && !(item == 2998) && !(item == 3000)) {
  4570. player.sendMessage("The master farmer cannot assist you with this.");
  4571. return;
  4572. }
  4573. for (int index = 0; index < player.playerItems.length; index++) {
  4574. int amount = player.playerItemsN[index];
  4575. if (player.playerItems[index] == item + 1 && amount > 0) {
  4576. player.getItems().deleteItem(item, index, amount);
  4577. player.getItems().addItem(item + 1, amount);
  4578. }
  4579. }
  4580. player.getDH().sendStatement("You note all your " + definition.getName() + ".");
  4581. player.nextChat = -1;
  4582. }
  4583.  
  4584. public static void decantResource(Player player, int item) {
  4585. ItemDefinition definition = ItemDefinition.forId(item);
  4586. ItemDefinition notedDefinition = ItemDefinition.forId(item + 1);
  4587. int cost = 0;
  4588. if (definition == null || notedDefinition == null
  4589. || !notedDefinition.getName().contains(definition.getName())) {
  4590. player.sendMessage("You cannot not this item, it is unnotable.");
  4591. return;
  4592. }
  4593. if (!isSkillAreaItem(item)) {
  4594. player.sendMessage("You can only note items that are resources obtained from skilling in this area.");
  4595. return;
  4596. }
  4597. if (!player.getRights().isOrInherits(Right.CONTRIBUTOR) && !player.getRechargeItems().hasItem(13111)) {
  4598. int inventoryAmount = player.getItems().getItemAmount(item);
  4599. if (inventoryAmount < 4) {
  4600. player.sendMessage("You need at least 4 of this item to note it.");
  4601. return;
  4602. }
  4603. cost = (int) Math.round(inventoryAmount / 4.0D);
  4604. if (!player.getItems().playerHasItem(item, cost)) {
  4605. return;
  4606. }
  4607. player.getItems().deleteItem2(item, cost);
  4608. }
  4609. for (int index = 0; index < player.playerItems.length; index++) {
  4610. int amount = player.playerItemsN[index];
  4611. if (player.playerItems[index] == item + 1 && amount > 0) {
  4612. player.getItems().deleteItem(item, index, amount);
  4613. player.getItems().addItem(item + 1, amount);
  4614. }
  4615. }
  4616. if (!player.getRights().isOrInherits(Right.CONTRIBUTOR)) {
  4617. player.getDH().sendStatement(
  4618. "You note most of your " + definition.getName() + " at the cost of " + cost + " resources.");
  4619. } else {
  4620. player.getDH().sendStatement("You note all your " + definition.getName() + ".");
  4621. }
  4622. player.nextChat = -1;
  4623. }
  4624.  
  4625. private static boolean isSkillAreaItem(int item) {
  4626. for (Mineral m : Mineral.values()) {
  4627. if (Misc.linearSearch(m.getMineralReturn().inclusives(), item) != -1) {
  4628. return true;
  4629. }
  4630. }
  4631. for (Tree t : Tree.values()) {
  4632. if (t.getWood() == item)
  4633. return true;
  4634. }
  4635. for (int[] fish : Fishing.data) {
  4636. if (fish[4] == item)
  4637. return true;
  4638. }
  4639. for (int cookFish : Cooking.fishIds) {
  4640. if (cookFish == item)
  4641. return true;
  4642. }
  4643. for (Bars b : Smelting.Bars.values()) {
  4644. if (b.getBar() == item)
  4645. return true;
  4646. }
  4647. return false;
  4648. }
  4649.  
  4650. public void sendEntityTarget(int state, Entity entity) {
  4651. if (c.disconnected || c.getOutStream() == null) {
  4652. return;
  4653. }
  4654. Stream stream = c.getOutStream();
  4655. stream.createFrameVarSize(222);
  4656. stream.writeByte(state);
  4657. if (state != 0) {
  4658. stream.writeWord(entity.getIndex());
  4659. stream.writeWord(entity.getHealth().getAmount());
  4660. stream.writeWord(entity.getHealth().getMaximum());
  4661. }
  4662. stream.endFrameVarSize();
  4663. }
  4664.  
  4665. public void sendGameTimer(ClientGameTimer timer, TimeUnit unitOfTime, int duration) {
  4666. if (c == null || c.disconnected) {
  4667. return;
  4668. }
  4669. Stream stream = c.getOutStream();
  4670. if (stream == null) {
  4671. return;
  4672. }
  4673. // System.out.println(duration);
  4674. int seconds = (int) Long.min(unitOfTime.toSeconds(duration), 65535);
  4675. // System.out.println(seconds);
  4676. stream.createFrame(223);
  4677. stream.writeByte(timer.getTimerId());
  4678. stream.writeWord(seconds);
  4679. c.flushOutStream();
  4680. }
  4681.  
  4682. public void sendExperienceDrop(boolean increase, long amount, int... skills) {
  4683. if (c.disconnected || c.getOutStream() == null) {
  4684. return;
  4685. }
  4686. List<Integer> illegalSkills = new ArrayList<>();
  4687.  
  4688. for (int index = 0; index < skills.length; index++) {
  4689. int skillId = skills[index];
  4690. if (skillId < 0 || skillId > Skill.MAXIMUM_SKILL_ID) {
  4691. illegalSkills.add(index);
  4692. }
  4693. }
  4694. if (!illegalSkills.isEmpty()) {
  4695. skills = ArrayUtils.removeAll(skills,
  4696. ArrayUtils.toPrimitive(illegalSkills.toArray(new Integer[illegalSkills.size()])));
  4697. }
  4698. if (ArrayUtils.isEmpty(skills)) {
  4699. return;
  4700. }
  4701. if (increase) {
  4702. c.setExperienceCounter(c.getExperienceCounter() + amount);
  4703. }
  4704.  
  4705. Stream stream = c.getOutStream();
  4706.  
  4707. stream.createFrameVarSize(11);
  4708. stream.writeQWord(amount);
  4709. stream.writeByte(skills.length);
  4710. for (int skillId : skills) {
  4711. stream.writeByte(skillId);
  4712. }
  4713. stream.endFrameVarSize();
  4714. }
  4715.  
  4716. public void sendConfig(final int id, final int state) {
  4717. if (this.c.getOutStream() != null && this.c != null) {
  4718. if (state < 128) {
  4719. this.c.getOutStream().createFrame(36);
  4720. this.c.getOutStream().writeWordBigEndian(id);
  4721. this.c.getOutStream().writeByte(state);
  4722. } else {
  4723. this.c.getOutStream().createFrame(87);
  4724. this.c.getOutStream().writeWordBigEndian_dup(id);
  4725. this.c.getOutStream().writeDWord_v1(state);
  4726. }
  4727. this.c.flushOutStream();
  4728. }
  4729. }
  4730.  
  4731. public void sendTradingPost(int frame, int item, int slot, int amount) {
  4732. if (c.getOutStream() != null && c != null) {
  4733. c.getOutStream().createFrameVarSizeWord(34);
  4734. c.getOutStream().writeWord(frame);
  4735. c.getOutStream().writeByte(slot);
  4736. c.getOutStream().writeWord(item + 1);
  4737. c.getOutStream().writeByte(255);
  4738. c.getOutStream().writeDWord(amount);
  4739. c.getOutStream().endFrameVarSizeWord();
  4740. }
  4741. }
  4742.  
  4743. /**
  4744. * Creates a Solo instance of the player for whatever choosen boss
  4745. *
  4746. * @param i
  4747. */
  4748. public void createSoloInstance(int i) {
  4749. if (!c.getItems().playerHasItem(995, 400000)) {
  4750. c.sendMessage("Instancing a boss costs 400k!");
  4751. removeAllWindows();
  4752. return;
  4753. }
  4754. InstanceSoloFight isf = c.createSoloFight();
  4755. if (isf == null) {
  4756. c.sendMessage("Could not find proper instanced area! Contact developer!");
  4757. return;
  4758. }
  4759. // Delete items after, incase there is no spot found
  4760. c.getItems().deleteItem(995, 400000);
  4761. removeAllWindows();
  4762.  
  4763. // Example 239 = KBD
  4764. c.getSoloFight().init(i, c);
  4765. }
  4766.  
  4767. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement