Untitled

 avatar
unknown
java
4 years ago
111 kB
5
Indexable
package com.rs.network.protocol.codec.decode;

import com.rs.Settings;
import com.rs.game.Animation;
import com.rs.game.Graphics;
import com.rs.game.World;
import com.rs.game.WorldObject;
import com.rs.game.WorldTile;
import com.rs.game.activites.dpm.DPMController;
import com.rs.game.activites.soulwars.SoulWarsManager;
import com.rs.game.item.FloorItem;
import com.rs.game.item.Item;
import com.rs.game.item.ItemsContainer;
import com.rs.game.map.bossInstance.BossInstanceHandler;
import com.rs.game.map.bossInstance.BossInstanceHandler.Boss;
import com.rs.game.npc.NPC;
import com.rs.game.npc.familiar.Familiar;
import com.rs.game.npc.familiar.Familiar.SpecialAttack;
import com.rs.game.npc.others.MirrorbackSpider;
import com.rs.game.player.Bank;
import com.rs.game.player.Equipment;
import com.rs.game.player.Equipment.SavedCosmetic;
import com.rs.game.player.FarmingManager.FarmingSpot;
import com.rs.game.player.FarmingManager.SpotInfo;
import com.rs.game.player.Inventory;
import com.rs.game.player.LendingManager;
import com.rs.game.player.LoginManager;
import com.rs.game.player.PetLootManager.RestrictedItem;
import com.rs.game.player.Player;
import com.rs.game.player.PlayerExamine;
import com.rs.game.player.Skills;
import com.rs.game.player.TemporaryAttributes.Key;
import com.rs.game.player.ViewProfile;
import com.rs.game.player.actions.CombinationPotions;
import com.rs.game.player.actions.PlayerFollow;
import com.rs.game.player.actions.firemaking.Firemaking;
import com.rs.game.player.actions.summoning.Summoning;
import com.rs.game.player.combat.PlayerCombat;
import com.rs.game.player.content.AccountInterfaceManager;
import com.rs.game.player.content.ArtisansWorkShop;
import com.rs.game.player.content.ChatMessage;
import com.rs.game.player.content.Commands;
import com.rs.game.player.content.CosmeticsHandler;
import com.rs.game.player.content.DungeonRewardShop;
import com.rs.game.player.content.FriendChatsManager;
import com.rs.game.player.content.LogicPacket;
import com.rs.game.player.content.Lottery;
import com.rs.game.player.content.Magic;
import com.rs.game.player.content.Profanity;
import com.rs.game.player.content.PublicChatMessage;
import com.rs.game.player.content.QuickChatMessage;
import com.rs.game.player.content.RouteEvent;
import com.rs.game.player.content.Shop;
import com.rs.game.player.content.SkillCapeCustomizer;
import com.rs.game.player.content.ancientthrone.ThroneManager;
import com.rs.game.player.content.clans.ClansManager;
import com.rs.game.player.content.construction.House;
import com.rs.game.player.content.construction.TabletMaking;
import com.rs.game.player.content.dungeoneering.skills.DungeoneeringSmithing;
import com.rs.game.player.content.dungeoneering.skills.DungeoneeringSummoning;
import com.rs.game.player.content.input.InputEvent;
import com.rs.game.player.content.input.impl.InputIntegerEvent;
import com.rs.game.player.content.input.impl.InputLongStringEvent;
import com.rs.game.player.content.input.impl.InputNameEvent;
import com.rs.game.player.content.pet.Pets;
import com.rs.game.player.controllers.EliteDungeonController;
import com.rs.game.player.controllers.EliteDungeonsLobby;
import com.rs.game.player.controllers.Wilderness;
import com.rs.game.player.dialogue.impl.PetShopOwner;
import com.rs.game.route.RouteFinder;
import com.rs.game.route.strategy.FixedTileStrategy;
import com.rs.game.tasks.WorldTask;
import com.rs.game.tasks.WorldTasksManager;
import com.rs.network.protocol.codec.decode.impl.ButtonHandler;
import com.rs.network.protocol.codec.decode.impl.InventoryOptionsHandler;
import com.rs.network.protocol.codec.decode.impl.NPCHandler;
import com.rs.network.protocol.codec.decode.impl.ObjectHandler;
import com.rs.stream.InputStream;
import com.rs.stream.OutputStream;
import com.rs.utils.Colors;
import com.rs.utils.DiscordMessage;
import com.rs.utils.DisplayNames;
import com.rs.utils.Encrypt;
import com.rs.utils.IPMute;
import com.rs.utils.ItemExamines;
import com.rs.utils.Lend;
import com.rs.utils.Logger;
import com.rs.utils.LoggingSystem;
import com.rs.utils.NPCExamines;
import com.rs.utils.SerializableFilesManager;
import com.rs.utils.Utils;
import com.rs.utils.huffman.Huffman;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.ReferenceCountUtil;

/*import mysql.impl.NewsManager;*/

@SuppressWarnings("unused")
public final class WorldPacketsDecoder extends ChannelInboundHandlerAdapter {

	/**
	 * The packet sizes
	 */
	private static final byte[] PACKET_SIZES = new byte[109];
	private final static int ITEM_ON_FLOOR_EXAMINE = 42;
	private final static int WALKING_PACKET = 74;
	private final static int MINI_WALKING_PACKET = 41;
	public final static int ACTION_BUTTON1_PACKET = 4;
	public final static int ACTION_BUTTON2_PACKET = 22;
	public final static int ACTION_BUTTON3_PACKET = 13;
	public final static int ACTION_BUTTON4_PACKET = 76;
	public final static int ACTION_BUTTON5_PACKET = 59;
	public final static int ACTION_BUTTON6_PACKET = 37;
	public final static int ACTION_BUTTON7_PACKET = 69;
	public final static int ACTION_BUTTON8_PACKET = 28;
	public final static int ACTION_BUTTON9_PACKET = 103;
	public final static int ACTION_BUTTON10_PACKET = 80;
	public final static int WORLD_MAP_CLICK = 66;
	public final static int RECEIVE_PACKET_COUNT_PACKET = 56;
	private final static int PLAYER_OPTION_3_PACKET = 8;
	private final static int PLAYER_OPTION_4_PACKET = 104;
	private final static int PLAYER_OPTION_6_PACKET = 36;
	private final static int MOVE_CAMERA_PACKET = 33;
	private final static int INTERFACE_ON_OBJECT = 107;
	private final static int CLICK_PACKET = 90;
	private final static int CLICK_PACKET2 = 61;
	private final static int MOUVE_MOUSE_PACKET = 98;
	private final static int MOUVE_MOUSE_PACKET2 = 67;
	private final static int KEY_TYPED_PACKET = 24;
	private final static int CLOSE_INTERFACE_PACKET = 57;
	private final static int COMMANDS_PACKET = 20;
	private final static int INTERFACE_ON_INTERFACE = 26;
	private final static int IN_OUT_SCREEN_PACKET = 94;
	private final static int DONE_LOADING_REGION_PACKET = 64;
	private final static int PING_PACKET = 30;
	private final static int DISPLAY_PACKET = 31;
	private final static int CHAT_TYPE_PACKET = 70;
	private final static int CHAT_PACKET = 86;
	private final static int PUBLIC_QUICK_CHAT_PACKET = 87;
	private final static int ADD_FRIEND_PACKET = 71;
	private final static int ADD_IGNORE_PACKET = 38;
	private final static int REMOVE_IGNORE_PACKET = 17;
	private final static int JOIN_FRIEND_CHAT_PACKET = 84;
	private final static int CHANGE_FRIEND_CHAT_PACKET = 75;
	private final static int KICK_FRIEND_CHAT_PACKET = 45;
	private final static int KICK_CLAN_CHAT_PACKET = -92;
	private final static int REMOVE_FRIEND_PACKET = 81;
	private final static int SEND_FRIEND_MESSAGE_PACKET = 95;
	private final static int SEND_FRIEND_QUICK_CHAT_PACKET = -123;
	private final static int OBJECT_CLICK1_PACKET = 40;
	private final static int OBJECT_CLICK2_PACKET = 3;
	private final static int OBJECT_CLICK3_PACKET = 16;
	private final static int OBJECT_CLICK4_PACKET = 85;
	private final static int OBJECT_CLICK5_PACKET = 82;
	private final static int OBJECT_EXAMINE_PACKET = 49;
	private final static int NPC_CLICK1_PACKET = 72;
	private final static int NPC_CLICK2_PACKET = 43;
	private final static int NPC_CLICK3_PACKET = 88;
	private final static int NPC_CLICK4_PACKET = 32;
	private final static int ATTACK_NPC = 54;
	private final static int PLAYER_OPTION_1_PACKET = 44;
	private final static int PLAYER_OPTION_2_PACKET = 79;
	private static final int PLAYER_OPTION_5_PACKET = 58;
	private final static int PLAYER_OPTION_9_PACKET = 55;
	private final static int ITEM_TAKE_PACKET = 62;
	private final static int GROUND_ITEM_OPTION_2_PACKET = 27;
	private final static int GROUND_ITEM_OPTION_EXAMINE = 42;
	private final static int DIALOGUE_CONTINUE_PACKET = 83;
	private final static int ENTER_INTEGER_PACKET = 65;
	private final static int ENTER_NAME_PACKET = 68;
	private final static int ENTER_LONG_TEXT_PACKET = 21;
	private final static int SWITCH_INTERFACE_COMPONENTS_PACKET = 7;
	private final static int INTERFACE_ON_PLAYER = 106;
	private final static int INTERFACE_ON_NPC = 6;
	private final static int COLOR_ID_PACKET = 5;
	private static final int NPC_EXAMINE_PACKET = 0;
	private static final int FORUM_THREAD_ID_PACKET = -18;
	private final static int OPEN_URL_PACKET = -91;
	private final static int REPORT_ABUSE_PACKET = -11;
	private final static int GRAND_EXCHANGE_ITEM_SELECT_PACKET = 105;
	private final static int WORLD_LIST_UPDATE = -87;
	private final static int UPDATE_GAMEBAR_PACKET = -73;
	private final static int DROP_ITEM_PACKET = -104;
	public final static int ESCAPE_PRESSED_PACKET = -105;

	static {
		loadPacketSizes();
	}

