Browse Source

Fort siege guards fix.
Merge stopAITask in AI's.

JIV 15 years ago
parent
commit
ea472cb670

+ 7 - 0
L2_GameServer/java/com/l2jserver/gameserver/ai/AbstractAI.java

@@ -941,4 +941,11 @@ abstract class AbstractAI implements Ctrl
 		_target = target;
 	}
 	
+	/**
+	 * Stop all Ai tasks and futures.
+	 */
+	public void stopAITask()
+	{
+		stopFollow();
+	}
 }

+ 2 - 0
L2_GameServer/java/com/l2jserver/gameserver/ai/L2AttackableAI.java

@@ -304,6 +304,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 		}
 	}
 
+	@Override
 	public void stopAITask()
 	{
 		if (_aiTask != null)
@@ -311,6 +312,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 			_aiTask.cancel(false);
 			_aiTask = null;
 		}
+		super.stopAITask();
 	}
 
 	@Override

+ 2 - 0
L2_GameServer/java/com/l2jserver/gameserver/ai/L2FortSiegeGuardAI.java

@@ -868,6 +868,7 @@ public class L2FortSiegeGuardAI extends L2CharacterAI implements Runnable
 		super.onEvtDead();
 	}
 	
+	@Override
 	public void stopAITask()
 	{
 		if (_aiTask != null)
@@ -876,6 +877,7 @@ public class L2FortSiegeGuardAI extends L2CharacterAI implements Runnable
 			_aiTask = null;
 		}
 		_accessor.detachAI();
+		super.stopAITask();
 	}
 	
 }

+ 2 - 0
L2_GameServer/java/com/l2jserver/gameserver/ai/L2SiegeGuardAI.java

@@ -843,6 +843,7 @@ public class L2SiegeGuardAI extends L2CharacterAI implements Runnable
 		super.onEvtDead();
 	}
 	
+	@Override
 	public void stopAITask()
 	{
 		if (_aiTask != null)
@@ -851,6 +852,7 @@ public class L2SiegeGuardAI extends L2CharacterAI implements Runnable
 			_aiTask = null;
 		}
 		_accessor.detachAI();
+		super.stopAITask();
 	}
 	
 }

+ 6 - 3
L2_GameServer/java/com/l2jserver/gameserver/instancemanager/CastleManager.java

@@ -58,11 +58,14 @@ public class CastleManager implements InstanceListManager
 	// Method - Public
 	
 	public final int findNearestCastleIndex(L2Object obj)
+	{
+		return findNearestCastleIndex(obj, Long.MAX_VALUE);
+	}
+	public final int findNearestCastleIndex(L2Object obj, long maxDistance)
 	{
 		int index = getCastleIndex(obj);
 		if (index < 0)
 		{
-			double closestDistance = 99999999;
 			double distance;
 			Castle castle;
 			for (int i = 0; i < getCastles().size(); i++)
@@ -71,9 +74,9 @@ public class CastleManager implements InstanceListManager
 				if (castle == null)
 					continue;
 				distance = castle.getDistance(obj);
-				if (closestDistance > distance)
+				if (maxDistance > distance)
 				{
-					closestDistance = distance;
+					maxDistance = (long) distance;
 					index = i;
 				}
 			}

+ 7 - 3
L2_GameServer/java/com/l2jserver/gameserver/instancemanager/FortManager.java

@@ -48,11 +48,15 @@ public class FortManager implements InstanceListManager
 	}
 	
 	public final int findNearestFortIndex(L2Object obj)
+	{
+		return findNearestFortIndex(obj, Long.MAX_VALUE);
+	}
+	
+	public final int findNearestFortIndex(L2Object obj, long maxDistance)
 	{
 		int index = getFortIndex(obj);
 		if (index < 0)
 		{
-			double closestDistance = 99999999;
 			double distance;
 			Fort fort;
 			for (int i = 0; i < getForts().size(); i++)
@@ -61,9 +65,9 @@ public class FortManager implements InstanceListManager
 				if (fort == null)
 					continue;
 				distance = fort.getDistance(obj);
-				if (closestDistance > distance)
+				if (maxDistance > distance)
 				{
-					closestDistance = distance;
+					maxDistance = (long) distance;
 					index = i;
 				}
 			}

+ 2 - 1
L2_GameServer/java/com/l2jserver/gameserver/instancemanager/FortSiegeGuardManager.java

@@ -84,7 +84,8 @@ public class FortSiegeGuardManager
 				for (L2Spawn spawnDat : monsterList)
 				{
 					spawnDat.stopRespawn();
-					spawnDat.getLastSpawn().doDie(spawnDat.getLastSpawn());
+					if (spawnDat.getLastSpawn() != null)
+						spawnDat.getLastSpawn().doDie(spawnDat.getLastSpawn());
 				}
 			}
 		}

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/model/actor/L2Attackable.java

