diff --git a/trunk/dist/game/data/scripts/handlers/MasterHandler.java b/trunk/dist/game/data/scripts/handlers/MasterHandler.java index 65c1fc8bcf..651241c077 100644 --- a/trunk/dist/game/data/scripts/handlers/MasterHandler.java +++ b/trunk/dist/game/data/scripts/handlers/MasterHandler.java @@ -200,6 +200,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; @@ -550,6 +551,7 @@ public class MasterHandler AreaSummon.class, Aura.class, AuraCorpseMob.class, + AuraFriendly.class, BehindArea.class, BehindAura.class, Clan.class, diff --git a/trunk/dist/game/data/scripts/handlers/targethandlers/AuraFriendly.java b/trunk/dist/game/data/scripts/handlers/targethandlers/AuraFriendly.java new file mode 100644 index 0000000000..4aba14538c --- /dev/null +++ b/trunk/dist/game/data/scripts/handlers/targethandlers/AuraFriendly.java @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2004-2015 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 . + */ +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; + +/** + * @author Sahar + */ +public class AuraFriendly implements ITargetTypeHandler +{ + @Override + public L2Object[] getTargetList(Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List 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 (!GeoData.getInstance().canSeeTarget(activeChar, target)) + { + return false; + } + + if ((target == null) || 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 getTargetType() + { + return L2TargetType.AURA_FRIENDLY; + } +} \ No newline at end of file diff --git a/trunk/dist/game/data/stats/skills/01500-01599.xml b/trunk/dist/game/data/stats/skills/01500-01599.xml index ca198aed05..17334af34d 100644 --- a/trunk/dist/game/data/stats/skills/01500-01599.xml +++ b/trunk/dist/game/data/stats/skills/01500-01599.xml @@ -174,7 +174,7 @@ - + diff --git a/trunk/dist/game/data_classic/scripts/handlers/MasterHandler.java b/trunk/dist/game/data_classic/scripts/handlers/MasterHandler.java index 24533de119..e04650102b 100644 --- a/trunk/dist/game/data_classic/scripts/handlers/MasterHandler.java +++ b/trunk/dist/game/data_classic/scripts/handlers/MasterHandler.java @@ -202,6 +202,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; @@ -554,6 +555,7 @@ public class MasterHandler AreaSummon.class, Aura.class, AuraCorpseMob.class, + AuraFriendly.class, BehindArea.class, BehindAura.class, Clan.class, diff --git a/trunk/dist/game/data_classic/scripts/handlers/targethandlers/AuraFriendly.java b/trunk/dist/game/data_classic/scripts/handlers/targethandlers/AuraFriendly.java new file mode 100644 index 0000000000..4aba14538c --- /dev/null +++ b/trunk/dist/game/data_classic/scripts/handlers/targethandlers/AuraFriendly.java @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2004-2015 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 . + */ +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; + +/** + * @author Sahar + */ +public class AuraFriendly implements ITargetTypeHandler +{ + @Override + public L2Object[] getTargetList(Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List 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 (!GeoData.getInstance().canSeeTarget(activeChar, target)) + { + return false; + } + + if ((target == null) || 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 getTargetType() + { + return L2TargetType.AURA_FRIENDLY; + } +} \ No newline at end of file diff --git a/trunk/dist/game/data_classic/stats/skills/01500-01599.xml b/trunk/dist/game/data_classic/stats/skills/01500-01599.xml index aea3d66afb..88c249ca1e 100644 --- a/trunk/dist/game/data_classic/stats/skills/01500-01599.xml +++ b/trunk/dist/game/data_classic/stats/skills/01500-01599.xml @@ -174,7 +174,7 @@ - + diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/L2Character.java b/trunk/java/com/l2jserver/gameserver/model/actor/L2Character.java index 1e6690857a..811d2f4fc7 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/L2Character.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/L2Character.java @@ -1695,6 +1695,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe case FRONT_AURA: case BEHIND_AURA: case GROUND: + case AURA_FRIENDLY: target = this; break; case SELF: @@ -5528,6 +5529,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe case FRONT_AURA: case BEHIND_AURA: case AURA_CORPSE_MOB: + case AURA_FRIENDLY: break; default: abortCast(); diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java index 51839e2402..d5f56e4f8a 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java @@ -8787,6 +8787,7 @@ public final class L2PcInstance extends L2Playable case GROUND: case SELF: case AURA_CORPSE_MOB: + case AURA_FRIENDLY: case COMMAND_CHANNEL: target = this; break; @@ -8890,6 +8891,7 @@ public final class L2PcInstance extends L2Playable case SELF: case AREA_SUMMON: case AURA_CORPSE_MOB: + case AURA_FRIENDLY: case COMMAND_CHANNEL: target = this; break; @@ -9070,6 +9072,7 @@ public final class L2PcInstance extends L2Playable case SELF: case GROUND: case AREA_SUMMON: + case AURA_FRIENDLY: case UNLOCKABLE: break; default: // Send a Server->Client packet ActionFailed to the L2PcInstance diff --git a/trunk/java/com/l2jserver/gameserver/model/skills/targets/L2TargetType.java b/trunk/java/com/l2jserver/gameserver/model/skills/targets/L2TargetType.java index ae67ec0325..277626cfe6 100644 --- a/trunk/java/com/l2jserver/gameserver/model/skills/targets/L2TargetType.java +++ b/trunk/java/com/l2jserver/gameserver/model/skills/targets/L2TargetType.java @@ -30,6 +30,7 @@ public enum L2TargetType AREA_UNDEAD, AURA, AURA_CORPSE_MOB, + AURA_FRIENDLY, BEHIND_AREA, BEHIND_AURA, CLAN,