2
0
Эх сурвалжийг харах

BETA: Action improvements.
* Removed custom system message.
* Code cleanup and improvements.
* Reviewed player distance for couple actions.
* Reported by: oscard, Konstantinos, u3games
* AnswerCoupleAction Patch by: _Blade_
* Removed "You carefully nock an arrow." system message, not used anymore.
* Reported by: lion
* Retail like behaviour for bow and skill casting.
* Reported by: Kingzor

Zoey76 12 жил өмнө
parent
commit
777d75f672

+ 42 - 13
L2J_Server_BETA/java/com/l2jserver/gameserver/ai/L2CharacterAI.java

@@ -33,7 +33,9 @@ import java.util.List;
 import javolution.util.FastList;
 import javolution.util.FastList;
 
 
 import com.l2jserver.Config;
 import com.l2jserver.Config;
+import com.l2jserver.gameserver.GameTimeController;
 import com.l2jserver.gameserver.GeoData;
 import com.l2jserver.gameserver.GeoData;
+import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.instancemanager.WalkingManager;
 import com.l2jserver.gameserver.instancemanager.WalkingManager;
 import com.l2jserver.gameserver.model.L2CharPosition;
 import com.l2jserver.gameserver.model.L2CharPosition;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.L2Object;
@@ -90,6 +92,34 @@ public class L2CharacterAI extends AbstractAI
 		}
 		}
 	}
 	}
 	
 	
