Thread: [PI] Npc Clipping (They dont move when attacked..)

Results 1 to 4 of 4
  1. #1 [PI] Npc Clipping (They dont move when attacked..) 
    Registered Member
    Join Date
    Apr 2009
    Posts
    38
    Thanks given
    1
    Thanks received
    1
    Rep Power
    0
    So I am working with a cleaned PI, I just started, and I thought npc clipping was a good place to start. I followed this tutorial and everything went smoothly:
    [PI] Npc clipping

    Now, when I log into my server and attack something, and then run away, the npc just stands there and doesnt do anything. Any help would be much appreciated. Heres my NPCHandler.java:

    Code:
    package server.model.npcs;
    
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
    import server.clip.region.Region;
    
    import server.Config;
    import server.Server;
    import server.model.players.*;
    import server.util.Misc;
    import server.world.WorldMap;
    import server.world.map.VirtualWorld;
    import server.event.EventManager;
    import server.event.Event;
    import server.event.EventContainer;
    
    public class NPCHandler {
    	public static int maxNPCs = 10000;
    	public static int maxListedNPCs = 10000;
    	public static int maxNPCDrops = 10000;
    	public static NPC npcs[] = new NPC[maxNPCs];
    	public static NPCList NpcList[] = new NPCList[maxListedNPCs];
    
    	public NPCHandler() {
    		for (int i = 0; i < maxNPCs; i++) {
    			npcs[i] = null;
    		}
    		for (int i = 0; i < maxListedNPCs; i++) {
    			NpcList[i] = null;
    		}
    		loadNPCList("./Data/CFG/npc.cfg");
    		loadAutoSpawn("./Data/CFG/spawn-config.cfg");
    	}
    	
    
    	public void multiAttackGfx(int i, int gfx) {
    		if (npcs[i].projectileId < 0)
    			return;
    		for (int j = 0; j < Server.playerHandler.players.length; j++) {
    			if (Server.playerHandler.players[j] != null) {
    				Client c = (Client) Server.playerHandler.players[j];
    				if (c.heightLevel != npcs[i].heightLevel)
    					continue;
    				if (Server.playerHandler.players[j].goodDistance(c.absX,
    						c.absY, npcs[i].absX, npcs[i].absY, 15)) {
    					int nX = Server.npcHandler.npcs[i].getX() + offset(i);
    					int nY = Server.npcHandler.npcs[i].getY() + offset(i);
    					int pX = c.getX();
    					int pY = c.getY();
    					int offX = (nY - pY) * -1;
    					int offY = (nX - pX) * -1;
    					c.getPA().createPlayersProjectile(nX, nY, offX, offY, 50,
    							getProjectileSpeed(i), npcs[i].projectileId, 43,
    							31, -c.getId() - 1, 65);
    				}
    			}
    		}
    	}
    
    	public boolean switchesAttackers(int i) {
    		switch (npcs[i].npcType) {
    		case 2551:
    		case 2552:
    		case 2553:
    		case 2559:
    		case 2560:
    		case 2561:
    		case 2563:
    		case 2564:
    		case 2565:
    		case 2892:
    		case 2894:
    			return true;
    
    		}
    
    		return false;
    	}
    
    	public void multiAttackDamage(int i) {
    		int max = getMaxHit(i);
    		for (int j = 0; j < Server.playerHandler.players.length; j++) {
    			if (Server.playerHandler.players[j] != null) {
    				Client c = (Client) Server.playerHandler.players[j];
    				if (c.isDead || c.heightLevel != npcs[i].heightLevel)
    					continue;
    				if (Server.playerHandler.players[j].goodDistance(c.absX,
    						c.absY, npcs[i].absX, npcs[i].absY, 15)) {
    					if (npcs[i].attackType == 2) {
    						if (!c.prayerActive[16]) {
    							if (Misc.random(500) + 200 > Misc.random(c
    									.getCombat().mageDef())) {
    								int dam = Misc.random(max);
    								c.dealDamage(dam);
    								c.handleHitMask(dam);
    							} else {
    								c.dealDamage(0);
    								c.handleHitMask(0);
    							}
    						} else {
    							c.dealDamage(0);
    							c.handleHitMask(0);
    						}
    					} else if (npcs[i].attackType == 1) {
    						if (!c.prayerActive[17]) {
    							int dam = Misc.random(max);
    							if (Misc.random(500) + 200 > Misc.random(c
    									.getCombat().calculateRangeDefence())) {
    								c.dealDamage(dam);
    								c.handleHitMask(dam);
    							} else {
    								c.dealDamage(0);
    								c.handleHitMask(0);
    							}
    						} else {
    							c.dealDamage(0);
    							c.handleHitMask(0);
    						}
    					}
    					if (npcs[i].endGfx > 0) {
    						c.gfx0(npcs[i].endGfx);
    					}
    				}
    				c.getPA().refreshSkill(3);
    			}
    		}
    	}
    
    	public int getClosePlayer(int i) {
    		for (int j = 0; j < Server.playerHandler.players.length; j++) {
    			if (Server.playerHandler.players[j] != null) {
    				if (j == npcs[i].spawnedBy)
    					return j;
    				if (goodDistance(Server.playerHandler.players[j].absX,
    						Server.playerHandler.players[j].absY, npcs[i].absX,
    						npcs[i].absY, 2 + distanceRequired(i)
    								+ followDistance(i))
    						|| isFightCaveNpc(i)) {
    					if ((Server.playerHandler.players[j].underAttackBy <= 0 && Server.playerHandler.players[j].underAttackBy2 <= 0)
    							|| Server.playerHandler.players[j].inMulti())
    						if (Server.playerHandler.players[j].heightLevel == npcs[i].heightLevel)
    							return j;
    				}
    			}
    		}
    		return 0;
    	}
    
    	public int getCloseRandomPlayer(int i) {
    		ArrayList<Integer> players = new ArrayList<Integer>();
    		for (int j = 0; j < Server.playerHandler.players.length; j++) {
    			if (Server.playerHandler.players[j] != null) {
    				if (goodDistance(Server.playerHandler.players[j].absX,
    						Server.playerHandler.players[j].absY, npcs[i].absX,
    						npcs[i].absY, 2 + distanceRequired(i)
    								+ followDistance(i))
    						|| isFightCaveNpc(i)) {
    					if ((Server.playerHandler.players[j].underAttackBy <= 0 && Server.playerHandler.players[j].underAttackBy2 <= 0)
    							|| Server.playerHandler.players[j].inMulti())
    						if (Server.playerHandler.players[j].heightLevel == npcs[i].heightLevel)
    							players.add(j);
    				}
    			}
    		}
    		if (players.size() > 0)
    			return players.get(Misc.random(players.size() - 1));
    		else
    			return 0;
    	}
    
    	public int npcSize(int i) {
    		switch (npcs[i].npcType) {
    		case 2883:
    		case 2882:
    		case 2881:
    			return 3;
    		}
    		return 0;
    	}
    
    	public boolean isAggressive(int i) {
    		switch (npcs[i].npcType) {
    		case 2550:
    		case 2551:
    		case 2552:
    		case 2553:
    		case 2558:
    		case 2559:
    		case 2560:
    		case 2561:
    		case 2562:
    		case 2563:
    		case 2564:
    		case 2565:
    		case 2892:
    		case 2894:
    		case 2881:
    		case 2882:
    		case 2883:
    			return true;
    		}
    		if (npcs[i].inWild() && npcs[i].MaxHP > 0)
    			return true;
    		if (isFightCaveNpc(i))
    			return true;
    		return false;
    	}
    
    	public boolean isFightCaveNpc(int i) {
    		switch (npcs[i].npcType) {
    		case 2627:
    		case 2630:
    		case 2631:
    		case 2741:
    		case 2743:
    		case 2745:
    			return true;
    		}
    		return false;
    	}
    
    	/**
    	 * Summon npc, barrows, etc
    	 **/
    	public void spawnNpc(Client c, int npcType, int x, int y, int heightLevel,
    			int WalkingType, int HP, int maxHit, int attack, int defence,
    			boolean attackPlayer, boolean headIcon) {
    		// first, search for a free slot
    		int slot = -1;
    		for (int i = 1; i < maxNPCs; i++) {
    			if (npcs[i] == null) {
    				slot = i;
    				break;
    			}
    		}
    		if (slot == -1) {
    			// Misc.println("No Free Slot");
    			return; // no free slot found
    		}
    		NPC newNPC = new NPC(slot, npcType);
    		newNPC.absX = x;
    		newNPC.absY = y;
    		newNPC.makeX = x;
    		newNPC.makeY = y;
    		newNPC.heightLevel = heightLevel;
    		newNPC.walkingType = WalkingType;
    		newNPC.HP = HP;
    		newNPC.MaxHP = HP;
    		newNPC.maxHit = maxHit;
    		newNPC.attack = attack;
    		newNPC.defence = defence;
    		newNPC.spawnedBy = c.getId();
    		if (headIcon)
    			c.getPA().drawHeadicon(1, slot, 0, 0);
    		if (attackPlayer) {
    			newNPC.underAttack = true;
    			if (c != null) {
    				if (server.model.minigames.Barrows.COFFIN_AND_BROTHERS[c.randomCoffin][1] != newNPC.npcType) {
    					if (newNPC.npcType == 2025 || newNPC.npcType == 2026
    							|| newNPC.npcType == 2027 || newNPC.npcType == 2028
    							|| newNPC.npcType == 2029 || newNPC.npcType == 2030) {
    						newNPC.forceChat("You dare disturb my rest!");
    					}
    				}
    				if (server.model.minigames.Barrows.COFFIN_AND_BROTHERS[c.randomCoffin][1] == newNPC.npcType) {
    					newNPC.forceChat("You dare steal from us!");
    				}
    
    				newNPC.killerId = c.playerId;
    			}
    		}
    		npcs[slot] = newNPC;
    	}
    
    	public void spawnNpc2(int npcType, int x, int y, int heightLevel,
    			int WalkingType, int HP, int maxHit, int attack, int defence) {
    		// first, search for a free slot
    		int slot = -1;
    		for (int i = 1; i < maxNPCs; i++) {
    			if (npcs[i] == null) {
    				slot = i;
    				break;
    			}
    		}
    		if (slot == -1) {
    			// Misc.println("No Free Slot");
    			return; // no free slot found
    		}
    		NPC newNPC = new NPC(slot, npcType);
    		newNPC.absX = x;
    		newNPC.absY = y;
    		newNPC.makeX = x;
    		newNPC.makeY = y;
    		newNPC.heightLevel = heightLevel;
    		newNPC.walkingType = WalkingType;
    		newNPC.HP = HP;
    		newNPC.MaxHP = HP;
    		newNPC.maxHit = maxHit;
    		newNPC.attack = attack;
    		newNPC.defence = defence;
    		npcs[slot] = newNPC;
    	}
    
    	/**
    	 * Emotes
    	 **/
    
    	public static int getAttackEmote(int i) {
    		switch (Server.npcHandler.npcs[i].npcType) {
    		case 2550:
    			if (npcs[i].attackType == 0)
    				return 7060;
    			else
    				return 7063;
    		case 2892:
    		case 2894:
    			return 2868;
    		case 2627:
    			return 2621;
    		case 2630:
    			return 2625;
    		case 2631:
    			return 2633;
    		case 2741:
    			return 2637;
    		case 2746:
    			return 2637;
    		case 2607:
    			return 2611;
    		case 2743:// 360
    			return 2647;
    			// bandos gwd
    		case 2551:
    		case 2552:
    		case 2553:
    			return 6154;
    			// end of gwd
    			// arma gwd
    		case 2558:
    			return 3505;
    		case 2560:
    			return 6953;
    		case 2559:
    			return 6952;
    		case 2561:
    			return 6954;
    			// end of arma gwd
    			// sara gwd
    		case 2562:
    			return 6964;
    		case 2563:
    			return 6376;
    		case 2564:
    			return 7018;
    		case 2565:
    			return 7009;
    			// end of sara gwd
    		case 13: // wizards
    			return 711;
    
    		case 103:
    		case 655:
    			return 123;
    
    		case 1624:
    			return 1557;
    
    		case 1648:
    			return 1590;
    
    		case 2783: // dark beast
    			return 2733;
    
    		case 1615: // abby demon
    			return 1537;
    
    		case 1613: // nech
    			return 1528;
    
    		case 1610:
    		case 1611: // garg
    			return 1519;
    
    		case 1616: // basilisk
    			return 1546;
    
    		case 90: // skele
    			return 260;
    
    		case 50:// drags
    		case 53:
    		case 54:
    		case 55:
    		case 941:
    		case 1590:
    		case 1591:
    		case 1592:
    			return 80;
    
    		case 124: // earth warrior
    			return 390;
    
    		case 803: // monk
    			return 422;
    
    		case 52: // baby drag
    			return 25;
    
    		case 58: // Shadow Spider
    		case 59: // Giant Spider
    		case 60: // Giant Spider
    		case 61: // Spider
    		case 62: // Jungle Spider
    		case 63: // Deadly Red Spider
    		case 64: // Ice Spider
    		case 134:
    			return 143;
    
    		case 105: // Bear
    		case 106: // Bear
    			return 41;
    
    		case 412:
    		case 78:
    			return 30;
    
    		case 2033: // rat
    			return 138;
    
    		case 2031: // bloodworm
    			return 2070;
    
    		case 101: // goblin
    			return 309;
    
    		case 81: // cow
    			return 0x03B;
    
    		case 21: // hero
    			return 451;
    
    		case 41: // chicken
    			return 55;
    
    		case 9: // guard
    		case 32: // guard
    		case 20: // paladin
    			return 451;
    
    		case 1338: // dagannoth
    		case 1340:
    		case 1342:
    			return 1341;
    
    		case 19: // white knight
    			return 406;
    
    		case 110:
    		case 111: // ice giant
    		case 112:
    		case 117:
    			return 128;
    
    		case 2452:
    			return 1312;
    
    		case 2889:
    			return 2859;
    
    		case 118:
    		case 119:
    			return 99;
    
    		case 82:// Lesser Demon
    		case 83:// Greater Demon
    		case 84:// Black Demon
    		case 1472:// jungle demon
    			return 64;
    
    		case 1267:
    		case 1265:
    			return 1312;
    
    		case 125: // ice warrior
    		case 178:
    			return 451;
    
    		case 1153: // Kalphite Worker
    		case 1154: // Kalphite Soldier
    		case 1155: // Kalphite guardian
    		case 1156: // Kalphite worker
    		case 1157: // Kalphite guardian
    			return 1184;
    
    		case 123:
    		case 122:
    			return 164;
    
    		case 2028: // karil
    			return 2075;
    
    		case 2025: // ahrim
    			return 729;
    
    		case 2026: // dharok
    			return 2067;
    
    		case 2027: // guthan
    			return 2080;
    
    		case 2029: // torag
    			return 0x814;
    
    		case 2030: // verac
    			return 2062;
    
    		case 2881: // supreme
    			return 2855;
    
    		case 2882: // prime
    			return 2854;
    
    		case 2883: // rex
    			return 2851;
    
    		case 3200:
    			return 3146;
    
    		case 2745:
    			if (npcs[i].attackType == 2)
    				return 2656;
    			else if (npcs[i].attackType == 1)
    				return 2652;
    			else if (npcs[i].attackType == 0)
    				return 2655;
    
    		default:
    			return 0x326;
    		}
    	}
    
    	public int getDeadEmote(int i) {
    		switch (npcs[i].npcType) {
    		// sara gwd
    		case 2562:
    			return 6965;
    		case 2563:
    			return 6377;
    		case 2564:
    			return 7016;
    		case 2565:
    			return 7011;
    			// bandos gwd
    		case 2551:
    		case 2552:
    		case 2553:
    			return 6156;
    		case 2550:
    			return 7062;
    		case 2892:
    		case 2894:
    			return 2865;
    		case 1612: // banshee
    			return 1524;
    		case 2558:
    			return 3503;
    		case 2559:
    		case 2560:
    		case 2561:
    			return 6956;
    		case 2607:
    			return 2607;
    		case 2627:
    			return 2620;
    		case 2630:
    			return 2627;
    		case 2631:
    			return 2630;
    		case 2738:
    			return 2627;
    		case 2741:
    			return 2638;
    		case 2746:
    			return 2638;
    		case 2743:
    			return 2646;
    		case 2745:
    			return 2654;
    
    		case 3777:
    		case 3778:
    		case 3779:
    		case 3780:
    			return -1;
    
    		case 3200:
    			return 3147;
    
    		case 2035: // spider
    			return 146;
    
    		case 2033: // rat
    			return 141;
    
    		case 2031: // bloodvel
    			return 2073;
    
    		case 101: // goblin
    			return 313;
    
    		case 81: // cow
    			return 0x03E;
    
    		case 41: // chicken
    			return 57;
    
    		case 1338: // dagannoth
    		case 1340:
    		case 1342:
    			return 1342;
    
    		case 2881:
    		case 2882:
    		case 2883:
    			return 2856;
    
    		case 111: // ice giant
    			return 131;
    
    		case 125: // ice warrior
    			return 843;
    
    		case 751:// Zombies!!
    			return 302;
    
    		case 1626:
    		case 1627:
    		case 1628:
    		case 1629:
    		case 1630:
    		case 1631:
    		case 1632: // turoth!
    			return 1597;
    
    		case 1616: // basilisk
    			return 1548;
    
    		case 1653: // hand
    			return 1590;
    
    		case 82:// demons
    		case 83:
    		case 84:
    			return 67;
    
    		case 1605:// abby spec
    			return 1508;
    
    		case 51:// baby drags
    		case 52:
    		case 1589:
    		case 3376:
    			return 28;
    
    		case 1610:
    		case 1611:
    			return 1518;
    
    		case 1618:
    		case 1619:
    			return 1553;
    
    		case 1620:
    		case 1621:
    			return 1563;
    
    		case 2783:
    			return 2732;
    
    		case 1615:
    			return 1538;
    
    		case 1624:
    			return 1558;
    
    		case 1613:
    			return 1530;
    
    		case 1633:
    		case 1634:
    		case 1635:
    		case 1636:
    			return 1580;
    
    		case 1648:
    		case 1649:
    		case 1650:
    		case 1651:
    		case 1652:
    		case 1654:
    		case 1655:
    		case 1656:
    		case 1657:
    			return 1590;
    
    		case 100:
    		case 102:
    			return 313;
    
    		case 105:
    		case 106:
    			return 44;
    
    		case 412:
    		case 78:
    			return 36;
    
    		case 122:
    		case 123:
    			return 167;
    
    		case 58:
    		case 59:
    		case 60:
    		case 61:
    		case 62:
    		case 63:
    		case 64:
    		case 134:
    			return 146;
    
    		case 1153:
    		case 1154:
    		case 1155:
    		case 1156:
    		case 1157:
    			return 1190;
    
    		case 103:
    		case 104:
    			return 123;
    
    		case 118:
    		case 119:
    			return 102;
    
    		case 50:// drags
    		case 53:
    		case 54:
    		case 55:
    		case 941:
    		case 1590:
    		case 1591:
    		case 1592:
    			return 92;
    
    		default:
    			return 2304;
    		}
    	}
    
    	/**
    	 * Attack delays
    	 **/
    	public int getNpcDelay(int i) {
    		switch (npcs[i].npcType) {
    		case 2025:
    		case 2028:
    			return 7;
    
    		case 2745:
    			return 8;
    
    		case 2558:
    		case 2559:
    		case 2560:
    		case 2561:
    		case 2550:
    			return 6;
    			// saradomin gw boss
    		case 2562:
    			return 2;
    
    		default:
    			return 5;
    		}
    	}
    
    	/**
    	 * Hit delays
    	 **/
    	public int getHitDelay(int i) {
    		switch (npcs[i].npcType) {
    		case 2881:
    		case 2882:
    		case 3200:
    		case 2892:
    		case 2894:
    			return 3;
    
    		case 2743:
    		case 2631:
    		case 2558:
    		case 2559:
    		case 2560:
    			return 3;
    
    		case 2745:
    			if (npcs[i].attackType == 1 || npcs[i].attackType == 2)
    				return 5;
    			else
    				return 2;
    
    		case 2025:
    			return 4;
    		case 2028:
    			return 3;
    
    		default:
    			return 2;
    		}
    	}
    
    	/**
    	 * Npc respawn time
    	 **/
    	public int getRespawnTime(int i) {
    		switch (npcs[i].npcType) {
    		case 2881:
    		case 2882:
    		case 2883:
    		case 2558:
    		case 2559:
    		case 2560:
    		case 2561:
    		case 2562:
    		case 2563:
    		case 2564:
    		case 2550:
    		case 2551:
    		case 2552:
    		case 2553:
    			return 100;
    		case 3777:
    		case 3778:
    		case 3779:
    		case 3780:
    			return 500;
    		default:
    			return 25;
    		}
    	}
    
    	public void newNPC(int npcType, int x, int y, int heightLevel,
    			int WalkingType, int HP, int maxHit, int attack, int defence) {
    		// first, search for a free slot
    		int slot = -1;
    		for (int i = 1; i < maxNPCs; i++) {
    			if (npcs[i] == null) {
    				slot = i;
    				break;
    			}
    		}
    
    		if (slot == -1)
    			return; // no free slot found
    
    		NPC newNPC = new NPC(slot, npcType);
    		newNPC.absX = x;
    		newNPC.absY = y;
    		newNPC.makeX = x;
    		newNPC.makeY = y;
    		newNPC.heightLevel = heightLevel;
    		newNPC.walkingType = WalkingType;
    		newNPC.HP = HP;
    		newNPC.MaxHP = HP;
    		newNPC.maxHit = maxHit;
    		newNPC.attack = attack;
    		newNPC.defence = defence;
    		npcs[slot] = newNPC;
    	}
    
    	public void newNPCList(int npcType, String npcName, int combat, int HP) {
    		// first, search for a free slot
    		int slot = -1;
    		for (int i = 0; i < maxListedNPCs; i++) {
    			if (NpcList[i] == null) {
    				slot = i;
    				break;
    			}
    		}
    
    		if (slot == -1)
    			return; // no free slot found
    
    		NPCList newNPCList = new NPCList(npcType);
    		newNPCList.npcName = npcName;
    		newNPCList.npcCombat = combat;
    		newNPCList.npcHealth = HP;
    		NpcList[slot] = newNPCList;
    	}
    
    	public int getDeadTime(int i) {
    		switch(npcs[i].npcType) {
    		case 1265:
    			return 2;
    		default:
    			return 4;
    		}
    	}
    	public void process() {
    		
    		for (int i = 0; i < maxNPCs; i++) {
    			if (npcs[i] == null)
    				continue;
    			npcs[i].clearUpdateFlags();
    
    		}
    
    		
    		for (int i = 0; i < maxNPCs; i++) {
    			if (npcs[i] != null) {
    				if (npcs[i].actionTimer > 0) {
    					npcs[i].actionTimer--;
    				}
    				if (npcs[i].lastX != npcs[i].getX()
    						|| npcs[i].lastY != npcs[i].getY()) {
    					npcs[i].lastX = npcs[i].getX();
    					npcs[i].lastY = npcs[i].getY();
    				}
    
    				if (npcs[i].freezeTimer > 0) {
    					npcs[i].freezeTimer--;
    				}
    
    				if (npcs[i].hitDelayTimer > 0) {
    					npcs[i].hitDelayTimer--;
    				}
    
    				if (npcs[i].hitDelayTimer == 1) {
    					npcs[i].hitDelayTimer = 0;
    					applyDamage(i);
    				}
    
    				if (npcs[i].attackTimer > 0) {
    					npcs[i].attackTimer--;
    				}
    
    				if (npcs[i].spawnedBy > 0) { // delete summons npc
    					if (Server.playerHandler.players[npcs[i].spawnedBy] == null
    							|| Server.playerHandler.players[npcs[i].spawnedBy].heightLevel != npcs[i].heightLevel
    							|| Server.playerHandler.players[npcs[i].spawnedBy].respawnTimer > 0
    							|| !Server.playerHandler.players[npcs[i].spawnedBy]
    									.goodDistance(
    											npcs[i].getX(),
    											npcs[i].getY(),
    											Server.playerHandler.players[npcs[i].spawnedBy]
    													.getX(),
    											Server.playerHandler.players[npcs[i].spawnedBy]
    													.getY(), 20)) {
    
    						if (Server.playerHandler.players[npcs[i].spawnedBy] != null) {
    							for (int o = 0; o < Server.playerHandler.players[npcs[i].spawnedBy].barrowsNpcs.length; o++) {
    								if (npcs[i].npcType == Server.playerHandler.players[npcs[i].spawnedBy].barrowsNpcs[o][0]) {
    									if (Server.playerHandler.players[npcs[i].spawnedBy].barrowsNpcs[o][1] == 1)
    										Server.playerHandler.players[npcs[i].spawnedBy].barrowsNpcs[o][1] = 0;
    								}
    							}
    						}
    						npcs[i] = null;
    					}
    				}
    				if (npcs[i] == null)
    					continue;
    
    				/**
    				 * Attacking player
    				 **/
    				if (isAggressive(i) && !npcs[i].underAttack && !npcs[i].isDead
    						&& !switchesAttackers(i)) {
    					npcs[i].killerId = getCloseRandomPlayer(i);
    				} else if (isAggressive(i) && !npcs[i].underAttack
    						&& !npcs[i].isDead && switchesAttackers(i)) {
    					npcs[i].killerId = getCloseRandomPlayer(i);
    				}
    
    				if (System.currentTimeMillis() - npcs[i].lastDamageTaken > 5000)
    					npcs[i].underAttackBy = 0;
    
    				if ((npcs[i].killerId > 0 || npcs[i].underAttack)
    						&& !npcs[i].walkingHome && retaliates(npcs[i].npcType)) {
    					if (!npcs[i].isDead) {
    						int p = npcs[i].killerId;
    						if (Server.playerHandler.players[p] != null) {
    							Client c = (Client) Server.playerHandler.players[p];
    							followPlayer(i, c.playerId);
    							if (npcs[i] == null)
    								continue;
    							if (npcs[i].attackTimer == 0) {
    								if (c != null) {
    									attackPlayer(c, i);
    								} else {
    									npcs[i].killerId = 0;
    									npcs[i].underAttack = false;
    									npcs[i].facePlayer(0);
    								}
    							}
    						} else {
    							npcs[i].killerId = 0;
    							npcs[i].underAttack = false;
    							npcs[i].facePlayer(0);
    						}
    					}
    				}
    
    				/**
    				 * Random walking and walking home
    				 **/
    				if (npcs[i] == null)
    					continue;
    				if ((!npcs[i].underAttack || npcs[i].walkingHome)
    						&& npcs[i].randomWalk && !npcs[i].isDead) {
    					npcs[i].facePlayer(0);
    					npcs[i].killerId = 0;
    					if (npcs[i].spawnedBy == 0) {
    						if ((npcs[i].absX > npcs[i].makeX
    								+ Config.NPC_RANDOM_WALK_DISTANCE)
    								|| (npcs[i].absX < npcs[i].makeX
    										- Config.NPC_RANDOM_WALK_DISTANCE)
    								|| (npcs[i].absY > npcs[i].makeY
    										+ Config.NPC_RANDOM_WALK_DISTANCE)
    								|| (npcs[i].absY < npcs[i].makeY
    										- Config.NPC_RANDOM_WALK_DISTANCE)) {
    							npcs[i].walkingHome = true;
    						}
    					}
    
    					if (npcs[i].walkingHome && npcs[i].absX == npcs[i].makeX
    							&& npcs[i].absY == npcs[i].makeY) {
    						npcs[i].walkingHome = false;
    					} else if (npcs[i].walkingHome) {
    						npcs[i].moveX = GetMove(npcs[i].absX, npcs[i].makeX);
    						npcs[i].moveY = GetMove(npcs[i].absY, npcs[i].makeY);getClass();
    						handleClipping(i);
    						npcs[i].getNextNPCMovement(i);
    						npcs[i].updateRequired = true;
    					}
    					if (npcs[i].walkingType == 1) {
    						if (Misc.random(3) == 1 && !npcs[i].walkingHome) {
    							int MoveX = 0;
    							int MoveY = 0;
    							int Rnd = Misc.random(9);
    							if (Rnd == 1) {
    								MoveX = 1;
    								MoveY = 1;
    							} else if (Rnd == 2) {
    								MoveX = -1;
    							} else if (Rnd == 3) {
    								MoveY = -1;
    							} else if (Rnd == 4) {
    								MoveX = 1;
    							} else if (Rnd == 5) {
    								MoveY = 1;
    							} else if (Rnd == 6) {
    								MoveX = -1;
    								MoveY = -1;
    							} else if (Rnd == 7) {
    								MoveX = -1;
    								MoveY = 1;
    							} else if (Rnd == 8) {
    								MoveX = 1;
    								MoveY = -1;
    							}
    
    							if (MoveX == 1) {
    								if (npcs[i].absX + MoveX < npcs[i].makeX + 1) {
    									npcs[i].moveX = MoveX;
    								} else {
    									npcs[i].moveX = 0;
    								}
    							}
    
    							if (MoveX == -1) {
    								if (npcs[i].absX - MoveX > npcs[i].makeX - 1) {
    									npcs[i].moveX = MoveX;
    								} else {
    									npcs[i].moveX = 0;
    								}
    							}
    
    							if (MoveY == 1) {
    								if (npcs[i].absY + MoveY < npcs[i].makeY + 1) {
    									npcs[i].moveY = MoveY;
    								} else {
    									npcs[i].moveY = 0;
    								}
    							}
    
    							if (MoveY == -1) {
    								if (npcs[i].absY - MoveY > npcs[i].makeY - 1) {
    									npcs[i].moveY = MoveY;
    								} else {
    									npcs[i].moveY = 0;
    								}
    							}
    
    							int x = (npcs[i].absX + npcs[i].moveX);
    							int y = (npcs[i].absY + npcs[i].moveY);
    							if (VirtualWorld.I(npcs[i].heightLevel,
    									npcs[i].absX, npcs[i].absY, x, y, 0))
    								npcs[i].getNextNPCMovement(i);
    							else {
    								npcs[i].moveX = 0;
    								npcs[i].moveY = 0;
    							}
    							npcs[i].updateRequired = true;
    						}
    					}
    				}
    
    				if (npcs[i].isDead == true) {
    					if (npcs[i].actionTimer == 0 && npcs[i].applyDead == false
    							&& npcs[i].needRespawn == false) {
    						npcs[i].updateRequired = true;
    						npcs[i].facePlayer(0);
    						npcs[i].killedBy = getNpcKillerId(i);
    						npcs[i].animNumber = getDeadEmote(i); // dead emote
    						npcs[i].animUpdateRequired = true;
    						npcs[i].freezeTimer = 0;
    						npcs[i].applyDead = true;
    						killedBarrow(i);
    						if (isFightCaveNpc(i))
    							killedTzhaar(i);
    						npcs[i].actionTimer = getDeadTime(i); // delete time
    						resetPlayersInCombat(i);
    					} else if (npcs[i].actionTimer == 0
    							&& npcs[i].applyDead == true
    							&& npcs[i].needRespawn == false) {
    						npcs[i].needRespawn = true;
    						npcs[i].actionTimer = getRespawnTime(i); // respawn time
    						dropItems(i); // npc drops items!
    						appendSlayerExperience(i);
    						appendKillCount(i);
    						npcs[i].absX = npcs[i].makeX;
    						npcs[i].absY = npcs[i].makeY;
    						npcs[i].HP = npcs[i].MaxHP;
    						npcs[i].animNumber = 0x328;
    						npcs[i].updateRequired = true;
    						npcs[i].animUpdateRequired = true;
    						if (npcs[i].npcType >= 2440 && npcs[i].npcType <= 2446) {
    							Server.objectManager.removeObject(npcs[i].absX,
    									npcs[i].absY);
    						}
    						if (npcs[i].npcType == 2745) {
    							handleJadDeath(i);
    						}
    					} else if (npcs[i].actionTimer == 0
    							&& npcs[i].needRespawn == true) {
    						if (npcs[i].spawnedBy > 0) {
    							npcs[i] = null;
    						} else {
    							int old1 = npcs[i].npcType;
    							int old2 = npcs[i].makeX;
    							int old3 = npcs[i].makeY;
    							int old4 = npcs[i].heightLevel;
    							int old5 = npcs[i].walkingType;
    							int old6 = npcs[i].MaxHP;
    							int old7 = npcs[i].maxHit;
    							int old8 = npcs[i].attack;
    							int old9 = npcs[i].defence;
    
    							npcs[i] = null;
    							newNPC(old1, old2, old3, old4, old5, old6, old7,
    									old8, old9);
    						}
    					}
    				}
    			}
    		}
    	}
    
    	public boolean getsPulled(int i) {
    		switch (npcs[i].npcType) {
    		case 2550:
    			if (npcs[i].firstAttacker > 0)
    				return false;
    			break;
    		}
    		return true;
    	}
    
    	public boolean multiAttacks(int i) {
    		switch (npcs[i].npcType) {
    		case 2558:
    			return true;
    		case 2562:
    			if (npcs[i].attackType == 2)
    				return true;
    		case 2550:
    			if (npcs[i].attackType == 1)
    				return true;
    		default:
    			return false;
    		}
    
    	}
    
    	/**
    	 * Npc killer id?
    	 **/
    
    	public int getNpcKillerId(int npcId) {
    		int oldDamage = 0;
    		int count = 0;
    		int killerId = 0;
    		for (int p = 1; p < Config.MAX_PLAYERS; p++) {
    			if (Server.playerHandler.players[p] != null) {
    				if (Server.playerHandler.players[p].lastNpcAttacked == npcId) {
    					if (Server.playerHandler.players[p].totalDamageDealt > oldDamage) {
    						oldDamage = Server.playerHandler.players[p].totalDamageDealt;
    						killerId = p;
    					}
    					Server.playerHandler.players[p].totalDamageDealt = 0;
    				}
    			}
    		}
    		return killerId;
    	}
    
    	/**
    	 * 
    	 */
    	private void killedBarrow(int i) {
    		Client c = (Client) Server.playerHandler.players[npcs[i].killedBy];
    		if (c != null) {
    			for (int o = 0; o < c.barrowsNpcs.length; o++) {
    				if (npcs[i].npcType == c.barrowsNpcs[o][0]) {
    					c.barrowsNpcs[o][1] = 2; // 2 for dead
    					c.barrowsKillCount++;
    				}
    			}
    		}
    	}
    
    	private void killedTzhaar(int i) {
    		final Client c2 = (Client) Server.playerHandler.players[npcs[i].spawnedBy];
    		c2.tzhaarKilled++;
    		// System.out.println("To kill: " + c2.tzhaarToKill + " killed: " +
    		// c2.tzhaarKilled);
    		if (c2.tzhaarKilled == c2.tzhaarToKill) {
    			// c2.sendMessage("STARTING EVENT");
    			c2.waveId++;
    			EventManager.getSingleton().addEvent(new Event() {
    				public void execute(EventContainer c) {
    					if (c2 != null) {
    						Server.fightCaves.spawnNextWave(c2);
    					}
    					c.stop();
    				}
    			}, 7500);
    
    		}
    	}
    
    	public void handleJadDeath(int i) {
    		Client c = (Client) Server.playerHandler.players[npcs[i].spawnedBy];
    		c.getItems().addItem(6570, 1);
    		c.sendMessage("Congratulations on completing the fight caves minigame!");
    		c.getPA().resetTzhaar();
    		c.waveId = 300;
    	}
    
    	/**
    	 * Dropping Items!
    	 **/
    
    	public boolean rareDrops(int i) {
    		return Misc.random(NPCDrops.dropRarity.get(npcs[i].npcType)) == 0;
    	}
    
    	public void dropItems(int i) {
    		int npc = 0;
    		// long start = System.currentTimeMillis();
    		Client c = (Client) Server.playerHandler.players[npcs[i].killedBy];
    		if (c != null) {
    			if (npcs[i].npcType == 912 || npcs[i].npcType == 913
    					|| npcs[i].npcType == 914)
    				c.magePoints += 1;
    			if (NPCDrops.constantDrops.get(npcs[i].npcType) != null) {
    				for (int item : NPCDrops.constantDrops.get(npcs[i].npcType)) {
    					Server.itemHandler.createGroundItem(c, item, npcs[i].absX,
    							npcs[i].absY, 1, c.playerId);
    					// if (c.clanId >= 0)
    					// Server.clanChat.handleLootShare(c, item, 1);
    				}
    			}
    
    			if (NPCDrops.dropRarity.get(npcs[i].npcType) != null) {
    				if (rareDrops(i)) {
    					int random = Misc.random(NPCDrops.rareDrops
    							.get(npcs[i].npcType).length - 1);
    					Server.itemHandler.createGroundItem(c,
    							NPCDrops.rareDrops.get(npcs[i].npcType)[random][0],
    							npcs[i].absX, npcs[i].absY,
    							NPCDrops.rareDrops.get(npcs[i].npcType)[random][1],
    							c.playerId);
    					if (c.clanId >= 0)
    						Server.clanChat
    								.handleLootShare(
    										c,
    										NPCDrops.rareDrops.get(npcs[i].npcType)[random][0],
    										NPCDrops.rareDrops.get(npcs[i].npcType)[random][1]);
    				} else {
    					int random = Misc.random(NPCDrops.normalDrops
    							.get(npcs[i].npcType).length - 1);
    					Server.itemHandler
    							.createGroundItem(
    									c,
    									NPCDrops.normalDrops.get(npcs[i].npcType)[random][0],
    									npcs[i].absX,
    									npcs[i].absY,
    									NPCDrops.normalDrops.get(npcs[i].npcType)[random][1],
    									c.playerId);
    					// Server.clanChat.handleLootShare(c,
    					// NPCDrops.normalDrops.get(npcs[i].npcType)[random][0],
    					// NPCDrops.normalDrops.get(npcs[i].npcType)[random][1]);
    				}
    			}
    
    		}
    		// System.out.println("Took: " + (System.currentTimeMillis() - start));
    	}
    
    	public void appendKillCount(int i) {
    		Client c = (Client) Server.playerHandler.players[npcs[i].killedBy];
    		if (c != null) {
    			int[] kcMonsters = { 122, 49, 2558, 2559, 2560, 2561, 2550, 2551,
    					2552, 2553, 2562, 2563, 2564, 2565 };
    			for (int j : kcMonsters) {
    				if (npcs[i].npcType == j) {
    					if (c.killCount < 20) {
    						c.killCount++;
    						c.sendMessage("Killcount: " + c.killCount);
    					} else {
    						c.sendMessage("You already have 20 kill count");
    					}
    					break;
    				}
    			}
    		}
    	}
    
    	// id of bones dropped by npcs
    	public int boneDrop(int type) {
    		switch (type) {
    		case 1:// normal bones
    		case 9:
    		case 100:
    		case 12:
    		case 17:
    		case 803:
    		case 18:
    		case 81:
    		case 101:
    		case 41:
    		case 19:
    		case 90:
    		case 75:
    		case 86:
    		case 78:
    		case 912:
    		case 913:
    		case 914:
    		case 1648:
    		case 1643:
    		case 1618:
    		case 1624:
    		case 181:
    		case 119:
    		case 49:
    		case 26:
    		case 1341:
    			return 526;
    		case 117:
    			return 532;// big bones
    		case 50:// drags
    		case 53:
    		case 54:
    		case 55:
    		case 941:
    		case 1590:
    		case 1591:
    		case 1592:
    			return 536;
    		case 84:
    		case 1615:
    		case 1613:
    		case 82:
    		case 3200:
    			return 592;
    		case 2881:
    		case 2882:
    		case 2883:
    			return 6729;
    		default:
    			return -1;
    		}
    	}
    
    	public int getStackedDropAmount(int itemId, int npcId) {
    		switch (itemId) {
    		case 995:
    			switch (npcId) {
    			case 1:
    				return 50 + Misc.random(50);
    			case 9:
    				return 133 + Misc.random(100);
    			case 1624:
    				return 1000 + Misc.random(300);
    			case 1618:
    				return 1000 + Misc.random(300);
    			case 1643:
    				return 1000 + Misc.random(300);
    			case 1610:
    				return 1000 + Misc.random(1000);
    			case 1613:
    				return 1500 + Misc.random(1250);
    			case 1615:
    				return 3000;
    			case 18:
    				return 500;
    			case 101:
    				return 60;
    			case 913:
    			case 912:
    			case 914:
    				return 750 + Misc.random(500);
    			case 1612:
    				return 250 + Misc.random(500);
    			case 1648:
    				return 250 + Misc.random(250);
    			case 90:
    				return 200;
    			case 82:
    				return 1000 + Misc.random(455);
    			case 52:
    				return 400 + Misc.random(200);
    			case 49:
    				return 1500 + Misc.random(2000);
    			case 1341:
    				return 1500 + Misc.random(500);
    			case 26:
    				return 500 + Misc.random(100);
    			case 20:
    				return 750 + Misc.random(100);
    			case 21:
    				return 890 + Misc.random(125);
    			case 117:
    				return 500 + Misc.random(250);
    			case 2607:
    				return 500 + Misc.random(350);
    			}
    			break;
    		case 11212:
    			return 10 + Misc.random(4);
    		case 565:
    		case 561:
    			return 10;
    		case 560:
    		case 563:
    		case 562:
    			return 15;
    		case 555:
    		case 554:
    		case 556:
    		case 557:
    			return 20;
    		case 892:
    			return 40;
    		case 886:
    			return 100;
    		case 6522:
    			return 6 + Misc.random(5);
    
    		}
    
    		return 1;
    	}
    
    	/**
    	 * Slayer Experience
    	 **/
    	public void appendSlayerExperience(int i) {
    		int npc = 0;
    		Client c = (Client) Server.playerHandler.players[npcs[i].killedBy];
    		if (c != null) {
    			if (c.slayerTask == npcs[i].npcType) {
    				c.taskAmount--;
    				c.getPA().addSkillXP(npcs[i].MaxHP * Config.SLAYER_EXPERIENCE,
    						18);
    				if (c.taskAmount <= 0) {
    					c.getPA().addSkillXP(
    							(npcs[i].MaxHP * 8) * Config.SLAYER_EXPERIENCE, 18);
    					c.slayerTask = -1;
    					c.sendMessage("You completed your slayer task. Please see a slayer master to get a new one.");
    				}
    			}
    		}
    	}
    
    	/**
    	 * Resets players in combat
    	 */
    
    	public void resetPlayersInCombat(int i) {
    		for (int j = 0; j < Server.playerHandler.players.length; j++) {
    			if (Server.playerHandler.players[j] != null)
    				if (Server.playerHandler.players[j].underAttackBy2 == i)
    					Server.playerHandler.players[j].underAttackBy2 = 0;
    		}
    	}
    
    	/**
    	 * Npc Follow Player
    	 **/
    
    	public int GetMove(int Place1, int Place2) {
    		if ((Place1 - Place2) == 0) {
    			return 0;
    		} else if ((Place1 - Place2) < 0) {
    			return 1;
    		} else if ((Place1 - Place2) > 0) {
    			return -1;
    		}
    		return 0;
    	}
    
    	public boolean followPlayer(int i) {
    		switch (npcs[i].npcType) {
    		case 2892:
    		case 2894:
    			return false;
    		}
    		return true;
    	}
    
    	public void followPlayer(int i, int playerId) {
    		if (Server.playerHandler.players[playerId] == null) {
    			return;
    		}
    		if (Server.playerHandler.players[playerId].respawnTimer > 0) {
    			npcs[i].facePlayer(0);
    			npcs[i].randomWalk = true;
    			npcs[i].underAttack = false;
    			return;
    		}
    
    		if (!followPlayer(i)) {
    			npcs[i].facePlayer(playerId);
    			return;
    		}
    
    		int playerX = Server.playerHandler.players[playerId].absX;
    		int playerY = Server.playerHandler.players[playerId].absY;
    		npcs[i].randomWalk = false;
    		if (goodDistance(npcs[i].getX(), npcs[i].getY(), playerX, playerY,
    				distanceRequired(i)))
    			return;
    		if ((npcs[i].spawnedBy > 0)
    				|| ((npcs[i].absX < npcs[i].makeX + Config.NPC_FOLLOW_DISTANCE)
    						&& (npcs[i].absX > npcs[i].makeX
    								- Config.NPC_FOLLOW_DISTANCE)
    						&& (npcs[i].absY < npcs[i].makeY
    								+ Config.NPC_FOLLOW_DISTANCE) && (npcs[i].absY > npcs[i].makeY
    						- Config.NPC_FOLLOW_DISTANCE))) {
    			if (npcs[i].heightLevel == Server.playerHandler.players[playerId].heightLevel) {
    				if (Server.playerHandler.players[playerId] != null
    						&& npcs[i] != null) {
    					if (playerY < npcs[i].absY) {
    						npcs[i].moveX = GetMove(npcs[i].absX, playerX);
    						npcs[i].moveY = GetMove(npcs[i].absY, playerY);
    					} else if (playerY > npcs[i].absY) {
    						npcs[i].moveX = GetMove(npcs[i].absX, playerX);
    						npcs[i].moveY = GetMove(npcs[i].absY, playerY);
    					} else if (playerX < npcs[i].absX) {
    						npcs[i].moveX = GetMove(npcs[i].absX, playerX);
    						npcs[i].moveY = GetMove(npcs[i].absY, playerY);
    					} else if (playerX > npcs[i].absX) {
    						npcs[i].moveX = GetMove(npcs[i].absX, playerX);
    						npcs[i].moveY = GetMove(npcs[i].absY, playerY);
    					} else if (playerX == npcs[i].absX
    							|| playerY == npcs[i].absY) {
    						int o = Misc.random(3);
    						switch (o) {
    						case 0:
    							npcs[i].moveX = GetMove(npcs[i].absX, playerX);
    							npcs[i].moveY = GetMove(npcs[i].absY, playerY + 1);
    							break;
    
    						case 1:
    							npcs[i].moveX = GetMove(npcs[i].absX, playerX);
    							npcs[i].moveY = GetMove(npcs[i].absY, playerY - 1);
    							break;
    
    						case 2:
    							npcs[i].moveX = GetMove(npcs[i].absX, playerX + 1);
    							npcs[i].moveY = GetMove(npcs[i].absY, playerY);
    							break;
    
    						case 3:
    							npcs[i].moveX = GetMove(npcs[i].absX, playerX - 1);
    							npcs[i].moveY = GetMove(npcs[i].absY, playerY);
    							break;
    						}
    					}
    					int x = (npcs[i].absX + npcs[i].moveX);
    					int y = (npcs[i].absY + npcs[i].moveY);
    					npcs[i].facePlayer(playerId);
    					handleClipping(i);
    					npcs[i].getNextNPCMovement(i);
    					npcs[i].facePlayer(playerId);
    					npcs[i].updateRequired = true;
    				}
    			}
    		} else {
    			npcs[i].facePlayer(0);
    			npcs[i].randomWalk = true;
    			npcs[i].underAttack = false;
    		}
    	}
    
    	public void handleClipping(final int i) {
    		if(npcs[i] == null)
    			return;
    		final NPC npc = NPCHandler.npcs[i];
    		if(npc.moveX == 1 && npc.moveY == 1) {
    			if((Region.getClipping(npc.absX + 1, npc.absY + 1, npc.heightLevel) & 0x12801e0) != 0)  {
    				npc.moveX = 0; npc.moveY = 0;
    				if((Region.getClipping(npc.absX, npc.absY + 1, npc.heightLevel) & 0x1280120) == 0) {
    					npc.moveY = 1;
    				} else {
    					npc.moveX = 1;
    				}
    			}
    		} else if(npc.moveX == -1 && npc.moveY == -1) {
    			if((Region.getClipping(npc.absX - 1, npc.absY - 1, npc.heightLevel) & 0x128010e) != 0)  {
    				npc.moveX = 0; npc.moveY = 0;
    				if((Region.getClipping(npc.absX, npc.absY - 1, npc.heightLevel) & 0x1280102) == 0) {
    					npc.moveY = -1;
    				} else {
    					npc.moveX = -1;
    				}
    			}
    		} else if(npc.moveX == 1 && npc.moveY == -1) {
    			if((Region.getClipping(npc.absX + 1, npc.absY - 1, npc.heightLevel) & 0x1280183) != 0)  {
    				npc.moveX = 0; npc.moveY = 0;
    				if((Region.getClipping(npc.absX, npc.absY - 1, npc.heightLevel) & 0x1280102) == 0) {
    					npc.moveY = -1;
    				} else {
    					npc.moveX = 1;
    				}
    			}
    		} else if(npc.moveX == -1 && npc.moveY == 1) {
    			if((Region.getClipping(npc.absX - 1, npc.absY + 1, npc.heightLevel) & 0x128013) != 0)  {
    				npc.moveX = 0; npc.moveY = 0;
    				if((Region.getClipping(npc.absX, npc.absY + 1, npc.heightLevel) & 0x1280120) == 0) {
    					npc.moveY = 1;
    				} else {
    					npc.moveX = -1;
    				}
    			}
    		} //Checking Diagonal movement.
    		
    		if (npc.moveY == -1 ) {
    			if ((Region.getClipping(npc.absX, npc.absY - 1, npc.heightLevel) & 0x1280102) != 0) {
    				npc.moveY = 0;
    			}
    		} else if( npc.moveY == 1) {
    			if((Region.getClipping(npc.absX, npc.absY + 1, npc.heightLevel) & 0x1280120) != 0) {
    				npc.moveY = 0;
    			}
    		} //Checking Y movement.
    		if(npc.moveX == 1) {
    			if((Region.getClipping(npc.absX + 1, npc.absY, npc.heightLevel) & 0x1280180) != 0) {
    				npc.moveX = 0;
    			}
    		} else if(npc.moveX == -1) {
    			if((Region.getClipping(npc.absX - 1, npc.absY, npc.heightLevel) & 0x1280108) != 0) {
    				npc.moveX = 0;
    			}
    		} //Checking X movement.
    	}
    
    	/**
    	 * load spell
    	 **/
    	public void loadSpell2(int i) {
    		npcs[i].attackType = 3;
    		int random = Misc.random(3);
    		if (random == 0) {
    			npcs[i].projectileId = 393; // red
    			npcs[i].endGfx = 430;
    		} else if (random == 1) {
    			npcs[i].projectileId = 394; // green
    			npcs[i].endGfx = 429;
    		} else if (random == 2) {
    			npcs[i].projectileId = 395; // white
    			npcs[i].endGfx = 431;
    		} else if (random == 3) {
    			npcs[i].projectileId = 396; // blue
    			npcs[i].endGfx = 428;
    		}
    	}
    
    	public void loadSpell(int i) {
    		switch (npcs[i].npcType) {
    		case 2892:
    			npcs[i].projectileId = 94;
    			npcs[i].attackType = 2;
    			npcs[i].endGfx = 95;
    			break;
    		case 2894:
    			npcs[i].projectileId = 298;
    			npcs[i].attackType = 1;
    			break;
    		case 50:
    			int random = Misc.random(4);
    			if (random == 0) {
    				npcs[i].projectileId = 393; // red
    				npcs[i].endGfx = 430;
    				npcs[i].attackType = 3;
    			} else if (random == 1) {
    				npcs[i].projectileId = 394; // green
    				npcs[i].endGfx = 429;
    				npcs[i].attackType = 3;
    			} else if (random == 2) {
    				npcs[i].projectileId = 395; // white
    				npcs[i].endGfx = 431;
    				npcs[i].attackType = 3;
    			} else if (random == 3) {
    				npcs[i].projectileId = 396; // blue
    				npcs[i].endGfx = 428;
    				npcs[i].attackType = 3;
    			} else if (random == 4) {
    				npcs[i].projectileId = -1; // melee
    				npcs[i].endGfx = -1;
    				npcs[i].attackType = 0;
    			}
    			break;
    		// arma npcs
    		case 2561:
    			npcs[i].attackType = 0;
    			break;
    		case 2560:
    			npcs[i].attackType = 1;
    			npcs[i].projectileId = 1190;
    			break;
    		case 2559:
    			npcs[i].attackType = 2;
    			npcs[i].projectileId = 1203;
    			break;
    		case 2558:
    			random = Misc.random(1);
    			npcs[i].attackType = 1 + random;
    			if (npcs[i].attackType == 1) {
    				npcs[i].projectileId = 1197;
    			} else {
    				npcs[i].attackType = 2;
    				npcs[i].projectileId = 1198;
    			}
    			break;
    		// sara npcs
    		case 2562: // sara
    			random = Misc.random(1);
    			if (random == 0) {
    				npcs[i].attackType = 2;
    				npcs[i].endGfx = 1224;
    				npcs[i].projectileId = -1;
    			} else if (random == 1)
    				npcs[i].attackType = 0;
    			break;
    		case 2563: // star
    			npcs[i].attackType = 0;
    			break;
    		case 2564: // growler
    			npcs[i].attackType = 2;
    			npcs[i].projectileId = 1203;
    			break;
    		case 2565: // bree
    			npcs[i].attackType = 1;
    			npcs[i].projectileId = 9;
    			break;
    		// bandos npcs
    		case 2550:
    			random = Misc.random(2);
    			if (random == 0 || random == 1)
    				npcs[i].attackType = 0;
    			else {
    				npcs[i].attackType = 1;
    				npcs[i].endGfx = 1211;
    				npcs[i].projectileId = 288;
    			}
    			break;
    		case 2551:
    			npcs[i].attackType = 0;
    			break;
    		case 2552:
    			npcs[i].attackType = 2;
    			npcs[i].projectileId = 1203;
    			break;
    		case 2553:
    			npcs[i].attackType = 1;
    			npcs[i].projectileId = 1206;
    			break;
    		case 2025:
    			npcs[i].attackType = 2;
    			int r = Misc.random(3);
    			if (r == 0) {
    				npcs[i].gfx100(158);
    				npcs[i].projectileId = 159;
    				npcs[i].endGfx = 160;
    			}
    			if (r == 1) {
    				npcs[i].gfx100(161);
    				npcs[i].projectileId = 162;
    				npcs[i].endGfx = 163;
    			}
    			if (r == 2) {
    				npcs[i].gfx100(164);
    				npcs[i].projectileId = 165;
    				npcs[i].endGfx = 166;
    			}
    			if (r == 3) {
    				npcs[i].gfx100(155);
    				npcs[i].projectileId = 156;
    			}
    			break;
    		case 2881:// supreme
    			npcs[i].attackType = 1;
    			npcs[i].projectileId = 298;
    			break;
    
    		case 2882:// prime
    			npcs[i].attackType = 2;
    			npcs[i].projectileId = 162;
    			npcs[i].endGfx = 477;
    			break;
    
    		case 2028:
    			npcs[i].attackType = 1;
    			npcs[i].projectileId = 27;
    			break;
    
    		case 3200:
    			int r2 = Misc.random(1);
    			if (r2 == 0) {
    				npcs[i].attackType = 1;
    				npcs[i].gfx100(550);
    				npcs[i].projectileId = 551;
    				npcs[i].endGfx = 552;
    			} else {
    				npcs[i].attackType = 2;
    				npcs[i].gfx100(553);
    				npcs[i].projectileId = 554;
    				npcs[i].endGfx = 555;
    			}
    			break;
    		case 2745:
    			int r3 = 0;
    			if (goodDistance(npcs[i].absX, npcs[i].absY,
    					Server.playerHandler.players[npcs[i].spawnedBy].absX,
    					Server.playerHandler.players[npcs[i].spawnedBy].absY, 1))
    				r3 = Misc.random(2);
    			else
    				r3 = Misc.random(1);
    			if (r3 == 0) {
    				npcs[i].attackType = 2;
    				npcs[i].endGfx = 157;
    				npcs[i].projectileId = 448;
    			} else if (r3 == 1) {
    				npcs[i].attackType = 1;
    				npcs[i].endGfx = 451;
    				npcs[i].projectileId = -1;
    			} else if (r3 == 2) {
    				npcs[i].attackType = 0;
    				npcs[i].projectileId = -1;
    			}
    			break;
    		case 2743:
    			npcs[i].attackType = 2;
    			npcs[i].projectileId = 445;
    			npcs[i].endGfx = 446;
    			break;
    
    		case 2631:
    			npcs[i].attackType = 1;
    			npcs[i].projectileId = 443;
    			break;
    		}
    	}
    
    	/**
    	 * Distanced required to attack
    	 **/
    	public int distanceRequired(int i) {
    		switch (npcs[i].npcType) {
    		case 2025:
    		case 2028:
    			return 6;
    		case 50:
    		case 2562:
    			return 2;
    		case 2881:// dag kings
    		case 2882:
    		case 3200:// chaos ele
    		case 2743:
    		case 2631:
    		case 2745:
    			return 8;
    		case 2883:// rex
    			return 1;
    		case 2552:
    		case 2553:
    		case 2556:
    		case 2557:
    		case 2558:
    		case 2559:
    		case 2560:
    		case 2564:
    		case 2565:
    			return 9;
    			// things around dags
    		case 2892:
    		case 2894:
    			return 10;
    		default:
    			return 1;
    		}
    	}
    
    	public int followDistance(int i) {
    		switch (npcs[i].npcType) {
    		case 2550:
    		case 2551:
    		case 2562:
    		case 2563:
    			return 8;
    		case 2883:
    			return 4;
    		case 2881:
    		case 2882:
    			return 1;
    
    		}
    		return 0;
    
    	}
    
    	public int getProjectileSpeed(int i) {
    		switch (npcs[i].npcType) {
    		case 2881:
    		case 2882:
    		case 3200:
    			return 85;
    
    		case 2745:
    			return 130;
    
    		case 50:
    			return 90;
    
    		case 2025:
    			return 85;
    
    		case 2028:
    			return 80;
    
    		default:
    			return 85;
    		}
    	}
    
    	/**
    	 * NPC Attacking Player
    	 **/
    
    	public void attackPlayer(Client c, int i) {
    		if (npcs[i].lastX != npcs[i].getX()
    				|| npcs[i].lastY != npcs[i].getY()) {
    			return;
    		}
    		if (npcs[i] != null) {
    			if (npcs[i].isDead)
    				return;
    			if (!npcs[i].inMulti() && npcs[i].underAttackBy > 0
    					&& npcs[i].underAttackBy != c.playerId) {
    				npcs[i].killerId = 0;
    				return;
    			}
    			if (!npcs[i].inMulti()
    					&& (c.underAttackBy > 0 || (c.underAttackBy2 > 0 && c.underAttackBy2 != i))) {
    				npcs[i].killerId = 0;
    				return;
    			}
    			if (npcs[i].heightLevel != c.heightLevel) {
    				npcs[i].killerId = 0;
    				return;
    			}
    			npcs[i].facePlayer(c.playerId);
    			boolean special = false;// specialCase(c,i);
    			if (goodDistance(npcs[i].getX(), npcs[i].getY(), c.getX(),
    					c.getY(), distanceRequired(i)) || special) {
    				if (c.respawnTimer <= 0) {
    					npcs[i].facePlayer(c.playerId);
    					npcs[i].attackTimer = getNpcDelay(i);
    					npcs[i].hitDelayTimer = getHitDelay(i);
    					npcs[i].attackType = 0;
    					if (special)
    						loadSpell2(i);
    					else
    						loadSpell(i);
    					if (npcs[i].attackType == 3)
    						npcs[i].hitDelayTimer += 2;
    					if (multiAttacks(i)) {
    						multiAttackGfx(i, npcs[i].projectileId);
    						startAnimation(getAttackEmote(i), i);
    						npcs[i].oldIndex = c.playerId;
    						return;
    					}
    					if (npcs[i].projectileId > 0) {
    						int nX = Server.npcHandler.npcs[i].getX() + offset(i);
    						int nY = Server.npcHandler.npcs[i].getY() + offset(i);
    						int pX = c.getX();
    						int pY = c.getY();
    						int offX = (nY - pY) * -1;
    						int offY = (nX - pX) * -1;
    						c.getPA().createPlayersProjectile(nX, nY, offX, offY,
    								50, getProjectileSpeed(i),
    								npcs[i].projectileId, 43, 31, -c.getId() - 1,
    								65);
    					}
    					c.underAttackBy2 = i;
    					c.singleCombatDelay2 = System.currentTimeMillis();
    					npcs[i].oldIndex = c.playerId;
    					startAnimation(getAttackEmote(i), i);
    					c.getPA().removeAllWindows();
    				}
    			}
    		}
    	}
    
    	public int offset(int i) {
    		switch (npcs[i].npcType) {
    		case 50:
    			return 2;
    		case 2881:
    		case 2882:
    			return 1;
    		case 2745:
    		case 2743:
    			return 1;
    		}
    		return 0;
    	}
    
    	public boolean specialCase(Client c, int i) { // responsible for npcs that
    													// much
    		if (goodDistance(npcs[i].getX(), npcs[i].getY(), c.getX(), c.getY(), 8)
    				&& !goodDistance(npcs[i].getX(), npcs[i].getY(), c.getX(),
    						c.getY(), distanceRequired(i)))
    			return true;
    		return false;
    	}
    
    	public boolean retaliates(int npcType) {
    		return npcType < 3777 || npcType > 3780
    				&& !(npcType >= 2440 && npcType <= 2446);
    	}
    
    	public void applyDamage(int i) {
    		if (npcs[i] != null) {
    			if (Server.playerHandler.players[npcs[i].oldIndex] == null) {
    				return;
    			}
    			if (npcs[i].isDead)
    				return;
    			Client c = (Client) Server.playerHandler.players[npcs[i].oldIndex];
    			if (multiAttacks(i)) {
    				multiAttackDamage(i);
    				return;
    			}
    			if (c.playerIndex <= 0 && c.npcIndex <= 0)
    				if (c.autoRet == 1)
    					c.npcIndex = i;
    			if (c.attackTimer <= 3 || c.attackTimer == 0 && c.npcIndex == 0
    					&& c.oldNpcIndex == 0) {
    				c.startAnimation(c.getCombat().getBlockEmote());
    			}
    			if (c.respawnTimer <= 0) {
    				int damage = 0;
    				if (npcs[i].attackType == 0) {
    					damage = Misc.random(npcs[i].maxHit);
    					if (10 + Misc.random(c.getCombat().calculateMeleeDefence()) > Misc
    							.random(Server.npcHandler.npcs[i].attack)) {
    						damage = 0;
    					}
    					if (c.prayerActive[18]) { // protect from melee
    						damage = 0;
    					}
    					if (c.playerLevel[3] - damage < 0) {
    						damage = c.playerLevel[3];
    					}
    				}
    
    				if (npcs[i].attackType == 1) { // range
    					damage = Misc.random(npcs[i].maxHit);
    					if (10 + Misc.random(c.getCombat().calculateRangeDefence()) > Misc
    							.random(Server.npcHandler.npcs[i].attack)) {
    						damage = 0;
    					}
    					if (c.prayerActive[17]) { // protect from range
    						damage = 0;
    					}
    					if (c.playerLevel[3] - damage < 0) {
    						damage = c.playerLevel[3];
    					}
    				}
    
    				if (npcs[i].attackType == 2) { // magic
    					damage = Misc.random(npcs[i].maxHit);
    					boolean magicFailed = false;
    					if (10 + Misc.random(c.getCombat().mageDef()) > Misc
    							.random(Server.npcHandler.npcs[i].attack)) {
    						damage = 0;
    						magicFailed = true;
    					}
    					if (c.prayerActive[16]) { // protect from magic
    						damage = 0;
    						magicFailed = true;
    					}
    					if (c.playerLevel[3] - damage < 0) {
    						damage = c.playerLevel[3];
    					}
    					if (npcs[i].endGfx > 0
    							&& (!magicFailed || isFightCaveNpc(i))) {
    						c.gfx100(npcs[i].endGfx);
    					} else {
    						c.gfx100(85);
    					}
    				}
    
    				if (npcs[i].attackType == 3) { // fire breath
    					int anti = c.getPA().antiFire();
    					if (anti == 0) {
    						damage = Misc.random(30) + 10;
    						c.sendMessage("You are badly burnt by the dragon fire!");
    					} else if (anti == 1)
    						damage = Misc.random(20);
    					else if (anti == 2)
    						damage = Misc.random(5);
    					if (c.playerLevel[3] - damage < 0)
    						damage = c.playerLevel[3];
    					c.gfx100(npcs[i].endGfx);
    				}
    				handleSpecialEffects(c, i, damage);
    				c.logoutDelay = System.currentTimeMillis(); // logout delay
    				// c.setHitDiff(damage);
    				c.handleHitMask(damage);
    				c.playerLevel[3] -= damage;
    				c.getPA().refreshSkill(3);
    				c.updateRequired = true;
    				// c.setHitUpdateRequired(true);
    			}
    		}
    	}
    
    	public void handleSpecialEffects(Client c, int i, int damage) {
    		if (npcs[i].npcType == 2892 || npcs[i].npcType == 2894) {
    			if (damage > 0) {
    				if (c != null) {
    					if (c.playerLevel[5] > 0) {
    						c.playerLevel[5]--;
    						c.getPA().refreshSkill(5);
    						c.getPA().appendPoison(12);
    					}
    				}
    			}
    		}
    
    	}
    
    	public void startAnimation(int animId, int i) {
    		npcs[i].animNumber = animId;
    		npcs[i].animUpdateRequired = true;
    		npcs[i].updateRequired = true;
    	}
    
    	public boolean goodDistance(int objectX, int objectY, int playerX, int playerY, int distance) {
    		for (int i = 0; i <= distance; i++) {
    		  for (int j = 0; j <= distance; j++) {
    			if ((objectX + i) == playerX && ((objectY + j) == playerY || (objectY - j) == playerY || objectY == playerY)) {
    				return true;
    			} else if ((objectX - i) == playerX && ((objectY + j) == playerY || (objectY - j) == playerY || objectY == playerY)) {
    				return true;
    			} else if (objectX == playerX && ((objectY + j) == playerY || (objectY - j) == playerY || objectY == playerY)) {
    				return true;
    			}
    		  }
    		}
    		return false;
    	}
    
    
    	public int getMaxHit(int i) {
    		switch (npcs[i].npcType) {
    		case 2558:
    			if (npcs[i].attackType == 2)
    				return 28;
    			else
    				return 68;
    		case 2562:
    			return 31;
    		case 2550:
    			return 36;
    		}
    		return 1;
    	}
    
    	public boolean loadAutoSpawn(String FileName) {
    		String line = "";
    		String token = "";
    		String token2 = "";
    		String token2_2 = "";
    		String[] token3 = new String[10];
    		boolean EndOfFile = false;
    		int ReadMode = 0;
    		BufferedReader characterfile = null;
    		try {
    			characterfile = new BufferedReader(new FileReader("./" + FileName));
    		} catch (FileNotFoundException fileex) {
    			Misc.println(FileName + ": file not found.");
    			return false;
    		}
    		try {
    			line = characterfile.readLine();
    		} catch (IOException ioexception) {
    			Misc.println(FileName + ": error loading file.");
    			return false;
    		}
    		while (EndOfFile == false && line != null) {
    			line = line.trim();
    			int spot = line.indexOf("=");
    			if (spot > -1) {
    				token = line.substring(0, spot);
    				token = token.trim();
    				token2 = line.substring(spot + 1);
    				token2 = token2.trim();
    				token2_2 = token2.replaceAll("\t\t", "\t");
    				token2_2 = token2_2.replaceAll("\t\t", "\t");
    				token2_2 = token2_2.replaceAll("\t\t", "\t");
    				token2_2 = token2_2.replaceAll("\t\t", "\t");
    				token2_2 = token2_2.replaceAll("\t\t", "\t");
    				token3 = token2_2.split("\t");
    				if (token.equals("spawn")) {
    					newNPC(Integer.parseInt(token3[0]),
    							Integer.parseInt(token3[1]),
    							Integer.parseInt(token3[2]),
    							Integer.parseInt(token3[3]),
    							Integer.parseInt(token3[4]),
    							getNpcListHP(Integer.parseInt(token3[0])),
    							Integer.parseInt(token3[5]),
    							Integer.parseInt(token3[6]),
    							Integer.parseInt(token3[7]));
    
    				}
    			} else {
    				if (line.equals("[ENDOFSPAWNLIST]")) {
    					try {
    						characterfile.close();
    					} catch (IOException ioexception) {
    					}
    					return true;
    				}
    			}
    			try {
    				line = characterfile.readLine();
    			} catch (IOException ioexception1) {
    				EndOfFile = true;
    			}
    		}
    		try {
    			characterfile.close();
    		} catch (IOException ioexception) {
    		}
    		return false;
    	}
    
    	public int getNpcListHP(int npcId) {
    		for (int i = 0; i < maxListedNPCs; i++) {
    			if (NpcList[i] != null) {
    				if (NpcList[i].npcId == npcId) {
    					return NpcList[i].npcHealth;
    				}
    			}
    		}
    		return 0;
    	}
    
    	public String getNpcListName(int npcId) {
    		for (int i = 0; i < maxListedNPCs; i++) {
    			if (NpcList[i] != null) {
    				if (NpcList[i].npcId == npcId) {
    					return NpcList[i].npcName;
    				}
    			}
    		}
    		return "nothing";
    	}
    
    	public boolean loadNPCList(String FileName) {
    		String line = "";
    		String token = "";
    		String token2 = "";
    		String token2_2 = "";
    		String[] token3 = new String[10];
    		boolean EndOfFile = false;
    		int ReadMode = 0;
    		BufferedReader characterfile = null;
    		try {
    			characterfile = new BufferedReader(new FileReader("./" + FileName));
    		} catch (FileNotFoundException fileex) {
    			Misc.println(FileName + ": file not found.");
    			return false;
    		}
    		try {
    			line = characterfile.readLine();
    		} catch (IOException ioexception) {
    			Misc.println(FileName + ": error loading file.");
    			return false;
    		}
    		while (EndOfFile == false && line != null) {
    			line = line.trim();
    			int spot = line.indexOf("=");
    			if (spot > -1) {
    				token = line.substring(0, spot);
    				token = token.trim();
    				token2 = line.substring(spot + 1);
    				token2 = token2.trim();
    				token2_2 = token2.replaceAll("\t\t", "\t");
    				token2_2 = token2_2.replaceAll("\t\t", "\t");
    				token2_2 = token2_2.replaceAll("\t\t", "\t");
    				token2_2 = token2_2.replaceAll("\t\t", "\t");
    				token2_2 = token2_2.replaceAll("\t\t", "\t");
    				token3 = token2_2.split("\t");
    				if (token.equals("npc")) {
    					newNPCList(Integer.parseInt(token3[0]), token3[1],
    							Integer.parseInt(token3[2]),
    							Integer.parseInt(token3[3]));
    				}
    			} else {
    				if (line.equals("[ENDOFNPCLIST]")) {
    					try {
    						characterfile.close();
    					} catch (IOException ioexception) {
    					}
    					return true;
    				}
    			}
    			try {
    				line = characterfile.readLine();
    			} catch (IOException ioexception1) {
    				EndOfFile = true;
    			}
    		}
    		try {
    			characterfile.close();
    		} catch (IOException ioexception) {
    		}
    		return false;
    	}
    
    }
    Edit: My npcs that are set up in my spawn.cfg to walk, are not walking. They are stationary.
    Reply With Quote  
     

  2. #2  
    Registered Member
    Join Date
    Apr 2009
    Posts
    38
    Thanks given
    1
    Thanks received
    1
    Rep Power
    0
    Yes, they did. Except they walked through everything.
    Reply With Quote  
     

  3. #3  
    Registered Member
    Join Date
    Apr 2013
    Age
    30
    Posts
    117
    Thanks given
    12
    Thanks received
    24
    Rep Power
    0
    you would have fked something up so the entire map is clipped thus stopping the npcs for walking at all because it sees the tile as none-walkable.

    just root through the code and find where your clipping and fix it
    Reply With Quote  
     

  4. #4  
    Registered Member
    Join Date
    Apr 2009
    Posts
    38
    Thanks given
    1
    Thanks received
    1
    Rep Power
    0
    bump, any help?
    Reply With Quote  
     


Thread Information
Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)


User Tag List

Similar Threads

  1. Replies: 2
    Last Post: 12-27-2011, 04:00 AM
  2. [PI]NPC clipped following & Walking
    By Kalle in forum Buying
    Replies: 4
    Last Post: 07-20-2011, 03:51 AM
  3. Replies: 2
    Last Post: 04-14-2011, 09:31 PM
  4. [PI] Npc clipping
    By MetalGear in forum Help
    Replies: 7
    Last Post: 09-04-2010, 10:31 AM
  5. Replies: 1
    Last Post: 07-30-2010, 08:39 PM
Posting Permissions
  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •