Browse Source

BETA: Moving runnable tasks from L2Character into own files.
* Patch by: xBan1x

* Also a minor typo fix whenever cursed weapon kills a playable it should increase stage only from players not from pets/summons!
* Reported by: Tryskell

Rumen Nikiforov 12 years ago
parent
commit
5f59024db1

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

@@ -73,6 +73,12 @@ import com.l2jserver.gameserver.model.actor.knownlist.CharKnownList;
 import com.l2jserver.gameserver.model.actor.position.CharPosition;
 import com.l2jserver.gameserver.model.actor.stat.CharStat;
 import com.l2jserver.gameserver.model.actor.status.CharStatus;
+import com.l2jserver.gameserver.model.actor.tasks.character.FlyToLocationTask;
+import com.l2jserver.gameserver.model.actor.tasks.character.HitTask;
+import com.l2jserver.gameserver.model.actor.tasks.character.MagicUseTask;
+import com.l2jserver.gameserver.model.actor.tasks.character.NotifyAITask;
+import com.l2jserver.gameserver.model.actor.tasks.character.QueuedMagicUseTask;
+import com.l2jserver.gameserver.model.actor.tasks.character.UsePotionTask;
 import com.l2jserver.gameserver.model.actor.templates.L2CharTemplate;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
 import com.l2jserver.gameserver.model.effects.AbnormalEffect;
