rendered paste bodypackage com.l2dc.gameserver.skills;import java.util.Collection;import java.util.logging.Logger;import com.l2dc.gameserver.model.L2ClanMember;import com.l2dc.gameserver.model.L2Object;import com.l2dc.gameserver.model.actor.L2Character;import com.l2dc.gameserver.model.actor.L2Npc;import com.l2dc.gameserver.model.actor.L2Summon;import com.l2dc.gameserver.model.actor.instance.L2PcInstance;import com.l2dc.gameserver.model.actor.instance.L2PcInstance.SkillDat;import com.l2dc.gameserver.skills.structure.L2Skill;import com.l2dc.gameserver.skills.structure.L2Skill.AffectObject;import com.l2dc.gameserver.skills.structure.L2Skill.AffectScope;import com.l2dc.gameserver.skills.structure.L2Skill.TargetType;import com.l2dc.gameserver.util.Util;import com.l2dc.util.GArray;public class SkillTargetChooser{ private static final Logger _log = Logger.getLogger(SkillUsageManager.class.getName()); public static final L2Object[] getTargetList(final L2Character caster, final L2Skill skill) { final GArray<L2Object> targetList = new GArray<L2Object>(); if (skill.getTargetType() == TargetType.NONE) return new L2Character[] { caster }; switch (skill.getAffectScope()) { case NONE: { _log.warning("Using affectScope none. This should not happen! Skill: " + skill.getName()); return new L2Object[] { caster }; } case SINGLE: getSingleScope(targetList, caster, skill); break; case POINT_BLANK: getPointBlankScope(targetList, caster, skill); break; case RANGE: getRangeScope(targetList, caster, skill); break; case RING_RANGE: break; // TODO: case PARTY: getPartyScope(targetList, caster, skill); break; case PLEDGE: getPledgeScope(targetList, caster, skill, false); break; case PARTY_PLEDGE: getPartyPledgeScope(targetList, caster, skill); break; case DEAD_PLEDGE: getPledgeScope(targetList, caster, skill, true); break; case FAN: getFanScope(targetList, caster, skill); break; case SQUARE: case SQUARE_PB: case STATIC_OBJECT_SCOPE: case WYVERN_SCOPE: case BALAKAS_SCOPE: } return targetList.toNativeArray(); } private static final L2Object getTargetByType(final L2Skill skill, final L2Character caster) { L2Object _TargetObj = null; switch (skill.getTargetType()) { case ENEMY: { final L2Object target = caster.getTarget(); if (target != null && target.isCharacter()) { if (target.isAutoAttackable(caster)) // FREYA: patikrinti, spejamas _TargetObj = target; } break; } case ENEMY_ONLY: case ENEMY_NOT: case SELF: _TargetObj = caster; break; case HOLYTHING: { final L2Object target = caster.getTarget(); if (target != null && target.isArtefact()) _TargetObj = target; break; } case TARGET: { final L2Object target = caster.getTarget(); if (target != null) _TargetObj = target; break; } case SUMMON: { final L2Object target = caster.getTarget(); if (target != null && target.isSummon()) _TargetObj = target; break; } case DOOR_TREASURE: { final L2Object target = caster.getTarget(); if (target != null && target.isSummon()) _TargetObj = target; break; } case PC_BODY: { final L2Object target = caster.getTarget(); if (target != null && target.isPlayable()) { if (((L2Character) target).isDead()) _TargetObj = target; } break; } case NPC_BODY: { final L2Object target = caster.getTarget(); if (target != null && target.isNpc()) { if (((L2Character) target).isDead()) _TargetObj = target; } break; } case OTHERS: { // FREYA: patikrinti, spejamas final L2Object target = caster.getTarget(); if (target != null && target.isPlayable()) _TargetObj = target; break; } case GROUND: break; // FREYA: padaryti case ADVANCE_BASE: case ITEM: { final L2Object target = caster.getTarget(); if (target != null && target.isItem()) _TargetObj = target; break; } case FORTRESS_FLAGPOLE: break; // FREYA: padaryti case WYVERN_TARGET: break; // FREYA: padaryti case ARTILLERY: break; // FREYA: padaryti } return _TargetObj; } /** Check if object passes skill Affect object conditions */ private static final boolean checkAffectObject(final L2Skill skill, final L2Character caster, final L2Object object) { switch (skill.getAffectObject()) { case FRIEND: case NOT_FRIEND: case UNDEAD_REAL_ENEMY: case OBJECT_DEAD_NPC_BODY: { if (object.isNpc()) { if (((L2Character) object).isDead()) return true; } break; } case INVISIBLE: { if (object.isVisible()) // FREYA: check return true; break; } case NOE: break; // FREYA: todo case HIDDEN_PLACE: break; // FREYA: todo case ALL: { if (object.isCharacter()) return true; break; } case WYVERN_OBJECT: break; // FREYA: todo case CLAN: // npc clan scope { if (caster.isNpc() && object.isNpc()) { if (((L2Npc) caster).getClan() == ((L2Npc) object).getClan()) return true; } break; } } return false; } private boolean checkPvpUsage(final L2PcInstance caster, final L2Object target, final L2Skill skill) { final boolean srcIsSummon = caster instanceof L2Summon; // Get pc target if current target is summon if (target instanceof L2Summon) target = target.getActingPlayer(); if (target != null && target != caster && target instanceof L2PcInstance && !(caster.isInDuel() && ((L2PcInstance) target).getDuelId() == caster.getDuelId()) && !caster.isInsideZone(L2PcInstance.ZONE_PVP) && !((L2PcInstance) target).isInsideZone(L2PcInstance.ZONE_PVP)) { SkillDat skilldat = caster.getCurrentSkill(); SkillDat skilldatpet = caster.getCurrentPetSkill(); if (skill.isPvpSkill()) { if (caster.getClan() != null && ((L2PcInstance) target).getClan() != null) { if (caster.getClan().isAtWarWith(((L2PcInstance) target).getClan().getClanId()) && ((L2PcInstance) target).getClan().isAtWarWith(caster.getClan().getClanId())) return true; } if (((L2PcInstance) target).getPvpFlag() == 0 && ((L2PcInstance) target).getKarma() == 0) return false; } else if ((skilldat != null && !skilldat.isCtrlPressed() && skill.isOffensive() && !srcIsSummon) || (skilldatpet != null && !skilldatpet.isCtrlPressed() && skill.isOffensive() && srcIsSummon)) { if (caster.getClan() != null && ((L2PcInstance) target).getClan() != null) { if (caster.getClan().isAtWarWith(((L2PcInstance) target).getClan().getClanId()) && ((L2PcInstance) target).getClan().isAtWarWith(caster.getClan().getClanId())) return true; } if (((L2PcInstance) target).getPvpFlag() == 0 && ((L2PcInstance) target).getKarma() == 0) return false; } } return true; } /** Affect scope: SINGLE */ private static final void getSingleScope(final GArray<L2Object> targetList, final L2Character caster, final L2Skill skill) { targetList.add(getTargetByType(skill, caster)); } /** Affect scope: POINT_BLANK */ private static final void getPointBlankScope(final GArray<L2Object> targetList, final L2Character caster, final L2Skill skill) { final L2Object _startingTarget = getTargetByType(skill, caster); if (_startingTarget == null) return; final Collection<L2Character> objs = caster.getKnownList().getKnownCharacters(skill.getAffectRange()); for (L2Character obj : objs) { if (checkAffectObject(skill, caster, obj)) targetList.add(obj); } } /** Affect scope: RANGE */ private static final void getRangeScope(final GArray<L2Object> targetList, final L2Character caster, final L2Skill skill) { final L2Object _startingTarget = getTargetByType(skill, caster); if (_startingTarget == null || !(_startingTarget instanceof L2Character)) return; final Collection<L2Character> objs = ((L2Character) _startingTarget).getKnownList().getKnownCharacters(skill.getAffectRange()); for (L2Character obj : objs) { if (checkAffectObject(skill, caster, obj)) targetList.add(obj); } } /** Affect scope: PARTY */ private static final void getPartyScope(final GArray<L2Object> targetList, final L2Character caster, final L2Skill skill) { final L2Object _startingTarget = getTargetByType(skill, caster); if (_startingTarget == null || !(_startingTarget instanceof L2Character)) return; if (caster.isPlayer() && caster.getParty() != null) { for (L2PcInstance trg : caster.getParty().getPartyMembers()) { if (Util.checkIfInRange(skill.getAffectRange(), caster, trg, true) && checkAffectObject(skill, caster, trg)) targetList.add(trg); } } else targetList.add(caster); } /** Affect scope: PLEDGE / DEAD_PLEDGE */ private static final void getPledgeScope(final GArray<L2Object> targetList, final L2Character caster, final L2Skill skill, final boolean dead) { final L2Object _startingTarget = getTargetByType(skill, caster); if (_startingTarget == null || !(_startingTarget instanceof L2Character)) return; if (caster.isPlayer() && ((L2PcInstance) caster).getClan() != null) { for (L2ClanMember trg : ((L2PcInstance) caster).getClan().getMembers()) { if (trg.getPlayerInstance().isDead() && !dead) continue; if (Util.checkIfInRange(skill.getAffectRange(), caster, trg.getPlayerInstance(), true) && checkAffectObject(skill, caster, trg.getPlayerInstance())) targetList.add(trg.getPlayerInstance()); } } else targetList.add(caster); } /** Affect scope: PARTY_PLEDGE */ private static final void getPartyPledgeScope(final GArray<L2Object> targetList, final L2Character caster, final L2Skill skill) { final L2Object _startingTarget = getTargetByType(skill, caster); if (_startingTarget == null || !(_startingTarget instanceof L2Character)) return; if (caster.isPlayer()) { final boolean hasClan = ((L2PcInstance) caster).getClan() != null; final boolean hasParty = caster.isInParty(); if (!hasClan || !hasParty) targetList.add(caster); else { if (hasClan) { for (L2ClanMember trg : ((L2PcInstance) caster).getClan().getMembers()) { if (trg.getPlayerInstance().isDead()) continue; if (Util.checkIfInRange(skill.getAffectRange(), caster, trg.getPlayerInstance(), true) && checkAffectObject(skill, caster, trg.getPlayerInstance())) targetList.add(trg.getPlayerInstance()); } } if (hasParty) { for (L2PcInstance trg : caster.getParty().getPartyMembers()) { if (trg.isDead()) continue; if (Util.checkIfInRange(skill.getAffectRange(), caster, trg, true) && checkAffectObject(skill, caster, trg)) targetList.add(trg); } } } } else targetList.add(caster); } /** Affect scope: FAN */ private static final void getFanScope(final GArray<L2Object> targetList, final L2Character caster, final L2Skill skill) { final L2Object _startingTarget = getTargetByType(skill, caster); if (_startingTarget == null) return; final int[] _fanRange = skill.getFanRange(); if (_fanRange == null) return; final Collection<L2Character> objs = caster.getKnownList().getKnownCharacters(_fanRange[1]); for (L2Character obj : objs) { if (checkAffectObject(skill, caster, obj)) continue; if (!Util.isOnAngle((L2Character) _startingTarget, obj, _fanRange[2], _fanRange[3])) targetList.add(obj); } }}