package ee.futur.baseapi.collections.query; import ee.futur.baseapi.BaseApiPlugin; import ee.futur.baseapi.utils.WorldAreaUtility; import net.runelite.api.Actor; import net.runelite.api.Client; import net.runelite.api.Player; import net.runelite.api.coords.WorldArea; import net.runelite.api.coords.WorldPoint; import net.runelite.client.RuneLite; import java.util.*; import java.util.function.Predicate; import java.util.stream.Collectors; public class PlayerQuery { static Client client = RuneLite.getInjector().getInstance(Client.class); private List players; public PlayerQuery(List players) { this.players = new ArrayList<>(players); } public PlayerQuery withName(String name) { List filteredPlayers = new ArrayList<>(); for (Player player : players) { if (player.getName().equals(name)) filteredPlayers.add(player); } players = filteredPlayers; return this; } public PlayerQuery withinWorldArea(WorldArea area) { players = players.stream().filter(player -> area.contains(player.getWorldLocation())).collect(Collectors.toList()); return this; } public PlayerQuery filter(Predicate predicate) { players = players.stream().filter(predicate).collect(Collectors.toList()); return this; } public PlayerQuery interactingWithLocal() { List filteredPlayers = new ArrayList<>(); for (Player player : players) { if (!player.isInteracting()) continue; if (player.getInteracting() == client.getLocalPlayer()) filteredPlayers.add(player); } players = filteredPlayers; return this; } public PlayerQuery interactingWith(Actor actor) { List filteredPlayers = new ArrayList<>(); for (Player player : players) { if (!player.isInteracting()) continue; if (player.getInteracting() == actor) filteredPlayers.add(player); } players = filteredPlayers; return this; } public PlayerQuery nameContains(String name) { List filteredPlayers = new ArrayList<>(); for (Player player : players) { if (player.getName().contains(name)) filteredPlayers.add(player); } players = filteredPlayers; return this; } public PlayerQuery notLocalPlayer() { players.remove(client.getLocalPlayer()); return this; } public PlayerQuery withinLevel(int low, int high) { List filteredPlayers = new ArrayList<>(); for (Player player : players) { if (player.getCombatLevel() >= low && player.getCombatLevel() <= high) filteredPlayers.add(player); } players = filteredPlayers; return this; } public boolean isEmpty() { return players.isEmpty(); } public Optional first() { if (players.isEmpty()) return Optional.empty(); return Optional.ofNullable(players.get(0)); } public List result() { return players; } public Optional nearestByPath() { HashMap playerMap = new HashMap<>(); for (Player player : players) { for (WorldPoint wp : player.getWorldArea().toWorldPointList()) { playerMap.put(wp, player); } for (WorldPoint wp : WorldAreaUtility.objectInteractableTiles(player)) { playerMap.put(wp, player); } } List path = BaseApiPlugin.pathToGoalSetFromPlayerNoCustomTiles(new HashSet<>(playerMap.keySet())); if (path == null) { return Optional.empty(); } if (path.isEmpty()) { if (playerMap.containsKey(client.getLocalPlayer().getWorldLocation())) { return Optional.ofNullable(playerMap.get(client.getLocalPlayer().getWorldLocation())); } else { return Optional.empty(); } } return Optional.ofNullable(playerMap.get(path.get(path.size() - 1))); } }