Procházet zdrojové kódy

BETA: Effect list fixes.
* Fixing deadlock from excessive locking.
* Reported by: nBd, UnAfraid
* Fixing endless debuff effects (I was so worried to fix buffs, that I forgot about debuffs!).
* Reported by: nBd, UnAfraid, iskipper092

Zoey76 před 12 roky
rodič
revize
8b9e40b4ab

+ 17 - 27
L2J_Server_BETA/java/com/l2jserver/gameserver/model/CharEffectList.java

@@ -771,8 +771,7 @@ public final class CharEffectList
 					{
 						if ((e != null) && (e.getSkill().getId() == skill.getId()) && (e.getEffectType() == effect.getEffectType()) && (e.getSkill().getAbnormalLvl() == skill.getAbnormalLvl()) && (e.getSkill().getAbnormalType() == skill.getAbnormalType()))
 						{
-							// Started scheduled timer needs to be canceled.
-							effect.stopEffectTask();
+							e.exit(); // exit this
 						}
 					}
 					_debuffs.add(effect);
@@ -1279,44 +1278,35 @@ public final class CharEffectList
 	}
 	
 	/**
-	 * Recalculate effect bits flag.<br>
-	 * Please no concurrency access.
+	 * Recalculate effect bits flag.
 	 */
 	private final void computeEffectFlags()
 	{
-		_rLock.lock();
-		try
+		int flags = 0;
+		if (hasBuffs())
 		{
-			int flags = 0;
-			if (hasBuffs())
+			for (L2Effect e : _buffs)
 			{
-				for (L2Effect e : _buffs)
+				if (e == null)
 				{
-					if (e == null)
-					{
-						continue;
-					}
-					flags |= e.getEffectFlags();
+					continue;
 				}
+				flags |= e.getEffectFlags();
 			}
-			
-			if (hasDebuffs())
+		}
+		
+		if (hasDebuffs())
+		{
+			for (L2Effect e : _debuffs)
 			{
-				for (L2Effect e : _debuffs)
+				if (e == null)
 				{
-					if (e == null)
-					{
-						continue;
-					}
-					flags |= e.getEffectFlags();
+					continue;
 				}
+				flags |= e.getEffectFlags();
 			}
-			_effectFlags = flags;
-		}
-		finally
-		{
-			_rLock.unlock();
 		}
+		_effectFlags = flags;
 	}
 	
 	/**