	public static void decodeLogicPacket(final Player player, LogicPacket packet) {
		int packetId = packet.getId();
		InputStream stream = new InputStream(packet.getData());
		if (packetId == NPC_CLICK4_PACKET) {
			NPCHandler.handleOption4(player, stream);
			return;
		}
		if (packetId == WALKING_PACKET || packetId == MINI_WALKING_PACKET) {
			if (!player.isActive() || !player.clientHasLoadedMapRegion() || player.isDead() || player.isLocked()) {
				return;
			}
			if (player.getFreezeDelay() >= Utils.currentTimeMillis()) {
				player.sendMessage("A magical force prevents you from moving.", true);
				return;
			}
			int baseY = stream.readUnsignedShort();
			int baseX = stream.readUnsignedShortLE128();
			boolean forceRun = stream.readUnsignedByte() == 1;
			player.stopAll();
			if (forceRun) {
				player.setRun(forceRun);
			}
			int steps = RouteFinder.findRoute(RouteFinder.WALK_ROUTEFINDER, player.getX(), player.getY(),
					player.getPlane(), player.getSize(), new FixedTileStrategy(baseX, baseY), true);
			if (steps < 1) {
				return;
			}
			int[] bufferX = RouteFinder.getLastPathBufferX();
			int[] bufferY = RouteFinder.getLastPathBufferY();
			int last = -1;
			for (int i = steps - 1; i >= 0; i--) {
				if (!player.addWalkSteps(bufferX[i], bufferY[i], 25, true)) {
					break;
				}
				last = i;
			}

			if (last != -1) {
				WorldTile tile = new WorldTile(bufferX[last], bufferY[last], player.getPlane());
				player.getPackets().sendMinimapFlag(
						tile.getLocalX(player.getLastLoadedMapRegionTile(), player.getMapSize()),
						tile.getLocalY(player.getLastLoadedMapRegionTile(), player.getMapSize()));
			} else {
				player.getPackets().sendResetMinimapFlag();
			}
			player.increaseAFKTimer();
		} else if (packetId == OBJECT_CLICK1_PACKET) {
			ObjectHandler.handleOption(player, stream, 1);
		} else if (packetId == OBJECT_CLICK2_PACKET) {
			ObjectHandler.handleOption(player, stream, 2);
		} else if (packetId == OBJECT_CLICK3_PACKET) {
			ObjectHandler.handleOption(player, stream, 3);
		} else if (packetId == OBJECT_CLICK4_PACKET) {
			ObjectHandler.handleOption(player, stream, 4);
		} else if (packetId == OBJECT_CLICK5_PACKET) {
			ObjectHandler.handleOption(player, stream, 5);
		} else if (packetId == INTERFACE_ON_PLAYER) {
			if (!player.isActive() || !player.clientHasLoadedMapRegion() || player.isDead()) {
				return;
			}
			if (player.getLockDelay() > Utils.currentTimeMillis()) {
				return;
			}
			final int itemId = stream.readShort128();
			final boolean forceRun = stream.readByte() == 1;
			int interfaceHash = stream.readInt();
			int interfaceSlot = stream.readUnsignedShort();
			int playerIndex = stream.readUnsignedShortLE();
			int interfaceId = interfaceHash >> 16;
			int componentId = interfaceHash - (interfaceId << 16);
			if (Utils.getInterfaceDefinitionsSize() <= interfaceId) {
				return;
			}
			if (!player.getInterfaceManager().containsInterface(interfaceId)) {
				return;
			}
			if (componentId == 65535) {
				componentId = -1;
			}
			if (componentId != -1 && Utils.getInterfaceDefinitionsComponentsSize(interfaceId) <= componentId) {
				return;
			}
			Player p2 = World.getPlayers().get(playerIndex);
			if (p2 == null || p2.isDead() || p2.hasFinished()
					|| !player.getMapRegionsIds().contains(p2.getRegionId())) {
				return;
			}
			player.stopAll(false);
			if (interfaceId == 679) {
				Item item = player.getInventory().getItems().get(interfaceSlot);
				if (!player.getControlerManager().processItemOnPlayer(p2, item.getId())) {
					return;
				}
				if (item == null) {
					return;
				}
				if (LendingManager.isLendedItem(player, item)) {
					Lend lend = LendingManager.getLend(player);
					if (lend == null) {
						return;
					}
					if (!lend.getLender().equals(p2.getUsername())) {
						player.sendMessage("You can't give your lent item to a stranger...");
						return;
					}
					player.getDialogueManager().startDialogue("LendReturn", lend);
					return;
				}
				InventoryOptionsHandler.handleItemOnPlayer(player, p2, item.getId());
			}
			switch (interfaceId) {
			case 1110:
				if (componentId == 87) {
					ClansManager.invite(player, p2);
				}
				break;
			case 662:
			case 747:
				if (player.getFamiliar() == null) {
					return;
				}
				player.resetWalkSteps();
				if (interfaceId == 747 && componentId == 15 || interfaceId == 662 && componentId == 65
						|| interfaceId == 662 && componentId == 74 || interfaceId == 747 && componentId == 18) {
					if (interfaceId == 662 && componentId == 74 || interfaceId == 747 && componentId == 24
							|| interfaceId == 747 && componentId == 18) {
						if (player.getFamiliar().getSpecialAttack() != SpecialAttack.ENTITY) {
							return;
						}
					}
					if (!player.isCanPvp() || !p2.isCanPvp()) {
						player.getPackets().sendGameMessage("You can only attack players in a player-vs-player area.");
						return;
					}
					if (!player.getFamiliar().canAttack(p2)) {
						player.getPackets().sendGameMessage("You can only use your familiar in a multi-zone area.");
						return;
					} else {
						player.getFamiliar().setSpecial(
								interfaceId == 662 && componentId == 74 || interfaceId == 747 && componentId == 18,
								false);
						player.getFamiliar().setTarget(p2);
					}
				}
				break;
			case 950:
				if (componentId == 52) {
					if (!(p2 instanceof Player)) {
						return;
					}
					if (player.getLunarDelay() > Utils.currentTimeMillis()) {
						return;
					}
					if (!Magic.checkCombatSpell(player, 52, -1, false)) {
						return;
					}
					if (p2 == null || p2.hasFinished() || p2.isDead()) {
						return;
					}
					if (!p2.getPoison().isPoisoned()) {
						player.getPackets().sendGameMessage(p2.getDisplayName() + " is not poisoned.");
						return;
					}
					Magic.checkCombatSpell(player, 52, -1, true);
					player.setLunarDelay(3000);
					player.getSkills().addXp(Skills.MAGIC, 65);
					WorldTasksManager.schedule(new WorldTask() {
						int loop;

						@Override
						public void run() {
							if (loop == 0) {
								player.faceEntity(p2);
								player.setNextAnimation(new Animation(4411));
							} else if (loop == 1) {
								p2.setNextGraphics(new Graphics(744, 0, 120));
								p2.getPoison().reset();
								p2.getPackets().sendGameMessage(
										"Your afflictions have been cured by " + player.getDisplayName() + ".");
								player.getPackets().sendGameMessage(
										"You have cured the afflictions of " + p2.getDisplayName() + ".");
								stop();
							}
							loop++;
						}
					}, 0, 1);
				} else if (componentId == 64) {
					if (!(p2 instanceof Player)) {
						return;
					}
					if (player.getSkills().getLevel(Skills.MAGIC) < 93) {
						player.getPackets().sendGameMessage("Your Magic level is not high enough for this spell.");
						return;
					}
					if (player.getSkills().getLevel(Skills.DEFENCE) < 40) {
						player.getPackets().sendGameMessage("You need a Defence level of 40 for this spell");
						return;
					}
					if (player.isCastVeng()) {
						player.sendMessage("You have already casted a vengeance!");
						return;
					}
					Long lastVeng = (Long) player.getTemporaryAttributtes().get("LAST_VENG");
					if (lastVeng != null && lastVeng + 30000 > Utils.currentTimeMillis()) {
						player.getPackets().sendGameMessage("Players may only cast vengeance once every 30 seconds.");
						return;
					}
					if (!Magic.checkCombatSpell(player, 64, -1, false)) {
						return;
					}
					player.faceEntity(p2);
					player.getSkills().addXp(Skills.MAGIC, 108);
					player.setLunarDelay(4000);
					player.setNextAnimation(new Animation(4411));
					player.getTemporaryAttributtes().put("LAST_VENG", Utils.currentTimeMillis());
					player.getPackets().sendGameMessage("You cast a vengeance.");
					p2.setNextGraphics(new Graphics(725, 0, 100));
					p2.setCastVeng(true);
					p2.getPackets().sendGameMessage("You have the power of vengeance!");
				}
				break;
			case 193:
				switch (componentId) {
				case 28:
				case 32:
				case 24:
				case 20:
				case 30:
				case 34:
				case 26:
				case 22:
				case 29:
				case 33:
				case 25:
				case 21:
				case 31:
				case 35:
				case 27:
				case 23:
					if (Magic.checkCombatSpell(player, componentId, 1, false)) {
						player.setNextFaceWorldTile(new WorldTile(p2.getCoordFaceX(p2.getSize()),
								p2.getCoordFaceY(p2.getSize()), p2.getPlane()));
						if (!player.getControlerManager().canAttack(p2)) {
							return;
						}
						if (!player.isCanPvp() || !p2.isCanPvp()) {
							player.getPackets()
									.sendGameMessage("You can only attack players in a player-vs-player area.");
							return;
						}
						if (!p2.isAtMultiArea() || !player.isAtMultiArea()) {
							if (player.getAttackedBy() != p2
									&& player.getAttackedByDelay() > Utils.currentTimeMillis()) {
								player.getPackets().sendGameMessage(
										"That " + (player.getAttackedBy() instanceof Player ? "player" : "npc")
												+ " is already in combat.",
										true);
								return;
							}
							/* PvP can attack */
							if (p2.getAttackedBy() != player && p2.getAttackedByDelay() > Utils.currentTimeMillis()) {
								if (p2.getAttackedBy() instanceof NPC) {
									p2.setAttackedBy(player);
								} else {
									player.getPackets().sendGameMessage("That player is already in combat.", true);
									return;
								}
							}
						}
						player.getActionManager().setAction(new PlayerCombat(p2));
					}
					break;
				}
				break;
			case 430:
				Magic.processLunarSpell(player, p2, componentId);
				break;
			case 79:
			case 85:
			case 90:
				if (p2 == null || p2.isDead() || !p2.isActive() || p2.hasFinished()
						|| !player.getControlerManager().canHit(p2) || p2.isLocked() || p2.isCanPvp()) {
					player.sendMessage("You cannot do this right now.");
					return;
				}
				if (!p2.isAcceptingAid()) {
					player.sendMessage("The targeted player isn't accepting aid.");
					return;
				} else if (p2.getInterfaceManager().containsScreenInter()) {
					player.sendMessage("Other player is busy.");
					return;
				}
				player.setNextAnimation(new Animation(1818));
				player.setNextGraphics(new Graphics(343));
				player.faceEntity(p2);
				final int comp = componentId;
				WorldTasksManager.schedule(new WorldTask() {

					@Override
					public void run() {
						switch (comp) {
						case 79:
							Magic.sendTeleother(player, p2, 74, 84, "Lumbridge", 566, 1, 563, 1, 557, 1);
							break;
						case 85:
							Magic.sendTeleother(player, p2, 82, 92, "Falador", 566, 1, 563, 1, 555, 1);
							break;
						case 90:
							Magic.sendTeleother(player, p2, 90, 100, "Camelot", 566, 2, 563, 1);
							break;
						}
					}
				}, 1);
				break;
			case 192:
				switch (componentId) {
				case 25: // air strike
				case 24:
				case 20:
				case 26:
				case 22:
				case 29:
				case 33:
				case 21:
				case 31:
				case 35:
				case 27:
				case 23:
				case 28: // water strike
				case 30: // earth strike
				case 32: // fire strike
				case 34: // air bolt
				case 39: // water bolt
				case 42: // earth bolt
				case 45: // fire bolt
				case 49: // air blast
				case 52: // water blast
				case 58: // earth blast
				case 63: // fire blast
				case 70: // air wave
				case 73: // water wave
				case 77: // earth wave
				case 80: // fire wave
				case 84: // air surge
				case 87: // water surge
				case 89: // earth surge
				case 66: // Sara Strike
				case 67: // Guthix Claws
				case 68: // Flame of Zammy
				case 93:
				case 91: // fire surge
				case 99: // storm of Armadyl
				case 36: // bind
				case 55: // snare
				case 81: // entangle
					if (Magic.checkCombatSpell(player, componentId, 1, false)) {
						player.setNextFaceWorldTile(new WorldTile(p2.getCoordFaceX(p2.getSize()),
								p2.getCoordFaceY(p2.getSize()), p2.getPlane()));
						if (!player.getControlerManager().canAttack(p2)) {
							return;
						}
						if (!player.isCanPvp() || !p2.isCanPvp()) {
							player.getPackets()
									.sendGameMessage("You can only attack players in a player-vs-player area.");
							return;
						}
						if (!p2.isAtMultiArea() || !player.isAtMultiArea()) {
							if (player.getAttackedBy() != p2
									&& player.getAttackedByDelay() > Utils.currentTimeMillis()) {
								player.getPackets().sendGameMessage(
										"That " + (player.getAttackedBy() instanceof Player ? "player" : "npc")
												+ " is already in combat.",
										true);
								return;
							}
							if (p2.getAttackedBy() != player && p2.getAttackedByDelay() > Utils.currentTimeMillis()) {
								if (p2.getAttackedBy() instanceof NPC) {
									p2.setAttackedBy(player);
								} else {
									player.getPackets().sendGameMessage("That player is already in combat.", true);
									return;
								}
							}
						}
						player.getActionManager().setAction(new PlayerCombat(p2));
					}
					break;

				}
				break;

			}
		} else if (packetId == INTERFACE_ON_NPC) {
			if (!player.isActive() || !player.clientHasLoadedMapRegion() || player.isDead()) {
				return;
			}
			if (player.getLockDelay() > Utils.currentTimeMillis()) {
				return;
			}
			int npcIndex = stream.readUnsignedShortLE128();
			int interfaceHash = stream.readIntV1();
			int itemId = stream.readUnsignedShort128();
			int interfaceSlot = stream.readUnsignedShort();
			boolean forceRun = stream.read128Byte() == 1;
			int interfaceId = interfaceHash >> 16;
			int componentId = interfaceHash - (interfaceId << 16);
			if (Utils.getInterfaceDefinitionsSize() <= interfaceId) {
				return;
			}
			if (!player.getInterfaceManager().containsInterface(interfaceId)) {
				return;
			}
			if (componentId == 65535) {
				componentId = -1;
			}
			if (componentId != -1 && Utils.getInterfaceDefinitionsComponentsSize(interfaceId) <= componentId) {
				return;
			}
			NPC npc = World.getNPCs().get(npcIndex);
			if (npc == null || npc.isDead() || npc.hasFinished()
					|| !player.getMapRegionsIds().contains(npc.getRegionId())) {
				return;
			}
			player.stopAll(false);
			if (interfaceId != Inventory.INVENTORY_INTERFACE) {
				if (!npc.getDefinitions().hasAttackOption()) {
					player.getPackets().sendGameMessage("You can't attack this npc.");
					return;
				}
			}
			switch (interfaceId) {
			case Inventory.INVENTORY_INTERFACE:
				Item item = player.getInventory().getItem(interfaceSlot);
				if (item == null || !player.getControlerManager().processItemOnNPC(npc, item)) {
					return;
				}
				InventoryOptionsHandler.handleItemOnNPC(player, npc, item);
				break;
			case 1165:
				Summoning.attackDreadnipTarget(npc, player);
				break;
			case 662:
			case 747:
				if (player.getFamiliar() == null) {
					return;
				}

				player.resetWalkSteps();
				if ((interfaceId == 747 && componentId == 15) || (interfaceId == 662 && componentId == 65)
						|| (interfaceId == 662 && componentId == 74) || interfaceId == 747 && componentId == 18
						|| interfaceId == 747 && componentId == 24) {
					if ((interfaceId == 662 && componentId == 74 || interfaceId == 747 && componentId == 18)) {
						if (player.getFamiliar().getSpecialAttack() != SpecialAttack.ENTITY) {
							return;
						}
					}
					if (npc instanceof Familiar) {
						Familiar familiar = (Familiar) npc;
						if (familiar == player.getFamiliar()) {
							player.getPackets().sendGameMessage("You can't attack your own familiar.");
							return;
						}
						if (!player.getFamiliar().canAttack(familiar.getOwner())) {
							player.getPackets()
									.sendGameMessage("You can only attack players in a player-vs-player area.");
							return;
						}
					}
					if (!player.getFamiliar().canAttack(npc)) {
						player.getPackets().sendGameMessage("You can only use your familiar in a multi-zone area.");
						return;
					} else {
						player.getFamiliar().setSpecial(
								interfaceId == 662 && componentId == 74 || interfaceId == 747 && componentId == 18);
						player.getFamiliar().setTarget(npc);
					}
				}
				break;
			case 950:
				switch (componentId) {
				case 25:// Wind strike
				case 26:// Confuse
				case 27:// Water strike
				case 28:// Earth strike
				case 29:// Weaken
				case 30:// Fire strike
				case 32:// Wind bolt
				case 33:// Curse
				case 34:// Bind
				case 36:// Water bolt
				case 37:// Earth bolt
				case 41:// Fire bolt
				case 42:// Wind blast
				case 43:// Water blast
				case 44:// Snare
				case 45:// Earth blast
				case 47:// Fire blast
				case 48:// Wind wave
				case 49:// Water wave
				case 50:// Vulnerability
					/** case 51: */ // Monster examine
					/** case 52: //Cure other */
				case 54:// Earth wave
				case 56:// Enfeeble
				case 58:// Fire wave
				case 59:// Entangle
				case 60:// Stun
				case 61:// Wind surge
				case 62:// Water surge
				case 63:// Earth surge
					/** case 64: //Vengeance other */
				case 67:// Fire surge
					if (Magic.checkCombatSpell(player, componentId, 1, false)) {
						player.setNextFaceWorldTile(new WorldTile(npc.getCoordFaceX(npc.getSize()),
								npc.getCoordFaceY(npc.getSize()), npc.getPlane()));
						if (!player.getControlerManager().canAttack(npc)) {
							return;
						}
						if (npc instanceof MirrorbackSpider) {
							if (player.mirrorback == npc) {
								player.sendMessage("You can't attack your own mirrorback spider.");
								return;
							} else if (!Wilderness.isAtWild(player)) {
								player.sendMessage("You cannot attack a mirrorback spider outside of Wilderness.");
								return;
							}
						}
						if (npc instanceof Familiar) {
							Familiar familiar = (Familiar) npc;
							if (familiar == player.getFamiliar()) {
								player.getPackets().sendGameMessage("You can't attack your own familiar.");
								return;
							}
							if (!familiar.canAttack(player)) {
								player.getPackets().sendGameMessage("You can't attack this npc.");
								return;
							}
						} else if (!npc.isForceMultiAttacked()) {
							if (!npc.isAtMultiArea() || !player.isAtMultiArea()) {
								if (player.getAttackedBy() != npc
										&& player.getAttackedByDelay() > Utils.currentTimeMillis()) {
									player.getPackets().sendGameMessage("You are already in combat.", true);
									return;
								}
								if (npc.getAttackedBy() != player
										&& npc.getAttackedByDelay() > Utils.currentTimeMillis()) {
									player.getPackets().sendGameMessage("This npc is already in combat.", true);
									return;
								}
							}
						}
						player.getActionManager().setAction(new PlayerCombat(npc));
					}
					break;
				case 51:
					player.setRouteEvent(new RouteEvent(npc, new Runnable() {

						@Override
						public void run() {
							if (npc == null || npc.isDead() || npc.hasFinished() || !player.withinDistance(npc, 3)) {
								return;
							}
							if (!Magic.checkCombatSpell(player, 51, -1, false)) {
								return;
							}
							player.setLunarDelay(3000);
							player.getSkills().addXp(Skills.MAGIC, 61);
							WorldTasksManager.schedule(new WorldTask() {
								int loop;

								@Override
								public void run() {
									if (npc == null || npc.isDead() || npc.hasFinished() || player == null
											|| !player.isActive() || player.hasFinished()) {
										stop();
										return;
									}
									if (loop == 0) {
										player.faceEntity(npc);
										player.setNextGraphics(new Graphics(1059));
										player.setNextAnimation(new Animation(6293));
									} else if (loop == 1) {
										npc.setNextGraphics(new Graphics(736));
										player.getInterfaceManager().sendTab(
												player.getInterfaceManager().hasRezizableScreen() ? 118 : 178, 522);
										player.getPackets().sendIComponentText(522, 0,
												"Monster Name:<br>" + npc.getDefinitions().getName());
										player.getPackets().sendIComponentText(522, 1,
												"Combat Level: " + npc.getCombatLevel());
										player.getPackets().sendIComponentText(522, 2,
												"Hitpoints: " + npc.getHitpoints() + "/" + npc.getMaxHitpoints());
										player.getPackets().sendIComponentText(522, 3,
												"Creature's max hit: " + npc.getMaxHit());
										player.getPackets().sendIComponentText(522, 4,
												"" + NPCExamines.getExamine(npc));
										stop();// stops the loop
									}
									loop++;
								}
							}, 0, 1);
						}
					}));
					break;
				}
				break;

			case 193:
				switch (componentId) {
				case 28:
				case 32:
				case 24:
				case 20:
				case 30:
				case 34:
				case 26:
				case 22:
				case 29:
				case 33:
				case 25:
				case 21:
				case 31:
				case 35:
				case 27:
				case 23:
					if (Magic.checkCombatSpell(player, componentId, 1, false)) {
						player.setNextFaceWorldTile(new WorldTile(npc.getCoordFaceX(npc.getSize()),
								npc.getCoordFaceY(npc.getSize()), npc.getPlane()));
						if (!player.getControlerManager().canAttack(npc)) {
							return;
						}
						if (npc instanceof Familiar) {
							Familiar familiar = (Familiar) npc;
							if (familiar == player.getFamiliar()) {
								player.getPackets().sendGameMessage("You can't attack your own familiar.");
								return;
							}
							if (!familiar.canAttack(player)) {
								player.getPackets().sendGameMessage("You can't attack this npc.");
								return;
							}
						} else if (!npc.isForceMultiAttacked()) {
							if (!npc.isAtMultiArea() || !player.isAtMultiArea()) {
								if (player.getAttackedBy() != npc
										&& player.getAttackedByDelay() > Utils.currentTimeMillis()) {
									player.getPackets().sendGameMessage("You are already in combat.", true);
									return;
								}
								if (npc.getAttackedBy() != player
										&& npc.getAttackedByDelay() > Utils.currentTimeMillis()) {
									player.getPackets().sendGameMessage("This npc is already in combat.", true);
									return;
								}
							}
						}
						player.getActionManager().setAction(new PlayerCombat(npc));
					}
					break;
				}
			case 192:
				switch (componentId) {
				case 25: // air strike
				case 28: // water strike
				case 30: // earth strike
				case 32: // fire strike
				case 34: // air bolt
				case 39: // water bolt
				case 42: // earth bolt
				case 45: // fire bolt
				case 49: // air blast
				case 52: // water blast
				case 58: // earth blast
				case 63: // fire blast
				case 70: // air wave
				case 73: // water wave
				case 77: // earth wave
				case 80: // fire wave
				case 84: // air surge
				case 87: // water surge
				case 89: // earth surge
				case 66: // Sara Strike
				case 67: // Guthix Claws
				case 68: // Flame of Zammy
				case 93:
				case 91: // fire surge
				case 99: // storm of Armadyl
				case 36: // bind
				case 55: // snare
				case 81: // entangle
					if (Magic.checkCombatSpell(player, componentId, 1, false)) {
						player.setNextFaceWorldTile(new WorldTile(npc.getCoordFaceX(npc.getSize()),
								npc.getCoordFaceY(npc.getSize()), npc.getPlane()));
						if (!player.getControlerManager().canAttack(npc)) {
							return;
						}
						if (npc instanceof Familiar) {
							Familiar familiar = (Familiar) npc;
							if (familiar == player.getFamiliar()) {
								player.getPackets().sendGameMessage("You can't attack your own familiar.");
								return;
							}
							if (!familiar.canAttack(player)) {
								player.getPackets().sendGameMessage("You can't attack this npc.");
								return;
							}
						} else if (!npc.isForceMultiAttacked()) {
							if (!npc.isAtMultiArea() || !player.isAtMultiArea()) {
								if (player.getAttackedBy() != npc
										&& player.getAttackedByDelay() > Utils.currentTimeMillis()) {
									player.getPackets().sendGameMessage("You are already in combat.", true);
									return;
								}
								if (npc.getAttackedBy() != player
										&& npc.getAttackedByDelay() > Utils.currentTimeMillis()) {
									player.getPackets().sendGameMessage("This npc is already in combat.", true);
									return;
								}
							}
						}
						player.getActionManager().setAction(new PlayerCombat(npc));
					}
					break;
				}
				break;
			case 430: // Lunar spells
				Magic.processLunarSpell(player, npc, componentId);
				break;
			}
			if (Settings.DEBUG) {
				System.out.println("Spell:" + componentId);
			}
		} else if (packetId == ATTACK_NPC) {
			if (!player.isActive() || !player.clientHasLoadedMapRegion() || player.isDead()
					|| player.getLockDelay() > Utils.currentTimeMillis()) {
				return;
			}
			int entityIndex = stream.readUnsignedShortLE();
			boolean forceRun = stream.readUnsignedByte() == 1;
			if (forceRun) {
				player.setRun(forceRun);
			}
			NPC npc = World.getNPCs().get(entityIndex);
			if (npc == null || npc.isDead() || npc.hasFinished()
					|| !player.getMapRegionsIds().contains(npc.getRegionId())
					|| !npc.getDefinitions().hasAttackOption()) {
				return;
			}
			if (!player.getControlerManager().canAttack(npc)) {
				return;
			}
			if (npc instanceof Familiar) {
				Familiar familiar = (Familiar) npc;
				if (familiar == player.getFamiliar()) {
					player.getPackets().sendGameMessage("You can't attack your own familiar.");
					return;
				}
				if (!familiar.canAttack(player)) {
					player.getPackets().sendGameMessage("You can't attack this npc.");
					return;
				}
			} else if (!npc.isForceMultiAttacked()) {
				if (!npc.isAtMultiArea() || !player.isAtMultiArea()) {
					if (player.getAttackedBy() != npc && player.getAttackedByDelay() > Utils.currentTimeMillis()) {
						player.getPackets().sendGameMessage("You are already in combat.", true);
						return;
					}
					if (npc.getAttackedBy() != player && npc.getAttackedByDelay() > Utils.currentTimeMillis()) {
						player.getPackets().sendGameMessage("This npc is already in combat.", true);
						return;
					}
				}
			}
			player.stopAll(false);
			if (npc.getId() == 16027) {
				if (!(player.getControlerManager().getControler() instanceof DPMController)) {
					player.setRouteEvent(new RouteEvent(new WorldTile(4764, 5917, 0), () -> {
						player.stopAll();
						player.faceEntity(npc);
						player.getDialogueManager().startDialogue("DamagePerMinuteD");
					}));
					return;
				}
			}
			player.getActionManager().setAction(new PlayerCombat(npc));
		}
		if (packetId == NPC_CLICK1_PACKET) {
			NPCHandler.handleOption1(player, stream);
			return;
		}
		if (packetId == NPC_CLICK2_PACKET) {
			NPCHandler.handleOption2(player, stream);
			return;
		}
		if (packetId == NPC_CLICK3_PACKET) {
			NPCHandler.handleOption3(player, stream);
			return;
		}
		if (packetId == INTERFACE_ON_OBJECT) {// alright should be all good
			int y = stream.readUnsignedShort128();
			int x = stream.readUnsignedShortLE128();
			int itemId = stream.readUnsignedShort();
			boolean forceRun = stream.readUnsignedByteC() == 1;
			int objectId = stream.readInt();
			int interfaceHash = stream.readIntLE();
			int slot = stream.readUnsignedShortLE128();
			final int interfaceId = interfaceHash >> 16;
			int componentId = interfaceHash - (interfaceId << 16);
			if (!player.isActive() || !player.clientHasLoadedMapRegion() || player.isDead()
					|| Utils.getInterfaceDefinitionsSize() <= interfaceId
					|| !player.getInterfaceManager().containsInterface(interfaceId) || player.isDead()
					|| player.isLocked() || player.getEmotesManager().isDoingEmote()) {
				return;
			}
			final WorldTile tile = new WorldTile(x, y, player.getPlane());
			if (!player.getMapRegionsIds().contains(tile.getRegionId())) {
				return;
			}
			WorldObject mapObject = World.getObjectWithId(tile, objectId);
			if (mapObject == null || mapObject.getId() != objectId) {
				return;
			}
			final WorldObject object = !player.isAtDynamicRegion() ? mapObject
					: new WorldObject(objectId, mapObject.getType(), mapObject.getRotation(), x, y, player.getPlane());
			final Item item = player.getInventory().getItem(slot);
			if (item == null || item.getId() != itemId) {
				return;
			}
			player.stopAll(false); // false
			if (forceRun) {
				player.setRun(forceRun);
			}
			switch (interfaceId) {
			case Inventory.INVENTORY_INTERFACE: // inventory
				ObjectHandler.handleItemOnObject(player, object, interfaceId, item);
				break;
			case 430:// lunars
				switch (componentId) {
				case 55:
					if (player.getSkills().getLevel(Skills.MAGIC) < 66) {
						player.getPackets().sendGameMessage("You need a level of 65 in order to cast Cure Plant.");
						return;
					}
					if (!Magic.checkRunes(player, true, Magic.ASTRAL_RUNE, 1, Magic.EARTH_RUNE, 8)) {
						return;
					}
					final FarmingSpot spot = player.getFarmingManager().getSpot(SpotInfo.getInfo(object.getId()));
					if (spot == null || spot.isDead()) {
						player.getPackets().sendGameMessage("This cannot be cured.");
						return;
					} else if (!spot.isDiseased()) {
						player.getPackets().sendGameMessage("Your patch is not diseased.");
						return;
					}
					player.lock(3);
					WorldTasksManager.schedule(new WorldTask() {

						@Override
						public void run() {
							spot.setDiseased(false);
							spot.refresh();
						}
					}, 2);
					player.getSkills().addXp(Skills.MAGIC, 60);
					player.setNextGraphics(new Graphics(742, 0, 150));
					player.setNextAnimation(new Animation(4409));
					player.getPackets().sendGameMessage("You cast the spell and your patch is in perfect health.");
					break;
				}
				break;
			}
		} else if (packetId == PLAYER_OPTION_1_PACKET) {
			if (!player.isActive() || !player.clientHasLoadedMapRegion() || player.isDead()) {
				return;
			}
			int playerIndex = stream.readUnsignedShortLE128();
			boolean forceRun = stream.readUnsignedByte() == 1;
			Player p2 = World.getPlayers().get(playerIndex);
			if (p2 == null || p2.isDead() || p2.hasFinished()
					|| !player.getMapRegionsIds().contains(p2.getRegionId())) {
				return;
			}
			if (player.getLockDelay() > Utils.currentTimeMillis()
					|| !player.getControlerManager().canPlayerOption1(p2)) {
				return;
			}
			if (player.getControlerManager().getControler() instanceof EliteDungeonsLobby) {
				player.getControlerManager().canAttack(p2);
				return;
			}
			if (!player.isCanPvp()) {
				return;
			}
			if (!player.getControlerManager().canAttack(p2)) {
				return;
			}
			if (!player.isCanPvp() || !p2.isCanPvp()) {
				player.getPackets().sendGameMessage("You can only attack players in a player-vs-player area.");
				return;
			}
			if (!p2.isAtMultiArea() || !player.isAtMultiArea()) {
				if (player.getAttackedBy() != p2 && player.getAttackedByDelay() > Utils.currentTimeMillis()) {
					player.getPackets().sendGameMessage("You are already in combat.", true);
					return;
				}
				if (p2.getAttackedBy() != player && p2.getAttackedByDelay() > Utils.currentTimeMillis()) {
					if (p2.getAttackedBy() instanceof NPC) {
						p2.setAttackedBy(player); // changes enemy to player,
						// player has priority over
						// npc on single areas
					} else {
						player.getPackets().sendGameMessage("That player is already in combat.", true);
						return;
					}
				}
			}
			player.stopAll(false);
			player.getActionManager().setAction(new PlayerCombat(p2));
		} else if (packetId == PLAYER_OPTION_2_PACKET) {
			if (!player.isActive() || !player.clientHasLoadedMapRegion() || player.isDead()) {
				return;
			}
			int playerIndex = stream.readUnsignedShortLE128();
			boolean forceRun = stream.readUnsignedByte() == 1;
			Player p2 = World.getPlayers().get(playerIndex);
			if (p2 == null || p2.isDead() || p2.hasFinished()
					|| !player.getMapRegionsIds().contains(p2.getRegionId())) {
				return;
			}
			if (player.getLockDelay() > Utils.currentTimeMillis()) {
				return;
			}
			if (player.getFrozenBlockedDelay() > Utils.currentTimeMillis()) {
				return;
			}
			if (player.getFreezeDelay() >= Utils.currentTimeMillis()) {
				player.getPackets().sendGameMessage("A magical force prevents you from moving.");
				return;
			}
			player.stopAll(false);
			player.getActionManager().setAction(new PlayerFollow(p2));
		} else if (packetId == PLAYER_OPTION_4_PACKET) {
			int playerIndex = stream.readUnsignedShortLE128();
			boolean forceRun = stream.readUnsignedByte() == 1;
			final Player p2 = World.getPlayers().get(playerIndex);
			if (p2 == null || p2.isDead() || p2.hasFinished() || !player.getMapRegionsIds().contains(p2.getRegionId())
					|| player.getLockDelay() >= Utils.currentTimeMillis() || player == p2) {
				return;
			}
			player.stopAll(false);

			if (player.getX() == p2.getX() && player.getY() == p2.getY()) {
				if (!player.addWalkSteps(player.getX() - 1, player.getY(), 1)) {
					if (!player.addWalkSteps(player.getX() + 1, player.getY(), 1)) {
						if (!player.addWalkSteps(player.getX(), player.getY() + 1, 1)) {
							player.addWalkSteps(player.getX(), player.getY() - 1, 1);
						}
					}
				}
			}
			if (!p2.withinDistance(player, 14)) {
				player.sendMessage("Unable to find " + p2.getDisplayName() + "; must be within radius.");
				return;
			}
			player.setRouteEvent(new RouteEvent(p2, new Runnable() {
				@Override
				public void run() {
					if (!player.canTrade(p2)) {
						return;
					}
					if (p2.getTemporaryAttributtes().get("TradeTarget") == player) {
						p2.getTemporaryAttributtes().remove("TradeTarget");
						player.getTrade().openTrade(p2);
						p2.getTrade().openTrade(player);
						p2.faceEntity(player);
						player.faceEntity(p2);
						return;
					}
					player.getTemporaryAttributtes().put("TradeTarget", p2);
					player.sendMessage("Sending " + p2.getDisplayName() + " a trade request...");
					p2.getPackets().sendTradeRequestMessage(player);
					player.faceEntity(p2);
				}
			}));
		} else if (packetId == PLAYER_OPTION_5_PACKET) {
			int playerIndex = stream.readUnsignedShortLE128();
			boolean forceRun = stream.readUnsignedByte() == 1;
			Player p2 = World.getPlayers().get(playerIndex);
			if (p2 == null || p2.isDead() || p2.hasFinished() || !player.getMapRegionsIds().contains(p2.getRegionId())
					|| player.getLockDelay() >= Utils.currentTimeMillis() || player == p2) {
				return;
			}
			if (!p2.withinDistance(player, 14)) {
				player.sendMessage("Unable to find " + p2.getDisplayName() + ".");
				return;
			}
			if (player.getAttackedByDelay() + 5000 > Utils.currentTimeMillis()) {
				player.sendMessage("You can't examine " + p2.getDisplayName()
						+ "'s stats until 5 seconds after the end of combat.");
				return;
			}
			player.stopAll();
			ViewProfile.sendInterface(player, p2);
			player.getDialogueManager().startDialogue(PlayerExamine.playerExamineD, p2);
		} else if (packetId == PLAYER_OPTION_6_PACKET) {
			int playerIndex = stream.readUnsignedShortLE128();
			boolean forceRun = stream.readUnsignedByte() == 1;
			final Player p2 = World.getPlayers().get(playerIndex);
			if (p2 == null || p2.isDead() || p2.hasFinished() || !player.getMapRegionsIds().contains(p2.getRegionId())
					|| player.isLocked() || player == p2) {
				return;
			}
			if (!p2.withinDistance(player, 14)) {
				player.sendMessage("Unable to find " + p2.getDisplayName() + ".");
				return;
			}
			if (player.getAttackedByDelay() + 5000 > Utils.currentTimeMillis()) {
				player.sendMessage(
						"You can't pelt " + p2.getDisplayName() + "'s stats until 5 seconds after the end of combat.");
				return;
			}
			if (p2 == null || p2.isDead() || p2.hasFinished() || !player.getMapRegionsIds().contains(p2.getRegionId())
					|| player.isLocked() || player == p2) {
				return;
			} /*
				 * else if (player.getGroup() != null) { if (player.getGroup().getLeader() ==
				 * player) { // 2nd player is busy if
				 * (p2.getInterfaceManager().containsScreenInter()) {
				 * player.sendMessage("This player is currently busy!"); return; }
				 *
				 * if (p2.getGroup() != null) { player.sendMessage(Colors.SALMON +
				 * "This player is already in a group!"); return; }
				 *
				 * if (player.getGroup().getTeam().size() > 3) {
				 * player.sendMessage(Colors.SALMON + "Your team is too" +
				 * " full to invite another player!"); return; }
				 *
				 * if (!player.withinDistance(p2, 14)) {
				 * player.sendMessage("Could not find player: " + p2.getUsername()); return; }
				 *
				 * do walk to player and open interface player.faceEntity(p2); if
				 * (!player.withinDistance(p2, 2)) { player.setRouteEvent(new RouteEvent(p2, ()
				 * -> { p2.group = player.getGroup().recruit(p2); })); } else { p2.group =
				 * player.getGroup().recruit(p2); } return; } }
				 */
			if (player.getInventory().containsItem(10501, 1)) {
				player.getInventory().deleteItem(10501, 1);
			} else if (player.getEquipment().getWeaponId() == 10501
					&& player.getEquipment().getItem(Equipment.SLOT_WEAPON).getAmount() > 0) {
				Item weapon = player.getEquipment().getItem(Equipment.SLOT_WEAPON);
				player.getEquipment().getItem(Equipment.SLOT_WEAPON)
						.setAmount(player.getEquipment().getItem(Equipment.SLOT_WEAPON).getAmount() - 1);
				player.getEquipment().refresh(Equipment.SLOT_WEAPON);
				if (player.getEquipment().getItem(Equipment.SLOT_WEAPON).getAmount() == 0) {
					player.sendMessage("You used up your last Snowball.");
					player.getEquipment().deleteItem(10501, weapon.getAmount());
				}
				player.getEquipment().refresh(Equipment.SLOT_WEAPON);
				player.getAppearence().generateAppearenceData();
			} else {
				player.getPackets().sendPlayerOption("Null", 6, true);
				return;
			}
			player.faceEntity(p2);
			player.setNextAnimation(new Animation(7530));
			player.lock(2);
			World.sendProjectile(player, player, p2, 1281, 10, 10, 75, 50, 15, 0);
		} else if (packetId == PLAYER_OPTION_9_PACKET) {
			int playerIndex = stream.readUnsignedShortLE128();
			boolean forceRun = stream.readUnsignedByte() == 1;
			if (Settings.DEBUG) {
				System.out.println(playerIndex);
			}
			Player p2 = World.getPlayers().get(playerIndex);
			if (p2 == null || p2 == player || p2.isDead() || p2.hasFinished()
					|| !player.getMapRegionsIds().contains(p2.getRegionId())) {
				return;
			}
			if (player.isLocked()) {
				return;
			}
			if (forceRun) {
				player.setRun(forceRun);
			}
			player.stopAll();
			ClansManager.viewInvite(player, p2);
		} else if (packetId == ITEM_TAKE_PACKET) {
			if (!player.isActive() || !player.clientHasLoadedMapRegion() || player.isDead()) {
				return;
			}
			long currentTime = Utils.currentTimeMillis();
			if (player.getLockDelay() > currentTime) {
				return;
			}
			boolean forceRun = stream.readByte() == 1;
			int y = stream.readUnsignedShortLE();
			int x = stream.readUnsignedShort();
			final int id = stream.readUnsignedShort();
			final WorldTile tile = new WorldTile(x, y, player.getPlane());
			final int regionId = tile.getRegionId();
			if (!player.getMapRegionsIds().contains(regionId)) {
				return;
			}
			final FloorItem item = World.getRegion(regionId).getGroundItem(id, tile, player);
			if (item == null) {
				return;
			}
			player.stopAll(false);
			if (forceRun) {
				player.setRun(forceRun);
			}

			player.setRouteEvent(new RouteEvent(item, new Runnable() {
				@Override
				public void run() {
					final FloorItem item = World.getRegion(regionId).getGroundItem(id, tile, player);
					if (item == null || !player.getNewQuestManager().canTakeItem(item)
							|| !player.getControlerManager().canTakeItem(item)) {
						return;
					}
					if (item.getOwner() == null) {
						/*
						 * ( if (item.getId() >= 7928 && item.getId() <= 7933)
						 *
						 * new NewsManager(player,
						 * "<b><img src=\"./bin/images/news/easter.png\" height=15> " +
						 * player.getDisplayName() + " has just found an Easter Egg.")) .start();
						 */
					}
					if (item.getOwner() != null) {
						if (player.getRights() == 2) {
							player.sendMessage("This item was dropped by: " + item.getOwner() + ".");
						}
						if ((player.getIronman().isIronman() || player.isWiki())
								&& !player.getUsername().equalsIgnoreCase(item.getOwner())) {
							player.getPackets()
									.sendGameMessage("You can't pick up the items that aren't yours on iron man mode.");
							return;
						}
					}
					player.setNextFaceWorldTile(tile);
					player.addWalkSteps(tile.getX(), tile.getY(), 1);
					World.removeGroundItem(player, item);
				}
			}));
		}
	}