@@ -108,8 +114,6 @@ import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 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;
@@ -917,7 +921,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 						if (getCurrentMp() < mpConsume)
 						{
 							// If L2PcInstance doesn't have enough MP, stop the attack
-							ThreadPoolManager.getInstance().scheduleAi(new NotifyAITask(CtrlEvent.EVT_READY_TO_ACT), 1000);
+							ThreadPoolManager.getInstance().scheduleAi(new NotifyAITask(this, CtrlEvent.EVT_READY_TO_ACT), 1000);
 							sendPacket(SystemMessageId.NOT_ENOUGH_MP);
 							sendPacket(ActionFailed.STATIC_PACKET);
 							return;
@@ -935,7 +939,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 					else
 					{
 						// Cancel the action because the bow can't be re-use at this moment
-						ThreadPoolManager.getInstance().scheduleAi(new NotifyAITask(CtrlEvent.EVT_READY_TO_ACT), 1000);
+						ThreadPoolManager.getInstance().scheduleAi(new NotifyAITask(this, CtrlEvent.EVT_READY_TO_ACT), 1000);
 						sendPacket(ActionFailed.STATIC_PACKET);
 						return;
 					}
@@ -979,7 +983,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 						if (getCurrentMp() < mpConsume)
 						{
 							// If L2PcInstance doesn't have enough MP, stop the attack
-							ThreadPoolManager.getInstance().scheduleAi(new NotifyAITask(CtrlEvent.EVT_READY_TO_ACT), 1000);
+							ThreadPoolManager.getInstance().scheduleAi(new NotifyAITask(this, CtrlEvent.EVT_READY_TO_ACT), 1000);
 							sendPacket(SystemMessageId.NOT_ENOUGH_MP);
 							sendPacket(ActionFailed.STATIC_PACKET);
 							return;
@@ -997,7 +1001,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 					else
 					{
 						// Cancel the action because the crossbow can't be re-use at this moment
-						ThreadPoolManager.getInstance().scheduleAi(new NotifyAITask(CtrlEvent.EVT_READY_TO_ACT), 1000);
+						ThreadPoolManager.getInstance().scheduleAi(new NotifyAITask(this, CtrlEvent.EVT_READY_TO_ACT), 1000);
 						sendPacket(ActionFailed.STATIC_PACKET);
 						return;
 					}
@@ -1124,7 +1128,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		}
 		
 		// Notify AI with EVT_READY_TO_ACT
-		ThreadPoolManager.getInstance().scheduleAi(new NotifyAITask(CtrlEvent.EVT_READY_TO_ACT), timeAtk + reuse);
+		ThreadPoolManager.getInstance().scheduleAi(new NotifyAITask(this, CtrlEvent.EVT_READY_TO_ACT), timeAtk + reuse);
 	}
 	
 	/**
@@ -1185,7 +1189,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		}
 		
 		// Create a new hit task with Medium priority
-		ThreadPoolManager.getInstance().scheduleAi(new HitTask(target, damage1, crit1, miss1, attack.hasSoulshot(), shld1), sAtk);
+		ThreadPoolManager.getInstance().scheduleAi(new HitTask(this, target, damage1, crit1, miss1, attack.hasSoulshot(), shld1), sAtk);
 		
 		// Calculate and set the disable delay of the bow in function of the Attack Speed
 		_disableBowAttackEndTime = ((sAtk + reuse) / GameTimeController.MILLIS_IN_TICK) + GameTimeController.getInstance().getGameTicks();
@@ -1255,7 +1259,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		}
 		
 		// Create a new hit task with Medium priority
-		ThreadPoolManager.getInstance().scheduleAi(new HitTask(target, damage1, crit1, miss1, attack.hasSoulshot(), shld1), sAtk);
+		ThreadPoolManager.getInstance().scheduleAi(new HitTask(this, target, damage1, crit1, miss1, attack.hasSoulshot(), shld1), sAtk);
 		
 		// Calculate and set the disable delay of the bow in function of the Attack Speed
 		_disableCrossBowAttackEndTime = ((sAtk + reuse) / GameTimeController.MILLIS_IN_TICK) + GameTimeController.getInstance().getGameTicks();
@@ -1325,10 +1329,10 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		}
 		
 		// Create a new hit task with Medium priority for hit 1
-		ThreadPoolManager.getInstance().scheduleAi(new HitTask(target, damage1, crit1, miss1, attack.hasSoulshot(), shld1), sAtk / 2);
+		ThreadPoolManager.getInstance().scheduleAi(new HitTask(this, target, damage1, crit1, miss1, attack.hasSoulshot(), shld1), sAtk / 2);
 		
 		// Create a new hit task with Medium priority for hit 2 with a higher delay
-		ThreadPoolManager.getInstance().scheduleAi(new HitTask(target, damage2, crit2, miss2, attack.hasSoulshot(), shld2), sAtk);
+		ThreadPoolManager.getInstance().scheduleAi(new HitTask(this, target, damage2, crit2, miss2, attack.hasSoulshot(), shld2), sAtk);
 		
 		// Add those hits to the Server-Client packet Attack
 		attack.addHit(target, damage1, miss1, crit1, shld1);
@@ -1510,7 +1514,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		}
 		
 		// Create a new hit task with Medium priority
-		ThreadPoolManager.getInstance().scheduleAi(new HitTask(target, damage1, crit1, miss1, attack.hasSoulshot(), shld1), sAtk);
+		ThreadPoolManager.getInstance().scheduleAi(new HitTask(this, target, damage1, crit1, miss1, attack.hasSoulshot(), shld1), sAtk);
 		
 		// Add this hit to the Server-Client packet Attack
 		attack.addHit(target, damage1, miss1, crit1, shld1);
@@ -1964,7 +1968,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 			ThreadPoolManager.getInstance().scheduleEffect(new FlyToLocationTask(this, target, skill), 50);
 		}
 		
-		MagicUseTask mut = new MagicUseTask(targets, skill, skillTime, simultaneously);
+		MagicUseTask mut = new MagicUseTask(this, targets, skill, skillTime, simultaneously);
 		
 		// launch the magic in skillTime milliseconds
 		if (skillTime > 0)
@@ -1982,7 +1986,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 			
 			if (effectWhileCasting)
 			{
-				mut.phase = 2;
+				mut.setPhase(2);
 			}
 			
 			if (simultaneously)
@@ -2014,7 +2018,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		}
 		else
 		{
-			mut.skillTime = 0;
+			mut.setSkillTime(0);
 			onMagicLaunchedTimer(mut);
 		}
 	}
@@ -2952,191 +2956,6 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		}
 	}
 	
-	/**
-	 * Task launching the function onHitTimer().<br>
-	 * <B><U>Actions</U>:</B>
-	 * <ul>
-	 * <li>If the attacker/target is dead or use fake death, notify the AI with EVT_CANCEL and send a Server->Client packet ActionFailed (if attacker is a L2PcInstance)</li>
-	 * <li>If attack isn't aborted, send a message system (critical hit, missed...) to attacker/target if they are L2PcInstance</li>
-	 * <li>If attack isn't aborted and hit isn't missed, reduce HP of the target and calculate reflection damage to reduce HP of attacker if necessary</li>
-	 * <li>if attack isn't aborted and hit isn't missed, manage attack or cast break of the target (calculating rate, sending message...)</li>
-	 * </ul>
-	 */
-	class HitTask implements Runnable
-	{
-		L2Character _hitTarget;
-		int _damage;
-		boolean _crit;
-		boolean _miss;
-		byte _shld;
-		boolean _soulshot;
-		
-		public HitTask(L2Character target, int damage, boolean crit, boolean miss, boolean soulshot, byte shld)
-		{
-			_hitTarget = target;
-			_damage = damage;
-			_crit = crit;
-			_shld = shld;
-			_miss = miss;
-			_soulshot = soulshot;
-		}
-		
-		@Override
-		public void run()
-		{
-			try
-			{
-				onHitTimer(_hitTarget, _damage, _crit, _miss, _soulshot, _shld);
-			}
-			catch (Exception e)
-			{
-				_log.log(Level.SEVERE, "Failed executing HitTask.", e);
-			}
-		}
-	}
-	
-	/** Task launching the magic skill phases */
-	class MagicUseTask implements Runnable
-	{
-		L2Object[] targets;
-		L2Skill skill;
-		int count;
-		int skillTime;
-		int phase;
-		boolean simultaneously;
-		
-		public MagicUseTask(L2Object[] tgts, L2Skill s, int hit, boolean simultaneous)
-		{
-			targets = tgts;
-			skill = s;
-			count = 0;
-			phase = 1;
-			skillTime = hit;
-			simultaneously = simultaneous;
-		}
-		
-		@Override
-		public void run()
-		{
-			try
-			{
-				switch (phase)
-				{
-					case 1:
-						onMagicLaunchedTimer(this);
-						break;
-					case 2:
-						onMagicHitTimer(this);
-						break;
-					case 3:
-						onMagicFinalizer(this);
-						break;
-					default:
-						break;
-				}
-			}
-			catch (Exception e)
-			{
-				_log.log(Level.SEVERE, "Failed executing MagicUseTask.", e);
-				if (simultaneously)
-				{
-					setIsCastingSimultaneouslyNow(false);
-				}
-				else
-				{
-					setIsCastingNow(false);
-				}
-			}
-		}
-	}
-	
-	/** Task launching the function useMagic() */
-	private static class QueuedMagicUseTask implements Runnable
-	{
-		L2PcInstance _currPlayer;
-		L2Skill _queuedSkill;
-		boolean _isCtrlPressed;
-		boolean _isShiftPressed;
-		
-		public QueuedMagicUseTask(L2PcInstance currPlayer, L2Skill queuedSkill, boolean isCtrlPressed, boolean isShiftPressed)
-		{
-			_currPlayer = currPlayer;
-			_queuedSkill = queuedSkill;
-			_isCtrlPressed = isCtrlPressed;
-			_isShiftPressed = isShiftPressed;
-		}
-		
-		@Override
-		public void run()
-		{
-			try
-			{
-				_currPlayer.useMagic(_queuedSkill, _isCtrlPressed, _isShiftPressed);
-			}
-			catch (Exception e)
-			{
-				_log.log(Level.SEVERE, "Failed executing QueuedMagicUseTask.", e);
-			}
-		}
-	}
-	
-	/** Task of AI notification */
-	public class NotifyAITask implements Runnable
-	{
-		private final CtrlEvent _evt;
-		
-		NotifyAITask(CtrlEvent evt)
-		{
-			_evt = evt;
-		}
-		
-		@Override
-		public void run()
-		{
-			try
-			{
-				getAI().notifyEvent(_evt, null);
-			}
-			catch (Exception e)
-			{
-				_log.log(Level.WARNING, "NotifyAITask failed. " + e.getMessage() + " Actor " + L2Character.this, e);
-			}
-		}
-	}
-	
-	/** Task launching the magic skill phases */
-	class FlyToLocationTask implements Runnable
-	{
-		private final L2Object _tgt;
-		private final L2Character _actor;
-		private final L2Skill _skill;
-		
-		public FlyToLocationTask(L2Character actor, L2Object target, L2Skill skill)
-		{
-			_actor = actor;
-			_tgt = target;
-			_skill = skill;
-		}
-		
-		@Override
-		public void run()
-		{
-			try
-			{
-				FlyType _flyType;
-				
-				_flyType = FlyType.valueOf(_skill.getFlyType());
-				
-				broadcastPacket(new FlyToLocation(_actor, _tgt, _flyType));
-				setXYZ(_tgt.getX(), _tgt.getY(), _tgt.getZ());
-			}
-			catch (Exception e)
-			{
-				_log.log(Level.SEVERE, "Failed executing FlyToLocationTask.", e);
-			}
-		}
-	}
-	
 	// TODO: Abnormal Effect - NEED TO REMOVE ONCE L2CHARABNORMALEFFECT IS COMPLETE
 	/** Map 32 bits (0x0000) containing all abnormal effect in progress */
 	private int _AbnormalEffects;
