Explorar o código

Core support for new AiData. Rework + cleanup some parts. Hope i didnt miss any file.

JIV %!s(int64=15) %!d(string=hai) anos
pai
achega
0c29e7f3f9

+ 0 - 5
L2_GameServer/java/com/l2jserver/gameserver/GameServer.java

@@ -243,11 +243,6 @@ public class GameServer
 		ClanTable.getInstance();
 		
 		NpcTable.getInstance();
-		if (!NpcTable.getInstance().isInitialized())
-		{
-			_log.severe("Could not find the extraced files. Please Check Your Data.");
-			throw new Exception("Could not initialize the npc table");
-		}
 		
 		HennaTable.getInstance();
 		HennaTreeTable.getInstance();

+ 8 - 50
L2_GameServer/java/com/l2jserver/gameserver/ai/L2AttackableAI.java

@@ -77,9 +77,6 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 
 	/** The flag used to indicate that a thinking action is in progress */
 	private boolean _thinking; // to prevent recursive thinking
-	
-	private String clan;
-	private String enemyClan;
 
 	private int timepass = 0;
 	private int chaostime = 0;
@@ -98,8 +95,6 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 		//_selfAnalysis.init();
 		_attackTimeout = Integer.MAX_VALUE;
 		_globalAggro = -10; // 10 seconds timeout of ATTACK after respawn
-		if (((L2Attackable)_actor).getEnemyClan() != "none")
-			setEnemyClan(((L2Attackable)_actor).getEnemyClan());
 	}
 
 	public void run()
@@ -148,11 +143,6 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 			
 		L2Attackable me = (L2Attackable) _actor;
 
-		if(target instanceof L2Attackable)
-		{
-			setClan(((L2Attackable)target).getClan());
-		}
-
 			
 		// Check if the target isn't invulnerable
 		if (target.isInvul())
@@ -168,8 +158,8 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 		if (target instanceof L2DoorInstance) return false;
 
 		// Check if the target isn't dead, is in the Aggro range and is at the same height
-		if (target.isAlikeDead() || (target instanceof L2PcInstance && !me.isInsideRadius(target, me.getAggroRange(), false, false)) 
-				|| Math.abs(me.getZ() - target.getZ()) > 300 || (target instanceof L2Summon && !me.isInsideRadius(target, me.getAggroRange(), false, false))) return false;
+		if (target.isAlikeDead() || (target instanceof L2Playable && !me.isInsideRadius(target, me.getAggroRange(), true, false))) 
+				return false;
 
 		// Check if the target is a L2PlayableInstance
 		if (target instanceof L2Playable)