	public static void loadPacketSizes() {
		PACKET_SIZES[0] = 3;
		PACKET_SIZES[1] = 1;
		PACKET_SIZES[2] = 1;
		PACKET_SIZES[3] = 9;
		PACKET_SIZES[4] = 8;
		PACKET_SIZES[5] = 2;
		PACKET_SIZES[6] = 11;
		PACKET_SIZES[7] = 16;
		PACKET_SIZES[8] = 4;
		PACKET_SIZES[9] = -1;
		PACKET_SIZES[10] = -2;
		PACKET_SIZES[11] = -2;
		PACKET_SIZES[12] = -1;
		PACKET_SIZES[13] = 8;
		PACKET_SIZES[14] = -2;
		PACKET_SIZES[15] = -1;
		PACKET_SIZES[16] = 9;
		PACKET_SIZES[17] = -1;
		PACKET_SIZES[18] = 2;
		PACKET_SIZES[19] = 4;
		PACKET_SIZES[20] = -1;
		PACKET_SIZES[21] = -1;
		PACKET_SIZES[22] = 8;
		PACKET_SIZES[23] = 7;
		PACKET_SIZES[24] = -2;
		PACKET_SIZES[25] = -1;
		PACKET_SIZES[26] = 16;
		PACKET_SIZES[27] = 7;
		PACKET_SIZES[28] = 8;
		PACKET_SIZES[29] = -2;
		PACKET_SIZES[30] = 0;
		PACKET_SIZES[31] = 6;
		PACKET_SIZES[32] = 3;
		PACKET_SIZES[33] = 4;
		PACKET_SIZES[34] = 7;
		PACKET_SIZES[35] = 3;
		PACKET_SIZES[36] = 3;
		PACKET_SIZES[37] = 8;
		PACKET_SIZES[38] = -1;
		PACKET_SIZES[39] = -1;
		PACKET_SIZES[40] = 9;
		PACKET_SIZES[41] = 18;
		PACKET_SIZES[42] = 7;
		PACKET_SIZES[43] = 3;
		PACKET_SIZES[44] = 3;
		PACKET_SIZES[45] = -1;
		PACKET_SIZES[46] = 3;
		PACKET_SIZES[47] = -1;
		PACKET_SIZES[48] = 4;
		PACKET_SIZES[49] = 9;
		PACKET_SIZES[50] = 3;
		PACKET_SIZES[51] = 7;
		PACKET_SIZES[52] = -1;
		PACKET_SIZES[53] = 3;
		PACKET_SIZES[54] = 3;
		PACKET_SIZES[55] = 3;
		PACKET_SIZES[56] = 4;
		PACKET_SIZES[57] = 0;
		PACKET_SIZES[58] = 3;
		PACKET_SIZES[59] = 8;
		PACKET_SIZES[60] = 4;
		PACKET_SIZES[61] = 7;
		PACKET_SIZES[62] = 7;
		PACKET_SIZES[63] = 2;
		PACKET_SIZES[64] = 0;
		PACKET_SIZES[65] = 4;
		PACKET_SIZES[66] = 4;
		PACKET_SIZES[67] = -1;
		PACKET_SIZES[68] = -1;
		PACKET_SIZES[69] = 8;
		PACKET_SIZES[70] = 1;
		PACKET_SIZES[71] = -1;
		PACKET_SIZES[72] = 3;
		PACKET_SIZES[73] = 3;
		PACKET_SIZES[74] = 5;
		PACKET_SIZES[75] = -1;
		PACKET_SIZES[76] = 8;
		PACKET_SIZES[77] = -1;
		PACKET_SIZES[78] = 4;
		PACKET_SIZES[79] = 3;
		PACKET_SIZES[80] = 8;
		PACKET_SIZES[81] = -1;
		PACKET_SIZES[82] = 9;
		PACKET_SIZES[83] = 6;
		PACKET_SIZES[84] = -1;
		PACKET_SIZES[85] = 9;
		PACKET_SIZES[86] = -1;
		PACKET_SIZES[87] = -1;
		PACKET_SIZES[88] = 3;
		PACKET_SIZES[89] = 15;
		PACKET_SIZES[90] = 6;
		PACKET_SIZES[91] = 9;
		PACKET_SIZES[92] = 1;
		PACKET_SIZES[93] = 4;
		PACKET_SIZES[94] = 1;
		PACKET_SIZES[95] = -2;
		PACKET_SIZES[96] = 15;
		PACKET_SIZES[97] = -2;
		PACKET_SIZES[98] = -1;
		PACKET_SIZES[99] = 12;
		PACKET_SIZES[100] = 0;
		PACKET_SIZES[101] = -1;
		PACKET_SIZES[102] = -2;
		PACKET_SIZES[103] = 8;
		PACKET_SIZES[104] = 3;
		PACKET_SIZES[105] = 2;
		PACKET_SIZES[106] = 11;
		PACKET_SIZES[107] = 17;
	}

