Example #1
0
        public void handlePacket(Player player, Packet packet) {
		    int size = packet.getLength();
		    if(packet.getPacketId() == PacketHandlers.PacketId.WALK_2) {
			    size -= 14;
		    }
            player.getWalkingQueue().resetWalkingQueue();
		    int steps = (size - 5) / 2;

            if (steps > WalkingQueue.MAX_WALKING_WAYPOINTS)
            {
                misc.WriteError("Warning: Walk command contains too many steps (" + steps + ") currently set to 50 [maybe need increase?]");
                return;
            }

            player.getWalkingQueue().setIsRunning(packet.readByteA() == 1);
		    bool following = false;
            if (!canWalk(player, packet, following))
            {
                player.getPackets().clearMapFlag();
                player.getWalkingQueue().resetWalkingQueue();
                return;
            }

            int firstX = packet.readUShort() - (player.getLocation().getRegionX() - 6) * 8;
            int firstY = packet.readShortA() - (player.getLocation().getRegionY() - 6) * 8;
		    player.getWalkingQueue().addToWalkingQueue(firstX, firstY);

            for (int i = 0; i < steps; i++) //all the waypoints.
                player.getWalkingQueue().addToWalkingQueue((packet.readByteA() + firstX), (packet.readByteS() + firstY));

            if (player.getTeleportTo() != null) //is teleporting?
                player.getWalkingQueue().resetWalkingQueue();


		    if (player.getTemporaryAttribute("homeTeleporting") != null) {
			    player.removeTemporaryAttribute("homeTeleporting");
		    }
		    SkillHandler.resetAllSkills(player);
		    if (player.getTrade() != null)
			    player.getTrade().decline();
            if (player.getDuel() != null) {
                if (player.getDuel().getStatus() < 4)
                    player.getDuel().declineDuel();
                else if (player.getDuel().getStatus() == 8)
                    player.getDuel().recieveWinnings(player);
            }
			if (player.getTarget() != null) {
				if (!following && player.getTarget().getAttacker() != null && player.getTarget().getAttacker().Equals(player))
					player.getTarget().setAttacker(null);
			}		    
            
            if (!following) {
			    player.getFollow().setFollowing(null);
				player.setTarget(null);
				player.removeTemporaryAttribute("autoCasting");
			    if (player.getEntityFocus() != 65535)
				    player.setEntityFocus(65535);
		    }
		    player.getPackets().closeInterfaces();
	    }
 public static void openInterface(Player p)
 {
     p.getPackets().displayInterface(771);
     p.getPackets().sendPlayerHead(771, 79);
     p.getPackets().animateInterface(9804, 771, 79);
     p.getPackets().sendConfig(1262, p.getAppearance().getGender() == 2 ? 1 : 8);
     p.getAppearance().setTemporaryAppearance(new Appearance());
     p.getAppearance().getTemporaryAppearance().setColoursArray(p.getAppearance().getColoursArray());
     p.getAppearance().getTemporaryAppearance().setLookArray(p.getAppearance().getLookArray());
     p.getAppearance().getTemporaryAppearance().setGender(p.getAppearance().getGender());
     p.removeTemporaryAttribute("hairToggle");
 }
 public static void openInterface(Player p)
 {
     p.getPackets().displayInterface(771);
     p.getPackets().sendPlayerHead(771, 79);
     p.getPackets().animateInterface(9804, 771, 79);
     p.getPackets().sendConfig(1262, p.getAppearance().getGender() == 2 ? 1 : 8);
     p.getAppearance().setTemporaryAppearance(new Appearance());
     p.getAppearance().getTemporaryAppearance().setColoursArray(p.getAppearance().getColoursArray());
     p.getAppearance().getTemporaryAppearance().setLookArray(p.getAppearance().getLookArray());
     p.getAppearance().getTemporaryAppearance().setGender(p.getAppearance().getGender());
     p.removeTemporaryAttribute("hairToggle");
 }
 public void clear()
 {
     appearanceUpdateRequired      = false;
     teleportUpdateRequired        = false; //not a isUpdateRequired because should do a update regardless if you are teleporting or not.
     mapRegionChangeUpdateRequired = false; //not a isUpdateRequired because mapRegion has to be accurately set when doing a update, or messes up).
     chatTextUpdateRequired        = false;
     animationUpdateRequired       = false;
     graphicsUpdateRequired        = false;
     hitUpdateRequired             = false;
     hit2UpdateRequired            = false;
     entityFocusUpdateRequired     = false;
     forceTextUpdateRequired       = false;
     faceLocationUpdateRequired    = false;
     forceMovementRequired         = false;
     player.getSprites().setSprites(-1, -1);
     player.removeTemporaryAttribute("forceText");
 }
	    public static void doObstacle(Player p, int index) {
		    if (p.getTemporaryAttribute("unmovable") != null) {
			    return;
		    }
            switch (index)
            {
                case 0: // 3 planks, northern (east side)
                case 1: // 3 planks, middle (east side)
                case 2: // 3 planks, southern (east side)
                case 3: // 3 planks, northern (west side)
                case 4: // 3 planks, middle (west side)
                case 5: // 3 planks, southern (west side)
                    int logXCoord = index <= 2 ? (int)AGILITY_ARENA_OBJECTS[index][1] + 1 : (int)AGILITY_ARENA_OBJECTS[index][1] - 1;
                    int logDirectionX = index <= 2 ? -7 : +7;
                    CoordinateEvent plankObstaclesCoordinateEvent = new CoordinateEvent(p, new Location(logXCoord, (int)AGILITY_ARENA_OBJECTS[index][2], 3));
                    plankObstaclesCoordinateEvent.setAction(() =>
                    {
                        bool running = p.getWalkingQueue().isRunToggled();
                        p.getWalkingQueue().setRunToggled(false);
                        p.getWalkingQueue().resetWalkingQueue();
                        p.getPackets().clearMapFlag();
                        p.setTemporaryAttribute("unmovable", true);
                        p.getAppearance().setWalkAnimation(155);
                        p.getUpdateFlags().setAppearanceUpdateRequired(true);
                        p.getWalkingQueue().forceWalk(logDirectionX, 0);
                        Event plankObstaclesEvent = new Event(4300);
                        plankObstaclesEvent.setAction(() =>
                        {
                            plankObstaclesEvent.stop();
                            p.removeTemporaryAttribute("unmovable");
                            p.getAppearance().setWalkAnimation(-1);
                            p.getUpdateFlags().setAppearanceUpdateRequired(true);
                            p.getSkills().addXp(Skills.SKILL.AGILITY, (double)AGILITY_ARENA_OBJECTS[index][3]);
                            p.getWalkingQueue().setRunToggled(running);
                        });
                        Server.registerEvent(plankObstaclesEvent);
                    });
                    Server.registerCoordinateEvent(plankObstaclesCoordinateEvent);
                    break;

                case 6: //Handholds obstacle east of planks.
                case 7: //Handholds obstacle west of planks.
                    int handHoldsDirectionX = 1;
                    int handHoldsDirectionY = 1;
                    if (index == 6) {
                        handHoldsDirectionX = -1;
                        handHoldsDirectionY = +1;
                    } else if (index == 7) {
                        handHoldsDirectionX = +1;
                        handHoldsDirectionY = -1;
                    }
                    CoordinateEvent handholdsObstacleCoordinateEvent = new CoordinateEvent(p, new Location((int)AGILITY_ARENA_OBJECTS[index][1], (int)AGILITY_ARENA_OBJECTS[index][2], 3));
                    handholdsObstacleCoordinateEvent.setAction(() =>
                    {
                        bool running = p.getWalkingQueue().isRunToggled();
                        p.getWalkingQueue().setRunToggled(false);
                        p.getWalkingQueue().resetWalkingQueue();
                        p.getPackets().clearMapFlag();
                        p.setTemporaryAttribute("unmovable", true);
                        p.setLastAnimation(new Animation(1121));
                        p.setFaceLocation(new Location(p.getLocation().getX(), p.getLocation().getY() + handHoldsDirectionY, 3));
                        Event handholdsObstaclesEvent = new Event(700);
                        int handholdsObstaclesCounter = 0;
                        handholdsObstaclesEvent.setAction(() =>
                        {
                            p.setLastAnimation(new Animation(1122));
                            int regionX = p.getUpdateFlags().getLastRegion().getRegionX();
                            int regionY = p.getUpdateFlags().getLastRegion().getRegionY();
                            int lX = (p.getLocation().getX() - ((regionX - 6) * 8));
                            int lY = (p.getLocation().getY() - ((regionY - 6) * 8));
                            p.setForceMovement(new ForceMovement(lX, lY, lX + handHoldsDirectionX, lY, 0, 5, 0));
                            if (handholdsObstaclesCounter++ >= 7)
                            {
                                p.setLastAnimation(new Animation(65535));
                                handholdsObstaclesEvent.stop();
                                p.removeTemporaryAttribute("unmovable");
                                p.getSkills().addXp(Skills.SKILL.AGILITY, (double)AGILITY_ARENA_OBJECTS[index][3]);
                                p.getWalkingQueue().setRunToggled(running);
                                return;
                            }
                            Event teleportEvent = new Event(500);
                            teleportEvent.setAction(() =>
                            {
                                teleportEvent.stop();
                                p.teleport(new Location(p.getLocation().getX() + handHoldsDirectionX, p.getLocation().getY(), 3));
                            });
                            Server.registerEvent(teleportEvent);
                        });
                        Server.registerEvent(handholdsObstaclesEvent);
                    });
                    Server.registerCoordinateEvent(handholdsObstacleCoordinateEvent);
                    break;
            }
	    }
 public static void configureSelectSpellInterface(Player p)
 {
     p.removeTemporaryAttribute("autoCasting");
     if (p.getMagicType() == 1) {
         if (p.getEquipment().getItemInSlot(ItemData.EQUIP.WEAPON) == 4170)
         { // Slayer staff.
             p.getPackets().sendTab(83, 310);
             return;
         }
         else if (p.getEquipment().getItemInSlot(ItemData.EQUIP.WEAPON) == 8841)
         { // Void knight mace.
             p.getPackets().sendTab(83, 406);
             return;
         } else {
             p.getPackets().sendTab(83, 319);
         }
     } else if (p.getMagicType() == 2) {
         if (p.getEquipment().getItemInSlot(ItemData.EQUIP.WEAPON) == 4675)
         { // Ancient staff.
             p.getPackets().sendTab(83, 388);
         } else {
             p.getPackets().sendMessage("You cannot autocast Ancient Magic with this staff.");
         }
     }
 }
 public static void setAutoCastSpell(Player p, int spell, int spellIndex, bool ancients)
 {
     p.getPackets().modifyText(AUTOCAST_NAME[spell], 90, 11);
     p.getPackets().showChildInterface(90, 83, false);
     p.getPackets().showChildInterface(90, AUTOCAST_CONFIG[spell], true);
     p.getPackets().sendConfig(43, 3);
     p.getPackets().sendTab(83, 90);
     p.getPackets().modifyText(p.getEquipment().getSlot(ItemData.EQUIP.WEAPON).getDefinition().getName(), 90, 0);
     p.setTemporaryAttribute("autoCastSpell", spellIndex);
     p.setTemporaryAttribute("autoCastSpell2", spell);
     if (ancients) {
         p.setTemporaryAttribute("autoCastAncients", ancients);
     } else {
         p.removeTemporaryAttribute("autoCastAncients");
     }
 }
	    public static bool openTunnelDoor(Player player, int doorId, int x, int y) {
		    if (doorId < 6716 || (doorId > 6731 && doorId < 6735) || doorId > 6750) {
			    return false;
		    }
		    int index = getDoorIndex(doorId, x, y);
		    int index2 = getOtherDoor(x, y); // index of the door next to the one you clicked.
		    if (index == -1 || index2 == -1) {
			    return false;
		    }
            bool betweenDoors = player.getTemporaryAttribute("betweenDoors") != null;
            Location clickedDoor = new Location(DOOR_LOCATION[index][0], DOOR_LOCATION[index][1], 0);
            Location otherDoor = new Location(DOOR_LOCATION[index2][0], DOOR_LOCATION[index2][1], 0);
            int openDoorId = DOOR_OPEN_DIRECTION[index][0];
            int openDoorId2 = DOOR_OPEN_DIRECTION[index2][0];
            int openDirection = DOOR_OPEN_DIRECTION[index][2];
		    int newX = openDirection == 1 ? x+1 : openDirection == 2 ? x : openDirection == 3 ? x-1 : openDirection == 4 ? x : x;
		    int newY = openDirection == 1 ? y : openDirection == 2 ? y+1 : openDirection == 3 ? y : openDirection == 4 ? y-1 : y;
            int newX2 = openDirection == 1 ? DOOR_LOCATION[index2][0] + 1 : openDirection == 2 ? DOOR_LOCATION[index2][0] : openDirection == 3 ? DOOR_LOCATION[index2][0] - 1 : openDirection == 4 ? DOOR_LOCATION[index2][0] : DOOR_LOCATION[index2][0];
            int newY2 = openDirection == 1 ? DOOR_LOCATION[index2][1] : openDirection == 2 ? DOOR_LOCATION[index2][1] + 1 : openDirection == 3 ? DOOR_LOCATION[index2][1] : openDirection == 4 ? DOOR_LOCATION[index2][1] - 1 : DOOR_LOCATION[index2][1];
            int[] doorStandCoordinates = getDoorCoordinates(player, index, index2, betweenDoors);
            int[] walkDirections = getWalkDirections(player, index, index2, betweenDoors);
            player.setFaceLocation(clickedDoor);
            AreaEvent doorsWalkAreaEvent = new AreaEvent(player, doorStandCoordinates[0], doorStandCoordinates[1], doorStandCoordinates[2] + 1, doorStandCoordinates[3] + 1);
            doorsWalkAreaEvent.setAction(() => {
                player.setTemporaryAttribute("unmovable", true);

                Event forceWalkDoorEvent = new Event(800);
                forceWalkDoorEvent.setAction(() => {
                    player.getWalkingQueue().resetWalkingQueue();
					foreach(Player p in Server.getPlayerList()) { //change door for all logged in players? uhh what?
						p.getPackets().removeObject(clickedDoor, openDoorId == 6713 ? 4 : 3, 0);
						p.getPackets().removeObject(otherDoor, openDoorId2 == 6732 ? 3 : 4, 0);
                        p.getPackets().createObject(openDoorId, new Location(newX, newY, 0), DOOR_OPEN_DIRECTION[index][1], 0);
                        p.getPackets().createObject(openDoorId2, new Location(newX2, newY2, 0), DOOR_OPEN_DIRECTION[index2][1], 0);
					}
                    player.getWalkingQueue().forceWalk(walkDirections[0], walkDirections[1]);
					forceWalkDoorEvent.stop();
				});
                Server.registerEvent(forceWalkDoorEvent);
                Event betweenDoorsEvent = new Event(betweenDoors ? 2200 : 1900);
                betweenDoorsEvent.setAction(() => {
					int face = openDirection == 3 ? 0 : openDirection == 4 ? 3 : openDirection == 2 ? 1 : 2;
					foreach(Player p in Server.getPlayerList()) {
						p.getPackets().removeObject(new Location(newX, newY, 0), openDoorId == 6713 ? 4 : 3, 0);
						p.getPackets().removeObject(new Location(newX2, newY2, 0), openDoorId2 == 6732 ? 3 : 4, 0);
						p.getPackets().createObject(DOORS[index], clickedDoor, face, 0);
						p.getPackets().createObject(DOORS[index2], otherDoor, face, 0);
					}
                    player.removeTemporaryAttribute("unmovable");
					if (!betweenDoors) {
                        player.getPackets().sendConfig(1270, 1);
                        player.setTemporaryAttribute("betweenDoors", true);
					} else {
                        player.getPackets().sendConfig(1270, 0);
                        player.removeTemporaryAttribute("betweenDoors");
					}
					betweenDoorsEvent.stop();
				});
                Server.registerEvent(betweenDoorsEvent);
		    });
            Server.registerCoordinateEvent(doorsWalkAreaEvent);
		    return true;
	    }
 public static void cancelAutoCast(Player p, bool cancelCast)
 {
     if (cancelCast) {
         p.getEquipment().setWeapon();
         //p.getPackets().sendConfig(43, 0);
         resetSpellIcon(p);
         p.removeTemporaryAttribute("autoCastSpell");
         p.removeTemporaryAttribute("autoCastAncients");
         p.getPackets().showChildInterface(90, 83, true);
         p.getPackets().modifyText("Spell", 90, 11);
         return;
     }
     if (p.getTemporaryAttribute("autoCastSpell") != null) {
         setAutoCastSpell(p, (int)p.getTemporaryAttribute("autoCastSpell2"), (int)p.getTemporaryAttribute("autoCastSpell"), (bool)(p.getTemporaryAttribute("autoCastAncients") != null ? true : false));
     } else {
         //p.getPackets().sendConfig(43, 0);
         resetSpellIcon(p);
         p.getEquipment().setWeapon();
         p.getPackets().showChildInterface(90, 83, true);
         p.getPackets().modifyText("Spell", 90, 11);
         p.removeTemporaryAttribute("autoCastSpell");
         p.removeTemporaryAttribute("autoCastAncients");
         p.removeTemporaryAttribute("autoCastSpell2");
     }
 }
	    protected static void createdAnimatedArmour(Player p, int index) {
		    if (p.getTemporaryAttribute("warriorGuildAnimator") == null) {
			    return;
		    }
		    p.setLastAnimation(new Animation(827));
		    p.setTemporaryAttribute("unmovable", true);
		    for (int i = 0; i < ARMOUR_SETS[index].Length; i++) {
			    p.getInventory().deleteItem(ARMOUR_SETS[index][i]);
		    }
		    p.getPackets().sendChatboxInterface(211);
		    p.getPackets().modifyText("You place the armour onto the platform where it", 211, 1);
		    p.getPackets().modifyText("dissapears...", 211, 2);
		    int animatorIndex = (int) p.getTemporaryAttribute("warriorGuildAnimator");
            Event createAnimatedArmourEvent = new Event(1500);
            int createAnimatedArmourCounter = 0;
            Npc npc = null;
            createAnimatedArmourEvent.setAction(() => {
                if (createAnimatedArmourCounter == 0)
                {
					p.getPackets().sendChatboxInterface(211);
					p.getPackets().modifyText("The animator hums, something appears to be working.", 211, 1);
					p.getPackets().modifyText("You stand back.", 211, 2);
					createAnimatedArmourEvent.setTick(500);
                }
                else if (createAnimatedArmourCounter == 1)
                {
					p.getWalkingQueue().forceWalk(0, + 3);
					createAnimatedArmourEvent.setTick(2000);
                }
                else if (createAnimatedArmourCounter == 2)
                {
					createAnimatedArmourEvent.setTick(500);
					Location minCoords = new Location(2849, 3534, 0);
					Location maxCoords = new Location(2861, 3545, 0);
					npc = new Npc(ANIMATED_ARMOUR[index]);
					npc.setMinimumCoords(minCoords);
					npc.setMaximumCoords(maxCoords);
					npc.setLocation(new Location(ANIMATOR_LOCATIONS[animatorIndex][0], ANIMATOR_LOCATIONS[animatorIndex][1], 0));
					npc.setWalkType(WalkType.STATIC);
					npc.setForceText("I'm ALIVE!");
					npc.setLastAnimation(new Animation(4166));
					npc.setEntityFocus(p.getClientIndex());
					npc.setOwner(p);
					npc.setTarget(p);
					p.getPackets().setArrowOnEntity(1, npc.getClientIndex());
					Server.getNpcList().Add(npc);
				} else {
					p.setEntityFocus(npc.getClientIndex());
					p.getPackets().softCloseInterfaces();
					createAnimatedArmourEvent.stop();
					p.removeTemporaryAttribute("unmovable");
					npc.getFollow().setFollowing(p);
				}
                createAnimatedArmourCounter++;
		    });
            Server.registerEvent(createAnimatedArmourEvent);
	    }
	    public static void verifyEnterTunnel(Player p) {
		    p.getPackets().closeInterfaces();
		    if (p.getTemporaryAttribute("barrowTunnel") != null) {
			    if ((int) p.getTemporaryAttribute("barrowTunnel") == 2) {
				    p.teleport(new Location(3568, 9712, 0));
				    p.removeTemporaryAttribute("barrowTunnel");
				    return;
			    }
		    }
		    p.getPackets().sendChatboxInterface(228);
		    p.getPackets().modifyText("Yeah, I'm fearless!", 228, 2);
		    p.getPackets().modifyText("No way, that looks scary!", 228, 3);
		    p.setTemporaryAttribute("barrowTunnel", 2);
	    }
	    private void resetVariables(Player p) {
		    p.setSkullCycles(0);
		    p.getSpecialAttack().resetSpecial();
		    p.setLastkiller(null);
		    p.setDead(false);
		    p.setEntityFocus(65535);
		    p.setPoisonAmount(0);
		    p.clearKillersHits();
		    p.setLastVengeanceTime(0);
		    p.setVengeance(false);
		    p.removeTemporaryAttribute("willDie");
		    p.setFrozen(false);
		    p.removeTemporaryAttribute("unmovable");
		    p.setAntifireCycles(0);
		    p.setSuperAntipoisonCycles(0);
		    p.setTeleblockTime(0);
		    p.removeTemporaryAttribute("teleblocked");
		    p.setTarget(null);
		    p.setAttacker(null);
            foreach (Skills.SKILL skill in Enum.GetValues(typeof(Skills.SKILL)))
                p.getSkills().setCurLevel(skill, p.getSkills().getMaxLevel(skill));
		    p.getPackets().sendSkillLevels();
		    Prayer.deactivateAllPrayers(p);
		    if (p.getTemporaryAttribute("cantDoAnything") != null) {
			    p.getAppearance().setInvisible(false);
			    p.getUpdateFlags().setAppearanceUpdateRequired(true);
			    p.removeTemporaryAttribute("cantDoAnything");
			    p.removeTemporaryAttribute("unmovable");
			    teleportToWaitingRoom(p, false);
			    p.getPackets().closeInterfaces();
			    p.getPackets().setMinimapStatus(0);
			    p.getPackets().clearMapFlag();
		    }
	    }
	    private static void travel(Player p, int index, bool returning) {
		    p.setTemporaryAttribute("unmovable", true);
		    p.getPackets().displayInterface(120);
		    if (returning) {
			    p.getPackets().sendMessage("You sail off back to Oo'glog..");
		    } else {
			    p.getPackets().sendMessage("You climb aboard Captain Bentley's boat and set sail to " + DESTINATION_NAMES[index] + ".");
		    }
            Event travelEvent = new Event(2000);
            int travelCounter = 0;
		    travelEvent.setAction(() => {
                if (travelCounter == 0)
                {
                    travelCounter++;
					travelEvent.setTick(600);
					if (returning) {
						p.teleport(new Location(2622, 2857, 0));
					} else {
						p.teleport(new Location(LOCATIONS[index][0], LOCATIONS[index][1], LOCATIONS[index][2]));
					}
				} else {
					travelEvent.stop();
					p.getPackets().sendOverlay(170);
					p.removeTemporaryAttribute("unmovable");
					p.getPackets().sendMessage(returning ? "The boat arrives back in Oo'glog." : DESTINATION_MESSAGES[index]);
					p.getPackets().closeInterfaces();
                    Event removeOverlayEvent = new Event(2000);
                    removeOverlayEvent.setAction(() => {
                        removeOverlayEvent.stop();
						p.getPackets().sendRemoveOverlay();
						if (index == 1) {
							p.removeTemporaryAttribute("snowInterface");
						}
					});
                    Server.registerEvent(removeOverlayEvent);
				}
		    });
            Server.registerEvent(travelEvent);
	    }
	    public static bool teleport(Player p, int opt, JewellerySlot js) {
		    if (js == null) {
			    return false;
		    }
		    if (js.index == -1 || js.index > 3 || opt > 6) {
			    return false;
		    }
		    if (!canTeleport(p, js)) {
			    p.getPackets().closeInterfaces();
			    return true;
		    }
		    if ((js.index == 2 && opt == 4) || (js.index != 2 && opt == 6)) {
			    p.getPackets().sendMessage("You stay where you are.");
			    p.getPackets().closeInterfaces();
			    return true;
		    }
		    opt -= 2; // Used to get the 'index' from the button id.
		    p.setLastGraphics(new Graphics(1684));
		    p.setLastAnimation(new Animation(9603));
		    p.getWalkingQueue().resetWalkingQueue();
		    p.getPackets().clearMapFlag();
		    p.setTemporaryAttribute("teleporting", true);
		    p.setTemporaryAttribute("unmovable", true);
		    p.removeTemporaryAttribute("autoCasting");
		    p.removeTemporaryAttribute("lootedBarrowChest");
		    p.setTarget(null);
		    changeJewellery(p, js);
		    int option = opt;
		    p.getPackets().closeInterfaces();
            Event teleportEvent = new Event(2000);
            teleportEvent.setAction(() => {
                teleportEvent.stop();
                p.teleport(new Location(TELEPORT_COORDINATES[js.index][option][0], TELEPORT_COORDINATES[js.index][option][1], 0));
				    p.setLastAnimation(new Animation(65535));
				    Teleport.resetTeleport(p);
				    p.removeTemporaryAttribute("unmovable");
		    });
            Server.registerEvent(teleportEvent);
		    return true;
	    }
	    private static void eatFood(Player p, int i, int j, int slot) {
            //delay at which you eat food 0.5 seconds (half a second per eat).
		    int delay = 500;
            //If you are dead or yourHp is zero (this should be enough), also if variable is set to die from next attack
            if (p.isDead() || p.getHp() <= 0 || p.getTemporaryAttribute("willDie") != null)
			    return;

            //Last time you ate timer was previously set.
		    if (p.getTemporaryAttribute("eatFoodTimer") != null) {
                //Check if the timer has passed the time of 1.2 seconds
			    if (Environment.TickCount - (int) p.getTemporaryAttribute("eatFoodTimer") < 1200) {
				    return;
			    }
		    }
            //if you are in a duel
		    if (p.getDuel() != null) {
                //dueling with No Food rule enabled
			    if (p.getDuel().ruleEnabled(DuelSession.RULE.NO_FOOD))  {
				    p.getPackets().sendMessage("Food has been disabled for this duel!");
				    return;
			    }
		    }
            //Set timer right now because you are eating some food.
		    p.setTemporaryAttribute("eatFoodTimer", Environment.TickCount);
            //while you are eating the target you are attacking gets reset.
		    p.setTarget(null);
		    p.resetCombatTurns();
		    p.setEntityFocus(65535);
		    p.getPackets().closeInterfaces();
		    p.removeTemporaryAttribute("autoCasting");

            //start eating the food at delay which is 0.5 of a second / half a second.
            Event eatFoodEvent = new Event(delay);
            eatFoodEvent.setAction(() => {
                //make the food eating event stop after this time.
				eatFoodEvent.stop();
                //if you are dead or your hp is zero aka dead.
				if (p.isDead() || p.getHp() <= 0) {
					return;
				}
				int newHealth = p.getSkills().getCurLevel(Skills.SKILL.HITPOINTS) + FOOD_HEAL[j];
                int item = i != 2 && FOOD[i + 1][j] != -1 ? FOOD[i + 1][j] : -1;
                if (!p.getInventory().replaceItemSlot(FOOD[i][j], item, slot))
                {
					return;
				}
                p.getPackets().sendMessage("You eat the " + ItemData.forId(FOOD[i][j]).getName().ToLower() + ".");
				p.getSkills().setCurLevel(Skills.SKILL.HITPOINTS, newHealth > p.getSkills().getMaxLevel(Skills.SKILL.HITPOINTS) ? p.getSkills().getMaxLevel(Skills.SKILL.HITPOINTS) : newHealth);
				p.setLastAnimation(new Animation(829));
				p.getPackets().sendSkillLevel(Skills.SKILL.HITPOINTS);
		    });
            Server.registerEvent(eatFoodEvent);
	    }
	    public static void showAliDialogue(Player p, int status) {
		    int newStatus = -1;
		    p.getPackets().softCloseInterfaces();
		    if (p.getTemporaryAttribute("unmovable") != null) {
			    return;
		    }
		    switch(status) {
			    case 156:
				    p.getPackets().sendPlayerHead(64, 2);
				    p.getPackets().modifyText(p.getLoginDetails().getUsername(), 64, 3);
				    p.getPackets().modifyText("Hello?", 64, 4);
				    p.getPackets().animateInterface(9827, 64, 2);
				    p.getPackets().sendChatboxInterface2(64);
				    newStatus = 157;
				    break;
				
			    case 157:
				    p.getPackets().sendNPCHead(1862, 241, 2);
				    p.getPackets().modifyText("Ali Morissane", 241, 3);
				    p.getPackets().modifyText("Well, hello there " + p.getLoginDetails().getUsername() + ", can i help you?", 241, 4);
				    p.getPackets().animateInterface(9827, 241, 2);
				    p.getPackets().sendChatboxInterface2(241);
				    newStatus = 158;
				    break;
				
			    case 158:
				    p.getPackets().sendChatboxInterface2(230);
				    p.getPackets().modifyText("Can you take me to Al-Kharid please?", 230, 2);
				    p.getPackets().modifyText("You don't look like you're from around here..", 230, 3);
				    p.getPackets().modifyText("Nothing, sorry to bother you", 230, 4);
				    newStatus = 159;
				    break;
				
			    case 159:
				    p.getPackets().sendPlayerHead(64, 2);
				    p.getPackets().modifyText(p.getLoginDetails().getUsername(), 64, 3);
				    p.getPackets().modifyText("Can you take me to Al-Kharid please?", 64, 4);
				    p.getPackets().animateInterface(9827, 64, 2);
				    p.getPackets().sendChatboxInterface2(64);
				    newStatus = 160;
				    break;
				
			    case 160:
                    p.getPackets().sendNPCHead(1862, 241, 2);
                    p.getPackets().modifyText("Ali Morissane", 241, 3);
                    p.getPackets().modifyText("Certainly, let's go..", 241, 4);
                    p.getPackets().animateInterface(9827, 241, 2);
                    p.getPackets().sendChatboxInterface2(241);
				    newStatus = 161;
				    break;
				
			    case 161:
				    p.setTemporaryAttribute("unmovable", true);
				    p.getPackets().displayInterface(120);
				    p.getPackets().sendMessage("You follow Ali across vast lands..");
                    Event moveToAlKharidEvent = new Event(2000);
                    int moveToAlKharidCounter = 0;
                    moveToAlKharidEvent.setAction(() => {
                        if (moveToAlKharidCounter == 0)
                        {
                            moveToAlKharidCounter++;
                            moveToAlKharidEvent.setTick(600);
							p.teleport(new Location(3311 + misc.random(2),3199 + misc.random(3), 0));
						} else {
                            moveToAlKharidEvent.stop();
                            p.getPackets().sendOverlay(170);
							p.removeTemporaryAttribute("unmovable");
                            p.getPackets().sendMessage("..Eventually, you find yourself in Al-Kharid.");
                            p.getPackets().closeInterfaces();
                            Event removeOverlayEvent = new Event(2000);
                            removeOverlayEvent.setAction(() => {
                                removeOverlayEvent.stop();
                                p.getPackets().sendRemoveOverlay();
							});
                            Server.registerEvent(removeOverlayEvent);
						}	
				    });
                    Server.registerEvent(moveToAlKharidEvent);
				    break;
				
			    case 162:
                    p.getPackets().sendPlayerHead(64, 2);
                    p.getPackets().modifyText(p.getLoginDetails().getUsername(), 64, 3);
                    p.getPackets().modifyText("You don't look like you're from around here..", 64, 4);
                    p.getPackets().animateInterface(9827, 64, 2);
                    p.getPackets().sendChatboxInterface2(64);
				    newStatus = 163;
				    break;
				
			    case 163:
                    p.getPackets().sendNPCHead(1862, 241, 2);
                    p.getPackets().modifyText("Ali Morissane", 241, 3);
                    p.getPackets().modifyText("That's because i'm not!", 241, 4);
                    p.getPackets().animateInterface(9827, 241, 2);
                    p.getPackets().sendChatboxInterface2(241);
				    newStatus = 164;
				    break;
				
			    case 164:
                    p.getPackets().sendPlayerHead(64, 2);
                    p.getPackets().modifyText(p.getLoginDetails().getUsername(), 64, 3);
                    p.getPackets().modifyText("I thought as much, Where are you from?", 64, 4);
                    p.getPackets().animateInterface(9827, 64, 2);
                    p.getPackets().sendChatboxInterface2(64);
				    newStatus = 165;
				    break;
				
			    case 165:
                    p.getPackets().sendNPCHead(1862, 241, 2);
                    p.getPackets().modifyText("Ali Morissane", 241, 3);
                    p.getPackets().modifyText("I usually reside in a small desert town, called Al-Kharid.", 241, 4);
                    p.getPackets().animateInterface(9827, 241, 2);
                    p.getPackets().sendChatboxInterface2(241);
				    newStatus = 166;
				    break;
				
			    case 166:
                    p.getPackets().sendPlayerHead(64, 2);
                    p.getPackets().modifyText(p.getLoginDetails().getUsername(), 64, 3);
                    p.getPackets().modifyText("What does Al-Kharid have to offer?", 64, 4);
                    p.getPackets().animateInterface(9827, 64, 2);
                    p.getPackets().sendChatboxInterface2(64);
				    newStatus = 167;
				    break;
				
			    case 167:
				    p.getPackets().sendNPCHead(1862, 244, 2);
				    p.getPackets().modifyText("Ali Morissane", 244, 3);
				    p.getPackets().modifyText("Sand! lots, and lots of sand! On a more serious note..", 244, 4);
				    p.getPackets().modifyText("A mine full of ore rich rocks, a duel arena where", 244, 5);
				    p.getPackets().modifyText("I hear fortunes are gained and lost. Also, a small market,", 244, 6);
				    p.getPackets().modifyText("which has been attracting crafty thieves as of late!", 244, 7);
				    p.getPackets().animateInterface(9827, 244, 2);
				    p.getPackets().sendChatboxInterface2(244);
				    newStatus = 168;
				    break;
				
			    case 168:
				    p.getPackets().sendPlayerHead(64, 2);
				    p.getPackets().modifyText(p.getLoginDetails().getUsername(), 64, 3);
				    p.getPackets().modifyText("I may have to pay Al-Kharid a visit...", 64, 4);
				    p.getPackets().animateInterface(9827, 64, 2);
				    p.getPackets().sendChatboxInterface2(64);
				    newStatus = 169;
				    break;
				
			    case 169:
				    p.getPackets().sendNPCHead(1862, 242, 2);
				    p.getPackets().modifyText("Ali Morissane", 242, 3);
				    p.getPackets().modifyText("There is one problem. We have also been having", 242, 4);
				    p.getPackets().modifyText("trouble with some of the locals recently.", 242, 5);
				    p.getPackets().animateInterface(9827, 242, 2);
				    p.getPackets().sendChatboxInterface2(242);
				    newStatus = 170;
				    break;
				
			    case 170:
				    p.getPackets().sendPlayerHead(64, 2);
				    p.getPackets().modifyText(p.getLoginDetails().getUsername(), 64, 3);
				    p.getPackets().modifyText("Trouble with the locals?", 64, 4);
				    p.getPackets().animateInterface(9827, 64, 2);
				    p.getPackets().sendChatboxInterface2(64);
				    newStatus = 171;
				    break;
				
			    case 171:
				    p.getPackets().sendNPCHead(1862, 243, 2);
				    p.getPackets().modifyText("Ali Morissane", 243, 3);
				    p.getPackets().modifyText("Yes. Although I really shouldn't say anything but", 243, 4);
				    p.getPackets().modifyText("perhaps you can help. Bandits have overtaken some of", 243, 5);
				    p.getPackets().modifyText("the empty tents in Al-Kharid, and are quite aggressive...", 243, 6);
				    p.getPackets().animateInterface(9827, 243, 2);
				    p.getPackets().sendChatboxInterface2(243);
				    newStatus = 172;
				    break;
				
			    case 172:
				    p.getPackets().sendNPCHead(1862, 244, 2);
				    p.getPackets().modifyText("Ali Morissane", 244, 3);
				    p.getPackets().modifyText("..And that's not all! Deep under the town lies a beast,", 244, 4);
				    p.getPackets().modifyText("I hear it's a mixture of a bug and a fly...I expect it", 244, 5);
				    p.getPackets().modifyText("would take a fine warrior to defeat it and no doubt", 244, 6);
				    p.getPackets().modifyText("he would be generously rewarded.", 244, 7);
				    p.getPackets().animateInterface(9827, 244, 2);
				    p.getPackets().sendChatboxInterface2(244);
				    newStatus = 173;
				    break;
				
			    case 173:
				    p.getPackets().sendPlayerHead(65, 2);
				    p.getPackets().modifyText(p.getLoginDetails().getUsername(), 65, 3);
				    p.getPackets().modifyText("Do you have a map, or directions", 65, 4);
				    p.getPackets().modifyText("to Al-Kharid?", 65, 5);
				    p.getPackets().animateInterface(9827, 65, 2);
				    p.getPackets().sendChatboxInterface2(65);
				    newStatus = 174;
				    break;
				
			    case 174:
				    p.getPackets().sendNPCHead(1862, 243, 2);
				    p.getPackets().modifyText("Ali Morissane", 243, 3);
				    p.getPackets().modifyText("I don't i'm afraid, although I travel back reguarly and", 243, 4);
				    p.getPackets().modifyText("happen to have room for a passenger. So if you'd", 243, 5);
				    p.getPackets().modifyText("ever like to go to Al-Kharid, don't hesitate to ask me.", 243, 6);
				    p.getPackets().animateInterface(9827, 243, 2);
				    p.getPackets().sendChatboxInterface2(243);
				    newStatus = 175;
				    break;
				
			    case 175:
				    p.getPackets().sendPlayerHead(64, 2);
				    p.getPackets().modifyText(p.getLoginDetails().getUsername(), 64, 3);
				    p.getPackets().modifyText("Thankyou for the offer, I may take you up on it soon.", 64, 4);
				    p.getPackets().animateInterface(9827, 64, 2);
				    p.getPackets().sendChatboxInterface2(64);
				    newStatus = 176;
				    break;
				
			    case 176:
				    p.getPackets().sendNPCHead(1862, 241, 2);
				    p.getPackets().modifyText("Ali Morissane", 241, 3);
				    p.getPackets().modifyText("I'll see you then!", 241, 4);
				    p.getPackets().animateInterface(9827, 241, 2);
				    p.getPackets().sendChatboxInterface2(241);
				    break;
				
			    case 177:
				    p.getPackets().sendPlayerHead(64, 2);
				    p.getPackets().modifyText(p.getLoginDetails().getUsername(), 64, 3);
				    p.getPackets().modifyText("Nothing, sorry to bother you!", 64, 4);
				    p.getPackets().animateInterface(9827, 64, 2);
				    p.getPackets().sendChatboxInterface2(64);
				    break;
				
		    }
		    if (newStatus != -1) {
			    p.setTemporaryAttribute("dialogue", newStatus);
		    }
	    }
        /*
         * NOTE: Anything that goes in here and varies between HD and LD, 
         * reset the variable in ActionSender.configureGameScreen
         */
        public void updateVariables(Player p)
        {
            int currentLevel = p.getLocation().wildernessLevel();
            if (currentLevel != -1)
            { //Is in wilderness.
                int lastWildLevel = (p.getTemporaryAttribute("wildLvl") == null) ? -1 : (int)p.getTemporaryAttribute("wildLvl");

                if (currentLevel != lastWildLevel)
                {
                    if (currentLevel > 0)
                    {
                        p.setTemporaryAttribute("wildLvl", currentLevel);
                        if (p.getTemporaryAttribute("inWild") == null)
                        {
                            p.getPackets().sendPlayerOption("Attack", 1, 1);
                            p.getPackets().sendOverlay(381);
                            p.setTemporaryAttribute("inWild", true);
                        }
                    }
                    else
                    {
                        if (p.getTemporaryAttribute("inWild") != null)
                        {
                            p.getPackets().sendPlayerOption("null", 1, 1);
                            p.getPackets().sendRemoveOverlay();
                            p.removeTemporaryAttribute("wildLvl");
                            p.removeTemporaryAttribute("inWild");
                        }
                    }
                }
            }
            if (Location.inMultiCombat(p.getLocation()))
            {
                if (p.getTemporaryAttribute("inMulti") == null)
                {
                    p.getPackets().displayMultiIcon();
                    p.setTemporaryAttribute("inMulti", true);
                }
            }
            else
            {
                if (p.getTemporaryAttribute("inMulti") != null)
                {
                    p.getPackets().removeMultiIcon();
                    p.removeTemporaryAttribute("inMulti");
                }
            }
            if (Location.atDuelArena(p.getLocation()))
            {
                if (p.getDuel() != null)
                {
                    if (p.getDuel().getStatus() == 5 || p.getDuel().getStatus() == 6)
                    {
                        p.getPackets().sendPlayerOption("Fight", 1, 1);
                    }
                }
                if (p.getTemporaryAttribute("challengeUpdate") != null)
                {
                    p.getPackets().sendPlayerOption("Challenge", 1, 0);
                    p.removeTemporaryAttribute("challengeUpdate");
                }
                if (p.getTemporaryAttribute("atDuelArea") == null)
                {
                    p.getPackets().sendPlayerOption("Challenge", 1, 0);
                    p.getPackets().sendOverlay(638);
                    p.setTemporaryAttribute("atDuelArea", true);
                }
            }
            else
            {
                if (p.getTemporaryAttribute("atDuelArea") != null)
                {
                    p.getPackets().sendPlayerOption("null", 1, 0);
                    p.getPackets().sendRemoveOverlay();
                    p.removeTemporaryAttribute("atDuelArea");
                }
            }
            if (Location.atBarrows(p.getLocation()))
            {
                if (p.getTemporaryAttribute("atBarrows") == null)
                {
                    p.getPackets().sendOverlay(24);
                    p.getPackets().setMinimapStatus(2);
                    p.getPackets().sendConfig(452, 2652256); // doors
                    if (p.getTemporaryAttribute("betweenDoors") == null)
                    {
                        if (Barrows.betweenDoors(p))
                        {
                            p.setTemporaryAttribute("betweenDoors", true);
                            p.getPackets().sendConfig(1270, 1);
                        }
                    }
                    p.getPackets().modifyText("Kill Count: " + p.getBarrowKillCount(), 24, 0);
                    p.setTemporaryAttribute("atBarrows", true);
                    Barrows.prayerDrainEvent(p);
                    bool allBrothersKilled = true;
                    for (int i = 0; i < 6; i++)
                    {
                        if (!p.getBarrowBrothersKilled(i))
                        {
                            allBrothersKilled = false;
                        }
                    }
                    if (allBrothersKilled)
                    {
                        Barrows.startEarthQuake(p);
                    }
                }
            }
            else
            {
                if (p.getTemporaryAttribute("atBarrows") != null)
                {
                    bool allBrothersKilled = true;
                    for (int i = 0; i < 6; i++)
                    {
                        if (!p.getBarrowBrothersKilled(i))
                        {
                            allBrothersKilled = false;
                        }
                    }
                    if (allBrothersKilled)
                    {
                        for (int i = 0; i < 6; i++)
                        {
                            p.setBarrowBrothersKilled(i, false);

                            p.setBarrowTunnel(-1);
                            p.setBarrowKillCount(0);
                            p.getPackets().resetCamera();
                            p.removeTemporaryAttribute("lootedBarrowChest");
                        }
                        p.getPackets().resetCamera();
                        p.getPackets().sendRemoveOverlay();
                        p.removeTemporaryAttribute("atBarrows");
                        p.removeTemporaryAttribute("barrowTunnel");
                        p.getPackets().setMinimapStatus(0);
                        Barrows.removeBrotherFromGame(p);
                    }
                }
                if (Location.atGodwars(p.getLocation()))
                {
                    if (p.getTemporaryAttribute("atGodwars") == null)
                    {
                        p.getPackets().sendOverlay(601);
                        p.setTemporaryAttribute("atGodwars", true);
                    }
                }
                else
                {
                    if (p.getTemporaryAttribute("atGodwars") != null)
                    {
                        p.getPackets().sendRemoveOverlay();
                        p.removeTemporaryAttribute("atGodwars");
                    }
                }
                if (Location.atAgilityArena(p.getLocation()))
                {
                    if (p.getTemporaryAttribute("atAgilityArena") == null)
                    {
                        p.getPackets().sendOverlay(5);
                        AgilityArena.updatePillarForPlayer(p);
                        p.setTemporaryAttribute("atAgilityArena", true);
                    }
                    if (p.getLocation().getZ() == 0)
                    {
                        p.removeTemporaryAttribute("atAgilityArena");
                        p.getPackets().sendRemoveOverlay();
                        p.setAgilityArenaStatus(0);
                        p.setTaggedLastAgilityPillar(false);
                    }
                }
                else
                {
                    if (p.getTemporaryAttribute("atAgilityArena") != null)
                    {
                        p.getPackets().sendRemoveOverlay();
                        p.setAgilityArenaStatus(0);
                        p.setTaggedLastAgilityPillar(false);
                        p.removeTemporaryAttribute("atAgilityArena");
                    }
                }
                /*
                 * We check the cantDoAnything variable to determine whether they're using the orb.
                 */
                if (Location.inFightPitsWaitingArea(p.getLocation()))
                {
                    if (p.getTemporaryAttribute("waitingForFightPits") == null)
                    {
                        Server.getMinigames().getFightPits().addWaitingPlayer(p);
                        p.setTemporaryAttribute("waitingForFightPits", true);
                    }
                }
                else
                {
                    if (p.getTemporaryAttribute("waitingForFightPits") != null && p.getTemporaryAttribute("cantDoAnything") == null)
                    {
                        Server.getMinigames().getFightPits().removeWaitingPlayer(p);
                        p.removeTemporaryAttribute("waitingForFightPits");
                    }
                }
                if (Location.inFightPits(p.getLocation()))
                {
                    if (p.getTemporaryAttribute("cantDoAnything") == null)
                    {
                        if (p.getTemporaryAttribute("inFightPits") == null)
                        {
                            p.getPackets().sendPlayerOption("Attack", 1, 1);
                            Server.getMinigames().getFightPits().displayFightPitsInterface(p);
                            p.setTemporaryAttribute("inFightPits", true);
                        }
                    }
                }
                else
                {
                    if (p.getTemporaryAttribute("inFightPits") != null)
                    {
                        p.getPackets().sendPlayerOption("null", 1, 1);
                        p.getPackets().sendRemoveOverlay();
                        p.removeTemporaryAttribute("inFightPits");
                    }
                }
                if (Location.onWaterbirthIsle(p.getLocation()))
                {
                    if (p.getTemporaryAttribute("snowInterface") == null)
                    {
                        p.getPackets().sendOverlay(370);
                        p.setTemporaryAttribute("snowInterface", true);
                    }
                }
                else
                {
                    if (p.getTemporaryAttribute("snowInterface") != null)
                    {
                        p.getPackets().sendRemoveOverlay();
                        p.removeTemporaryAttribute("snowInterface");
                    }
                }
            }
        }
 public static void teleport(Player p, LoadedLaddersAndStairs.HeightObject obj)
 {
     p.getWalkingQueue().resetWalkingQueue();
     p.setTemporaryAttribute("unmovable", true);
     p.setFaceLocation(obj.getLocation());
     if (obj.getAnimation() != -1)
     {
         p.setLastAnimation(new Animation(obj.getAnimation()));
     }
     Event teleportEvent = new Event(obj.getAnimation() != -1 ? obj.getTeleDelay() : 500);
     teleportEvent.setAction(() =>
     {
         teleportEvent.stop();
         p.teleport(obj.getTeleLocation());
         p.removeTemporaryAttribute("unmovable");
     });
     Server.registerEvent(teleportEvent);
 }
        /**
         * Handles a player emote: does the appropriate animation.
         * @param player
         * @param buttonId
         * @return
         */
        public static bool emote(Player player, int buttonId)
        {
            if (buttonId == 2)
            {
                player.setLastAnimation(new Animation(855, 0));
            }
            else if (buttonId == 3)
            {
                player.setLastAnimation(new Animation(856, 0));
            }
            else if (buttonId == 4)
            {
                player.setLastAnimation(new Animation(858, 0));
            }
            else if (buttonId == 5)
            {
                player.setLastAnimation(new Animation(859, 0));
            }
            else if (buttonId == 6)
            {
                player.setLastAnimation(new Animation(857, 0));
            }
            else if (buttonId == 7)
            {
                player.setLastAnimation(new Animation(863, 0));
            }
            else if (buttonId == 8)
            {
                player.setLastAnimation(new Animation(2113, 0));
            }
            else if (buttonId == 9)
            {
                player.setLastAnimation(new Animation(862, 0));
            }
            else if (buttonId == 10)
            {
                player.setLastAnimation(new Animation(864, 0));
            }
            else if (buttonId == 11)
            {
                player.setLastAnimation(new Animation(861, 0));
            }
            else if (buttonId == 12)
            {
                player.setLastAnimation(new Animation(2109, 0));
            }
            else if (buttonId == 13)
            {
                player.setLastAnimation(new Animation(2111, 0));
            }
            else if (buttonId == 14)
            {
                player.setLastAnimation(new Animation(866, 0));
            }
            else if (buttonId == 15)
            {
                player.setLastAnimation(new Animation(2106, 0));
            }
            else if (buttonId == 16)
            {
                player.setLastAnimation(new Animation(2107, 0));
            }
            else if (buttonId == 17)
            {
                player.setLastAnimation(new Animation(2108, 0));
            }
            else if (buttonId == 18)
            {
                player.setLastAnimation(new Animation(860, 0));
            }
            else if (buttonId == 19)
            {
                player.setLastAnimation(new Animation(0x558, 0));
                player.setLastGraphics(new Graphics(574, 0));
            }
            else if (buttonId == 20)
            {
                player.setLastAnimation(new Animation(2105, 0));
            }
            else if (buttonId == 21)
            {
                player.setLastAnimation(new Animation(2110, 0));
            }
            else if (buttonId == 22)
            {
                player.setLastAnimation(new Animation(865, 0));
            }
            else if (buttonId == 23)
            {
                player.setLastAnimation(new Animation(2112, 0));
            }
            else if (buttonId == 24)
            {
                player.setLastAnimation(new Animation(0x84F, 0));
            }
            else if (buttonId == 25)
            {
                player.setLastAnimation(new Animation(0x850, 0));
            }
            else if (buttonId == 26)
            {
                player.setLastAnimation(new Animation(1131, 0));
            }
            else if (buttonId == 27)
            {
                player.setLastAnimation(new Animation(1130, 0));
            }
            else if (buttonId == 28)
            {
                player.setLastAnimation(new Animation(1129, 0));
            }
            else if (buttonId == 29)
            {
                player.setLastAnimation(new Animation(1128, 0));
            }
            else if (buttonId == 30)
            {
                player.setLastAnimation(new Animation(4275, 0));
            }
            else if (buttonId == 31)
            {
                player.setLastAnimation(new Animation(1745, 0));
            }
            else if (buttonId == 32)
            {
                player.setLastAnimation(new Animation(4280, 0));
            }
            else if (buttonId == 33)
            {
                player.setLastAnimation(new Animation(4276, 0));
            }
            else if (buttonId == 34)
            {
                player.setLastAnimation(new Animation(3544, 0));
            }
            else if (buttonId == 35)
            {
                player.setLastAnimation(new Animation(3543, 0));
            }
            else if (buttonId == 36)
            {
                player.setLastAnimation(new Animation(7272, 0));
                player.setLastGraphics(new Graphics(1244, 0));
            }
            else if (buttonId == 37)
            {
                player.setLastAnimation(new Animation(2836, 0));
            }
            else if (buttonId == 38)
            {
                player.setLastAnimation(new Animation(6111, 0));
            }
            else if (buttonId == 39)
            {
                Skillcape.emote(player);
            }
            else if (buttonId == 40)
            {
                player.setLastAnimation(new Animation(7531, 0));
            }
            else if (buttonId == 41)
            {
                player.setLastAnimation(new Animation(2414, 0));
                player.setLastGraphics(new Graphics(1537, 0));
            }
            else if (buttonId == 42)
            {
                player.setLastAnimation(new Animation(8770, 0));
                player.setLastGraphics(new Graphics(1553, 0));
            }
            else if (buttonId == 43) // Explore
            {
                player.setLastAnimation(new Animation(9990, 0));
                player.setLastGraphics(new Graphics(1734, 0));
            } 
            else if (buttonId == 44) { // Trick
                player.setLastAnimation(new Animation(10530, 0));
                player.setLastGraphics(new Graphics(1864, 0));
            }
            else if (buttonId == 45) { // Freeze
                player.setLastAnimation(new Animation(11044, 0));
                player.setLastGraphics(new Graphics(1973, 0));
            }
            else if (buttonId == 46)
            {
                //TODO: lol todo.. umm ya.. unmovable remover is here so.. 
                //it can be used to cheat to remove unmovable spells haha.
                //to fix: make another unmovable check so there would be 2 ways to become unmovable.

                //trigger the turkey emote event which changes animation/graphic based on delay.
                if (player.getTemporaryAttribute("turkeyEmoteInProgress") == null) {
                    player.setTemporaryAttribute("turkeyEmoteStage", 11);
                    player.setTemporaryAttribute("turkeyEmoteInProgress", 1);
                } else {
                    //Force cancellation of the turkeyEmote Event.
                    player.setTemporaryAttribute("turkeyEmoteStage", -1);
                    //Don't create a new event until the old one is stopped.
                    return false;
                }

                Event turkeyEmoteEvent = new Event(500); //500 milliseconds per stage timer (adjust this for better results).
                turkeyEmoteEvent.setAction(() =>
                {
                    int turkeyEmoteStage = (int)(player.getTemporaryAttribute("turkeyEmoteStage") == null ? -1 : (int)player.getTemporaryAttribute("turkeyEmoteStage"));

                    if (turkeyEmoteStage <= 0)
                    {
                        //kill off this event.
                        turkeyEmoteEvent.stop();
                        player.removeTemporaryAttribute("unmovable");
                        player.setTemporaryAttribute("turkeyEmoteInProgress", null);
                        return;
                    }

                    if (turkeyEmoteStage == 11) {
                        player.setLastAnimation(new Animation(10994, 0));
                    } else if (turkeyEmoteStage == 10) {
                        player.setLastGraphics(new Graphics(1714, 0));
                    } else if (turkeyEmoteStage == 9) {
                        player.setLastAnimation(new Animation(10996, 0));
                        player.setTemporaryAttribute("unmovable", true);
                        player.getAppearance().setNpcId(8499);
                        player.getUpdateFlags().setAppearanceUpdateRequired(true);
                    } else if (turkeyEmoteStage == 1) {
                        player.setLastAnimation(new Animation(10995, 0));
                        player.setLastGraphics(new Graphics(1714, 0));
                        player.getAppearance().setNpcId(-1);
                        player.getUpdateFlags().setAppearanceUpdateRequired(true);
                        player.removeTemporaryAttribute("unmovable");
                        player.removeTemporaryAttribute("turkeyEmoteStage");
                    }
                    if (turkeyEmoteStage > 0) {
                        turkeyEmoteStage--;
                        player.setTemporaryAttribute("turkeyEmoteStage", turkeyEmoteStage);
                    }
                });
                Server.registerEvent(turkeyEmoteEvent);
            }
            else
            {
                return false;
            }
            return true;
        }
	    private static void drinkPotion(Player p, int i, int j, int slot) {
		    //TODO antipoisons/antifire
		    int lastPotion = -1;
		    int delay = 500;
		    long lastDrink = 0;
		    if (p.isDead() || p.getTemporaryAttribute("willDie") != null) {
			    return;
		    }
		    if (p.getDuel() != null) {
			    if (p.getDuel().ruleEnabled(DuelSession.RULE.NO_DRINKS))  {
				    p.getPackets().sendMessage("Drinks have been disabled for this duel!");
				    return;
			    }
		    }
		    if (p.getTemporaryAttribute("lastDrankPotion") != null) {
			    lastPotion = (int) p.getTemporaryAttribute("lastDrankPotion");
		    }
		    if (p.getTemporaryAttribute("drinkPotionTimer") != null) {
			    lastDrink = (int) p.getTemporaryAttribute("drinkPotionTimer");
		    }
		    int time = (j == lastPotion) ? 1000 : 500;
		    if (Environment.TickCount - lastDrink < time) {
			    return;
		    }
		    p.getPackets().closeInterfaces();
		    p.setTemporaryAttribute("drinkPotionTimer", Environment.TickCount);
		    p.setTemporaryAttribute("lastDrankPotion", j);
		    p.setTarget(null);
		    p.resetCombatTurns();
		    p.setEntityFocus(65535);
		    p.removeTemporaryAttribute("autoCasting");

            Event drinkPotionEvent = new Event(delay);
            drinkPotionEvent.setAction(() => {		
				drinkPotionEvent.stop();
				if (p.isDead() || p.getSkills().getCurLevel(Skills.SKILL.HITPOINTS) <= 0) {
					return;
				}
                int item = i != 0 && POTIONS[i - 1][j] != -1 ? POTIONS[i - 1][j] : 229;
				if (!p.getInventory().replaceItemSlot(POTIONS[i][j],  item, slot)) {
					return;
				}
                string drinkPotion = ItemData.forId(POTIONS[0][j]).getName().Replace("(", "").Replace(")", "").Replace("3", "").Replace("2", "").Replace("1", "").ToLower();
                p.getPackets().sendMessage("You drink some of your " + drinkPotion + ".");
                p.getPackets().sendMessage("You have " + (i == 0 ? "no" : i.ToString()) + " doses of potion left.");
				switch(j) {
					case 0: //Attack potion [+3 and 10% of max attack]
						statBoost(p, Skills.SKILL.ATTACK, 0.10, 3, false); 
                        break;
					case 1: //Antipoison potion
						p.setPoisonAmount(0);
						break;
						
					case 2: //Strength potion [+3 and 10% of max strength]
						statBoost(p, Skills.SKILL.STRENGTH, 0.10, 3, false);
						break;
						
					case 3: //Restore potion [restores randomly between 10-39 points]
                        restorePotion(p, Skills.SKILL.DEFENCE, 10, 39);
                        restorePotion(p, Skills.SKILL.ATTACK, 10, 39);
                        restorePotion(p, Skills.SKILL.STRENGTH, 10, 39);
                        restorePotion(p, Skills.SKILL.RANGE, 10, 39);
                        restorePotion(p, Skills.SKILL.HITPOINTS, 10, 39);
						break;
						
					case 4: //Energy potion [restores 20% energy]
                        double newEnergy = p.getRunEnergy() * 0.20;
                        p.setRunEnergy(((p.getRunEnergy() + (int)newEnergy >= 100) ? 100 : (p.getRunEnergy() + (int)newEnergy)));
						break;
						
					case 5: //Defence potion [Should be +3 and 10% of max defence]
                        statBoost(p, Skills.SKILL.DEFENCE, 0.10, 3, false);
						break;
						
					case 6: //Agility potion [restores 2 or 3 agility points]
                        int newAgility = misc.random(2, 3) + p.getSkills().getCurLevel(Skills.SKILL.AGILITY);
                        if (newAgility < p.getSkills().getMaxLevel(Skills.SKILL.AGILITY))
                            p.getSkills().setCurLevel(Skills.SKILL.AGILITY, newAgility);
						break;
						
					case 7: //Combat potion [Should be 10% of attack+strength and +3 to each].
                        statBoost(p, Skills.SKILL.ATTACK, 0.10, 3, false);
                        statBoost(p, Skills.SKILL.STRENGTH, 0.10, 3, false);
						break;
						
					case 8: //Prayer potion, [heals 7-31, formula = 7+floor(prayerlevel/4)]
                        int newPrayer = 7 + (int)Math.Floor((double)(p.getSkills().getMaxLevel(Skills.SKILL.PRAYER) / 4)) + p.getSkills().getCurLevel(Skills.SKILL.PRAYER);
                        if (newPrayer < p.getSkills().getCurLevel(Skills.SKILL.PRAYER))
                            p.getSkills().setCurLevel(Skills.SKILL.PRAYER, newPrayer);
                        checkOverdose(p, Skills.SKILL.PRAYER);
						break;
						
					case 9: //Summoning potion [25% of players summoning + 7]
                        int newSummoning = (7 + (int)((double)p.getSkills().getMaxLevel(Skills.SKILL.SUMMONING) * 0.25)) + p.getSkills().getCurLevel(Skills.SKILL.SUMMONING);
                        if (newSummoning < p.getSkills().getCurLevel(Skills.SKILL.SUMMONING))
                            p.getSkills().setCurLevel(Skills.SKILL.SUMMONING, newSummoning);

                        statBoost(p, Skills.SKILL.STRENGTH, 0.10, 3, false);
						break;
						
					case 10: //Super attack potion [15% of players attack + 5]
                        statBoost(p, Skills.SKILL.ATTACK, 0.15, 5, false);
						break;
						
					case 11: // super antipoison
						p.setPoisonAmount(0);
						p.setSuperAntipoisonCycles(20);
						break;
						
					case 12: //Fishing potion [fishing +3]
                        if (p.getSkills().getCurLevel(Skills.SKILL.FISHING) < (p.getSkills().getMaxLevel(Skills.SKILL.FISHING) + 3))
                            p.getSkills().setCurLevel(Skills.SKILL.FISHING, p.getSkills().getCurLevel(Skills.SKILL.FISHING) + 3);
						break;
						
					case 13:
						p.setRunEnergy(p.getRunEnergy() + 20);
						if (p.getRunEnergy() >= 100) {
							p.setRunEnergy(100);
						}
						break;
						
					case 14: //Hunter potion [hunting + 3]
                        if (p.getSkills().getCurLevel(Skills.SKILL.HUNTER) < (p.getSkills().getMaxLevel(Skills.SKILL.HUNTER) + 3))
                            p.getSkills().setCurLevel(Skills.SKILL.HUNTER, p.getSkills().getCurLevel(Skills.SKILL.HUNTER) + 3);
						break;
						
					case 15: //Super strength [strength 15% +5]
						statBoost(p, Skills.SKILL.STRENGTH, 0.15, 5, false);
						break;
						
					case 16: //restores all skills by 33%.
                        foreach (Skills.SKILL skill in Enum.GetValues(typeof(Skills.SKILL)))
                            superRestorePotion(p, skill, 0.33);
						break;

                    case 17://Super defence [defence 15% +5]
						statBoost(p, Skills.SKILL.DEFENCE, 0.15, 5, false);
						break;
						
					case 18: // Antifire potion
						p.setAntifireCycles(20);
						break;

                    case 19: //Ranging potions
						statBoost(p, Skills.SKILL.RANGE, 0.10, 4, false);
						break;
						
					case 20: //Magic potion.
                        if (p.getSkills().getCurLevel(Skills.SKILL.MAGIC) < (p.getSkills().getMaxLevel(Skills.SKILL.MAGIC) + 4))
                            p.getSkills().setCurLevel(Skills.SKILL.MAGIC, p.getSkills().getCurLevel(Skills.SKILL.MAGIC) + 4);
						break;
						
					case 21: //Zamorak brew potion. [Attack %20+2][Strength %12 +2][Defense -10% + -2][hitpoints -10% + 20]
                        statBoost(p, Skills.SKILL.ATTACK, 0.20, 2, false);
                        statBoost(p, Skills.SKILL.STRENGTH, 0.12, 2, false);
                        statBoost(p, Skills.SKILL.DEFENCE, 0.10, 2, true);
                        statBoost(p, Skills.SKILL.HITPOINTS, 0.10, 20, true);
						break;

                    case 22: //Saradomin brew potion. [Hitpoints +%15][Defense +25%][Strength, Attack, Magic and Ranged -10%]
                        statBoost(p, Skills.SKILL.HITPOINTS, 0.15, 0, false);
                        statBoost(p, Skills.SKILL.DEFENCE, 0.25, 0, false);
                        statBoost(p, Skills.SKILL.STRENGTH, 0.10, 0, true);
                        statBoost(p, Skills.SKILL.ATTACK, 0.10, 0, true);
                        statBoost(p, Skills.SKILL.MAGIC, 0.10, 0, true);
                        statBoost(p, Skills.SKILL.RANGE, 0.10, 0, true);
						break;
				}
				p.setLastAnimation(new Animation(829));
				p.getPackets().sendSkillLevels();
		    });
            Server.registerEvent(drinkPotionEvent);
	    }		
	    public void useOrb(Player p, int button) {
		    if (p.getTemporaryAttribute("teleporting") != null) {
			    return;
		    }
		    if (button == -1) {
                AreaEvent useOrbAreaEvent = new AreaEvent(p, 2398, 5171, 2400, 5173);
                useOrbAreaEvent.setAction(() => {
					p.getPackets().displayInventoryInterface(374);
					p.getAppearance().setInvisible(true);
					p.getUpdateFlags().setAppearanceUpdateRequired(true);
					p.setTemporaryAttribute("cantDoAnything", true);
					p.setTemporaryAttribute("unmovable", true);
					p.getPackets().setMinimapStatus(2);
                    Event useOrbEvent = new Event(500);
                    useOrbEvent.setAction(() => {
						useOrbEvent.stop();
						int random = misc.random(4);
						p.teleport(new Location(ORB_COORDINATES[1][random], ORB_COORDINATES[2][random], 0));
					});
                    Server.registerEvent(useOrbEvent);
			    });
                Server.registerCoordinateEvent(useOrbAreaEvent);
		    } else {
			    if (p.getTemporaryAttribute("cantDoAnything") != null) {
				    if (button == 5) {
                        Event useOrbTwoEvent = new Event(500);
                        useOrbTwoEvent.setAction(() => {
							useOrbTwoEvent.stop();
							p.getAppearance().setInvisible(false);
							p.getUpdateFlags().setAppearanceUpdateRequired(true);
							p.removeTemporaryAttribute("cantDoAnything");
							p.removeTemporaryAttribute("unmovable");
							teleportToWaitingRoom(p, false);
							p.getPackets().closeInterfaces();
							p.getPackets().setMinimapStatus(0);
							p.getPackets().clearMapFlag();
					    });
                        Server.registerEvent(useOrbTwoEvent);
					    return;
				    }
				    for (int i = 0; i < ORB_COORDINATES[0].Length; i++) {
					    if (button == ORB_COORDINATES[0][i]) {
						    int j = i;
						    p.setTemporaryAttribute("teleporting", true);
                            Event teleportToOrbEvent = new Event(500);
                            teleportToOrbEvent.setAction(() => {
								teleportToOrbEvent.stop();
								p.teleport(new Location(ORB_COORDINATES[1][j], ORB_COORDINATES[2][j], 0));
								Teleport.resetTeleport(p);
						    });
                            Server.registerEvent(teleportToOrbEvent);
						    return;
					    }
				    }
			    }
		    }
	    }
	    private void handleEnterText(Player player, Packet packet) {
		    if (player.getTemporaryAttribute("interfaceVariable") == null) {
			    player.getPackets().sendMessage("An error occured, please try again.");
			    return;
		    }
		    long textAsLong = packet.readLong();
		    EnterVariable var = (EnterVariable) player.getTemporaryAttribute("interfaceVariable");
		    switch(var.getInterfaceId()) {
			    case 590: // Clan chat setup
				    Clan clan = Server.getClanManager().getClanByOwner(player.getLoginDetails().getUsername());
				    if (clan != null) {
					    clan.setClanName(misc.longToPlayerName(textAsLong));
					    Server.getClanManager().updateClan(clan);
					    player.getPackets().modifyText(misc.formatPlayerNameForDisplay(clan.getClanName()), 590, 22);
					    break;
				    }
				    player.getPackets().sendMessage("Please set up a clan channel before trying to change the name.");
				    break;
		    }
		    player.removeTemporaryAttribute("interfaceVariable");
	    }
	    public void useDoor(Player p, int doorId) {
		    bool running =  p.getWalkingQueue().isRunToggled();
		    if (doorId == 9369) { // main entrance
			    int y = p.getLocation().getY() >= 5177 ? 5177 : 5175;
                CoordinateEvent mainEntranceCoordinateEvent = new CoordinateEvent(p, new Location(2399, y, 0));
                mainEntranceCoordinateEvent.setAction(() => {
					p.getWalkingQueue().setRunToggled(false);
                    p.getWalkingQueue().resetWalkingQueue();
					p.getPackets().clearMapFlag();
					p.setTemporaryAttribute("unmovable", true);
					p.getWalkingQueue().forceWalk(0, y == 5177 ? -2 : +2);
                    Event useMainDoorEvent = new Event(1000);
                    useMainDoorEvent.setAction(() => {
                        useMainDoorEvent.stop();
						p.removeTemporaryAttribute("unmovable");
						p.getWalkingQueue().setRunToggled(running);
					});
                    Server.registerEvent(useMainDoorEvent);
			    });
                Server.registerCoordinateEvent(mainEntranceCoordinateEvent);
            }
            else if (doorId == 9368)
            { // game door
                int y = p.getLocation().getY() >= 5169 ? 5169 : 5167;
                CoordinateEvent gameDoorCoordinateEvent = new CoordinateEvent(p, new Location(2399, y, 0));
                gameDoorCoordinateEvent.setAction(() =>
                {
                    if (playersPlaying.Count == 1)
                    {
                        sendNPCMessage(p, "Here is some TokKul, as a reward.");
                        p.getInventory().addItemOrGround(6529, tokkulReward);
                    }
                    removePlayingPlayer(p);
                    p.getWalkingQueue().setRunToggled(false);
                    p.getWalkingQueue().resetWalkingQueue();
                    p.getPackets().clearMapFlag();
                    if (y == 5167)
                    {
                        p.getWalkingQueue().forceWalk(0, +2);
                    }
                    else
                    {
                        p.getPackets().sendMessage("You are unable to bypass the hot barrier.");
                        return;
                    }
                    p.setTemporaryAttribute("unmovable", true);
                    Event gameDoorEvent = new Event(1000);
                    gameDoorEvent.setAction(() =>
                    {
                        gameDoorEvent.stop();
                        p.removeTemporaryAttribute("unmovable");
                        p.getWalkingQueue().setRunToggled(running);
                        p.getPackets().sendMessage("You leave the fight pit.");
                        resetVariables(p);
                    });
                    Server.registerEvent(gameDoorEvent);
                });
                Server.registerCoordinateEvent(gameDoorCoordinateEvent);
            }
	    }
	    private void handleEnterAmount(Player player, Packet packet) {
		    if (player.getTemporaryAttribute("interfaceVariable") == null) {
			    player.getPackets().sendMessage("An error occured, please try again.");
			    return;
		    }
		    EnterVariable var = (EnterVariable) player.getTemporaryAttribute("interfaceVariable");
		    int craftType = (int) (player.getTemporaryAttribute("craftType") == null ? -1 : (int) player.getTemporaryAttribute("craftType")); // 'Category' of item to craft
		    int amount = packet.readInt();
		    switch(var.getInterfaceId()) {
			    case 675: // Jewellery crafting
				    Jewellery.makeJewellery(player, var.getSlot(), amount, true);
				    break;
				
			    case 304: // Dragonhide crafting.
				    int leatherType = (int) (player.getTemporaryAttribute("leatherCraft") == null ? -1 : (int) player.getTemporaryAttribute("leatherCraft")); // Type of leather to craft.
				    switch (var.getSlot()) {
					    case 0:
						    if (leatherType != -1) {
							    Leather.craftDragonHide(player, 1, 0, leatherType, true); // Body
							    break;
						    } else if (craftType == 6) { // Ball of wool
							    Spinning.craftSpinning(player, amount, 0, true);
							    break;
						    }
						    break;
						
					    case 1:
						    if (craftType == 6) { // Bowstring
							    Spinning.craftSpinning(player, amount, 1, true);
							    break;
						    }
						    break;
						
					    case 2:
						     if (craftType == 6) { // Crossbow string
							    Spinning.craftSpinning(player, amount, 2, true);
							    break;
						    }
						     break;
						
					    case 4:
						    Leather.craftDragonHide(player, 1, 4, leatherType, true); // Vambraces
						    break;
						
					    case 8:
						    Leather.craftDragonHide(player, 1, 8, leatherType, true); // Chaps
						    break;
				    }
				    break;
				
			    case 303:
				    switch(var.getSlot()) {
					    case 120: // Unholy symbol
						    Silver.newSilverItem(player, amount, var.getSlot(), true);
						    break;
						
					    case 121: // Tiara
						    Silver.newSilverItem(player, amount, var.getSlot(), true);
						    break;
				    }
				    break;
				
			    case 154: // Craft normal leather.
				    if (var.getSlot() >= 28 && var.getSlot() <= 34) {
					    Leather.craftNormalLeather(player, var.getSlot(), amount, true);
					    break;
				    }
				    break;
			
			    case 542: // Glassblowing.
				    switch(var.getSlot()) {
					    case 40: // Make X beer glass.
						    Glass.craftGlass(player, amount, 0, true);
						    break;
						
					    case 41: // Make X candle lantern.
						    Glass.craftGlass(player, amount, 1, true);
						    break;
						
					    case 42: // Make X oil lamp.
						    Glass.craftGlass(player, amount, 2, true);
						    break;
						
					    case 38: // Make X vial.
						    Glass.craftGlass(player, amount, 3, true);
						    break;
						
					    case 44: // Make X Fishbowl
						    Glass.craftGlass(player, amount, 4, true);
						    break;
						
					    case 39: // Make X orb.
						    Glass.craftGlass(player, amount, 5, true);
						    break;
						
					    case 43: // Make X lantern lens
						    Glass.craftGlass(player, amount, 6, true);
						    break;
						
					    case 45: // Make X dorgeshuun light orb.
						    Glass.craftGlass(player, amount, 7, true);
						    break;
				    }
				    break;
			
			    case 763: // Bank inventory - X.
				    player.getBank().setLastXAmount(amount);
				    player.getBank().deposit(var.getSlot(), amount);
				    player.getBank().refreshBank();
				    break;
				
			    case 762: // Bank - X.
				    player.getBank().setLastXAmount(amount);
				    player.getBank().withdraw(var.getSlot(), amount);
				    player.getBank().refreshBank();
				    break;
				
 			    case 336: // Trade/stake inventory - trade X.
 				    if (player.getTrade() != null) {
	 				    player.getTrade().tradeItem(var.getSlot(), amount);
	 				    break;
				    }
 				    if (player.getDuel() != null) {
 					    player.getDuel().stakeItem(var.getSlot(), amount);
 					    break;
 				    }
 				    break;
 				
 			    case 631:
 				    if (player.getDuel() != null) {
 					    player.getDuel().removeItem(var.getSlot(), amount);
 					    break;
 				    }
 				    break; 
 				
 			    case 335: // Trade/stake interface - remove X.
 				    player.getTrade().removeItem(var.getSlot(), amount);
 				    break;
 				
			    case 620: // Shop - buy X.
 				    player.getShopSession().buyItem(var.getSlot(), amount);
 				    break;

                case 105: //Grand Exchange custom quantity and price inputs.
                    switch(var.getSlot()) {
                        case 0: //custom enter quantity
                            player.getGESession().setCustomAmount(amount);
                            break;
                        case 1: //custom enter per price
                            player.getGESession().setCustomPrice(amount);
                            break;
                    }
                    break;

			    case 305: // What would you like to make? - 4 options
				    if (player.getTemporaryAttribute("fletchType") == null) {
					    return;
				    }
				    int logType = (int) player.getTemporaryAttribute("fletchType");
				    switch(var.getSlot()) {
					    case 0:
						    MakeBows.cutLog(player, amount, logType, 0, (player.getTemporaryAttribute("stringingBow") == null ? false : (bool)player.getTemporaryAttribute("stringingBow")), true);
						    break;
						
					    case 1:
						    MakeBows.cutLog(player, amount, logType, 1, (player.getTemporaryAttribute("stringingBow") == null ? false : (bool)player.getTemporaryAttribute("stringingBow")), true);
						    break;
						
					    case 2:
						    MakeBows.cutLog(player, amount, 0, 2, false, true);
						    break;
						
					    case 3:
						    MakeBows.cutLog(player, amount, 0, 3, false, true);
						    break;
				    }
				    break;
				
			    case 306: // What would you like to make? - 5 options
				    switch(var.getSlot()) {
					    case 0:
						    Clay.craftClay(player, amount, craftType, var.getSlot(), true);
						    break;
						
					    case 1:
						    Clay.craftClay(player, amount, craftType, var.getSlot(), true);
						    break;
						
					    case 2:
						    Clay.craftClay(player, amount, craftType, var.getSlot(), true);
						    break;
						
					    case 3:
						    Clay.craftClay(player, amount, craftType, var.getSlot(), true);
						    break;
						
					    case 4:
						    Clay.craftClay(player, amount, craftType, var.getSlot(), true);
						    break;
				    }
				    break;
				
			    case 309: // What would you like to make - 1 option
				    if (var.getSlot() >= 50 && var.getSlot() <= 60) { // Cut gem
					    Jewellery.cutGem(player, craftType, amount, true);
					    break;
				    } else if (var.getSlot() >= 100 && var.getSlot() <= 110) { // String amulet
					    Jewellery.stringAmulet(player, craftType, amount, true);
					    break;
				    }
				    switch(var.getSlot()) {
					    case 0:
						    MakeXbow.createXbow(player, amount, (int) (player.getTemporaryAttribute("bowType2") == null ? -1 : (int) player.getTemporaryAttribute("bowType2")), (bool) (player.getTemporaryAttribute("stringingBow") == null ? false :(bool) player.getTemporaryAttribute("stringingBow")), true);
						    break;
						
					    case 1:
						    MakeBows.cutLog(player, amount, (int) (player.getTemporaryAttribute("fletchType") == null ? -1 : (int) player.getTemporaryAttribute("fletchType")), (int) (player.getTemporaryAttribute("bowType") == null ? -1 : (int) player.getTemporaryAttribute("bowType")), true, true);
						    break;
						
					    case 2:
						    Herblore.grindIngredient(player, amount, true);
						    break;
						
					    case 3:
						    Herblore.makeUnfinishedPotion(player, amount, true);
						    break;
						
					    case 4:
						    Herblore.completePotion(player, amount, true);
						    break;
						
					    case 5:
						    Cooking.cookItem(player, amount, true, player.getTemporaryAttribute("cookingFireLocation") != null);
						    break;
						
					    case 6:
						    MakeAmmo.makeBoltTip(player, (int) (player.getTemporaryAttribute("boltTips") == null ? -1 : (int) player.getTemporaryAttribute("boltTips")), amount, true);
						    break;
				    }
				    break;
				
			    case 311: // Smelting interface
				    switch(var.getSlot()) {
					    case 13: // Bronze
						    Smelting.smeltOre(player, var.getSlot(), true, amount);
						    break;
						
					    case 17: // Blurite
						    Smelting.smeltOre(player, var.getSlot(), true, amount);
						    break;
						
					    case 21: // Iron
						    Smelting.smeltOre(player, var.getSlot(), true, amount);
						    break;
						
					    case 25: // Silver
						    Smelting.smeltOre(player, var.getSlot(), true, amount);
						    break;
						
					    case 29: // Steel
						    Smelting.smeltOre(player, var.getSlot(), true, amount);
						    break;
						
					    case 33: // Gold
						    Smelting.smeltOre(player, var.getSlot(), true, amount);
						    break;
						
					    case 37: // Mithril
						    Smelting.smeltOre(player, var.getSlot(), true, amount);
						    break;
						
					    case 41: // Adamant
						    Smelting.smeltOre(player, var.getSlot(), true, amount);
						    break;
						
					    case 45: // Rune
						    Smelting.smeltOre(player, var.getSlot(), true, amount);
						    break;
				    }
				    break;
				
			    case 300: // Smithing interface.
				    if (player.getTemporaryAttribute("smithingItem") == null) {
					    return;
				    }
				    SmithBar item = (SmithBar) player.getTemporaryAttribute("smithingItem");
				    if (item != null) {
					    item.setAmount(amount);
				    }
				    Smithing.smithItem(player, var.getSlot(), amount, false);
				    break;
			    }
			    player.removeTemporaryAttribute("interfaceVariable");
	    }
	    public static void crossDitch(Player p, int x, int y) {
		    if (p.getTemporaryAttribute("unmovable") != null) {
			    return;
		    }
                AreaEvent crossDitchAreaEvent = new AreaEvent(p, x, y - 1, x, y + 2);
                crossDitchAreaEvent.setAction(() => {
				    p.getPackets().closeInterfaces();
				    p.getWalkingQueue().resetWalkingQueue();
				    p.setTemporaryAttribute("unmovable", true);
				    int newY = p.getLocation().getY() >= 3523 ? p.getLocation().getY()-3 : p.getLocation().getY()+3;
				    int dir = newY == 3 ? 0 : 4;
				    Location faceLocation = new Location(p.getLocation().getX(), dir == 3 ? 3523 : 3520, 0);
				    p.setFaceLocation(faceLocation);
                    Event crossDitchMoveEvent = new Event(500);
                    crossDitchMoveEvent.setAction(() => {
					    crossDitchMoveEvent.stop();
					    p.setLastAnimation(new Animation(6132));
					    int regionX = p.getUpdateFlags().getLastRegion().getRegionX();
					    int regionY = p.getUpdateFlags().getLastRegion().getRegionY();
					    int lX = (p.getLocation().getX() - ((regionX - 6) * 8));
					    int lY = (p.getLocation().getY() - ((regionY - 6) * 8));
					    ForceMovement movement = new ForceMovement(lX, lY, lX, newY, 33, 60, dir);
					    p.setForceMovement(movement);		
					    p.setFaceLocation(new Location(x, y, 0));
                        Event crossDitchTeleportEvent = new Event(1250);
                        crossDitchTeleportEvent.setAction(() => {
						    crossDitchTeleportEvent.stop();
						    int playerY = p.getLocation().getY();
						    int nY = playerY >= 3523 ? 3520 : 3523;
						    p.teleport(new Location(p.getLocation().getX(), nY, 0));
						    p.removeTemporaryAttribute("unmovable");
				        });
                        Server.registerEvent(crossDitchTeleportEvent);
			    });
                Server.registerEvent(crossDitchMoveEvent);
		    });
            Server.registerCoordinateEvent(crossDitchAreaEvent);
	    }
	    public static void showAliDialogue(Player p, int status) {
		    int newStatus = -1;
		    p.getPackets().softCloseInterfaces();
		    if (p.getTemporaryAttribute("unmovable") != null) {
			    return;
		    }
		    switch(status) {
			    case 205:
				    p.getPackets().sendNPCHead(1862, 241, 2);
				    p.getPackets().modifyText("Ali Morissane", 241, 3);
				    p.getPackets().modifyText("Would you like to go back to Lletya?", 241, 4);
				    p.getPackets().animateInterface(9827, 241, 2);
				    p.getPackets().sendChatboxInterface2(241);
				    newStatus = 206;
				    break;
				
			    case 206:
				    p.getPackets().sendChatboxInterface2(228);
				    p.getPackets().modifyText("Yes please, let's go", 228, 2);
				    p.getPackets().modifyText("Not yet", 228, 3);
				    newStatus = 207;
				    break;
				
			    case 207:
				    p.getPackets().sendPlayerHead(64, 2);
				    p.getPackets().modifyText(p.getLoginDetails().getUsername(), 64, 3);
				    p.getPackets().modifyText("Yes please, let's go.", 64, 4);
				    p.getPackets().animateInterface(9827, 64, 2);
				    p.getPackets().sendChatboxInterface2(64);
				    newStatus = 208;
				    break;
				
			    case 208:
				    p.getPackets().sendNPCHead(1862, 241, 2);
				    p.getPackets().modifyText("Ali Morissane", 241, 3);
				    p.getPackets().modifyText("Very well.", 241, 4);
				    p.getPackets().animateInterface(9827, 241, 2);
				    p.getPackets().sendChatboxInterface2(241);
				    newStatus = 209;
				    break;
				
			    case 209:
				    p.setTemporaryAttribute("unmovable", true);
				    p.getPackets().displayInterface(120);
				    p.getPackets().sendMessage("Your camel trots off slowly out of the desert..");
                    Event moveBackToLletyaEvent = new Event(2000);
                    int moveBackToLletyaCounter = 0;
                    moveBackToLletyaEvent.setAction(() => {
                        if (moveBackToLletyaCounter == 0)
                        {
                            moveBackToLletyaCounter++;
                            moveBackToLletyaEvent.setTick(600);
							p.teleport(new Location(2340, 3799, 0));
						} else {
                            moveBackToLletyaEvent.stop();
							p.removeTemporaryAttribute("unmovable");
							p.getPackets().sendMessage("..You and Ali are back in Lletya.");
							p.getPackets().closeInterfaces();
						}	
				    });
                    Server.registerEvent(moveBackToLletyaEvent);
				    break;
				
			    case 210:
				    p.getPackets().sendPlayerHead(64, 2);
				    p.getPackets().modifyText(p.getLoginDetails().getUsername(), 64, 3);
				    p.getPackets().modifyText("Not yet.", 64, 4);
				    p.getPackets().animateInterface(9827, 64, 2);
				    p.getPackets().sendChatboxInterface2(64);
				    newStatus = 211;
				    break;
				
			    case 211:
				    p.getPackets().sendNPCHead(1862, 241, 2);
				    p.getPackets().modifyText("Ali Morissane", 241, 3);
				    p.getPackets().modifyText("No problem, I will be here when you decide to leave.", 241, 4);
				    p.getPackets().animateInterface(9827, 241, 2);
				    p.getPackets().sendChatboxInterface2(241);
				    break;
				
		    }
		    if (newStatus != -1) {
			    p.setTemporaryAttribute("dialogue", newStatus);
		    }
	    }