Explorar o código

Fixing decay problem with clanships.

_DS_ %!s(int64=15) %!d(string=hai) anos
pai
achega
31c7aea805

+ 25 - 10
L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2ControllableAirShipInstance.java

@@ -39,7 +39,7 @@ public class L2ControllableAirShipInstance extends L2AirShipInstance
 	private L2PcInstance _captain = null;
 
 	private Future<?> _consumeFuelTask;
-	private Future<?> _decayTask;
+	private Future<?> _checkTask;
 
 	public L2ControllableAirShipInstance(int objectId, L2CharTemplate template, int ownerId)
 	{
@@ -47,8 +47,6 @@ public class L2ControllableAirShipInstance extends L2AirShipInstance
 		setInstanceType(InstanceType.L2ControllableAirShipInstance);
 		_ownerId = ownerId;
 		_helmId = IdFactory.getInstance().getNextId(); // not forget to release !
-		_decayTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new DecayTask(), 60000, 10000);
-		_consumeFuelTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new ConsumeFuelTask(), 60000, 60000);
 	}
 
 	@Override
@@ -187,13 +185,23 @@ public class L2ControllableAirShipInstance extends L2AirShipInstance
 		super.onAction(player, interact);
 	}
 
+	@Override
+	public void onSpawn()
+	{
+		super.onSpawn();
+		_checkTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new CheckTask(), 60000, 10000);
+		_consumeFuelTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new ConsumeFuelTask(), 60000, 60000);
+	}
+
 	@Override
 	public void deleteMe()
 	{
-		if (_decayTask != null)
+		super.deleteMe();
+
+		if (_checkTask != null)
 		{
-			_decayTask.cancel(false);
-			_decayTask = null;
+			_checkTask.cancel(false);
+			_checkTask = null;
 		}
 		if (_consumeFuelTask != null)
 		{
@@ -209,8 +217,6 @@ public class L2ControllableAirShipInstance extends L2AirShipInstance
 		{
 			_log.log(Level.SEVERE, "Failed decayMe():"+e.getMessage());
 		}
-
-		super.deleteMe();
 	}
 
 	@Override
@@ -229,7 +235,7 @@ public class L2ControllableAirShipInstance extends L2AirShipInstance
 			_captain.sendInfo(activeChar);
 	}
 
-	private class ConsumeFuelTask implements Runnable
+	private final class ConsumeFuelTask implements Runnable
 	{
 		public void run()
 		{
@@ -246,13 +252,22 @@ public class L2ControllableAirShipInstance extends L2AirShipInstance
 		}
 	}
 
-	private class DecayTask implements Runnable
+	private final class CheckTask implements Runnable
 	{
 		public void run()
 		{
 			if (isVisible()
 					&& isEmpty()
 					&& !isInDock())
+				// deleteMe() can't be called from CheckTask because task should not cancel itself
+				ThreadPoolManager.getInstance().executeTask(new DecayTask());
+		}
+	}
+
+	private final class DecayTask implements Runnable
+	{
+		public void run()
+		{
 				deleteMe();
 		}
 	}