Advertisement
Guest User

WorldPacketsDecoder

a guest
Jun 1st, 2016
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 64.86 KB | None | 0 0
  1. package com.rs.net.decoders;
  2.  
  3. import com.rs.game.Animation;
  4. import com.rs.game.Graphics;
  5. import com.rs.game.World;
  6. import com.rs.game.WorldObject;
  7. import com.rs.game.WorldTile;
  8. import com.rs.game.item.FloorItem;
  9. import com.rs.game.item.Item;
  10. import com.rs.game.minigames.clanwars.ClanWars;
  11. import com.rs.game.npc.NPC;
  12. import com.rs.game.npc.familiar.Familiar;
  13. import com.rs.game.npc.familiar.Familiar.SpecialAttack;
  14. import com.rs.game.player.ChatMessage;
  15. import com.rs.game.player.CoordsEvent;
  16. import com.rs.game.player.Inventory;
  17. import com.rs.game.player.LogicPacket;
  18. import com.rs.game.player.Player;
  19. import com.rs.game.player.PublicChatMessage;
  20. import com.rs.game.player.RouteEvent;
  21. import com.rs.game.player.Skills;
  22. import com.rs.game.player.actions.Firemaking;
  23. import com.rs.game.player.actions.PlayerCombat;
  24. import com.rs.game.player.actions.PlayerFollow;
  25. import com.rs.game.player.actions.Summoning;
  26. import com.rs.game.player.clans.ClansManager;
  27. import com.rs.game.player.clans.clancitadels.ClanCitadel;
  28. import com.rs.game.player.content.Commands;
  29. import com.rs.game.player.content.FortuneWell;
  30. import com.rs.game.player.content.FriendChatsManager;
  31. import com.rs.game.player.content.Magic;
  32. import com.rs.game.player.content.SkillCapeCustomizer;
  33. import com.rs.io.InputStream;
  34. import com.rs.io.OutputStream;
  35. import com.rs.net.Session;
  36. import com.rs.net.decoders.handlers.ButtonHandler;
  37. import com.rs.net.decoders.handlers.InventoryOptionsHandler;
  38. import com.rs.net.decoders.handlers.NPCHandler;
  39. import com.rs.net.decoders.handlers.ObjectHandler;
  40. import com.rs.utils.Colors;
  41. import com.rs.utils.DisplayNames;
  42. import com.rs.utils.ItemExamines;
  43. import com.rs.utils.StarterMap;
  44. import com.rs.utils.Utils;
  45. import com.rs.utils.huffman.Huffman;
  46. import com.rs.game.player.content.Shop;
  47. import com.rs.game.player.dialogues.Banker;
  48.  
  49. public final class WorldPacketsDecoder extends Decoder {
  50.  
  51. private static final byte[] PACKET_SIZES = new byte[104];
  52.  
  53. private final static int WALKING_PACKET = 8;
  54. private final static int MINI_WALKING_PACKET = 58;
  55. public final static int ACTION_BUTTON1_PACKET = 14;
  56. private final static int PLAYER_OPTION_5_PACKET = 77;
  57. public final static int ACTION_BUTTON2_PACKET = 67;
  58. private final static int ENTER_LONG_TEXT_PACKET = 48;
  59. public final static int ACTION_BUTTON3_PACKET = 5;
  60. public final static int ACTION_BUTTON4_PACKET = 55;
  61. public final static int ACTION_BUTTON5_PACKET = 68;
  62. public final static int ACTION_BUTTON6_PACKET = 90;
  63. public final static int ACTION_BUTTON7_PACKET = 6;
  64. public final static int ACTION_BUTTON8_PACKET = 32;
  65. public final static int ACTION_BUTTON9_PACKET = 27;
  66. public final static int WORLD_MAP_CLICK = 38;
  67. public final static int ACTION_BUTTON10_PACKET = 96;
  68. public final static int RECEIVE_PACKET_COUNT_PACKET = 33;
  69. private final static int PUBLIC_QUICK_CHAT_PACKET = 86;
  70. private final static int SEND_FRIEND_QUICK_CHAT_PACKET = 0;
  71. private final static int MAGIC_ON_ITEM_PACKET = -1;
  72. private final static int PLAYER_OPTION_4_PACKET = 17;
  73. private final static int MOVE_CAMERA_PACKET = 103;
  74. private final static int INTERFACE_ON_OBJECT = 37;
  75. private final static int CLICK_PACKET = -1;
  76. private final static int CLOSE_INTERFACE_PACKET = 54;
  77. private final static int COMMANDS_PACKET = 60;
  78. private final static int ITEM_ON_ITEM_PACKET = 3;
  79. private final static int SCREEN_PACKET = 98;
  80. private final static int CHAT_TYPE_PACKET = 83;
  81. private final static int CHAT_PACKET = 53;
  82. private final static int ADD_FRIEND_PACKET = 89;
  83. private final static int ADD_IGNORE_PACKET = 4;
  84. private final static int MOVE_MOUSE_PACKET = -1;
  85. private final static int KEY_TYPED_PACKET = -1;
  86. private final static int REMOVE_IGNORE_PACKET = 73;
  87. private final static int JOIN_FRIEND_CHAT_PACKET = 36;
  88. private final static int CHANGE_FRIEND_CHAT_PACKET = 22;
  89. private final static int KICK_FRIEND_CHAT_PACKET = 74;
  90. private final static int REMOVE_FRIEND_PACKET = 24;
  91. private final static int SEND_FRIEND_MESSAGE_PACKET = 82;
  92. private final static int OBJECT_CLICK1_PACKET = 26;
  93. private final static int OBJECT_CLICK2_PACKET = 59;
  94. private final static int OBJECT_CLICK3_PACKET = 40;
  95. private final static int OBJECT_CLICK4_PACKET = 23;
  96. private final static int OBJECT_CLICK5_PACKET = 80;
  97. private final static int OBJECT_EXAMINE_PACKET = 25;
  98. private final static int GROUND_ITEM_EXAMINE_PACKET = 102;
  99. private final static int NPC_CLICK1_PACKET = 31;
  100. private final static int NPC_CLICK2_PACKET = 101;
  101. private final static int NPC_CLICK3_PACKET = 34;
  102. private final static int NPC_CLICK4_PACKET = 65;
  103. private final static int ATTACK_NPC = 20;
  104. private final static int PLAYER_OPTION_1_PACKET = 42;
  105. private final static int PLAYER_OPTION_2_PACKET = 46;
  106. private final static int PLAYER_OPTION_6_PACKET = 49;
  107. private final static int ITEM_TAKE_PACKET = 57;
  108. private final static int GROUND_ITEM_INTERACT_PACKET = 62;
  109. private final static int DIALOGUE_CONTINUE_PACKET = 72;
  110. private final static int ENTER_INTEGER_PACKET = 81;
  111. private final static int ENTER_NAME_PACKET = 29;
  112. private final static int ENTER_STRING_PACKET = -1;
  113. private final static int SWITCH_INTERFACE_ITEM_PACKET = 76;
  114. private final static int INTERFACE_ON_PLAYER = 50;
  115. private final static int INTERFACE_ON_NPC = 66;
  116. private final static int COLOR_ID_PACKET = 97;
  117. private final static int CLAN_INVITATION_PACKET = 56;
  118. private final static int PING_PACKET = 21;
  119. private final static int LOGIN_PACKET = 30;
  120. private static final int NPC_EXAMINE_PACKET = 9;
  121. @SuppressWarnings("unused")
  122. private final static int CLAN_NAME_AND_MOTTO_PACKET = 48;
  123. @SuppressWarnings("unused")
  124. private final static int CLAN_FORUM_THREAD_PACKET = 18;
  125. private final static int GE_SEARCH_PACKET = 71;
  126. private final static int UNID_PACKET = 39;
  127.  
  128. static {
  129. loadPacketSizes();
  130. }
  131.  
  132. public static void loadPacketSizes() {
  133. PACKET_SIZES[0] = -1;
  134. PACKET_SIZES[1] = -2;
  135. PACKET_SIZES[2] = -1;
  136. PACKET_SIZES[3] = 16;
  137. PACKET_SIZES[4] = -1;
  138. PACKET_SIZES[5] = 8;
  139. PACKET_SIZES[6] = 8;
  140. PACKET_SIZES[7] = 3;
  141. PACKET_SIZES[8] = -1;
  142. PACKET_SIZES[9] = 3;
  143. PACKET_SIZES[10] = -1;
  144. PACKET_SIZES[11] = -1;
  145. PACKET_SIZES[12] = -1;
  146. PACKET_SIZES[13] = 7;
  147. PACKET_SIZES[14] = 8;
  148. PACKET_SIZES[15] = 6;
  149. PACKET_SIZES[16] = 2;
  150. PACKET_SIZES[17] = 3;
  151. PACKET_SIZES[18] = -1;
  152. PACKET_SIZES[19] = -2;
  153. PACKET_SIZES[20] = 3;
  154. PACKET_SIZES[21] = 0;
  155. PACKET_SIZES[22] = -1;
  156. PACKET_SIZES[23] = 9;
  157. PACKET_SIZES[24] = -1;
  158. PACKET_SIZES[25] = 9;
  159. PACKET_SIZES[26] = 9;
  160. PACKET_SIZES[27] = 8;
  161. PACKET_SIZES[28] = 4;
  162. PACKET_SIZES[29] = -1;
  163. PACKET_SIZES[30] = 0;
  164. PACKET_SIZES[31] = 3;
  165. PACKET_SIZES[32] = 8;
  166. PACKET_SIZES[33] = 4;
  167. PACKET_SIZES[34] = 3;
  168. PACKET_SIZES[35] = -1;
  169. PACKET_SIZES[36] = -1;
  170. PACKET_SIZES[37] = 17;
  171. PACKET_SIZES[38] = 4;
  172. PACKET_SIZES[39] = 4;
  173. PACKET_SIZES[40] = 9;
  174. PACKET_SIZES[41] = -1;
  175. PACKET_SIZES[42] = 3;
  176. PACKET_SIZES[43] = 7;
  177. PACKET_SIZES[44] = -2;
  178. PACKET_SIZES[45] = 7;
  179. PACKET_SIZES[46] = 3;
  180. PACKET_SIZES[47] = 4;
  181. PACKET_SIZES[48] = -1;
  182. PACKET_SIZES[49] = 3;
  183. PACKET_SIZES[50] = 11;
  184. PACKET_SIZES[51] = 3;
  185. PACKET_SIZES[52] = -1;
  186. PACKET_SIZES[53] = -1;
  187. PACKET_SIZES[54] = 0;
  188. PACKET_SIZES[55] = 8;
  189. PACKET_SIZES[56] = 3;
  190. PACKET_SIZES[57] = 7;
  191. PACKET_SIZES[58] = -1;
  192. PACKET_SIZES[59] = 9;
  193. PACKET_SIZES[60] = -1;
  194. PACKET_SIZES[61] = 7;
  195. PACKET_SIZES[62] = 7;
  196. PACKET_SIZES[63] = 12;
  197. PACKET_SIZES[64] = 4;
  198. PACKET_SIZES[65] = 3;
  199. PACKET_SIZES[66] = 11;
  200. PACKET_SIZES[67] = 8;
  201. PACKET_SIZES[68] = 8;
  202. PACKET_SIZES[69] = 15;
  203. PACKET_SIZES[70] = 1;
  204. PACKET_SIZES[71] = 2;
  205. PACKET_SIZES[72] = 6;
  206. PACKET_SIZES[73] = -1;
  207. PACKET_SIZES[74] = -1;
  208. PACKET_SIZES[75] = -2;
  209. PACKET_SIZES[76] = 16;
  210. PACKET_SIZES[77] = 3;
  211. PACKET_SIZES[78] = 1;
  212. PACKET_SIZES[79] = 3;
  213. PACKET_SIZES[80] = 9;
  214. PACKET_SIZES[81] = 4;
  215. PACKET_SIZES[82] = -2;
  216. PACKET_SIZES[83] = 1;
  217. PACKET_SIZES[84] = 1;
  218. PACKET_SIZES[85] = 3;
  219. PACKET_SIZES[86] = -1;
  220. PACKET_SIZES[87] = 4;
  221. PACKET_SIZES[88] = 3;
  222. PACKET_SIZES[89] = -1;
  223. PACKET_SIZES[90] = 8;
  224. PACKET_SIZES[91] = -2;
  225. PACKET_SIZES[92] = -1;
  226. PACKET_SIZES[93] = -1;
  227. PACKET_SIZES[94] = 9;
  228. PACKET_SIZES[95] = -2;
  229. PACKET_SIZES[96] = 8;
  230. PACKET_SIZES[97] = 2;
  231. PACKET_SIZES[98] = 6;
  232. PACKET_SIZES[99] = 2;
  233. PACKET_SIZES[100] = -2;
  234. PACKET_SIZES[101] = 3;
  235. PACKET_SIZES[102] = 7;
  236. PACKET_SIZES[103] = 4;
  237. }
  238.  
  239. private Player player;
  240. private int chatType;
  241.  
  242. public WorldPacketsDecoder(Session session, Player player) {
  243. super(session);
  244. this.player = player;
  245. }
  246.  
  247. @Override
  248. public void decode(InputStream stream) {
  249. while (stream.getRemaining() > 0 && session.getChannel().isConnected()
  250. && !player.hasFinished()) {
  251. int packetId = stream.readPacket(player);
  252. if (packetId >= PACKET_SIZES.length || packetId < 0)
  253. break;
  254. int length = PACKET_SIZES[packetId];
  255. if (length == -1)
  256. length = stream.readUnsignedByte();
  257. else if (length == -2)
  258. length = stream.readUnsignedShort();
  259. else if (length == -3)
  260. length = stream.readInt();
  261. else if (length == -4) {
  262. length = stream.getRemaining();
  263. }
  264. if (length > stream.getRemaining())
  265. length = stream.getRemaining();
  266. int startOffset = stream.getOffset();
  267. processPackets(packetId, stream, length);
  268. stream.setOffset(startOffset + length);
  269. }
  270. }
  271.  
  272. @SuppressWarnings("unused")
  273. public static void decodeLogicPacket(final Player player, LogicPacket packet) {
  274. int packetId = packet.getId();
  275. InputStream stream = new InputStream(packet.getData());
  276. if (packetId == PLAYER_OPTION_5_PACKET) {
  277. boolean unknown = stream.readByte() == 1;
  278. int playerIndex = stream.readUnsignedShortLE128();
  279. Player other = World.getPlayers().get(playerIndex);
  280. if (other == null || other.isDead() || other.hasFinished() || !player.getMapRegionsIds().contains(other.getRegionId()))
  281. return;
  282. if (player.isLocked()) {
  283. return;
  284. }
  285. if (!other.withinDistance(player, 14)) {
  286. player.getPackets().sendGameMessage("Unable to find player: " + other.getDisplayName() + ".");
  287. return;
  288. }
  289. if (player.getRights() > 0) {
  290. player.getDialogueManager().startDialogue("ModPanel", playerIndex);
  291. return;
  292. }
  293. player.getDialogueManager().startDialogue("SupportPanel", playerIndex);
  294. } else if (packetId == WALKING_PACKET || packetId == MINI_WALKING_PACKET) {
  295. if (!player.hasStarted() || !player.clientHasLoadedMapRegion() || player.isDead())
  296. return;
  297. long currentTime = Utils.currentTimeMillis();
  298. if (player.isLocked())
  299. return;
  300. if (player.getFreezeDelay() >= currentTime) {
  301. player.sgm("A magical force prevents you from moving.");
  302. return;
  303. }
  304. int length = stream.getLength();
  305. int baseX = stream.readUnsignedShort128();
  306. boolean forceRun = stream.readUnsigned128Byte() == 1;
  307. int baseY = stream.readUnsignedShort128();
  308. int steps = (length - 5) / 2;
  309. if (steps > 25)
  310. steps = 25;
  311. player.stopAll();
  312. if (forceRun)
  313. player.setRun(forceRun);
  314. for (int step = 0; step < steps; step++)
  315. if (!player.addWalkSteps(baseX + stream.readUnsignedByte(), baseY + stream.readUnsignedByte(), 25, true))
  316. break;
  317. //if (player.isTeleporting()) {
  318. // player.getActionManager().getAction().stop(player);
  319. //}
  320. } else if (packetId == INTERFACE_ON_OBJECT) {
  321. boolean forceRun = stream.readByte128() == 1;
  322. int itemId = stream.readShortLE128();
  323. int y = stream.readShortLE128();
  324. int objectId = stream.readIntV2();
  325. int interfaceHash = stream.readInt();
  326. final int interfaceId = interfaceHash >> 16;
  327. int slot = stream.readShortLE();
  328. int x = stream.readShort128();
  329. if (!player.hasStarted() || !player.clientHasLoadedMapRegion()
  330. || player.isDead())
  331. return;
  332. long currentTime = Utils.currentTimeMillis();
  333. if (player.getLockDelay() >= currentTime
  334. || player.getEmotesManager().getNextEmoteEnd() >= currentTime)
  335. return;
  336. final WorldTile tile = new WorldTile(x, y, player.getPlane());
  337. int regionId = tile.getRegionId();
  338. if (!player.getMapRegionsIds().contains(regionId))
  339. return;
  340. WorldObject mapObject = World.getObjectWithId(tile, objectId);
  341. if (mapObject == null || mapObject.getId() != objectId)
  342. return;
  343. final WorldObject object = !player.isAtDynamicRegion() ? mapObject
  344. : new WorldObject(objectId, mapObject.getType(),
  345. mapObject.getRotation(), x, y, player.getPlane());
  346. final Item item = player.getInventory().getItem(slot);
  347. if (player.isDead()
  348. || Utils.getInterfaceDefinitionsSize() <= interfaceId)
  349. return;
  350. if (player.getLockDelay() > Utils.currentTimeMillis())
  351. return;
  352. if (!player.getInterfaceManager().containsInterface(interfaceId))
  353. return;
  354. if (item == null || item.getId() != itemId)
  355. return;
  356. player.stopAll(false); // false
  357. if (forceRun)
  358. player.setRun(forceRun);
  359. switch (interfaceId) {
  360. case Inventory.INVENTORY_INTERFACE: // inventory
  361. ObjectHandler.handleItemOnObject(player, object, interfaceId, item);
  362. break;
  363. }
  364. } else if (packetId == PLAYER_OPTION_2_PACKET) {
  365. if (!player.hasStarted() || !player.clientHasLoadedMapRegion() || player.isDead())
  366. return;
  367. boolean unknown = stream.readByte() == 1;
  368. int playerIndex = stream.readUnsignedShortLE128();
  369. Player p2 = World.getPlayers().get(playerIndex);
  370. if (p2 == null || p2.isDead() || p2.hasFinished()
  371. || !player.getMapRegionsIds().contains(p2.getRegionId()))
  372. return;
  373. if (player.isLocked())
  374. return;
  375. player.stopAll(false);
  376. player.getActionManager().setAction(new PlayerFollow(p2));
  377. } else if (packetId == PLAYER_OPTION_6_PACKET) {
  378. boolean unknown = stream.readByte() == 1;
  379. int playerIndex = stream.readUnsignedShortLE128();
  380. Player p2 = World.getPlayers().get(playerIndex);
  381. if (p2 == null || p2.isDead() || p2.hasFinished()
  382. || !player.getMapRegionsIds().contains(p2.getRegionId()))
  383. return;
  384. if (player.isLocked())
  385. return;
  386. player.stopAll(false);
  387. player.faceEntity(p2);
  388. player.setNextAnimation(new Animation(11547));
  389. } else if (packetId == PLAYER_OPTION_4_PACKET) {
  390. boolean unknown = stream.readByte() == 1;
  391. int playerIndex = stream.readUnsignedShortLE128();
  392. Player p2 = World.getPlayers().get(playerIndex);
  393. if (p2 == null || p2.isDead() || p2.hasFinished()
  394. || !player.getMapRegionsIds().contains(p2.getRegionId()))
  395. return;
  396. if (player.isLocked())
  397. return;
  398. player.stopAll(false);
  399. if (player.isCantTrade()) {
  400. player.sgm("You are busy.");
  401. return;
  402. }
  403. if (player.getRights() != 2 && p2.getRights() != 2) {
  404. if (player.isIronMan()) {
  405. player.sgm("You cannot do this as an Iron Man!");
  406. return;
  407. }
  408. if (p2.isIronMan()) {
  409. player.sgm(p2.getDisplayName()+" is an Iron Man and cannot trade!");
  410. return;
  411. }
  412. if (player.isNew()) {
  413. player.sgm("You must have a total level of 150 and have played for 30 minutes to trade.");
  414. return;
  415. }
  416. }
  417. if (p2.getInterfaceManager().containsScreenInter()) {
  418. player.sgm("The other player is busy.");
  419. return;
  420. }
  421. if (player.getX() == p2.getX() && player.getY() == p2.getY()) {
  422. if (!player.addWalkSteps(player.getX() - 1, player.getY(), 1))
  423. if (!player.addWalkSteps(player.getX() + 1, player.getY(),
  424. 1))
  425. if (!player.addWalkSteps(player.getX(),
  426. player.getY() + 1, 1))
  427. player.addWalkSteps(player.getX(),
  428. player.getY() - 1, 1);
  429. }
  430. if (player.getX() == p2.getX() && player.getY() == p2.getY()) {
  431. player.sgm("Unable to trade here.");
  432. return;
  433. }
  434. if (!p2.withinDistance(player, 14)) {
  435. player.sgm("Unable to find player: "
  436. + p2.getDisplayName() + ".");
  437. return;
  438. }
  439. if (p2.getTemporaryAttributtes().get("TradeTarget") == player) {
  440. p2.getTemporaryAttributtes().remove("TradeTarget");
  441. player.getTrade().openTrade(p2);
  442. player.faceEntity(p2);
  443. p2.faceEntity(player);
  444. p2.getTrade().openTrade(player);
  445. return;
  446. }
  447. player.getTemporaryAttributtes().put("TradeTarget", p2);
  448. player.sgm("Sending " + p2.getDisplayName() + " a trade request...");
  449. p2.getPackets().sendTradeRequestMessage(player);
  450. player.faceEntity(p2);
  451. } else if (packetId == PLAYER_OPTION_1_PACKET) {
  452. if (!player.hasStarted() || !player.clientHasLoadedMapRegion() || player.isDead())
  453. return;
  454. if (player.isLocked())
  455. return;
  456. boolean unknown = stream.readByte() == 1;
  457. int playerIndex = stream.readUnsignedShortLE128();
  458. Player p2 = World.getPlayers().get(playerIndex);
  459. if (p2 == null || p2.isDead() || p2.hasFinished()
  460. || !player.getMapRegionsIds().contains(p2.getRegionId()))
  461. return;
  462. if (player.getLockDelay() > Utils.currentTimeMillis()
  463. || !player.getControlerManager().canPlayerOption1(p2))
  464. return;
  465. if (!player.isCanPvp())
  466. return;
  467. if (!player.getControlerManager().canAttack(p2))
  468. return;
  469.  
  470. if (!player.isCanPvp() || !p2.isCanPvp()) {
  471. player.sgm("You can only attack players in a player-vs-player area.", true);
  472. return;
  473. }
  474. if (p2.isNew()) {
  475. player.sgm("You can not attack new players.", true);
  476. return;
  477. }
  478. if (!p2.isAtMultiArea() || !player.isAtMultiArea()) {
  479. if (player.getAttackedBy() != p2 && player.isUnderCombat(0)) {
  480. player.faceEntity(p2);
  481. player.sgm("You are already in combat.", true);
  482. return;
  483. }
  484. if (p2.getAttackedBy() != player && p2.isUnderCombat(0)) {
  485. if (p2.getAttackedBy() instanceof NPC)
  486. p2.setAttackedBy(player);
  487. else {
  488. player.sgm("That player is already in combat.", true);
  489. player.faceEntity(p2);
  490. return;
  491. }
  492. }
  493. }
  494. player.stopAll(false);
  495. player.getActionManager().setAction(new PlayerCombat(p2));
  496. } else if (packetId == ATTACK_NPC) {
  497. if (!player.hasStarted() || !player.clientHasLoadedMapRegion() || player.isDead())
  498. return;
  499. if (player.isLocked())
  500. return;
  501. int npcIndex = stream.readUnsignedShort128();
  502. boolean forceRun = stream.read128Byte() == 1;
  503. if (forceRun)
  504. player.setRun(forceRun);
  505. NPC npc = World.getNPCs().get(npcIndex);
  506. if (npc == null || npc.isDead() || npc.hasFinished()
  507. || !player.getMapRegionsIds().contains(npc.getRegionId()) || !npc.getDefinitions().hasAttackOption()) {
  508. return;
  509. }
  510. if (!player.getControlerManager().canAttack(npc))
  511. return;
  512. if (npc instanceof Familiar) {
  513. Familiar familiar = (Familiar) npc;
  514. if (familiar == player.getFamiliar()) {
  515. player.sgm("You can't attack your own familiar.", true);
  516. return;
  517. }
  518. if (!familiar.canAttack(player)) {
  519. player.sgm("You can't attack this npc.", true);
  520. return;
  521. }
  522. } else if (!npc.isForceMultiAttacked()) {
  523. if (!npc.isAtMultiArea() || !player.isAtMultiArea()) {
  524. if (player.getAttackedBy() != npc && player.isUnderCombat(0)) {
  525. player.faceEntity(npc);
  526. player.sgm("You are already in combat.", true);
  527. return;
  528. }
  529. if (npc.getAttackedBy() != player
  530. && npc.getAttackedByDelay() > Utils.currentTimeMillis()) {
  531. player.faceEntity(npc);
  532. player.sgm("This npc is already in combat.", true);
  533. return;
  534. }
  535. }
  536. }
  537. player.stopAll(false);
  538. player.getActionManager().setAction(new PlayerCombat(npc));
  539. } else if (packetId == INTERFACE_ON_PLAYER) {
  540. if (!player.hasStarted() || !player.clientHasLoadedMapRegion()
  541. || player.isDead())
  542. return;
  543. if (player.isLocked())
  544. return;
  545. int junk1 = stream.readUnsignedShort();
  546. int playerIndex = stream.readUnsignedShort();
  547. int interfaceHash = stream.readIntV2();
  548. int junk2 = stream.readUnsignedShortLE128();
  549. boolean unknown = stream.read128Byte() == 1;
  550. final int itemId = stream.readUnsignedShort();
  551. int interfaceId = interfaceHash >> 16;
  552. int componentId = interfaceHash - (interfaceId << 16);
  553. int interfaceSlot = stream.readUnsignedShortLE128();
  554. if (Utils.getInterfaceDefinitionsSize() <= interfaceId)
  555. return;
  556. if (!player.getInterfaceManager().containsInterface(interfaceId))
  557. return;
  558. if (componentId == 65535)
  559. componentId = -1;
  560. if (componentId != -1
  561. && Utils.getInterfaceDefinitionsComponentsSize(interfaceId) <= componentId)
  562. return;
  563. Player p2 = World.getPlayers().get(playerIndex);
  564. if (p2 == null || p2.isDead() || p2.hasFinished()
  565. || !player.getMapRegionsIds().contains(p2.getRegionId()))
  566. return;
  567. player.stopAll(true);
  568.  
  569. switch (interfaceId) {
  570. case 1110:
  571. if (componentId == 87)
  572. ClansManager.invite(player, p2);
  573. break;
  574. case Inventory.INVENTORY_INTERFACE:// Item on player
  575. InventoryOptionsHandler.handleItemOnPlayer(player, p2, junk1);
  576. break;
  577. case 662:
  578. case 747:
  579. if (player.getFamiliar() == null)
  580. return;
  581. player.resetWalkSteps();
  582. if ((interfaceId == 747 && componentId == 15)
  583. || (interfaceId == 662 && componentId == 65)
  584. || (interfaceId == 662 && componentId == 74)
  585. || interfaceId == 747 && componentId == 18) {
  586. if ((interfaceId == 662 && componentId == 74
  587. || interfaceId == 747 && componentId == 24 || interfaceId == 747
  588. && componentId == 18)) {
  589. if (player.getFamiliar().getSpecialAttack() != SpecialAttack.ENTITY)
  590. return;
  591. }
  592. if (!player.isCanPvp() || !p2.isCanPvp()) {
  593. player.sgm("You can only attack players in a player-vs-player area.");
  594. return;
  595. }
  596. if (p2.isNew()) {
  597. player.sgm(Colors.red+ "You cannot attack new players.");
  598. return;
  599. }
  600. if (!player.getFamiliar().canAttack(p2)) {
  601. player.sgm("You can only use your familiar in a multi-zone area.");
  602. return;
  603. } else {
  604. player.getFamiliar().setSpecial(
  605. interfaceId == 662 && componentId == 74
  606. || interfaceId == 747
  607. && componentId == 18);
  608. player.getFamiliar().setTarget(p2);
  609. }
  610. }
  611. break;
  612. case 193:
  613. switch (componentId) {
  614. case 28:
  615. case 32:
  616. case 24:
  617. case 20:
  618. case 30:
  619. case 34:
  620. case 26:
  621. case 22:
  622. case 29:
  623. case 33:
  624. case 25:
  625. case 21:
  626. case 31:
  627. case 35:
  628. case 27:
  629. case 23:
  630. if (Magic.checkCombatSpell(player, componentId, 1, false)) {
  631. player.setNextFaceWorldTile(new WorldTile(p2
  632. .getCoordFaceX(p2.getSize()), p2
  633. .getCoordFaceY(p2.getSize()), p2.getPlane()));
  634. if (!player.getControlerManager().canAttack(p2))
  635. return;
  636. if (!player.isCanPvp() || !p2.isCanPvp()) {
  637. player.sgm("You can only attack players in a player-vs-player area.", true);
  638. return;
  639. }
  640. if (p2.isNew()) {
  641. player.sgm("You cannot attack new players.");
  642. return;
  643. }
  644. if (!p2.isAtMultiArea() || !player.isAtMultiArea()) {
  645. if (player.getAttackedBy() != p2 && player.getAttackedByDelay() > Utils.currentTimeMillis()) {
  646. player.sgm("That "
  647. + (player.getAttackedBy() instanceof Player ? "player"
  648. : "npc")
  649. + " is already in combat.", true);
  650. return;
  651. }
  652. if (p2.getAttackedBy() != player
  653. && p2.getAttackedByDelay() > Utils
  654. .currentTimeMillis()) {
  655. if (p2.getAttackedBy() instanceof NPC)
  656. p2.setAttackedBy(player);
  657. else {
  658. player.sgm("That player is already in combat.", true);
  659. return;
  660. }
  661. }
  662. }
  663. player.getActionManager().setAction(
  664. new PlayerCombat(p2));
  665. }
  666. break;
  667. }
  668. case 430:
  669. switch (componentId) {
  670. case 42:
  671. player.setNextFaceWorldTile(new WorldTile(p2
  672. .getCoordFaceX(p2.getSize()), p2.getCoordFaceY(p2
  673. .getSize()), p2.getPlane()));
  674. if (Magic.checkCombatSpell(player, componentId, 1, false)) {
  675. if (p2 instanceof Player) {
  676. if (player.getSkills().getLevel(Skills.MAGIC) < 93) {
  677. player.sgm("Your Magic level is not high enough for this spell.");
  678. return;
  679. } else if (player.getSkills().getLevel(
  680. Skills.DEFENCE) < 40) {
  681. player.sgm("You need a Defence level of 40 for this spell");
  682. return;
  683. }
  684. Long lastVeng = (Long) p2.getTemporaryAttributtes()
  685. .get("LAST_VENG");
  686. if (lastVeng != null
  687. && lastVeng + 30000 > Utils
  688. .currentTimeMillis()) {
  689. player.sgm("That player already has vengeance.");
  690. return;
  691. }
  692. player.stopAll();
  693. player.setNextAnimation(new Animation(4411));
  694. p2.setNextGraphics(new Graphics(725, 0, 100));
  695. p2.setCastVeng(true);
  696. p2.getTemporaryAttributtes().put("LAST_VENG",
  697. Utils.currentTimeMillis());
  698. p2.sgm("You recieve vengeance from "
  699. + player.getDisplayName() + ".");
  700. }
  701. }
  702. break;
  703. }
  704. case 192:
  705. switch (componentId) {
  706. case 25: // air strike
  707. case 28: // water strike
  708. case 30: // earth strike
  709. case 32: // fire strike
  710. case 34: // air bolt
  711. case 39: // water bolt
  712. case 42: // earth bolt
  713. case 45: // fire bolt
  714. case 49: // air blast
  715. case 52: // water blast
  716. case 58: // earth blast
  717. case 63: // fire blast
  718. case 70: // air wave
  719. case 73: // water wave
  720. case 77: // earth wave
  721. case 80: // fire wave
  722. case 86: // teleblock
  723. case 84: // air surge
  724. case 87: // water surge
  725. case 89: // earth surge
  726. case 91: // fire surge
  727. case 99: // storm of armadyl
  728. case 36: // bind
  729. case 66: // Sara Strike
  730. case 67: // Guthix Claws
  731. case 68: // Flame of Zammy
  732. case 55: // snare
  733. case 81: // entangle
  734. if (Magic.checkCombatSpell(player, componentId, 1, false)) {
  735. player.setNextFaceWorldTile(new WorldTile(p2
  736. .getCoordFaceX(p2.getSize()), p2
  737. .getCoordFaceY(p2.getSize()), p2.getPlane()));
  738. if (!player.getControlerManager().canAttack(p2))
  739. return;
  740. if (!player.isCanPvp() || !p2.isCanPvp()) {
  741. player.sgm("You can only attack players in a player-vs-player area.");
  742. return;
  743. }
  744. if (!p2.isAtMultiArea() || !player.isAtMultiArea()) {
  745. if (player.getAttackedBy() != p2
  746. && player.getAttackedByDelay() > Utils
  747. .currentTimeMillis()) {
  748. player.sgm("That "
  749. + (player.getAttackedBy() instanceof Player ? "player"
  750. : "npc")
  751. + " is already in combat.");
  752. return;
  753. }
  754. if (p2.getAttackedBy() != player
  755. && p2.getAttackedByDelay() > Utils
  756. .currentTimeMillis()) {
  757. if (p2.getAttackedBy() instanceof NPC)
  758. p2.setAttackedBy(player);
  759. else {
  760. player.sgm("That player is already in combat.");
  761. return;
  762. }
  763. }
  764. }
  765. player.getActionManager().setAction(
  766. new PlayerCombat(p2));
  767. }
  768. break;
  769. }
  770. break;
  771. }
  772. } else if (packetId == INTERFACE_ON_NPC) {
  773. if (!player.hasStarted() || !player.clientHasLoadedMapRegion()
  774. || player.isDead())
  775. return;
  776. if (player.getLockDelay() > Utils.currentTimeMillis())
  777. return;
  778. boolean unknown = stream.readByte() == 1;
  779. int interfaceHash = stream.readInt();
  780. int npcIndex = stream.readUnsignedShortLE();
  781. int interfaceSlot = stream.readUnsignedShortLE128();
  782. int junk2 = stream.readUnsignedShortLE();
  783. int interfaceId = interfaceHash >> 16;
  784. int componentId = interfaceHash - (interfaceId << 16);
  785. if (Utils.getInterfaceDefinitionsSize() <= interfaceId)
  786. return;
  787. if (!player.getInterfaceManager().containsInterface(interfaceId))
  788. return;
  789. if (componentId == 65535)
  790. componentId = -1;
  791. if (componentId != -1
  792. && Utils.getInterfaceDefinitionsComponentsSize(interfaceId) <= componentId)
  793. return;
  794. NPC npc = World.getNPCs().get(npcIndex);
  795. if (npc == null || npc.isDead() || npc.hasFinished()
  796. || !player.getMapRegionsIds().contains(npc.getRegionId()))
  797. return;
  798. player.stopAll(false);
  799. if (interfaceId != Inventory.INVENTORY_INTERFACE) {
  800. if (!npc.getDefinitions().hasAttackOption()) {
  801. player.sgm("You can't attack this npc.");
  802. return;
  803. }
  804. }
  805. switch (interfaceId) {
  806.  
  807. case Inventory.INVENTORY_INTERFACE:
  808. Item item = player.getInventory().getItem(interfaceSlot);
  809. if (item == null
  810. || !player.getControlerManager().processItemOnNPC(npc,
  811. item))
  812. return;
  813. InventoryOptionsHandler.handleItemOnNPC(player, npc, item);
  814. break;
  815. case 1165:
  816. Summoning.attackDreadnipTarget(npc, player);
  817. break;
  818. case 662:
  819. case 747:
  820. if (player.getFamiliar() == null)
  821. return;
  822. player.resetWalkSteps();
  823. if ((interfaceId == 747 && componentId == 15)
  824. || (interfaceId == 662 && componentId == 65)
  825. || (interfaceId == 662 && componentId == 74)
  826. || interfaceId == 747 && componentId == 18
  827. || interfaceId == 747 && componentId == 24) {
  828. if ((interfaceId == 662 && componentId == 74 || interfaceId == 747
  829. && componentId == 18)) {
  830. if (player.getFamiliar().getSpecialAttack() != SpecialAttack.ENTITY)
  831. return;
  832. }
  833. if (npc instanceof Familiar) {
  834. Familiar familiar = (Familiar) npc;
  835. if (familiar == player.getFamiliar()) {
  836. player.sgm("You can't attack your own familiar.");
  837. return;
  838. }
  839. if (!player.getFamiliar()
  840. .canAttack(familiar.getOwner())) {
  841. player.sgm("You can only attack players in a player-vs-player area.");
  842. return;
  843. }
  844. }
  845. if (!player.getFamiliar().canAttack(npc)) {
  846. player.sgm("You can only use your familiar in a multi-zone area.");
  847. return;
  848. } else {
  849. player.getFamiliar().setSpecial(
  850. interfaceId == 662 && componentId == 74
  851. || interfaceId == 747
  852. && componentId == 18);
  853. player.getFamiliar().setTarget(npc);
  854. }
  855. }
  856. break;
  857. case 193:
  858. switch (componentId) {
  859. case 28:
  860. case 32:
  861. case 24:
  862. case 20:
  863. case 30:
  864. case 34:
  865. case 26:
  866. case 22:
  867. case 29:
  868. case 33:
  869. case 25:
  870. case 21:
  871. case 31:
  872. case 35:
  873. case 27:
  874. case 23:
  875. if (Magic.checkCombatSpell(player, componentId, 1, false)) {
  876. player.setNextFaceWorldTile(new WorldTile(npc
  877. .getCoordFaceX(npc.getSize()), npc
  878. .getCoordFaceY(npc.getSize()), npc.getPlane()));
  879. if (!player.getControlerManager().canAttack(npc))
  880. return;
  881. if (npc instanceof Familiar) {
  882. Familiar familiar = (Familiar) npc;
  883. if (familiar == player.getFamiliar()) {
  884. player.sgm("You can't attack your own familiar.");
  885. return;
  886. }
  887. if (!familiar.canAttack(player)) {
  888. player.sgm("You can't attack this npc.");
  889. return;
  890. }
  891. } else if (!npc.isForceMultiAttacked()) {
  892. if (!npc.isAtMultiArea() || !player.isAtMultiArea()) {
  893. if (player.getAttackedBy() != npc
  894. && player.getAttackedByDelay() > Utils
  895. .currentTimeMillis()) {
  896. player.sgm("You are already in combat.");
  897. return;
  898. }
  899. if (npc.getAttackedBy() != player
  900. && npc.getAttackedByDelay() > Utils
  901. .currentTimeMillis()) {
  902. player.sgm("This npc is already in combat.");
  903. return;
  904. }
  905. }
  906. }
  907. player.getActionManager().setAction(
  908. new PlayerCombat(npc));
  909. }
  910. break;
  911. }
  912. case 192:
  913. switch (componentId) {
  914. case 25: // air strike
  915. case 28: // water strike
  916. case 30: // earth strike
  917. case 32: // fire strike
  918. case 34: // air bolt
  919. case 39: // water bolt
  920. case 42: // earth bolt
  921. case 45: // fire bolt
  922. case 49: // air blast
  923. case 52: // water blast
  924. case 58: // earth blast
  925. case 63: // fire blast
  926. case 70: // air wave
  927. case 73: // water wave
  928. case 77: // earth wave
  929. case 80: // fire wave
  930. case 84: // air surge
  931. case 87: // water surge
  932. case 89: // earth surge
  933. case 66: // Sara Strike
  934. case 67: // Guthix Claws
  935. case 68: // Flame of Zammy
  936. case 93:
  937. case 91: // fire surge
  938. case 99: // storm of Armadyl
  939. case 36: // bind
  940. case 55: // snare
  941. case 81: // entangle
  942. if (Magic.checkCombatSpell(player, componentId, 1, false)) {
  943. player.setNextFaceWorldTile(new WorldTile(npc
  944. .getCoordFaceX(npc.getSize()), npc
  945. .getCoordFaceY(npc.getSize()), npc.getPlane()));
  946. if (!player.getControlerManager().canAttack(npc))
  947. return;
  948. if (npc instanceof Familiar) {
  949. Familiar familiar = (Familiar) npc;
  950. if (familiar == player.getFamiliar()) {
  951. player.sgm("You can't attack your own familiar.");
  952. return;
  953. }
  954. if (!familiar.canAttack(player)) {
  955. player.sgm("You can't attack this npc.");
  956. return;
  957. }
  958. } else if (!npc.isForceMultiAttacked()) {
  959. if (!npc.isAtMultiArea() || !player.isAtMultiArea()) {
  960. if (player.getAttackedBy() != npc
  961. && player.getAttackedByDelay() > Utils
  962. .currentTimeMillis()) {
  963. player.sgm("You are already in combat.");
  964. return;
  965. }
  966. if (npc.getAttackedBy() != player
  967. && npc.getAttackedByDelay() > Utils
  968. .currentTimeMillis()) {
  969. player.sgm("This npc is already in combat.");
  970. return;
  971. }
  972. }
  973. }
  974. player.getActionManager().setAction(
  975. new PlayerCombat(npc));
  976. }
  977. break;
  978. }
  979. break;
  980. }
  981. } else if (packetId == NPC_CLICK1_PACKET) {
  982. if (player.isLocked())
  983. return;
  984. NPCHandler.handleOption1(player, stream);
  985. } else if (packetId == NPC_CLICK2_PACKET) {
  986. if (player.isLocked())
  987. return;
  988. NPCHandler.handleOption2(player, stream);
  989. } else if (packetId == NPC_CLICK3_PACKET) {
  990. if (player.isLocked())
  991. return;
  992. NPCHandler.handleOption3(player, stream);
  993. } else if (packetId == NPC_CLICK4_PACKET) {
  994. if (player.isLocked())
  995. return;
  996. NPCHandler.handleOption4(player, stream);
  997. } else if (packetId == OBJECT_CLICK1_PACKET) {
  998. if (player.isLocked())
  999. return;
  1000. ObjectHandler.handleOption(player, stream, 1);
  1001. } else if (packetId == OBJECT_CLICK2_PACKET) {
  1002. if (player.isLocked())
  1003. return;
  1004. ObjectHandler.handleOption(player, stream, 2);
  1005. } else if (packetId == OBJECT_CLICK3_PACKET) {
  1006. if (player.isLocked())
  1007. return;
  1008. ObjectHandler.handleOption(player, stream, 3);
  1009. } else if (packetId == OBJECT_CLICK4_PACKET) {
  1010. if (player.isLocked())
  1011. return;
  1012. ObjectHandler.handleOption(player, stream, 4);
  1013. } else if (packetId == OBJECT_CLICK5_PACKET) {
  1014. if (player.isLocked())
  1015. return;
  1016. ObjectHandler.handleOption(player, stream, 5);
  1017. }
  1018. if (packetId == ITEM_TAKE_PACKET) {
  1019. if (!player.hasStarted() || !player.clientHasLoadedMapRegion() || player.isDead())
  1020. return;
  1021. long currentTime = Utils.currentTimeMillis();
  1022. if (player.getLockDelay() > currentTime)
  1023. return;
  1024. int y = stream.readUnsignedShort();
  1025. int x = stream.readUnsignedShortLE();
  1026. final int id = stream.readUnsignedShort();
  1027. boolean forceRun = stream.read128Byte() == 1;
  1028. final WorldTile tile = new WorldTile(x, y, player.getPlane());
  1029. final int regionId = tile.getRegionId();
  1030. if (!player.getMapRegionsIds().contains(regionId))
  1031. return;
  1032. final FloorItem item = World.getRegion(regionId).getGroundItem(id, tile, player);
  1033. if (item == null)
  1034. return;
  1035. player.stopAll(false);
  1036. if (forceRun)
  1037. player.setRun(forceRun);
  1038. player.setRouteEvent(new RouteEvent(tile, ()));
  1039. player.setCoordsEvent(new CoordsEvent(tile, () -> {
  1040. @Override
  1041. public void run() {
  1042. if (item == null)
  1043. return;
  1044. if (player.getRights() == 2 && item.getOwner() != null)
  1045. player.sgm("This item was dropped by: "
  1046. + item.getOwner()
  1047. + "; display name: "
  1048. + item.getOwner());
  1049. if (item.getOwner() != null) {
  1050. if (!player.getUsername().equalsIgnoreCase(item.getOwner())
  1051. && player.isIronMan()) {
  1052. player.sgm("You cannot do this as an Iron Man!");
  1053. return;
  1054. }
  1055. }
  1056. player.setNextFaceWorldTile(tile);
  1057. player.addWalkSteps(tile.getX(), tile.getY(), 1);
  1058. World.removeGroundItem(player, item);
  1059. }
  1060. }));
  1061. return;
  1062. }
  1063. if (packetId == GROUND_ITEM_INTERACT_PACKET) {
  1064. if (!player.hasStarted() || !player.clientHasLoadedMapRegion() || player.isDead())
  1065. return;
  1066. long currentTime = Utils.currentTimeMillis();
  1067. if (player.getLockDelay() > currentTime)
  1068. return;
  1069. int y = stream.readUnsignedShort();
  1070. int x = stream.readUnsignedShortLE();
  1071. final int id = stream.readUnsignedShort();
  1072. boolean forceRun = stream.read128Byte() == 1;
  1073. final WorldTile tile = new WorldTile(x, y, player.getPlane());
  1074. final int regionId = tile.getRegionId();
  1075. if (!player.getMapRegionsIds().contains(regionId))
  1076. return;
  1077. final FloorItem item = World.getRegion(regionId).getGroundItem(id, tile, player);
  1078. if (item == null)
  1079. return;
  1080. player.stopAll(false);
  1081. if (forceRun)
  1082. player.setRun(forceRun);
  1083. player.setRouteEvent(new RouteEvent(tile, ()));
  1084. player.setCoordsEvent(new CoordsEvent(tile, new Runnable() {
  1085. @Override
  1086. public void run() {
  1087. if (item == null)
  1088. return;
  1089. if (item.getOwner() != null) {
  1090. if (!player.getUsername().equalsIgnoreCase(item.getOwner()) && player.isIronMan()) {
  1091. player.sgm("You cannot do this as an Iron Man!");
  1092. return;
  1093. }
  1094. }
  1095. player.setNextFaceWorldTile(tile);
  1096. player.addWalkSteps(tile.getX(), tile.getY(), 1);
  1097. if (Firemaking.isFiremaking(player, item.getId())) {
  1098. World.removeGroundItem(player, item);
  1099. return;
  1100. }
  1101. }
  1102. }));
  1103. System.out.println("Item id: "+item.getId()+".");
  1104. return;
  1105. }
  1106. }
  1107.  
  1108. @SuppressWarnings("unused")
  1109. public void processPackets(final int packetId, InputStream stream, int length) {
  1110. player.setPacketsDecoderPing(Utils.currentTimeMillis());
  1111. if (packetId == PING_PACKET) {
  1112. OutputStream packet = new OutputStream(0);
  1113. packet.writePacket(player, 153);
  1114. player.getSession().write(packet);
  1115. }
  1116. else if (packetId == MOVE_MOUSE_PACKET) {
  1117. // USELESS PACKET
  1118. }
  1119. else if (packetId == LOGIN_PACKET) {
  1120. // USELESS PACKET
  1121. }
  1122. else if (packetId == KEY_TYPED_PACKET) {
  1123. // USELESS PACKET
  1124. }
  1125. else if (packetId == RECEIVE_PACKET_COUNT_PACKET) {
  1126. stream.readInt();
  1127. }
  1128. else if (packetId == ITEM_ON_ITEM_PACKET) {
  1129. player.increaseAFKTimer();
  1130. InventoryOptionsHandler.handleItemOnItem(player, stream);
  1131. } else if (packetId == MAGIC_ON_ITEM_PACKET) {
  1132. player.increaseAFKTimer();
  1133. int inventoryInter = stream.readInt() >> 16;
  1134. int itemId = stream.readShort128();
  1135. stream.readShort();
  1136. stream.readShortLE();
  1137. int interfaceSet = stream.readIntV1();
  1138. int spellId = interfaceSet & 0xFFF;
  1139. int magicInter = interfaceSet >> 16;
  1140. } else if (packetId == CLOSE_INTERFACE_PACKET) {
  1141. player.increaseAFKTimer();
  1142. if (player.hasStarted() && !player.hasFinished() && !player.isRunning()) {
  1143. player.run();
  1144. player.getInterfaceManager().openGameTab(1);
  1145. return;
  1146. }
  1147. player.stopAll();
  1148. } else if (packetId == MOVE_CAMERA_PACKET) {
  1149. player.increaseAFKTimer();
  1150. stream.readUnsignedShort();
  1151. stream.readUnsignedShort();
  1152. } else if (packetId == SCREEN_PACKET) {
  1153. int displayMode = stream.readUnsignedByte();
  1154. player.setScreenWidth(stream.readUnsignedShort());
  1155. player.setScreenHeight(stream.readUnsignedShort());
  1156. if (!player.hasStarted() || player.hasFinished()
  1157. || displayMode == player.getDisplayMode()
  1158. || !player.getInterfaceManager().containsInterface(742))
  1159. return;
  1160. player.setDisplayMode(displayMode);
  1161. player.getInterfaceManager().removeAll();
  1162. player.getInterfaceManager().sendInterfaces();
  1163. player.getInterfaceManager().sendInterface(742);
  1164. } else if (packetId == CLICK_PACKET) {
  1165. player.increaseAFKTimer();
  1166. int mouseHash = stream.readShortLE128();
  1167. int mouseButton = mouseHash >> 15;
  1168. int time = mouseHash - (mouseButton << 15); // time
  1169. int positionHash = stream.readIntV1();
  1170. int y = positionHash >> 16; // y;
  1171. int x = positionHash - (y << 16); // x
  1172. if (time <= 1 || x < 0 || x > player.getScreenWidth() || y < 0
  1173. || y > player.getScreenHeight()) {
  1174. return;
  1175. }
  1176. } else if (packetId == DIALOGUE_CONTINUE_PACKET) {
  1177. player.increaseAFKTimer();
  1178. int junk = stream.readShortLE();
  1179. int interfaceHash = stream.readIntV1();
  1180. int interfaceId = interfaceHash >> 16;
  1181. stream.readShort128();
  1182. if (Utils.getInterfaceDefinitionsSize() <= interfaceId)
  1183. return;
  1184. int componentId = interfaceHash - (interfaceId << 16);
  1185. player.getDialogueManager().continueDialogue(interfaceId,
  1186. componentId);
  1187. } else if (packetId == WORLD_MAP_CLICK) {
  1188. player.increaseAFKTimer();
  1189. int coordinateHash = stream.readInt();
  1190. int x = coordinateHash >> 14;
  1191. int y = coordinateHash & 0x3fff;
  1192. int plane = coordinateHash >> 28;
  1193. Integer hash = (Integer) player.getTemporaryAttributtes().get(
  1194. "worldHash");
  1195. if (hash == null || coordinateHash != hash)
  1196. player.getTemporaryAttributtes().put("worldHash",
  1197. coordinateHash);
  1198. else {
  1199. player.getTemporaryAttributtes().remove("worldHash");
  1200. player.getHintIconsManager().addHintIcon(x, y, plane, 20, 0, 2,
  1201. -1, true);
  1202. player.getPackets().sendConfig(1159, coordinateHash);
  1203. }
  1204. } else if (packetId == ACTION_BUTTON1_PACKET
  1205. || packetId == ACTION_BUTTON2_PACKET
  1206. || packetId == ACTION_BUTTON4_PACKET
  1207. || packetId == ACTION_BUTTON5_PACKET
  1208. || packetId == ACTION_BUTTON6_PACKET
  1209. || packetId == ACTION_BUTTON7_PACKET
  1210. || packetId == ACTION_BUTTON8_PACKET
  1211. || packetId == ACTION_BUTTON3_PACKET
  1212. || packetId == ACTION_BUTTON9_PACKET
  1213. || packetId == ACTION_BUTTON10_PACKET) {
  1214. player.increaseAFKTimer();
  1215. ButtonHandler.handleButtons(player, stream, packetId);
  1216. } else if (packetId == GE_SEARCH_PACKET) {
  1217. player.increaseAFKTimer();
  1218. int itemId = stream.readUnsignedShort();
  1219. player.getGEManager().chooseItem(itemId);
  1220. } else if (packetId == ENTER_NAME_PACKET) {
  1221. player.increaseAFKTimer();
  1222. if (!player.isRunning() || player.isDead())
  1223. return;
  1224. String value = stream.readString();
  1225. if (value.equals(""))
  1226. return;
  1227. if (player.getInterfaceManager().containsInterface(1108))
  1228. player.getFriendsIgnores().setChatPrefix(value);
  1229. else if (player.getTemporaryAttributtes().get("yellcolor") == Boolean.TRUE) {
  1230. if (value.length() != 6) {
  1231. player.getDialogueManager()
  1232. .startDialogue("SimpleMessage",
  1233. "The HEX yell color you wanted to pick can not be longer or shorter than 6.");
  1234. return;
  1235. }
  1236. if (Utils.containsInvalidCharacter(value)
  1237. || value.contains("_")) {
  1238. player.getDialogueManager()
  1239. .startDialogue("SimpleMessage",
  1240. "The requested yell color can only contain numeric and regular characters.");
  1241. return;
  1242. } else {
  1243. player.setYellColor(value);
  1244. player.setVCredits(player.getVCredits() - 1);
  1245. player.getDialogueManager().startDialogue(
  1246. "SimpleMessage",
  1247. "Your yell color has been changed to <col="
  1248. + player.getYellColor() + ">"
  1249. + player.getYellColor() + "</col>.");
  1250. }
  1251. player.getTemporaryAttributtes()
  1252. .put("yellcolor", Boolean.FALSE);
  1253. } else if (player.getTemporaryAttributtes().remove("setclan") != null)
  1254. ClansManager.createClan(player, value);
  1255. else if (player.getTemporaryAttributtes().remove("joinguestclan") != null)
  1256. ClansManager.connectToClan(player, value, true);
  1257. else if (player.getTemporaryAttributtes().remove("banclanplayer") != null)
  1258. ClansManager.banPlayer(player, value);
  1259. else if (player.getTemporaryAttributtes().remove("unbanclanplayer") != null)
  1260. ClansManager.unbanPlayer(player, value);
  1261. else if (player.getTemporaryAttributtes().get("view_name") == Boolean.TRUE) {
  1262. player.getTemporaryAttributtes().remove("view_name");
  1263. Player other = World.getPlayerByDisplayName(value);
  1264. if (other == null) {
  1265. player.getPackets()
  1266. .sendGameMessage("Couldn't find player.");
  1267. return;
  1268. }
  1269. ClanWars clan = other.getCurrentFriendChat() != null ? other
  1270. .getCurrentFriendChat().getClanWars() : null;
  1271. if (clan == null) {
  1272. player.sgm("This player's clan is not in war.");
  1273. return;
  1274. }
  1275. if (clan.getSecondTeam().getOwnerDisplayName() != other
  1276. .getCurrentFriendChat().getOwnerDisplayName())
  1277. player.getTemporaryAttributtes().put("view_prefix", 1);
  1278. player.getTemporaryAttributtes().put("view_clan", clan);
  1279. ClanWars.enter(player);
  1280. } else if (player.getTemporaryAttributtes().remove("setdisplay") != null) {
  1281. if (Utils.invalidAccountName(Utils
  1282. .formatPlayerNameForProtocol(value))) {
  1283. player.sgm("Invalid name!");
  1284. return;
  1285. }
  1286. if (!DisplayNames.setDisplayName(player, value)) {
  1287. player.sgm("Name already in use!");
  1288. return;
  1289. }
  1290. player.getDialogueManager().startDialogue(
  1291. "SimpleMessage",
  1292. "Your display name has been changed to "
  1293. + player.getDisplayName() + "!");
  1294. }
  1295. } else if (packetId == ENTER_STRING_PACKET) {
  1296. player.increaseAFKTimer();
  1297. if (!player.isRunning() || player.isDead())
  1298. return;
  1299. String value = stream.readString();
  1300. if (value.equals(""))
  1301. return;
  1302. if (player.getTemporaryAttributtes().get("target_citadel") == Boolean.TRUE) {
  1303. final Player target = World.getPlayerByDisplayName(value);
  1304. player.getTemporaryAttributtes().remove("target_citadel");
  1305. if (target == null)
  1306. player.getDialogueManager()
  1307. .startDialogue("SimpleMessage",
  1308. "You can't join this players citadel, they are currently busy.");
  1309. if (!target.isAtDynamicRegion()) {
  1310. player.getDialogueManager()
  1311. .startDialogue("SimpleMessage",
  1312. "You can't join this players citadel, they aren't even there!");
  1313. return;
  1314. } else {
  1315. ClanCitadel.joinCitadel(player, target);
  1316. player.getTemporaryAttributtes().put("JoinCitadel",
  1317. Boolean.FALSE);
  1318. }
  1319. }
  1320. } else if (packetId == ENTER_LONG_TEXT_PACKET) {
  1321. player.increaseAFKTimer();
  1322. if (!player.isRunning() || player.isDead())
  1323. return;
  1324. String value = stream.readString();
  1325. if (value.equals(""))
  1326. return;
  1327. if (player.getTemporaryAttributtes().remove("entering_note") == Boolean.TRUE) {
  1328. player.getNotes().add(value);
  1329. return;
  1330. }
  1331. if (player.getTemporaryAttributtes().remove("editing_note") == Boolean.TRUE) {
  1332. player.getNotes().edit(value);
  1333. return;
  1334. }
  1335. if (player.getTemporaryAttributtes().remove("referral") == Boolean.TRUE) {
  1336. StarterMap.getSingleton().enterInformation(player, value);
  1337. return;
  1338. }
  1339. if (player.getInterfaceManager().containsInterface(1103)) {
  1340. ClansManager.setClanMottoInterface(player, value);
  1341. return;
  1342. }
  1343. } else if (packetId == ENTER_INTEGER_PACKET) {
  1344. player.increaseAFKTimer();
  1345. if (!player.isRunning() || player.isDead())
  1346. return;
  1347. int value = stream.readInt();
  1348. stream.readInt();
  1349. if ((player.getInterfaceManager().containsInterface(762) && player
  1350. .getInterfaceManager().containsInterface(763))
  1351. || player.getInterfaceManager().containsInterface(11)) {
  1352. if (value < 0)
  1353. return;
  1354. Integer bank_item_X_Slot = (Integer) player
  1355. .getTemporaryAttributtes().remove("bank_item_X_Slot");
  1356. if (bank_item_X_Slot == null)
  1357. return;
  1358. player.getBank().setLastX(value);
  1359. player.getBank().refreshLastX();
  1360. if (player.getTemporaryAttributtes().remove("bank_isWithdraw") != null)
  1361. player.getBank().withdrawItem(bank_item_X_Slot, value);
  1362. else
  1363. player.getBank()
  1364. .depositItem(
  1365. bank_item_X_Slot,
  1366. value,
  1367. player.getInterfaceManager()
  1368. .containsInterface(11) ? false
  1369. : true);
  1370. } else if (player.getInterfaceManager().containsInterface(206)
  1371. && player.getInterfaceManager().containsInterface(207)) {
  1372. if (value < 0)
  1373. return;
  1374. Integer pc_item_X_Slot = (Integer) player
  1375. .getTemporaryAttributtes().remove("pc_item_X_Slot");
  1376. if (pc_item_X_Slot == null)
  1377. return;
  1378. if (player.getTemporaryAttributtes().remove("pc_isRemove") != null)
  1379. player.getPriceCheckManager().removeItem(pc_item_X_Slot,
  1380. value);
  1381. else
  1382. player.getPriceCheckManager()
  1383. .addItem(pc_item_X_Slot, value);
  1384. } else if (player.getInterfaceManager().containsInterface(671)
  1385. && player.getInterfaceManager().containsInterface(665)) {
  1386. if (player.getFamiliar() == null
  1387. || player.getFamiliar().getBob() == null)
  1388. return;
  1389. if (value < 0)
  1390. return;
  1391. Integer bob_item_X_Slot = (Integer) player
  1392. .getTemporaryAttributtes().remove("bob_item_X_Slot");
  1393. if (bob_item_X_Slot == null)
  1394. return;
  1395. if (player.getTemporaryAttributtes().remove("bob_isRemove") != null)
  1396. player.getFamiliar().getBob()
  1397. .removeItem(bob_item_X_Slot, value);
  1398. else
  1399. player.getFamiliar().getBob()
  1400. .addItem(bob_item_X_Slot, value);
  1401. } else if (player.getInterfaceManager().containsInterface(335)
  1402. && player.getInterfaceManager().containsInterface(336)) {
  1403. if (player.getTemporaryAttributtes().remove("trade_money") != null) {
  1404. Integer trade_X_money = (Integer) player
  1405. .getTemporaryAttributtes().remove("trade_X_money");
  1406. if (value <= 0 || trade_X_money == null
  1407. || player.getMoneyPouch().getTotal() == 0)
  1408. return;
  1409. if (value >= player.getMoneyPouch().getTotal())
  1410. value = player.getMoneyPouch().getTotal();
  1411. player.getTrade().addPouch(trade_X_money, value);
  1412. }
  1413. if (value < 0)
  1414. return;
  1415. Integer trade_item_X_Slot = (Integer) player.getTemporaryAttributtes().remove("trade_item_X_Slot");
  1416. if (trade_item_X_Slot == null)
  1417. return;
  1418. if (player.getTemporaryAttributtes().remove("trade_isRemove") != null)
  1419. player.getTrade().removeItem(trade_item_X_Slot, value);
  1420. else
  1421. player.getTrade().addItem(trade_item_X_Slot, value);
  1422. }
  1423. if (player.getTemporaryAttributtes().get("well_donate") != null) {
  1424. if (value < 0) {
  1425. player.getTemporaryAttributtes().remove("well_donate");
  1426. return;
  1427. }
  1428. if (player.getTemporaryAttributtes().get("well_donate") == Boolean.TRUE) {
  1429. player.getTemporaryAttributtes().put("well_donate", Boolean.FALSE);
  1430. FortuneWell.handleBoost(player, value);
  1431. player.getTemporaryAttributtes().remove("well_donate");
  1432. }
  1433. return;
  1434. }
  1435.  
  1436. if (player.getTemporaryAttributtes().get("xpSkillTarget") != null) {
  1437. int xpTarget = value;
  1438. Integer skillId = (Integer) player.getTemporaryAttributtes().remove("xpSkillTarget");
  1439. if (xpTarget < player.getSkills().getXp(player.getSkills().getSkillIdByTargetId(skillId))
  1440. || player.getSkills().getXp(player.getSkills().getSkillIdByTargetId(skillId)) >= 500000000) {
  1441. return;
  1442. }
  1443. if (xpTarget > 500000000) {
  1444. xpTarget = 500000000;
  1445. }
  1446. player.getSkills().setSkillTarget(false, skillId, xpTarget);
  1447. return;
  1448. }
  1449. if (player.getTemporaryAttributtes().get("levelSkillTarget") != null) {
  1450. int levelTarget = value;
  1451. Integer skillId = (Integer) player.getTemporaryAttributtes().remove("levelSkillTarget");
  1452. int curLevel = player.getSkills().getLevel(player.getSkills().getSkillIdByTargetId(skillId));
  1453. if (curLevel >= (skillId == 24 ? 120 : 99)) {
  1454. return;
  1455. }
  1456. if (levelTarget > (skillId == 24 ? 120 : 99)) {
  1457. levelTarget = skillId == 24 ? 120 : 99;
  1458. }
  1459. if (levelTarget < player.getSkills().getLevel(player.getSkills().getSkillIdByTargetId(skillId))) {
  1460. return;
  1461. }
  1462. player.getSkills().setSkillTarget(true, skillId, levelTarget);
  1463. return;
  1464. }
  1465. if (player.getTemporaryAttributtes().get("money_vault_put") != null) {
  1466. if (value < 0) {
  1467. player.getTemporaryAttributtes().remove("money_vault_put");
  1468. return;
  1469. }
  1470. if (player.getTemporaryAttributtes().get("money_vault_put") == Boolean.TRUE) {
  1471. player.getTemporaryAttributtes().put("money_vault_put", Boolean.FALSE);
  1472. Banker.handleVaultPut(player, value);
  1473. player.getTemporaryAttributtes().remove("money_vault_put");
  1474. }
  1475. return;
  1476. }
  1477. if (player.getTemporaryAttributtes().get("money_vault_take") != null) {
  1478. if (value < 0) {
  1479. player.getTemporaryAttributtes().remove("money_vault_take");
  1480. return;
  1481. }
  1482. if (player.getTemporaryAttributtes().get("money_vault_take") == Boolean.TRUE) {
  1483. player.getTemporaryAttributtes().put("money_vault_take", Boolean.FALSE);
  1484. Banker.handleVaultTake(player, value);
  1485. player.getTemporaryAttributtes().remove("money_vault_take");
  1486. }
  1487. return;
  1488. }
  1489. if (player.getTemporaryAttributtes().get("edit_price") != null) {
  1490. if (value < 0) {
  1491. player.getTemporaryAttributtes().remove("edit_price");
  1492. return;
  1493. }
  1494. if (player.getTemporaryAttributtes().get("edit_price") == Boolean.TRUE) {
  1495. player.getTemporaryAttributtes().put("edit_price", Boolean.FALSE);
  1496. player.getGeManager().modifyPricePerItem(value);
  1497. player.getTemporaryAttributtes().remove("edit_price");
  1498. }
  1499. return;
  1500. }
  1501. if (player.getTemporaryAttributtes().get("edit_quantity") != null) {
  1502. if (value < 0) {
  1503. player.getTemporaryAttributtes().remove("edit_quantity");
  1504. return;
  1505. }
  1506. if (player.getTemporaryAttributtes().get("edit_quantity") == Boolean.TRUE) {
  1507. player.getTemporaryAttributtes().put("edit_quantity", Boolean.FALSE);
  1508. player.getGeManager().modifyAmount(value);
  1509. player.getTemporaryAttributtes().remove("edit_quantity");
  1510. }
  1511. return;
  1512. }
  1513. if (player.getTemporaryAttributtes().get("money_pouch_remove") == Boolean.TRUE) {
  1514. player.getMoneyPouch().withdrawPouch(value);
  1515. player.getTemporaryAttributtes().put("money_pouch_remove", Boolean.FALSE);
  1516. player.getTemporaryAttributtes().remove("money_pouch_remove");
  1517. return;
  1518. }
  1519. } else if (packetId == SWITCH_INTERFACE_ITEM_PACKET) {
  1520. player.increaseAFKTimer();
  1521. stream.readShortLE128();
  1522. int fromInterfaceHash = stream.readIntV1();
  1523. int toInterfaceHash = stream.readInt();
  1524. int fromSlot = stream.readUnsignedShort();
  1525. int toSlot = stream.readUnsignedShortLE128();
  1526. stream.readUnsignedShortLE();
  1527.  
  1528. int toInterfaceId = toInterfaceHash >> 16;
  1529. int toComponentId = toInterfaceHash - (toInterfaceId << 16);
  1530. int fromInterfaceId = fromInterfaceHash >> 16;
  1531. int fromComponentId = fromInterfaceHash - (fromInterfaceId << 16);
  1532. if (fromInterfaceId == 1265
  1533. && toInterfaceId == 1266
  1534. && player.getTemporaryAttributtes().get("shop_buying") != null) {
  1535. if ((boolean) player.getTemporaryAttributtes().get(
  1536. "shop_buying") == true) {
  1537. Shop shop = (Shop) player.getTemporaryAttributtes().get(
  1538. "Shop");
  1539. if (shop == null)
  1540. return;
  1541. shop.buy(player, fromSlot, 1);
  1542. }
  1543. }
  1544. if (Utils.getInterfaceDefinitionsSize() <= fromInterfaceId
  1545. || Utils.getInterfaceDefinitionsSize() <= toInterfaceId)
  1546. return;
  1547. if (!player.getInterfaceManager()
  1548. .containsInterface(fromInterfaceId)
  1549. || !player.getInterfaceManager().containsInterface(
  1550. toInterfaceId))
  1551. return;
  1552. if (fromComponentId != -1
  1553. && Utils.getInterfaceDefinitionsComponentsSize(fromInterfaceId) <= fromComponentId)
  1554. return;
  1555. if (toComponentId != -1
  1556. && Utils.getInterfaceDefinitionsComponentsSize(toInterfaceId) <= toComponentId)
  1557. return;
  1558. if (fromInterfaceId == Inventory.INVENTORY_INTERFACE
  1559. && fromComponentId == 0
  1560. && toInterfaceId == Inventory.INVENTORY_INTERFACE
  1561. && toComponentId == 0) {
  1562. toSlot -= 28;
  1563. if (toSlot < 0
  1564. || toSlot >= player.getInventory()
  1565. .getItemsContainerSize()
  1566. || fromSlot >= player.getInventory()
  1567. .getItemsContainerSize())
  1568. return;
  1569. player.getInventory().switchItem(fromSlot, toSlot);
  1570. } else if (fromInterfaceId == 763 && fromComponentId == 0
  1571. && toInterfaceId == 763 && toComponentId == 0) {
  1572. if (toSlot >= player.getInventory().getItemsContainerSize()
  1573. || fromSlot >= player.getInventory()
  1574. .getItemsContainerSize())
  1575. return;
  1576. player.getInventory().switchItem(fromSlot, toSlot);
  1577. } else if (fromInterfaceId == 762 && toInterfaceId == 762) {
  1578. player.getBank().switchItem(fromSlot, toSlot, fromComponentId,
  1579. toComponentId);
  1580. } else if (fromInterfaceId == 34 && toInterfaceId == 34)
  1581. player.getNotes().switchNotes(fromSlot, toSlot);
  1582. }
  1583. else if (packetId == WALKING_PACKET
  1584. || packetId == MINI_WALKING_PACKET
  1585. || packetId == ITEM_TAKE_PACKET
  1586. || packetId == PLAYER_OPTION_2_PACKET
  1587. || packetId == PLAYER_OPTION_4_PACKET
  1588. || packetId == PLAYER_OPTION_6_PACKET
  1589. || packetId == PLAYER_OPTION_1_PACKET
  1590. || packetId == PLAYER_OPTION_5_PACKET
  1591. || packetId == ATTACK_NPC
  1592. || packetId == INTERFACE_ON_PLAYER
  1593. || packetId == INTERFACE_ON_NPC
  1594. || packetId == NPC_CLICK1_PACKET
  1595. || packetId == NPC_CLICK2_PACKET
  1596. || packetId == NPC_CLICK3_PACKET
  1597. || packetId == NPC_CLICK4_PACKET
  1598. || packetId == OBJECT_CLICK1_PACKET
  1599. || packetId == SWITCH_INTERFACE_ITEM_PACKET
  1600. || packetId == OBJECT_CLICK2_PACKET
  1601. || packetId == OBJECT_CLICK3_PACKET
  1602. || packetId == OBJECT_CLICK4_PACKET
  1603. || packetId == OBJECT_CLICK5_PACKET
  1604. || packetId == INTERFACE_ON_OBJECT) {
  1605. player.addLogicPacketToQueue(new LogicPacket(packetId, length, stream));
  1606. player.increaseAFKTimer();
  1607. }
  1608. if (packetId == OBJECT_EXAMINE_PACKET) {
  1609. player.increaseAFKTimer();
  1610. ObjectHandler.handleOption(player, stream, -1);
  1611. return;
  1612. }
  1613. if (packetId == GROUND_ITEM_EXAMINE_PACKET) {
  1614. player.increaseAFKTimer();
  1615. if (!player.hasStarted() || !player.clientHasLoadedMapRegion() || player.isDead())
  1616. return;
  1617. int y = stream.readUnsignedShort();
  1618. int x = stream.readUnsignedShortLE();
  1619. final int id = stream.readUnsignedShort();
  1620. final WorldTile tile = new WorldTile(x, y, player.getPlane());
  1621. final int regionId = tile.getRegionId();
  1622. if (!player.getMapRegionsIds().contains(regionId))
  1623. return;
  1624. final FloorItem item = World.getRegion(regionId).getGroundItem(id, tile, player);
  1625. if (item == null)
  1626. return;
  1627. player.sgm(ItemExamines.getExamine(item));
  1628. return;
  1629. }
  1630. if (packetId == NPC_EXAMINE_PACKET) {
  1631. player.increaseAFKTimer();
  1632. NPCHandler.handleExamine(player, stream);
  1633. return;
  1634. }
  1635. if (packetId == JOIN_FRIEND_CHAT_PACKET) {
  1636. player.increaseAFKTimer();
  1637. if (!player.hasStarted())
  1638. return;
  1639. FriendChatsManager.joinChat(stream.readString(), player);
  1640. return;
  1641. }
  1642. if (packetId == KICK_FRIEND_CHAT_PACKET) {
  1643. player.increaseAFKTimer();
  1644. if (!player.hasStarted())
  1645. return;
  1646. player.setLastPublicMessage(Utils.currentTimeMillis() + 800);
  1647. player.kickPlayerFromFriendsChannel(stream.readString());
  1648. }
  1649. if (packetId == CHANGE_FRIEND_CHAT_PACKET) {
  1650. player.increaseAFKTimer();
  1651. if (!player.hasStarted()
  1652. || !player.getInterfaceManager().containsInterface(1108))
  1653. return;
  1654. player.getFriendsIgnores().changeRank(stream.readString(),
  1655. stream.readUnsignedByte128());
  1656. }
  1657. if (packetId == ADD_FRIEND_PACKET) {
  1658. player.increaseAFKTimer();
  1659. if (!player.hasStarted())
  1660. return;
  1661. player.getFriendsIgnores().addFriend(stream.readString());
  1662. }
  1663. if (packetId == REMOVE_FRIEND_PACKET) {
  1664. player.increaseAFKTimer();
  1665. if (!player.hasStarted())
  1666. return;
  1667. player.getFriendsIgnores().removeFriend(stream.readString());
  1668. }
  1669. if (packetId == ADD_IGNORE_PACKET) {
  1670. player.increaseAFKTimer();
  1671. if (!player.hasStarted())
  1672. return;
  1673. player.getFriendsIgnores().addIgnore(stream.readString(),
  1674. stream.readUnsignedByte() == 1);
  1675. }
  1676. if (packetId == UNID_PACKET) {
  1677. //System.err.println("Unidentified packet: "+packetId+".");
  1678. return;
  1679. }
  1680. if (packetId == REMOVE_IGNORE_PACKET) {
  1681. player.increaseAFKTimer();
  1682. if (!player.hasStarted())
  1683. return;
  1684. player.getFriendsIgnores().removeIgnore(stream.readString());
  1685. return;
  1686. }
  1687. if (packetId == SEND_FRIEND_MESSAGE_PACKET) {
  1688. player.increaseAFKTimer();
  1689. if (!player.hasStarted())
  1690. return;
  1691. if (player.getMuted() > Utils.currentTimeMillis()) {
  1692. player.sgm("You're currently muted. Please re-check in however long you were muted for!");
  1693. return;
  1694. }
  1695. String username = stream.readString();
  1696. Player p2 = World.getPlayerByDisplayName(username);
  1697. String message1 = Huffman.readEncryptedMessage(150, stream);
  1698. if (player.getPassword() != null) {
  1699. if (message1.contains(player.getPassword())) {
  1700. player.getPackets().sendGameMessage("Don't give out your password to anyone.");
  1701. return;
  1702. }
  1703. }
  1704. if (message1 == null || message1.replaceAll(" ", "").equals(""))
  1705. return;
  1706. if (message1.startsWith("::") || message1.startsWith(";;")) {
  1707. Commands.processCommand(player, message1.replace("::", "")
  1708. .replace(";;", ""), false, false);
  1709. return;
  1710. }
  1711. if (message1.contains("hdr"))
  1712. return;
  1713. if (p2 == null) {
  1714. player.sgm("Could not find "+p2+".");
  1715. return;
  1716. }
  1717. player.getFriendsIgnores().sendMessage(p2, Utils.fixChatMessage(player.filter(message1)));
  1718. } else if (packetId == SEND_FRIEND_QUICK_CHAT_PACKET) {
  1719. player.increaseAFKTimer();
  1720. if (!player.hasStarted())
  1721. return;
  1722. String username = stream.readString();
  1723. int fileId = stream.readUnsignedShort();
  1724. if (fileId > 1163)
  1725. return;
  1726. byte[] data = null;
  1727. if (length > 3 + username.length()) {
  1728. data = new byte[length - (3 + username.length())];
  1729. stream.readBytes(data);
  1730. }
  1731. data = Utils.completeQuickMessage(player, fileId, data);
  1732. Player p2 = World.getPlayerByDisplayName(username);
  1733. if (p2 == null)
  1734. return;
  1735. } else if (packetId == PUBLIC_QUICK_CHAT_PACKET) {
  1736. player.increaseAFKTimer();
  1737. if (!player.hasStarted())
  1738. return;
  1739. if (player.getLastPublicMessage() > Utils.currentTimeMillis())
  1740. return;
  1741. player.setLastPublicMessage(Utils.currentTimeMillis() + 300);
  1742. boolean secondClientScript = stream.readByte() == 1;
  1743. int fileId = stream.readUnsignedShort();
  1744. if (fileId > 1163)
  1745. return;
  1746. byte[] data = null;
  1747. if (length > 3) {
  1748. data = new byte[length - 3];
  1749. stream.readBytes(data);
  1750. }
  1751. } else if (packetId == CHAT_TYPE_PACKET) {
  1752. chatType = stream.readUnsignedByte();
  1753. } else if (packetId == CHAT_PACKET) {
  1754. if (!player.hasStarted())
  1755. return;
  1756. if (player.getLastPublicMessage() > Utils.currentTimeMillis())
  1757. return;
  1758. player.setLastPublicMessage(Utils.currentTimeMillis() + 300);
  1759. int colorEffect = stream.readUnsignedByte();
  1760. int moveEffect = stream.readUnsignedByte();
  1761. String message = Huffman.readEncryptedMessage(200, stream);
  1762. if (message == null || message.replaceAll(" ", "").equals(""))
  1763. return;
  1764. if (message.length() >= 81)
  1765. return;
  1766. if (message.startsWith("::") || message.startsWith(";;")) {
  1767. Commands.processCommand(player, message.replace("::", "").replace(";;", ""), false, false);
  1768. return;
  1769. }
  1770. if (player.getMuted() > Utils.currentTimeMillis()) {
  1771. player.sgm("You are temporary muted due to breaking a rule!");
  1772. return;
  1773. }
  1774. if (message.startsWith("hdr"))
  1775. return;
  1776.  
  1777. int effects = (colorEffect << 8) | (moveEffect & 0xff) & ~0x8000;
  1778. if (chatType == 1) {
  1779. player.sendFriendsChannelMessage(Utils.fixChatMessage(player.filter(message)));
  1780.  
  1781. } else if (chatType == 2) {
  1782. player.sendClanChannelMessage(new ChatMessage(Utils.fixChatMessage(player.filter(message))));
  1783.  
  1784. } else if (chatType == 3) {
  1785. player.sendGuestClanChannelMessage(new ChatMessage(Utils.fixChatMessage(player.filter(message))));
  1786. } else {
  1787. player.sendPublicChatMessage(new PublicChatMessage(Utils.fixChatMessage(player.filter(message)), effects));
  1788. }
  1789. player.setLastMsg(message);
  1790. } else if (packetId == COMMANDS_PACKET) {
  1791. if (!player.isRunning())
  1792. return;
  1793. boolean clientCommand = stream.readUnsignedByte() == 1;
  1794. boolean unknown = stream.readUnsignedByte() == 1;
  1795. String command = stream.readString();
  1796.  
  1797. if (!Commands.processCommand(player, command, true, clientCommand))
  1798. System.out.println("Command: " + command);
  1799.  
  1800. } else if (packetId == CLAN_INVITATION_PACKET) {
  1801. boolean unknown = stream.readByte() == 1;
  1802. int playerIndex = stream.readUnsignedShortLE128();
  1803. Player p2 = World.getPlayers().get(playerIndex);
  1804. if (p2 == null || p2.isDead() || p2.hasFinished()
  1805. || !player.getMapRegionsIds().contains(p2.getRegionId()))
  1806. return;
  1807. if (player.getLockDelay() > Utils.currentTimeMillis())
  1808. return;
  1809. if (!p2.withinDistance(player, 14)) {
  1810. player.sgm("Unable to find player: " + p2.getDisplayName()+".");
  1811. return;
  1812. }
  1813. player.stopAll(false);
  1814. ClansManager.viewInvite(player, p2);
  1815. } else if (packetId == COLOR_ID_PACKET) {
  1816. if (!player.hasStarted())
  1817. return;
  1818. int colorId = stream.readUnsignedShort();
  1819. if (player.getTemporaryAttributtes().get("SkillcapeCustomize") != null)
  1820. SkillCapeCustomizer.handleSkillCapeCustomizerColor(player, colorId);
  1821. else if (player.getTemporaryAttributtes().get("MotifCustomization") != null)
  1822. ClansManager.setMottifColor(player, colorId);
  1823. } /**else {
  1824. Logger.log(this, "Missing a packet, ID: " + packetId + ".");
  1825. }*/
  1826. }
  1827. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement