Skip to content
Snippets Groups Projects
Commit 8c011d6a authored by Zoey76's avatar Zoey76
Browse files

Area Friendly target handler update

Static comparator to prevent initialization on each call.
List is created after single-target checks are performed.
Using LinkedList instead ArrayList due resize overhead.
Adding target only if it's not null.
Sorting the list of creatures after it's complete, not after adding the
target (that wouldn't have an effect on the list since it has a single
element).
Performing maximum target check first.
Skipping hidden creatures.
Skipping, when in siege, creatures that are not in the same siege side.
parent 3d4b1629
No related branches found
No related tags found
No related merge requests found
...@@ -18,10 +18,9 @@ ...@@ -18,10 +18,9 @@
*/ */
package handlers.targethandlers; package handlers.targethandlers;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import com.l2jserver.gameserver.GeoData; import com.l2jserver.gameserver.GeoData;
...@@ -37,14 +36,15 @@ import com.l2jserver.gameserver.network.SystemMessageId; ...@@ -37,14 +36,15 @@ import com.l2jserver.gameserver.network.SystemMessageId;
/** /**
* Area Friendly target handler implementation. * Area Friendly target handler implementation.
* @author Adry_85 * @author Adry_85, Zoey76
*/ */
public class AreaFriendly implements ITargetTypeHandler public class AreaFriendly implements ITargetTypeHandler
{ {
private static final CharComparator CHAR_COMPARATOR = new CharComparator();
@Override @Override
public L2Object[] getTargetList(Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) public L2Object[] getTargetList(Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target)
{ {
List<L2Character> targetList = new ArrayList<>();
L2PcInstance player = activeChar.getActingPlayer(); L2PcInstance player = activeChar.getActingPlayer();
if (!checkTarget(player, target) && (skill.getCastRange() >= 0)) if (!checkTarget(player, target) && (skill.getCastRange() >= 0))
...@@ -68,30 +68,31 @@ public class AreaFriendly implements ITargetTypeHandler ...@@ -68,30 +68,31 @@ public class AreaFriendly implements ITargetTypeHandler
player player
}; };
} }
targetList.add(target); // Add target to target list
final List<L2Character> targetList = new LinkedList<>();
if (target != null) if (target != null)
{ {
int maxTargets = skill.getAffectLimit(); // Add target to target list.
final Collection<L2Character> objs = target.getKnownList().getKnownCharactersInRadius(skill.getAffectRange()); targetList.add(target);
// TODO: Chain Heal - The recovery amount decreases starting from the most injured person.
Collections.sort(targetList, new CharComparator());
for (L2Character obj : objs) final int maxTargets = skill.getAffectLimit();
for (L2Character obj : target.getKnownList().getKnownCharactersInRadius(skill.getAffectRange()))
{ {
if (!checkTarget(player, obj) || (obj == activeChar)) if ((maxTargets > 0) && (targetList.size() >= maxTargets))
{ {
continue; break;
} }
if ((maxTargets > 0) && (targetList.size() >= maxTargets)) if (!checkTarget(player, obj) || (obj == activeChar))
{ {
break; continue;
} }
targetList.add(obj); targetList.add(obj);
} }
// Sort creatures, the most injured first.
Collections.sort(targetList, CHAR_COMPARATOR);
} }
if (targetList.isEmpty()) if (targetList.isEmpty())
...@@ -108,7 +109,13 @@ public class AreaFriendly implements ITargetTypeHandler ...@@ -108,7 +109,13 @@ public class AreaFriendly implements ITargetTypeHandler
return false; return false;
} }
if ((target == null) || target.isAlikeDead() || target.isDoor() || !activeChar.isOnSameSiegeSideWith(target) || (target instanceof L2SiegeFlagInstance) || target.isMonster()) if ((target == null) || target.isAlikeDead() || target.isDoor() || (target instanceof L2SiegeFlagInstance) || target.isMonster())
{
return false;
}
// GMs and hidden creatures.
if (target.isInvisible())
{ {
return false; return false;
} }
...@@ -137,6 +144,12 @@ public class AreaFriendly implements ITargetTypeHandler ...@@ -137,6 +144,12 @@ public class AreaFriendly implements ITargetTypeHandler
return true; return true;
} }
// Only siege allies.
if (activeChar.isInSiege() && !activeChar.isOnSameSiegeSideWith(targetPlayer))
{
return false;
}
if (target.isInsideZone(ZoneId.PVP)) if (target.isInsideZone(ZoneId.PVP))
{ {
return false; return false;
...@@ -155,7 +168,7 @@ public class AreaFriendly implements ITargetTypeHandler ...@@ -155,7 +168,7 @@ public class AreaFriendly implements ITargetTypeHandler
return true; return true;
} }
public class CharComparator implements Comparator<L2Character> public static class CharComparator implements Comparator<L2Character>
{ {
@Override @Override
public int compare(L2Character char1, L2Character char2) public int compare(L2Character char1, L2Character char2)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment