Pārlūkot izejas kodu

BETA: Support for target aura corpse mob.
Thanks to Evilus, janiii and jurchiks for code and ideas.

Zoey76 14 gadi atpakaļ
vecāks
revīzija
415c8469c0

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/ai/L2AttackableAI.java

@@ -1398,7 +1398,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 				}
 				else if (canAOE(sk))
 				{
-					if (sk.getTargetType() == SkillTargetType.TARGET_AURA || sk.getTargetType() == SkillTargetType.TARGET_BEHIND_AURA || sk.getTargetType() == SkillTargetType.TARGET_FRONT_AURA)
+					if (sk.getTargetType() == SkillTargetType.TARGET_AURA || sk.getTargetType() == SkillTargetType.TARGET_BEHIND_AURA || sk.getTargetType() == SkillTargetType.TARGET_FRONT_AURA  || (sk.getTargetType() == L2Skill.SkillTargetType.TARGET_AURA_CORPSE_MOB))
 					{
 						clientStopMoving(null);
 						//L2Object target = attackTarget;

+ 7 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/ai/L2CharacterAI.java

@@ -1347,12 +1347,12 @@ public class L2CharacterAI extends AbstractAI
 		}
 	}
 	
-	
 	public boolean canAura(L2Skill sk)
 	{
 		if(sk.getTargetType() == L2Skill.SkillTargetType.TARGET_AURA
 				|| sk.getTargetType() == L2Skill.SkillTargetType.TARGET_BEHIND_AURA
-				|| sk.getTargetType() == L2Skill.SkillTargetType.TARGET_FRONT_AURA)
+				|| sk.getTargetType() == L2Skill.SkillTargetType.TARGET_FRONT_AURA
+				|| (sk.getTargetType() == L2Skill.SkillTargetType.TARGET_AURA_CORPSE_MOB))
 		{
 			for(L2Object target:_actor.getKnownList().getKnownCharactersInRadius(sk.getSkillRadius()))
 			{
@@ -1362,13 +1362,15 @@ public class L2CharacterAI extends AbstractAI
 		}
 		return false;
 	}
