Bladeren bron

BETA: Adding missing synchronized block to setInsideZone to ensure correct usage between different threads.
* Also fixing non properly used double checked locking approach for AI.
* Reported by: hNoke

Rumen Nikiforov 11 jaren geleden
bovenliggende
commit
0d645fcefe
1 gewijzigde bestanden met toevoegingen van 14 en 12 verwijderingen
  1. 14 12
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java

+ 14 - 12
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java

@@ -339,16 +339,19 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 	 */
 	public final void setInsideZone(ZoneId zone, final boolean state)
 	{
-		if (state)
+		synchronized (_zones)
 		{
-			_zones[zone.getId()]++;
-		}
-		else
-		{
-			_zones[zone.getId()]--;
-			if (_zones[zone.getId()] < 0)
+			if (state)
+			{
+				_zones[zone.getId()]++;
+			}
+			else
 			{
-				_zones[zone.getId()] = 0;
+				_zones[zone.getId()]--;
+				if (_zones[zone.getId()] < 0)
+				{
+					_zones[zone.getId()] = 0;
+				}
 			}
 		}
 	}
@@ -2360,8 +2363,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 	 */
 	public L2CharacterAI getAI()
 	{
-		L2CharacterAI ai = _ai; // copy handle
-		if (ai == null)
+		if (_ai == null)
 		{
 			synchronized (this)
 			{
@@ -2372,7 +2374,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 				return _ai;
 			}
 		}
-		return ai;
+		return _ai;
 	}
 	
 	public void setAI(L2CharacterAI newAI)
@@ -3342,7 +3344,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 	/** Table of calculators containing all standard NPC calculator (ex : ACCURACY_COMBAT, EVASION_RATE) */
 	private static final Calculator[] NPC_STD_CALCULATOR = Formulas.getStdNPCCalculators();
 	
-	protected L2CharacterAI _ai;
+	protected volatile L2CharacterAI _ai;
 	
 	/** Future Skill Cast */
 	protected Future<?> _skillCast;