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);
	    }
        private static void thieveNpc(Player p, Npc npc, int index)
        {
            AreaEvent thieveNpcAreaEvent = new AreaEvent(p, npc.getLocation().getX()-1, npc.getLocation().getY()-1, npc.getLocation().getX()+1, npc.getLocation().getY()+1);
            thieveNpcAreaEvent.setAction(() => {
                if (!canThieveNpc(p, npc, index)) {
                    return;
                }
                p.setFaceLocation(npc.getLocation());
                p.setLastAnimation(new Animation(881));
                p.getPackets().sendMessage("You attempt to pick the " + NPC_NAMES[index] + " pocket...");
                p.setTemporaryAttribute("lastPickPocket", Environment.TickCount);

                Event thieveNpcEvent = new Event(1000);
                thieveNpcEvent.setAction(() => {
                    thieveNpcEvent.stop();
                    if (!p.getLocation().withinDistance(npc.getLocation(), 2)) {
                        return;
                    }
                    if (successfulThieve(p, index, false)) {
                        int rewardIndex = misc.random(NPC_REWARD[index].Length - 1);
                        int reward = NPC_REWARD[index][rewardIndex];
                        int rewardAmount = NPC_REWARD_AMOUNT[index][rewardIndex];
                        if (index == 7) { // Master farmer.
                            if (misc.random(15) == 0) {
                                reward = HERB_SEEDS[misc.random(HERB_SEEDS.Length - 1)];
                            }
                        }
                        p.getSkills().addXp(Skills.SKILL.THIEVING, NPC_XP[index]);
                        p.getInventory().addItem(reward, rewardAmount);
                        p.getPackets().sendMessage("You pick the " + NPC_NAMES[index] + " pocket.");
                    } else {
                        p.getWalkingQueue().resetWalkingQueue();
                        p.getPackets().sendMessage("You fail to pick the " + NPC_NAMES[index] + " pocket.");
                        p.getPackets().sendMessage("You've been stunned!");
                        npc.setForceText("What do you think you're doing?");
                        p.setTemporaryAttribute("unmovable", true);
                        p.setTemporaryAttribute("stunned", true);
                        p.setLastGraphics(new Graphics(80, 0, 100));
                        p.setLastAnimation(new Animation(p.getDefenceAnimation()));
                        p.hit(1);
                        npc.setFaceLocation(p.getLocation());
                        Event removeStunEvent = new Event(5000);
                        removeStunEvent.setAction(() => {
                            removeStunEvent.stop();
                            p.removeTemporaryAttribute("unmovable");
                            p.removeTemporaryAttribute("stunned");
                            p.setLastGraphics(new Graphics(65535));
                        });
                        Server.registerEvent(removeStunEvent);
                    }
                });
                Server.registerEvent(thieveNpcEvent);
            });
            Server.registerCoordinateEvent(thieveNpcAreaEvent);
        }
	    public static void attack(Npc npc, Entity target) {
		    if (npc.isDead() || npc.isDestroyed() || target.isDead() || target.isDestroyed() || target.isDead()) {
			    return;
		    }
		    double damage = misc.randomDouble(npc.getMaxHit());
            PrayerData.PrayerHeadIcon prayerHeadIcon = ((Player)target).getPrayers().getHeadIcon();
		    int hitDelay = npc.getHitDelay();
		    int animation = npc.getAttackAnimation();
		    bool special = false;
		    switch(npc.getId()) {
			    case 6263: // Steelwill (bandos mage)
				    hitDelay = 1000;
				    animation = 65535;
                    if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MAGIC)
					    damage = 0;

				    ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1203, 50, 40, 34, 50, target);
				    //npc.graphics(1201);
				    break;
				
			    case 6260: // Graardor (bandos)
				    randomMessage(npc, BANDOS_SHOUTS);
				    if (misc.random(3) == 0) {
					    special = true;
					    hitDelay = 1000;
					    animation = 7063;
					    ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1200, 50, 40, 34, 50, target);
                        if (prayerHeadIcon == PrayerData.PrayerHeadIcon.RANGE)
						    damage = 0;
					    else
						    damage = misc.randomDouble(35);
				    } else {
                        if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MELEE)
						    damage = 0;
				    }
				    break;
				
			    case 6265: // Grimspike (bandos range)
				    hitDelay = 1000;
				    animation = 65535;
                    if (prayerHeadIcon == PrayerData.PrayerHeadIcon.RANGE)
					    damage = 0;
				    ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1206, 50, 40, 34, 50, target);
				    //npc.graphics(1201);
				    break;
				
			    case 6247: // Zilyana (sara boss)
				    randomMessage(npc, SARADOMIN_SHOUTS);
                    //One out of 3 chance
				    if (misc.random(3) == 0) {
					    animation = 6967;
					    special = true;
                        if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MAGIC)
						    damage = 0;
				    } else {
                        if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MELEE)
						    damage = 0;
				    }
				    break;
				
			    case 6250: // Growler (sara mage)
				    hitDelay = 1000;
                    if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MAGIC)
					    damage = 0;
				    ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1227, 50, 20, 27, 50, target);			
				    break;
				
			    case 6252: // Bree (sara range)
				    hitDelay = 1000;
                    if (prayerHeadIcon == PrayerData.PrayerHeadIcon.RANGE)
					    damage = 0;
				    ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1227, 50, 20, 27, 50, target);			
				    //TODO all anims
				    break;
				
			    case 6203: // K'ril Tsutsaroth (zammy boss)
				    randomMessage(npc, ZAMORAK_SHOUTS);
                    if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MELEE)
					    damage = 0;
                    //One out of 3 chance.
				    if (misc.random(3) == 0) {
					    animation = 6947;
					    damage = misc.randomDouble(49);
                        if (prayerHeadIcon != PrayerData.PrayerHeadIcon.MELEE && damage < (49 / 2))
						    damage = (49 / 2) + misc.randomDouble(49/2);
				    }
                    //One out of 4 chance.
				    if (misc.random(4) == 0) {
					    if (!target.isPoisoned()) {
						    if (damage > 0) {
							    Server.registerEvent(new PoisonEvent(target, 16));
						    }
					    }
				    }
				    break;
				
			    case 6208: // Balfrug Kreeyath (zammy mage)
				    hitDelay = 1200;
                    if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MAGIC)
					    damage = 0;
				    ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1213, 50, 20, 27, 70, target);			
				    // TODO attack anim
				    break;
				
			    case 6206: // Zakl'n Gritch (zammy range)
				    hitDelay = 1200;
                    if (prayerHeadIcon == PrayerData.PrayerHeadIcon.RANGE)
					    damage = 0;
				    npc.setLastGraphics(new Graphics(1208));
				    ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1209, 50, 20, 27, 70, target);
				    break;
				
			    case 6222: // Kree'arra (armadyl boss)
                    //One out of 4 chance npc talking will display.
				    if (misc.random(4) == 0)
					    npc.setForceText("Kraaaaw!");
				    hitDelay = 1200;
                    //50% chance
				    if (misc.random(2) == 0 && npc.getAttacker() != null && npc.getAttacker().Equals(npc.getTarget())) {
					    special = true;
					    // Magic attack
					    damage = misc.randomDouble(21);
                        if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MAGIC)
						    damage = 0;
					    ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1198, 50, 20, 27, 70, target);
				    } else if (npc.getAttacker() != null && npc.getAttacker().Equals(npc.getTarget())){
					    //range attack
                        if (prayerHeadIcon == PrayerData.PrayerHeadIcon.RANGE)
						    damage = 0;
					    ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1197, 50, 20, 27, 70, target);
				    } else {
					    // do melee attack because they arent attacking kree arra
                        damage = misc.randomDouble(25);
                        if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MELEE)
						    damage = 0;
					    animation = 6977;
				    }
				    break;
				
			    case 6223: // Armadyl mage
				    hitDelay = 1200;
                    if (prayerHeadIcon == PrayerData.PrayerHeadIcon.MAGIC)
					    damage = 0;
				    ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1199, 50, 20, 27, 70, target);
				    break;
				
			    case 6225: // Armadyl range
				    hitDelay = 1200;
                    if (prayerHeadIcon == PrayerData.PrayerHeadIcon.RANGE)
					    damage = 0;
				    ((Player)target).getPackets().sendProjectile(npc.getLocation(), target.getLocation(), 32, 1190, 50, 20, 27, 70, target);
				    break;
		    }
		    if (animation != 65535) {
			    npc.setLastAnimation(new Animation(animation));
		    }
		    target.setLastAttacked(Environment.TickCount);
		    npc.setLastAttack(Environment.TickCount);
		    target.setAttacker(npc);
		    npc.resetCombatTurns();
		    if (damage > target.getHp()) {
			    damage = target.getHp();
		    }
		    double hit = damage;
            Event attackEvent = new Event(hitDelay);
            attackEvent.setAction(() => {
				attackEvent.stop();
				if (npc.getId() == 6263) {
					target.setLastGraphics(new Graphics(((hit > 0.10) ? 166 : 85), 0, 100));
				} else if (npc.getId() == 6260) {
					if (special) {
						target.setLastGraphics(new Graphics(((hit > 0.10) ? 160 : 65535), 0, 100));
					}
				} else if (npc.getId() == 6247) {
					if (special) {
                        if (hit < 0.10) { //No damage.
							return;
						} else {
							target.setLastGraphics(new Graphics(1207, 0, 100));
							npc.setCombatTurns(npc.getAttackSpeed() * 2);
						}
					}
				} else if (npc.getId() == 6208) {
					if (hit < 0.10) //No damage.
						target.setLastGraphics(new Graphics(85, 0, 100));
				} else if (npc.getId() == 6222) {
					if (special) {
						target.setLastGraphics(new Graphics(((hit > 0.10) ? 85 : 65535), 0, 100));
					}
				}
				if ((target.getCombatTurns() > 2 || target.getCombatTurns() < 0)) {
					target.setLastAnimation(new Animation(target.getDefenceAnimation()));
				}
				target.hit(hit);
		    });
            Server.registerEvent(attackEvent);
	    }
	    private static void randomMessage(Npc boss, string[] shouts) {
            //One out of 4 chance nothing will happen.
		    if (misc.random(4) != 0)
			    return;
            //Otherwise the boss npc will talk random message in game.
		    string message = shouts[misc.random(shouts.Length - 1)];
		    boss.setForceText(message);
	    }
 public static void teleportToEssMine(Player p, Npc n)
 {
     if (p.getTemporaryAttribute("unmovable") != null) {
         return;
     }
     p.setTemporaryAttribute("unmovable", true);
     n.setLastGraphics(new Graphics(108));
     Event teleportToEssMineEvent = new Event(600);
     teleportToEssMineEvent.setAction(() => {
         int i = 0;
         i++;
         if (i == 1) {
             p.setLastGraphics(new Graphics(110));
             n.setForceText("Senventior disthine molenko!");
         } else if (i == 2) {
             teleportToEssMineEvent.stop();
             Event doTeleportToEssMineEvent = new Event(300);
             doTeleportToEssMineEvent.setAction(() => {
                 p.teleport(getRandomMineLocation());
                 p.removeTemporaryAttribute("unmovable");
                 doTeleportToEssMineEvent.stop();
             });
         }
     });
     Server.registerEvent(teleportToEssMineEvent);
 }