@@ -2384,7 +2384,7 @@ public class L2Attackable extends L2Npc
 		{
 			if (this instanceof L2DefenderInstance)
 			{
-				if (getCastle() != null)
+				if (getCastle(10000) != null)
 					((L2SiegeGuardAI) getAI()).stopAITask();
 				else if (getFort() != null)
 					((L2FortSiegeGuardAI) getAI()).stopAITask();

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

@@ -2149,6 +2149,12 @@ public abstract class L2Character extends L2Object
 		return true;
 	}
 
+	public void deleteMe()
+	{
+		if (hasAI())
+			getAI().stopAITask();
+	}
+	
 	protected void calculateRewards(L2Character killer)
 	{
 	}

+ 33 - 0
L2_GameServer/java/com/l2jserver/gameserver/model/actor/L2Npc.java

@@ -886,6 +886,21 @@ public class L2Npc extends L2Character
 
 		return CastleManager.getInstance().getCastles().get(_castleIndex);
 	}
+	
+	/**
+	 * Return closest castle in defined distance
+	 * @param maxDistance long
+	 * @return Castle
+	 */
+	public final Castle getCastle(long maxDistance)
+	{
+		int index = CastleManager.getInstance().findNearestCastleIndex(this, maxDistance);
+		
+		if (index < 0)
+			return null;
+
+		return CastleManager.getInstance().getCastles().get(index);
+	}
 
 	/** Return the L2Fort this L2NpcInstance belongs to. */
 	public final Fort getFort()
@@ -906,6 +921,21 @@ public class L2Npc extends L2Character
 
 		return FortManager.getInstance().getForts().get(_fortIndex);
 	}
+	
+	/**
+	 * Return closest Fort in defined distance
+	 * @param maxDistance long
+	 * @return Fort
+	 */
+	public final Fort getFort(long maxDistance)
+	{
+		int index = FortManager.getInstance().findNearestFortIndex(this, maxDistance);
+		
+		if (index < 0)
+			return null;
+
+		return FortManager.getInstance().getForts().get(index);
+	}
 
 	public final boolean getIsInTown()
 	{
@@ -1427,6 +1457,7 @@ public class L2Npc extends L2Character
 	 * <FONT COLOR=#FF0000><B> <U>Caution</U> : This method DOESN'T SEND Server->Client packets to players</B></FONT><BR><BR>
 	 * 
 	 */
+	@Override
 	public void deleteMe()
 	{
 		L2WorldRegion oldRegion = getWorldRegion();
@@ -1467,6 +1498,8 @@ public class L2Npc extends L2Character
 
 		// Remove L2Object object from _allObjects of L2World
 		L2World.getInstance().removeObject(this);
+		
+		super.deleteMe();
 	}
 
 	/**

+ 0 - 1
L2_GameServer/java/com/l2jserver/gameserver/model/actor/L2Summon.java

@@ -351,7 +351,6 @@ public abstract class L2Summon extends L2Playable
     
     public void deleteMe(L2PcInstance owner)
     {
-        getAI().stopFollow();
         owner.sendPacket(new PetDelete(getSummonType(), getObjectId()));
 
         //pet will be deleted along with all his items

+ 2 - 0
L2_GameServer/java/com/l2jserver/gameserver/model/actor/L2Trap.java

@@ -131,10 +131,12 @@ public class L2Trap extends L2Character
 	 * 
 	 * @param owner
 	 */
+	@Override
 	public void deleteMe()
 	{
 		decayMe();
 		getKnownList().removeAllKnownObjects();
+		super.deleteMe();
 	}
 	
 	/**

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2DefenderInstance.java

@@ -67,7 +67,7 @@ public class L2DefenderInstance extends L2Attackable
 			synchronized(this)
 			{
 				if (_ai == null)
-					if (getCastle() == null)
+					if (getCastle(10000) == null)
 						_ai = new L2FortSiegeGuardAI(new AIAccessor());
 					else
 						_ai = new L2SiegeGuardAI(new AIAccessor());

+ 0 - 2
L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2TamedBeastInstance.java

@@ -197,8 +197,6 @@ public final class L2TamedBeastInstance extends L2FeedableBeastInstance
 	@Override
 	public void deleteMe()
 	{
-		// stop running tasks
-		getAI().stopFollow();
 		_buffTask.cancel(true);
 		_durationCheckTask.cancel(true);
 		stopHpMpRegeneration();

+ 2 - 1
L2_GameServer/java/com/l2jserver/gameserver/model/entity/FortSiege.java

@@ -1052,7 +1052,8 @@ public class FortSiege implements Siegable
 				if (spawn != null)
 				{
 					spawn.stopRespawn();
-					spawn.getLastSpawn().deleteMe();
+					if (spawn.getLastSpawn() != null)
+						spawn.getLastSpawn().deleteMe();
 				}
 			}
 			_commanders.clear();