diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/detonator/Detonator.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/detonator/Detonator.java index 5ba2bca8..51d5e4e5 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/detonator/Detonator.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/detonator/Detonator.java @@ -25,8 +25,11 @@ import de.steamwar.bausystem.configplayer.Config; import de.steamwar.bausystem.features.autostart.AutostartListener; import de.steamwar.bausystem.features.detonator.storage.DetonatorStorage; import de.steamwar.bausystem.features.detonator.storage.ItemStorage; +import de.steamwar.core.SWPlayer; import de.steamwar.entity.REntityServer; import de.steamwar.entity.RFallingBlockEntity; +import lombok.Getter; +import lombok.Setter; import lombok.experimental.UtilityClass; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -45,7 +48,28 @@ import java.util.*; @UtilityClass public class Detonator { - private static final Map ENTITIES_MAP = new HashMap<>(); + public class DetonatorComponent implements SWPlayer.Component { + private final REntityServer entities = new REntityServer(); + + @Getter + @Setter + private boolean hasUpdated = false; + + @Override + public void onMount(SWPlayer player) { + entities.addPlayer(player.getPlayer()); + entities.setCallback((player1, entity, action) -> { + Vector vector = new Vector(entity.getX(), entity.getY(), entity.getZ()); + DetonatorListener.addLocationToDetonator(vector.toLocation(player.getWorld()).getBlock().getLocation(), player1); + }); + } + + @Override + public void onUnmount(SWPlayer player) { + entities.close(); + } + } + private static final Vector HALF = new Vector(0.5, 0, 0.5); public static boolean isDetonator(ItemStack itemStack) { @@ -53,28 +77,19 @@ public class Detonator { } public static void showDetonator(Player p, List locs) { - if (ENTITIES_MAP.containsKey(p)) return; - REntityServer entities = new REntityServer(); - entities.setCallback((player, rEntity, entityAction) -> { - Vector vector = new Vector(rEntity.getX(), rEntity.getY(), rEntity.getZ()); - DetonatorListener.addLocationToDetonator(vector.toLocation(player.getWorld()).getBlock().getLocation(), player); - DetonatorListener.HAS_UPDATED.add(player); - }); - entities.addPlayer(p); - ENTITIES_MAP.put(p, entities); - + DetonatorComponent detonatorComponent = SWPlayer.of(p).getComponentOrDefault(DetonatorComponent.class, DetonatorComponent::new); locs.forEach(location -> { - RFallingBlockEntity entity = new RFallingBlockEntity(entities, location.clone().add(HALF), Material.RED_STAINED_GLASS); + RFallingBlockEntity entity = new RFallingBlockEntity(detonatorComponent.entities, location.clone().add(HALF), Material.RED_STAINED_GLASS); entity.setNoGravity(true); }); } public static void hideDetonator(Player p) { - ENTITIES_MAP.remove(p).close(); + SWPlayer.of(p).removeComponent(DetonatorComponent.class); } public static boolean hasActiveDetonatorShow(Player p) { - return ENTITIES_MAP.containsKey(p); + return SWPlayer.of(p).hasComponent(DetonatorComponent.class); } public static void activateDetonator(DetonatorStorage detonator) { diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/detonator/DetonatorListener.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/detonator/DetonatorListener.java index 9d70d11a..d8cd57e3 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/detonator/DetonatorListener.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/detonator/DetonatorListener.java @@ -24,6 +24,7 @@ import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.SWUtils; import de.steamwar.bausystem.features.detonator.storage.DetonatorStorage; import de.steamwar.bausystem.features.detonator.storage.ItemStorage; +import de.steamwar.core.SWPlayer; import de.steamwar.linkage.Linked; import org.bukkit.Location; import org.bukkit.entity.Player; @@ -36,15 +37,11 @@ import org.bukkit.event.player.PlayerItemHeldEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerSwapHandItemsEvent; -import java.util.HashSet; -import java.util.Set; - @Linked public class DetonatorListener implements Listener { - static final Set HAS_UPDATED = new HashSet<>(); - static void addLocationToDetonator(Location location, Player p) { + SWPlayer.of(p).getComponent(Detonator.DetonatorComponent.class).ifPresent(detonatorComponent -> detonatorComponent.setHasUpdated(true)); Detoblock detoblock = Detonator.getBlock(location.getBlock()); if (detoblock == Detoblock.INVALID) { SWUtils.sendToActionbar(p, BauSystem.MESSAGE.parse("DETONATOR_INVALID_BLOCK", p)); @@ -66,64 +63,59 @@ public class DetonatorListener implements Listener { @EventHandler public void onBlockBreak(BlockBreakEvent event) { - if(!Permission.BUILD.hasPermission(event.getPlayer())) return; + if (!Permission.BUILD.hasPermission(event.getPlayer())) return; Player p = event.getPlayer(); if (Detonator.isDetonator(p.getInventory().getItemInMainHand())) { event.setCancelled(true); addLocationToDetonator(event.getBlock().getLocation(), p); - HAS_UPDATED.add(event.getPlayer()); } } @EventHandler public void onPlayerInteract(PlayerInteractEvent event) { - if(!Permission.BUILD.hasPermission(event.getPlayer())) return; - if (!Detonator.isDetonator(event.getItem())) { - return; - } + if (!Permission.BUILD.hasPermission(event.getPlayer())) return; + if (!Detonator.isDetonator(event.getItem())) return; if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) { event.setCancelled(true); DetonatorStorage detonator = new ItemStorage(event.getPlayer()); Detonator.activateDetonator(detonator); - HAS_UPDATED.add(event.getPlayer()); + SWPlayer.of(event.getPlayer()).getComponent(Detonator.DetonatorComponent.class).ifPresent(detonatorComponent -> detonatorComponent.setHasUpdated(true)); } } @EventHandler(ignoreCancelled = true) public void onPlayerMove(PlayerMoveEvent event) { - if (!Permission.BUILD.hasPermission(event.getPlayer()) ||!Detonator.isDetonator(event.getPlayer().getInventory().getItemInMainHand())) { + if (!Permission.BUILD.hasPermission(event.getPlayer()) || !Detonator.isDetonator(event.getPlayer().getInventory().getItemInMainHand())) { if (Detonator.hasActiveDetonatorShow(event.getPlayer())) { Detonator.hideDetonator(event.getPlayer()); } - } else { - if (!Detonator.hasActiveDetonatorShow(event.getPlayer())) { - Detonator.showDetonator(event.getPlayer(), new ItemStorage(event.getPlayer()).getLocations()); - } + return; } - - if (HAS_UPDATED.contains(event.getPlayer())) { - HAS_UPDATED.remove(event.getPlayer()); - if (Detonator.hasActiveDetonatorShow(event.getPlayer())) { - Detonator.hideDetonator(event.getPlayer()); - Detonator.showDetonator(event.getPlayer(), new ItemStorage(event.getPlayer()).getLocations()); - } + if (!Detonator.hasActiveDetonatorShow(event.getPlayer())) { + Detonator.showDetonator(event.getPlayer(), new ItemStorage(event.getPlayer()).getLocations()); + return; } + Detonator.DetonatorComponent component = SWPlayer.of(event.getPlayer()) + .getComponentAndFilter(Detonator.DetonatorComponent.class, Detonator.DetonatorComponent::isHasUpdated) + .orElse(null); + if (component == null) return; + component.setHasUpdated(false); + Detonator.hideDetonator(event.getPlayer()); + Detonator.showDetonator(event.getPlayer(), new ItemStorage(event.getPlayer()).getLocations()); } @EventHandler public void onPlayerItemHeld(PlayerItemHeldEvent event) { - if(!Permission.BUILD.hasPermission(event.getPlayer())) return; - if (Detonator.isDetonator(event.getPlayer().getInventory().getItemInMainHand())) { - HAS_UPDATED.add(event.getPlayer()); - } + if (!Permission.BUILD.hasPermission(event.getPlayer())) return; + if (!Detonator.isDetonator(event.getPlayer().getInventory().getItemInMainHand())) return; + SWPlayer.of(event.getPlayer()).getComponent(Detonator.DetonatorComponent.class).ifPresent(detonatorComponent -> detonatorComponent.setHasUpdated(true)); } @EventHandler public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) { - if(!Permission.BUILD.hasPermission(event.getPlayer())) return; - if (Detonator.isDetonator(event.getMainHandItem()) || Detonator.isDetonator(event.getOffHandItem())) { - HAS_UPDATED.add(event.getPlayer()); - } + if (!Permission.BUILD.hasPermission(event.getPlayer())) return; + if (!(Detonator.isDetonator(event.getMainHandItem()) || Detonator.isDetonator(event.getOffHandItem()))) return; + SWPlayer.of(event.getPlayer()).getComponent(Detonator.DetonatorComponent.class).ifPresent(detonatorComponent -> detonatorComponent.setHasUpdated(true)); } } diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/SWPlayer.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/SWPlayer.java index 12a2aa0c..a911fbfd 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/SWPlayer.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/SWPlayer.java @@ -20,7 +20,6 @@ package de.steamwar.core; import de.steamwar.message.Message; -import lombok.Getter; import lombok.NonNull; import lombok.experimental.Delegate; import net.md_5.bungee.api.ChatMessageType; @@ -36,6 +35,7 @@ import org.bukkit.event.player.PlayerQuitEvent; import java.util.HashMap; import java.util.Map; import java.util.Optional; +import java.util.function.Predicate; import java.util.function.Supplier; import java.util.stream.Stream; @@ -103,7 +103,6 @@ public class SWPlayer { } @Delegate - @Getter private final Player player; private final Map, Component> components = new HashMap<>(); @@ -119,6 +118,10 @@ public class SWPlayer { return Optional.ofNullable((T) components.get(clazz)); } + public @NonNull Optional getComponentAndFilter(@NonNull Class clazz, Predicate filter) { + return Optional.ofNullable((T) components.get(clazz)).filter(filter); + } + public @NonNull T getComponentOrDefault(@NonNull Class clazz, @NonNull Supplier defaultValue) { T value = (T) components.get(clazz); if (value != null) return value;