diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/ai/AttackableAI.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/ai/AttackableAI.java index a6710909d3..48ba8de11a 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/ai/AttackableAI.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/ai/AttackableAI.java @@ -21,11 +21,10 @@ import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK; import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; import java.lang.ref.WeakReference; -import java.util.Comparator; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.logging.Logger; -import java.util.stream.Stream; import org.l2jmobius.Config; import org.l2jmobius.commons.util.Rnd; @@ -1131,35 +1130,64 @@ public class AttackableAI extends CreatureAI // Check current target first. final int range = insideCastRange ? skill.getCastRange() + getActiveChar().getTemplate().getCollisionRadius() : 2000; // TODO need some forget range - Stream stream; + + final List result = new ArrayList<>(); if (isBad) { - //@formatter:off - stream = npc.getAggroList().values().stream() - .map(AggroInfo::getAttacker) - .filter(c -> checkSkillTarget(skill, c)) - .sorted(Comparator.comparingInt(npc::getHating).reversed()); - //@formatter:on + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkSkillTarget(skill, aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } } else { - stream = World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range, c -> checkSkillTarget(skill, c)).stream(); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range)) + { + if (checkSkillTarget(skill, creature)) + { + result.add(creature); + } + } // Maybe add self to the list of targets since getVisibleObjects doesn't return yourself. if (checkSkillTarget(skill, npc)) { - stream = Stream.concat(stream, Stream.of(npc)); + result.add(npc); } // For heal skills sort by hp missing. if (skill.hasEffectType(EffectType.HEAL)) { - stream = stream.sorted(Comparator.comparingInt(Creature::getCurrentHpPercent)); + int searchValue = Integer.MAX_VALUE; + Creature creature = null; + + for (Creature c : result) + { + final int hpPer = c.getCurrentHpPercent(); + if (hpPer < searchValue) + { + searchValue = hpPer; + creature = c; + } + } + + if (creature != null) + { + return creature; + } } } // Return any target. - return stream.findFirst().orElse(null); + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); + } + + return null; } private Creature targetReconsider(boolean randomTarget) @@ -1167,24 +1195,57 @@ public class AttackableAI extends CreatureAI final Attackable npc = getActiveChar(); if (randomTarget) { - Stream stream = npc.getAggroList().values().stream().map(AggroInfo::getAttacker).filter(this::checkTarget); + final List result = new ArrayList<>(); + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkTarget(aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } - // If npc is aggressive, add characters within aggro range too + // If npc is aggressive, add characters within aggro range too. if (npc.isAggressive()) { - stream = Stream.concat(stream, World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream()); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(creature)) + { + result.add(creature); + } + } + } + + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); } - return stream.findAny().orElse(null); } - //@formatter:off - return npc.getAggroList().values().stream() - .filter(a -> checkTarget(a.getAttacker())) - .sorted(Comparator.comparingInt(AggroInfo::getHate)) - .map(AggroInfo::getAttacker) - .findFirst() - .orElse(npc.isAggressive() ? World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream().findAny().orElse(null) : null); - //@formatter:on + int searchValue = Integer.MIN_VALUE; + Creature creature = null; + for (AggroInfo aggro : npc.getAggroList().values()) + { + searchValue = aggro.getHate(); + if (checkTarget(aggro.getAttacker()) && (aggro.getHate() > searchValue)) + { + searchValue = aggro.getHate(); + creature = aggro.getAttacker(); + } + } + + if ((creature == null) && npc.isAggressive()) + { + for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(nearby)) + { + return nearby; + } + } + } + + return null; } /** diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/ai/AttackableAI.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/ai/AttackableAI.java index a6710909d3..48ba8de11a 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/ai/AttackableAI.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/ai/AttackableAI.java @@ -21,11 +21,10 @@ import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK; import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; import java.lang.ref.WeakReference; -import java.util.Comparator; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.logging.Logger; -import java.util.stream.Stream; import org.l2jmobius.Config; import org.l2jmobius.commons.util.Rnd; @@ -1131,35 +1130,64 @@ public class AttackableAI extends CreatureAI // Check current target first. final int range = insideCastRange ? skill.getCastRange() + getActiveChar().getTemplate().getCollisionRadius() : 2000; // TODO need some forget range - Stream stream; + + final List result = new ArrayList<>(); if (isBad) { - //@formatter:off - stream = npc.getAggroList().values().stream() - .map(AggroInfo::getAttacker) - .filter(c -> checkSkillTarget(skill, c)) - .sorted(Comparator.comparingInt(npc::getHating).reversed()); - //@formatter:on + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkSkillTarget(skill, aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } } else { - stream = World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range, c -> checkSkillTarget(skill, c)).stream(); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range)) + { + if (checkSkillTarget(skill, creature)) + { + result.add(creature); + } + } // Maybe add self to the list of targets since getVisibleObjects doesn't return yourself. if (checkSkillTarget(skill, npc)) { - stream = Stream.concat(stream, Stream.of(npc)); + result.add(npc); } // For heal skills sort by hp missing. if (skill.hasEffectType(EffectType.HEAL)) { - stream = stream.sorted(Comparator.comparingInt(Creature::getCurrentHpPercent)); + int searchValue = Integer.MAX_VALUE; + Creature creature = null; + + for (Creature c : result) + { + final int hpPer = c.getCurrentHpPercent(); + if (hpPer < searchValue) + { + searchValue = hpPer; + creature = c; + } + } + + if (creature != null) + { + return creature; + } } } // Return any target. - return stream.findFirst().orElse(null); + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); + } + + return null; } private Creature targetReconsider(boolean randomTarget) @@ -1167,24 +1195,57 @@ public class AttackableAI extends CreatureAI final Attackable npc = getActiveChar(); if (randomTarget) { - Stream stream = npc.getAggroList().values().stream().map(AggroInfo::getAttacker).filter(this::checkTarget); + final List result = new ArrayList<>(); + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkTarget(aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } - // If npc is aggressive, add characters within aggro range too + // If npc is aggressive, add characters within aggro range too. if (npc.isAggressive()) { - stream = Stream.concat(stream, World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream()); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(creature)) + { + result.add(creature); + } + } + } + + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); } - return stream.findAny().orElse(null); } - //@formatter:off - return npc.getAggroList().values().stream() - .filter(a -> checkTarget(a.getAttacker())) - .sorted(Comparator.comparingInt(AggroInfo::getHate)) - .map(AggroInfo::getAttacker) - .findFirst() - .orElse(npc.isAggressive() ? World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream().findAny().orElse(null) : null); - //@formatter:on + int searchValue = Integer.MIN_VALUE; + Creature creature = null; + for (AggroInfo aggro : npc.getAggroList().values()) + { + searchValue = aggro.getHate(); + if (checkTarget(aggro.getAttacker()) && (aggro.getHate() > searchValue)) + { + searchValue = aggro.getHate(); + creature = aggro.getAttacker(); + } + } + + if ((creature == null) && npc.isAggressive()) + { + for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(nearby)) + { + return nearby; + } + } + } + + return null; } /** diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/ai/AttackableAI.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/ai/AttackableAI.java index a6710909d3..48ba8de11a 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/ai/AttackableAI.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/ai/AttackableAI.java @@ -21,11 +21,10 @@ import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK; import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; import java.lang.ref.WeakReference; -import java.util.Comparator; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.logging.Logger; -import java.util.stream.Stream; import org.l2jmobius.Config; import org.l2jmobius.commons.util.Rnd; @@ -1131,35 +1130,64 @@ public class AttackableAI extends CreatureAI // Check current target first. final int range = insideCastRange ? skill.getCastRange() + getActiveChar().getTemplate().getCollisionRadius() : 2000; // TODO need some forget range - Stream stream; + + final List result = new ArrayList<>(); if (isBad) { - //@formatter:off - stream = npc.getAggroList().values().stream() - .map(AggroInfo::getAttacker) - .filter(c -> checkSkillTarget(skill, c)) - .sorted(Comparator.comparingInt(npc::getHating).reversed()); - //@formatter:on + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkSkillTarget(skill, aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } } else { - stream = World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range, c -> checkSkillTarget(skill, c)).stream(); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range)) + { + if (checkSkillTarget(skill, creature)) + { + result.add(creature); + } + } // Maybe add self to the list of targets since getVisibleObjects doesn't return yourself. if (checkSkillTarget(skill, npc)) { - stream = Stream.concat(stream, Stream.of(npc)); + result.add(npc); } // For heal skills sort by hp missing. if (skill.hasEffectType(EffectType.HEAL)) { - stream = stream.sorted(Comparator.comparingInt(Creature::getCurrentHpPercent)); + int searchValue = Integer.MAX_VALUE; + Creature creature = null; + + for (Creature c : result) + { + final int hpPer = c.getCurrentHpPercent(); + if (hpPer < searchValue) + { + searchValue = hpPer; + creature = c; + } + } + + if (creature != null) + { + return creature; + } } } // Return any target. - return stream.findFirst().orElse(null); + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); + } + + return null; } private Creature targetReconsider(boolean randomTarget) @@ -1167,24 +1195,57 @@ public class AttackableAI extends CreatureAI final Attackable npc = getActiveChar(); if (randomTarget) { - Stream stream = npc.getAggroList().values().stream().map(AggroInfo::getAttacker).filter(this::checkTarget); + final List result = new ArrayList<>(); + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkTarget(aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } - // If npc is aggressive, add characters within aggro range too + // If npc is aggressive, add characters within aggro range too. if (npc.isAggressive()) { - stream = Stream.concat(stream, World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream()); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(creature)) + { + result.add(creature); + } + } + } + + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); } - return stream.findAny().orElse(null); } - //@formatter:off - return npc.getAggroList().values().stream() - .filter(a -> checkTarget(a.getAttacker())) - .sorted(Comparator.comparingInt(AggroInfo::getHate)) - .map(AggroInfo::getAttacker) - .findFirst() - .orElse(npc.isAggressive() ? World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream().findAny().orElse(null) : null); - //@formatter:on + int searchValue = Integer.MIN_VALUE; + Creature creature = null; + for (AggroInfo aggro : npc.getAggroList().values()) + { + searchValue = aggro.getHate(); + if (checkTarget(aggro.getAttacker()) && (aggro.getHate() > searchValue)) + { + searchValue = aggro.getHate(); + creature = aggro.getAttacker(); + } + } + + if ((creature == null) && npc.isAggressive()) + { + for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(nearby)) + { + return nearby; + } + } + } + + return null; } /** diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/ai/AttackableAI.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/ai/AttackableAI.java index a6710909d3..48ba8de11a 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/ai/AttackableAI.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/ai/AttackableAI.java @@ -21,11 +21,10 @@ import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK; import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; import java.lang.ref.WeakReference; -import java.util.Comparator; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.logging.Logger; -import java.util.stream.Stream; import org.l2jmobius.Config; import org.l2jmobius.commons.util.Rnd; @@ -1131,35 +1130,64 @@ public class AttackableAI extends CreatureAI // Check current target first. final int range = insideCastRange ? skill.getCastRange() + getActiveChar().getTemplate().getCollisionRadius() : 2000; // TODO need some forget range - Stream stream; + + final List result = new ArrayList<>(); if (isBad) { - //@formatter:off - stream = npc.getAggroList().values().stream() - .map(AggroInfo::getAttacker) - .filter(c -> checkSkillTarget(skill, c)) - .sorted(Comparator.comparingInt(npc::getHating).reversed()); - //@formatter:on + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkSkillTarget(skill, aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } } else { - stream = World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range, c -> checkSkillTarget(skill, c)).stream(); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range)) + { + if (checkSkillTarget(skill, creature)) + { + result.add(creature); + } + } // Maybe add self to the list of targets since getVisibleObjects doesn't return yourself. if (checkSkillTarget(skill, npc)) { - stream = Stream.concat(stream, Stream.of(npc)); + result.add(npc); } // For heal skills sort by hp missing. if (skill.hasEffectType(EffectType.HEAL)) { - stream = stream.sorted(Comparator.comparingInt(Creature::getCurrentHpPercent)); + int searchValue = Integer.MAX_VALUE; + Creature creature = null; + + for (Creature c : result) + { + final int hpPer = c.getCurrentHpPercent(); + if (hpPer < searchValue) + { + searchValue = hpPer; + creature = c; + } + } + + if (creature != null) + { + return creature; + } } } // Return any target. - return stream.findFirst().orElse(null); + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); + } + + return null; } private Creature targetReconsider(boolean randomTarget) @@ -1167,24 +1195,57 @@ public class AttackableAI extends CreatureAI final Attackable npc = getActiveChar(); if (randomTarget) { - Stream stream = npc.getAggroList().values().stream().map(AggroInfo::getAttacker).filter(this::checkTarget); + final List result = new ArrayList<>(); + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkTarget(aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } - // If npc is aggressive, add characters within aggro range too + // If npc is aggressive, add characters within aggro range too. if (npc.isAggressive()) { - stream = Stream.concat(stream, World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream()); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(creature)) + { + result.add(creature); + } + } + } + + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); } - return stream.findAny().orElse(null); } - //@formatter:off - return npc.getAggroList().values().stream() - .filter(a -> checkTarget(a.getAttacker())) - .sorted(Comparator.comparingInt(AggroInfo::getHate)) - .map(AggroInfo::getAttacker) - .findFirst() - .orElse(npc.isAggressive() ? World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream().findAny().orElse(null) : null); - //@formatter:on + int searchValue = Integer.MIN_VALUE; + Creature creature = null; + for (AggroInfo aggro : npc.getAggroList().values()) + { + searchValue = aggro.getHate(); + if (checkTarget(aggro.getAttacker()) && (aggro.getHate() > searchValue)) + { + searchValue = aggro.getHate(); + creature = aggro.getAttacker(); + } + } + + if ((creature == null) && npc.isAggressive()) + { + for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(nearby)) + { + return nearby; + } + } + } + + return null; } /** diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/ai/AttackableAI.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/ai/AttackableAI.java index a6710909d3..48ba8de11a 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/ai/AttackableAI.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/ai/AttackableAI.java @@ -21,11 +21,10 @@ import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK; import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; import java.lang.ref.WeakReference; -import java.util.Comparator; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.logging.Logger; -import java.util.stream.Stream; import org.l2jmobius.Config; import org.l2jmobius.commons.util.Rnd; @@ -1131,35 +1130,64 @@ public class AttackableAI extends CreatureAI // Check current target first. final int range = insideCastRange ? skill.getCastRange() + getActiveChar().getTemplate().getCollisionRadius() : 2000; // TODO need some forget range - Stream stream; + + final List result = new ArrayList<>(); if (isBad) { - //@formatter:off - stream = npc.getAggroList().values().stream() - .map(AggroInfo::getAttacker) - .filter(c -> checkSkillTarget(skill, c)) - .sorted(Comparator.comparingInt(npc::getHating).reversed()); - //@formatter:on + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkSkillTarget(skill, aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } } else { - stream = World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range, c -> checkSkillTarget(skill, c)).stream(); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range)) + { + if (checkSkillTarget(skill, creature)) + { + result.add(creature); + } + } // Maybe add self to the list of targets since getVisibleObjects doesn't return yourself. if (checkSkillTarget(skill, npc)) { - stream = Stream.concat(stream, Stream.of(npc)); + result.add(npc); } // For heal skills sort by hp missing. if (skill.hasEffectType(EffectType.HEAL)) { - stream = stream.sorted(Comparator.comparingInt(Creature::getCurrentHpPercent)); + int searchValue = Integer.MAX_VALUE; + Creature creature = null; + + for (Creature c : result) + { + final int hpPer = c.getCurrentHpPercent(); + if (hpPer < searchValue) + { + searchValue = hpPer; + creature = c; + } + } + + if (creature != null) + { + return creature; + } } } // Return any target. - return stream.findFirst().orElse(null); + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); + } + + return null; } private Creature targetReconsider(boolean randomTarget) @@ -1167,24 +1195,57 @@ public class AttackableAI extends CreatureAI final Attackable npc = getActiveChar(); if (randomTarget) { - Stream stream = npc.getAggroList().values().stream().map(AggroInfo::getAttacker).filter(this::checkTarget); + final List result = new ArrayList<>(); + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkTarget(aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } - // If npc is aggressive, add characters within aggro range too + // If npc is aggressive, add characters within aggro range too. if (npc.isAggressive()) { - stream = Stream.concat(stream, World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream()); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(creature)) + { + result.add(creature); + } + } + } + + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); } - return stream.findAny().orElse(null); } - //@formatter:off - return npc.getAggroList().values().stream() - .filter(a -> checkTarget(a.getAttacker())) - .sorted(Comparator.comparingInt(AggroInfo::getHate)) - .map(AggroInfo::getAttacker) - .findFirst() - .orElse(npc.isAggressive() ? World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream().findAny().orElse(null) : null); - //@formatter:on + int searchValue = Integer.MIN_VALUE; + Creature creature = null; + for (AggroInfo aggro : npc.getAggroList().values()) + { + searchValue = aggro.getHate(); + if (checkTarget(aggro.getAttacker()) && (aggro.getHate() > searchValue)) + { + searchValue = aggro.getHate(); + creature = aggro.getAttacker(); + } + } + + if ((creature == null) && npc.isAggressive()) + { + for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(nearby)) + { + return nearby; + } + } + } + + return null; } /** diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/ai/AttackableAI.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/ai/AttackableAI.java index a6710909d3..48ba8de11a 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/ai/AttackableAI.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/ai/AttackableAI.java @@ -21,11 +21,10 @@ import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK; import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; import java.lang.ref.WeakReference; -import java.util.Comparator; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.logging.Logger; -import java.util.stream.Stream; import org.l2jmobius.Config; import org.l2jmobius.commons.util.Rnd; @@ -1131,35 +1130,64 @@ public class AttackableAI extends CreatureAI // Check current target first. final int range = insideCastRange ? skill.getCastRange() + getActiveChar().getTemplate().getCollisionRadius() : 2000; // TODO need some forget range - Stream stream; + + final List result = new ArrayList<>(); if (isBad) { - //@formatter:off - stream = npc.getAggroList().values().stream() - .map(AggroInfo::getAttacker) - .filter(c -> checkSkillTarget(skill, c)) - .sorted(Comparator.comparingInt(npc::getHating).reversed()); - //@formatter:on + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkSkillTarget(skill, aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } } else { - stream = World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range, c -> checkSkillTarget(skill, c)).stream(); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range)) + { + if (checkSkillTarget(skill, creature)) + { + result.add(creature); + } + } // Maybe add self to the list of targets since getVisibleObjects doesn't return yourself. if (checkSkillTarget(skill, npc)) { - stream = Stream.concat(stream, Stream.of(npc)); + result.add(npc); } // For heal skills sort by hp missing. if (skill.hasEffectType(EffectType.HEAL)) { - stream = stream.sorted(Comparator.comparingInt(Creature::getCurrentHpPercent)); + int searchValue = Integer.MAX_VALUE; + Creature creature = null; + + for (Creature c : result) + { + final int hpPer = c.getCurrentHpPercent(); + if (hpPer < searchValue) + { + searchValue = hpPer; + creature = c; + } + } + + if (creature != null) + { + return creature; + } } } // Return any target. - return stream.findFirst().orElse(null); + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); + } + + return null; } private Creature targetReconsider(boolean randomTarget) @@ -1167,24 +1195,57 @@ public class AttackableAI extends CreatureAI final Attackable npc = getActiveChar(); if (randomTarget) { - Stream stream = npc.getAggroList().values().stream().map(AggroInfo::getAttacker).filter(this::checkTarget); + final List result = new ArrayList<>(); + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkTarget(aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } - // If npc is aggressive, add characters within aggro range too + // If npc is aggressive, add characters within aggro range too. if (npc.isAggressive()) { - stream = Stream.concat(stream, World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream()); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(creature)) + { + result.add(creature); + } + } + } + + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); } - return stream.findAny().orElse(null); } - //@formatter:off - return npc.getAggroList().values().stream() - .filter(a -> checkTarget(a.getAttacker())) - .sorted(Comparator.comparingInt(AggroInfo::getHate)) - .map(AggroInfo::getAttacker) - .findFirst() - .orElse(npc.isAggressive() ? World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream().findAny().orElse(null) : null); - //@formatter:on + int searchValue = Integer.MIN_VALUE; + Creature creature = null; + for (AggroInfo aggro : npc.getAggroList().values()) + { + searchValue = aggro.getHate(); + if (checkTarget(aggro.getAttacker()) && (aggro.getHate() > searchValue)) + { + searchValue = aggro.getHate(); + creature = aggro.getAttacker(); + } + } + + if ((creature == null) && npc.isAggressive()) + { + for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(nearby)) + { + return nearby; + } + } + } + + return null; } /** diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/ai/AttackableAI.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/ai/AttackableAI.java index a6710909d3..48ba8de11a 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/ai/AttackableAI.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/ai/AttackableAI.java @@ -21,11 +21,10 @@ import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK; import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; import java.lang.ref.WeakReference; -import java.util.Comparator; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.logging.Logger; -import java.util.stream.Stream; import org.l2jmobius.Config; import org.l2jmobius.commons.util.Rnd; @@ -1131,35 +1130,64 @@ public class AttackableAI extends CreatureAI // Check current target first. final int range = insideCastRange ? skill.getCastRange() + getActiveChar().getTemplate().getCollisionRadius() : 2000; // TODO need some forget range - Stream stream; + + final List result = new ArrayList<>(); if (isBad) { - //@formatter:off - stream = npc.getAggroList().values().stream() - .map(AggroInfo::getAttacker) - .filter(c -> checkSkillTarget(skill, c)) - .sorted(Comparator.comparingInt(npc::getHating).reversed()); - //@formatter:on + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkSkillTarget(skill, aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } } else { - stream = World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range, c -> checkSkillTarget(skill, c)).stream(); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range)) + { + if (checkSkillTarget(skill, creature)) + { + result.add(creature); + } + } // Maybe add self to the list of targets since getVisibleObjects doesn't return yourself. if (checkSkillTarget(skill, npc)) { - stream = Stream.concat(stream, Stream.of(npc)); + result.add(npc); } // For heal skills sort by hp missing. if (skill.hasEffectType(EffectType.HEAL)) { - stream = stream.sorted(Comparator.comparingInt(Creature::getCurrentHpPercent)); + int searchValue = Integer.MAX_VALUE; + Creature creature = null; + + for (Creature c : result) + { + final int hpPer = c.getCurrentHpPercent(); + if (hpPer < searchValue) + { + searchValue = hpPer; + creature = c; + } + } + + if (creature != null) + { + return creature; + } } } // Return any target. - return stream.findFirst().orElse(null); + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); + } + + return null; } private Creature targetReconsider(boolean randomTarget) @@ -1167,24 +1195,57 @@ public class AttackableAI extends CreatureAI final Attackable npc = getActiveChar(); if (randomTarget) { - Stream stream = npc.getAggroList().values().stream().map(AggroInfo::getAttacker).filter(this::checkTarget); + final List result = new ArrayList<>(); + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkTarget(aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } - // If npc is aggressive, add characters within aggro range too + // If npc is aggressive, add characters within aggro range too. if (npc.isAggressive()) { - stream = Stream.concat(stream, World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream()); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(creature)) + { + result.add(creature); + } + } + } + + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); } - return stream.findAny().orElse(null); } - //@formatter:off - return npc.getAggroList().values().stream() - .filter(a -> checkTarget(a.getAttacker())) - .sorted(Comparator.comparingInt(AggroInfo::getHate)) - .map(AggroInfo::getAttacker) - .findFirst() - .orElse(npc.isAggressive() ? World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream().findAny().orElse(null) : null); - //@formatter:on + int searchValue = Integer.MIN_VALUE; + Creature creature = null; + for (AggroInfo aggro : npc.getAggroList().values()) + { + searchValue = aggro.getHate(); + if (checkTarget(aggro.getAttacker()) && (aggro.getHate() > searchValue)) + { + searchValue = aggro.getHate(); + creature = aggro.getAttacker(); + } + } + + if ((creature == null) && npc.isAggressive()) + { + for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(nearby)) + { + return nearby; + } + } + } + + return null; } /** diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/ai/AttackableAI.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/ai/AttackableAI.java index a6710909d3..48ba8de11a 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/ai/AttackableAI.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/ai/AttackableAI.java @@ -21,11 +21,10 @@ import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK; import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; import java.lang.ref.WeakReference; -import java.util.Comparator; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.logging.Logger; -import java.util.stream.Stream; import org.l2jmobius.Config; import org.l2jmobius.commons.util.Rnd; @@ -1131,35 +1130,64 @@ public class AttackableAI extends CreatureAI // Check current target first. final int range = insideCastRange ? skill.getCastRange() + getActiveChar().getTemplate().getCollisionRadius() : 2000; // TODO need some forget range - Stream stream; + + final List result = new ArrayList<>(); if (isBad) { - //@formatter:off - stream = npc.getAggroList().values().stream() - .map(AggroInfo::getAttacker) - .filter(c -> checkSkillTarget(skill, c)) - .sorted(Comparator.comparingInt(npc::getHating).reversed()); - //@formatter:on + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkSkillTarget(skill, aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } } else { - stream = World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range, c -> checkSkillTarget(skill, c)).stream(); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range)) + { + if (checkSkillTarget(skill, creature)) + { + result.add(creature); + } + } // Maybe add self to the list of targets since getVisibleObjects doesn't return yourself. if (checkSkillTarget(skill, npc)) { - stream = Stream.concat(stream, Stream.of(npc)); + result.add(npc); } // For heal skills sort by hp missing. if (skill.hasEffectType(EffectType.HEAL)) { - stream = stream.sorted(Comparator.comparingInt(Creature::getCurrentHpPercent)); + int searchValue = Integer.MAX_VALUE; + Creature creature = null; + + for (Creature c : result) + { + final int hpPer = c.getCurrentHpPercent(); + if (hpPer < searchValue) + { + searchValue = hpPer; + creature = c; + } + } + + if (creature != null) + { + return creature; + } } } // Return any target. - return stream.findFirst().orElse(null); + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); + } + + return null; } private Creature targetReconsider(boolean randomTarget) @@ -1167,24 +1195,57 @@ public class AttackableAI extends CreatureAI final Attackable npc = getActiveChar(); if (randomTarget) { - Stream stream = npc.getAggroList().values().stream().map(AggroInfo::getAttacker).filter(this::checkTarget); + final List result = new ArrayList<>(); + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkTarget(aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } - // If npc is aggressive, add characters within aggro range too + // If npc is aggressive, add characters within aggro range too. if (npc.isAggressive()) { - stream = Stream.concat(stream, World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream()); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(creature)) + { + result.add(creature); + } + } + } + + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); } - return stream.findAny().orElse(null); } - //@formatter:off - return npc.getAggroList().values().stream() - .filter(a -> checkTarget(a.getAttacker())) - .sorted(Comparator.comparingInt(AggroInfo::getHate)) - .map(AggroInfo::getAttacker) - .findFirst() - .orElse(npc.isAggressive() ? World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream().findAny().orElse(null) : null); - //@formatter:on + int searchValue = Integer.MIN_VALUE; + Creature creature = null; + for (AggroInfo aggro : npc.getAggroList().values()) + { + searchValue = aggro.getHate(); + if (checkTarget(aggro.getAttacker()) && (aggro.getHate() > searchValue)) + { + searchValue = aggro.getHate(); + creature = aggro.getAttacker(); + } + } + + if ((creature == null) && npc.isAggressive()) + { + for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(nearby)) + { + return nearby; + } + } + } + + return null; } /** diff --git a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/ai/AttackableAI.java b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/ai/AttackableAI.java index a6710909d3..48ba8de11a 100644 --- a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/ai/AttackableAI.java +++ b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/ai/AttackableAI.java @@ -21,11 +21,10 @@ import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK; import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; import java.lang.ref.WeakReference; -import java.util.Comparator; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.logging.Logger; -import java.util.stream.Stream; import org.l2jmobius.Config; import org.l2jmobius.commons.util.Rnd; @@ -1131,35 +1130,64 @@ public class AttackableAI extends CreatureAI // Check current target first. final int range = insideCastRange ? skill.getCastRange() + getActiveChar().getTemplate().getCollisionRadius() : 2000; // TODO need some forget range - Stream stream; + + final List result = new ArrayList<>(); if (isBad) { - //@formatter:off - stream = npc.getAggroList().values().stream() - .map(AggroInfo::getAttacker) - .filter(c -> checkSkillTarget(skill, c)) - .sorted(Comparator.comparingInt(npc::getHating).reversed()); - //@formatter:on + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkSkillTarget(skill, aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } } else { - stream = World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range, c -> checkSkillTarget(skill, c)).stream(); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range)) + { + if (checkSkillTarget(skill, creature)) + { + result.add(creature); + } + } // Maybe add self to the list of targets since getVisibleObjects doesn't return yourself. if (checkSkillTarget(skill, npc)) { - stream = Stream.concat(stream, Stream.of(npc)); + result.add(npc); } // For heal skills sort by hp missing. if (skill.hasEffectType(EffectType.HEAL)) { - stream = stream.sorted(Comparator.comparingInt(Creature::getCurrentHpPercent)); + int searchValue = Integer.MAX_VALUE; + Creature creature = null; + + for (Creature c : result) + { + final int hpPer = c.getCurrentHpPercent(); + if (hpPer < searchValue) + { + searchValue = hpPer; + creature = c; + } + } + + if (creature != null) + { + return creature; + } } } // Return any target. - return stream.findFirst().orElse(null); + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); + } + + return null; } private Creature targetReconsider(boolean randomTarget) @@ -1167,24 +1195,57 @@ public class AttackableAI extends CreatureAI final Attackable npc = getActiveChar(); if (randomTarget) { - Stream stream = npc.getAggroList().values().stream().map(AggroInfo::getAttacker).filter(this::checkTarget); + final List result = new ArrayList<>(); + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkTarget(aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } - // If npc is aggressive, add characters within aggro range too + // If npc is aggressive, add characters within aggro range too. if (npc.isAggressive()) { - stream = Stream.concat(stream, World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream()); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(creature)) + { + result.add(creature); + } + } + } + + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); } - return stream.findAny().orElse(null); } - //@formatter:off - return npc.getAggroList().values().stream() - .filter(a -> checkTarget(a.getAttacker())) - .sorted(Comparator.comparingInt(AggroInfo::getHate)) - .map(AggroInfo::getAttacker) - .findFirst() - .orElse(npc.isAggressive() ? World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream().findAny().orElse(null) : null); - //@formatter:on + int searchValue = Integer.MIN_VALUE; + Creature creature = null; + for (AggroInfo aggro : npc.getAggroList().values()) + { + searchValue = aggro.getHate(); + if (checkTarget(aggro.getAttacker()) && (aggro.getHate() > searchValue)) + { + searchValue = aggro.getHate(); + creature = aggro.getAttacker(); + } + } + + if ((creature == null) && npc.isAggressive()) + { + for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(nearby)) + { + return nearby; + } + } + } + + return null; } /** diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/ai/AttackableAI.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/ai/AttackableAI.java index a6710909d3..48ba8de11a 100644 --- a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/ai/AttackableAI.java +++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/ai/AttackableAI.java @@ -21,11 +21,10 @@ import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK; import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; import java.lang.ref.WeakReference; -import java.util.Comparator; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.logging.Logger; -import java.util.stream.Stream; import org.l2jmobius.Config; import org.l2jmobius.commons.util.Rnd; @@ -1131,35 +1130,64 @@ public class AttackableAI extends CreatureAI // Check current target first. final int range = insideCastRange ? skill.getCastRange() + getActiveChar().getTemplate().getCollisionRadius() : 2000; // TODO need some forget range - Stream stream; + + final List result = new ArrayList<>(); if (isBad) { - //@formatter:off - stream = npc.getAggroList().values().stream() - .map(AggroInfo::getAttacker) - .filter(c -> checkSkillTarget(skill, c)) - .sorted(Comparator.comparingInt(npc::getHating).reversed()); - //@formatter:on + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkSkillTarget(skill, aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } } else { - stream = World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range, c -> checkSkillTarget(skill, c)).stream(); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range)) + { + if (checkSkillTarget(skill, creature)) + { + result.add(creature); + } + } // Maybe add self to the list of targets since getVisibleObjects doesn't return yourself. if (checkSkillTarget(skill, npc)) { - stream = Stream.concat(stream, Stream.of(npc)); + result.add(npc); } // For heal skills sort by hp missing. if (skill.hasEffectType(EffectType.HEAL)) { - stream = stream.sorted(Comparator.comparingInt(Creature::getCurrentHpPercent)); + int searchValue = Integer.MAX_VALUE; + Creature creature = null; + + for (Creature c : result) + { + final int hpPer = c.getCurrentHpPercent(); + if (hpPer < searchValue) + { + searchValue = hpPer; + creature = c; + } + } + + if (creature != null) + { + return creature; + } } } // Return any target. - return stream.findFirst().orElse(null); + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); + } + + return null; } private Creature targetReconsider(boolean randomTarget) @@ -1167,24 +1195,57 @@ public class AttackableAI extends CreatureAI final Attackable npc = getActiveChar(); if (randomTarget) { - Stream stream = npc.getAggroList().values().stream().map(AggroInfo::getAttacker).filter(this::checkTarget); + final List result = new ArrayList<>(); + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkTarget(aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } - // If npc is aggressive, add characters within aggro range too + // If npc is aggressive, add characters within aggro range too. if (npc.isAggressive()) { - stream = Stream.concat(stream, World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream()); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(creature)) + { + result.add(creature); + } + } + } + + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); } - return stream.findAny().orElse(null); } - //@formatter:off - return npc.getAggroList().values().stream() - .filter(a -> checkTarget(a.getAttacker())) - .sorted(Comparator.comparingInt(AggroInfo::getHate)) - .map(AggroInfo::getAttacker) - .findFirst() - .orElse(npc.isAggressive() ? World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream().findAny().orElse(null) : null); - //@formatter:on + int searchValue = Integer.MIN_VALUE; + Creature creature = null; + for (AggroInfo aggro : npc.getAggroList().values()) + { + searchValue = aggro.getHate(); + if (checkTarget(aggro.getAttacker()) && (aggro.getHate() > searchValue)) + { + searchValue = aggro.getHate(); + creature = aggro.getAttacker(); + } + } + + if ((creature == null) && npc.isAggressive()) + { + for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(nearby)) + { + return nearby; + } + } + } + + return null; } /** diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/ai/AttackableAI.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/ai/AttackableAI.java index a6710909d3..48ba8de11a 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/ai/AttackableAI.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/ai/AttackableAI.java @@ -21,11 +21,10 @@ import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK; import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; import java.lang.ref.WeakReference; -import java.util.Comparator; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.logging.Logger; -import java.util.stream.Stream; import org.l2jmobius.Config; import org.l2jmobius.commons.util.Rnd; @@ -1131,35 +1130,64 @@ public class AttackableAI extends CreatureAI // Check current target first. final int range = insideCastRange ? skill.getCastRange() + getActiveChar().getTemplate().getCollisionRadius() : 2000; // TODO need some forget range - Stream stream; + + final List result = new ArrayList<>(); if (isBad) { - //@formatter:off - stream = npc.getAggroList().values().stream() - .map(AggroInfo::getAttacker) - .filter(c -> checkSkillTarget(skill, c)) - .sorted(Comparator.comparingInt(npc::getHating).reversed()); - //@formatter:on + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkSkillTarget(skill, aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } } else { - stream = World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range, c -> checkSkillTarget(skill, c)).stream(); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range)) + { + if (checkSkillTarget(skill, creature)) + { + result.add(creature); + } + } // Maybe add self to the list of targets since getVisibleObjects doesn't return yourself. if (checkSkillTarget(skill, npc)) { - stream = Stream.concat(stream, Stream.of(npc)); + result.add(npc); } // For heal skills sort by hp missing. if (skill.hasEffectType(EffectType.HEAL)) { - stream = stream.sorted(Comparator.comparingInt(Creature::getCurrentHpPercent)); + int searchValue = Integer.MAX_VALUE; + Creature creature = null; + + for (Creature c : result) + { + final int hpPer = c.getCurrentHpPercent(); + if (hpPer < searchValue) + { + searchValue = hpPer; + creature = c; + } + } + + if (creature != null) + { + return creature; + } } } // Return any target. - return stream.findFirst().orElse(null); + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); + } + + return null; } private Creature targetReconsider(boolean randomTarget) @@ -1167,24 +1195,57 @@ public class AttackableAI extends CreatureAI final Attackable npc = getActiveChar(); if (randomTarget) { - Stream stream = npc.getAggroList().values().stream().map(AggroInfo::getAttacker).filter(this::checkTarget); + final List result = new ArrayList<>(); + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkTarget(aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } - // If npc is aggressive, add characters within aggro range too + // If npc is aggressive, add characters within aggro range too. if (npc.isAggressive()) { - stream = Stream.concat(stream, World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream()); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(creature)) + { + result.add(creature); + } + } + } + + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); } - return stream.findAny().orElse(null); } - //@formatter:off - return npc.getAggroList().values().stream() - .filter(a -> checkTarget(a.getAttacker())) - .sorted(Comparator.comparingInt(AggroInfo::getHate)) - .map(AggroInfo::getAttacker) - .findFirst() - .orElse(npc.isAggressive() ? World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream().findAny().orElse(null) : null); - //@formatter:on + int searchValue = Integer.MIN_VALUE; + Creature creature = null; + for (AggroInfo aggro : npc.getAggroList().values()) + { + searchValue = aggro.getHate(); + if (checkTarget(aggro.getAttacker()) && (aggro.getHate() > searchValue)) + { + searchValue = aggro.getHate(); + creature = aggro.getAttacker(); + } + } + + if ((creature == null) && npc.isAggressive()) + { + for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(nearby)) + { + return nearby; + } + } + } + + return null; } /** diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/ai/AttackableAI.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/ai/AttackableAI.java index a6710909d3..48ba8de11a 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/ai/AttackableAI.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/ai/AttackableAI.java @@ -21,11 +21,10 @@ import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK; import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; import java.lang.ref.WeakReference; -import java.util.Comparator; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.logging.Logger; -import java.util.stream.Stream; import org.l2jmobius.Config; import org.l2jmobius.commons.util.Rnd; @@ -1131,35 +1130,64 @@ public class AttackableAI extends CreatureAI // Check current target first. final int range = insideCastRange ? skill.getCastRange() + getActiveChar().getTemplate().getCollisionRadius() : 2000; // TODO need some forget range - Stream stream; + + final List result = new ArrayList<>(); if (isBad) { - //@formatter:off - stream = npc.getAggroList().values().stream() - .map(AggroInfo::getAttacker) - .filter(c -> checkSkillTarget(skill, c)) - .sorted(Comparator.comparingInt(npc::getHating).reversed()); - //@formatter:on + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkSkillTarget(skill, aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } } else { - stream = World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range, c -> checkSkillTarget(skill, c)).stream(); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range)) + { + if (checkSkillTarget(skill, creature)) + { + result.add(creature); + } + } // Maybe add self to the list of targets since getVisibleObjects doesn't return yourself. if (checkSkillTarget(skill, npc)) { - stream = Stream.concat(stream, Stream.of(npc)); + result.add(npc); } // For heal skills sort by hp missing. if (skill.hasEffectType(EffectType.HEAL)) { - stream = stream.sorted(Comparator.comparingInt(Creature::getCurrentHpPercent)); + int searchValue = Integer.MAX_VALUE; + Creature creature = null; + + for (Creature c : result) + { + final int hpPer = c.getCurrentHpPercent(); + if (hpPer < searchValue) + { + searchValue = hpPer; + creature = c; + } + } + + if (creature != null) + { + return creature; + } } } // Return any target. - return stream.findFirst().orElse(null); + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); + } + + return null; } private Creature targetReconsider(boolean randomTarget) @@ -1167,24 +1195,57 @@ public class AttackableAI extends CreatureAI final Attackable npc = getActiveChar(); if (randomTarget) { - Stream stream = npc.getAggroList().values().stream().map(AggroInfo::getAttacker).filter(this::checkTarget); + final List result = new ArrayList<>(); + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkTarget(aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } - // If npc is aggressive, add characters within aggro range too + // If npc is aggressive, add characters within aggro range too. if (npc.isAggressive()) { - stream = Stream.concat(stream, World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream()); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(creature)) + { + result.add(creature); + } + } + } + + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); } - return stream.findAny().orElse(null); } - //@formatter:off - return npc.getAggroList().values().stream() - .filter(a -> checkTarget(a.getAttacker())) - .sorted(Comparator.comparingInt(AggroInfo::getHate)) - .map(AggroInfo::getAttacker) - .findFirst() - .orElse(npc.isAggressive() ? World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream().findAny().orElse(null) : null); - //@formatter:on + int searchValue = Integer.MIN_VALUE; + Creature creature = null; + for (AggroInfo aggro : npc.getAggroList().values()) + { + searchValue = aggro.getHate(); + if (checkTarget(aggro.getAttacker()) && (aggro.getHate() > searchValue)) + { + searchValue = aggro.getHate(); + creature = aggro.getAttacker(); + } + } + + if ((creature == null) && npc.isAggressive()) + { + for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(nearby)) + { + return nearby; + } + } + } + + return null; } /** diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/ai/AttackableAI.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/ai/AttackableAI.java index a6710909d3..48ba8de11a 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/ai/AttackableAI.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/ai/AttackableAI.java @@ -21,11 +21,10 @@ import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK; import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; import java.lang.ref.WeakReference; -import java.util.Comparator; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.logging.Logger; -import java.util.stream.Stream; import org.l2jmobius.Config; import org.l2jmobius.commons.util.Rnd; @@ -1131,35 +1130,64 @@ public class AttackableAI extends CreatureAI // Check current target first. final int range = insideCastRange ? skill.getCastRange() + getActiveChar().getTemplate().getCollisionRadius() : 2000; // TODO need some forget range - Stream stream; + + final List result = new ArrayList<>(); if (isBad) { - //@formatter:off - stream = npc.getAggroList().values().stream() - .map(AggroInfo::getAttacker) - .filter(c -> checkSkillTarget(skill, c)) - .sorted(Comparator.comparingInt(npc::getHating).reversed()); - //@formatter:on + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkSkillTarget(skill, aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } } else { - stream = World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range, c -> checkSkillTarget(skill, c)).stream(); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range)) + { + if (checkSkillTarget(skill, creature)) + { + result.add(creature); + } + } // Maybe add self to the list of targets since getVisibleObjects doesn't return yourself. if (checkSkillTarget(skill, npc)) { - stream = Stream.concat(stream, Stream.of(npc)); + result.add(npc); } // For heal skills sort by hp missing. if (skill.hasEffectType(EffectType.HEAL)) { - stream = stream.sorted(Comparator.comparingInt(Creature::getCurrentHpPercent)); + int searchValue = Integer.MAX_VALUE; + Creature creature = null; + + for (Creature c : result) + { + final int hpPer = c.getCurrentHpPercent(); + if (hpPer < searchValue) + { + searchValue = hpPer; + creature = c; + } + } + + if (creature != null) + { + return creature; + } } } // Return any target. - return stream.findFirst().orElse(null); + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); + } + + return null; } private Creature targetReconsider(boolean randomTarget) @@ -1167,24 +1195,57 @@ public class AttackableAI extends CreatureAI final Attackable npc = getActiveChar(); if (randomTarget) { - Stream stream = npc.getAggroList().values().stream().map(AggroInfo::getAttacker).filter(this::checkTarget); + final List result = new ArrayList<>(); + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkTarget(aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } - // If npc is aggressive, add characters within aggro range too + // If npc is aggressive, add characters within aggro range too. if (npc.isAggressive()) { - stream = Stream.concat(stream, World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream()); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(creature)) + { + result.add(creature); + } + } + } + + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); } - return stream.findAny().orElse(null); } - //@formatter:off - return npc.getAggroList().values().stream() - .filter(a -> checkTarget(a.getAttacker())) - .sorted(Comparator.comparingInt(AggroInfo::getHate)) - .map(AggroInfo::getAttacker) - .findFirst() - .orElse(npc.isAggressive() ? World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream().findAny().orElse(null) : null); - //@formatter:on + int searchValue = Integer.MIN_VALUE; + Creature creature = null; + for (AggroInfo aggro : npc.getAggroList().values()) + { + searchValue = aggro.getHate(); + if (checkTarget(aggro.getAttacker()) && (aggro.getHate() > searchValue)) + { + searchValue = aggro.getHate(); + creature = aggro.getAttacker(); + } + } + + if ((creature == null) && npc.isAggressive()) + { + for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(nearby)) + { + return nearby; + } + } + } + + return null; } /** diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/ai/AttackableAI.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/ai/AttackableAI.java index a6710909d3..48ba8de11a 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/ai/AttackableAI.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/ai/AttackableAI.java @@ -21,11 +21,10 @@ import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK; import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; import java.lang.ref.WeakReference; -import java.util.Comparator; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.logging.Logger; -import java.util.stream.Stream; import org.l2jmobius.Config; import org.l2jmobius.commons.util.Rnd; @@ -1131,35 +1130,64 @@ public class AttackableAI extends CreatureAI // Check current target first. final int range = insideCastRange ? skill.getCastRange() + getActiveChar().getTemplate().getCollisionRadius() : 2000; // TODO need some forget range - Stream stream; + + final List result = new ArrayList<>(); if (isBad) { - //@formatter:off - stream = npc.getAggroList().values().stream() - .map(AggroInfo::getAttacker) - .filter(c -> checkSkillTarget(skill, c)) - .sorted(Comparator.comparingInt(npc::getHating).reversed()); - //@formatter:on + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkSkillTarget(skill, aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } } else { - stream = World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range, c -> checkSkillTarget(skill, c)).stream(); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range)) + { + if (checkSkillTarget(skill, creature)) + { + result.add(creature); + } + } // Maybe add self to the list of targets since getVisibleObjects doesn't return yourself. if (checkSkillTarget(skill, npc)) { - stream = Stream.concat(stream, Stream.of(npc)); + result.add(npc); } // For heal skills sort by hp missing. if (skill.hasEffectType(EffectType.HEAL)) { - stream = stream.sorted(Comparator.comparingInt(Creature::getCurrentHpPercent)); + int searchValue = Integer.MAX_VALUE; + Creature creature = null; + + for (Creature c : result) + { + final int hpPer = c.getCurrentHpPercent(); + if (hpPer < searchValue) + { + searchValue = hpPer; + creature = c; + } + } + + if (creature != null) + { + return creature; + } } } // Return any target. - return stream.findFirst().orElse(null); + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); + } + + return null; } private Creature targetReconsider(boolean randomTarget) @@ -1167,24 +1195,57 @@ public class AttackableAI extends CreatureAI final Attackable npc = getActiveChar(); if (randomTarget) { - Stream stream = npc.getAggroList().values().stream().map(AggroInfo::getAttacker).filter(this::checkTarget); + final List result = new ArrayList<>(); + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkTarget(aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } - // If npc is aggressive, add characters within aggro range too + // If npc is aggressive, add characters within aggro range too. if (npc.isAggressive()) { - stream = Stream.concat(stream, World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream()); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(creature)) + { + result.add(creature); + } + } + } + + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); } - return stream.findAny().orElse(null); } - //@formatter:off - return npc.getAggroList().values().stream() - .filter(a -> checkTarget(a.getAttacker())) - .sorted(Comparator.comparingInt(AggroInfo::getHate)) - .map(AggroInfo::getAttacker) - .findFirst() - .orElse(npc.isAggressive() ? World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream().findAny().orElse(null) : null); - //@formatter:on + int searchValue = Integer.MIN_VALUE; + Creature creature = null; + for (AggroInfo aggro : npc.getAggroList().values()) + { + searchValue = aggro.getHate(); + if (checkTarget(aggro.getAttacker()) && (aggro.getHate() > searchValue)) + { + searchValue = aggro.getHate(); + creature = aggro.getAttacker(); + } + } + + if ((creature == null) && npc.isAggressive()) + { + for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(nearby)) + { + return nearby; + } + } + } + + return null; } /** diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/ai/AttackableAI.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/ai/AttackableAI.java index a6710909d3..48ba8de11a 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/ai/AttackableAI.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/ai/AttackableAI.java @@ -21,11 +21,10 @@ import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK; import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; import java.lang.ref.WeakReference; -import java.util.Comparator; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.logging.Logger; -import java.util.stream.Stream; import org.l2jmobius.Config; import org.l2jmobius.commons.util.Rnd; @@ -1131,35 +1130,64 @@ public class AttackableAI extends CreatureAI // Check current target first. final int range = insideCastRange ? skill.getCastRange() + getActiveChar().getTemplate().getCollisionRadius() : 2000; // TODO need some forget range - Stream stream; + + final List result = new ArrayList<>(); if (isBad) { - //@formatter:off - stream = npc.getAggroList().values().stream() - .map(AggroInfo::getAttacker) - .filter(c -> checkSkillTarget(skill, c)) - .sorted(Comparator.comparingInt(npc::getHating).reversed()); - //@formatter:on + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkSkillTarget(skill, aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } } else { - stream = World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range, c -> checkSkillTarget(skill, c)).stream(); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range)) + { + if (checkSkillTarget(skill, creature)) + { + result.add(creature); + } + } // Maybe add self to the list of targets since getVisibleObjects doesn't return yourself. if (checkSkillTarget(skill, npc)) { - stream = Stream.concat(stream, Stream.of(npc)); + result.add(npc); } // For heal skills sort by hp missing. if (skill.hasEffectType(EffectType.HEAL)) { - stream = stream.sorted(Comparator.comparingInt(Creature::getCurrentHpPercent)); + int searchValue = Integer.MAX_VALUE; + Creature creature = null; + + for (Creature c : result) + { + final int hpPer = c.getCurrentHpPercent(); + if (hpPer < searchValue) + { + searchValue = hpPer; + creature = c; + } + } + + if (creature != null) + { + return creature; + } } } // Return any target. - return stream.findFirst().orElse(null); + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); + } + + return null; } private Creature targetReconsider(boolean randomTarget) @@ -1167,24 +1195,57 @@ public class AttackableAI extends CreatureAI final Attackable npc = getActiveChar(); if (randomTarget) { - Stream stream = npc.getAggroList().values().stream().map(AggroInfo::getAttacker).filter(this::checkTarget); + final List result = new ArrayList<>(); + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkTarget(aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } - // If npc is aggressive, add characters within aggro range too + // If npc is aggressive, add characters within aggro range too. if (npc.isAggressive()) { - stream = Stream.concat(stream, World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream()); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(creature)) + { + result.add(creature); + } + } + } + + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); } - return stream.findAny().orElse(null); } - //@formatter:off - return npc.getAggroList().values().stream() - .filter(a -> checkTarget(a.getAttacker())) - .sorted(Comparator.comparingInt(AggroInfo::getHate)) - .map(AggroInfo::getAttacker) - .findFirst() - .orElse(npc.isAggressive() ? World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream().findAny().orElse(null) : null); - //@formatter:on + int searchValue = Integer.MIN_VALUE; + Creature creature = null; + for (AggroInfo aggro : npc.getAggroList().values()) + { + searchValue = aggro.getHate(); + if (checkTarget(aggro.getAttacker()) && (aggro.getHate() > searchValue)) + { + searchValue = aggro.getHate(); + creature = aggro.getAttacker(); + } + } + + if ((creature == null) && npc.isAggressive()) + { + for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(nearby)) + { + return nearby; + } + } + } + + return null; } /** diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/ai/AttackableAI.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/ai/AttackableAI.java index a6710909d3..48ba8de11a 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/ai/AttackableAI.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/ai/AttackableAI.java @@ -21,11 +21,10 @@ import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK; import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; import java.lang.ref.WeakReference; -import java.util.Comparator; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.logging.Logger; -import java.util.stream.Stream; import org.l2jmobius.Config; import org.l2jmobius.commons.util.Rnd; @@ -1131,35 +1130,64 @@ public class AttackableAI extends CreatureAI // Check current target first. final int range = insideCastRange ? skill.getCastRange() + getActiveChar().getTemplate().getCollisionRadius() : 2000; // TODO need some forget range - Stream stream; + + final List result = new ArrayList<>(); if (isBad) { - //@formatter:off - stream = npc.getAggroList().values().stream() - .map(AggroInfo::getAttacker) - .filter(c -> checkSkillTarget(skill, c)) - .sorted(Comparator.comparingInt(npc::getHating).reversed()); - //@formatter:on + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkSkillTarget(skill, aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } } else { - stream = World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range, c -> checkSkillTarget(skill, c)).stream(); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range)) + { + if (checkSkillTarget(skill, creature)) + { + result.add(creature); + } + } // Maybe add self to the list of targets since getVisibleObjects doesn't return yourself. if (checkSkillTarget(skill, npc)) { - stream = Stream.concat(stream, Stream.of(npc)); + result.add(npc); } // For heal skills sort by hp missing. if (skill.hasEffectType(EffectType.HEAL)) { - stream = stream.sorted(Comparator.comparingInt(Creature::getCurrentHpPercent)); + int searchValue = Integer.MAX_VALUE; + Creature creature = null; + + for (Creature c : result) + { + final int hpPer = c.getCurrentHpPercent(); + if (hpPer < searchValue) + { + searchValue = hpPer; + creature = c; + } + } + + if (creature != null) + { + return creature; + } } } // Return any target. - return stream.findFirst().orElse(null); + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); + } + + return null; } private Creature targetReconsider(boolean randomTarget) @@ -1167,24 +1195,57 @@ public class AttackableAI extends CreatureAI final Attackable npc = getActiveChar(); if (randomTarget) { - Stream stream = npc.getAggroList().values().stream().map(AggroInfo::getAttacker).filter(this::checkTarget); + final List result = new ArrayList<>(); + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkTarget(aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } - // If npc is aggressive, add characters within aggro range too + // If npc is aggressive, add characters within aggro range too. if (npc.isAggressive()) { - stream = Stream.concat(stream, World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream()); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(creature)) + { + result.add(creature); + } + } + } + + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); } - return stream.findAny().orElse(null); } - //@formatter:off - return npc.getAggroList().values().stream() - .filter(a -> checkTarget(a.getAttacker())) - .sorted(Comparator.comparingInt(AggroInfo::getHate)) - .map(AggroInfo::getAttacker) - .findFirst() - .orElse(npc.isAggressive() ? World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream().findAny().orElse(null) : null); - //@formatter:on + int searchValue = Integer.MIN_VALUE; + Creature creature = null; + for (AggroInfo aggro : npc.getAggroList().values()) + { + searchValue = aggro.getHate(); + if (checkTarget(aggro.getAttacker()) && (aggro.getHate() > searchValue)) + { + searchValue = aggro.getHate(); + creature = aggro.getAttacker(); + } + } + + if ((creature == null) && npc.isAggressive()) + { + for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(nearby)) + { + return nearby; + } + } + } + + return null; } /** diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/ai/AttackableAI.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/ai/AttackableAI.java index 4e274b1de3..8c8acb4484 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/ai/AttackableAI.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/ai/AttackableAI.java @@ -21,11 +21,10 @@ import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK; import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; import java.lang.ref.WeakReference; -import java.util.Comparator; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.logging.Logger; -import java.util.stream.Stream; import org.l2jmobius.Config; import org.l2jmobius.commons.util.Rnd; @@ -1131,35 +1130,64 @@ public class AttackableAI extends CreatureAI // Check current target first. final int range = insideCastRange ? skill.getCastRange() + getActiveChar().getTemplate().getCollisionRadius() : 2000; // TODO need some forget range - Stream stream; + + final List result = new ArrayList<>(); if (isBad) { - //@formatter:off - stream = npc.getAggroList().values().stream() - .map(AggroInfo::getAttacker) - .filter(c -> checkSkillTarget(skill, c)) - .sorted(Comparator.comparingInt(npc::getHating).reversed()); - //@formatter:on + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkSkillTarget(skill, aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } } else { - stream = World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range, c -> checkSkillTarget(skill, c)).stream(); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range)) + { + if (checkSkillTarget(skill, creature)) + { + result.add(creature); + } + } // Maybe add self to the list of targets since getVisibleObjects doesn't return yourself. if (checkSkillTarget(skill, npc)) { - stream = Stream.concat(stream, Stream.of(npc)); + result.add(npc); } // For heal skills sort by hp missing. if (skill.hasEffectType(EffectType.HEAL)) { - stream = stream.sorted(Comparator.comparingInt(Creature::getCurrentHpPercent)); + int searchValue = Integer.MAX_VALUE; + Creature creature = null; + + for (Creature c : result) + { + final int hpPer = c.getCurrentHpPercent(); + if (hpPer < searchValue) + { + searchValue = hpPer; + creature = c; + } + } + + if (creature != null) + { + return creature; + } } } // Return any target. - return stream.findFirst().orElse(null); + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); + } + + return null; } private Creature targetReconsider(boolean randomTarget) @@ -1167,24 +1195,57 @@ public class AttackableAI extends CreatureAI final Attackable npc = getActiveChar(); if (randomTarget) { - Stream stream = npc.getAggroList().values().stream().map(AggroInfo::getAttacker).filter(this::checkTarget); + final List result = new ArrayList<>(); + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkTarget(aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } - // If npc is aggressive, add characters within aggro range too + // If npc is aggressive, add characters within aggro range too. if (npc.isAggressive()) { - stream = Stream.concat(stream, World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream()); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(creature)) + { + result.add(creature); + } + } + } + + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); } - return stream.findAny().orElse(null); } - //@formatter:off - return npc.getAggroList().values().stream() - .filter(a -> checkTarget(a.getAttacker())) - .sorted(Comparator.comparingInt(AggroInfo::getHate)) - .map(AggroInfo::getAttacker) - .findFirst() - .orElse(npc.isAggressive() ? World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream().findAny().orElse(null) : null); - //@formatter:on + int searchValue = Integer.MIN_VALUE; + Creature creature = null; + for (AggroInfo aggro : npc.getAggroList().values()) + { + searchValue = aggro.getHate(); + if (checkTarget(aggro.getAttacker()) && (aggro.getHate() > searchValue)) + { + searchValue = aggro.getHate(); + creature = aggro.getAttacker(); + } + } + + if ((creature == null) && npc.isAggressive()) + { + for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(nearby)) + { + return nearby; + } + } + } + + return null; } /** diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/ai/AttackableAI.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/ai/AttackableAI.java index a6710909d3..48ba8de11a 100644 --- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/ai/AttackableAI.java +++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/ai/AttackableAI.java @@ -21,11 +21,10 @@ import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK; import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; import java.lang.ref.WeakReference; -import java.util.Comparator; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.logging.Logger; -import java.util.stream.Stream; import org.l2jmobius.Config; import org.l2jmobius.commons.util.Rnd; @@ -1131,35 +1130,64 @@ public class AttackableAI extends CreatureAI // Check current target first. final int range = insideCastRange ? skill.getCastRange() + getActiveChar().getTemplate().getCollisionRadius() : 2000; // TODO need some forget range - Stream stream; + + final List result = new ArrayList<>(); if (isBad) { - //@formatter:off - stream = npc.getAggroList().values().stream() - .map(AggroInfo::getAttacker) - .filter(c -> checkSkillTarget(skill, c)) - .sorted(Comparator.comparingInt(npc::getHating).reversed()); - //@formatter:on + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkSkillTarget(skill, aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } } else { - stream = World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range, c -> checkSkillTarget(skill, c)).stream(); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range)) + { + if (checkSkillTarget(skill, creature)) + { + result.add(creature); + } + } // Maybe add self to the list of targets since getVisibleObjects doesn't return yourself. if (checkSkillTarget(skill, npc)) { - stream = Stream.concat(stream, Stream.of(npc)); + result.add(npc); } // For heal skills sort by hp missing. if (skill.hasEffectType(EffectType.HEAL)) { - stream = stream.sorted(Comparator.comparingInt(Creature::getCurrentHpPercent)); + int searchValue = Integer.MAX_VALUE; + Creature creature = null; + + for (Creature c : result) + { + final int hpPer = c.getCurrentHpPercent(); + if (hpPer < searchValue) + { + searchValue = hpPer; + creature = c; + } + } + + if (creature != null) + { + return creature; + } } } // Return any target. - return stream.findFirst().orElse(null); + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); + } + + return null; } private Creature targetReconsider(boolean randomTarget) @@ -1167,24 +1195,57 @@ public class AttackableAI extends CreatureAI final Attackable npc = getActiveChar(); if (randomTarget) { - Stream stream = npc.getAggroList().values().stream().map(AggroInfo::getAttacker).filter(this::checkTarget); + final List result = new ArrayList<>(); + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkTarget(aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } - // If npc is aggressive, add characters within aggro range too + // If npc is aggressive, add characters within aggro range too. if (npc.isAggressive()) { - stream = Stream.concat(stream, World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream()); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(creature)) + { + result.add(creature); + } + } + } + + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); } - return stream.findAny().orElse(null); } - //@formatter:off - return npc.getAggroList().values().stream() - .filter(a -> checkTarget(a.getAttacker())) - .sorted(Comparator.comparingInt(AggroInfo::getHate)) - .map(AggroInfo::getAttacker) - .findFirst() - .orElse(npc.isAggressive() ? World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream().findAny().orElse(null) : null); - //@formatter:on + int searchValue = Integer.MIN_VALUE; + Creature creature = null; + for (AggroInfo aggro : npc.getAggroList().values()) + { + searchValue = aggro.getHate(); + if (checkTarget(aggro.getAttacker()) && (aggro.getHate() > searchValue)) + { + searchValue = aggro.getHate(); + creature = aggro.getAttacker(); + } + } + + if ((creature == null) && npc.isAggressive()) + { + for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(nearby)) + { + return nearby; + } + } + } + + return null; } /** diff --git a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/ai/AttackableAI.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/ai/AttackableAI.java index a6710909d3..48ba8de11a 100644 --- a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/ai/AttackableAI.java +++ b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/ai/AttackableAI.java @@ -21,11 +21,10 @@ import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK; import static org.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; import java.lang.ref.WeakReference; -import java.util.Comparator; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.logging.Logger; -import java.util.stream.Stream; import org.l2jmobius.Config; import org.l2jmobius.commons.util.Rnd; @@ -1131,35 +1130,64 @@ public class AttackableAI extends CreatureAI // Check current target first. final int range = insideCastRange ? skill.getCastRange() + getActiveChar().getTemplate().getCollisionRadius() : 2000; // TODO need some forget range - Stream stream; + + final List result = new ArrayList<>(); if (isBad) { - //@formatter:off - stream = npc.getAggroList().values().stream() - .map(AggroInfo::getAttacker) - .filter(c -> checkSkillTarget(skill, c)) - .sorted(Comparator.comparingInt(npc::getHating).reversed()); - //@formatter:on + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkSkillTarget(skill, aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } } else { - stream = World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range, c -> checkSkillTarget(skill, c)).stream(); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, range)) + { + if (checkSkillTarget(skill, creature)) + { + result.add(creature); + } + } // Maybe add self to the list of targets since getVisibleObjects doesn't return yourself. if (checkSkillTarget(skill, npc)) { - stream = Stream.concat(stream, Stream.of(npc)); + result.add(npc); } // For heal skills sort by hp missing. if (skill.hasEffectType(EffectType.HEAL)) { - stream = stream.sorted(Comparator.comparingInt(Creature::getCurrentHpPercent)); + int searchValue = Integer.MAX_VALUE; + Creature creature = null; + + for (Creature c : result) + { + final int hpPer = c.getCurrentHpPercent(); + if (hpPer < searchValue) + { + searchValue = hpPer; + creature = c; + } + } + + if (creature != null) + { + return creature; + } } } // Return any target. - return stream.findFirst().orElse(null); + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); + } + + return null; } private Creature targetReconsider(boolean randomTarget) @@ -1167,24 +1195,57 @@ public class AttackableAI extends CreatureAI final Attackable npc = getActiveChar(); if (randomTarget) { - Stream stream = npc.getAggroList().values().stream().map(AggroInfo::getAttacker).filter(this::checkTarget); + final List result = new ArrayList<>(); + for (AggroInfo aggro : npc.getAggroList().values()) + { + if (checkTarget(aggro.getAttacker())) + { + result.add(aggro.getAttacker()); + } + } - // If npc is aggressive, add characters within aggro range too + // If npc is aggressive, add characters within aggro range too. if (npc.isAggressive()) { - stream = Stream.concat(stream, World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream()); + for (Creature creature : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(creature)) + { + result.add(creature); + } + } + } + + if (!result.isEmpty()) + { + return result.get(Rnd.get(result.size())); } - return stream.findAny().orElse(null); } - //@formatter:off - return npc.getAggroList().values().stream() - .filter(a -> checkTarget(a.getAttacker())) - .sorted(Comparator.comparingInt(AggroInfo::getHate)) - .map(AggroInfo::getAttacker) - .findFirst() - .orElse(npc.isAggressive() ? World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange(), this::checkTarget).stream().findAny().orElse(null) : null); - //@formatter:on + int searchValue = Integer.MIN_VALUE; + Creature creature = null; + for (AggroInfo aggro : npc.getAggroList().values()) + { + searchValue = aggro.getHate(); + if (checkTarget(aggro.getAttacker()) && (aggro.getHate() > searchValue)) + { + searchValue = aggro.getHate(); + creature = aggro.getAttacker(); + } + } + + if ((creature == null) && npc.isAggressive()) + { + for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) + { + if (checkTarget(nearby)) + { + return nearby; + } + } + } + + return null; } /**