From 6f9ae25a7b7663faf0178638257dafd3f9ed7a0a Mon Sep 17 00:00:00 2001 From: Logan Saso Date: Sat, 4 Oct 2025 21:55:33 -0700 Subject: [PATCH] Whoops --- .../forcefield/PlayerBlockTracker.java | 70 +++++++++++++++++++ .../listener/PlayerListener.java | 25 +++++++ 2 files changed, 95 insertions(+) create mode 100644 src/main/java/loganintech/regionforcefield/forcefield/PlayerBlockTracker.java create mode 100644 src/main/java/loganintech/regionforcefield/listener/PlayerListener.java diff --git a/src/main/java/loganintech/regionforcefield/forcefield/PlayerBlockTracker.java b/src/main/java/loganintech/regionforcefield/forcefield/PlayerBlockTracker.java new file mode 100644 index 0000000..678ec30 --- /dev/null +++ b/src/main/java/loganintech/regionforcefield/forcefield/PlayerBlockTracker.java @@ -0,0 +1,70 @@ +package loganintech.regionforcefield.forcefield; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +/** + * Tracks fake blocks sent to players so they can be properly cleaned up. + */ +public class PlayerBlockTracker { + + private final Map> playerBlocks = new HashMap<>(); + + /** + * Records that a block was sent to a player. + * + * @param player the player + * @param location the block location + */ + public void addBlock(@NotNull Player player, @NotNull Location location) { + playerBlocks.computeIfAbsent(player.getUniqueId(), k -> new HashSet<>()).add(location.clone()); + } + + /** + * Gets all blocks that have been sent to a player. + * + * @param player the player + * @return set of block locations + */ + @NotNull + public Set getBlocks(@NotNull Player player) { + return playerBlocks.getOrDefault(player.getUniqueId(), new HashSet<>()); + } + + /** + * Clears all tracked blocks for a player. + * + * @param player the player + */ + public void clearPlayer(@NotNull Player player) { + playerBlocks.remove(player.getUniqueId()); + } + + /** + * Replaces the tracked blocks for a player with a new set. + * + * @param player the player + * @param newBlocks the new set of blocks + */ + public void setBlocks(@NotNull Player player, @NotNull Set newBlocks) { + if (newBlocks.isEmpty()) { + playerBlocks.remove(player.getUniqueId()); + } else { + playerBlocks.put(player.getUniqueId(), new HashSet<>(newBlocks)); + } + } + + /** + * Clears all tracked blocks for all players. + */ + public void clearAll() { + playerBlocks.clear(); + } +} diff --git a/src/main/java/loganintech/regionforcefield/listener/PlayerListener.java b/src/main/java/loganintech/regionforcefield/listener/PlayerListener.java new file mode 100644 index 0000000..fdbd285 --- /dev/null +++ b/src/main/java/loganintech/regionforcefield/listener/PlayerListener.java @@ -0,0 +1,25 @@ +package loganintech.regionforcefield.listener; + +import loganintech.regionforcefield.RegionForcefieldPlugin; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; +import org.jetbrains.annotations.NotNull; + +/** + * Handles player events for cleanup. + */ +public class PlayerListener implements Listener { + + private final RegionForcefieldPlugin plugin; + + public PlayerListener(@NotNull RegionForcefieldPlugin plugin) { + this.plugin = plugin; + } + + @EventHandler + public void onPlayerQuit(@NotNull PlayerQuitEvent event) { + // Clean up fake blocks when player disconnects + plugin.getForcefieldRenderer().clearBlocks(event.getPlayer()); + } +}