+	/**
+	 * Cast Task
+	 * @author Zoey76
+	 */
+	public static class CastTask implements Runnable
+	{
+		private final L2Character _activeChar;
+		private final L2Object _target;
+		private final L2Skill _skill;
+		
+		public CastTask(L2Character actor, L2Skill skill, L2Object target)
+		{
+			_activeChar = actor;
+			_target = target;
+			_skill = skill;
+		}
+		
+		@Override
+		public void run()
+		{
+			if (_activeChar.isAttackingNow())
+			{
+				_activeChar.abortAttack();
+			}
+			_activeChar.getAI().changeIntentionToCast(_skill, _target);
+		}
+	}
+	
 	/**
 	/**
 	 * Constructor of L2CharacterAI.
 	 * Constructor of L2CharacterAI.
 	 * @param accessor The AI accessor of the L2Character
 	 * @param accessor The AI accessor of the L2Character
@@ -293,23 +323,22 @@ public class L2CharacterAI extends AbstractAI
 			return;
 			return;
 		}
 		}
 		
 		
-		// Set the AI cast target
-		setCastTarget((L2Character) target);
-		
-		// Stop actions client-side to cast the skill
-		if (skill.getHitTime() > 50)
+		if (_actor.getBowAttackEndTime() > GameTimeController.getGameTicks())
 		{
 		{
-			// Abort the attack of the L2Character and send Server->Client ActionFailed packet
-			_actor.abortAttack();
-			
-			// Cancel action client side by sending Server->Client packet ActionFailed to the L2PcInstance actor
-			// no need for second ActionFailed packet, abortAttack() already sent it
-			// clientActionFailed();
+			ThreadPoolManager.getInstance().scheduleGeneral(new CastTask(_actor, skill, target), (_actor.getBowAttackEndTime() - GameTimeController.getGameTicks()) * GameTimeController.MILLIS_IN_TICK);
 		}
 		}
-		
+		else
+		{
+			changeIntentionToCast(skill, target);
+		}
+	}
+	
+	protected void changeIntentionToCast(L2Skill skill, L2Object target)
+	{
+		// Set the AI cast target
+		setCastTarget((L2Character) target);
 		// Set the AI skill used by INTENTION_CAST
 		// Set the AI skill used by INTENTION_CAST
 		_skill = skill;
 		_skill = skill;
-		
 		// Change the Intention of this AbstractAI to AI_INTENTION_CAST
 		// Change the Intention of this AbstractAI to AI_INTENTION_CAST
 		changeIntention(AI_INTENTION_CAST, skill, target);
 		changeIntention(AI_INTENTION_CAST, skill, target);
 		
 		

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

@@ -798,17 +798,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 	 */
 	 */
 	protected void doAttack(L2Character target)
 	protected void doAttack(L2Character target)
 	{
 	{
-		if (target == null)
-		{
-			return;
-		}
-		
-		if (isAttackingDisabled())
-		{
-			return;
-		}
-		
-		if (!fireAttackListeners(target))
+		if ((target == null) || isAttackingDisabled() || !fireAttackListeners(target))
 		{
 		{
 			return;
 			return;
 		}
 		}
@@ -1060,24 +1050,13 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		rechargeShots(true, false);
 		rechargeShots(true, false);
 		
 		
 		// Verify if soulshots are charged.
 		// Verify if soulshots are charged.
-		boolean wasSSCharged = isChargedShot(ShotType.SOULSHOTS);
-		
+		final boolean wasSSCharged = isChargedShot(ShotType.SOULSHOTS);
 		// Get the Attack Speed of the L2Character (delay (in milliseconds) before next attack)
 		// Get the Attack Speed of the L2Character (delay (in milliseconds) before next attack)
-		int timeAtk = calculateTimeBetweenAttacks(target, weaponItem);
-		
+		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
 		// the hit is calculated to happen halfway to the animation - might need further tuning e.g. in bow case
-		int timeToHit = timeAtk / 2;
-		_attackEndTime = GameTimeController.getGameTicks();
-		_attackEndTime += (timeAtk / GameTimeController.MILLIS_IN_TICK);
-		_attackEndTime -= 1;
-		
-		int ssGrade = 0;
-		
-		if (weaponItem != null)
-		{
-			ssGrade = weaponItem.getItemGradeSPlus();
-		}
-		
+		final int timeToHit = timeAtk / 2;
+		_attackEndTime = (GameTimeController.getGameTicks() + (timeAtk / GameTimeController.MILLIS_IN_TICK)) - 1;
+		final int ssGrade = (weaponItem != null) ? weaponItem.getItemGradeSPlus() : 0;
 		// Create a Server->Client packet Attack
 		// Create a Server->Client packet Attack
 		Attack attack = new Attack(this, target, wasSSCharged, ssGrade);
 		Attack attack = new Attack(this, target, wasSSCharged, ssGrade);
 		
 		
@@ -1145,7 +1124,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 			{
 			{
 				if (player.isCursedWeaponEquipped())
 				if (player.isCursedWeaponEquipped())
 				{
 				{
-					// If hitted by a cursed weapon, Cp is reduced to 0
+					// If hit by a cursed weapon, CP is reduced to 0
 					if (!target.isInvul())
 					if (!target.isInvul())
 					{
 					{
 						target.setCurrentCp(0);
 						target.setCurrentCp(0);
@@ -1153,7 +1132,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 				}
 				}
 				else if (player.isHero())
 				else if (player.isHero())
 				{
 				{
-					// If a cursed weapon is hit by a Hero, Cp is reduced to 0
+					// If a cursed weapon is hit by a Hero, CP is reduced to 0
 					if (target.isPlayer() && target.getActingPlayer().isCursedWeaponEquipped())
 					if (target.isPlayer() && target.getActingPlayer().isCursedWeaponEquipped())
 					{
 					{
 						target.setCurrentCp(0);
 						target.setCurrentCp(0);
@@ -1227,12 +1206,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		// Check if the L2Character is a L2PcInstance
 		// Check if the L2Character is a L2PcInstance
 		if (isPlayer())
 		if (isPlayer())
 		{
 		{
-			// Send a system message
-			sendPacket(SystemMessageId.GETTING_READY_TO_SHOOT_AN_ARROW);
-			
-			// Send a Server->Client packet SetupGauge
-			SetupGauge sg = new SetupGauge(SetupGauge.RED, sAtk + reuse);
-			sendPacket(sg);
+			sendPacket(new SetupGauge(SetupGauge.RED, sAtk + reuse));
 		}
 		}
 		
 		
 		// Create a new hit task with Medium priority
 		// Create a new hit task with Medium priority
@@ -2600,7 +2574,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 	 */
 	 */
 	public boolean isAttackingDisabled()
 	public boolean isAttackingDisabled()
 	{
 	{
-		return isFlying() || isStunned() || isSleeping() || (_attackEndTime > GameTimeController.getGameTicks()) || isAlikeDead() || isParalyzed() || isPhysicalAttackMuted() || isCoreAIDisabled();
+		return isFlying() || isStunned() || isSleeping() || isAttackingNow() || isAlikeDead() || isParalyzed() || isPhysicalAttackMuted() || isCoreAIDisabled();
 	}
 	}
 	
 	
 	public final Calculator[] getCalculators()
 	public final Calculator[] getCalculators()
@@ -5958,31 +5932,20 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 	 */
 	 */
 	public int calculateTimeBetweenAttacks(L2Character target, L2Weapon weapon)
 	public int calculateTimeBetweenAttacks(L2Character target, L2Weapon weapon)
 	{
 	{
-		double atkSpd = 0;
 		if ((weapon != null) && !isTransformed())
 		if ((weapon != null) && !isTransformed())
 		{
 		{
 			switch (weapon.getItemType())
 			switch (weapon.getItemType())
 			{
 			{
 				case BOW:
 				case BOW:
-					atkSpd = getStat().getPAtkSpd();
-					return (int) ((1500 * 345) / atkSpd);
+					return (1500 * 345) / getPAtkSpd();
 				case CROSSBOW:
 				case CROSSBOW:
-					atkSpd = getStat().getPAtkSpd();
-					return (int) ((1200 * 345) / atkSpd);
+					return (1200 * 345) / getPAtkSpd();
 				case DAGGER:
 				case DAGGER:
-					atkSpd = getStat().getPAtkSpd();
 					// atkSpd /= 1.15;
 					// atkSpd /= 1.15;
 					break;
 					break;
-				default:
-					atkSpd = getStat().getPAtkSpd();
 			}
 			}
 		}
 		}
-		else
-		{
-			atkSpd = getPAtkSpd();
-		}
-		
-		return Formulas.calcPAtkSpd(this, target, atkSpd);
+		return Formulas.calcPAtkSpd(this, target, getPAtkSpd());
 	}
 	}
 	
 	
 	public int calculateReuseTime(L2Character target, L2Weapon weapon)
 	public int calculateReuseTime(L2Character target, L2Weapon weapon)
@@ -7298,6 +7261,11 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		return _attackEndTime;
 		return _attackEndTime;
 	}
 	}
 	
 	
+	public int getBowAttackEndTime()
+	{
+		return _disableBowAttackEndTime;
+	}
+	
 	/**
 	/**
 	 * Not Implemented.
 	 * Not Implemented.
 	 * @return
 	 * @return

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

@@ -7355,34 +7355,21 @@ public final class L2PcInstance extends L2Playable
 		return false;
 		return false;
 	}
 	}
 	
 	
-	/**
-	 * Return True if the L2PcInstance use a dual weapon.
-	 */
 	@Override
 	@Override
 	public boolean isUsingDualWeapon()
 	public boolean isUsingDualWeapon()
 	{
 	{
-		L2Weapon weaponItem = getActiveWeaponItem();
-		if (weaponItem == null)
-		{
-			return false;
-		}
-		
-		if (weaponItem.getItemType() == L2WeaponType.DUAL)
+		final L2Weapon weaponItem = getActiveWeaponItem();
+		if (weaponItem != null)
 		{
 		{
-			return true;
-		}
-		else if (weaponItem.getItemType() == L2WeaponType.DUALFIST)
-		{
-			return true;
-		}
-		else if (weaponItem.getItemType() == L2WeaponType.DUALDAGGER)
-		{
-			return true;
-		}
-		else
-		{
-			return false;
+			switch (weaponItem.getItemType())
+			{
+				case DUAL:
+				case DUALFIST:
+				case DUALDAGGER:
+					return true;
+			}
 		}
 		}
+		return false;
 	}
 	}
 	
 	
 	public void setUptime(long time)
 	public void setUptime(long time)

+ 3 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/AnswerCoupleAction.java

@@ -64,10 +64,10 @@ public class AnswerCoupleAction extends L2GameClientPacket
 		}
 		}
 		else if (_answer == 1) // approve
 		else if (_answer == 1) // approve
 		{
 		{
-			double distance = activeChar.getPlanDistanceSq(target);
-			if ((distance > 2000) || (distance < 70))
+			final int distance = (int) Math.sqrt(activeChar.getPlanDistanceSq(target));
+			if ((distance > 900) || (distance < 40) || (activeChar.getObjectId() == target.getObjectId()))
 			{
 			{
-				activeChar.sendPacket(SystemMessageId.TARGET_DO_NOT_MEET_LOC_REQUIREMENTS);
+				sendPacket(SystemMessageId.TARGET_DO_NOT_MEET_LOC_REQUIREMENTS);
 				target.sendPacket(SystemMessageId.TARGET_DO_NOT_MEET_LOC_REQUIREMENTS);
 				target.sendPacket(SystemMessageId.TARGET_DO_NOT_MEET_LOC_REQUIREMENTS);
 				return;
 				return;
 			}
 			}

+ 4 - 11
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestActionUse.java

@@ -96,15 +96,8 @@ public final class RequestActionUse extends L2GameClientPacket
 			_log.finest(activeChar + " requested action use Id: " + _actionId + " Ctrl pressed:" + _ctrlPressed + " Shift pressed:" + _shiftPressed);
 			_log.finest(activeChar + " requested action use Id: " + _actionId + " Ctrl pressed:" + _ctrlPressed + " Shift pressed:" + _shiftPressed);
 		}
 		}
 		
 		
-		// Don't do anything if player is dead
-		if (activeChar.isAlikeDead() || activeChar.isDead())
-		{
-			sendPacket(ActionFailed.STATIC_PACKET);
-			return;
-		}
-		
-		// Don't do anything if player is confused
-		if (activeChar.isOutOfControl())
+		// Don't do anything if player is dead or confused
+		if (activeChar.isAlikeDead() || activeChar.isDead() || activeChar.isOutOfControl())
 		{
 		{
 			sendPacket(ActionFailed.STATIC_PACKET);
 			sendPacket(ActionFailed.STATIC_PACKET);
 			return;
 			return;
@@ -951,8 +944,8 @@ public final class RequestActionUse extends L2GameClientPacket
 			return;
 			return;
 		}
 		}
 		
 		
-		final double distance = Math.sqrt(requester.getPlanDistanceSq(target));
-		if ((distance > 2000) || (distance < 70) || (requester.getObjectId() == target.getObjectId()))
+		final int distance = (int) Math.sqrt(requester.getPlanDistanceSq(target));
+		if ((distance > 900) || (distance < 40) || (requester.getObjectId() == target.getObjectId()))
 		{
 		{
 			sendPacket(SystemMessageId.TARGET_DO_NOT_MEET_LOC_REQUIREMENTS);
 			sendPacket(SystemMessageId.TARGET_DO_NOT_MEET_LOC_REQUIREMENTS);
 			return;
 			return;

+ 0 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestMagicSkillUse.java

@@ -30,10 +30,6 @@ import com.l2jserver.gameserver.model.skills.L2SkillType;
 import com.l2jserver.gameserver.model.skills.targets.L2TargetType;
 import com.l2jserver.gameserver.model.skills.targets.L2TargetType;
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 
 
-/**
- * This class ...
- * @version $Revision: 1.7.2.1.2.3 $ $Date: 2005/03/27 15:29:30 $
- */
 public final class RequestMagicSkillUse extends L2GameClientPacket
 public final class RequestMagicSkillUse extends L2GameClientPacket
 {
 {
 	private static final String _C__39_REQUESTMAGICSKILLUSE = "[C] 39 RequestMagicSkillUse";
 	private static final String _C__39_REQUESTMAGICSKILLUSE = "[C] 39 RequestMagicSkillUse";

+ 6 - 16
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/UseItem.java

@@ -49,10 +49,6 @@ import com.l2jserver.gameserver.network.serverpackets.ExUseSharedGroupItem;
 import com.l2jserver.gameserver.network.serverpackets.ItemList;
 import com.l2jserver.gameserver.network.serverpackets.ItemList;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 
 
-/**
- * This class ...
- * @version $Revision: 1.18.2.7.2.9 $ $Date: 2005/03/27 15:29:30 $
- */
 public final class UseItem extends L2GameClientPacket
 public final class UseItem extends L2GameClientPacket
 {
 {
 	private static final String _C__19_USEITEM = "[C] 19 UseItem";
 	private static final String _C__19_USEITEM = "[C] 19 UseItem";
@@ -62,12 +58,12 @@ public final class UseItem extends L2GameClientPacket
 	private int _itemId;
 	private int _itemId;
 	
 	
 	/** Weapon Equip Task */
 	/** Weapon Equip Task */
-	public static class WeaponEquipTask implements Runnable
+	private static class WeaponEquipTask implements Runnable
 	{
 	{
 		L2ItemInstance item;
 		L2ItemInstance item;
 		L2PcInstance activeChar;
 		L2PcInstance activeChar;
 		
 		
-		public WeaponEquipTask(L2ItemInstance it, L2PcInstance character)
+		protected WeaponEquipTask(L2ItemInstance it, L2PcInstance character)
 		{
 		{
 			item = it;
 			item = it;
 			activeChar = character;
 			activeChar = character;
@@ -145,7 +141,7 @@ public final class UseItem extends L2GameClientPacket
 		}
 		}
 		
 		
 		// Char cannot use item when dead
 		// Char cannot use item when dead
-		if (activeChar.isDead())
+		if (activeChar.isDead() || !activeChar.getInventory().canManipulateWithItemId(item.getItemId()))
 		{
 		{
 			final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CANNOT_BE_USED);
 			final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CANNOT_BE_USED);
 			sm.addItemName(item);
 			sm.addItemName(item);
@@ -159,12 +155,6 @@ public final class UseItem extends L2GameClientPacket
 		}
 		}
 		
 		
 		_itemId = item.getItemId();
 		_itemId = item.getItemId();
-		if (!activeChar.getInventory().canManipulateWithItemId(_itemId))
-		{
-			activeChar.sendMessage("Cannot use this item.");
-			return;
-		}
-		
 		if (activeChar.isFishing() && ((_itemId < 6535) || (_itemId > 6540)))
 		if (activeChar.isFishing() && ((_itemId < 6535) || (_itemId > 6540)))
 		{
 		{
 			// You cannot do anything else while fishing
 			// You cannot do anything else while fishing
@@ -174,10 +164,10 @@ public final class UseItem extends L2GameClientPacket
 		
 		
 		if (!Config.ALT_GAME_KARMA_PLAYER_CAN_TELEPORT && (activeChar.getKarma() > 0))
 		if (!Config.ALT_GAME_KARMA_PLAYER_CAN_TELEPORT && (activeChar.getKarma() > 0))
 		{
 		{
-			SkillHolder[] sHolders = item.getItem().getSkills();
-			if (sHolders != null)
+			SkillHolder[] skills = item.getItem().getSkills();
+			if (skills != null)
 			{
 			{
-				for (SkillHolder sHolder : sHolders)
+				for (SkillHolder sHolder : skills)
 				{
 				{
 					L2Skill skill = sHolder.getSkill();
 					L2Skill skill = sHolder.getSkill();
 					if ((skill != null) && ((skill.getSkillType() == L2SkillType.TELEPORT) || (skill.getSkillType() == L2SkillType.RECALL)))
 					if ((skill != null) && ((skill.getSkillType() == L2SkillType.TELEPORT) || (skill.getSkillType() == L2SkillType.RECALL)))