+	
 	public boolean canAOE(L2Skill sk)
 	{
 		if(sk.getSkillType() != L2SkillType.NEGATE || sk.getSkillType() != L2SkillType.CANCEL)
 		{
 			if(sk.getTargetType() == L2Skill.SkillTargetType.TARGET_AURA
 					|| sk.getTargetType() == L2Skill.SkillTargetType.TARGET_BEHIND_AURA
-					|| sk.getTargetType() == L2Skill.SkillTargetType.TARGET_FRONT_AURA)
+					|| sk.getTargetType() == L2Skill.SkillTargetType.TARGET_FRONT_AURA
+					|| (sk.getTargetType() == L2Skill.SkillTargetType.TARGET_AURA_CORPSE_MOB))
 			{
 				boolean cancast = true;
 				for(L2Character target:_actor.getKnownList().getKnownCharactersInRadius(sk.getSkillRadius()))
@@ -1425,7 +1427,8 @@ public class L2CharacterAI extends AbstractAI
 		{
 			if(sk.getTargetType() == L2Skill.SkillTargetType.TARGET_AURA
 					|| sk.getTargetType() == L2Skill.SkillTargetType.TARGET_BEHIND_AURA
-					|| sk.getTargetType() == L2Skill.SkillTargetType.TARGET_FRONT_AURA)
+					|| sk.getTargetType() == L2Skill.SkillTargetType.TARGET_FRONT_AURA
+					|| (sk.getTargetType() == L2Skill.SkillTargetType.TARGET_AURA_CORPSE_MOB))
 			{
 				boolean cancast = false;
 				for(L2Character target:_actor.getKnownList().getKnownCharactersInRadius(sk.getSkillRadius()))

+ 31 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2Skill.java

@@ -45,6 +45,7 @@ import com.l2jserver.gameserver.model.actor.instance.L2SiegeFlagInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2SummonInstance;
 import com.l2jserver.gameserver.model.entity.TvTEvent;
 import com.l2jserver.gameserver.network.SystemMessageId;
+//TODO: import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 import com.l2jserver.gameserver.skills.BaseStats;
 import com.l2jserver.gameserver.skills.Env;
@@ -101,6 +102,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		TARGET_FRONT_AREA,
 		TARGET_BEHIND_AREA,
 		TARGET_AURA,
+		TARGET_AURA_CORPSE_MOB,
 		TARGET_FRONT_AURA,
 		TARGET_BEHIND_AURA,
 		TARGET_CORPSE,
@@ -2194,6 +2196,35 @@ public abstract class L2Skill implements IChanceSkillTrigger
 					return _emptyTargetList;
 				return targetList.toArray(new L2Character[targetList.size()]);
 			}
+			case TARGET_AURA_CORPSE_MOB:
+			{
+				final Collection<L2Character> characters = activeChar.getKnownList().getKnownCharactersInRadius(getSkillRadius());
+				L2Attackable corpseMob;
+				int spoilerId;
+				for (L2Character character : characters)
+				{
+					if ((character instanceof L2Attackable) && character.isDead())
+					{
+						if (getSkillType() == L2SkillType.SWEEP)
+						{
+							corpseMob = (L2Attackable) character;
+							//If target is not spoiled, ignore it.
+							if (!corpseMob.isSpoil())
+							{
+								continue;
+							}
+							spoilerId = corpseMob.getIsSpoiledBy();
+							//If target is not spoiled by the caster or a party member, ignore it.
+							if ((activeChar.getObjectId() != spoilerId) && (activeChar.getActingPlayer() != null) && !activeChar.getActingPlayer().isInLooterParty(spoilerId))
+							{
+								continue;
+							}
+						}
+						targetList.add(character);
+					}
+				}
+				return (targetList.isEmpty() ? _emptyTargetList : targetList.toArray(new L2Character[targetList.size()]));
+			}
 			case TARGET_UNLOCKABLE:
 			{
 				if (!(target instanceof L2DoorInstance) && !(target instanceof L2ChestInstance))

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

@@ -1602,6 +1602,7 @@ public abstract class L2Character extends L2Object
 				target = getPet();
 				break;
 			case TARGET_AURA:
+			case TARGET_AURA_CORPSE_MOB:
 			case TARGET_FRONT_AURA:
 			case TARGET_BEHIND_AURA:
 			case TARGET_GROUND:
@@ -5911,6 +5912,7 @@ public abstract class L2Character extends L2Object
 				case TARGET_AURA:
 				case TARGET_FRONT_AURA:
 				case TARGET_BEHIND_AURA:
+				case TARGET_AURA_CORPSE_MOB:
 					break;
 				default:
 					abortCast();

+ 1 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Summon.java

@@ -607,6 +607,7 @@ public abstract class L2Summon extends L2Playable
 			case TARGET_FRONT_AURA:
 			case TARGET_BEHIND_AURA:
 			case TARGET_SELF:
+			case TARGET_AURA_CORPSE_MOB:
 				target = this;
 				break;
 			default:

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

@@ -8614,7 +8614,6 @@ public final class L2PcInstance extends L2Playable
 		
 		// Check if the target is correct and Notify the AI with AI_INTENTION_CAST and target
 		L2Object target = null;
-		
 		switch (skill.getTargetType())
 		{
 			case TARGET_AURA:    // AURA, SELF should be cast even if no target has been found
@@ -8622,6 +8621,7 @@ public final class L2PcInstance extends L2Playable
 			case TARGET_BEHIND_AURA:
 			case TARGET_GROUND:
 			case TARGET_SELF:
+			case TARGET_AURA_CORPSE_MOB:
 				target = this;
 				break;
 			default:
@@ -8643,7 +8643,6 @@ public final class L2PcInstance extends L2Playable
 		//************************************* Check Player State *******************************************
 		
 		// Abnormal effects(ex : Stun, Sleep...) are checked in L2Character useMagic()
-		
 		if (isOutOfControl() || isParalyzed() || isStunned() || isSleeping())
 		{
 			sendPacket(ActionFailed.STATIC_PACKET);
@@ -8736,6 +8735,7 @@ public final class L2PcInstance extends L2Playable
 			case TARGET_GROUND:
 			case TARGET_SELF:
 			case TARGET_AREA_SUMMON:
+			case TARGET_AURA_CORPSE_MOB:
 				target = this;
 				break;
 			case TARGET_PET:
@@ -8912,6 +8912,7 @@ public final class L2PcInstance extends L2Playable
 					case TARGET_AURA:
 					case TARGET_FRONT_AURA:
 					case TARGET_BEHIND_AURA:
+					case TARGET_AURA_CORPSE_MOB:
 					case TARGET_CLAN:
 					case TARGET_PARTY_CLAN:
 					case TARGET_ALLY:
@@ -8993,6 +8994,7 @@ public final class L2PcInstance extends L2Playable
 				case TARGET_AURA:
 				case TARGET_FRONT_AURA:
 				case TARGET_BEHIND_AURA:
+				case TARGET_AURA_CORPSE_MOB:
 				case TARGET_CLAN:
 				case TARGET_PARTY_CLAN:
 				case TARGET_SELF: