Просмотр исходного кода

BETA: Fixed thread safety issue in `L2Character#doAttack` that was causing double attacks to happen.

Reported by: maxstyleboy
Reviewed by: !UnAfraid, Zoey76
Nos 11 лет назад
Родитель
Сommit
3a42b1db47

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

@@ -253,7 +253,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 	private L2Object _target;
 	
 	// set by the start of attack, in game ticks
-	private int _attackEndTime;
+	private volatile long _attackEndTime;
 	private int _disableBowAttackEndTime;
 	private int _disableCrossBowAttackEndTime;
 	
@@ -822,7 +822,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 	 * </ul>
 	 * @param target The L2Character targeted
 	 */
-	protected void doAttack(L2Character target)
+	protected synchronized void doAttack(L2Character target)
 	{
 		if ((target == null) || isAttackingDisabled() || !getEvents().onAttack(target))
 		{
@@ -1077,7 +1077,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 		final int timeAtk = calculateTimeBetweenAttacks(target, weaponItem);
 		// the hit is calculated to happen halfway to the animation - might need further tuning e.g. in bow case
 		final int timeToHit = timeAtk / 2;
-		_attackEndTime = (GameTimeController.getInstance().getGameTicks() + (timeAtk / GameTimeController.MILLIS_IN_TICK)) - 1;
+		_attackEndTime = System.currentTimeMillis() + timeAtk;
 		final int ssGrade = (weaponItem != null) ? weaponItem.getItemGradeSPlus().getId() : 0;
 		// Create a Server->Client packet Attack
 		Attack attack = new Attack(this, target, wasSSCharged, ssGrade);
@@ -2775,7 +2775,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 	 */
 	public boolean isAttackingDisabled()
 	{
-		return isFlying() || isStunned() || isSleeping() || (_attackEndTime > GameTimeController.getInstance().getGameTicks()) || isAlikeDead() || isParalyzed() || isPhysicalAttackMuted() || isCoreAIDisabled();
+		return isFlying() || isStunned() || isSleeping() || isAttackingNow() || isAlikeDead() || isParalyzed() || isPhysicalAttackMuted() || isCoreAIDisabled();
 	}
 	
 	public final Calculator[] getCalculators()
@@ -4068,7 +4068,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 	 */
 	public boolean isAttackingNow()
 	{
-		return _attackEndTime > GameTimeController.getInstance().getGameTicks();
+		return _attackEndTime > System.currentTimeMillis();
 	}
 	
 	/**
@@ -6345,7 +6345,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 		return (1 + ((double) Rnd.get(0 - random, random) / 100));
 	}
 	
-	public int getAttackEndTime()
+	public final long getAttackEndTime()
 	{
 		return _attackEndTime;
 	}