Sync with L2jServer HighFive Mar 3rd 2016.
This commit is contained in:
@@ -16,10 +16,9 @@
|
||||
*/
|
||||
package handlers.targethandlers;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import com.l2jmobius.gameserver.GeoData;
|
||||
@@ -34,17 +33,19 @@ import com.l2jmobius.gameserver.model.zone.ZoneId;
|
||||
import com.l2jmobius.gameserver.network.SystemMessageId;
|
||||
|
||||
/**
|
||||
* @author Adry_85
|
||||
* Area Friendly target handler implementation.
|
||||
* @author Adry_85, Zoey76
|
||||
*/
|
||||
public class AreaFriendly implements ITargetTypeHandler
|
||||
{
|
||||
private static final CharComparator CHAR_COMPARATOR = new CharComparator();
|
||||
|
||||
@Override
|
||||
public L2Object[] getTargetList(Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target)
|
||||
{
|
||||
final List<L2Character> targetList = new ArrayList<>();
|
||||
final L2PcInstance player = activeChar.getActingPlayer();
|
||||
|
||||
if ((target == null) || (!checkTarget(player, target) && (skill.getCastRange() >= 0)))
|
||||
if (!checkTarget(player, target) && (skill.getCastRange() >= 0))
|
||||
{
|
||||
player.sendPacket(SystemMessageId.THAT_IS_AN_INCORRECT_TARGET);
|
||||
return EMPTY_TARGET_LIST;
|
||||
@@ -65,27 +66,31 @@ public class AreaFriendly implements ITargetTypeHandler
|
||||
player
|
||||
};
|
||||
}
|
||||
targetList.add(target); // Add target to target list
|
||||
|
||||
final int maxTargets = skill.getAffectLimit();
|
||||
final Collection<L2Character> objs = target.getKnownList().getKnownCharactersInRadius(skill.getAffectRange());
|
||||
|
||||
// TODO: Chain Heal - The recovery amount decreases starting from the most injured person.
|
||||
Collections.sort(targetList, new CharComparator());
|
||||
|
||||
for (L2Character obj : objs)
|
||||
final List<L2Character> targetList = new LinkedList<>();
|
||||
if (target != null)
|
||||
{
|
||||
if (!checkTarget(player, obj) || (obj == activeChar))
|
||||
// Add target to target list.
|
||||
targetList.add(target);
|
||||
|
||||
final int maxTargets = skill.getAffectLimit();
|
||||
for (L2Character obj : target.getKnownList().getKnownCharactersInRadius(skill.getAffectRange()))
|
||||
{
|
||||
continue;
|
||||
if ((maxTargets > 0) && (targetList.size() >= maxTargets))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if (!checkTarget(player, obj) || (obj == activeChar))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
targetList.add(obj);
|
||||
}
|
||||
|
||||
if ((maxTargets > 0) && (targetList.size() >= maxTargets))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
targetList.add(obj);
|
||||
// Sort creatures, the most injured first.
|
||||
Collections.sort(targetList, CHAR_COMPARATOR);
|
||||
}
|
||||
|
||||
if (targetList.isEmpty())
|
||||
@@ -107,9 +112,15 @@ public class AreaFriendly implements ITargetTypeHandler
|
||||
return false;
|
||||
}
|
||||
|
||||
// GMs and hidden creatures.
|
||||
if (target.isInvisible())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (target.isPlayable())
|
||||
{
|
||||
final L2PcInstance targetPlayer = target.getActingPlayer();
|
||||
L2PcInstance targetPlayer = target.getActingPlayer();
|
||||
|
||||
if (activeChar == targetPlayer)
|
||||
{
|
||||
@@ -131,6 +142,12 @@ public class AreaFriendly implements ITargetTypeHandler
|
||||
return true;
|
||||
}
|
||||
|
||||
// Only siege allies.
|
||||
if (activeChar.isInSiege() && !activeChar.isOnSameSiegeSideWith(targetPlayer))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (target.isInsideZone(ZoneId.PVP))
|
||||
{
|
||||
return false;
|
||||
@@ -149,7 +166,7 @@ public class AreaFriendly implements ITargetTypeHandler
|
||||
return true;
|
||||
}
|
||||
|
||||
class CharComparator implements Comparator<L2Character>
|
||||
static class CharComparator implements Comparator<L2Character>
|
||||
{
|
||||
@Override
|
||||
public int compare(L2Character char1, L2Character char2)
|
||||
|
@@ -25,6 +25,7 @@ import com.l2jmobius.gameserver.model.skills.targets.L2TargetType;
|
||||
import com.l2jmobius.gameserver.model.zone.ZoneId;
|
||||
|
||||
/**
|
||||
* Enemy Summon target handler implementation.
|
||||
* @author UnAfraid
|
||||
*/
|
||||
public class EnemySummon implements ITargetTypeHandler
|
||||
@@ -32,7 +33,7 @@ public class EnemySummon implements ITargetTypeHandler
|
||||
@Override
|
||||
public L2Object[] getTargetList(Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target)
|
||||
{
|
||||
if (target.isSummon())
|
||||
if ((target != null) && target.isSummon())
|
||||
{
|
||||
final L2Summon targetSummon = (L2Summon) target;
|
||||
if ((activeChar.isPlayer() && (activeChar.getPet() != targetSummon) && activeChar.hasServitor(targetSummon.getObjectId()) && !targetSummon.isDead() && ((targetSummon.getOwner().getPvpFlag() != 0) || (targetSummon.getOwner().getReputation() < 0))) || (targetSummon.getOwner().isInsideZone(ZoneId.PVP) && activeChar.getActingPlayer().isInsideZone(ZoneId.PVP)) || (targetSummon.getOwner().isInDuel() && activeChar.getActingPlayer().isInDuel() && (targetSummon.getOwner().getDuelId() == activeChar.getActingPlayer().getDuelId())))
|
||||
|
Reference in New Issue
Block a user