diff --git a/dist/game/data/scripts/handlers/MasterHandler.java b/dist/game/data/scripts/handlers/MasterHandler.java index 794bd768c7e3a052e66ca50d19323bd5c143c4c2..93e31490de051988ad48ea84a4e6119280e70fa4 100644 --- a/dist/game/data/scripts/handlers/MasterHandler.java +++ b/dist/game/data/scripts/handlers/MasterHandler.java @@ -221,6 +221,7 @@ import handlers.targethandlers.AreaFriendly; import handlers.targethandlers.AreaSummon; import handlers.targethandlers.Aura; import handlers.targethandlers.AuraCorpseMob; +import handlers.targethandlers.AuraFriendly; import handlers.targethandlers.BehindArea; import handlers.targethandlers.BehindAura; import handlers.targethandlers.Clan; @@ -544,6 +545,7 @@ public class MasterHandler AreaSummon.class, Aura.class, AuraCorpseMob.class, + AuraFriendly.class, BehindArea.class, BehindAura.class, Clan.class, diff --git a/dist/game/data/scripts/handlers/targethandlers/AuraFriendly.java b/dist/game/data/scripts/handlers/targethandlers/AuraFriendly.java new file mode 100644 index 0000000000000000000000000000000000000000..6db3dc5e43f6ea16d0e680714cace0cf706ba0b9 --- /dev/null +++ b/dist/game/data/scripts/handlers/targethandlers/AuraFriendly.java @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2004-2018 L2J DataPack + * + * This file is part of L2J DataPack. + * + * L2J DataPack is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J DataPack is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package handlers.targethandlers; + +import java.util.ArrayList; +import java.util.List; + +import com.l2jserver.gameserver.GeoData; +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.actor.instance.L2SiegeFlagInstance; +import com.l2jserver.gameserver.model.skills.Skill; +import com.l2jserver.gameserver.model.skills.targets.L2TargetType; +import com.l2jserver.gameserver.model.zone.ZoneId; + +/** + * Aura Friendly target handler implementation. + * @author Sahar + */ +public class AuraFriendly implements ITargetTypeHandler +{ + @Override + public L2Object[] getTargetList(Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new ArrayList<>(); + L2PcInstance player = activeChar.getActingPlayer(); + int maxTargets = skill.getAffectLimit(); + for (L2Character obj : player.getKnownList().getKnownCharactersInRadius(skill.getAffectRange())) + { + if ((obj == activeChar) || !checkTarget(player, obj)) + { + continue; + } + + if ((maxTargets > 0) && (targetList.size() >= maxTargets)) + { + break; + } + + targetList.add(obj); + } + + if (targetList.isEmpty()) + { + return EMPTY_TARGET_LIST; + } + + return targetList.toArray(new L2Character[targetList.size()]); + } + + private boolean checkTarget(L2PcInstance activeChar, L2Character target) + { + if ((target == null) || !GeoData.getInstance().canSeeTarget(activeChar, target)) + { + return false; + } + + if (target.isAlikeDead() || target.isDoor() || (target instanceof L2SiegeFlagInstance) || target.isMonster()) + { + return false; + } + + if (target.isPlayable()) + { + L2PcInstance targetPlayer = target.getActingPlayer(); + + if (activeChar.isInDuelWith(target)) + { + return false; + } + + if (activeChar.isInPartyWith(target)) + { + return true; + } + + if (target.isInsideZone(ZoneId.PVP)) + { + return false; + } + + if (activeChar.isInClanWith(target) || activeChar.isInAllyWith(target) || activeChar.isInCommandChannelWith(target)) + { + return true; + } + + if ((targetPlayer.getPvpFlag() > 0) || (targetPlayer.getKarma() > 0)) + { + return false; + } + } + + return true; + } + + @Override + public Enum<L2TargetType> getTargetType() + { + return L2TargetType.AURA_FRIENDLY; + } +} \ No newline at end of file diff --git a/dist/game/data/stats/skills/01500-01599.xml b/dist/game/data/stats/skills/01500-01599.xml index 3ef734b8d287009741fea5a1e2536825f767ecf0..283041a525323a13b02c2269fa287b50c80ab40a 100644 --- a/dist/game/data/stats/skills/01500-01599.xml +++ b/dist/game/data/stats/skills/01500-01599.xml @@ -156,7 +156,7 @@ </effects> </skill> <skill id="1505" levels="1" name="Sublime Self-Sacrifice"> - <!-- Confirmed CT2.5 and Updated to H5 --> + <!-- High Five Confirmed --> <set name="abnormalLvl" val="2" /> <set name="abnormalTime" val="15" /> <set name="abnormalType" val="INVINCIBILITY" /> @@ -173,7 +173,7 @@ <set name="operateType" val="A2" /> <set name="reuseDelay" val="3600000" /> <set name="rideState" val="NONE;STRIDER;WYVERN;WOLF" /> - <set name="targetType" val="PARTY_NOTME" /> + <set name="targetType" val="AURA_FRIENDLY" /> <effects> <effect name="BlockDamage"> <param block="HP"/>