@@ -265,7 +255,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 		{
 			if(target instanceof L2Attackable)
 			{
-				if ("none".equals(((L2Attackable)_actor).getEnemyClan()) || "none".equals(((L2Attackable)target).getClan()))
+				if (((L2Attackable)_actor).getEnemyClan() == null || ((L2Attackable)target).getClan() == null)
 					return false;
 				
 				if (((L2Attackable)_actor).getEnemyClan().equals(((L2Attackable)target).getClan()))
@@ -1995,7 +1985,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 					}
 					if(obj instanceof L2Attackable)
 					{
-						if(((L2Attackable)_actor).getEnemyClan() != null && (((L2Attackable)_actor).getEnemyClan().equals(((L2Attackable)obj).getClan())) && !"none".equals(((L2Attackable)_actor).getEnemyClan()))
+						if(((L2Attackable)_actor).getEnemyClan() != null && ((L2Attackable)_actor).getEnemyClan().equals(((L2Attackable)obj).getClan()))
 						{
 							if(dist2<=range)
 							{
@@ -2075,7 +2065,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 				}
 				if(obj instanceof L2Attackable)
 				{
-					if(((L2Attackable)_actor).getEnemyClan() != null && (((L2Attackable)_actor).getEnemyClan().equals(((L2Attackable)obj).getClan())) && !"none".equals(((L2Attackable)_actor).getEnemyClan()))
+					if(((L2Attackable)_actor).getEnemyClan() != null && ((L2Attackable)_actor).getEnemyClan().equals(((L2Attackable)obj).getClan()))
 					{
 						if(dist2<=range)
 						{
@@ -2158,7 +2148,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 				}
 				if(obj instanceof L2Attackable)
 				{
-					if(((L2Attackable)_actor).getEnemyClan() != null && (((L2Attackable)_actor).getEnemyClan().equals(((L2Attackable)obj).getClan())) && !"none".equals(((L2Attackable)_actor).getEnemyClan()))
+					if(((L2Attackable)_actor).getEnemyClan() != null && ((L2Attackable)_actor).getEnemyClan().equals(((L2Attackable)obj).getClan()))
 					{
 						return obj;
 					}
@@ -2238,7 +2228,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 				}
 				else if(obj instanceof L2Attackable)
 				{
-					if(((L2Attackable)_actor).getEnemyClan() != null && (((L2Attackable)_actor).getEnemyClan().equals(((L2Attackable)obj).getClan())) && !"none".equals(((L2Attackable)_actor).getEnemyClan()))
+					if(((L2Attackable)_actor).getEnemyClan() != null && ((L2Attackable)_actor).getEnemyClan().equals(((L2Attackable)obj).getClan()))
 					{
 						actor.addDamageHate(obj,0,actor.getHating(MostHate));
 						_actor.setTarget(obj);
@@ -2339,7 +2329,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 				}
 				else if(obj instanceof L2Attackable)
 				{
-					if(((L2Attackable)_actor).getEnemyClan() != null && (((L2Attackable)_actor).getEnemyClan().equals(((L2Attackable)obj).getClan())) && !"none".equals(((L2Attackable)_actor).getEnemyClan()))
+					if(((L2Attackable)_actor).getEnemyClan() != null && (((L2Attackable)_actor).getEnemyClan().equals(((L2Attackable)obj).getClan())))
 					{
 						if(MostHate != null)
 							actor.addDamageHate(obj,actor.getHating(MostHate),actor.getHating(MostHate));
@@ -2501,38 +2491,6 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 		_globalAggro = value;
 	}
 
-	/**
-	 * @param clan The clan to set.
-	 */
-	public void setClan(String CL)
-	{
-		this.clan = CL;
-	}
-
-	/**
-	 * @return Returns the clan.
-	 */
-	public String getClan()
-	{
-		return clan;
-	}
-
-	/**
-	 * @param enemyClan The enemyClan to set.
-	 */
-	public void setEnemyClan(String EC)
-	{
-		this.enemyClan = EC;
-	}
-
-	/**
-	 * @return Returns the enemyClan.
-	 */
-	public String getEnemyClan()
-	{
-		return enemyClan;
-	}
-
 	/**
 	 * @param timepass The timepass to set.
 	 */

+ 3 - 3
L2_GameServer/java/com/l2jserver/gameserver/ai/L2CharacterAI.java

@@ -1215,7 +1215,7 @@ public class L2CharacterAI extends AbstractAI
 		
 		public void init()
 		{
-			switch (((L2NpcTemplate) _actor.getTemplate()).AI)
+			switch (((L2NpcTemplate) _actor.getTemplate()).getAIDataStatic().getAiType())
 			{
 				case FIGHTER:
 					isFighter = true;
@@ -1446,7 +1446,7 @@ public class L2CharacterAI extends AbstractAI
 		    				L2Npc targets = ((L2Npc)target);
 		    				L2Npc actors = ((L2Npc)_actor);
 		    				
-		    				if(targets.getEnemyClan() == null || actors.getClan() == null || !targets.getEnemyClan().equals(actors.getClan()) || ("none".equals(actors.getClan()) && actors.getIsChaos() == 0))
+		    				if(targets.getEnemyClan() == null || actors.getClan() == null || !targets.getEnemyClan().equals(actors.getClan()) || (actors.getClan() == null && actors.getIsChaos() == 0))
 		    					continue;
 		    			}
 		    			L2Effect[] effects = target.getAllEffects();
@@ -1476,7 +1476,7 @@ public class L2CharacterAI extends AbstractAI
 		    			{
 		    				L2Npc targets = ((L2Npc)target);
 		    				L2Npc actors = ((L2Npc)_actor);
-		    				if(targets.getEnemyClan() == null || actors.getClan() == null || !targets.getEnemyClan().equals(actors.getClan()) || (("none".equals(actors.getClan())) && actors.getIsChaos() == 0))
+		    				if(targets.getEnemyClan() == null || actors.getClan() == null || !targets.getEnemyClan().equals(actors.getClan()) || (actors.getClan() == null && actors.getIsChaos() == 0))
 		    					continue;
 		    			}
 		    			L2Effect[] effects = target.getAllEffects();

+ 78 - 87
L2_GameServer/java/com/l2jserver/gameserver/datatables/NpcTable.java

@@ -14,6 +14,8 @@
  */
 package com.l2jserver.gameserver.datatables;
 
+import gnu.trove.TIntObjectHashMap;
+
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -50,8 +52,7 @@ public class NpcTable
 {
 	private static Logger _log = Logger.getLogger(NpcTable.class.getName());
 	
-	private Map<Integer, L2NpcTemplate> _npcs;
-	private boolean _initialized = false;
+	private TIntObjectHashMap<L2NpcTemplate> _npcs;
 	
 	public static NpcTable getInstance()
 	{
@@ -60,7 +61,7 @@ public class NpcTable
 	
 	private NpcTable()
 	{
-		_npcs = new FastMap<Integer, L2NpcTemplate>();
+		_npcs = new TIntObjectHashMap<L2NpcTemplate>();
 		
 		restoreNpcData();
 	}
@@ -80,7 +81,7 @@ public class NpcTable
 								"title", "serverSideTitle", "class", "collision_radius", "collision_height", "level", "sex", "type",
 								"attackrange", "hp", "mp", "hpreg", "mpreg", "str", "con", "dex", "int", "wit", "men", "exp", "sp", "patk",
 								"pdef", "matk", "mdef", "atkspd", "aggro", "matkspd", "rhand", "lhand", "armor", "enchant", "walkspd", "runspd",
-								"faction_id", "faction_range", "isUndead", "absorb_level", "absorb_type", "AI",
+								"isUndead", "absorb_level", "absorb_type",
 								"drop_herbs" }) + " FROM npc");
 				ResultSet npcdata = statement.executeQuery();
 				
@@ -103,7 +104,7 @@ public class NpcTable
 									"title", "serverSideTitle", "class", "collision_radius", "collision_height", "level", "sex", "type",
 									"attackrange", "hp", "mp", "hpreg", "mpreg", "str", "con", "dex", "int", "wit", "men", "exp", "sp",
 									"patk", "pdef", "matk", "mdef", "atkspd", "aggro", "matkspd", "rhand", "lhand", "armor", "enchant", "walkspd",
-									"runspd", "faction_id", "faction_range", "isUndead", "absorb_level", "absorb_type", "AI",
+									"runspd", "isUndead", "absorb_level", "absorb_type",
 									"drop_herbs" }) + " FROM custom_npc");
 					ResultSet npcdata = statement.executeQuery();
 					
@@ -130,7 +131,10 @@ public class NpcTable
 					npcDat = _npcs.get(mobId);
 					
 					if (npcDat == null)
+					{
+						_log.warning("NPCTable: Skill data for undefined NPC. npcId: " + mobId);
 						continue;
+					}
 					
 					int skillId = npcskills.getInt("skillid");
 					int level = npcskills.getInt("level");
@@ -299,65 +303,64 @@ public class NpcTable
 				_log.log(Level.SEVERE, "NPCTable: Error loading minion data.", e);
 			}
 			
-		     
-            
-            
-            //-------------------------------------------------------------------
-            //NPC AI Attributes & Data ...
-            
+			//-------------------------------------------------------------------
+			//NPC AI Attributes & Data ...
+			
 			try 
-            {
-			    PreparedStatement statement10 = con.prepareStatement("SELECT " + L2DatabaseFactory.getInstance().safetyString(new String[] 
-			    {"npc_id", "primary_attack","skill_chance","canMove","soulshot","spiritshot","sschance","spschance","minrangeskill","minrangechance","maxrangeskill","maxrangechance","ischaos","clan","enemyClan","enemyRange","ai_type","dodge"}) + " FROM npcAIData ORDER BY npc_id");
-			    ResultSet NpcAIDataTable = statement10.executeQuery();
-			    L2NpcAIData npcAIDat = null;
-			    L2NpcTemplate npcDat = null;
-			    int cont=0;
-			    while (NpcAIDataTable.next())
-			    {
-			        int npc_id = NpcAIDataTable.getInt("npc_id");
-			        npcDat = _npcs.get(npc_id);
-                    if (npcDat == null)
-                    {
-                        _log.severe("NPCTable: AI Data Error with id : " + npc_id);
-                        continue;
-                    }
-                    npcAIDat = new L2NpcAIData();
-			        
-                    npcAIDat.setPrimaryAttack(NpcAIDataTable.getInt("primary_attack"));
-                    npcAIDat.setSkillChance(NpcAIDataTable.getInt("skill_chance"));
-                    npcAIDat.setCanMove(NpcAIDataTable.getInt("canMove"));
-                    npcAIDat.setSoulShot(NpcAIDataTable.getInt("soulshot"));
-                    npcAIDat.setSpiritShot(NpcAIDataTable.getInt("spiritshot"));
-                    npcAIDat.setSoulShotChance(NpcAIDataTable.getInt("sschance"));
-                    npcAIDat.setSpiritShotChance(NpcAIDataTable.getInt("spschance"));
-                    npcAIDat.setIsChaos(NpcAIDataTable.getInt("ischaos"));
-                    npcAIDat.setShortRangeSkill(NpcAIDataTable.getInt("minrangeskill"));
-                    npcAIDat.setShortRangeChance(NpcAIDataTable.getInt("minrangechance"));
-                    npcAIDat.setLongRangeSkill(NpcAIDataTable.getInt("maxrangeskill"));
-                    npcAIDat.setLongRangeChance(NpcAIDataTable.getInt("maxrangechance"));
-                    //npcAIDat.setSwitchRangeChance(NpcAIDataTable.getInt("rangeswitchchance"));
-                    npcAIDat.setClan(NpcAIDataTable.getString("clan"));
-                    npcAIDat.setEnemyClan(NpcAIDataTable.getString("enemyClan"));
-                    npcAIDat.setEnemyRange(NpcAIDataTable.getInt("enemyRange"));
-                    npcAIDat.setDodge(NpcAIDataTable.getInt("dodge"));
-                    //npcAIDat.setBaseShldRate(NpcAIDataTable.getInt("baseShldRate"));
-                    //npcAIDat.setBaseShldDef(NpcAIDataTable.getInt("baseShldDef"));
-
-                    
-                    //npcDat.addAIData(npcAIDat);
-                    npcDat.setAIData(npcAIDat);
-		            cont++;
-			    }
-
-			    NpcAIDataTable.close();
-    			statement10.close();
+			{
+				PreparedStatement statement10 = con.prepareStatement("SELECT " + L2DatabaseFactory.getInstance().safetyString(new String[] 
+				                                                                                                                         {"npc_id", "primary_attack","skill_chance","canMove","soulshot","spiritshot","sschance","spschance","minrangeskill","minrangechance","maxrangeskill","maxrangechance","ischaos","clan","clan_range","enemyClan","enemyRange","ai_type","dodge"}) + " FROM npcAIData ORDER BY npc_id");
+				ResultSet NpcAIDataTable = statement10.executeQuery();
+				L2NpcAIData npcAIDat = null;
+				L2NpcTemplate npcDat = null;
+				int cont=0;
+				while (NpcAIDataTable.next())
+				{
+					int npc_id = NpcAIDataTable.getInt("npc_id");
+					npcDat = _npcs.get(npc_id);
+					if (npcDat == null)
+					{
+						_log.severe("NPCTable: AI Data Error with id : " + npc_id);
+						continue;
+					}
+					npcAIDat = new L2NpcAIData();
+					
+					npcAIDat.setPrimaryAttack(NpcAIDataTable.getInt("primary_attack"));
+					npcAIDat.setSkillChance(NpcAIDataTable.getInt("skill_chance"));
+					npcAIDat.setCanMove(NpcAIDataTable.getInt("canMove"));
+					npcAIDat.setSoulShot(NpcAIDataTable.getInt("soulshot"));
+					npcAIDat.setSpiritShot(NpcAIDataTable.getInt("spiritshot"));
+					npcAIDat.setSoulShotChance(NpcAIDataTable.getInt("sschance"));
+					npcAIDat.setSpiritShotChance(NpcAIDataTable.getInt("spschance"));
+					npcAIDat.setIsChaos(NpcAIDataTable.getInt("ischaos"));
+					npcAIDat.setShortRangeSkill(NpcAIDataTable.getInt("minrangeskill"));
+					npcAIDat.setShortRangeChance(NpcAIDataTable.getInt("minrangechance"));
+					npcAIDat.setLongRangeSkill(NpcAIDataTable.getInt("maxrangeskill"));
+					npcAIDat.setLongRangeChance(NpcAIDataTable.getInt("maxrangechance"));
+					//npcAIDat.setSwitchRangeChance(NpcAIDataTable.getInt("rangeswitchchance"));
+					npcAIDat.setClan(NpcAIDataTable.getString("clan"));
+					npcAIDat.setClanRange(NpcAIDataTable.getInt("clan_range"));
+					npcAIDat.setEnemyClan(NpcAIDataTable.getString("enemyClan"));
+					npcAIDat.setEnemyRange(NpcAIDataTable.getInt("enemyRange"));
+					npcAIDat.setDodge(NpcAIDataTable.getInt("dodge"));
+					npcAIDat.setAi(NpcAIDataTable.getString("ai_type"));
+					//npcAIDat.setBaseShldRate(NpcAIDataTable.getInt("baseShldRate"));
+					//npcAIDat.setBaseShldDef(NpcAIDataTable.getInt("baseShldDef"));
+					
+					
+					//npcDat.addAIData(npcAIDat);
+					npcDat.setAIData(npcAIDat);
+					cont++;
+				}
+				
+				NpcAIDataTable.close();
+				statement10.close();
 				_log.config("NPC AI Data Table: Loaded " + cont + " AI Data.");
 			} 
-            catch (Exception e) {
+			catch (Exception e) {
 				_log.severe("NPCTable: Error reading NPC AI Data: " + e);
 			}
-            
+			
 		}
 		finally
 		{
@@ -370,8 +373,6 @@ public class NpcTable
 				// nothing
 			}
 		}
-		
-		_initialized = true;
 	}
 	
 	private void fillNpcTable(ResultSet NpcData, boolean customData) throws Exception
@@ -435,16 +436,11 @@ public class NpcTable
 			npcDat.set("baseMAtk", NpcData.getInt("matk"));
 			npcDat.set("baseMDef", NpcData.getInt("mdef"));
 			
-			npcDat.set("factionId", NpcData.getString("faction_id"));
-			npcDat.set("factionRange", NpcData.getInt("faction_range"));
-			
 			npcDat.set("isUndead", NpcData.getString("isUndead"));
 			
 			npcDat.set("absorb_level", NpcData.getString("absorb_level"));
 			npcDat.set("absorb_type", NpcData.getString("absorb_type"));
 			
-			npcDat.set("AI", NpcData.getString("AI"));
-			
 			npcDat.set("drop_herbs", Boolean.valueOf(NpcData.getString("drop_herbs")));
 			
 			L2NpcTemplate template = new L2NpcTemplate(npcDat);
@@ -497,8 +493,8 @@ public class NpcTable
 					+ L2DatabaseFactory.getInstance().safetyString(new String[] { "id", "idTemplate", "name", "serverSideName", "title",
 							"serverSideTitle", "class", "collision_radius", "collision_height", "level", "sex", "type", "attackrange",
 							"hp", "mp", "hpreg", "mpreg", "str", "con", "dex", "int", "wit", "men", "exp", "sp", "patk", "pdef", "matk",
-							"mdef", "atkspd", "aggro", "matkspd", "rhand", "lhand", "armor", "enchant", "walkspd", "runspd", "faction_id",
-							"faction_range", "isUndead", "absorb_level", "absorb_type", "AI", "drop_herbs" })
+							"mdef", "atkspd", "aggro", "matkspd", "rhand", "lhand", "armor", "enchant", "walkspd", "runspd",
+							"isUndead", "absorb_level", "absorb_type", "drop_herbs" })
 					+ " FROM npc WHERE id=?");
 			st.setInt(1, id);
 			ResultSet rs = st.executeQuery();
