Ver Fonte

TargetMe update: target locked until effect gone off.
Aggression type skills become retail like now (maybe effect time need to be increased).
Character does not perform autoattack on aggression (retail like).
Siege summons not affected (need retail check).
If character was different - attack and cast stopped (need retail check).

_DS_ há 16 anos atrás
pai
commit
cf2aa18aa3

+ 6 - 0
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/L2Npc.java

@@ -537,6 +537,12 @@ public class L2Npc extends L2Character
 			player.sendPacket(ActionFailed.STATIC_PACKET);
 			return false;
 		}
+		if (player.isLockedTarget() && player.getLockedTarget() != this)
+		{
+			player.sendPacket(new SystemMessage(SystemMessageId.FAILED_CHANGE_TARGET));
+			player.sendPacket(ActionFailed.STATIC_PACKET);
+			return false;
+		}
 		// TODO: More checks...
 
 		return true;

+ 18 - 1
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/L2Playable.java

@@ -41,7 +41,9 @@ public abstract class L2Playable extends L2Character
 	private boolean _isPhoenixBlessed = false; 		// for Soul of The Phoenix or Salvation buffs
 	private boolean _isSilentMoving = false;		// Silent Move
 	private boolean _ProtectionBlessing = false;
-	
+
+	private L2Character _lockedTarget = null;
+
 	/**
 	 * Constructor of L2PlayableInstance (use L2Character constructor).<BR><BR>
 	 *
@@ -308,4 +310,19 @@ public abstract class L2Playable extends L2Character
 		setCharmOfLuck(false);
 		updateAbnormalEffect();
 	}
+
+	public boolean isLockedTarget()
+	{
+		return _lockedTarget != null;
+	}
+
+	public L2Character getLockedTarget()
+	{
+		return _lockedTarget;
+	}
+
+	public void setLockedTarget(L2Character cha)
+	{
+		_lockedTarget = cha;
+	}
 }

+ 6 - 0
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java

@@ -3913,6 +3913,12 @@ public final class L2PcInstance extends L2Playable
 			return;
 		}
 
+		if (player.isLockedTarget() && player.getLockedTarget() != this)
+		{
+			player.sendPacket(new SystemMessage(SystemMessageId.FAILED_CHANGE_TARGET));
+			return;
+		}
+
 		// Check if the player already target this L2PcInstance
 		if (player.getTarget() != this)
 		{

+ 7 - 0
L2_GameServer/java/net/sf/l2j/gameserver/network/clientpackets/RequestActionUse.java

@@ -179,6 +179,13 @@ public final class RequestActionUse extends L2GameClientPacket
 						activeChar.sendPacket(ActionFailed.STATIC_PACKET);
 						return;
 					}
+					
+					if (pet.isLockedTarget())
+					{
+						pet.getOwner().sendPacket(new SystemMessage(SystemMessageId.FAILED_CHANGE_TARGET));
+						return;
+					}
+					
 					if (target.isAutoAttackable(activeChar) || _ctrlPressed)
 					{
 						if (target instanceof L2DoorInstance)

+ 8 - 0
L2_GameServer/java/net/sf/l2j/gameserver/network/clientpackets/RequestTargetCanceld.java

@@ -15,6 +15,9 @@
 package net.sf.l2j.gameserver.network.clientpackets;
 
 import net.sf.l2j.gameserver.model.actor.L2Character;
+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+import net.sf.l2j.gameserver.network.SystemMessageId;
+import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
 
 /**
  * This class ...
@@ -40,6 +43,11 @@ public final class RequestTargetCanceld extends L2GameClientPacket
 		L2Character activeChar = getClient().getActiveChar();
         if (activeChar != null)
         {
+        	if (((L2PcInstance)activeChar).isLockedTarget())
+        	{
+        		activeChar.sendPacket(new SystemMessage(SystemMessageId.FAILED_DISABLE_TARGET));
+        		return;
+        	}
             if (_unselect == 0)
             {
             	if (activeChar.isCastingNow() && activeChar.canAbortCast())

+ 19 - 7
L2_GameServer/java/net/sf/l2j/gameserver/skills/effects/EffectTargetMe.java

@@ -16,7 +16,9 @@ package net.sf.l2j.gameserver.skills.effects;
 
 import net.sf.l2j.gameserver.ai.CtrlIntention;
 import net.sf.l2j.gameserver.model.L2Effect;
+import net.sf.l2j.gameserver.model.actor.L2Playable;
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+import net.sf.l2j.gameserver.model.actor.instance.L2SiegeSummonInstance;
 import net.sf.l2j.gameserver.network.serverpackets.MyTargetSelected;
 import net.sf.l2j.gameserver.skills.Env;
 import net.sf.l2j.gameserver.templates.effects.EffectTemplate;
@@ -50,13 +52,22 @@ public class EffectTargetMe extends L2Effect
 	@Override
 	public boolean onStart()
 	{
-		// Should only work on PC?
-		if (getEffected() instanceof L2PcInstance)
+		if (getEffected() instanceof L2Playable)
 		{
-			getEffected().setTarget(getEffector());
-			MyTargetSelected my = new MyTargetSelected(getEffector().getObjectId(), 0);
-			getEffected().sendPacket(my);
-			getEffected().getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, getEffector());
+			if (getEffected() instanceof L2SiegeSummonInstance)
+				return false;
+
+			if (getEffected().getTarget() != getEffector())
+			{
+				// Target is different - stop autoattack and break cast
+				getEffected().setTarget(getEffector());
+				getEffected().abortAttack();
+				getEffected().abortCast();
+				if (getEffected() instanceof L2PcInstance)
+					getEffected().sendPacket(new MyTargetSelected(getEffector().getObjectId(), 0));
+				getEffected().getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
+			}
+			((L2Playable)getEffected()).setLockedTarget(getEffector());
 			return true;
 		}
 		return false;
@@ -69,7 +80,8 @@ public class EffectTargetMe extends L2Effect
 	@Override
 	public void onExit()
 	{
-		// nothing
+		if (getEffected() instanceof L2Playable)
+			((L2Playable)getEffected()).setLockedTarget(null);
 	}
 	
 	/**