All pastes #2063603 Raw Edit

Unnamed

public java v1 · immutable
#2063603 ·published 2011-05-18 15:09 UTC
rendered paste body
package 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);		}	}}