@@ -3615,7 +3434,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		 */
 		public NotifyAITask newNotifyTask(CtrlEvent evt)
 		{
-			return new NotifyAITask(evt);
+			return new NotifyAITask(getActor(), evt);
 		}
 		
 		/**
@@ -4824,7 +4643,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		// Create a task to notify the AI that L2Character arrives at a check point of the movement
 		if ((ticksToMove * GameTimeController.MILLIS_IN_TICK) > 3000)
 		{
-			ThreadPoolManager.getInstance().scheduleAi(new NotifyAITask(CtrlEvent.EVT_ARRIVED_REVALIDATE), 2000);
+			ThreadPoolManager.getInstance().scheduleAi(new NotifyAITask(this, CtrlEvent.EVT_ARRIVED_REVALIDATE), 2000);
 		}
 		
 		// the CtrlEvent.EVT_ARRIVED will be sent when the character will actually arrive
@@ -4905,7 +4724,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		// Create a task to notify the AI that L2Character arrives at a check point of the movement
 		if ((ticksToMove * GameTimeController.MILLIS_IN_TICK) > 3000)
 		{
-			ThreadPoolManager.getInstance().scheduleAi(new NotifyAITask(CtrlEvent.EVT_ARRIVED_REVALIDATE), 2000);
+			ThreadPoolManager.getInstance().scheduleAi(new NotifyAITask(this, CtrlEvent.EVT_ARRIVED_REVALIDATE), 2000);
 		}
 		
 		// the CtrlEvent.EVT_ARRIVED will be sent when the character will actually arrive
@@ -5249,7 +5068,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 	 * @param soulshot True if SoulShot are charged
 	 * @param shld True if shield is efficient
 	 */