	private final Player player;

	public WorldPacketsDecoder(Player player) {
		this.player = player;
	}

	private static final short[] IGNORED = {};

	public static boolean isIgnored(int opcode) {
		for (short ignored : IGNORED) {
			if (ignored == opcode) {
				return true;
			}
		}
		return false;
	}

	private final int[] history = new int[5];
	private int history_index;
	private int chatType;

	private int packetId = -1;
	private int packetSize = -1;

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		if (!(msg instanceof ByteBuf)) {
			return;
		}
		ByteBuf in = (ByteBuf) msg;
		while (in.isReadable()) {
			if (packetId == -1) {
				int opcode = in.readUnsignedByte();
				if (opcode >= PACKET_SIZES.length) {
					ctx.channel().close();
					return;
				}
				packetId = opcode;
			} else if (packetSize == -1) {
				int length = PACKET_SIZES[packetId];
				if (length == -1) {
					if (!in.isReadable(1)) {
						return;
					}
					length = in.readUnsignedByte();
				} else if (length == -2) {
					if (!in.isReadable(2)) {
						return;
					}
					length = in.readUnsignedShort();
				}
				packetSize = length;
			} else {
				if (packetSize != 0 && !in.isReadable(packetSize)) {
					return;
				}
				byte[] buffer = new byte[packetSize];
				if (packetSize != 0) {
					in.readBytes(buffer);
				}
				InputStream stream = new InputStream(buffer);
				try {
					processPackets(packetId, packetSize, stream);
				} catch (Throwable e) {
					e.printStackTrace();
				}
				packetId = packetSize = -1;
			}
		}
		if (!in.isReadable()) {
			ReferenceCountUtil.release(msg);
		}
	}

	public void processPackets(final int opcode, final int length, InputStream stream) {
		player.setPacketsDecoderPing(Utils.currentTimeMillis());
		if (opcode == PING_PACKET) {
			OutputStream packet = new OutputStream(1);
			packet.writePacket(player, 12);
			player.getSession().write(packet);
		} else if (opcode == MOUVE_MOUSE_PACKET || opcode == MOUVE_MOUSE_PACKET2 || opcode == CLICK_PACKET
				|| opcode == CLICK_PACKET2) {

		} else if (opcode == KEY_TYPED_PACKET) {
			if (player.isDead() || player.hasFinished()) {
				return;
			}
			int keyPressed = stream.readByte();
			int interfaceHash = stream.read24BitInt();

			int keyIndex = keyPressed == 100 ? 7 : keyPressed >= 6 && keyPressed <= 12 ? keyPressed - 6 : -1;
			/*
			 * int keyIndex = keyPressed == 100 ? 7 : keyPressed >= 6 && keyPressed <= 12 ?
			 * keyPressed - 6 : -1; if (keyIndex == -1) { return; }
			 */
			switch (keyPressed) {
			case 13:
				if (player.getInterfaceManager().containsScreenInter()) {
					player.closeInterfaces();
				}
				break;
			case 102:
				Magic.sendNormalTeleportSpell(player, 0, 0, player.getHomeTile());
				break;
			}
			if (keyIndex == -1) {
				return;
			}
			int actionId = player.getKeyBinds()[keyIndex];
			switch (actionId) {
			case 0:
				player.sm("You don't have any keybinds attached to "
						+ (keyPressed >= 6 && keyPressed <= 12 ? "F" + keyPressed : "Insert") + ".");
				break;
			case 1:
				if (player.getRegionId() == 11601 || player.getRegionId() == 15178) {
					player.sm("You cannot bank in this area.");
					return;
				}
				if (player.getPerkManager().bankCommand) {
					if (!player.canSpawn()) {
						player.sendMessage("You cannot open your bank account at the moment.");
						return;
					}
					if (player.isLocked()) {
						player.sendMessage("You can't bank at the moment, please wait.");
						return;
					}
					if (!player.canSpawn() || player.getControlerManager().getControler() != null) {
						player.sendMessage("You can't bank while you're in this area.");
						return;
					}
					if (player.isUnderCombat()) {
						player.sendMessage("You can't bank while in combat, please wait.");
						return;
					}
					if (!player.promptList()) {
						player.getBank().openBank();
					} else {
						player.getDialogueManager().startDialogue("BankList", false);
					}
					return;
				} else {
					player.sendMessage("You have to purchase the Bank Command perk in order to do this.");
				}
				break;
			case 2:
				if (player.getRegionId() == 11601 || player.getRegionId() == 15178) {
					player.sm("You cannot open grand exchange in this area.");
					return;
				}
				if (player.getPerkManager().bankCommand) {
					if (!player.canSpawn()) {
						player.sendMessage("You cannot open your bank account at the moment.");
						return;
					}
					if (player.isLocked()) {
						player.sendMessage("You can't bank at the moment, please wait.");
						return;
					}
					if (!player.canSpawn() || player.getControlerManager().getControler() != null) {
						player.sendMessage("You can't bank while you're in this area.");
						return;
					}
					if (player.isUnderCombat()) {
						player.sendMessage("You can't bank while in combat, please wait.");
						return;
					}
					player.getGEManager().openGrandExchange();
					return;
				} else {
					player.sendMessage("You have to purchase the Bank Command perk in order to do this.");
				}
				break;
			case 3:
				player.getDialogueManager().startDialogue("BossTeleports");
				break;
			case 4:
				ButtonHandler.submitSpecialRequest(player);
				break;
			case 5:
				player.getPrayer().switchQuickPrayers();
				break;
			case 6:
				if (player.getFamiliar() != null && player.getFamiliar().getBOBSize() > 0) {
					player.getFamiliar().store();
				}
				break;
			case 7:
				if (player.getFamiliar() != null && player.getFamiliar().hasSpecialOn()) {
					player.getFamiliar().submitSpecial(player);
				}
				break;
			case 8:
				if (player.getRegionId() == 11601 || player.getRegionId() == 15178) {
					player.sm("You cannot bank in this area.");
					return;
				}
				player.getBank().depositAllKeyBind();
				player.getAppearence().generateAppearenceData();
				break;
			}
		} else if (opcode == ITEM_ON_FLOOR_EXAMINE) {
			boolean forceRun = stream.readUnsignedByte() == 1;
			int y = stream.readUnsignedShortLE();
			int x = stream.readUnsignedShort();
			int id = stream.readUnsignedShort();
			player.getPackets().sendItemMessage(0, 15263739, id, x, y, ItemExamines.getExamine(new Item(id))); // ChatboxMessage
		} else if (opcode == DISPLAY_PACKET) {
			int displayMode = stream.readUnsignedByte();
			boolean switchScreenMode = stream.readUnsignedByte() == 1;
			player.setDisplayMode(displayMode);
			player.getInterfaceManager().removeAll();
			player.getInterfaceManager().sendInterfaces();
		} else if (opcode == INTERFACE_ON_INTERFACE) {
			InventoryOptionsHandler.handleItemOnItem(player, stream);
		} else if (opcode == RECEIVE_PACKET_COUNT_PACKET) {
			int packetcount = stream.readInt();
		} else if (opcode == DIALOGUE_CONTINUE_PACKET) {
			int junk = stream.readUnsignedShortLE();
			int interfaceHash = stream.readIntV1();
			int interfaceId = interfaceHash >> 16;
			int buttonId = (interfaceHash & 0xFF);
			if (Utils.getInterfaceDefinitionsSize() <= interfaceId) {
				Logger.log("Dialogue_Continue_Packet error!");
				return;
			}
			if (!player.isRunning()) {
				return;
			}
			if (Settings.DEBUG) {
				Logger.log(this, "Dialogue: " + interfaceId + ", " + buttonId + ", " + junk);
			}
			int componentId = interfaceHash - (interfaceId << 16);
			if (interfaceId == 667) {
				CosmeticsHandler.openCosmeticsHandler(player);
				if (junk == Equipment.SLOT_SHIELD) {
					Item weapon = player.getEquipment().getCosmeticItems().get(Equipment.SLOT_WEAPON);
					if (weapon != null) {
						boolean isTwoHandedWeapon = Equipment.isTwoHandedWeapon(weapon);
						if (isTwoHandedWeapon) {
							player.getPackets().sendGameMessage(
									"You have a two handed cosmetic weapon. You can't edit shield slot unless you remove it.");
							return;
						}
					}
				}
				if (junk == Equipment.SLOT_RING && player.getEquipment().getSavedCosmetics().isEmpty()) {
					player.getDialogueManager().startDialogue("SimpleMessage",
							"You don't have any saved costumes. To save your current costume do ::savecurrentcostume or ::savecurrentcosmetic .");
					return;
				}
				player.getDialogueManager().startDialogue(
						(player.isShowSearchOption() && player.getEquipment().getCosmeticItems().get(junk) == null)
								? "CosmeticsSelect"
								: "CosmeticsD",
						junk);
			} else {
				player.getDialogueManager().continueDialogue(interfaceId, componentId);
			}
		} else if (opcode == WORLD_MAP_CLICK) {
			int coordinateHash = stream.readIntLE();
			int x = coordinateHash >> 14;
			int y = coordinateHash & 0x3fff;
			int plane = coordinateHash >> 28;
			Integer hash = (Integer) player.getTemporaryAttributtes().get("worldHash");
			if (hash == null || coordinateHash != hash) {
				player.getTemporaryAttributtes().put("worldHash", coordinateHash);
			} else {
				player.getTemporaryAttributtes().remove("worldHash");
				player.getHintIconsManager().addHintIcon(x, y, plane, 20, 0, 2, -1, true);
				player.getVarsManager().sendVar(1159, coordinateHash);
			}
		} else if (opcode == CLOSE_INTERFACE_PACKET) {
			if (player.isActive() && !player.hasFinished() && !player.isRunning()) {
				LoginManager.sendLogin(player);
				return;
			}
			player.stopAll();
		} else if (opcode == ESCAPE_PRESSED_PACKET) {
			if (player.isActive() && !player.hasFinished() && !player.isRunning()) {
				LoginManager.sendLogin(player);
				return;
			}
			player.closeInterfaces();
		} else if (opcode == ENTER_INTEGER_PACKET) {
			if (!player.isRunning() || player.isDead()) {
				return;
			}
			int value = stream.readInt();

			/** Input event goes here! */

			InputEvent<?> inputEvent = player.getInputEvent();
			if (inputEvent instanceof InputIntegerEvent) {
				((InputIntegerEvent) inputEvent).onEvent(value);
				player.resetInputEvent();
				return;
			}

			if (player.getTemporaryAttributtes().get("ArtisansWorkShop") != null) {
				Object[] settings = (Object[]) player.getTemporaryAttributtes().remove("ArtisansWorkShop");
				if (value <= 0) {
					return;
				}
				int itemId = (int) settings[0];
				boolean deposit = (boolean) settings[1];
				ArtisansWorkShop.withdrawDepositOre(player, itemId, value, deposit);
				return;
			}
			if (player.getTemporaryAttributtes().get("gr_withdraw") == Boolean.TRUE) {
				player.getGrManager().withdraw(value);
				player.getTemporaryAttributtes().put("gr_withdraw", Boolean.FALSE);
			}
			if (player.getTemporaryAttributtes().get("gr_deposit") == Boolean.TRUE) {
				player.getGrManager().deposit(value);
				player.getTemporaryAttributtes().put("gr_deposit", Boolean.FALSE);
			}
			if (player.getTemporaryAttributtes().get("gr_bet") == Boolean.TRUE) {
				player.getGrManager().changeBet(value);
				player.getTemporaryAttributtes().put("gr_bet", Boolean.FALSE);
			}
			if (player.getTemporaryAttributtes().get("set_tax") == Boolean.TRUE) {
				ThroneManager.setTax(player, value);
				player.getTemporaryAttributtes().put("set_tax", Boolean.FALSE);
			}
			if (player.getTemporaryAttributtes().get(Key.DROP_X) != null) {
				Object[] attributtes = (Object[]) player.getTemporaryAttributtes().remove(Key.DROP_X);
				Item item = (Item) attributtes[0];
				int slotId = (int) attributtes[1];
				if (item == null || value <= 0 || slotId >= 28) {
					return;
				}
				if (value > player.getInventory().getAmountOf(item.getId())) {
					value = player.getInventory().getAmountOf(item.getId());
				}
				item = new Item(item.getId(), value);
				if (!player.getControlerManager().canDropItem(item)) {
					return;
				}
				InventoryOptionsHandler.handleItemOption7(player, slotId, item.getId(), item);
				return;
			}
			if (player.getTemporaryAttributtes().get(Key.FORGE_X) != null) {
				Integer index = (Integer) player.getTemporaryAttributtes().remove(Key.FORGE_X);
				if (index == null) {
					return;
				}
				boolean dungeoneering = false;
				if (index > 100) {
					index -= 100;
					dungeoneering = true;
				}
				player.closeInterfaces();
				player.getActionManager().setAction(new DungeoneeringSmithing(index, value, dungeoneering));
				return;
			}
			if (player.getInterfaceManager().containsInterface(DungeoneeringSummoning.POUCHES_INTERFACE)
					&& player.getTemporaryAttributtes().get(Key.INFUSE_X) != null) {
				boolean dungeoneering = (boolean) player.getTemporaryAttributtes().remove(Key.INFUSE_X);
				int item = (int) player.getTemporaryAttributtes().remove(Key.INFUSE_ITEM);
				DungeoneeringSummoning.handlePouchInfusion(player, item >> 16, item & 0xFF, value, dungeoneering);
				return;
			}
			if (player.getTemporaryAttributtes().get("ChangeSkillIPVP") != null) {
				if (player.getControlerManager().getControler() == null
				/*
				 * || !(player.getControlerManager().getControler() instanceof
				 * InstancedPVPControler)
				 */) {
					return;
				}
				int skill = (int) player.getTemporaryAttributtes().remove("ChangeSkillIPVP");
				if (value <= 0 || value > 99) {
					player.getPackets().sendGameMessage("Please choose a valid level.");
					return;
				}
				player.getSkills().set(skill, value);
				player.getSkills().setXp(skill, Skills.getXPForLevel(value));
				player.getAppearence().generateAppearenceData();
				player.getPackets().sendGameMessage(
						"You have changed your " + Skills.SKILL_NAME[skill] + " level to " + value + ".");
				return;
			}
			if (player.getTemporaryAttributtes().get("Combination-X") != null) {
				int combinationItemId = (int) player.getTemporaryAttributtes().remove("Combination-X");
				if (value <= 0) {
					return;
				}
				CombinationPotions.startCombinationAction(player, value, combinationItemId);
				return;
			}
			if (player.getTemporaryAttributtes().remove("ADD_RESTRICT_ID") != null) {
				if (value >= Utils.getItemDefinitionsSize() || value < 0) {
					player.getPackets().sendGameMessage("Not a vaild item id.");
					return;
				}
				player.getPetLootManager().getRestrictedItems().add(new RestrictedItem(value));
				player.getPackets().sendGameMessage(
						"Restricted item (" + value + ") has been added to your restricted items list.");
				player.getPackets().sendGameMessage("Use ::petlootmanager or ::plm to edit/remove/disable it.");
				return;
			}
			if (player.getTemporaryAttributtes().remove("LOTTERY_TICKET_BUY") != null) {
				if (value <= 0) {
					return;
				}
				int price = (value * Lottery.TICKET_PRICE);
				if (player.getInventory().getCoinsAmount() < price) {
					player.getPackets().sendGameMessage("You don't have enough money to buy that many tickets.");
					return;
				}
				if (value + Lottery.getTicketsAmount(player) > Lottery.MAX_TICKETS_PER_PLAYER) {
					player.getPackets().sendGameMessage("You can't have more than 20 tickets, You currently have "
							+ Lottery.getTicketsAmount(player) + " lottery tickets.");
					return;
				}

				if ((value * Lottery.TICKET_PRICE) + (Lottery.LOTTERY_TICKETS.size() * Lottery.TICKET_PRICE) <= 0) {
					player.getPackets()
							.sendGameMessage("You can't buy anymore tickets, JackPot amount can't go over 2147M.");
					return;
				}

				// more checks for security reason and glitch/exploit fix
				if (player.getMoneyPouchValue() < price) {
					player.getPackets().sendGameMessage("You need to have atleast " + value + "m in your moneypouch");
					return;
				}
				player.getInventory().removeItemMoneyPouch(new Item(995, price));
				Lottery.buyTicket(player, value);

				player.getPackets()
						.sendGameMessage("You have bought " + value + " X Lottery Tickets, You currently have "
								+ Lottery.getTicketsAmount(player) + " Lottery Tickets.");
				return;
			}
			if (player.getInterfaceManager().containsInterface(335)) {
				if (player.getTemporaryAttributtes().remove("trade_money") != null) {
					Integer trade_X_money = (Integer) player.getTemporaryAttributtes().remove("trade_X_money");
					if (value <= 0 || trade_X_money == null || player.getMoneyPouch().getTotal() == 0) {
						return;
					}
					if (value >= player.getMoneyPouch().getTotal()) {
						value = player.getMoneyPouch().getTotal();
					}
					player.getTrade().addPouch(trade_X_money, value);
				}
			} else if (player.getTemporaryAttributtes().remove(Key.SELL_SPIRIT_SHARDS) != null) {
				PetShopOwner.sellShards(player, value);
			} else if (player.getInterfaceManager().containsInterface(400)) {
				Integer create_tab_X_component = (Integer) player.getTemporaryAttributtes()
						.remove("create_tab_X_component");
				if (create_tab_X_component == null) {
					return;
				}
				TabletMaking.handleTabletCreation(player, create_tab_X_component, value);
			}
			if (player.getTemporaryAttributtes().get("xpSkillTarget") != null) {
				int xpTarget = value;
				Integer skillId = (Integer) player.getTemporaryAttributtes().remove("xpSkillTarget");
				if (xpTarget < player.getSkills().getXp(player.getSkills().getSkillIdByTargetId(skillId))
						|| player.getSkills().getXp(player.getSkills().getSkillIdByTargetId(skillId)) >= 200000000) {
					return;
				}
				if (xpTarget > 200000000) {
					xpTarget = 200000000;
				}
				player.getSkills().setSkillTarget(false, skillId, xpTarget);

			} else if (player.getTemporaryAttributtes().get("levelSkillTarget") != null) {
				int levelTarget = value;
				Integer skillId = (Integer) player.getTemporaryAttributtes().remove("levelSkillTarget");
				int curLevel = player.getSkills().getLevel(player.getSkills().getSkillIdByTargetId(skillId));
				if (curLevel >= (skillId == 24 ? 120 : 99)) {
					return;
				}
				if (levelTarget > (skillId == 24 ? 120 : 99)) {
					levelTarget = skillId == 24 ? 120 : 99;
				}
				if (levelTarget < player.getSkills().getLevel(player.getSkills().getSkillIdByTargetId(skillId))) {
					return;
				}
				player.getSkills().setSkillTarget(true, skillId, levelTarget);
			} else if (player.getTemporaryAttributtes().remove("dung_store_xp") != null) {
				DungeonRewardShop.buyXP(player, value);
			} else if (player.getTemporaryAttributtes().get("create_x_pouch") != null) {
				Integer itemId = (Integer) player.getTemporaryAttributtes().remove("create_x_pouch");
				Summoning.createPouch(player, itemId, value);
			}
			/*
			 * if (player.getTemporaryAttributtes().get("coinsamount") != null &&
			 * !player.getInventory().containsCoins(value * 1000000)) { player.sm(Colors.RED
			 * + "You do not have enough gold! 1million gp is equal to 1 Cashbag!"); return;
			 * } else { if (player.getTemporaryAttributtes().remove("coinsamount") != null
			 * && player.getInventory().containsCoins(value * 1000000)) {
			 * player.getInventory().addItem(24954, value);
			 * player.getInventory().deleteCoins(1000000 * value); player.sm(Colors.GREEN +
			 * "You converted " + value + " Million GP into " + Colors.ORANGE + value +
			 * " cash bag!"); } }
			 */
			if (player.getTemporaryAttributtes().get("soul_wars_x") != null) {
				final int item = (int) player.getTemporaryAttributtes().remove("soul_wars_x");
				if (SoulWarsManager.MINUTES_BEFORE_NEXT_GAME.get() < 4) {
					return;
				}
				final WorldTile walked = (WorldTile) player.getTemporaryAttributtes().remove("soul_wars_walked");
				if (walked != null && !player.matches(walked)) {
					return;
				}
				player.getInventory().addItem(item, value);
				return;
			}
			if (player.getTemporaryAttributtes().get("edit_price") != null) {
				if (value < 0) {
					player.getTemporaryAttributtes().remove("edit_price");
					return;
				}
				if (player.getTemporaryAttributtes().get("edit_price") == Boolean.TRUE) {
					player.getTemporaryAttributtes().put("edit_price", Boolean.FALSE);
					player.getGEManager().modifyPricePerItem(value);
					player.getTemporaryAttributtes().remove("edit_price");
				}
				return;
			}
			if (player.getTemporaryAttributtes().get("edit_quantity") != null) {
				if (value < 0) {
					player.getTemporaryAttributtes().remove("edit_quantity");
					return;
				}
				if (player.getTemporaryAttributtes().get("edit_quantity") == Boolean.TRUE) {
					player.getTemporaryAttributtes().put("edit_quantity", Boolean.FALSE);
					player.getGEManager().modifyAmount(value);
					player.getTemporaryAttributtes().remove("edit_quantity");
				}
				return;
			}
			if (player.getTemporaryAttributtes().get("loot_beam") != null) {
				player.getTemporaryAttributtes().remove("loot_beam");
				if (value < 1 || value > 2147000000) {
					value = 50000;
				}
				player.getLootBeamManager().setLootBeamMinimumValue(value);
				player.getDialogueManager().startDialogue("SimpleMessage", "You've set your Loot Beam trigger price "
						+ "to: " + Colors.RED + Utils.getFormattedNumber(value) + "</col>.");
				AccountInterfaceManager.sendInterface(player);
				return;
			}
			if (player.getTemporaryAttributtes().get("ports_plate") != null) {
				player.getTemporaryAttributtes().remove("ports_plate");
				if (value < 1 || value > 2147000000) {
					value = 0;
				}
				int plate = player.getPorts().plate;
				if (value > plate) {
					value = plate;
				}
				if (value <= 0) {
					return;
				}
				player.getDialogueManager().startDialogue("SimpleNPCMessage", 18891,
						"I've exchanged " + value + " plate for " + (value * 5) + " Chime.");
				player.getPorts().chime += value * 5;
				player.getPorts().plate -= value;
				return;
			}
			if (player.getTemporaryAttributtes().get("ports_chiGlobe") != null) {
				player.getTemporaryAttributtes().remove("ports_chiGlobe");
				if (value < 1 || value > 2147000000) {
					value = 0;
				}
				int plate = player.getPorts().chiGlobe;
				if (value > plate) {
					value = plate;
				}
				if (value <= 0) {
					return;
				}
				player.getDialogueManager().startDialogue("SimpleNPCMessage", 18891,
						"I've exchanged " + value + " chi globe for " + (value * 5) + " Chime.");
				player.getPorts().chime += value * 5;
				player.getPorts().chiGlobe -= value;
				return;
			}
			if (player.getTemporaryAttributtes().get("ports_lacquer") != null) {
				player.getTemporaryAttributtes().remove("ports_lacquer");
				if (value < 1 || value > 2147000000) {
					value = 0;
				}
				int plate = player.getPorts().lacquer;
				if (value > plate) {
					value = plate;
				}
				if (value <= 0) {
					return;
				}
				player.getDialogueManager().startDialogue("SimpleNPCMessage", 18891,
						"I've exchanged " + value + " lacquer for " + (value * 5) + " Chime.");
				player.getPorts().chime += value * 5;
				player.getPorts().lacquer -= value;
				return;
			}
			/*
			 * if (player.getInterfaceManager().containsInterface(631)) { if
			 * (player.getTemporaryAttributtes().remove("duelmoneypouch_remove") != null) {
			 * Integer duel_X_money = (Integer)
			 * player.getTemporaryAttributtes().remove("duelmoneypouch_X_money"); if (value
			 * <= 0 || duel_X_money == null || player.getMoneyPouch().getTotal() == 0) {
			 * return; } if (value >= player.getMoneyPouch().getTotal()) { value =
			 * player.getMoneyPouch().getTotal(); } ((DuelArena)
			 * player.getControlerManager().getControler()).addPouch(duel_X_money, value); }
			 * }
			 */
			if (player.getInterfaceManager().containsInterface(548)
					|| player.getInterfaceManager().containsInterface(746)) {
				if (player.getTemporaryAttributtes().get("money_pouch_remove") == Boolean.TRUE) {
					player.getMoneyPouch().withdrawPouch(value);
					player.getTemporaryAttributtes().put("money_pouch_remove", Boolean.FALSE);
					return;
				}
			}
			if ((player.getInterfaceManager().containsInterface(762)
					&& player.getInterfaceManager().containsInterface(763))
					|| player.getInterfaceManager().containsInterface(11)) {
				if (value < 0) {
					return;
				}
				if (player.getTemporaryAttributtes().get("clanBank") != null
						&& player.getTemporaryAttributtes().get("clanBank") == Boolean.TRUE) {
					Integer bank_item_X_Slot = (Integer) player.getTemporaryAttributtes()
							.remove("clanbank_item_X_Slot");
					if (bank_item_X_Slot == null) {
						return;
					}
					player.getBank().setLastX(value);
					player.getBank().refreshLastX();
					if (player.getTemporaryAttributtes().remove("clanbank_isWithdraw") != null) {
						player.getClanManager().getClan().getClanBank().withdrawItem(player, bank_item_X_Slot, value);
					} else {
						player.getClanManager().getClan().getClanBank().depositItem(player, bank_item_X_Slot, value,
								player.getInterfaceManager().containsInterface(11) ? false : true);
					}
				} else {
					Integer bank_item_X_Slot = (Integer) player.getTemporaryAttributtes().remove("bank_item_X_Slot");
					if (bank_item_X_Slot == null) {
						return;
					}
					player.getBank().setLastX(value);
					player.getBank().refreshLastX();
					if (player.getTemporaryAttributtes().remove("bank_isWithdraw") != null) {
						player.getBank().withdrawItem(bank_item_X_Slot, value);
					} else {
						player.getBank().depositItem(bank_item_X_Slot, value,
								player.getInterfaceManager().containsInterface(11) ? false : true);
					}
				}
			} else if (player.getInterfaceManager().containsInterface(206)
					&& player.getInterfaceManager().containsInterface(207)) {
				if (value < 0) {
					return;
				}
				Integer pc_item_X_Slot = (Integer) player.getTemporaryAttributtes().remove("pc_item_X_Slot");
				if (pc_item_X_Slot == null) {
					return;
				}
				if (player.getTemporaryAttributtes().remove("pc_isRemove") != null) {
					player.getPriceCheckManager().removeItem(pc_item_X_Slot, value);
				} else {
					player.getPriceCheckManager().addItem(pc_item_X_Slot, value);
				}
			} else if (player.getInterfaceManager().containsInterface(671)
					&& player.getInterfaceManager().containsInterface(665)) {
				if (player.getFamiliar() == null || player.getFamiliar().getBob() == null) {
					return;
				}
				if (value < 0) {
					return;
				}
				Integer bob_item_X_Slot = (Integer) player.getTemporaryAttributtes().remove("bob_item_X_Slot");
				if (bob_item_X_Slot == null) {
					return;
				}
				if (player.getTemporaryAttributtes().remove("bob_isRemove") != null) {
					player.getFamiliar().getBob().removeItem(bob_item_X_Slot, value);
				} else {
					player.getFamiliar().getBob().addItem(bob_item_X_Slot, value);
				}
			} else if (player.getInterfaceManager().containsInterface(335)
					&& player.getInterfaceManager().containsInterface(336)) {
				if (value < 0) {
					return;
				}
				Integer trade_item_X_Slot = (Integer) player.getTemporaryAttributtes().remove("trade_item_X_Slot");
				if (trade_item_X_Slot == null) {
					return;
				}
				if (player.getTemporaryAttributtes().remove("trade_isRemove") != null) {
					player.getTrade().removeItem(trade_item_X_Slot, value);
				} else {
					player.getTrade().addItem(trade_item_X_Slot, value);
				}
			} else if (player.getInterfaceManager().containsInterface(628)
					|| player.getInterfaceManager().containsInterface(631)) {
				if (value < 0) {
					return;
				}
				Integer duel_item_X_Slot = (Integer) player.getTemporaryAttributtes().remove("duel_item_X_Slot");
				if (duel_item_X_Slot == null) {
					return;
				}
				/*
				 * if (player.getTemporaryAttributtes().remove("duel_isRemove") != null) {
				 * ((DuelArena)
				 * player.getControlerManager().getControler()).removeItem(duel_item_X_Slot,
				 * value); } else { ((DuelArena)
				 * player.getControlerManager().getControler()).addItem(duel_item_X_Slot,
				 * value); } ((DuelArena)
				 * player.getControlerManager().getControler()).refresh(duel_item_X_Slot);
				 */
			} else if (player.getTemporaryAttributtes().get("Sawing") != null
					&& player.getTemporaryAttributtes().get("Sawitem") != null) {
				int amount = value;
				int itemId = ((Integer) player.getTemporaryAttributtes().remove("Sawitem")).intValue();
				Item item = new Item(itemId);
				if (amount == 0) {
					player.getDialogueManager().startDialogue("SimpleMessage", "...");
					return;
				}
				if (player.getInventory().containsItem(960, amount)) {
					// todo action (lazy coding atm)
					player.getInventory().deleteItem(960, amount);
					player.setNextAnimation(new Animation(9031));
					player.getSkills().addXp(Skills.CONSTRUCTION, 25 * amount);
					return;
				} else {
					player.getDialogueManager().startDialogue("SimpleMessage",
							"You dont have " + amount + " " + item.getName() + "s.");
					return;
				}
			}
		} else if (opcode == ENTER_NAME_PACKET) {
			if (!player.isRunning() || player.isDead()) {
				return;
			}
			String value = stream.readString();

			InputEvent<?> inputEvent = player.getInputEvent();
			if (inputEvent instanceof InputNameEvent) {
				((InputNameEvent) inputEvent).onEvent(value);
				player.resetInputEvent();
				return;
			}

			if (player.getTemporaryAttributtes().remove("SaveCosmetic") != null) {
				if (value.equals("")) {
					return;
				}
				ItemsContainer<Item> cosmeticItems = new ItemsContainer<Item>(19, false);
				for (int i = 0; i < player.getEquipment().getCosmeticItems().getSize(); i++) {
					cosmeticItems.set(i, player.getEquipment().getCosmeticItems().get(i));
				}
				SavedCosmetic cosmetic = new SavedCosmetic(value, cosmeticItems);
				player.getEquipment().getSavedCosmetics().add(cosmetic);
				player.getPackets().sendGameMessage("<col=00ff00>You have succecfully added " + value
						+ " to your saved costumes. You can find it by doing ::cosmetics and clicking on ring slot.");
				return;
			}
			if (player.getTemporaryAttributtes().get("CosmeticsKeyWord") != null) {
				int slotId = (int) player.getTemporaryAttributtes().remove("CosmeticsKeyWord");
				int choosenOption = (int) player.getTemporaryAttributtes().remove("CosmeticsChoosenOption");
				if (value.equals("")) {
					return;
				}
				if (choosenOption != -1) {
					player.getDialogueManager().startDialogue("CosmeticsD", slotId, value, choosenOption);
				} else {
					player.getDialogueManager().startDialogue("CosmeticsD", slotId, value);
				}
				return;
			}
			if (player.getTemporaryAttributtes().remove("CosmeticsStoreKeyWord") != null) {
				if (value.equals("")) {
					return;
				}
				CosmeticsHandler.openCosmeticsStore(player, value, 0);
				return;
			}
			if (player.getTemporaryAttributtes().remove("referralName") != null) {
				player.unlock();
				if (value.equals("")) {
					return;
				}
				String name = Utils.formatPlayerNameForProtocol(value);
				if (Utils.formatPlayerNameForProtocol(player.getDisplayName()).equalsIgnoreCase(name)) {
					return;
				}
				if (!SerializableFilesManager.containsPlayer(name)) {
					player.getPackets().sendGameMessage("Account name " + Utils.formatString(name) + " doesn't exist.");
					return;
				}
				// /ReferralHandler.addReferral(Utils.formatPlayerNameForProtocol(player.getDisplayName()),
				// name);
				return;
			}
			if (value.equals("")) {
				return;
			}
			if (player.getTemporaryAttributtes().get("gr_cashout") == Boolean.TRUE) {
				player.getGrManager().changeCashout(value);
				player.getTemporaryAttributtes().put("gr_cashout", Boolean.FALSE);
			}
			if (player.getTemporaryAttributtes().get("xp_share") == Boolean.TRUE) {
				player.getXpSharing().submitEntry(value);
				player.getTemporaryAttributtes().put("xp_share", Boolean.FALSE);
			}
			if (player.getTemporaryAttributtes().remove(Key.DUNGEON_INVITE) != null) {
				player.getDungManager().invite(value);
				return;
			}
			if (player.getTemporaryAttributtes().remove("ADD_GEAR_NAME") != null) {
				player.getGearPresets().saveGear(value);
				return;
			}

			if (player.getTemporaryAttributtes().remove("SaveCosmetic") != null) {
				if (value.equals("")) {
					return;
				}
				boolean[] hiddenSlots = new boolean[15];
				for (int i = 0; i < player.getEquipment().getHiddenSlots().length; i++) {
					hiddenSlots[i] = player.getEquipment().getHiddenSlots()[i];
				}
				ItemsContainer<Item> cosmeticItems = new ItemsContainer<Item>(15, false);
				for (int i = 0; i < player.getEquipment().getCosmeticItems().getSize(); i++) {
					cosmeticItems.set(i, player.getEquipment().getCosmeticItems().get(i));
				}
				SavedCosmetic cosmetic = new SavedCosmetic(value, cosmeticItems);
				player.getEquipment().getSavedCosmetics().add(cosmetic);
				player.getPackets().sendGameMessage("<col=00ff00>You have succecfully added " + value
						+ " to your saved costumes. You can find it by doing ::cosmetics and clicking on ring slot.");
				return;
			}

			if (player.getTemporaryAttributtes().get("CosmeticsKeyWord") != null) {
				int slotId = (int) player.getTemporaryAttributtes().remove("CosmeticsKeyWord");
				if (value.equals("")) {
					return;
				}
				player.getDialogueManager().startDialogue("CosmeticsD", slotId, value);
				return;
			}
			if (player.getTemporaryAttributtes().get("loanHrs") == Boolean.TRUE) {
				player.getTrade().updateHours(Integer.valueOf(value));
			}
			if (player.getInterfaceManager().containsInterface(1108)) {
				player.getFriendsIgnores().setChatPrefix(value);
			} else if (player.getTemporaryAttributtes().remove("ADD_RESTRICT_NAME") != null) {
				player.getPetLootManager().getRestrictedItems().add(new RestrictedItem(value));
				player.getPackets().sendGameMessage(
						"Restricted item (" + value + ") has been added to your restricted items list.");
				player.getPackets().sendGameMessage("Use ::petlootmanager or ::plm to edit/remove/disable it.");
			} else if (player.getTemporaryAttributtes().remove("setclan") != null) {
				ClansManager.createClan(player, value);
			} else if (player.getTemporaryAttributtes().remove("joinguestclan") != null) {
				ClansManager.connectToClan(player, value, true);
			} else if (player.getTemporaryAttributtes().remove("joinguesthouse") != null) {
				House.enterHouse(player, value);
			} else if (player.getTemporaryAttributtes().remove("banclanplayer") != null) {
				ClansManager.banPlayer(player, value);
			} else if (player.getTemporaryAttributtes().remove("unbanclanplayer") != null) {
				ClansManager.unbanPlayer(player, value);
			} else if (player.getTemporaryAttributtes().get("clanmessage_hex") != null) {
				player.getClanManager().getClan().setClanMessageHex(value);
				player.getTemporaryAttributtes().remove("clanmessage_hex");
			} else if (player.getTemporaryAttributtes().remove("setdisplay") != null) {
				if (Utils.invalidAccountName(Utils.formatPlayerNameForProtocol(value))) {
					player.getPackets().sendGameMessage("Invalid name.");
					return;
				}
				if (!DisplayNames.setDisplayName(player, value)) {
					player.getPackets().sendGameMessage("Name already in use!");
					return;
				}
				DisplayNames.setDisplayName(player, value);
				player.displayNameChange = Utils.currentTimeMillis();
				player.getPackets()
						.sendGameMessage("Display name successfully set to: " + player.getDisplayName() + ".");
			} else {
				Boss boss = (Boss) player.getTemporaryAttributtes().remove(Key.JOIN_BOSS_INSTANCE);
				if (boss != null) {
					BossInstanceHandler.joinInstance(player, boss, value.toLowerCase(), false);
				}
			}
		} else if (opcode == ENTER_LONG_TEXT_PACKET) {
			if (!player.isRunning() || player.isDead()) {
				return;
			}
			String value = stream.readString();
			if (value.equals("")) {
				return;
			} else if (player.getDialogueManager().continueDialogue(value)) {
				return;
			}

			InputEvent<?> inputEvent = player.getInputEvent();
			if (inputEvent instanceof InputLongStringEvent) {
				((InputLongStringEvent) inputEvent).onEvent(value);
				player.resetInputEvent();
				return;
			}

			if (player.getTemporaryAttributtes().remove("entering_note") == Boolean.TRUE) {
				player.getNotes().add(value);
			} else if (player.getTemporaryAttributtes().remove("editing_note") == Boolean.TRUE) {
				player.getNotes().edit(value);
			} else if (player.getTemporaryAttributtes().remove("setbankname") == Boolean.TRUE) {
				if (player.getTemporaryAttributtes().get("setnametarget") != null) {
					Bank target = (Bank) player.getTemporaryAttributtes().get("setnametarget");
					target.setName(value);
					player.getDialogueManager().startDialogue("BankList", true);
					return;
				}
			} else if (player.getTemporaryAttributtes().remove("change_pass") == Boolean.TRUE) {
				if (value.length() < 5 || value.length() > 15) {
					player.getPackets().sendGameMessage("Password length is limited to 5-15 characters.");
					return;
				}
				player.setPassword(Encrypt.encryptSHA1(value));
				player.getPackets()
						.sendGameMessage("You have changed your password! Your new password is \"" + value + "\".");
			} else if (player.getTemporaryAttributtes().remove("change_troll_name") == Boolean.TRUE) {
				value = Utils.formatString(value);
				if (value.length() < 3 || value.length() > 14) {
					player.getPackets()
							.sendGameMessage("You can't use a name shorter than 3 or longer than 14 characters.");
					return;
				}
				if (value.equalsIgnoreCase("none")) {
					player.getPetManager().setTrollBabyName(null);
				} else {
					player.getPetManager().setTrollBabyName(value);
					if (player.getPet() != null && player.getPet().getId() == Pets.TROLL_BABY.getBabyNpcId()) {
						player.getPet().setName(value);
					}
				}
			} else if (player.getTemporaryAttributtes().remove("servermsg") == Boolean.TRUE) {
				player.getTemporaryAttributtes().put("servermsg", Boolean.FALSE);
				World.sendWorldMessage("<col=ff0000>[Sever Message]: " + Utils.fixChatMessage(value), false);
			} else if (player.getTemporaryAttributtes().remove("updatePersonalMsg") == Boolean.TRUE) {
				player.getTemporaryAttributtes().put("updatePersonalMsg", Boolean.TRUE);
				String[] bannedSts = { "Owner", "staff", "god", "cock", "anal", "anus", "ass", "ballsack", "bitch",
						"whore", "hoe", "damn", "fuck", "f u c k", "goddamn", "nigga", "penis", "piss", "shit", "sex",
						"s3x", "slut", "vagina", "pussy" };
				for (String banned : bannedSts) {
					if (!player.isStaff() && value.contains(banned)) {
						player.getDialogueManager().startDialogue("SimpleMessage",
								"Your personal message was not updated because it contains a banned word: " + Colors.RED
										+ banned);
						return;
					}
				}
				player.personalMessage = value;
				player.getDialogueManager().startDialogue("SimpleMessage",
						Colors.GREEN + "Success!</col> your new personal message:<br> " + player.personalMessage);
			} else if (player.getTemporaryAttributtes().remove("yellcolor") == Boolean.TRUE) {
				if (value.length() != 6) {
					player.getPackets().sendGameMessage(
							"The HEX yell color you wanted to pick cannot be longer and shorter then 6.");
				} else if (Utils.containsInvalidCharacter(value) || value.contains("_")) {
					player.getPackets().sendGameMessage(
							"The requested yell color can only contain numeric and regular characters.");
				} else {
					player.setYellColor(value);
					player.getPackets().sendGameMessage("Your yell color has been changed to <col="
							+ player.getYellColor() + ">" + player.getYellColor() + "</col>.");
				}
			} else if (player.getTemporaryAttributtes().remove("setdisplay") == Boolean.TRUE) {
				if (Utils.invalidAccountName(Utils.formatPlayerNameForProtocol(value))) {
					player.getPackets().sendGameMessage("Name contains invalid characters or is too short/long.");
					return;
				}
				if (!DisplayNames.setDisplayName(player, value)) {
					player.getPackets().sendGameMessage("This name is already in use.");
					return;
				}
				player.getPackets().sendGameMessage("Your display name was successfully changed.");
			} else if (player.getInterfaceManager().containsInterface(1103)
					&& player.getClanManager().getInterfaceSelected() == 2) {
				player.getClanManager().getClan().setClanMessage(value);
				player.closeInterfaces();
				player.getClanManager()
						.sendGlobalMessage("[<col=" + player.getClanManager().getClan().getCmHex() + ">"
								+ player.getClanName() + " Message</col>]<col="
								+ player.getClanManager().getClan().getCmHex() + ">" + value);
			} else if (player.getInterfaceManager().containsInterface(1103)
					&& player.getClanManager().getInterfaceSelected() == 1) {
				ClansManager.setClanMottoInterface(player, value);
			}
		} else if (opcode == COLOR_ID_PACKET) {
			if (!player.isActive()) {
				return;
			}
			int colorId = stream.readUnsignedShort();
			if (player.getTemporaryAttributtes().get("SkillcapeCustomize") != null) {
				SkillCapeCustomizer.handleSkillCapeCustomizerColor(player, colorId);
			} else if (player.getTemporaryAttributtes().get("MottifCustomize") != null) {
				ClansManager.setMottifColor(player, colorId);
			} else if (player.getTemporaryAttributtes().remove("COSTUME_COLOR_CUSTOMIZE") != null) {
				SkillCapeCustomizer.handleCostumeColor(player, colorId);
			}
		} else if (opcode == SWITCH_INTERFACE_COMPONENTS_PACKET) {
			stream.readShortLE128();
			int toSlot = stream.readUnsignedShortLE();
			int toInterfaceHash = stream.readIntV1();
			int fromSlot = stream.readUnsignedShort();
			int fromInterfaceHash = stream.readIntV2();
			stream.readUnsignedShortLE();

			int toInterfaceId = toInterfaceHash >> 16;
			int toComponentId = toInterfaceHash - (toInterfaceId << 16);
			int fromInterfaceId = fromInterfaceHash >> 16;
			int fromComponentId = fromInterfaceHash - (fromInterfaceId << 16);

			if (Settings.DEBUG) {
				Logger.log(this,
						"fromSlot: " + fromSlot + ", ToSlot: " + toSlot + ",  toInterfaceHash: " + toInterfaceHash
								+ ", toInterfaceID: " + toInterfaceId + ", toComponent: " + toComponentId
								+ ", frominterface: " + fromInterfaceId + ", from componentId: " + fromComponentId);
			}
			if (fromInterfaceId == 1265 && toInterfaceId == 1266
					&& player.getTemporaryAttributtes().get("shop_buying") != null) {
				if ((boolean) player.getTemporaryAttributtes().get("shop_buying") == true) {
					Shop shop = (Shop) player.getTemporaryAttributtes().get("Shop");
					if (shop == null) {
						return;
					}
					shop.buy(player, fromSlot, 1);
				}
			}
			if (Utils.getInterfaceDefinitionsSize() <= fromInterfaceId
					|| Utils.getInterfaceDefinitionsSize() <= toInterfaceId) {
				return;
			}
			if (!player.getInterfaceManager().containsInterface(fromInterfaceId)
					|| !player.getInterfaceManager().containsInterface(toInterfaceId)) {
				return;
			}
			if (fromComponentId != -1
					&& Utils.getInterfaceDefinitionsComponentsSize(fromInterfaceId) <= fromComponentId) {
				return;
			}
			if (toComponentId != -1 && Utils.getInterfaceDefinitionsComponentsSize(toInterfaceId) <= toComponentId) {
				return;
			}
			if (fromInterfaceId == Inventory.INVENTORY_INTERFACE && fromComponentId == 0
					&& toInterfaceId == Inventory.INVENTORY_INTERFACE && toComponentId == 0) {
				toSlot -= 28;
				if (toSlot < 0 || toSlot >= player.getInventory().getItemsContainerSize()
						|| fromSlot >= player.getInventory().getItemsContainerSize()) {
					return;
				}
				player.getInventory().switchItem(fromSlot, toSlot);
			} else if (fromInterfaceId == 763 && fromComponentId == 0 && toInterfaceId == 763 && toComponentId == 0) {
				if (toSlot >= player.getInventory().getItemsContainerSize()
						|| fromSlot >= player.getInventory().getItemsContainerSize()) {
					return;
				}
				player.getInventory().switchItem(fromSlot, toSlot);
			} else if (fromInterfaceId == 762 && toInterfaceId == 762) {
				if (toSlot < 0) {
					toSlot = 65535; // temp fix
				}
				if (player.getBank().isInsertItems()) {
					player.getBank().insertItem(fromSlot, toSlot);
				} else {
					player.getBank().switchItem(fromSlot, toSlot, fromComponentId, toComponentId);
				}
			} else if (fromInterfaceId == 34 && toInterfaceId == 34) {
				player.getNotes().switchNotes(fromSlot, toSlot);
			}
		} else if (opcode == WALKING_PACKET || opcode == MINI_WALKING_PACKET || opcode == ITEM_TAKE_PACKET
				|| opcode == GROUND_ITEM_OPTION_2_PACKET || opcode == PLAYER_OPTION_2_PACKET
				|| opcode == PLAYER_OPTION_4_PACKET || opcode == PLAYER_OPTION_5_PACKET
				|| opcode == PLAYER_OPTION_6_PACKET || opcode == PLAYER_OPTION_1_PACKET
				|| opcode == PLAYER_OPTION_9_PACKET || opcode == ATTACK_NPC || opcode == INTERFACE_ON_PLAYER
				|| opcode == INTERFACE_ON_NPC || opcode == NPC_CLICK1_PACKET || opcode == NPC_CLICK2_PACKET
				|| opcode == NPC_CLICK3_PACKET || opcode == NPC_CLICK4_PACKET || opcode == OBJECT_CLICK1_PACKET
				|| opcode == SWITCH_INTERFACE_COMPONENTS_PACKET || opcode == OBJECT_CLICK2_PACKET
				|| opcode == OBJECT_CLICK3_PACKET || opcode == OBJECT_CLICK4_PACKET || opcode == OBJECT_CLICK5_PACKET
				|| opcode == INTERFACE_ON_OBJECT) {
			player.addLogicPacketToQueue(new LogicPacket(opcode, length, stream));
			player.increaseAFKTimer();
		} else if (opcode == OBJECT_EXAMINE_PACKET) {
			ObjectHandler.handleOption(player, stream, -1);
		} else if (opcode == ADD_FRIEND_PACKET) {
			if (!player.isActive()) {
				return;
			}
			player.getFriendsIgnores().addFriend(stream.readString());
		} else if (opcode == REMOVE_FRIEND_PACKET) {
			if (!player.isActive()) {
				return;
			}
			player.getFriendsIgnores().removeFriend(stream.readString());
		} else if (opcode == ADD_IGNORE_PACKET) {
			if (!player.isActive()) {
				return;
			}
			player.getFriendsIgnores().addIgnore(stream.readString(), stream.readUnsignedByte() == 1);
		} else if (opcode == REMOVE_IGNORE_PACKET) {
			if (!player.isActive()) {
				return;
			}
			player.getFriendsIgnores().removeIgnore(stream.readString());
		} else if (opcode == SEND_FRIEND_MESSAGE_PACKET) {
			if (player.getMuted() > Utils.currentTimeMillis() || player.isPermMuted()) {
				player.sendMessage("You are muted and cannot talk.");
				return;
			}
			if (IPMute.isMuted(player.getSession().getIP())) {
				player.sendMessage("You are IP-muted and cannot talk.");
				return;
			}
			String username = stream.readString();
			String message = Huffman.decodeString(150, stream);
			Player p2 = World.getPlayerByDisplayName(username);
			if (p2 == null) {
				player.sendMessage(player.getDisplayName() + " is currently offline.");
				return;
			}
			LoggingSystem.logPM(player, p2, Utils.fixChatMessage(message));
			player.getFriendsIgnores().sendMessage(p2, Utils.fixChatMessage(message));
		} else if (opcode == ADD_FRIEND_PACKET) {
			if (!player.isActive()) {
				return;
			}
			player.getFriendsIgnores().addFriend(stream.readString());
		} else if (opcode == REMOVE_FRIEND_PACKET) {
			if (!player.isActive()) {
				return;
			}
			player.getFriendsIgnores().removeFriend(stream.readString());
		} else if (opcode == CHAT_TYPE_PACKET) {
			chatType = stream.readUnsignedByte();
		} else if (opcode == CHAT_PACKET) {
			if (!player.isActive() || player.getLastPublicMessage() > Utils.currentTimeMillis()) {
				return;
			}
			int colorEffect = stream.readUnsignedByte();
			int moveEffect = stream.readUnsignedByte();
			String message = Huffman.decodeString(200, stream);
			if (message == null) {
				return;
			}
			if (message.startsWith("::") || message.startsWith(";;")) {
				if (message.startsWith("::")) {
					player.sendMessage("Please use ;; instead of :: to enter commands!");
					return;
				}
				if (!player.getControlerManager().processCommand(message.replace("::", "").replace(";;", ""), false,
						false)) {
					return;
				}
				Commands.processCommand(player, message.replace("::", "").replace(";;", ""), false, false);
				return;
			}
			if (message.startsWith("\\") || message.startsWith("\\")) {
				Commands.processCommand(player,
						message.replace("\\", "answer ").replace("\\ ", "answer ").replace("\\  ", "answer "), false,
						false);
				return;
			}
			if (player.getMuted() > Utils.currentTimeMillis() || player.isPermMuted()) {
				player.sendMessage("You are muted and cannot talk.");
				return;
			}
			if (IPMute.isMuted(player.getSession().getIP())) {
				player.sendMessage("You are IP-muted and cannot talk.");
				return;
			}
			int effects = Utils.fixChatEffects(player.getUsername(), colorEffect, moveEffect);
			message = Profanity.processProfanity(message);
			if (chatType == 1) {
				player.sendFriendsChannelMessage(Utils.fixChatMessage(message));
				if (player.getRights() < 2 && message.contains("@everyone") || message.contains("@here")) {
					return;
				}
				DiscordMessage.sendFriendsChatMessage(Utils.fixChatMessage(message), player.getDisplayName());
			} else if (chatType == 2) {
				player.sendClanChannelMessage(new ChatMessage(Utils.fixChatMessage(message)));
			} else if (chatType == 3) {
				player.sendGuestClanChannelMessage(new ChatMessage(Utils.fixChatMessage(message)));
			} else {
				if (player.getControlerManager().getControler() instanceof EliteDungeonController) {
					for (Player party : player.getEliteDungeonsManager().getParty().getTeam()) {
						if (!party.getEliteDungeonsManager().isInside()) {
							continue;
						}
						party.getPackets().sendPublicMessage(player,
								new PublicChatMessage(Utils.fixChatMessage(message), effects));
					}
				} else {
					player.sendPublicChatMessage(new PublicChatMessage(Utils.fixChatMessage(message), effects));
				}
			}
			player.setLastPublicMessage(Utils.currentTimeMillis() + 300);
			LoggingSystem.logPublicChat(player, message);
			if (Settings.DEBUG) {
				Logger.log(this, "Chat type: " + chatType);
			}
			player.increaseAFKTimer();
		} else if (opcode == JOIN_FRIEND_CHAT_PACKET) {
			FriendChatsManager.joinChat(stream.readString(), player);
		} else if (opcode == KICK_FRIEND_CHAT_PACKET) {
			if (!player.isActive()) {
				return;
			}
			player.setLastPublicMessage(Utils.currentTimeMillis() + 1000); // avoids
			// message
			// appearing
			player.kickPlayerFromFriendsChannel(stream.readString());
		} else if (opcode == CHANGE_FRIEND_CHAT_PACKET) {
			if (!player.isActive() || !player.getInterfaceManager().containsInterface(1108)) {
				return;
			}
			player.getFriendsIgnores().changeRank(stream.readString(), stream.readUnsignedByte128());
		} else if (opcode == GRAND_EXCHANGE_ITEM_SELECT_PACKET) {
			int itemId = stream.readUnsignedShort();
			player.getGEManager().chooseItem(itemId);
		} else if (opcode == FORUM_THREAD_ID_PACKET) {
			String threadId = stream.readString();
			if (player.getInterfaceManager().containsInterface(1100)) {
				ClansManager.setThreadIdInterface(player, threadId);
			} else if (Settings.DEBUG) {
				Logger.log(this, "Called FORUM_THREAD_ID_PACKET: " + threadId);
			}
		} else if (opcode == OPEN_URL_PACKET) {
			String type = stream.readString();
			String path = stream.readString();
			String unknown = stream.readString();
			int flag = stream.readUnsignedByte();
		} else if (opcode == COMMANDS_PACKET) {
			if (!player.isRunning()) {
				return;
			}
			boolean clientCommand = stream.readUnsignedByte() == 1;
			stream.readUnsignedByte();
			String command = stream.readString();
			if (!Commands.processCommand(player, command, true, clientCommand) && Settings.DEBUG) {
				Logger.log(this, "Command: " + command);
			}
		} else if (opcode == NPC_EXAMINE_PACKET) {
			NPCHandler.handleExamine(player, stream);
		} else if (opcode == GROUND_ITEM_OPTION_2_PACKET) {
			if (!player.isActive() || !player.clientHasLoadedMapRegion() || player.isDead()) {
				return;
			}
			long currentTime = Utils.currentTimeMillis();
			if (player.getLockDelay() > currentTime) {
				return;
			}
			boolean forceRun = stream.readByte() == 1;
			int y = stream.readUnsignedShortLE();
			int x = stream.readUnsignedShort();
			final int id = stream.readUnsignedShort();
			final WorldTile tile = new WorldTile(x, y, player.getPlane());
			final int regionId = tile.getRegionId();
			if (!player.getMapRegionsIds().contains(regionId)) {
				return;
			}
			final FloorItem item = World.getRegion(regionId).getGroundItem(id, tile, player);
			if (item == null) {
				return;
			}
			player.stopAll(false);
			if (forceRun) {
				player.setRun(forceRun);
			}
			player.setRouteEvent(new RouteEvent(item, new Runnable() {
				@Override
				public void run() {
					if (item == null) {
						return;
					}
					if (item.getOwner() != null) {
						if (item.getOwner() != null) {
							if (!player.getUsername().equalsIgnoreCase(item.getOwner())
									&& player.getIronman().isIronman()) {
								player.sendMessage("Ironmen cannot interact with other player owned items.");
								return;
							}
							if (!player.getUsername().equalsIgnoreCase(item.getOwner())
									&& player.getIronman().getMode(player, 2)) {
								player.sendMessage("Hardcore ironmen cannot interact with other player owned items.");
								return;
							}
							if (!player.getUsername().equalsIgnoreCase(item.getOwner()) && player.isWiki()) {
								player.sendMessage("Wiki cannot interact with other player owned items.");
								return;
							}
						}
					}
					player.setNextFaceWorldTile(tile);
					player.addWalkSteps(tile.getX(), tile.getY(), 1);
					if (Firemaking.isFiremaking(player, item.getId())) {
						World.removeGroundItem(player, item);
						return;
					}
				}
			}));
			if (Settings.DEBUG) {
				System.out.println("Item id: " + item.getId() + ".");
			}
		} else if (opcode == GROUND_ITEM_OPTION_EXAMINE) {
			if (!player.isActive() || !player.clientHasLoadedMapRegion() || player.isDead()) {
				return;
			}
			long currentTime = Utils.currentTimeMillis();
			if (player.getLockDelay() > currentTime) {
				return;
			}
			boolean forceRun = stream.readByte() == 1;
			int y = stream.readUnsignedShortLE();
			int x = stream.readUnsignedShort();
			final int id = stream.readUnsignedShort();
			final WorldTile tile = new WorldTile(x, y, player.getPlane());
			final int regionId = tile.getRegionId();
			if (!player.getMapRegionsIds().contains(regionId)) {
				return;
			}
			final FloorItem item = World.getRegion(regionId).getGroundItem(id, tile, player);
			if (item == null) {
				return;
			}
			player.sendMessage(ItemExamines.getExamine(item));
		} else if (opcode == DONE_LOADING_REGION_PACKET) {
			if (!player.clientHasLoadedMapRegion()) { // load objects and items
				player.setClientHasLoadedMapRegion();
			}
			player.refreshSpawnedObjects();
		} else if (opcode == PUBLIC_QUICK_CHAT_PACKET) {
			if (!player.isActive()) {
				return;
			}
			if (player.getLastPublicMessage() > Utils.currentTimeMillis()) {
				return;
			}
			player.setLastPublicMessage(Utils.currentTimeMillis() + 300);
			boolean secondClientScript = stream.readByte() == 1;
			int fileId = stream.readUnsignedShort();
			if (!Utils.isValidQuickChat(fileId)) {
				return;
			}
			byte[] data = null;
			if (length > 3) {
				data = new byte[length - 3];
				stream.readBytes(data);
			}
			data = Utils.completeQuickMessage(player, fileId, data);
			if (chatType == 0) {
				player.sendPublicChatMessage(new QuickChatMessage(fileId, data));
			} else if (chatType == 1) {
				player.sendFriendsChannelQuickMessage(new QuickChatMessage(fileId, data));
			} else if (chatType == 2) {
				player.sendClanChannelQuickMessage(new QuickChatMessage(fileId, data));
			} else if (chatType == 3) {
				player.sendGuestClanChannelQuickMessage(new QuickChatMessage(fileId, data));
			} else if (Settings.DEBUG) {
				Logger.log(this, "Unknown chat type: " + chatType);
			}
			player.increaseAFKTimer();
		} else if (opcode == ACTION_BUTTON1_PACKET || opcode == ACTION_BUTTON2_PACKET || opcode == ACTION_BUTTON4_PACKET
				|| opcode == ACTION_BUTTON5_PACKET || opcode == ACTION_BUTTON6_PACKET || opcode == ACTION_BUTTON7_PACKET
				|| opcode == ACTION_BUTTON8_PACKET || opcode == ACTION_BUTTON3_PACKET || opcode == ACTION_BUTTON9_PACKET
				|| opcode == ACTION_BUTTON10_PACKET) {
			ButtonHandler.handleButtons(player, stream, opcode);
			player.increaseAFKTimer();
		} else if (opcode == DROP_ITEM_PACKET) {
			@SuppressWarnings("unused")
			int interfaceHash = stream.readIntV2();
			final int slotId2 = stream.readUnsignedShort128();
			final int slotId = stream.readUnsignedShortLE128();
			if (slotId > 27 || player.getInterfaceManager().containsInventoryInter()) {
				return;
			}
			Item item = player.getInventory().getItem(slotId);
			if (item == null || item.getId() != slotId2) {
				return;
			}
			InventoryOptionsHandler.handleItemOption7(player, slotId, slotId2, item);
			player.increaseAFKTimer();
		} else {
			if (Settings.DEBUG) {
				// Logger.log(this, "Unhandled Packet : " + opcode);
			}
		}
	}
}
Editor is loading...