Explorar o código

Redone [4104]. For all those that do not understand. We work with pointers. Even when the pointer yet point on an valid not null variable, it`s not given he do so a moment later (when it`s changeable by another thread).
But we can copy the pointer, so it will not get changed by externals and keep pointing on the object.

Forsaiken %!s(int64=15) %!d(string=hai) anos
pai
achega
80ec4c6f87

+ 20 - 36
L2_GameServer/java/com/l2jserver/gameserver/model/actor/L2Character.java

@@ -26,6 +26,10 @@ import java.util.concurrent.Future;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import javolution.util.FastList;
+import javolution.util.FastMap;
+import javolution.util.FastSet;
+
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.GameTimeController;
 import com.l2jserver.gameserver.GeoData;
@@ -36,8 +40,8 @@ import com.l2jserver.gameserver.ai.L2AttackableAI;
 import com.l2jserver.gameserver.ai.L2CharacterAI;
 import com.l2jserver.gameserver.datatables.DoorTable;
 import com.l2jserver.gameserver.datatables.MapRegionTable;
-import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.datatables.MapRegionTable.TeleportWhereType;
+import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.handler.ActionHandler;
 import com.l2jserver.gameserver.handler.IActionHandler;
 import com.l2jserver.gameserver.handler.ISkillHandler;
@@ -56,17 +60,17 @@ import com.l2jserver.gameserver.model.L2ItemInstance;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.L2Party;
 import com.l2jserver.gameserver.model.L2Skill;
+import com.l2jserver.gameserver.model.L2Skill.SkillTargetType;
 import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.L2WorldRegion;
 import com.l2jserver.gameserver.model.Location;
-import com.l2jserver.gameserver.model.L2Skill.SkillTargetType;
 import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2MinionInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2NpcWalkerInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance.SkillDat;
 import com.l2jserver.gameserver.model.actor.instance.L2PetInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2RiftInvaderInstance;
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance.SkillDat;
 import com.l2jserver.gameserver.model.actor.knownlist.CharKnownList;
 import com.l2jserver.gameserver.model.actor.position.CharPosition;
 import com.l2jserver.gameserver.model.actor.stat.CharStat;
@@ -81,6 +85,7 @@ import com.l2jserver.gameserver.network.serverpackets.Attack;
 import com.l2jserver.gameserver.network.serverpackets.ChangeMoveType;
 import com.l2jserver.gameserver.network.serverpackets.ChangeWaitType;
 import com.l2jserver.gameserver.network.serverpackets.FlyToLocation;
+import com.l2jserver.gameserver.network.serverpackets.FlyToLocation.FlyType;
 import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
 import com.l2jserver.gameserver.network.serverpackets.MagicSkillCanceld;
 import com.l2jserver.gameserver.network.serverpackets.MagicSkillLaunched;
@@ -93,7 +98,6 @@ import com.l2jserver.gameserver.network.serverpackets.StatusUpdate;
 import com.l2jserver.gameserver.network.serverpackets.StopMove;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 import com.l2jserver.gameserver.network.serverpackets.TeleportToLocation;
-import com.l2jserver.gameserver.network.serverpackets.FlyToLocation.FlyType;
 import com.l2jserver.gameserver.pathfinding.AbstractNodeLoc;
 import com.l2jserver.gameserver.pathfinding.PathFinding;
 import com.l2jserver.gameserver.skills.AbnormalEffect;
@@ -115,10 +119,6 @@ import com.l2jserver.gameserver.templates.skills.L2SkillType;
 import com.l2jserver.gameserver.util.Util;
 import com.l2jserver.util.Point3D;
 import com.l2jserver.util.Rnd;
-
-import javolution.util.FastList;
-import javolution.util.FastMap;
-import javolution.util.FastSet;
 /**
  * Mother class of all character objects of the world (PC, NPC...)<BR><BR>
  *
@@ -1875,14 +1875,10 @@ public abstract class L2Character extends L2Object
 
 			if (simultaneously)
 			{
-				if (_skillCast2 != null)
+				Future<?> future = _skillCast2;
+				if (future != null)
 				{
-					try 
-					{
-						_skillCast2.cancel(true);
-					}
-					catch (NullPointerException e) {}
-					
+					future.cancel(true);
 					_skillCast2 = null;
 				}
 
@@ -1895,14 +1891,10 @@ public abstract class L2Character extends L2Object
 			}
 			else
 			{
-				if (_skillCast != null)
+				Future<?> future = _skillCast;
+				if (future != null)
 				{
-					try 
-					{
-						_skillCast.cancel(true);
-					}
-					catch (NullPointerException e) {}
-					
+					future.cancel(true);
 					_skillCast = null;
 				}
 
@@ -4064,25 +4056,17 @@ public abstract class L2Character extends L2Object
 	{
 		if (isCastingNow() || isCastingSimultaneouslyNow())
 		{
+			Future<?> future = _skillCast;
 			// cancels the skill hit scheduled task
-			if (_skillCast != null)
+			if (future != null)
 			{
-				try 
-				{
-					_skillCast.cancel(true);
-				}
-				catch (NullPointerException e) {}
-				
+				future.cancel(true);
 				_skillCast = null;
 			}
-			if (_skillCast2 != null)
+			future = _skillCast2;
+			if (future != null)
 			{
-				try 
-				{
-					_skillCast2.cancel(true);
-				}
-				catch (NullPointerException e) {}
-				
+				future.cancel(true);
 				_skillCast2 = null;
 			}