From 700d1180b65a332ffa76b50f4a08520d16f5e194 Mon Sep 17 00:00:00 2001 From: Rumen Nikiforov <unafraid89@gmail.com> Date: Mon, 26 Sep 2011 01:35:07 +0000 Subject: [PATCH] BETA: DP-Part of [L4934] --- .../scripts/handlers/TargetMasterHandler.java | 96 +++++++++++++ .../handlers/targethandlers/TargetAlly.java | 102 +++++++++++++ .../handlers/targethandlers/TargetArea.java | 88 ++++++++++++ .../targethandlers/TargetAreaCorpseMob.java | 68 +++++++++ .../targethandlers/TargetAreaSummon.java | 73 ++++++++++ .../targethandlers/TargetAreaUndead.java | 83 +++++++++++ .../handlers/targethandlers/TargetAura.java | 81 +++++++++++ .../targethandlers/TargetAuraCorpseMob.java | 51 +++++++ .../targethandlers/TargetBehindArea.java | 91 ++++++++++++ .../targethandlers/TargetBehindAura.java | 84 +++++++++++ .../handlers/targethandlers/TargetClan.java | 132 +++++++++++++++++ .../targethandlers/TargetClanMember.java | 63 ++++++++ .../targethandlers/TargetCorpseAlly.java | 108 ++++++++++++++ .../targethandlers/TargetCorpseClan.java | 135 ++++++++++++++++++ .../targethandlers/TargetCorpseMob.java | 69 +++++++++ .../targethandlers/TargetCorpsePet.java | 37 +++++ .../targethandlers/TargetCorpsePlayer.java | 117 +++++++++++++++ .../targethandlers/TargetEnemySummon.java | 40 ++++++ .../targethandlers/TargetFlagPole.java | 29 ++++ .../targethandlers/TargetFrontArea.java | 91 ++++++++++++ .../targethandlers/TargetFrontAura.java | 84 +++++++++++ .../handlers/targethandlers/TargetGround.java | 30 ++++ .../handlers/targethandlers/TargetHoly.java | 37 +++++ .../handlers/targethandlers/TargetOne.java | 61 ++++++++ .../targethandlers/TargetOwnerPet.java | 37 +++++ .../handlers/targethandlers/TargetParty.java | 73 ++++++++++ .../targethandlers/TargetPartyClan.java | 111 ++++++++++++++ .../targethandlers/TargetPartyMember.java | 60 ++++++++ .../targethandlers/TargetPartyNotMe.java | 78 ++++++++++ .../targethandlers/TargetPartyOther.java | 64 +++++++++ .../handlers/targethandlers/TargetPet.java | 33 +++++ .../handlers/targethandlers/TargetSelf.java | 30 ++++ .../handlers/targethandlers/TargetSummon.java | 34 +++++ .../handlers/targethandlers/TargetUndead.java | 57 ++++++++ .../targethandlers/TargetUnlockable.java | 47 ++++++ 35 files changed, 2474 insertions(+) create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/TargetMasterHandler.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAlly.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetArea.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAreaCorpseMob.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAreaSummon.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAreaUndead.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAura.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAuraCorpseMob.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetBehindArea.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetBehindAura.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetClan.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetClanMember.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetCorpseAlly.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetCorpseClan.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetCorpseMob.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetCorpsePet.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetCorpsePlayer.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetEnemySummon.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetFlagPole.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetFrontArea.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetFrontAura.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetGround.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetHoly.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetOne.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetOwnerPet.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetParty.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetPartyClan.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetPartyMember.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetPartyNotMe.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetPartyOther.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetPet.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetSelf.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetSummon.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetUndead.java create mode 100644 L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetUnlockable.java diff --git a/L2J_DataPack_BETA/data/scripts/handlers/TargetMasterHandler.java b/L2J_DataPack_BETA/data/scripts/handlers/TargetMasterHandler.java new file mode 100644 index 0000000000..5cb8a77555 --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/TargetMasterHandler.java @@ -0,0 +1,96 @@ +/** + * + */ +package handlers; + +import handlers.targethandlers.TargetAlly; +import handlers.targethandlers.TargetArea; +import handlers.targethandlers.TargetAreaCorpseMob; +import handlers.targethandlers.TargetAreaSummon; +import handlers.targethandlers.TargetAreaUndead; +import handlers.targethandlers.TargetAura; +import handlers.targethandlers.TargetAuraCorpseMob; +import handlers.targethandlers.TargetBehindArea; +import handlers.targethandlers.TargetBehindAura; +import handlers.targethandlers.TargetClan; +import handlers.targethandlers.TargetClanMember; +import handlers.targethandlers.TargetCorpseAlly; +import handlers.targethandlers.TargetCorpseClan; +import handlers.targethandlers.TargetCorpseMob; +import handlers.targethandlers.TargetCorpsePet; +import handlers.targethandlers.TargetCorpsePlayer; +import handlers.targethandlers.TargetEnemySummon; +import handlers.targethandlers.TargetFlagPole; +import handlers.targethandlers.TargetFrontArea; +import handlers.targethandlers.TargetFrontAura; +import handlers.targethandlers.TargetGround; +import handlers.targethandlers.TargetHoly; +import handlers.targethandlers.TargetOne; +import handlers.targethandlers.TargetOwnerPet; +import handlers.targethandlers.TargetParty; +import handlers.targethandlers.TargetPartyClan; +import handlers.targethandlers.TargetPartyMember; +import handlers.targethandlers.TargetPartyNotMe; +import handlers.targethandlers.TargetPartyOther; +import handlers.targethandlers.TargetPet; +import handlers.targethandlers.TargetSelf; +import handlers.targethandlers.TargetSummon; +import handlers.targethandlers.TargetUndead; +import handlers.targethandlers.TargetUnlockable; + +import java.util.logging.Logger; + +import com.l2jserver.gameserver.handler.TargetHandler; + +/** + * @author UnAfraid + * + */ +public class TargetMasterHandler +{ + private static Logger _log = Logger.getLogger(TargetMasterHandler.class.getName()); + + public static void loadTargetHandlers() + { + TargetHandler.getInstance().registerSkillTargetType(new TargetAlly()); + TargetHandler.getInstance().registerSkillTargetType(new TargetArea()); + TargetHandler.getInstance().registerSkillTargetType(new TargetAreaCorpseMob()); + TargetHandler.getInstance().registerSkillTargetType(new TargetAreaSummon()); + TargetHandler.getInstance().registerSkillTargetType(new TargetAreaUndead()); + TargetHandler.getInstance().registerSkillTargetType(new TargetAura()); + TargetHandler.getInstance().registerSkillTargetType(new TargetAuraCorpseMob()); + TargetHandler.getInstance().registerSkillTargetType(new TargetBehindArea()); + TargetHandler.getInstance().registerSkillTargetType(new TargetBehindAura()); + TargetHandler.getInstance().registerSkillTargetType(new TargetClan()); + TargetHandler.getInstance().registerSkillTargetType(new TargetClanMember()); + TargetHandler.getInstance().registerSkillTargetType(new TargetCorpseAlly()); + TargetHandler.getInstance().registerSkillTargetType(new TargetCorpseClan()); + TargetHandler.getInstance().registerSkillTargetType(new TargetCorpseMob()); + TargetHandler.getInstance().registerSkillTargetType(new TargetCorpsePet()); + TargetHandler.getInstance().registerSkillTargetType(new TargetCorpsePlayer()); + TargetHandler.getInstance().registerSkillTargetType(new TargetEnemySummon()); + TargetHandler.getInstance().registerSkillTargetType(new TargetFlagPole()); + TargetHandler.getInstance().registerSkillTargetType(new TargetFrontArea()); + TargetHandler.getInstance().registerSkillTargetType(new TargetFrontAura()); + TargetHandler.getInstance().registerSkillTargetType(new TargetGround()); + TargetHandler.getInstance().registerSkillTargetType(new TargetHoly()); + TargetHandler.getInstance().registerSkillTargetType(new TargetOne()); + TargetHandler.getInstance().registerSkillTargetType(new TargetOwnerPet()); + TargetHandler.getInstance().registerSkillTargetType(new TargetParty()); + TargetHandler.getInstance().registerSkillTargetType(new TargetPartyClan()); + TargetHandler.getInstance().registerSkillTargetType(new TargetPartyMember()); + TargetHandler.getInstance().registerSkillTargetType(new TargetPartyNotMe()); + TargetHandler.getInstance().registerSkillTargetType(new TargetPartyOther()); + TargetHandler.getInstance().registerSkillTargetType(new TargetPet()); + TargetHandler.getInstance().registerSkillTargetType(new TargetSelf()); + TargetHandler.getInstance().registerSkillTargetType(new TargetSummon()); + TargetHandler.getInstance().registerSkillTargetType(new TargetUndead()); + TargetHandler.getInstance().registerSkillTargetType(new TargetUnlockable()); + } + + public static void main(String[] args) + { + loadTargetHandlers(); + _log.config("Loaded " + TargetHandler.getInstance().size() + " Target handlers"); + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAlly.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAlly.java new file mode 100644 index 0000000000..d3e899010c --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAlly.java @@ -0,0 +1,102 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.Collection; +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Playable; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.entity.TvTEvent; + +/** + * @author UnAfraid + * + */ +public class TargetAlly implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + if (activeChar instanceof L2Playable) + { + final L2PcInstance player = activeChar.getActingPlayer(); + + if (player == null) + return _emptyTargetList; + + if (player.isInOlympiadMode()) + return new L2Character[] { player }; + + if (onlyFirst) + return new L2Character[] { player }; + + targetList.add(player); + + final int radius = skill.getSkillRadius(); + + if (L2Skill.addSummon(activeChar, player, radius, false)) + targetList.add(player.getPet()); + + if (player.getClan() != null) + { + // Get all visible objects in a spherical area near the L2Character + final Collection<L2PcInstance> objs = activeChar.getKnownList().getKnownPlayersInRadius(radius); + for (L2PcInstance obj : objs) + { + if (obj == null) + continue; + if ((obj.getAllyId() == 0 || obj.getAllyId() != player.getAllyId()) && (obj.getClan() == null || obj.getClanId() != player.getClanId())) + continue; + + if (player.isInDuel()) + { + if (player.getDuelId() != obj.getDuelId()) + continue; + if (player.isInParty() && obj.isInParty() && player.getParty().getPartyLeaderOID() != obj.getParty().getPartyLeaderOID()) + continue; + } + + // Don't add this target if this is a Pc->Pc pvp + // casting and pvp condition not met + if (!player.checkPvpSkill(obj, skill)) + continue; + + if (!TvTEvent.checkForTvTSkill(player, obj, skill)) + continue; + + if (!onlyFirst && L2Skill.addSummon(activeChar, obj, radius, false)) + targetList.add(obj.getPet()); + + if (!L2Skill.addCharacter(activeChar, obj, radius, false)) + continue; + + if (onlyFirst) + return new L2Character[] { obj }; + + if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets()) + break; + + targetList.add(obj); + } + } + } + + return targetList.toArray(new L2Character[targetList.size()]); + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_ALLY; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetArea.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetArea.java new file mode 100644 index 0000000000..3bc4215c3a --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetArea.java @@ -0,0 +1,88 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.Collection; +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Attackable; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Playable; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.SystemMessage; +import com.l2jserver.gameserver.util.Util; + +/** + * @author UnAfraid + * + */ +public class TargetArea implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + if (((target == null || target == activeChar || target.isAlikeDead()) && skill.getCastRange() >= 0) || (!(target instanceof L2Attackable || target instanceof L2Playable))) + { + activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.TARGET_IS_INCORRECT)); + return _emptyTargetList; + } + + final L2Character origin; + final boolean srcInArena = (activeChar.isInsideZone(L2Character.ZONE_PVP) && !activeChar.isInsideZone(L2Character.ZONE_SIEGE)); + final int radius = skill.getSkillRadius(); + + if (skill.getCastRange() >= 0) + { + if (!L2Skill.checkForAreaOffensiveSkills(activeChar, target, skill, srcInArena)) + return _emptyTargetList; + + if (onlyFirst) + return new L2Character[] { target }; + + origin = target; + targetList.add(origin); // Add target to target list + } + else + origin = activeChar; + + final Collection<L2Character> objs = activeChar.getKnownList().getKnownCharacters(); + for (L2Character obj : objs) + { + if (!(obj instanceof L2Attackable || obj instanceof L2Playable)) + continue; + + if (obj == origin) + continue; + + if (Util.checkIfInRange(radius, origin, obj, true)) + { + if (!L2Skill.checkForAreaOffensiveSkills(activeChar, obj, skill, srcInArena)) + continue; + + if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets()) + break; + + targetList.add(obj); + } + } + + if (targetList.isEmpty()) + return _emptyTargetList; + + return targetList.toArray(new L2Character[targetList.size()]); + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_AREA; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAreaCorpseMob.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAreaCorpseMob.java new file mode 100644 index 0000000000..468bc73b4a --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAreaCorpseMob.java @@ -0,0 +1,68 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.Collection; +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Attackable; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Playable; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.SystemMessage; +import com.l2jserver.gameserver.util.Util; + +/** + * @author UnAfraid + * + */ +public class TargetAreaCorpseMob implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + if ((!(target instanceof L2Attackable)) || !target.isDead()) + { + activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.TARGET_IS_INCORRECT)); + return _emptyTargetList; + } + + if (onlyFirst) + return new L2Character[] { target }; + + targetList.add(target); + + final boolean srcInArena = (activeChar.isInsideZone(L2Character.ZONE_PVP) && !activeChar.isInsideZone(L2Character.ZONE_SIEGE)); + + final int radius = skill.getSkillRadius(); + final Collection<L2Character> objs = activeChar.getKnownList().getKnownCharacters(); + for (L2Character obj : objs) + { + if (!(obj instanceof L2Attackable || obj instanceof L2Playable) || !Util.checkIfInRange(radius, target, obj, true)) + continue; + + if (!L2Skill.checkForAreaOffensiveSkills(activeChar, obj, skill, srcInArena)) + continue; + + targetList.add(obj); + } + + if (targetList.isEmpty()) + return _emptyTargetList; + return targetList.toArray(new L2Character[targetList.size()]); + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_AREA_CORPSE_MOB; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAreaSummon.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAreaSummon.java new file mode 100644 index 0000000000..ec57ec7bd2 --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAreaSummon.java @@ -0,0 +1,73 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.Collection; +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Attackable; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Playable; +import com.l2jserver.gameserver.model.actor.instance.L2SummonInstance; +import com.l2jserver.gameserver.util.Util; + +/** + * @author UnAfraid + * + */ +public class TargetAreaSummon implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + target = activeChar.getPet(); + if (target == null || !(target instanceof L2SummonInstance) || target.isDead()) + return _emptyTargetList; + + if (onlyFirst) + return new L2Character[] { target }; + + final boolean srcInArena = (activeChar.isInsideZone(L2Character.ZONE_PVP) && !activeChar.isInsideZone(L2Character.ZONE_SIEGE)); + final Collection<L2Character> objs = target.getKnownList().getKnownCharacters(); + final int radius = skill.getSkillRadius(); + + for (L2Character obj : objs) + { + if (obj == null || obj == target || obj == activeChar) + continue; + + if (!Util.checkIfInRange(radius, target, obj, true)) + continue; + + if (!(obj instanceof L2Attackable || obj instanceof L2Playable)) + continue; + + if (!L2Skill.checkForAreaOffensiveSkills(activeChar, obj, skill, srcInArena)) + continue; + + if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets()) + break; + + targetList.add(obj); + } + + if (targetList.isEmpty()) + return _emptyTargetList; + + return targetList.toArray(new L2Character[targetList.size()]); + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_AREA_SUMMON; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAreaUndead.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAreaUndead.java new file mode 100644 index 0000000000..f1456ea025 --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAreaUndead.java @@ -0,0 +1,83 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.Collection; +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.Config; +import com.l2jserver.gameserver.GeoData; +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2SummonInstance; +import com.l2jserver.gameserver.util.Util; + +/** + * @author UnAfraid + * + */ +public class TargetAreaUndead implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + final L2Character cha; + final int radius = skill.getSkillRadius(); + if (skill.getCastRange() >= 0 && (target instanceof L2Npc || target instanceof L2SummonInstance) && target.isUndead() && !target.isAlikeDead()) + { + cha = target; + + if (!onlyFirst) + targetList.add(cha); + else + return new L2Character[] { cha }; + } + else + cha = activeChar; + + final Collection<L2Character> objs = activeChar.getKnownList().getKnownCharacters(); + for (L2Character obj : objs) + { + if (!Util.checkIfInRange(radius, cha, obj, true)) + continue; + else if (obj instanceof L2Npc) + target = obj; + else if (obj instanceof L2SummonInstance) + target = obj; + else + continue; + + if (!target.isAlikeDead()) + { + if (!target.isUndead()) + continue; + else if (Config.GEODATA > 0 && !GeoData.getInstance().canSeeTarget(activeChar, target)) + continue; + else if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets()) + break; + else if (!onlyFirst) + targetList.add(obj); + else + return new L2Character[] { obj }; + } + } + + if (targetList.isEmpty()) + return _emptyTargetList; + return targetList.toArray(new L2Character[targetList.size()]); + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_AREA_UNDEAD; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAura.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAura.java new file mode 100644 index 0000000000..c67eaa34e0 --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAura.java @@ -0,0 +1,81 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.Collection; +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Attackable; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Playable; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.templates.skills.L2SkillType; + +/** + * @author UnAfraid + * + */ +public class TargetAura implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + final boolean srcInArena = (activeChar.isInsideZone(L2Character.ZONE_PVP) && !activeChar.isInsideZone(L2Character.ZONE_SIEGE)); + + final L2PcInstance sourcePlayer = activeChar.getActingPlayer(); + + final Collection<L2Character> objs = activeChar.getKnownList().getKnownCharactersInRadius(skill.getSkillRadius()); + + if (skill.getSkillType() == L2SkillType.DUMMY) + { + if (onlyFirst) + return new L2Character[] { activeChar }; + + targetList.add(activeChar); + for (L2Character obj : objs) + { + if (!(obj == activeChar || obj == sourcePlayer || obj instanceof L2Npc || obj instanceof L2Attackable)) + continue; + + if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets()) + break; + + targetList.add(obj); + } + } + else + { + for (L2Character obj : objs) + { + if (obj instanceof L2Attackable || obj instanceof L2Playable) + { + if (!L2Skill.checkForAreaOffensiveSkills(activeChar, obj, skill, srcInArena)) + continue; + + if (onlyFirst) + return new L2Character[] { obj }; + + if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets()) + break; + targetList.add(obj); + } + } + } + return targetList.toArray(new L2Character[targetList.size()]); + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_AURA; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAuraCorpseMob.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAuraCorpseMob.java new file mode 100644 index 0000000000..5422616aa1 --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetAuraCorpseMob.java @@ -0,0 +1,51 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.Collection; +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Attackable; +import com.l2jserver.gameserver.model.actor.L2Character; + +/** + * @author UnAfraid + * + */ +public class TargetAuraCorpseMob implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + // Go through the L2Character _knownList + final Collection<L2Character> objs = activeChar.getKnownList().getKnownCharactersInRadius(skill.getSkillRadius()); + for (L2Character obj : objs) + { + if (obj instanceof L2Attackable && obj.isDead()) + { + if (onlyFirst) + return new L2Character[] { obj }; + + if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets()) + break; + + targetList.add(obj); + } + } + return targetList.toArray(new L2Character[targetList.size()]); + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_AURA_CORPSE_MOB; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetBehindArea.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetBehindArea.java new file mode 100644 index 0000000000..4ab8b76e04 --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetBehindArea.java @@ -0,0 +1,91 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.Collection; +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Attackable; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Playable; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.SystemMessage; +import com.l2jserver.gameserver.util.Util; + +/** + * @author UnAfraid + * + */ +public class TargetBehindArea implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + if (((target == null || target == activeChar || target.isAlikeDead()) && skill.getCastRange() >= 0) || (!(target instanceof L2Attackable || target instanceof L2Playable))) + { + activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.TARGET_IS_INCORRECT)); + return _emptyTargetList; + } + + final L2Character origin; + final boolean srcInArena = (activeChar.isInsideZone(L2Character.ZONE_PVP) && !activeChar.isInsideZone(L2Character.ZONE_SIEGE)); + final int radius = skill.getSkillRadius(); + + if (skill.getCastRange() >= 0) + { + if (!L2Skill.checkForAreaOffensiveSkills(activeChar, target, skill, srcInArena)) + return _emptyTargetList; + + if (onlyFirst) + return new L2Character[] { target }; + + origin = target; + targetList.add(origin); // Add target to target list + } + else + origin = activeChar; + + final Collection<L2Character> objs = activeChar.getKnownList().getKnownCharacters(); + for (L2Character obj : objs) + { + if (!(obj instanceof L2Attackable || obj instanceof L2Playable)) + continue; + + if (obj == origin) + continue; + + if (Util.checkIfInRange(radius, origin, obj, true)) + { + if (!obj.isBehind(activeChar)) + continue; + + if (!L2Skill.checkForAreaOffensiveSkills(activeChar, obj, skill, srcInArena)) + continue; + + if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets()) + break; + + targetList.add(obj); + } + } + + if (targetList.isEmpty()) + return _emptyTargetList; + + return targetList.toArray(new L2Character[targetList.size()]); + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_BEHIND_AREA; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetBehindAura.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetBehindAura.java new file mode 100644 index 0000000000..1150dad0d5 --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetBehindAura.java @@ -0,0 +1,84 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.Collection; +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Attackable; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Playable; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.templates.skills.L2SkillType; + +/** + * @author UnAfraid + * + */ +public class TargetBehindAura implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + final boolean srcInArena = (activeChar.isInsideZone(L2Character.ZONE_PVP) && !activeChar.isInsideZone(L2Character.ZONE_SIEGE)); + + final L2PcInstance sourcePlayer = activeChar.getActingPlayer(); + + final Collection<L2Character> objs = activeChar.getKnownList().getKnownCharactersInRadius(skill.getSkillRadius()); + + if (skill.getSkillType() == L2SkillType.DUMMY) + { + if (onlyFirst) + return new L2Character[] { activeChar }; + + targetList.add(activeChar); + for (L2Character obj : objs) + { + if (!(obj == activeChar || obj == sourcePlayer || obj instanceof L2Npc || obj instanceof L2Attackable)) + continue; + + if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets()) + break; + targetList.add(obj); + } + } + else + { + for (L2Character obj : objs) + { + if (obj instanceof L2Attackable || obj instanceof L2Playable) + { + + if (!obj.isBehind(activeChar)) + continue; + + if (!L2Skill.checkForAreaOffensiveSkills(activeChar, obj, skill, srcInArena)) + continue; + + if (onlyFirst) + return new L2Character[] { obj }; + + if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets()) + break; + targetList.add(obj); + } + } + } + return targetList.toArray(new L2Character[targetList.size()]); + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_BEHIND_AURA; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetClan.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetClan.java new file mode 100644 index 0000000000..3a838af777 --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetClan.java @@ -0,0 +1,132 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.Collection; +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Clan; +import com.l2jserver.gameserver.model.L2ClanMember; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Playable; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.entity.TvTEvent; +import com.l2jserver.gameserver.util.Util; + +/** + * @author UnAfraid + * + */ +public class TargetClan implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + if (activeChar instanceof L2Playable) + { + final L2PcInstance player = activeChar.getActingPlayer(); + + if (player == null) + return _emptyTargetList; + + if (player.isInOlympiadMode()) + return new L2Character[] { player }; + + if (onlyFirst) + return new L2Character[] { player }; + + targetList.add(player); + + final int radius = skill.getSkillRadius(); + final L2Clan clan = player.getClan(); + + if (L2Skill.addSummon(activeChar, player, radius, false)) + targetList.add(player.getPet()); + + if (clan != null) + { + L2PcInstance obj; + for (L2ClanMember member : clan.getMembers()) + { + obj = member.getPlayerInstance(); + + if (obj == null || obj == player) + continue; + + if (player.isInDuel()) + { + if (player.getDuelId() != obj.getDuelId()) + continue; + if (player.isInParty() && obj.isInParty() && player.getParty().getPartyLeaderOID() != obj.getParty().getPartyLeaderOID()) + continue; + } + + // Don't add this target if this is a Pc->Pc pvp casting and pvp condition not met + if (!player.checkPvpSkill(obj, skill)) + continue; + + if (!TvTEvent.checkForTvTSkill(player, obj, skill)) + continue; + + if (!onlyFirst && L2Skill.addSummon(activeChar, obj, radius, false)) + targetList.add(obj.getPet()); + + if (!L2Skill.addCharacter(activeChar, obj, radius, false)) + continue; + + if (onlyFirst) + return new L2Character[] { obj }; + + if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets()) + break; + + targetList.add(obj); + } + } + } + else if (activeChar instanceof L2Npc) + { + // for buff purposes, returns friendly mobs nearby and mob itself + final L2Npc npc = (L2Npc) activeChar; + if (npc.getFactionId() == null || npc.getFactionId().isEmpty()) + { + return new L2Character[] { activeChar }; + } + + targetList.add(activeChar); + + final Collection<L2Object> objs = activeChar.getKnownList().getKnownObjects().values(); + + for (L2Object newTarget : objs) + { + if (newTarget instanceof L2Npc && npc.getFactionId().equals(((L2Npc) newTarget).getFactionId())) + { + if (!Util.checkIfInRange(skill.getCastRange(), activeChar, newTarget, true)) + continue; + + if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets()) + break; + + targetList.add((L2Npc) newTarget); + } + } + } + + return targetList.toArray(new L2Character[targetList.size()]); + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_CLAN; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetClanMember.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetClanMember.java new file mode 100644 index 0000000000..be34bfaf1a --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetClanMember.java @@ -0,0 +1,63 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.Collection; +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.util.Util; + +/** + * @author UnAfraid + * + */ +public class TargetClanMember implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + if (activeChar instanceof L2Npc) + { + // for buff purposes, returns friendly mobs nearby and mob itself + final L2Npc npc = (L2Npc) activeChar; + if (npc.getFactionId() == null || npc.getFactionId().isEmpty()) + { + return new L2Character[] { activeChar }; + } + final Collection<L2Object> objs = activeChar.getKnownList().getKnownObjects().values(); + for (L2Object newTarget : objs) + { + if (newTarget instanceof L2Npc && npc.getFactionId().equals(((L2Npc) newTarget).getFactionId())) + { + if (!Util.checkIfInRange(skill.getCastRange(), activeChar, newTarget, true)) + continue; + if (((L2Npc) newTarget).getFirstEffect(skill) != null) + continue; + targetList.add((L2Npc) newTarget); + break; + } + } + if (targetList.isEmpty()) + targetList.add(npc); + } + else + return _emptyTargetList; + return targetList.toArray(new L2Character[targetList.size()]); + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_CLAN_MEMBER; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetCorpseAlly.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetCorpseAlly.java new file mode 100644 index 0000000000..679a49bf9a --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetCorpseAlly.java @@ -0,0 +1,108 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.Collection; +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Playable; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.entity.TvTEvent; +import com.l2jserver.gameserver.templates.skills.L2SkillType; + +/** + * @author UnAfraid + * + */ +public class TargetCorpseAlly implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + if (activeChar instanceof L2Playable) + { + final L2PcInstance player = activeChar.getActingPlayer(); + + if (player == null) + return _emptyTargetList; + + if (player.isInOlympiadMode()) + return new L2Character[] {player}; + + final int radius = skill.getSkillRadius(); + + if (L2Skill.addSummon(activeChar, player, radius, true)) + targetList.add(player.getPet()); + + if (player.getClan() != null) + { + // Get all visible objects in a spherical area near the L2Character + final Collection<L2PcInstance> objs = activeChar.getKnownList().getKnownPlayersInRadius(radius); + //synchronized (activeChar.getKnownList().getKnownObjects()) + { + for (L2PcInstance obj : objs) + { + if (obj == null) + continue; + if ((obj.getAllyId() == 0 || obj.getAllyId() != player.getAllyId()) + && (obj.getClan() == null || obj.getClanId() != player.getClanId())) + continue; + + if (player.isInDuel()) + { + if (player.getDuelId() != obj.getDuelId()) + continue; + if (player.isInParty() && obj.isInParty() && player.getParty().getPartyLeaderOID() != obj.getParty().getPartyLeaderOID()) + continue; + } + + // Don't add this target if this is a Pc->Pc pvp + // casting and pvp condition not met + if (!player.checkPvpSkill(obj, skill)) + continue; + + if (!TvTEvent.checkForTvTSkill(player, obj, skill)) + continue; + + if (!onlyFirst && L2Skill.addSummon(activeChar, obj, radius, true)) + targetList.add(obj.getPet()); + + if (!L2Skill.addCharacter(activeChar, obj, radius, true)) + continue; + + // Siege battlefield resurrect has been made possible for participants + if (skill.getSkillType() == L2SkillType.RESURRECT) + { + if (obj.isInsideZone(L2Character.ZONE_SIEGE) && !obj.isInSiege()) + continue; + } + + if (onlyFirst) + return new L2Character[] { obj }; + + if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets()) + break; + + targetList.add(obj); + } + } + } + } + return targetList.toArray(new L2Character[targetList.size()]); + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_CORPSE_ALLY; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetCorpseClan.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetCorpseClan.java new file mode 100644 index 0000000000..41020ed1c3 --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetCorpseClan.java @@ -0,0 +1,135 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.Collection; +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Clan; +import com.l2jserver.gameserver.model.L2ClanMember; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Playable; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.entity.TvTEvent; +import com.l2jserver.gameserver.templates.skills.L2SkillType; +import com.l2jserver.gameserver.util.Util; + +/** + * @author UnAfraid + * + */ +public class TargetCorpseClan implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + if (activeChar instanceof L2Playable) + { + final L2PcInstance player = activeChar.getActingPlayer(); + + if (player == null) + return _emptyTargetList; + + if (player.isInOlympiadMode()) + return new L2Character[] { player }; + + final int radius = skill.getSkillRadius(); + final L2Clan clan = player.getClan(); + + if (L2Skill.addSummon(activeChar, player, radius, true)) + targetList.add(player.getPet()); + + if (clan != null) + { + L2PcInstance obj; + for (L2ClanMember member : clan.getMembers()) + { + obj = member.getPlayerInstance(); + + if (obj == null || obj == player) + continue; + + if (player.isInDuel()) + { + if (player.getDuelId() != obj.getDuelId()) + continue; + if (player.isInParty() && obj.isInParty() && player.getParty().getPartyLeaderOID() != obj.getParty().getPartyLeaderOID()) + continue; + } + + // Don't add this target if this is a Pc->Pc pvp casting and pvp condition not met + if (!player.checkPvpSkill(obj, skill)) + continue; + + if (!TvTEvent.checkForTvTSkill(player, obj, skill)) + continue; + + if (!onlyFirst && L2Skill.addSummon(activeChar, obj, radius, true)) + targetList.add(obj.getPet()); + + if (!L2Skill.addCharacter(activeChar, obj, radius, true)) + continue; + + if (skill.getSkillType() == L2SkillType.RESURRECT) + { + // check target is not in a active siege zone + if (obj.isInsideZone(L2Character.ZONE_SIEGE) && !obj.isInSiege()) + continue; + } + + if (onlyFirst) + return new L2Character[] { obj }; + + if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets()) + break; + + targetList.add(obj); + } + } + } + else if (activeChar instanceof L2Npc) + { + // for buff purposes, returns friendly mobs nearby and mob itself + final L2Npc npc = (L2Npc) activeChar; + if (npc.getFactionId() == null || npc.getFactionId().isEmpty()) + { + return new L2Character[] { activeChar }; + } + + targetList.add(activeChar); + + final Collection<L2Object> objs = activeChar.getKnownList().getKnownObjects().values(); + + for (L2Object newTarget : objs) + { + if (newTarget instanceof L2Npc && npc.getFactionId().equals(((L2Npc) newTarget).getFactionId())) + { + if (!Util.checkIfInRange(skill.getCastRange(), activeChar, newTarget, true)) + continue; + + if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets()) + break; + + targetList.add((L2Npc) newTarget); + } + } + } + + return targetList.toArray(new L2Character[targetList.size()]); + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_CORPSE_CLAN; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetCorpseMob.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetCorpseMob.java new file mode 100644 index 0000000000..1031cdabff --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetCorpseMob.java @@ -0,0 +1,69 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.Config; +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Attackable; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.instance.L2SummonInstance; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.SystemMessage; + +/** + * @author UnAfraid + * + */ +public class TargetCorpseMob implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + final boolean isSummon = target instanceof L2SummonInstance; + if (!(isSummon || target instanceof L2Attackable) || !target.isDead()) + { + activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.TARGET_IS_INCORRECT)); + return _emptyTargetList; + } + + // Corpse mob only available for half time + switch (skill.getSkillType()) + { + case SUMMON: + { + if (isSummon && ((L2SummonInstance)target).getOwner() != null + && ((L2SummonInstance)target).getOwner().getObjectId() == activeChar.getObjectId()) + return _emptyTargetList; + } + case DRAIN: + { + if (((L2Attackable) target).checkCorpseTime(activeChar.getActingPlayer(), (Config.NPC_DECAY_TIME / 2), true)) + { + return _emptyTargetList; + } + } + } + + if (!onlyFirst) + { + targetList.add(target); + return targetList.toArray(new L2Object[targetList.size()]); + } + return new L2Character[] { target }; + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_CORPSE_MOB; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetCorpsePet.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetCorpsePet.java new file mode 100644 index 0000000000..9042b22f57 --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetCorpsePet.java @@ -0,0 +1,37 @@ +/** + * + */ +package handlers.targethandlers; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; + +/** + * @author UnAfraid + * + */ +public class TargetCorpsePet implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + if (activeChar instanceof L2PcInstance) + { + target = activeChar.getPet(); + if (target != null && target.isDead()) + return new L2Character[] { target }; + } + + return _emptyTargetList; + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_CORPSE_PET; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetCorpsePlayer.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetCorpsePlayer.java new file mode 100644 index 0000000000..7d36de289e --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetCorpsePlayer.java @@ -0,0 +1,117 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.actor.instance.L2PetInstance; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.SystemMessage; +import com.l2jserver.gameserver.templates.skills.L2SkillType; + +/** + * @author UnAfraid + * + */ +public class TargetCorpsePlayer implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + if (target != null && target.isDead()) + { + final L2PcInstance player; + if (activeChar instanceof L2PcInstance) + player = (L2PcInstance) activeChar; + else + player = null; + + final L2PcInstance targetPlayer; + if (target instanceof L2PcInstance) + targetPlayer = (L2PcInstance) target; + else + targetPlayer = null; + + final L2PetInstance targetPet; + if (target instanceof L2PetInstance) + targetPet = (L2PetInstance) target; + else + targetPet = null; + + if (player != null && (targetPlayer != null || targetPet != null)) + { + boolean condGood = true; + + if (skill.getSkillType() == L2SkillType.RESURRECT) + { + if (targetPlayer != null) + { + // check target is not in a active siege zone + if (targetPlayer.isInsideZone(L2Character.ZONE_SIEGE) && !targetPlayer.isInSiege()) + { + condGood = false; + activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CANNOT_BE_RESURRECTED_DURING_SIEGE)); + } + + if (targetPlayer.isFestivalParticipant()) // Check to see if the current player target is in a festival. + { + condGood = false; + activeChar.sendMessage("You may not resurrect participants in a festival."); + } + if (targetPlayer.isReviveRequested()) + { + if (targetPlayer.isRevivingPet()) + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.MASTER_CANNOT_RES)); // While a pet is attempting to resurrect, it cannot help in resurrecting its master. + else + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.RES_HAS_ALREADY_BEEN_PROPOSED)); // Resurrection is already been proposed. + condGood = false; + } + } + else if (targetPet != null) + { + if (targetPet.getOwner() != player) + { + if (targetPet.getOwner().isReviveRequested()) + { + if (targetPet.getOwner().isRevivingPet()) + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.RES_HAS_ALREADY_BEEN_PROPOSED)); // Resurrection is already been proposed. + else + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CANNOT_RES_PET2)); // A pet cannot be resurrected while it's owner is in the process of resurrecting. + condGood = false; + } + } + } + } + + if (condGood) + { + if (!onlyFirst) + { + targetList.add(target); + return targetList.toArray(new L2Object[targetList.size()]); + } + else + return new L2Character[] { target }; + } + } + } + activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.TARGET_IS_INCORRECT)); + return _emptyTargetList; + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_CORPSE_PLAYER; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetEnemySummon.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetEnemySummon.java new file mode 100644 index 0000000000..086657341f --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetEnemySummon.java @@ -0,0 +1,40 @@ +/** + * + */ +package handlers.targethandlers; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Summon; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; + +/** + * @author UnAfraid + * + */ +public class TargetEnemySummon implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + if(target instanceof L2Summon) + { + L2Summon targetSummon = (L2Summon)target; + if (activeChar instanceof L2PcInstance && activeChar.getPet() != targetSummon && !targetSummon.isDead() + && (targetSummon.getOwner().getPvpFlag() != 0 || targetSummon.getOwner().getKarma() > 0) + || (targetSummon.getOwner().isInsideZone(L2Character.ZONE_PVP) && ((L2PcInstance)activeChar).isInsideZone(L2Character.ZONE_PVP)) + || (targetSummon.getOwner().isInDuel() && ((L2PcInstance)activeChar).isInDuel() && targetSummon.getOwner().getDuelId() == ((L2PcInstance)activeChar).getDuelId())) + return new L2Character[]{targetSummon}; + } + return _emptyTargetList; + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_ENEMY_SUMMON; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetFlagPole.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetFlagPole.java new file mode 100644 index 0000000000..fd4224644d --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetFlagPole.java @@ -0,0 +1,29 @@ +/** + * + */ +package handlers.targethandlers; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; + +/** + * @author UnAfraid + * + */ +public class TargetFlagPole implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + return new L2Character[] { activeChar }; + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_FLAGPOLE; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetFrontArea.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetFrontArea.java new file mode 100644 index 0000000000..f4c5e0bb43 --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetFrontArea.java @@ -0,0 +1,91 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.Collection; +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Attackable; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Playable; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.SystemMessage; +import com.l2jserver.gameserver.util.Util; + +/** + * @author UnAfraid + * + */ +public class TargetFrontArea implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + if (((target == null || target == activeChar || target.isAlikeDead()) && skill.getCastRange() >= 0) || (!(target instanceof L2Attackable || target instanceof L2Playable))) + { + activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.TARGET_IS_INCORRECT)); + return _emptyTargetList; + } + + final L2Character origin; + final boolean srcInArena = (activeChar.isInsideZone(L2Character.ZONE_PVP) && !activeChar.isInsideZone(L2Character.ZONE_SIEGE)); + final int radius = skill.getSkillRadius(); + + if (skill.getCastRange() >= 0) + { + if (!L2Skill.checkForAreaOffensiveSkills(activeChar, target, skill, srcInArena)) + return _emptyTargetList; + + if (onlyFirst) + return new L2Character[] { target }; + + origin = target; + targetList.add(origin); // Add target to target list + } + else + origin = activeChar; + + final Collection<L2Character> objs = activeChar.getKnownList().getKnownCharacters(); + for (L2Character obj : objs) + { + if (!(obj instanceof L2Attackable || obj instanceof L2Playable)) + continue; + + if (obj == origin) + continue; + + if (Util.checkIfInRange(radius, origin, obj, true)) + { + if (!obj.isInFrontOf(activeChar)) + continue; + + if (!L2Skill.checkForAreaOffensiveSkills(activeChar, obj, skill, srcInArena)) + continue; + + if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets()) + break; + + targetList.add(obj); + } + } + + if (targetList.isEmpty()) + return _emptyTargetList; + + return targetList.toArray(new L2Character[targetList.size()]); + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_FRONT_AREA; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetFrontAura.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetFrontAura.java new file mode 100644 index 0000000000..a4eb0b7cf4 --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetFrontAura.java @@ -0,0 +1,84 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.Collection; +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Attackable; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Playable; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.templates.skills.L2SkillType; + +/** + * @author UnAfraid + * + */ +public class TargetFrontAura implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + final boolean srcInArena = (activeChar.isInsideZone(L2Character.ZONE_PVP) && !activeChar.isInsideZone(L2Character.ZONE_SIEGE)); + + final L2PcInstance sourcePlayer = activeChar.getActingPlayer(); + + final Collection<L2Character> objs = activeChar.getKnownList().getKnownCharactersInRadius(skill.getSkillRadius()); + + if (skill.getSkillType() == L2SkillType.DUMMY) + { + if (onlyFirst) + return new L2Character[] { activeChar }; + + targetList.add(activeChar); + for (L2Character obj : objs) + { + if (!(obj == activeChar || obj == sourcePlayer || obj instanceof L2Npc || obj instanceof L2Attackable)) + continue; + + if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets()) + break; + targetList.add(obj); + } + } + else + { + for (L2Character obj : objs) + { + if (obj instanceof L2Attackable || obj instanceof L2Playable) + { + + if (!obj.isInFrontOf(activeChar)) + continue; + + if (!L2Skill.checkForAreaOffensiveSkills(activeChar, obj, skill, srcInArena)) + continue; + + if (onlyFirst) + return new L2Character[] { obj }; + + if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets()) + break; + targetList.add(obj); + } + } + } + return targetList.toArray(new L2Character[targetList.size()]); + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_FRONT_AURA; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetGround.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetGround.java new file mode 100644 index 0000000000..f758e4d81b --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetGround.java @@ -0,0 +1,30 @@ +/** + * + */ +package handlers.targethandlers; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; + +/** + * @author UnAfraid + * + */ +public class TargetGround implements ISkillTargetTypeHandler +{ + + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + return new L2Character[] { activeChar }; + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_GROUND; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetHoly.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetHoly.java new file mode 100644 index 0000000000..a6090c6686 --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetHoly.java @@ -0,0 +1,37 @@ +/** + * + */ +package handlers.targethandlers; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.instance.L2ArtefactInstance; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; + +/** + * @author UnAfraid + * + */ +public class TargetHoly implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + if (activeChar instanceof L2PcInstance) + { + if (target instanceof L2ArtefactInstance) + return new L2Character[] { target }; + } + + return _emptyTargetList; + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_HOLY; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetOne.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetOne.java new file mode 100644 index 0000000000..13cdaba059 --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetOne.java @@ -0,0 +1,61 @@ +/** + * + */ +package handlers.targethandlers; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.SystemMessage; + +/** + * @author UnAfraid + * + */ +public class TargetOne implements ISkillTargetTypeHandler +{ + + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + boolean canTargetSelf = false; + switch (skill.getSkillType()) + { + case BUFF: + case HEAL: + case HOT: + case HEAL_PERCENT: + case MANARECHARGE: + case MANA_BY_LEVEL: + case MANAHEAL: + case NEGATE: + case CANCEL_DEBUFF: + case COMBATPOINTHEAL: + case BALANCE_LIFE: + case HPMPCPHEAL_PERCENT: + case HPMPHEAL_PERCENT: + case HPCPHEAL_PERCENT: + canTargetSelf = true; + break; + } + + // Check for null target or any other invalid target + if (target == null || target.isDead() || (target == activeChar && !canTargetSelf)) + { + activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.TARGET_IS_INCORRECT)); + return _emptyTargetList; + } + + // If a target is found, return it in a table else send a system message TARGET_IS_INCORRECT + return new L2Character[] { target }; + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_ONE; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetOwnerPet.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetOwnerPet.java new file mode 100644 index 0000000000..bec621ad5e --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetOwnerPet.java @@ -0,0 +1,37 @@ +/** + * + */ +package handlers.targethandlers; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Summon; + +/** + * @author UnAfraid + * + */ +public class TargetOwnerPet implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + if (activeChar instanceof L2Summon) + { + target = ((L2Summon) activeChar).getOwner(); + if (target != null && !target.isDead()) + return new L2Character[] { target }; + } + + return _emptyTargetList; + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_OWNER_PET; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetParty.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetParty.java new file mode 100644 index 0000000000..0bef8dc223 --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetParty.java @@ -0,0 +1,73 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Summon; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; + +/** + * @author UnAfraid + * + */ +public class TargetParty implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + if (onlyFirst) + return new L2Character[] { activeChar }; + + targetList.add(activeChar); + + final int radius = skill.getSkillRadius(); + + L2PcInstance player = activeChar.getActingPlayer(); + if (activeChar instanceof L2Summon) + { + if (L2Skill.addCharacter(activeChar, player, radius, false)) + targetList.add(player); + } + else if (activeChar instanceof L2PcInstance) + { + if (L2Skill.addSummon(activeChar, player, radius, false)) + targetList.add(player.getPet()); + } + + if (activeChar.isInParty()) + { + // Get a list of Party Members + for (L2PcInstance partyMember : activeChar.getParty().getPartyMembers()) + { + if (partyMember == null || partyMember == player) + continue; + + if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets()) + break; + + if (L2Skill.addCharacter(activeChar, partyMember, radius, false)) + targetList.add(partyMember); + + if (L2Skill.addSummon(activeChar, partyMember, radius, false)) + targetList.add(partyMember.getPet()); + } + } + return targetList.toArray(new L2Character[targetList.size()]); + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_PARTY; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetPartyClan.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetPartyClan.java new file mode 100644 index 0000000000..f0685d47b0 --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetPartyClan.java @@ -0,0 +1,111 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.Collection; +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.entity.TvTEvent; + +/** + * @author UnAfraid + * + */ +public class TargetPartyClan implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + if (onlyFirst) + return new L2Character[] { activeChar }; + + final L2PcInstance player = activeChar.getActingPlayer(); + + if (player == null) + return _emptyTargetList; + + targetList.add(player); + + final int radius = skill.getSkillRadius(); + final boolean hasClan = player.getClan() != null; + final boolean hasParty = player.isInParty(); + + if (L2Skill.addSummon(activeChar, player, radius, false)) + targetList.add(player.getPet()); + + // if player in clan and not in party + if (!(hasClan || hasParty)) + return targetList.toArray(new L2Character[targetList.size()]); + + // Get all visible objects in a spherical area near the L2Character + final Collection<L2PcInstance> objs = activeChar.getKnownList().getKnownPlayersInRadius(radius); + for (L2PcInstance obj : objs) + { + if (obj == null) + continue; + + // olympiad mode - adding only own side + if (player.isInOlympiadMode()) + { + if (!obj.isInOlympiadMode()) + continue; + if (player.getOlympiadGameId() != obj.getOlympiadGameId()) + continue; + if (player.getOlympiadSide() != obj.getOlympiadSide()) + continue; + } + + if (player.isInDuel()) + { + if (player.getDuelId() != obj.getDuelId()) + continue; + + if (hasParty && obj.isInParty() && player.getParty().getPartyLeaderOID() != obj.getParty().getPartyLeaderOID()) + continue; + } + + if (!((hasClan && obj.getClanId() == player.getClanId()) || (hasParty && obj.isInParty() && player.getParty().getPartyLeaderOID() == obj.getParty().getPartyLeaderOID()))) + continue; + + // Don't add this target if this is a Pc->Pc pvp + // casting and pvp condition not met + if (!player.checkPvpSkill(obj, skill)) + continue; + + if (!TvTEvent.checkForTvTSkill(player, obj, skill)) + continue; + + if (!onlyFirst && L2Skill.addSummon(activeChar, obj, radius, false)) + targetList.add(obj.getPet()); + + if (!L2Skill.addCharacter(activeChar, obj, radius, false)) + continue; + + if (onlyFirst) + return new L2Character[] { obj }; + + if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets()) + break; + + targetList.add(obj); + } + + return targetList.toArray(new L2Character[targetList.size()]); + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_PARTY_CLAN; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetPartyMember.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetPartyMember.java new file mode 100644 index 0000000000..20179a28d5 --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetPartyMember.java @@ -0,0 +1,60 @@ +/** + * + */ +package handlers.targethandlers; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Summon; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.SystemMessage; + +/** + * @author UnAfraid + * + */ +public class TargetPartyMember implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + if ((target != null + && target == activeChar) + || (target != null + && activeChar.isInParty() + && target.isInParty() + && activeChar.getParty().getPartyLeaderOID() == target.getParty().getPartyLeaderOID()) + || (target != null + && activeChar instanceof L2PcInstance + && target instanceof L2Summon + && activeChar.getPet() == target) + || (target != null + && activeChar instanceof L2Summon + && target instanceof L2PcInstance + && activeChar == target.getPet())) + { + if (!target.isDead()) + { + // If a target is found, return it in a table else send a system message TARGET_IS_INCORRECT + return new L2Character[] { target }; + } + else + return _emptyTargetList; + } + else + { + activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.TARGET_IS_INCORRECT)); + return _emptyTargetList; + } + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_PARTY_MEMBER; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetPartyNotMe.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetPartyNotMe.java new file mode 100644 index 0000000000..791583162b --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetPartyNotMe.java @@ -0,0 +1,78 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Summon; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.util.Util; + +/** + * @author UnAfraid + * + */ +public class TargetPartyNotMe implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + if (onlyFirst) + return new L2Character[] { activeChar }; + + L2PcInstance player = null; + + if (activeChar instanceof L2Summon) + { + player = ((L2Summon) activeChar).getOwner(); + targetList.add(player); + } + else if (activeChar instanceof L2PcInstance) + { + player = (L2PcInstance) activeChar; + if (activeChar.getPet() != null) + targetList.add(activeChar.getPet()); + } + + if (activeChar.getParty() != null) + { + List<L2PcInstance> partyList = activeChar.getParty().getPartyMembers(); + + for (L2PcInstance partyMember : partyList) + { + if (partyMember == null) + continue; + else if (partyMember == player) + continue; + else if (!partyMember.isDead() && Util.checkIfInRange(skill.getSkillRadius(), activeChar, partyMember, true)) + { + if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets()) + break; + + targetList.add(partyMember); + + if (partyMember.getPet() != null && !partyMember.getPet().isDead()) + { + targetList.add(partyMember.getPet()); + } + } + } + } + return targetList.toArray(new L2Character[targetList.size()]); + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_PARTY_NOTME; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetPartyOther.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetPartyOther.java new file mode 100644 index 0000000000..4bdff8a603 --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetPartyOther.java @@ -0,0 +1,64 @@ +/** + * + */ +package handlers.targethandlers; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.SystemMessage; + +/** + * @author UnAfraid + * + */ +public class TargetPartyOther implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + if (target != null && target != activeChar + && activeChar.isInParty() && target.isInParty() + && activeChar.getParty().getPartyLeaderOID() == target.getParty().getPartyLeaderOID()) + { + if (!target.isDead()) + { + if (target instanceof L2PcInstance) + { + switch (skill.getId()) + { + // FORCE BUFFS may cancel here but there should be a proper condition + case 426: + if (!((L2PcInstance) target).isMageClass()) + return new L2Character[] { target }; + else + return _emptyTargetList; + case 427: + if (((L2PcInstance) target).isMageClass()) + return new L2Character[] { target }; + else + return _emptyTargetList; + } + } + return new L2Character[] { target }; + } + else + return _emptyTargetList; + } + else + { + activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.TARGET_IS_INCORRECT)); + return _emptyTargetList; + } + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_PARTY_OTHER; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetPet.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetPet.java new file mode 100644 index 0000000000..d862169192 --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetPet.java @@ -0,0 +1,33 @@ +/** + * + */ +package handlers.targethandlers; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; + +/** + * @author UnAfraid + * + */ +public class TargetPet implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + target = activeChar.getPet(); + if (target != null && !target.isDead()) + return new L2Character[] { target }; + + return _emptyTargetList; + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_PET; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetSelf.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetSelf.java new file mode 100644 index 0000000000..3011755750 --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetSelf.java @@ -0,0 +1,30 @@ +/** + * + */ +package handlers.targethandlers; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; + +/** + * @author UnAfraid + * + */ +public class TargetSelf implements ISkillTargetTypeHandler +{ + + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + return new L2Character[] { activeChar }; + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_SELF; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetSummon.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetSummon.java new file mode 100644 index 0000000000..d91594c15f --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetSummon.java @@ -0,0 +1,34 @@ +/** + * + */ +package handlers.targethandlers; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.instance.L2SummonInstance; + +/** + * @author UnAfraid + * + */ +public class TargetSummon implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + target = activeChar.getPet(); + if (target != null && !target.isDead() && target instanceof L2SummonInstance) + return new L2Character[] { target }; + + return _emptyTargetList; + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_SUMMON; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetUndead.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetUndead.java new file mode 100644 index 0000000000..5ce97641cb --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetUndead.java @@ -0,0 +1,57 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2SummonInstance; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.SystemMessage; + +/** + * @author UnAfraid + * + */ +public class TargetUndead implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + if (target instanceof L2Npc || target instanceof L2SummonInstance) + { + if (!target.isUndead() || target.isDead()) + { + activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.TARGET_IS_INCORRECT)); + return _emptyTargetList; + } + + if (!onlyFirst) + targetList.add(target); + else + return new L2Character[] { target }; + + return targetList.toArray(new L2Object[targetList.size()]); + } + else + { + activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.TARGET_IS_INCORRECT)); + return _emptyTargetList; + } + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_UNDEAD; + } +} diff --git a/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetUnlockable.java b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetUnlockable.java new file mode 100644 index 0000000000..7a35e7f6a2 --- /dev/null +++ b/L2J_DataPack_BETA/data/scripts/handlers/targethandlers/TargetUnlockable.java @@ -0,0 +1,47 @@ +/** + * + */ +package handlers.targethandlers; + +import java.util.List; + +import javolution.util.FastList; + +import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Skill; +import com.l2jserver.gameserver.model.L2Skill.SkillTargetType; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.instance.L2ChestInstance; +import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance; + +/** + * @author UnAfraid + * + */ +public class TargetUnlockable implements ISkillTargetTypeHandler +{ + @Override + public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + List<L2Character> targetList = new FastList<L2Character>(); + if (!(target instanceof L2DoorInstance) && !(target instanceof L2ChestInstance)) + { + return _emptyTargetList; + } + + if (!onlyFirst) + { + targetList.add(target); + return targetList.toArray(new L2Object[targetList.size()]); + } + else + return new L2Character[] { target }; + } + + @Override + public Enum<SkillTargetType> getTargetType() + { + return SkillTargetType.TARGET_UNLOCKABLE; + } +} -- GitLab