From 39814dae05167ad700c0024af8931ffbe46d13eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sun, 24 Nov 2024 22:44:48 +0100 Subject: [PATCH] added sleepTag --- .../spawn/appliances/afkTag/AfkTag.java | 8 +- .../appliances/displayName/DisplayName.java | 6 +- .../sleepTag/SleepStateChangeListener.java | 19 +++++ .../spawn/appliances/sleepTag/SleepTag.java | 74 +++++++++++++++++++ 4 files changed, 101 insertions(+), 6 deletions(-) create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/sleepTag/SleepStateChangeListener.java create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/sleepTag/SleepTag.java diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/afkTag/AfkTag.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/afkTag/AfkTag.java index 055aa4e..0ea049e 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/afkTag/AfkTag.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/afkTag/AfkTag.java @@ -34,13 +34,13 @@ public class AfkTag extends Appliance implements DisplayName.DisplayNamed { public void resetTiming(Player player) { boolean wasAfk = isAfk(player); this.afkTimings.put(player, System.currentTimeMillis()); - if (wasAfk) updateAfkPrefix(player); + if (wasAfk) this.updateAfkPrefix(player); } private void checkAfkPlayers() { this.afkTimings.keySet().forEach((player) -> { if(!isAfk(player)) return; - updateAfkPrefix(player); + this.updateAfkPrefix(player); }); } @@ -57,8 +57,8 @@ public class AfkTag extends Appliance implements DisplayName.DisplayNamed { } @Override - public @Nullable Component getNamePrefix(Player p) { - if(isAfk(p)) return Component.text("[\uD83D\uDECC]", NamedTextColor.GRAY) + public @Nullable Component getNamePrefix(Player player) { + if(isAfk(player)) return Component.text("[\uD83D\uDEAB]", NamedTextColor.GRAY) .hoverEvent(HoverEvent.showText(Component.text("Der Spieler ist AFK"))); return null; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/displayName/DisplayName.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/displayName/DisplayName.java index 8271157..8d19a54 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/displayName/DisplayName.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/displayName/DisplayName.java @@ -6,6 +6,7 @@ import eu.mhsl.craftattack.spawn.appliances.adminMarker.AdminMarker; import eu.mhsl.craftattack.spawn.appliances.adminMarker.AdminMarkerListener; import eu.mhsl.craftattack.spawn.appliances.afkTag.AfkTag; import eu.mhsl.craftattack.spawn.appliances.outlawed.Outlawed; +import eu.mhsl.craftattack.spawn.appliances.sleepTag.SleepTag; import eu.mhsl.craftattack.spawn.appliances.yearRank.YearRank; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentBuilder; @@ -22,7 +23,7 @@ import java.util.logging.Level; public class DisplayName extends Appliance { public interface DisplayNamed { - @Nullable Component getNamePrefix(Player p); + @Nullable Component getNamePrefix(Player player); } public void update(Player player) { @@ -30,7 +31,8 @@ public class DisplayName extends Appliance { List> prefixes = List.of( () -> queryAppliance(Outlawed.class).getNamePrefix(player), () -> queryAppliance(YearRank.class).getNamePrefix(player), - () -> queryAppliance(AfkTag.class).getNamePrefix(player) + () -> queryAppliance(AfkTag.class).getNamePrefix(player), + () -> queryAppliance(SleepTag.class).getNamePrefix(player) ); ComponentBuilder playerName = Component.text(); diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/sleepTag/SleepStateChangeListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/sleepTag/SleepStateChangeListener.java new file mode 100644 index 0000000..4179307 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/sleepTag/SleepStateChangeListener.java @@ -0,0 +1,19 @@ +package eu.mhsl.craftattack.spawn.appliances.sleepTag; + +import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerBedEnterEvent; +import org.bukkit.event.player.PlayerBedLeaveEvent; + +public class SleepStateChangeListener extends ApplianceListener { + @EventHandler + public void onBedEnter(PlayerBedEnterEvent event) { + if(!event.getBedEnterResult().equals(PlayerBedEnterEvent.BedEnterResult.OK)) return; + getAppliance().updateSleeping(event.getPlayer(), true); + } + + @EventHandler + public void onBedLeave(PlayerBedLeaveEvent event) { + getAppliance().updateSleeping(event.getPlayer(), false); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/sleepTag/SleepTag.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/sleepTag/SleepTag.java new file mode 100644 index 0000000..b021cf6 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/sleepTag/SleepTag.java @@ -0,0 +1,74 @@ +package eu.mhsl.craftattack.spawn.appliances.sleepTag; + +import eu.mhsl.craftattack.spawn.Main; +import eu.mhsl.craftattack.spawn.appliance.Appliance; +import eu.mhsl.craftattack.spawn.appliances.displayName.DisplayName; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.util.Ticks; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class SleepTag extends Appliance implements DisplayName.DisplayNamed { + private final Set sleepingPlayers = new HashSet<>(); + + @Override + public void onEnable() { + Bukkit.getScheduler().runTaskTimerAsynchronously( + Main.instance(), + this::cleanup, + Ticks.TICKS_PER_SECOND * 60, + Ticks.TICKS_PER_SECOND * 60 + ); + } + + public void updateSleeping(Player player, boolean isSleeping) { + if(isSleeping) { + this.sleepingPlayers.add(player); + } else { + this.sleepingPlayers.remove(player); + } + this.updateDisplayName(player); + } + + private void updateDisplayName(Player player) { + Main.instance().getAppliance(DisplayName.class).update(player); + } + + private void cleanup() { + System.out.println("before: " + this.sleepingPlayers); + List invalidEntries = this.sleepingPlayers.stream() + .filter(player -> !player.isConnected()) + .filter(player -> !player.isSleeping()) + .toList(); + + System.out.println("Found invalid: " + invalidEntries); + + invalidEntries.forEach(this.sleepingPlayers::remove); + invalidEntries.forEach(this::updateDisplayName); + System.out.println("after: " + this.sleepingPlayers); + } + + @Override + public @Nullable Component getNamePrefix(Player player) { + System.out.println("Testfor sleeping"); + if(this.sleepingPlayers.contains(player)) + return Component.text("[\uD83D\uDECC]", NamedTextColor.GRAY) + .hoverEvent(HoverEvent.showText(Component.text("Der Spieler liegt in einem Bett"))); + + return null; + } + + @Override + protected @NotNull List listeners() { + return List.of(new SleepStateChangeListener()); + } +}