TargetAlly.java 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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.L2Character;
  13. import com.l2jserver.gameserver.model.actor.L2Playable;
  14. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  15. import com.l2jserver.gameserver.model.entity.TvTEvent;
  16. /**
  17. * @author UnAfraid
  18. *
  19. */
  20. public class TargetAlly implements ISkillTargetTypeHandler
  21. {
  22. @Override
  23. public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target)
  24. {
  25. List<L2Character> targetList = new FastList<L2Character>();
  26. if (activeChar instanceof L2Playable)
  27. {
  28. final L2PcInstance player = activeChar.getActingPlayer();
  29. if (player == null)
  30. return _emptyTargetList;
  31. if (player.isInOlympiadMode())
  32. return new L2Character[] { player };
  33. if (onlyFirst)
  34. return new L2Character[] { player };
  35. targetList.add(player);
  36. final int radius = skill.getSkillRadius();
  37. if (L2Skill.addSummon(activeChar, player, radius, false))
  38. targetList.add(player.getPet());
  39. if (player.getClan() != null)
  40. {
  41. // Get all visible objects in a spherical area near the L2Character
  42. final Collection<L2PcInstance> objs = activeChar.getKnownList().getKnownPlayersInRadius(radius);
  43. for (L2PcInstance obj : objs)
  44. {
  45. if (obj == null)
  46. continue;
  47. if ((obj.getAllyId() == 0 || obj.getAllyId() != player.getAllyId()) && (obj.getClan() == null || obj.getClanId() != player.getClanId()))
  48. continue;
  49. if (player.isInDuel())
  50. {
  51. if (player.getDuelId() != obj.getDuelId())
  52. continue;
  53. if (player.isInParty() && obj.isInParty() && player.getParty().getPartyLeaderOID() != obj.getParty().getPartyLeaderOID())
  54. continue;
  55. }
  56. // Don't add this target if this is a Pc->Pc pvp
  57. // casting and pvp condition not met
  58. if (!player.checkPvpSkill(obj, skill))
  59. continue;
  60. if (!TvTEvent.checkForTvTSkill(player, obj, skill))
  61. continue;
  62. if (!onlyFirst && L2Skill.addSummon(activeChar, obj, radius, false))
  63. targetList.add(obj.getPet());
  64. if (!L2Skill.addCharacter(activeChar, obj, radius, false))
  65. continue;
  66. if (onlyFirst)
  67. return new L2Character[] { obj };
  68. if (skill.getMaxTargets() > -1 && targetList.size() >= skill.getMaxTargets())
  69. break;
  70. targetList.add(obj);
  71. }
  72. }
  73. }
  74. return targetList.toArray(new L2Character[targetList.size()]);
  75. }
  76. @Override
  77. public Enum<SkillTargetType> getTargetType()
  78. {
  79. return SkillTargetType.TARGET_ALLY;
  80. }
  81. }