TargetFrontArea.java 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /**
  2. *
  3. */
  4. package handlers.targethandlers;
  5. import java.util.Collection;
  6. import java.util.List;
  7. import javolution.util.FastList;
  8. import com.l2jserver.gameserver.handler.ISkillTargetTypeHandler;
  9. import com.l2jserver.gameserver.model.L2Object;
  10. import com.l2jserver.gameserver.model.L2Skill;
  11. import com.l2jserver.gameserver.model.L2Skill.SkillTargetType;
  12. import com.l2jserver.gameserver.model.actor.L2Attackable;
  13. import com.l2jserver.gameserver.model.actor.L2Character;
  14. import com.l2jserver.gameserver.model.actor.L2Playable;
  15. import com.l2jserver.gameserver.network.SystemMessageId;
  16. import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  17. import com.l2jserver.gameserver.util.Util;
  18. /**
  19. * @author UnAfraid
  20. *
  21. */
  22. public class TargetFrontArea implements ISkillTargetTypeHandler
  23. {
  24. @Override
  25. public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target)
  26. {
  27. List<L2Character> targetList = new FastList<L2Character>();
  28. if (((target == null || target == activeChar || target.isAlikeDead()) && skill.getCastRange() >= 0) || (!(target instanceof L2Attackable || target instanceof L2Playable)))
  29. {
  30. activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.TARGET_IS_INCORRECT));
  31. return _emptyTargetList;
  32. }
  33. final L2Character origin;
  34. final boolean srcInArena = (activeChar.isInsideZone(L2Character.ZONE_PVP) && !activeChar.isInsideZone(L2Character.ZONE_SIEGE));
  35. final int radius = skill.getSkillRadius();
  36. if (skill.getCastRange() >= 0)
  37. {
  38. if (!L2Skill.checkForAreaOffensiveSkills(activeChar, target, skill, srcInArena))
  39. return _emptyTargetList;
  40. if (onlyFirst)
  41. return new L2Character[] { target };
  42. origin = target;
  43. targetList.add(origin); // Add target to target list
  44. }
  45. else
  46. origin = activeChar;
  47. final Collection<L2Character> objs = activeChar.getKnownList().getKnownCharacters();
  48. for (L2Character obj : objs)
  49. {
  50. if (!(obj instanceof L2Attackable || obj instanceof L2Playable))
  51. continue;
  52. if (obj == origin)
  53. continue;
  54. if (Util.checkIfInRange(radius, origin, obj, true))
  55. {
  56. if (!obj.isInFrontOf(activeChar))
  57. continue;
  58. if (!L2Skill.checkForAreaOffensiveSkills(activeChar, obj, skill, srcInArena))
  59. continue;
  60. if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets())
  61. break;
  62. targetList.add(obj);
  63. }
  64. }
  65. if (targetList.isEmpty())
  66. return _emptyTargetList;
  67. return targetList.toArray(new L2Character[targetList.size()]);
  68. }
  69. @Override
  70. public Enum<SkillTargetType> getTargetType()
  71. {
  72. return SkillTargetType.TARGET_FRONT_AREA;
  73. }
  74. }