-	protected void onHitTimer(L2Character target, int damage, boolean crit, boolean miss, boolean soulshot, byte shld)
+	public void onHitTimer(L2Character target, int damage, boolean crit, boolean miss, boolean soulshot, byte shld)
 	{
 		// If the attacker/target is dead or use fake death, notify the AI with EVT_CANCEL
 		// and send a Server->Client packet ActionFailed (if attacker is a L2PcInstance)
@@ -6010,8 +5829,8 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 	 */
 	public void onMagicLaunchedTimer(MagicUseTask mut)
 	{
-		final L2Skill skill = mut.skill;
-		L2Object[] targets = mut.targets;
+		final L2Skill skill = mut.getSkill();
+		L2Object[] targets = mut.getTargets();
 		
 		if ((skill == null) || (targets == null))
 		{
@@ -6108,13 +5927,13 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 				abortCast();
 				return;
 			}
-			mut.targets = targetList.toArray(new L2Character[targetList.size()]);
+			mut.setTargets(targetList.toArray(new L2Character[targetList.size()]));
 		}
 		
 		// Ensure that a cast is in progress
 		// Check if player is using fake death.
 		// Static skills can be used while faking death.
-		if ((mut.simultaneously && !isCastingSimultaneouslyNow()) || (!mut.simultaneously && !isCastingNow()) || (isAlikeDead() && !skill.isStatic()))
+		if ((mut.isSimultaneous() && !isCastingSimultaneouslyNow()) || (!mut.isSimultaneous() && !isCastingNow()) || (isAlikeDead() && !skill.isStatic()))
 		{
 			// now cancels both, simultaneous and normal
 			getAI().notifyEvent(CtrlEvent.EVT_CANCEL);
@@ -6127,8 +5946,8 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 			broadcastPacket(new MagicSkillLaunched(this, skill.getDisplayId(), skill.getDisplayLevel(), targets));
 		}
 		
-		mut.phase = 2;
-		if (mut.skillTime == 0)
+		mut.setPhase(2);
+		if (mut.getSkillTime() == 0)
 		{
 			onMagicHitTimer(mut);
 		}
@@ -6141,8 +5960,8 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 	// Runs in the end of skill casting
 	public void onMagicHitTimer(MagicUseTask mut)
 	{
-		final L2Skill skill = mut.skill;
-		final L2Object[] targets = mut.targets;
+		final L2Skill skill = mut.getSkill();
+		final L2Object[] targets = mut.getTargets();
 		
 		if ((skill == null) || (targets == null))
 		{
@@ -6152,7 +5971,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		
 		if (getFusionSkill() != null)
 		{
-			if (mut.simultaneously)
+			if (mut.isSimultaneous())
 			{
 				_skillCast2 = null;
 				setIsCastingSimultaneouslyNow(false);
@@ -6169,7 +5988,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		L2Effect mog = getFirstEffect(L2EffectType.SIGNET_GROUND);
 		if (mog != null)
 		{
-			if (mut.simultaneously)
+			if (mut.isSimultaneous())
 			{
 				_skillCast2 = null;
 				setIsCastingSimultaneouslyNow(false);
@@ -6282,16 +6101,16 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 			}
 			
 			// On each repeat restore shots before cast
-			if (mut.count > 0)
+			if (mut.getCount() > 0)
 			{
 				final L2ItemInstance weaponInst = getActiveWeaponInstance();
 				if (weaponInst != null)
 				{
-					if (mut.skill.useSoulShot())
+					if (mut.getSkill().useSoulShot())
 					{
 						setChargedShot(ShotType.SOULSHOTS, true);
 					}
-					else if (mut.skill.useSpiritShot())
+					else if (mut.getSkill().useSpiritShot())
 					{
 						setChargedShot(ShotType.SPIRITSHOTS, true);
 					}
@@ -6299,20 +6118,20 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 			}
 			
 			// Launch the magic skill in order to calculate its effects
-			callSkill(mut.skill, mut.targets);
+			callSkill(mut.getSkill(), mut.getTargets());
 		}
 		catch (NullPointerException e)
 		{
 			_log.log(Level.WARNING, "", e);
 		}
 		
-		if (mut.skillTime > 0)
+		if (mut.getSkillTime() > 0)
 		{
-			mut.count++;
-			if (mut.count < skill.getHitCounts())
+			mut.setCount(mut.getCount() + 1);
+			if (mut.getCount() < skill.getHitCounts())
 			{
-				int skillTime = (mut.skillTime * skill.getHitTimings()[mut.count]) / 100;
-				if (mut.simultaneously)
+				int skillTime = (mut.getSkillTime() * skill.getHitTimings()[mut.getCount()]) / 100;
+				if (mut.isSimultaneous())
 				{
 					_skillCast2 = ThreadPoolManager.getInstance().scheduleEffect(mut, skillTime);
 				}
@@ -6324,14 +6143,14 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 			}
 		}
 		
-		mut.phase = 3;
-		if (mut.skillTime == 0)
+		mut.setPhase(3);
+		if (mut.getSkillTime() == 0)
 		{
 			onMagicFinalizer(mut);
 		}
 		else
 		{
-			if (mut.simultaneously)
+			if (mut.isSimultaneous())
 			{
 				_skillCast2 = ThreadPoolManager.getInstance().scheduleEffect(mut, 0);
 			}
@@ -6345,7 +6164,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 	// Runs after skillTime
 	public void onMagicFinalizer(MagicUseTask mut)
 	{
-		if (mut.simultaneously)
+		if (mut.isSimultaneous())
 		{
 			_skillCast2 = null;
 			setIsCastingSimultaneouslyNow(false);
@@ -6356,8 +6175,8 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		setIsCastingNow(false);
 		_castInterruptTime = 0;
 		
-		final L2Skill skill = mut.skill;
-		final L2Object target = mut.targets.length > 0 ? mut.targets[0] : null;
+		final L2Skill skill = mut.getSkill();
+		final L2Object target = mut.getTargets().length > 0 ? mut.getTargets()[0] : null;
 		
 		// Attack target after skill use
 		if ((skill.nextActionIsAttack()) && (getTarget() instanceof L2Character) && (getTarget() != this) && (target != null) && (getTarget() == target) && target.isAttackable())
@@ -7351,32 +7170,6 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		return _AIdisabled;
 	}
 	
-	/** Task for potion and herb queue */
-	private static class UsePotionTask implements Runnable
-	{
-		private final L2Character _activeChar;
-		private final L2Skill _skill;
-		
-		UsePotionTask(L2Character activeChar, L2Skill skill)
-		{
-			_activeChar = activeChar;
-			_skill = skill;
-		}
-		
-		@Override
-		public void run()
-		{
-			try
-			{
-				_activeChar.doSimultaneousCast(_skill);
-			}
-			catch (Exception e)
-			{
-				_log.log(Level.WARNING, "", e);
-			}
-		}
-	}
-	
 	/**
 	 * @return true
 	 */

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -5787,7 +5787,7 @@ public final class L2PcInstance extends L2Playable
 			return;
 		}
 		
-		if (isCursedWeaponEquipped())
+		if (isCursedWeaponEquipped() && target.isPlayer())
 		{
 			CursedWeaponsManager.getInstance().increaseKills(_cursedWeaponEquippedId);
 			return;

+ 55 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/tasks/character/FlyToLocationTask.java

@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2004-2013 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.model.actor.tasks.character;
+
+import com.l2jserver.gameserver.model.L2Object;
+import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.skills.L2Skill;
+import com.l2jserver.gameserver.network.serverpackets.FlyToLocation;
+import com.l2jserver.gameserver.network.serverpackets.FlyToLocation.FlyType;
+
+/**
+ * Task dedicated to fly a player to the location
+ * @author xban1x
+ */
+public final class FlyToLocationTask implements Runnable
+{
+	private final L2Character _character;
+	private final L2Object _target;
+	private final L2Skill _skill;
+	
+	public FlyToLocationTask(L2Character character, L2Object target, L2Skill skill)
+	{
+		_character = character;
+		_target = target;
+		_skill = skill;
+	}
+	
+	@Override
+	public void run()
+	{
+		if (_character != null)
+		{
+			final FlyType flyType;
+			flyType = FlyType.valueOf(_skill.getFlyType());
+			_character.broadcastPacket(new FlyToLocation(_character, _target, flyType));
+			_character.setXYZ(_target.getX(), _target.getY(), _target.getZ());
+		}
+	}
+}

+ 63 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/tasks/character/HitTask.java

@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2004-2013 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.model.actor.tasks.character;
+
+import com.l2jserver.gameserver.model.actor.L2Character;
+
+/**
+ * Task launching the function onHitTimer().<br>
+ * <B><U>Actions</U>:</B>
+ * <ul>
+ * <li>If the attacker/target is dead or use fake death, notify the AI with EVT_CANCEL and send a Server->Client packet ActionFailed (if attacker is a L2PcInstance)</li>
+ * <li>If attack isn't aborted, send a message system (critical hit, missed...) to attacker/target if they are L2PcInstance</li>
+ * <li>If attack isn't aborted and hit isn't missed, reduce HP of the target and calculate reflection damage to reduce HP of attacker if necessary</li>
+ * <li>if attack isn't aborted and hit isn't missed, manage attack or cast break of the target (calculating rate, sending message...)</li>
+ * </ul>
+ * @author xban1x
+ */
+public final class HitTask implements Runnable
+{
+	private final L2Character _character;
+	private final L2Character _hitTarget;
+	private final int _damage;
+	private final boolean _crit;
+	private final boolean _miss;
+	private final byte _shld;
+	private final boolean _soulshot;
+	
+	public HitTask(L2Character character, L2Character target, int damage, boolean crit, boolean miss, boolean soulshot, byte shld)
+	{
+		_character = character;
+		_hitTarget = target;
+		_damage = damage;
+		_crit = crit;
+		_shld = shld;
+		_miss = miss;
+		_soulshot = soulshot;
+	}
+	
+	@Override
+	public void run()
+	{
+		if (_character != null)
+		{
+			_character.onHitTimer(_hitTarget, _damage, _crit, _miss, _soulshot, _shld);
+		}
+	}
+}

+ 126 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/tasks/character/MagicUseTask.java

@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2004-2013 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.model.actor.tasks.character;
+
+import com.l2jserver.gameserver.model.L2Object;
+import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.skills.L2Skill;
+
+/**
+ * Task dedicated to magic use of character
+ * @author xban1x
+ */
+public final class MagicUseTask implements Runnable
+{
+	private final L2Character _character;
+	private L2Object[] _targets;
+	private final L2Skill _skill;
+	private int _count;
+	private int _skillTime;
+	private int _phase;
+	private final boolean _simultaneously;
+	
+	public MagicUseTask(L2Character character, L2Object[] tgts, L2Skill s, int hit, boolean simultaneous)
+	{
+		_character = character;
+		_targets = tgts;
+		_skill = s;
+		_count = 0;
+		_phase = 1;
+		_skillTime = hit;
+		_simultaneously = simultaneous;
+	}
+	
+	@Override
+	public void run()
+	{
+		if (_character == null)
+		{
+			return;
+		}
+		switch (_phase)
+		{
+			case 1:
+			{
+				_character.onMagicLaunchedTimer(this);
+				break;
+			}
+			case 2:
+			{
+				_character.onMagicHitTimer(this);
+				break;
+			}
+			case 3:
+			{
+				_character.onMagicFinalizer(this);
+				break;
+			}
+		}
+	}
+	
+	public int getCount()
+	{
+		return _count;
+	}
+	
+	public int getPhase()
+	{
+		return _phase;
+	}
+	
+	public L2Skill getSkill()
+	{
+		return _skill;
+	}
+	
+	public int getSkillTime()
+	{
+		return _skillTime;
+	}
+	
+	public L2Object[] getTargets()
+	{
+		return _targets;
+	}
+	
+	public boolean isSimultaneous()
+	{
+		return _simultaneously;
+	}
+	
+	public void setCount(int count)
+	{
+		_count = count;
+	}
+	
+	public void setPhase(int phase)
+	{
+		_phase = phase;
+	}
+	
+	public void setSkillTime(int skillTime)
+	{
+		_skillTime = skillTime;
+	}
+	
+	public void setTargets(L2Object[] targets)
+	{
+		_targets = targets;
+	}
+}

+ 47 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/tasks/character/NotifyAITask.java

@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2004-2013 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.model.actor.tasks.character;
+
+import com.l2jserver.gameserver.ai.CtrlEvent;
+import com.l2jserver.gameserver.model.actor.L2Character;
+
+/**
+ * Task dedicated to notify character's AI
+ * @author xban1x
+ */
+public final class NotifyAITask implements Runnable
+{
+	private final L2Character _character;
+	private final CtrlEvent _event;
+	
+	public NotifyAITask(L2Character character, CtrlEvent event)
+	{
+		_character = character;
+		_event = event;
+	}
+	
+	@Override
+	public void run()
+	{
+		if (_character != null)
+		{
+			_character.getAI().notifyEvent(_event, null);
+		}
+	}
+}

+ 51 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/tasks/character/QueuedMagicUseTask.java

@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2004-2013 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.model.actor.tasks.character;
+
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.skills.L2Skill;
+
+/**
+ * Task dedicated to qued magic use of character
+ * @author xban1x
+ */
+public final class QueuedMagicUseTask implements Runnable
+{
+	private final L2PcInstance _currPlayer;
+	private final L2Skill _queuedSkill;
+	private final boolean _isCtrlPressed;
+	private final boolean _isShiftPressed;
+	
+	public QueuedMagicUseTask(L2PcInstance currPlayer, L2Skill queuedSkill, boolean isCtrlPressed, boolean isShiftPressed)
+	{
+		_currPlayer = currPlayer;
+		_queuedSkill = queuedSkill;
+		_isCtrlPressed = isCtrlPressed;
+		_isShiftPressed = isShiftPressed;
+	}
+	
+	@Override
+	public void run()
+	{
+		if (_currPlayer != null)
+		{
+			_currPlayer.useMagic(_queuedSkill, _isCtrlPressed, _isShiftPressed);
+		}
+	}
+}

+ 47 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/tasks/character/UsePotionTask.java

@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2004-2013 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.model.actor.tasks.character;
+
+import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.skills.L2Skill;
+
+/**
+ * Task dedicated to use potion of character
+ * @author xban1x
+ */
+public final class UsePotionTask implements Runnable
+{
+	private final L2Character _character;
+	private final L2Skill _skill;
+	
+	public UsePotionTask(L2Character character, L2Skill skill)
+	{
+		_character = character;
+		_skill = skill;
+	}
+	
+	@Override
+	public void run()
+	{
+		if (_character != null)
+		{
+			_character.doSimultaneousCast(_skill);
+		}
+	}
+}