diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBufferAI.java b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBufferAI.java index 953141a8fbafa2558a0466be785bc444b8897380..afa288d8abdc3ad4c68857c282dcae4fbd410aa0 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBufferAI.java +++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBufferAI.java @@ -19,10 +19,13 @@ package ai.npc.NpcBuffers; import com.l2jserver.gameserver.ThreadPoolManager; +import com.l2jserver.gameserver.model.L2Party; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.actor.instance.L2TamedBeastInstance; import com.l2jserver.gameserver.model.skills.Skill; +import com.l2jserver.gameserver.model.zone.ZoneId; import com.l2jserver.gameserver.util.Util; /** @@ -63,7 +66,7 @@ public class NpcBufferAI implements Runnable { for (L2PcInstance member : player.getParty().getMembers()) { - if (Util.checkIfInRange(skill.getAffectRange(), _npc, member, true)) + if (Util.checkIfInRange(skill.getAffectRange(), _npc, member, true) && !member.isDead()) { skill.applyEffects(player, member); } @@ -71,7 +74,7 @@ public class NpcBufferAI implements Runnable } else { - if (Util.checkIfInRange(skill.getAffectRange(), _npc, player, true)) + if (Util.checkIfInRange(skill.getAffectRange(), _npc, player, true) && !player.isDead()) { skill.applyEffects(player, player); } @@ -86,7 +89,7 @@ public class NpcBufferAI implements Runnable { case FRIEND: { - if (isFriendly(player, target)) + if (isFriendly(player, target) && target.isDead()) { skill.applyEffects(target, target); } @@ -94,8 +97,13 @@ public class NpcBufferAI implements Runnable } case NOT_FRIEND: { - if (!isFriendly(player, target)) + if (isEnemy(player, target) && target.isDead()) { + // Update PvP status + if (target.isPlayable()) + { + player.updatePvPStatus(target); + } skill.applyEffects(target, target); } break; @@ -108,6 +116,12 @@ public class NpcBufferAI implements Runnable ThreadPoolManager.getInstance().scheduleGeneral(this, _skillData.getDelay()); } + /** + * Verifies if the character is an friend and can be affected by positive effect. + * @param player the player + * @param target the target + * @return {@code true} if target can be affected by positive effect, {@code false} otherwise + */ private boolean isFriendly(L2PcInstance player, L2Character target) { if (target.isPlayable()) @@ -119,26 +133,89 @@ public class NpcBufferAI implements Runnable return true; } - if (player.isInParty() && targetPlayer.isInParty() && (player.getParty() == targetPlayer.getParty())) + if (player.isInParty() && targetPlayer.isInParty()) { - return true; + final L2Party party = player.getParty(); + + if (party.containsPlayer(targetPlayer)) + { + return true; + } + + if (party.isInCommandChannel() && party.getCommandChannel().containsPlayer(targetPlayer)) + { + return true; + } } - if (player.getParty().isInCommandChannel() && (player.getParty().getCommandChannel() == target.getParty().getCommandChannel())) + if ((player.getClanId() > 0) && (player.getClanId() == targetPlayer.getClanId())) { return true; } - if ((player.getClanId() > 0) && (player.getClanId() == targetPlayer.getClanId())) + if ((player.getAllyId() > 0) && (player.getAllyId() == targetPlayer.getAllyId())) { return true; } - if ((player.getAllyId() > 0) && (player.getAllyId() == targetPlayer.getAllyId())) + if ((player.getSiegeState() > 0) && player.isInsideZone(ZoneId.SIEGE) && (player.getSiegeState() == targetPlayer.getSiegeState()) && (player.getSiegeSide() == targetPlayer.getSiegeSide())) { return true; } } return false; } + + /** + * Verifies if the character is an enemy and can be affected by negative effect. + * @param player the player + * @param target the target + * @return {@code true} if target can be affected by negative effect, {@code false} otherwise + */ + private boolean isEnemy(L2PcInstance player, L2Character target) + { + if (isFriendly(player, target)) + { + return false; + } + + if (target instanceof L2TamedBeastInstance) + { + return isEnemy(player, ((L2TamedBeastInstance) target).getOwner()); + } + + if (target.isMonster()) + { + return true; + } + + if (target.isPlayable()) + { + final L2PcInstance targetPlayer = target.getActingPlayer(); + + if (!isFriendly(player, targetPlayer)) + { + if (targetPlayer.getPvpFlag() != 0) + { + return true; + } + + if (targetPlayer.getKarma() != 0) + { + return true; + } + + if ((player.getClan() != null) && (targetPlayer.getClan() != null) && player.getClan().isAtWarWith(targetPlayer.getClan())) + { + return true; + } + + if (targetPlayer.isInsideZone(ZoneId.PVP)) + { + return true; + } + } + } + return false; + } } \ No newline at end of file diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBuffersData.xml b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBuffersData.xml index 6bc5566ec7abb5f3e2b76fb8bd945b4a047e14f3..160281647399ef9084b3e02b70017f5255c9826a 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBuffersData.xml +++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBuffersData.xml @@ -41,7 +41,7 @@ <npc id="13024"> <skill id="5129" level="1" initialDelay="1" delay="5" affectScope="RANGE" affectObject="FRIEND" /> <!-- Smokescreen --> </npc> - <npc id="13025"> + <npc id="13028"> <skill id="5145" level="1" initialDelay="1" delay="2" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Day of Doom --> </npc> <npc id="13030"> diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/SummonNpc.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/SummonNpc.java index ea3d66877845b1c9ea2ca09132dc9ccc803aba18..c666d6194ee7730633e1f802193c7a8977cfaefd 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/SummonNpc.java +++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/SummonNpc.java @@ -30,6 +30,7 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; import com.l2jserver.gameserver.model.conditions.Condition; import com.l2jserver.gameserver.model.effects.AbstractEffect; +import com.l2jserver.gameserver.model.effects.L2EffectType; import com.l2jserver.gameserver.model.skills.BuffInfo; import com.l2jserver.gameserver.model.skills.targets.L2TargetType; import com.l2jserver.util.Rnd; @@ -57,6 +58,12 @@ public final class SummonNpc extends AbstractEffect _isSummonSpawn = params.getBoolean("isSummonSpawn", false); } + @Override + public L2EffectType getEffectType() + { + return L2EffectType.SUMMON_NPC; + } + @Override public boolean isInstant() { diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Unsummon.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Unsummon.java index fd5d4d08aff16a3aaa2bf820749cddac7a11fb8e..eb9b0eba9dc45834016d5467c8d9a7a624673e40 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Unsummon.java +++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Unsummon.java @@ -76,19 +76,24 @@ public final class Unsummon extends AbstractEffect public void onStart(BuffInfo info) { final L2Summon summon = info.getEffected().getSummon(); - if (summon.isPhoenixBlessed() || summon.isNoblesseBlessed()) - { - summon.stopEffects(L2EffectType.NOBLESSE_BLESSING); - } - else + + if (summon != null) { - summon.stopAllEffectsExceptThoseThatLastThroughDeath(); + final L2PcInstance summonOwner = summon.getOwner(); + + if (summon.isPhoenixBlessed() || summon.isNoblesseBlessed()) + { + summon.stopEffects(L2EffectType.NOBLESSE_BLESSING); + } + else + { + summon.stopAllEffectsExceptThoseThatLastThroughDeath(); + } + + summon.abortAttack(); + summon.abortCast(); + summon.unSummon(summonOwner); + summonOwner.sendPacket(SystemMessageId.YOUR_SERVITOR_HAS_VANISHED); } - - summon.abortAttack(); - summon.abortCast(); - final L2PcInstance summonOwner = info.getEffected().getActingPlayer(); - summon.unSummon(summonOwner); - summonOwner.sendPacket(SystemMessageId.YOUR_SERVITOR_HAS_VANISHED); } } diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/targethandlers/Ground.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/targethandlers/Ground.java index ff463d736d1ae7cbf6ae10ca8dea1d0ef702a6b4..61804eab2e6b7478ef0d3d6b012221125e17d79b 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/targethandlers/Ground.java +++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/targethandlers/Ground.java @@ -25,6 +25,7 @@ import com.l2jserver.gameserver.handler.ITargetTypeHandler; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.effects.L2EffectType; import com.l2jserver.gameserver.model.skills.Skill; import com.l2jserver.gameserver.model.skills.targets.L2TargetType; import com.l2jserver.gameserver.model.zone.ZoneId; @@ -58,6 +59,14 @@ public class Ground implements ITargetTypeHandler targetList.add(character); } } + + if (targetList.isEmpty()) + { + if (skill.hasEffectType(L2EffectType.SUMMON_NPC)) + { + targetList.add(activeChar); + } + } return targetList.isEmpty() ? EMPTY_TARGET_LIST : targetList.toArray(new L2Character[targetList.size()]); } diff --git a/L2J_DataPack_BETA/dist/game/data/stats/skills/01400-01499.xml b/L2J_DataPack_BETA/dist/game/data/stats/skills/01400-01499.xml index 306d9fdc5fc283bfcbdda46f9d9472d16fea23e6..09442b962a2917d5ffc6c5f411c47db090abf8cf 100644 --- a/L2J_DataPack_BETA/dist/game/data/stats/skills/01400-01499.xml +++ b/L2J_DataPack_BETA/dist/game/data/stats/skills/01400-01499.xml @@ -684,7 +684,7 @@ <set name="affectRange" val="200" /> <set name="blockedInOlympiad" val="true" /> <set name="castRange" val="900" /> - <set name="channelingSkillId" val="5130" /> + <set name="channelingSkillId" val="1419" /> <set name="channelingTickInterval" val="2" /> <set name="effectPoint" val="-676" /> <set name="element" val="0" /> <!-- Fire --> @@ -712,7 +712,7 @@ <set name="affectRange" val="200" /> <set name="blockedInOlympiad" val="true" /> <set name="castRange" val="900" /> - <set name="channelingSkillId" val="5132" /> + <set name="channelingSkillId" val="1420" /> <set name="channelingTickInterval" val="2" /> <set name="effectPoint" val="-676" /> <set name="element" val="2" /> <!-- Wind --> @@ -740,7 +740,7 @@ <set name="affectRange" val="200" /> <set name="blockedInOlympiad" val="true" /> <set name="castRange" val="900" /> - <set name="channelingSkillId" val="5131" /> + <set name="channelingSkillId" val="1421" /> <set name="channelingTickInterval" val="2" /> <set name="effectPoint" val="-676" /> <set name="element" val="1" /> <!-- Water --> @@ -789,7 +789,7 @@ <set name="affectRange" val="200" /> <set name="blockedInOlympiad" val="true" /> <set name="castRange" val="900" /> - <set name="channelingSkillId" val="5133" /> + <set name="channelingSkillId" val="1423" /> <set name="channelingTickInterval" val="2" /> <set name="effectPoint" val="-676" /> <set name="element" val="5" /> <!-- Dark --> @@ -3366,4 +3366,4 @@ </effect> </for> </skill> -</list> +</list> \ No newline at end of file