@@ -510,7 +506,7 @@ public class NpcTable
 								"title", "serverSideTitle", "class", "collision_radius", "collision_height", "level", "sex", "type",
 								"attackrange", "hp", "mp", "hpreg", "mpreg", "str", "con", "dex", "int", "wit", "men", "exp", "sp", "patk",
 								"pdef", "matk", "mdef", "atkspd", "aggro", "matkspd", "rhand", "lhand", "armor", "enchant", "walkspd", "runspd",
-								"faction_id", "faction_range", "isUndead", "absorb_level", "absorb_type", "AI",
+								"isUndead", "absorb_level", "absorb_type",
 								"drop_herbs" }) + " FROM custom_npc WHERE id=?");
 				st.setInt(1, id);
 				rs = st.executeQuery();
@@ -630,12 +626,7 @@ public class NpcTable
 			}
 		}
 	}
-	
-	public boolean isInitialized()
-	{
-		return _initialized;
-	}
-	
+
 	public void replaceTemplate(L2NpcTemplate npc)
 	{
 		_npcs.put(npc.npcId, npc);
@@ -648,9 +639,9 @@ public class NpcTable
 	
 	public L2NpcTemplate getTemplateByName(String name)
 	{
-		for (L2NpcTemplate npcTemplate : _npcs.values())
-			if (npcTemplate.name.equalsIgnoreCase(name))
-				return npcTemplate;
+		for (Object npcTemplate : _npcs.getValues())
+			if (((L2NpcTemplate)npcTemplate).name.equalsIgnoreCase(name))
+				return (L2NpcTemplate) npcTemplate;
 		
 		return null;
 	}
@@ -659,9 +650,9 @@ public class NpcTable
 	{
 		List<L2NpcTemplate> list = new FastList<L2NpcTemplate>();
 		
-		for (L2NpcTemplate t : _npcs.values())
-			if (t.level == lvl)
-				list.add(t);
+		for (Object t : _npcs.getValues())
+			if (((L2NpcTemplate)t).level == lvl)
+				list.add((L2NpcTemplate) t);
 		
 		return list.toArray(new L2NpcTemplate[list.size()]);
 	}
@@ -670,9 +661,9 @@ public class NpcTable
 	{
 		List<L2NpcTemplate> list = new FastList<L2NpcTemplate>();
 		
-		for (L2NpcTemplate t : _npcs.values())
-			if (t.level == lvl && "L2Monster".equals(t.type))
-				list.add(t);
+		for (Object t : _npcs.getValues())
+			if (((L2NpcTemplate)t).level == lvl && "L2Monster".equals(((L2NpcTemplate)t).type))
+				list.add((L2NpcTemplate) t);
 		
 		return list.toArray(new L2NpcTemplate[list.size()]);
 	}
@@ -681,9 +672,9 @@ public class NpcTable
 	{
 		List<L2NpcTemplate> list = new FastList<L2NpcTemplate>();
 		
-		for (L2NpcTemplate t : _npcs.values())
-			if (t.name.startsWith(letter) && "L2Npc".equals(t.type))
-				list.add(t);
+		for (Object t : _npcs.getValues())
+			if (((L2NpcTemplate)t).name.startsWith(letter) && "L2Npc".equals(((L2NpcTemplate)t).type))
+				list.add((L2NpcTemplate) t);
 		
 		return list.toArray(new L2NpcTemplate[list.size()]);
 	}

+ 39 - 6
L2_GameServer/java/com/l2jserver/gameserver/model/L2NpcAIData.java

@@ -18,6 +18,8 @@
  */
 package com.l2jserver.gameserver.model;
 
+import com.l2jserver.gameserver.templates.chars.L2NpcTemplate.AIType;
+
 import javolution.util.FastList;
 
 /**
@@ -45,6 +47,7 @@ public class L2NpcAIData
 	private int _spiritshotchance;
 	private int _ischaos;
 	private String _clan;
+	private int _clanRange;
 	private String _enemyClan;
 	private int _enemyRange;
 	//private int _baseShldRate;
@@ -55,6 +58,7 @@ public class L2NpcAIData
 	private int _longrangechance;
 	private int _shortrangechance;
 	private int _switchrangechance;
+	private AIType _aiType = AIType.FIGHTER;
 	
 	//Skill AI
 	public FastList<L2Skill> _buffskills;
@@ -170,16 +174,19 @@ public class L2NpcAIData
 	
 	public void setClan(String clan)
 	{
-		
-		_clan = clan;
-		
+		if (clan != null && !clan.equals("") && !clan.equalsIgnoreCase("null"))
+			_clan = clan;
+	}
+	
+	public void setClanRange(int clanRange)
+	{
+		_clanRange = clanRange;
 	}
 	
 	public void setEnemyClan(String enemyClan)
 	{
-		
-		_enemyClan = enemyClan;
-		
+		if (enemyClan != null && !enemyClan.equals("") && !enemyClan.equalsIgnoreCase("null"))
+			_enemyClan = enemyClan;
 	}
 	
 	public void setEnemyRange(int enemyRange)
@@ -194,6 +201,22 @@ public class L2NpcAIData
 		_dodge = dodge;
 	}
 	
+	public void setAi(String ai)
+	{
+		if (ai.equalsIgnoreCase("archer"))
+			_aiType = AIType.ARCHER;
+		else if (ai.equalsIgnoreCase("balanced"))
+			_aiType = AIType.BALANCED;
+		else if (ai.equalsIgnoreCase("mage"))
+			_aiType = AIType.MAGE;
+		else if (ai.equalsIgnoreCase("healer"))
+			_aiType = AIType.HEALER;
+		else if (ai.equalsIgnoreCase("corpse"))
+			_aiType = AIType.CORPSE;
+		else
+			_aiType = AIType.FIGHTER;
+	}
+	
 	/*
 	
 	public void setBaseShldRate (int baseShldRate)
@@ -312,6 +335,11 @@ public class L2NpcAIData
 		
 	}
 	
+	public int getClanRange()
+	{
+		return _clanRange;
+	}
+	
 	public String getEnemyClan()
 	{
 		
@@ -333,6 +361,11 @@ public class L2NpcAIData
 		
 	}
 	
+	public AIType getAiType()
+	{
+		return _aiType;	
+	}
+	
 	/*
 	
 	public int getBaseShldRate ()

+ 6 - 2
L2_GameServer/java/com/l2jserver/gameserver/model/actor/L2Character.java

@@ -103,6 +103,7 @@ import com.l2jserver.gameserver.skills.funcs.Func;
 import com.l2jserver.gameserver.skills.l2skills.L2SkillAgathion;
 import com.l2jserver.gameserver.skills.l2skills.L2SkillMount;
 import com.l2jserver.gameserver.skills.l2skills.L2SkillSummon;
+import com.l2jserver.gameserver.taskmanager.AttackStanceTaskManager;
 import com.l2jserver.gameserver.templates.chars.L2CharTemplate;
 import com.l2jserver.gameserver.templates.chars.L2NpcTemplate;
 import com.l2jserver.gameserver.templates.item.L2Weapon;
@@ -935,7 +936,10 @@ public abstract class L2Character extends L2Object
 
         // Flag the attacker if it's a L2PcInstance outside a PvP area
         L2PcInstance player = getActingPlayer();
-
+        
+        if (player != null)
+        	AttackStanceTaskManager.getInstance().addAttackStanceTask(player);
+        
         if (player != null)
         {
         	if (player.getPet() != target)
@@ -1322,7 +1326,7 @@ public abstract class L2Character extends L2Object
 					if(this instanceof L2Attackable && obj instanceof L2PcInstance && getTarget() instanceof L2Attackable)
 	                    continue;
 	                
-	                if(this instanceof L2Attackable && obj instanceof L2Attackable && ((L2Attackable)this).getEnemyClan().equals("none") && ((L2Attackable)this).getIsChaos()==0)
+	                if(this instanceof L2Attackable && obj instanceof L2Attackable && ((L2Attackable)this).getEnemyClan() == null && ((L2Attackable)this).getIsChaos()==0)
 	                continue;
 	                
 	                if(this instanceof L2Attackable && obj instanceof L2Attackable && !((L2Attackable)this).getEnemyClan().equals(((L2Attackable)obj).getClan()) && ((L2Attackable)this).getIsChaos()==0)

+ 58 - 134
L2_GameServer/java/com/l2jserver/gameserver/model/actor/L2Npc.java

@@ -32,7 +32,6 @@ import com.l2jserver.gameserver.cache.HtmCache;
 import com.l2jserver.gameserver.datatables.ClanTable;
 import com.l2jserver.gameserver.datatables.HelperBuffTable;
 import com.l2jserver.gameserver.datatables.ItemTable;
-import com.l2jserver.gameserver.datatables.NpcTable;
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.datatables.SpawnTable;
 import com.l2jserver.gameserver.idfactory.IdFactory;
@@ -168,47 +167,27 @@ public class L2Npc extends L2Character
 	//AI Recall
 	public int getSoulShot()
 	{
-		L2NpcTemplate npcData = NpcTable.getInstance().getTemplate(this.getTemplate().npcId);
-		L2NpcAIData AI = npcData.getAIDataStatic();
-		
-		if (AI == null)
-			return 0;
-		else
-			return AI.getSoulShot();
+		L2NpcAIData AI = getTemplate().getAIDataStatic();
+		return AI.getSoulShot();
 		
 	}
 	public int getSpiritShot()
 	{
-		L2NpcTemplate npcData = NpcTable.getInstance().getTemplate(this.getTemplate().npcId);
-		L2NpcAIData AI = npcData.getAIDataStatic();
-		
-		if (AI == null)
-			return 0;
-		else
-			return AI.getSpiritShot();
+		L2NpcAIData AI = getTemplate().getAIDataStatic();
+		return AI.getSpiritShot();
 		
 	}
 	public int getSoulShotChance()
 	{
-		L2NpcTemplate npcData = NpcTable.getInstance().getTemplate(this.getTemplate().npcId);
-		L2NpcAIData AI = npcData.getAIDataStatic();
-		
-		if (AI == null)
-			return 0;
-		else
-			return AI.getSoulShotChance();
+		L2NpcAIData AI = getTemplate().getAIDataStatic();
+		return AI.getSoulShotChance();
 		
 	}
 	
 	public int getSpiritShotChance()
 	{
-		L2NpcTemplate npcData = NpcTable.getInstance().getTemplate(this.getTemplate().npcId);
-		L2NpcAIData AI = npcData.getAIDataStatic();
-		
-		if (AI == null)
-			return 0;
-		else
-			return AI.getSpiritShotChance();
+		L2NpcAIData AI = getTemplate().getAIDataStatic();
+		return AI.getSpiritShotChance();
 		
 	}
 	
@@ -263,147 +242,89 @@ public class L2Npc extends L2Character
 	}
 	public int getEnemyRange()
 	{
-		L2NpcTemplate npcData = NpcTable.getInstance().getTemplate(this.getTemplate().npcId);
-		L2NpcAIData AI = npcData.getAIDataStatic();
-		
-		if (AI == null)
-			return 0;
-		else
-			return AI.getEnemyRange();
-		
+		L2NpcAIData AI = getTemplate().getAIDataStatic();
+		return AI.getEnemyRange();
 	}
 	
 	public String getEnemyClan()
 	{
-		L2NpcTemplate npcData = NpcTable.getInstance().getTemplate(this.getTemplate().npcId);
-		L2NpcAIData AI = npcData.getAIDataStatic();
-		
-		if (AI == null || AI.getEnemyClan() == null || "".equals(AI.getEnemyClan()))
-			return "none";
-		else
-			return AI.getEnemyClan();
+		L2NpcAIData AI = getTemplate().getAIDataStatic();
+		return AI.getEnemyClan();
+	}
+	
+	public int getClanRange()
+	{
+		L2NpcAIData AI = getTemplate().getAIDataStatic();
+		return AI.getClanRange();
 	}
 	
 	public String getClan()
 	{
-		L2NpcTemplate npcData = NpcTable.getInstance().getTemplate(this.getTemplate().npcId);
-		L2NpcAIData AI = npcData.getAIDataStatic();
-		
-		if (AI == null || AI.getClan() == null || "".equals(AI.getClan()))
-			return "none";
-		else
-			return AI.getClan();
-		
+		L2NpcAIData AI = getTemplate().getAIDataStatic();
+		return AI.getClan();
 	}
 	
 	// GET THE PRIMARY ATTACK
 	public int getPrimaryAttack()
 	{
-		L2NpcTemplate npcData = NpcTable.getInstance().getTemplate(this.getTemplate().npcId);
-		L2NpcAIData AI = npcData.getAIDataStatic();
-		
-		if (AI == null)
-			return 0;
-		else
-			return AI.getPrimaryAttack();
+		L2NpcAIData AI = getTemplate().getAIDataStatic();
+		return AI.getPrimaryAttack();
 		
 	}
 	
 	public int getSkillChance()
 	{
-		L2NpcTemplate npcData = NpcTable.getInstance().getTemplate(this.getTemplate().npcId);
-		L2NpcAIData AI = npcData.getAIDataStatic();
-		
-		if (AI == null)
-			return 20;
-		else
-			return AI.getSkillChance();
+		L2NpcAIData AI = getTemplate().getAIDataStatic();
+		return AI.getSkillChance();
 		
 	}
 	
 	public int getCanMove()
 	{
-		L2NpcTemplate npcData = NpcTable.getInstance().getTemplate(this.getTemplate().npcId);
-		L2NpcAIData AI = npcData.getAIDataStatic();
-		
-		if (AI == null)
-			return 0;
-		else
-			return AI.getCanMove();
+		L2NpcAIData AI = getTemplate().getAIDataStatic();
+		return AI.getCanMove();
 	}
 	
 	public int getIsChaos()
 	{
-		
-		L2NpcTemplate npcData = NpcTable.getInstance().getTemplate(this.getTemplate().npcId);
-		L2NpcAIData AI = npcData.getAIDataStatic();
-		
-		if (AI == null)
-			return 0;
-		else
-			return AI.getIsChaos();
+		L2NpcAIData AI = getTemplate().getAIDataStatic();
+		return AI.getIsChaos();
 		
 	}
 	
 	public int getCanDodge()
 	{
-		
-		L2NpcTemplate npcData = NpcTable.getInstance().getTemplate(this.getTemplate().npcId);
-		L2NpcAIData AI = npcData.getAIDataStatic();
-		
-		if (AI == null)
-			return 0;
-		else
-			return AI.getDodge();
+		L2NpcAIData AI = getTemplate().getAIDataStatic();
+		return AI.getDodge();
 		
 	}
 	
 	public int getSSkillChance()
 	{
-		
-		L2NpcTemplate npcData = NpcTable.getInstance().getTemplate(this.getTemplate().npcId);
-		L2NpcAIData AI = npcData.getAIDataStatic();
-		
-		if (AI == null)
-			return 0;
-		else
-			return AI.getShortRangeChance();
+		L2NpcAIData AI = getTemplate().getAIDataStatic();
+		return AI.getShortRangeChance();
 		
 	}
 	
 	public int getLSkillChance()
 	{
-		
-		L2NpcTemplate npcData = NpcTable.getInstance().getTemplate(this.getTemplate().npcId);
-		L2NpcAIData AI = npcData.getAIDataStatic();
-		
-		if (AI == null)
-			return 0;
-		else
-			return AI.getLongRangeChance();
+		L2NpcAIData AI = getTemplate().getAIDataStatic();
+		return AI.getLongRangeChance();
 		
 	}
 	
 	public int getSwitchRangeChance()
 	{
-		
-		L2NpcTemplate npcData = NpcTable.getInstance().getTemplate(this.getTemplate().npcId);
-		L2NpcAIData AI = npcData.getAIDataStatic();
-		
-		if (AI == null)
-			return 0;
-		else
-			return AI.getSwitchRangeChance();
+		L2NpcAIData AI = getTemplate().getAIDataStatic();
+		return AI.getSwitchRangeChance();
 		
 	}
 	
 	public boolean hasLSkill()
 	{
+		L2NpcAIData AI = getTemplate().getAIDataStatic();
 		
-		L2NpcTemplate npcData = NpcTable.getInstance().getTemplate(this.getTemplate().npcId);
-		L2NpcAIData AI = npcData.getAIDataStatic();
-		
-		if (AI == null || AI.getLongRangeSkill() == 0)
+		if (AI.getLongRangeSkill() == 0)
 			return false;
 		else
 			return true;
@@ -412,11 +333,9 @@ public class L2Npc extends L2Character
 	
 	public boolean hasSSkill()
 	{
+		L2NpcAIData AI = getTemplate().getAIDataStatic();
 		
-		L2NpcTemplate npcData = NpcTable.getInstance().getTemplate(this.getTemplate().npcId);
-		L2NpcAIData AI = npcData.getAIDataStatic();
-		
-		if (AI == null || AI.getShortRangeSkill() == 0)
+		if (AI.getShortRangeSkill() == 0)
 			return false;
 		else
 			return true;
@@ -427,8 +346,7 @@ public class L2Npc extends L2Character
 	{
 		FastList<L2Skill> skilldata = new FastList <L2Skill>();
 		boolean hasLrange = false;
-		L2NpcTemplate npcData = NpcTable.getInstance().getTemplate(getTemplate().npcId);
-		L2NpcAIData AI = npcData.getAIDataStatic();
+		L2NpcAIData AI = getTemplate().getAIDataStatic();
 
 		if (AI == null || AI.getLongRangeSkill() == 0)
 			return null;
@@ -458,9 +376,9 @@ public class L2Npc extends L2Character
 			}
 			case 1:
 			{
-				if (npcData._universalskills != null)
+				if (getTemplate()._universalskills != null)
 				{
-					for (L2Skill sk: npcData._universalskills)
+					for (L2Skill sk: getTemplate()._universalskills)
 					{
 						if (sk.getCastRange() >= 200)
 						{
@@ -491,8 +409,7 @@ public class L2Npc extends L2Character
 	{
 		FastList<L2Skill> skilldata = new FastList <L2Skill>();
 		boolean hasSrange = false;
-		L2NpcTemplate npcData = NpcTable.getInstance().getTemplate(getTemplate().npcId);
-		L2NpcAIData AI = npcData.getAIDataStatic();
+		L2NpcAIData AI = getTemplate().getAIDataStatic();
 
 		if (AI == null || AI.getShortRangeSkill() == 0)
 			return null;
@@ -522,9 +439,9 @@ public class L2Npc extends L2Character
 			}
 			case 1:
 			{
-				if (npcData._universalskills != null)
+				if (getTemplate()._universalskills != null)
 				{
-					for (L2Skill sk: npcData._universalskills)
+					for (L2Skill sk: getTemplate()._universalskills)
 					{
 						if (sk.getCastRange() <= 200)
 						{
@@ -622,7 +539,7 @@ public class L2Npc extends L2Character
 	 */
 	public boolean hasRandomAnimation()
 	{
-		return (Config.MAX_NPC_ANIMATION > 0 && !getTemplate().AI.equals(AIType.CORPSE));
+		return (Config.MAX_NPC_ANIMATION > 0 && !getAiType().equals(AIType.CORPSE));
 	}
 
 	/**
@@ -726,9 +643,10 @@ public class L2Npc extends L2Character
 	 * If a NPC belows to a Faction, other NPC of the faction inside the Faction range will help it if it's attacked<BR><BR>
 	 *
 	 */
+	//@Deprecated
 	public final String getFactionId()
 	{
-		return getTemplate().factionId;
+		return getClan();
 	}
 
 	/**
@@ -759,9 +677,10 @@ public class L2Npc extends L2Character
 	/**
 	 * Return the Faction Range of this L2NpcInstance contained in the L2NpcTemplate.<BR><BR>
 	 */
+	//@Deprecated
 	public int getFactionRange()
 	{
-		return getTemplate().factionRange;
+		return getClanRange();
 	}
 
 	/**
@@ -1064,7 +983,7 @@ public class L2Npc extends L2Character
 					// Send a Server->Client packet SocialAction to the all L2PcInstance on the _knownPlayer of the L2NpcInstance
 					// to display a social action of the L2NpcInstance on their client
 					long now = System.currentTimeMillis();
-					if (now - _lastSocialBroadcast > _minimalSocialInterval && !getTemplate().AI.equals(AIType.CORPSE))
+					if (now - _lastSocialBroadcast > _minimalSocialInterval && !getAiType().equals(AIType.CORPSE))
 					{
 						_lastSocialBroadcast = now;
 						broadcastPacket(new SocialAction(getObjectId(), Rnd.get(8)));
@@ -3037,6 +2956,11 @@ public class L2Npc extends L2Character
 	@Override
 	public boolean isMovementDisabled()
 	{
-		return super.isMovementDisabled() || getCanMove() > 0;
+		return super.isMovementDisabled() || getCanMove() > 0 || getAiType().equals(AIType.CORPSE);
+	}
+	
+	public AIType getAiType()
+	{
+		return getTemplate().getAIDataStatic().getAiType();
 	}
 }

+ 0 - 22
L2_GameServer/java/com/l2jserver/gameserver/templates/chars/L2NpcTemplate.java

@@ -69,13 +69,10 @@ public final class L2NpcTemplate extends L2CharTemplate
 	public final int lhand;
 	public final int armor;
 	public final int enchantEffect;
-	public final String factionId;
-	public final int factionRange;
 	public final int absorbLevel;
 	public final AbsorbCrystalType absorbType;
 	public Race race;
 	public final String jClass;
-	public final AIType AI;
 	public final boolean dropherb;
 	public boolean isQuestMonster; // doesn't include all mobs that are involved in 
 	// quests, just plain quest monsters for preventing champion spawn
@@ -216,12 +213,6 @@ public final class L2NpcTemplate extends L2CharTemplate
 		lhand = set.getInteger("lhand");
 		armor = set.getInteger("armor");
 		enchantEffect = set.getInteger("enchant"); 
-		String f = set.getString("factionId", null);
-		if (f == null)
-			factionId = null;
-		else
-			factionId = f.intern();
-		factionRange = set.getInteger("factionRange");
 		absorbLevel = set.getInteger("absorb_level", 0);
 		absorbType = AbsorbCrystalType.valueOf(set.getString("absorb_type"));
 		race = null;
@@ -229,19 +220,6 @@ public final class L2NpcTemplate extends L2CharTemplate
 		//_npcStatsSet = set;
 		_teachInfo = null;
 		jClass = set.getString("jClass");
-		String ai = set.getString("AI", "fighter");
-		if (ai.equalsIgnoreCase("archer"))
-			AI = AIType.ARCHER;
-		else if (ai.equalsIgnoreCase("balanced"))
-			AI = AIType.BALANCED;
-		else if (ai.equalsIgnoreCase("mage"))
-			AI = AIType.MAGE;
-		else if (ai.equalsIgnoreCase("healer"))
-			AI = AIType.HEALER;
-		else if (ai.equalsIgnoreCase("corpse"))
-			AI = AIType.CORPSE;
-		else
-			AI = AIType.FIGHTER;
 
 		// all NPCs has 20 resistance to all attributes
 		baseFireRes += 20;