From f14d27c2d470cec16c1e829575012c7d48959eb5 Mon Sep 17 00:00:00 2001 From: david Date: Tue, 9 Apr 2024 20:22:59 +0200 Subject: [PATCH] added getHighestX --- .../thenextlvl/protect/area/Container.java | 22 +++++++++++++++++++ .../thenextlvl/protect/area/CraftArea.java | 22 +++++++++++++++++++ .../protect/listener/AreaListener.java | 12 +++++----- 3 files changed, 50 insertions(+), 6 deletions(-) diff --git a/api/src/main/java/net/thenextlvl/protect/area/Container.java b/api/src/main/java/net/thenextlvl/protect/area/Container.java index eca7998..ab02a0c 100644 --- a/api/src/main/java/net/thenextlvl/protect/area/Container.java +++ b/api/src/main/java/net/thenextlvl/protect/area/Container.java @@ -50,6 +50,7 @@ default boolean contains(Entity entity) { * Retrieves a list of entities that are contained within this container. * * @return a list of entities + * @see Container#getHighestEntities() */ List getEntities(); @@ -57,6 +58,27 @@ default boolean contains(Entity entity) { * Retrieves a list of players that are contained within this container. * * @return a list of players + * @see Container#getHighestPlayers() */ List getPlayers(); + + /** + * Retrieves a list of entities that are contained within this container. + * This method returns only those entities who's highest-area is equal to this one. + * + * @return a List of Entity objects that are contained within this container + * @see Area#getPriority() + * @see Container#getEntities() + */ + List getHighestEntities(); + + /** + * Retrieves a list of players that are contained within this container. + * This method returns only those players who's highest-area is equal to this one. + * + * @return a List of Player objects that are contained within this container + * @see Area#getPriority() + * @see Container#getPlayers() + */ + List getHighestPlayers(); } diff --git a/plugin/src/main/java/net/thenextlvl/protect/area/CraftArea.java b/plugin/src/main/java/net/thenextlvl/protect/area/CraftArea.java index 8eeaf80..482733d 100644 --- a/plugin/src/main/java/net/thenextlvl/protect/area/CraftArea.java +++ b/plugin/src/main/java/net/thenextlvl/protect/area/CraftArea.java @@ -1,24 +1,32 @@ package net.thenextlvl.protect.area; +import core.annotation.MethodsReturnNotNullByDefault; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import lombok.ToString; +import net.thenextlvl.protect.ProtectPlugin; import net.thenextlvl.protect.event.AreaFlagChangeEvent; import net.thenextlvl.protect.event.AreaFlagUnsetEvent; import net.thenextlvl.protect.flag.Flag; import org.bukkit.World; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; @Getter @Setter @ToString @EqualsAndHashCode +@MethodsReturnNotNullByDefault public abstract class CraftArea implements Area { + private final ProtectPlugin plugin = JavaPlugin.getPlugin(ProtectPlugin.class); private Map, @Nullable Object> flags = new LinkedHashMap<>(); private final @NamePattern String name; private final World world; @@ -42,6 +50,20 @@ public boolean removeFlag(@NotNull Flag flag) { return event.callEvent() && Area.super.removeFlag(flag); } + @Override + public List getHighestEntities() { + return getEntities().stream() + .filter(player -> plugin.areaProvider().getArea(player).equals(this)) + .toList(); + } + + @Override + public List getHighestPlayers() { + return getPlayers().stream() + .filter(player -> plugin.areaProvider().getArea(player).equals(this)) + .toList(); + } + @Override public int compareTo(@NotNull Area area) { return Integer.compare(getPriority(), area.getPriority()); diff --git a/plugin/src/main/java/net/thenextlvl/protect/listener/AreaListener.java b/plugin/src/main/java/net/thenextlvl/protect/listener/AreaListener.java index 47fad8d..a941deb 100644 --- a/plugin/src/main/java/net/thenextlvl/protect/listener/AreaListener.java +++ b/plugin/src/main/java/net/thenextlvl/protect/listener/AreaListener.java @@ -51,13 +51,13 @@ else if (event.getPrevious().hasFlag(plugin.flags.time)) public void onAreaFlagChange(AreaFlagChangeEvent event) { if (event.getFlag().equals(plugin.flags.weather)) { var weather = (WeatherType) event.getNewState(); - event.getArea().getPlayers().forEach(player -> { + event.getArea().getHighestPlayers().forEach(player -> { if (weather != null) player.setPlayerWeather(weather); else player.resetPlayerWeather(); }); } else if (event.getFlag().equals(plugin.flags.time)) { var time = (Long) event.getNewState(); - event.getArea().getPlayers().forEach(player -> { + event.getArea().getHighestPlayers().forEach(player -> { if (time != null) player.setPlayerTime(time, false); else player.resetPlayerTime(); }); @@ -66,9 +66,9 @@ public void onAreaFlagChange(AreaFlagChangeEvent event) { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onAreaFlagUnset(AreaFlagUnsetEvent event) { - if (event.getFlag().equals(plugin.flags.weather)) - event.getArea().getPlayers().forEach(Player::resetPlayerWeather); - else if (event.getFlag().equals(plugin.flags.time)) - event.getArea().getPlayers().forEach(Player::resetPlayerTime); + if (event.getFlag().equals(plugin.flags.weather)) { + event.getArea().getHighestPlayers().forEach(Player::resetPlayerWeather); + } else if (event.getFlag().equals(plugin.flags.time)) + event.getArea().getHighestPlayers().forEach(Player::resetPlayerTime); } }