From 538191da49b91d0dcdb2ef4f79621aeb7ac93ebc Mon Sep 17 00:00:00 2001 From: Rumen Nikiforov <unafraid89@gmail.com> Date: Sat, 9 Aug 2014 23:51:06 +0000 Subject: [PATCH] BETA: Fixing issues with channeling skills. * Patch by: St3eT --- .../ai/npc/NpcBuffers/NpcBufferAI.java | 95 +++++++++++++++++-- .../ai/npc/NpcBuffers/NpcBuffersData.xml | 2 +- .../handlers/effecthandlers/SummonNpc.java | 7 ++ .../handlers/effecthandlers/Unsummon.java | 29 +++--- .../handlers/targethandlers/Ground.java | 9 ++ .../game/data/stats/skills/01400-01499.xml | 10 +- 6 files changed, 125 insertions(+), 27 deletions(-) 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 953141a8fb..afa288d8ab 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 6bc5566ec7..1602816473 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 ea3d668778..c666d6194e 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 fd5d4d08af..eb9b0eba9d 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 ff463d736d..61804eab2e 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 306d9fdc5f..09442b962a 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 -- GitLab