From 4c8246917196a6412684232c36e90a8d10e0876f Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Sun, 26 Oct 2025 14:18:36 +0100 Subject: [PATCH] Refactor old sim cursor to use new cursor construct --- .../features/simulator/SimulatorCommand.java | 27 +- .../features/simulator/SimulatorCursor.java | 467 ------------------ .../simulator/SimulatorCursorManager.java | 168 +++++++ .../features/simulator/SimulatorStorage.java | 53 +- .../features/simulator/SimulatorUtils.java | 12 + .../features/simulator/SimulatorWatcher.java | 129 ----- .../display/EmptySimulatorCursor.java | 83 ++++ .../simulator/display/SimulatorCursor.java | 104 ++++ .../display/SimulatorCursorMode.java | 39 ++ .../simulator/display/SimulatorRenderer.java | 78 +++ .../features/simulator/execute/StabStep.java | 24 +- .../gui/SimulatorGroupChooserGui.java | 31 +- .../simulator/gui/SimulatorGroupGui.java | 55 ++- .../gui/SimulatorGroupSettingsGui.java | 144 +++--- .../features/simulator/gui/SimulatorGui.java | 29 +- .../simulator/gui/SimulatorMaterialGui.java | 42 +- .../simulator/gui/SimulatorObserverGui.java | 78 ++- .../SimulatorObserverPhaseSettingsGui.java | 94 ++-- .../gui/SimulatorObserverSettingsGui.java | 59 ++- .../simulator/gui/SimulatorRedstoneGui.java | 93 ++-- .../SimulatorRedstonePhaseSettingsGui.java | 79 +-- .../gui/SimulatorRedstoneSettingsGui.java | 57 ++- .../simulator/gui/SimulatorSettingsGui.java | 62 +-- .../simulator/gui/SimulatorTNTGui.java | 104 ++-- .../gui/SimulatorTNTPhaseSettingsGui.java | 120 ++--- .../gui/SimulatorTNTSettingsGui.java | 75 +-- .../simulator/gui/base/SimulatorBaseGui.java | 35 +- .../cursor/{RCursor.java => Cursor.java} | 28 +- ...RCursorManager.java => CursorManager.java} | 26 +- 29 files changed, 1132 insertions(+), 1263 deletions(-) delete mode 100644 BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java create mode 100644 BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursorManager.java create mode 100644 BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorUtils.java delete mode 100644 BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorWatcher.java create mode 100644 BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/display/EmptySimulatorCursor.java create mode 100644 BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/display/SimulatorCursor.java create mode 100644 BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/display/SimulatorCursorMode.java create mode 100644 BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/display/SimulatorRenderer.java rename BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/{RCursor.java => Cursor.java} (87%) rename BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/{RCursorManager.java => CursorManager.java} (79%) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCommand.java index 646d22a9..6acbd70a 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCommand.java @@ -1,20 +1,18 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2023 SteamWar.de-Serverteam + * Copyright (C) 2023 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see . */ package de.steamwar.bausystem.features.simulator; @@ -22,6 +20,7 @@ package de.steamwar.bausystem.features.simulator; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.SWUtils; import de.steamwar.bausystem.features.simulator.data.Simulator; +import de.steamwar.bausystem.features.simulator.display.SimulatorCursor; import de.steamwar.bausystem.features.simulator.execute.SimulatorExecutor; import de.steamwar.command.PreviousArguments; import de.steamwar.command.SWCommand; @@ -49,12 +48,12 @@ public class SimulatorCommand extends SWCommand { @Register(description = "SIMULATOR_HELP") public void genericCommand(@Validator Player p) { SWUtils.giveItemToPlayer(p, SimulatorStorage.getWand(p)); - simulatorCursor.calcCursor(p); + // TODO simulatorCursor.calcCursor(p); } @Register(value = "change", description = "SIMULATOR_CHANGE_HELP") public void change(@Validator Player p) { - if (!SimulatorCursor.isSimulatorItem(p.getInventory().getItemInMainHand()) && !SimulatorCursor.isSimulatorItem(p.getInventory().getItemInOffHand())) { + if (!SimulatorUtils.isSimulatorItem(p.getInventory().getItemInMainHand()) && !SimulatorUtils.isSimulatorItem(p.getInventory().getItemInOffHand())) { BauSystem.MESSAGE.send("SIMULATOR_NO_SIM_IN_HAND", p); return; } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java deleted file mode 100644 index 8ffca7a9..00000000 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java +++ /dev/null @@ -1,467 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2023 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.bausystem.features.simulator; - -import de.steamwar.Reflection; -import com.comphenix.tinyprotocol.TinyProtocol; -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.Permission; -import de.steamwar.bausystem.SWUtils; -import de.steamwar.bausystem.features.simulator.data.Simulator; -import de.steamwar.bausystem.features.simulator.data.SimulatorElement; -import de.steamwar.bausystem.features.simulator.data.SimulatorGroup; -import de.steamwar.bausystem.features.simulator.data.observer.ObserverElement; -import de.steamwar.bausystem.features.simulator.data.observer.ObserverPhase; -import de.steamwar.bausystem.features.simulator.data.redstone.RedstoneElement; -import de.steamwar.bausystem.features.simulator.data.redstone.RedstonePhase; -import de.steamwar.bausystem.features.simulator.data.tnt.TNTElement; -import de.steamwar.bausystem.features.simulator.data.tnt.TNTPhase; -import de.steamwar.bausystem.features.simulator.execute.SimulatorExecutor; -import de.steamwar.bausystem.features.simulator.gui.SimulatorGroupGui; -import de.steamwar.bausystem.features.simulator.gui.SimulatorGui; -import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; -import de.steamwar.bausystem.utils.BauMemberUpdateEvent; -import de.steamwar.bausystem.utils.ItemUtils; -import de.steamwar.bausystem.utils.RayTraceUtils; -import de.steamwar.entity.REntity; -import de.steamwar.entity.REntityServer; -import de.steamwar.entity.RFallingBlockEntity; -import de.steamwar.inventory.SWAnvilInv; -import de.steamwar.linkage.Linked; -import de.steamwar.linkage.MinVersion; -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.block.BlockFace; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; -import org.bukkit.event.player.*; -import org.bukkit.inventory.ItemStack; -import org.bukkit.util.Vector; - -import java.util.*; -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.stream.Collectors; - -@Linked -@MinVersion(19) -public class SimulatorCursor implements Listener { - - private final World WORLD = Bukkit.getWorlds().get(0); - private Class position = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundMovePlayerPacket$Pos"); - private Class look = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundMovePlayerPacket$Rot"); - private Class positionLook = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundMovePlayerPacket$PosRot"); - - private Map cursorType = Collections.synchronizedMap(new HashMap<>()); - private Map cursors = Collections.synchronizedMap(new HashMap<>()); - private final Set calculating = new HashSet<>(); - - public static boolean isSimulatorItem(ItemStack itemStack) { - return ItemUtils.isItem(itemStack, "simulator"); - } - - public SimulatorCursor() { - BiFunction function = (player, object) -> { - calcCursor(player); - return object; - }; - TinyProtocol.instance.addFilter(position, function); - TinyProtocol.instance.addFilter(look, function); - TinyProtocol.instance.addFilter(positionLook, function); - } - - @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) { - if (!Permission.BUILD.hasPermission(event.getPlayer())) return; - Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> { - calcCursor(event.getPlayer()); - }, 0); - } - - @EventHandler - public void onPlayerDropItem(PlayerDropItemEvent event) { - if (!Permission.BUILD.hasPermission(event.getPlayer())) return; - calcCursor(event.getPlayer()); - } - - @EventHandler - public void onPlayerItemHeld(PlayerItemHeldEvent event) { - if (!Permission.BUILD.hasPermission(event.getPlayer())) return; - Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> { - calcCursor(event.getPlayer()); - }, 1); - } - - @EventHandler - public void onBauMemberUpdate(BauMemberUpdateEvent event) { - event.getChanged().forEach(this::calcCursor); - } - - @EventHandler - public void onPlayerQuit(PlayerQuitEvent event) { - cursorType.remove(event.getPlayer()); - cursors.remove(event.getPlayer()); - synchronized (calculating) { - calculating.remove(event.getPlayer()); - } - } - - private static final Map LAST_SNEAKS = new HashMap<>(); - - static { - Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), () -> { - long millis = System.currentTimeMillis(); - LAST_SNEAKS.entrySet().removeIf(entry -> millis - entry.getValue() > 200); - }, 1, 1); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onPlayerToggleSneak(PlayerToggleSneakEvent event) { - if (!event.isSneaking()) return; - Player player = event.getPlayer(); - if (!isSimulatorItem(player.getInventory().getItemInMainHand()) && !isSimulatorItem(player.getInventory().getItemInOffHand())) { - return; - } - if (LAST_SNEAKS.containsKey(player)) { - cursorType.put(player, cursorType.getOrDefault(player, CursorType.TNT).switchType()); - calcCursor(player); - } else { - LAST_SNEAKS.put(player, System.currentTimeMillis()); - } - } - - public void calcCursor(Player player) { - synchronized (calculating) { - if (calculating.contains(player)) return; - calculating.add(player); - } - if (!Permission.BUILD.hasPermission(player) || (!isSimulatorItem(player.getInventory().getItemInMainHand()) && !isSimulatorItem(player.getInventory().getItemInOffHand()))) { - if (removeCursor(player) || SimulatorWatcher.show(null, player)) { - SWUtils.sendToActionbar(player, ""); - } - synchronized (calculating) { - calculating.remove(player); - } - return; - } - - Simulator simulator = SimulatorStorage.getSimulator(player); - if (simulator != null && simulator.getStabGenerator() != null) { - removeCursor(player); - SimulatorWatcher.show(null, player); - SWUtils.sendToActionbar(player, "§cGenerating Stab"); - synchronized (calculating) { - calculating.remove(player); - } - return; - } - - SimulatorWatcher.show(simulator, player); - List entities = SimulatorWatcher.getEntitiesOfSimulator(simulator); - RayTraceUtils.RRayTraceResult rayTraceResult = RayTraceUtils.traceREntity(player, player.getLocation(), entities); - if (rayTraceResult == null) { - removeCursor(player); - if (simulator == null) { - SWUtils.sendToActionbar(player, "§eSelect Simulator"); - } else { - SWUtils.sendToActionbar(player, "§eOpen Simulator"); - } - synchronized (calculating) { - calculating.remove(player); - } - return; - } - - showCursor(player, rayTraceResult, simulator != null); - synchronized (calculating) { - calculating.remove(player); - } - } - - private synchronized boolean removeCursor(Player player) { - REntityServer entityServer = cursors.get(player); - boolean hadCursor = entityServer != null && !entityServer.getEntities().isEmpty(); - if (entityServer != null) { - entityServer.getEntities().forEach(REntity::die); - } - return hadCursor; - } - - private synchronized void showCursor(Player player, RayTraceUtils.RRayTraceResult rayTraceResult, boolean hasSimulatorSelected) { - REntityServer entityServer = cursors.computeIfAbsent(player, __ -> { - REntityServer rEntityServer = new REntityServer(); - rEntityServer.addPlayer(player); - return rEntityServer; - }); - - CursorType type = cursorType.getOrDefault(player, CursorType.TNT); - REntity hitEntity = rayTraceResult.getHitEntity(); - Location location = hitEntity != null ? new Vector(hitEntity.getX(), hitEntity.getY(), hitEntity.getZ()).toLocation(WORLD) : - type.position.apply(player, rayTraceResult).toLocation(WORLD); - - Material material = hitEntity != null ? Material.GLASS : type.getMaterial(); - List entities = entityServer.getEntitiesByType(RFallingBlockEntity.class); - entities.removeIf(rFallingBlockEntity -> { - if (rFallingBlockEntity.getMaterial() != material) { - rFallingBlockEntity.die(); - return true; - } - rFallingBlockEntity.move(location); - return false; - }); - if (entities.isEmpty()) { - RFallingBlockEntity rFallingBlockEntity = new RFallingBlockEntity(entityServer, location, material); - rFallingBlockEntity.setNoGravity(true); - if (material == Material.GLASS) { - rFallingBlockEntity.setGlowing(true); - } - } - - if (hasSimulatorSelected) { - if (hitEntity != null) { - SWUtils.sendToActionbar(player, "§eEdit Position"); - } else { - SWUtils.sendToActionbar(player, "§eAdd new " + type.name); - } - } else { - SWUtils.sendToActionbar(player, "§eCreate new Simulator"); - } - } - - public static Vector getPosFree(Player player, RayTraceUtils.RRayTraceResult result) { - Vector pos = result.getHitPosition(); - - BlockFace face = result.getHitBlockFace(); - if (face != null) { - switch (face) { - case DOWN: - pos.setY(pos.getY() - 0.98); - break; - case EAST: - pos.setX(pos.getX() + 0.49); - break; - case WEST: - pos.setX(pos.getX() - 0.49); - break; - case NORTH: - pos.setZ(pos.getZ() - 0.49); - break; - case SOUTH: - pos.setZ(pos.getZ() + 0.49); - break; - default: - break; - } - - if (face.getModY() == 0 && player.isSneaking()) { - pos.setY(pos.getY() - 0.49); - } - } - - if (!player.isSneaking()) { - pos.setX(pos.getBlockX() + 0.5); - if (face == null || face.getModY() == 0) - pos.setY(pos.getBlockY() + 0.0); - pos.setZ(pos.getBlockZ() + 0.5); - } - - return pos; - } - - private static Vector getPosBlockAligned(Player player, RayTraceUtils.RRayTraceResult result) { - Vector pos = result.getHitPosition(); - - BlockFace face = result.getHitBlockFace(); - if (face != null) { - switch (face) { - case DOWN: - pos.setY(pos.getY() - 0.98); - break; - case EAST: - pos.setX(pos.getX() + 0.49); - break; - case WEST: - pos.setX(pos.getX() - 0.49); - break; - case NORTH: - pos.setZ(pos.getZ() - 0.49); - break; - case SOUTH: - pos.setZ(pos.getZ() + 0.49); - break; - default: - break; - } - } - - pos.setX(pos.getBlockX() + 0.5); - if (pos.getY() - pos.getBlockY() != 0 && face == BlockFace.UP) { - pos.setY(pos.getBlockY() + 1.0); - } else { - pos.setY(pos.getBlockY()); - } - pos.setZ(pos.getBlockZ() + 0.5); - return pos; - } - - @Getter - @AllArgsConstructor - public enum CursorType { - TNT(Material.TNT, SimulatorCursor::getPosFree, "TNT", vector -> new TNTElement(vector).add(new TNTPhase())), - REDSTONE_BLOCK(Material.REDSTONE_BLOCK, SimulatorCursor::getPosBlockAligned, "Redstone Block", vector -> new RedstoneElement(vector).add(new RedstonePhase())), - OBSERVER(Material.OBSERVER, SimulatorCursor::getPosBlockAligned, "Observer", vector -> new ObserverElement(vector).add(new ObserverPhase())), - ; - - private Material material; - private BiFunction position; - private String name; - private Function> elementFunction; - - public CursorType switchType() { - if (this == TNT) { - return REDSTONE_BLOCK; - } - if (this == REDSTONE_BLOCK) { - return OBSERVER; - } - return TNT; - } - } - - @EventHandler - public void onPlayerInteract(PlayerInteractEvent event) { - if (!Permission.BUILD.hasPermission(event.getPlayer())) return; - if (!ItemUtils.isItem(event.getItem(), "simulator")) { - return; - } - - event.setCancelled(true); - Player player = event.getPlayer(); - Simulator simulator = SimulatorStorage.getSimulator(player); - - if (event.getAction() == Action.LEFT_CLICK_BLOCK || event.getAction() == Action.LEFT_CLICK_AIR) { - if (simulator == null) { - return; - } - SimulatorExecutor.run(event.getPlayer(), simulator, null); - return; - } - - if (event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.RIGHT_CLICK_AIR) { - return; - } - - - RayTraceUtils.RRayTraceResult rayTraceResult = RayTraceUtils.traceREntity(player, player.getLocation(), SimulatorWatcher.getEntitiesOfSimulator(simulator)); - if (simulator == null) { - if (rayTraceResult == null) { - SimulatorStorage.openSimulatorSelector(player); - } else { - SWAnvilInv anvilInv = new SWAnvilInv(player, "Name"); - anvilInv.setCallback(s -> { - Simulator sim = SimulatorStorage.getSimulator(s); - if (sim != null) { - BauSystem.MESSAGE.send("SIMULATOR_NAME_ALREADY_EXISTS", player); - return; - } - if (!s.matches("[a-zA-Z_0-9-]+")) { - BauSystem.MESSAGE.send("SIMULATOR_NAME_INVALID", player); - return; - } - sim = new Simulator(s); - SimulatorStorage.addSimulator(s, sim); - createElement(player, rayTraceResult, sim); - SimulatorStorage.setSimulator(player, sim); - }); - anvilInv.open(); - } - return; - } - - if (rayTraceResult == null) { - new SimulatorGui(player, simulator).open(); - return; - } - - if (rayTraceResult.getHitEntity() != null) { - REntity hitEntity = rayTraceResult.getHitEntity(); - Vector vector = new Vector(hitEntity.getX(), hitEntity.getY(), hitEntity.getZ()); - List> elements = simulator.getGroups().stream().map(SimulatorGroup::getElements).flatMap(List::stream).filter(element -> { - return element.getWorldPos().distanceSquared(vector) < (1 / 16.0) * (1 / 16.0); - }).collect(Collectors.toList()); - - switch (elements.size()) { - case 0: - return; - case 1: - // Open single element present in Simulator - SimulatorElement element = elements.get(0); - SimulatorGroup group1 = element.getGroup(simulator); - SimulatorBaseGui back = new SimulatorGui(player, simulator); - if (group1.getElements().size() > 1) { - back = new SimulatorGroupGui(player, simulator, group1, back); - } - element.open(player, simulator, group1, back); - break; - default: - List parents = elements.stream().map(e -> e.getGroup(simulator)).distinct().collect(Collectors.toList()); - if (parents.size() == 1) { - // Open multi element present in Simulator in existing group - SimulatorGui simulatorGui = new SimulatorGui(player, simulator); - new SimulatorGroupGui(player, simulator, parents.get(0), simulatorGui).open(); - } else { - // Open multi element present in Simulator in implicit group - SimulatorGroup group2 = new SimulatorGroup(); - group2.setMaterial(null); - group2.getElements().addAll(elements); - SimulatorGui simulatorGui = new SimulatorGui(player, simulator); - new SimulatorGroupGui(player, simulator, group2, simulatorGui).open(); - } - break; - } - return; - } - - // Add new Element to current simulator - createElement(player, rayTraceResult, simulator); - } - - private void createElement(Player player, RayTraceUtils.RRayTraceResult rayTraceResult, Simulator simulator) { - CursorType type = cursorType.getOrDefault(player, CursorType.TNT); - Vector vector = type.position.apply(player, rayTraceResult); - if (type == CursorType.REDSTONE_BLOCK) { - vector.subtract(new Vector(0.5, 0, 0.5)); - } - SimulatorElement element = type.elementFunction.apply(vector); - SimulatorGroup group = new SimulatorGroup().add(element); - simulator.getGroups().add(group); - SimulatorGui simulatorGui = new SimulatorGui(player, simulator); - element.open(player, simulator, group, simulatorGui); - SimulatorWatcher.update(simulator); - calcCursor(player); - } -} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursorManager.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursorManager.java new file mode 100644 index 00000000..c56c31d9 --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursorManager.java @@ -0,0 +1,168 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2023 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see . + */ + +package de.steamwar.bausystem.features.simulator; + +import de.steamwar.Reflection; +import com.comphenix.tinyprotocol.TinyProtocol; +import de.steamwar.bausystem.BauSystem; +import de.steamwar.bausystem.Permission; +import de.steamwar.bausystem.SWUtils; +import de.steamwar.bausystem.features.simulator.data.Simulator; +import de.steamwar.bausystem.features.simulator.data.SimulatorElement; +import de.steamwar.bausystem.features.simulator.data.SimulatorGroup; +import de.steamwar.bausystem.features.simulator.data.observer.ObserverElement; +import de.steamwar.bausystem.features.simulator.data.observer.ObserverPhase; +import de.steamwar.bausystem.features.simulator.data.redstone.RedstoneElement; +import de.steamwar.bausystem.features.simulator.data.redstone.RedstonePhase; +import de.steamwar.bausystem.features.simulator.data.tnt.TNTElement; +import de.steamwar.bausystem.features.simulator.data.tnt.TNTPhase; +import de.steamwar.bausystem.features.simulator.display.SimulatorCursor; +import de.steamwar.bausystem.features.simulator.display.SimulatorRenderer; +import de.steamwar.bausystem.features.simulator.execute.SimulatorExecutor; +import de.steamwar.bausystem.features.simulator.gui.SimulatorGroupGui; +import de.steamwar.bausystem.features.simulator.gui.SimulatorGui; +import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; +import de.steamwar.bausystem.utils.BauMemberUpdateEvent; +import de.steamwar.bausystem.utils.ItemUtils; +import de.steamwar.bausystem.utils.RayTraceUtils; +import de.steamwar.bausystem.utils.cursor.Cursor; +import de.steamwar.entity.REntity; +import de.steamwar.entity.REntityServer; +import de.steamwar.entity.RFallingBlockEntity; +import de.steamwar.inventory.SWAnvilInv; +import de.steamwar.linkage.Linked; +import de.steamwar.linkage.MinVersion; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.var; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.*; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; + +import java.util.*; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Linked +@MinVersion(19) +public class SimulatorCursorManager implements Listener { + enum SimulatorCursorMode { + TNT, REDSTONE_BLOCK, OBSERVER + } + + private final Map> activeCursorsByPlayerBySimulator = new HashMap<>(); + + public void onPlayerItemEquip(PlayerItemHeldEvent event) { + Player player = event.getPlayer(); + + // Show simulator cursor for newly held simulator item and trigger simulator display + Simulator heldSimulator = SimulatorStorage.getSimulator(player.getInventory().getItem(event.getNewSlot())); + + if (heldSimulator != null) { + Map cursorsBySimulator = activeCursorsByPlayerBySimulator.getOrDefault(player, new HashMap<>()); + Cursor cursor = cursorsBySimulator.get(heldSimulator); + + if (cursor == null) { + REntityServer simulatorServer = SimulatorRenderer.show(heldSimulator, player); + cursor = new Cursor(simulatorServer, player, Material.GLASS, Material.TNT, + Arrays.asList(Cursor.CursorMode.BLOCK_ALIGNED, Cursor.CursorMode.FREE), (clickedLocation, clickedOnEntity, clickAction) -> { + }); + + cursorsBySimulator.put(heldSimulator, cursor); + activeCursorsByPlayerBySimulator.put(player, cursorsBySimulator); + cursor.show(); + } + cursor.show(); + + } + + // Hide simulator cursor for previously held simulator item + Simulator previousSimulator = SimulatorStorage.getSimulator(player.getInventory().getItem(event.getPreviousSlot())); + if (previousSimulator != null) { + Map cursorsBySimulator = activeCursorsByPlayerBySimulator.getOrDefault(player, new HashMap<>()); + Cursor cursor = cursorsBySimulator.get(previousSimulator); + + if (cursor != null) { + cursor.hide(); + } + } + } + + + private synchronized void showCursor(Player player, RayTraceUtils.RRayTraceResult rayTraceResult, boolean hasSimulatorSelected) { + REntityServer entityServer = cursors.computeIfAbsent(player, __ -> { + REntityServer rEntityServer = new REntityServer(); + rEntityServer.addPlayer(player); + return rEntityServer; + }); + + CursorType type = cursorType.getOrDefault(player, CursorType.TNT); + REntity hitEntity = rayTraceResult.getHitEntity(); + Location location = hitEntity != null ? new Vector(hitEntity.getX(), hitEntity.getY(), hitEntity.getZ()).toLocation(WORLD) + : type.position.apply(player, rayTraceResult).toLocation(WORLD); + + Material material = hitEntity != null ? Material.GLASS : type.getMaterial(); + List entities = entityServer.getEntitiesByType(RFallingBlockEntity.class); + entities.removeIf(rFallingBlockEntity -> { + if (rFallingBlockEntity.getMaterial() != material) { + rFallingBlockEntity.die(); + return true; + } + rFallingBlockEntity.move(location); + return false; + }); + if (entities.isEmpty()) { + RFallingBlockEntity rFallingBlockEntity = new RFallingBlockEntity(entityServer, location, material); + rFallingBlockEntity.setNoGravity(true); + if (material == Material.GLASS) { + rFallingBlockEntity.setGlowing(true); + } + } + + if (hasSimulatorSelected) { + if (hitEntity != null) { + SWUtils.sendToActionbar(player, "§eEdit Position"); + } else { + SWUtils.sendToActionbar(player, "§eAdd new " + type.name); + } + } else { + SWUtils.sendToActionbar(player, "§eCreate new Simulator"); + } + } + + @Getter + @AllArgsConstructor + public enum CursorType { + + } + + private void createElement(Player player, RayTraceUtils.RRayTraceResult rayTraceResult, Simulator simulator) { + + } +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java index 434e112d..62ba488d 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java @@ -1,20 +1,18 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2023 SteamWar.de-Serverteam + * Copyright (C) 2023 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see . */ package de.steamwar.bausystem.features.simulator; @@ -23,6 +21,7 @@ import com.google.common.io.Files; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.SWUtils; import de.steamwar.bausystem.features.simulator.data.Simulator; +import de.steamwar.bausystem.features.simulator.display.SimulatorCursor; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorPageGui; import de.steamwar.bausystem.features.simulator.storage.SimFormatSimulatorLoader; import de.steamwar.bausystem.features.simulator.storage.SimulatorFormatSimulatorLoader; @@ -56,12 +55,13 @@ public class SimulatorStorage implements Enable { public static Simulator getSimulator(Player player) { Simulator simulator = getSimulator(player.getInventory().getItemInMainHand()); - if (simulator != null) return simulator; + if (simulator != null) + return simulator; return getSimulator(player.getInventory().getItemInOffHand()); } public static Simulator getSimulator(ItemStack itemStack) { - if (!SimulatorCursor.isSimulatorItem(itemStack)) { + if (!SimulatorUtils.isSimulatorItem(itemStack)) { return null; } String selection = ItemUtils.getTag(itemStack, simulatorSelection); @@ -86,11 +86,11 @@ public class SimulatorStorage implements Enable { YAPIONFormatSimulatorLoader yapionFormatSimulatorLoader = new YAPIONFormatSimulatorLoader(); File[] files = simulatorsDir.listFiles(); - if (files == null) return; + if (files == null) + return; for (File file : files) { try { - List simulators = simFormatSimulatorLoader.load(file) - .orElse(null); + List simulators = simFormatSimulatorLoader.load(file).orElse(null); if (simulators != null) { simulators.forEach(simulator -> { simulatorMap.put(simulator.getName(), simulator); @@ -102,8 +102,7 @@ public class SimulatorStorage implements Enable { } try { - List simulators = simulatorFormatSimulatorLoader.load(file) - .orElse(null); + List simulators = simulatorFormatSimulatorLoader.load(file).orElse(null); if (simulators != null) { simulators.forEach(simulator -> { simulatorMap.put(simulator.getName(), simulator); @@ -116,8 +115,7 @@ public class SimulatorStorage implements Enable { } try { - List simulators = yapionFormatSimulatorLoader.load(file) - .orElse(null); + List simulators = yapionFormatSimulatorLoader.load(file).orElse(null); if (simulators != null) { simulators.forEach(simulator -> { simulatorMap.put(simulator.getName(), simulator); @@ -131,7 +129,8 @@ public class SimulatorStorage implements Enable { } public static void openSimulatorSelector(Player player) { - SimulatorPageGui simulatorPageGui = new SimulatorPageGui(player, null, 6 * 9, simulatorMap.values().stream().sorted(Comparator.comparing(Simulator::getName)).collect(Collectors.toList())) { + SimulatorPageGui simulatorPageGui = new SimulatorPageGui(player, null, 6 * 9, + simulatorMap.values().stream().sorted(Comparator.comparing(Simulator::getName)).collect(Collectors.toList())) { @Override public String baseTitle() { return "Simulators"; @@ -171,7 +170,11 @@ public class SimulatorStorage implements Enable { } public static ItemStack getWand(Player p) { - ItemStack itemStack = new SWItem(Material.BLAZE_ROD, BauSystem.MESSAGE.parse("SIMULATOR_WAND_NAME", p), Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_WAND_LORE_1", p), BauSystem.MESSAGE.parse("SIMULATOR_WAND_LORE_2", p), BauSystem.MESSAGE.parse("SIMULATOR_WAND_LORE_3", p), BauSystem.MESSAGE.parse("SIMULATOR_WAND_LORE_4", p), BauSystem.MESSAGE.parse("SIMULATOR_WAND_LORE_5", p)), false, null).getItemStack(); + ItemStack itemStack = new SWItem(Material.BLAZE_ROD, BauSystem.MESSAGE.parse("SIMULATOR_WAND_NAME", p), + Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_WAND_LORE_1", p), BauSystem.MESSAGE.parse("SIMULATOR_WAND_LORE_2", p), + BauSystem.MESSAGE.parse("SIMULATOR_WAND_LORE_3", p), BauSystem.MESSAGE.parse("SIMULATOR_WAND_LORE_4", p), + BauSystem.MESSAGE.parse("SIMULATOR_WAND_LORE_5", p)), + false, null).getItemStack(); ItemMeta itemMeta = itemStack.getItemMeta(); itemMeta.setCustomModelData(1); itemStack.setItemMeta(itemMeta); @@ -183,9 +186,9 @@ public class SimulatorStorage implements Enable { ItemStack mainHand = player.getInventory().getItemInMainHand(); ItemStack offHand = player.getInventory().getItemInOffHand(); ItemStack itemStack; - if (SimulatorCursor.isSimulatorItem(mainHand)) { + if (SimulatorUtils.isSimulatorItem(mainHand)) { itemStack = mainHand; - } else if (SimulatorCursor.isSimulatorItem(offHand)) { + } else if (SimulatorUtils.isSimulatorItem(offHand)) { itemStack = offHand; } else { itemStack = null; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorUtils.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorUtils.java new file mode 100644 index 00000000..f120cf7e --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorUtils.java @@ -0,0 +1,12 @@ +package de.steamwar.bausystem.features.simulator; + +import org.bukkit.inventory.ItemStack; +import de.steamwar.bausystem.utils.ItemUtils; +import lombok.experimental.UtilityClass; + +@UtilityClass +public class SimulatorUtils { + public static boolean isSimulatorItem(ItemStack itemStack) { + return ItemUtils.isItem(itemStack, "simulator"); + } +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorWatcher.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorWatcher.java deleted file mode 100644 index d5f98986..00000000 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorWatcher.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2023 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.bausystem.features.simulator; - -import de.steamwar.bausystem.features.simulator.data.Simulator; -import de.steamwar.bausystem.features.simulator.data.SimulatorElement; -import de.steamwar.bausystem.features.simulator.data.SimulatorGroup; -import de.steamwar.bausystem.features.simulator.storage.SimulatorSaver; -import de.steamwar.bausystem.shared.Pair; -import de.steamwar.entity.REntity; -import de.steamwar.entity.REntityServer; -import de.steamwar.entity.RFallingBlockEntity; -import de.steamwar.linkage.Linked; -import de.steamwar.linkage.MinVersion; -import lombok.experimental.UtilityClass; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.util.Vector; - -import java.util.*; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.stream.Collectors; - -@UtilityClass -public class SimulatorWatcher { - - private final World WORLD = Bukkit.getWorlds().get(0); - private Map entityServers = new HashMap<>(); - private Map> watchers = new HashMap<>(); - - public void watch(Player player, Simulator simulator, Runnable watcher) { - if (simulator == null || watcher == null) { - watchers.remove(player); - } else { - watchers.put(player, new Pair<>(simulator, watcher)); - } - } - - public synchronized void update(Simulator simulator) { - REntityServer rEntityServer = entityServers.get(simulator); - if (rEntityServer != null) { - rEntityServer.getEntities().forEach(REntity::die); - createSim(rEntityServer, simulator); - } - - new ArrayList<>(watchers.values()).forEach(simulatorRunnablePair -> { - if (simulatorRunnablePair.getKey() == simulator) { - simulatorRunnablePair.getValue().run(); - } - }); - SimulatorSaver.saveSimulator(SimulatorStorage.simulatorsDir, simulator); - } - - @Linked - @MinVersion(19) - public static class QuitListener implements Listener { - - @EventHandler - public void onPlayerQuit(PlayerQuitEvent event) { - watchers.remove(event.getPlayer()); - show(null, event.getPlayer()); - } - } - - private REntityServer createSim(REntityServer server, Simulator simulator) { - if (simulator == null) { - return null; - } - Map>> positionCache = new HashMap<>(); - simulator.getGroups().stream().map(group -> group.getElements().stream().map(element -> new Pair<>(group, element)).collect(Collectors.toList())).flatMap(List::stream).forEach(pair -> { - SimulatorGroup group = pair.getKey(); - SimulatorElement element = pair.getValue(); - - boolean wasNotPresent = positionCache.computeIfAbsent(element.getPosition(), __ -> new HashSet<>()) - .add(element.getClass()); - if (!wasNotPresent) return; - Material material = group.isDisabled() || element.isDisabled() ? element.getWorldDisabledMaterial() : element.getWorldMaterial(); - Location location = element.getWorldPos().toLocation(WORLD); - RFallingBlockEntity rFallingBlockEntity = new RFallingBlockEntity(server, location, material); - rFallingBlockEntity.setNoGravity(true); - }); - return server; - } - - public synchronized boolean show(Simulator sim, Player player) { - AtomicBoolean removed = new AtomicBoolean(); - entityServers.forEach((simulator, rEntityServer) -> { - if (rEntityServer == null) return; - if (rEntityServer.getPlayers().contains(player) && sim != simulator) { - rEntityServer.removePlayer(player); - removed.set(true); - } - }); - if (sim == null) return removed.get(); - entityServers.computeIfAbsent(sim, __ -> createSim(new REntityServer(), sim)).addPlayer(player); - return removed.get(); - } - - synchronized List getEntitiesOfSimulator(Simulator simulator) { - REntityServer entityServer = entityServers.get(simulator); - if (entityServer == null) { - return Collections.emptyList(); - } - return entityServer.getEntities(); - } -} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/display/EmptySimulatorCursor.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/display/EmptySimulatorCursor.java new file mode 100644 index 00000000..bd2d2fc2 --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/display/EmptySimulatorCursor.java @@ -0,0 +1,83 @@ +package de.steamwar.bausystem.features.simulator.display; + +import java.util.List; +import java.util.Optional; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerToggleSneakEvent; +import de.steamwar.bausystem.BauSystem; +import de.steamwar.bausystem.features.simulator.SimulatorStorage; +import de.steamwar.bausystem.features.simulator.data.Simulator; +import de.steamwar.bausystem.features.simulator.data.SimulatorElement; +import de.steamwar.bausystem.features.simulator.data.SimulatorGroup; +import de.steamwar.bausystem.utils.cursor.Cursor; +import de.steamwar.entity.REntityServer; +import de.steamwar.inventory.SWAnvilInv; + +public class EmptySimulatorCursor extends Cursor implements Listener { + private final Player owner; + + private SimulatorCursorMode cursorMode; + + public EmptySimulatorCursor(Player owner) { + super(new REntityServer(), owner, Material.GLASS, Material.TNT, List.of(Cursor.CursorMode.FREE, Cursor.CursorMode.BLOCK_ALIGNED)); + this.cursorMode = SimulatorCursorMode.TNT; + this.owner = owner; + } + + public void swapCursorMode() { + cursorMode = cursorMode.switchType(); + setCursorMaterial(cursorMode.getMaterial()); + setAllowedCursorModes(cursorMode.getAllowedCursorModes()); + } + + public void hide() { + super.hide(); + super.getTargetServer().removePlayer(owner); + } + + public void show() { + super.show(); + super.getTargetServer().addPlayer(owner); + } + + @EventHandler + public void onPlayerShift(PlayerToggleSneakEvent event) { + if (event.getPlayer() != owner) { + return; + } + swapCursorMode(); + } + + @Override + public void onClick(Optional clickedLocation, boolean clickedOnEntity, Action clickAction) { + if (clickAction == Action.LEFT_CLICK_AIR) { + SimulatorStorage.openSimulatorSelector(owner); + } else if (clickAction == Action.LEFT_CLICK_BLOCK) { + SWAnvilInv anvilInv = new SWAnvilInv(owner, "Name"); + anvilInv.setCallback(name -> { + Simulator sim = SimulatorStorage.getSimulator(name); + if (sim != null) { + BauSystem.MESSAGE.send("SIMULATOR_NAME_ALREADY_EXISTS", owner); + return; + } + if (!name.matches("[a-zA-Z_0-9-]+")) { + BauSystem.MESSAGE.send("SIMULATOR_NAME_INVALID", owner); + return; + } + sim = new Simulator(name); + SimulatorStorage.addSimulator(name, sim); + SimulatorElement element = cursorMode.getElementFunction().apply(clickedLocation.get().toVector()); + SimulatorGroup group = new SimulatorGroup(); + group.add(element); + sim.add(group); + SimulatorStorage.setSimulator(owner, sim); + }); + anvilInv.open(); + } + } +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/display/SimulatorCursor.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/display/SimulatorCursor.java new file mode 100644 index 00000000..705f3297 --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/display/SimulatorCursor.java @@ -0,0 +1,104 @@ +package de.steamwar.bausystem.features.simulator.display; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerToggleSneakEvent; +import org.bukkit.util.Vector; +import de.steamwar.bausystem.features.simulator.data.Simulator; +import de.steamwar.bausystem.features.simulator.data.SimulatorElement; +import de.steamwar.bausystem.features.simulator.data.SimulatorGroup; +import de.steamwar.bausystem.features.simulator.execute.SimulatorExecutor; +import de.steamwar.bausystem.features.simulator.gui.SimulatorGroupGui; +import de.steamwar.bausystem.features.simulator.gui.SimulatorGui; +import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; +import de.steamwar.bausystem.utils.cursor.Cursor; +import de.steamwar.entity.REntityServer; + +public class SimulatorCursor extends Cursor { + private final Simulator simulator; + private final Player owner; + + private SimulatorCursorMode cursorMode; + + public SimulatorCursor(Simulator simulator, Player owner, SimulatorCursorMode cursorMode) { + super(SimulatorRenderer.renderSimulator(simulator), owner, Material.LIME_STAINED_GLASS_PANE, Material.RED_STAINED_GLASS_PANE, + cursorMode.getAllowedCursorModes()); + + this.simulator = simulator; + this.owner = owner; + } + + public void swapCursorMode() { + SimulatorCursorMode newMode = cursorMode.switchType(); + setCursorMaterial(newMode.getMaterial()); + setAllowedCursorModes(newMode.getAllowedCursorModes()); + } + + public void hide() { + super.hide(); + super.getTargetServer().removePlayer(owner); + } + + public void show() { + super.show(); + super.getTargetServer().addPlayer(owner); + } + + @EventHandler + public void onPlayerShift(PlayerToggleSneakEvent event) { + if (event.getPlayer() != owner) { + return; + } + swapCursorMode(); + } + + @Override + public void onClick(Optional clickedLocation, boolean clickedOnEntity, Action clickAction) { + if (clickAction == Action.RIGHT_CLICK_AIR || clickAction == Action.RIGHT_CLICK_BLOCK) { + SimulatorExecutor.run(owner, simulator, null); + } else if (!clickedOnEntity || clickedLocation.isEmpty()) { + new SimulatorGui(owner, simulator); + } else { + Vector vector = clickedLocation.get().toVector(); + List> elements = simulator.getGroups().stream().map(SimulatorGroup::getElements).flatMap(List::stream).filter(element -> { + return element.getWorldPos().distanceSquared(vector) < (1 / 16.0) * (1 / 16.0); + }).collect(Collectors.toList()); + + switch (elements.size()) { + case 0: + return; + case 1: + // Open single element present in Simulator + SimulatorElement element = elements.get(0); + SimulatorGroup group1 = element.getGroup(simulator); + SimulatorBaseGui back = new SimulatorGui(owner, simulator); + if (group1.getElements().size() > 1) { + back = new SimulatorGroupGui(owner, simulator, group1, back); + } + element.open(owner, simulator, group1, back); + break; + default: + List parents = elements.stream().map(e -> e.getGroup(simulator)).distinct().collect(Collectors.toList()); + if (parents.size() == 1) { + // Open multi element present in Simulator in existing group + SimulatorGui simulatorGui = new SimulatorGui(owner, simulator); + new SimulatorGroupGui(owner, simulator, parents.get(0), simulatorGui).open(); + } else { + // Open multi element present in Simulator in implicit group + SimulatorGroup group2 = new SimulatorGroup(); + group2.setMaterial(null); + group2.getElements().addAll(elements); + SimulatorGui simulatorGui = new SimulatorGui(owner, simulator); + new SimulatorGroupGui(owner, simulator, group2, simulatorGui).open(); + } + break; + } + } + } +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/display/SimulatorCursorMode.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/display/SimulatorCursorMode.java new file mode 100644 index 00000000..ff55e8f8 --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/display/SimulatorCursorMode.java @@ -0,0 +1,39 @@ +package de.steamwar.bausystem.features.simulator.display; + +import java.util.List; +import java.util.function.Function; +import org.bukkit.Material; +import org.bukkit.util.Vector; +import de.steamwar.bausystem.features.simulator.data.SimulatorElement; +import de.steamwar.bausystem.features.simulator.data.observer.ObserverElement; +import de.steamwar.bausystem.features.simulator.data.observer.ObserverPhase; +import de.steamwar.bausystem.features.simulator.data.redstone.RedstoneElement; +import de.steamwar.bausystem.features.simulator.data.redstone.RedstonePhase; +import de.steamwar.bausystem.features.simulator.data.tnt.TNTElement; +import de.steamwar.bausystem.features.simulator.data.tnt.TNTPhase; +import de.steamwar.bausystem.utils.cursor.Cursor.CursorMode; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum SimulatorCursorMode { + TNT(Material.TNT, "TNT", vector -> new TNTElement(vector).add(new TNTPhase()), List.of(CursorMode.FREE, CursorMode.BLOCK_ALIGNED)), REDSTONE_BLOCK( + Material.REDSTONE_BLOCK, "Redstone Block", vector -> new RedstoneElement(vector).add(new RedstonePhase()), List.of(CursorMode.BLOCK_ALIGNED)), OBSERVER( + Material.OBSERVER, "Observer", vector -> new ObserverElement(vector).add(new ObserverPhase()), List.of(CursorMode.BLOCK_ALIGNED)); + + private Material material; + private String name; + private Function> elementFunction; + private List allowedCursorModes; + + public SimulatorCursorMode switchType() { + if (this == TNT) { + return REDSTONE_BLOCK; + } + if (this == REDSTONE_BLOCK) { + return OBSERVER; + } + return TNT; + } +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/display/SimulatorRenderer.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/display/SimulatorRenderer.java new file mode 100644 index 00000000..eeb6233b --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/display/SimulatorRenderer.java @@ -0,0 +1,78 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2023 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see . + */ + +package de.steamwar.bausystem.features.simulator.display; + +import de.steamwar.bausystem.features.simulator.SimulatorStorage; +import de.steamwar.bausystem.features.simulator.data.Simulator; +import de.steamwar.bausystem.features.simulator.data.SimulatorElement; +import de.steamwar.bausystem.features.simulator.data.SimulatorGroup; +import de.steamwar.bausystem.features.simulator.storage.SimulatorSaver; +import de.steamwar.bausystem.shared.Pair; +import de.steamwar.entity.REntity; +import de.steamwar.entity.REntityServer; +import de.steamwar.entity.RFallingBlockEntity; + +import lombok.experimental.UtilityClass; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.event.Listener; +import org.bukkit.util.Vector; + +import java.util.*; +import java.util.stream.Collectors; + +@UtilityClass +public class SimulatorRenderer implements Listener { + private final World WORLD = Bukkit.getWorlds().get(0); + private Map entityServers = new HashMap<>(); + + public synchronized void update(Simulator simulator) { + renderSimulator(simulator); + + SimulatorSaver.saveSimulator(SimulatorStorage.simulatorsDir, simulator); + } + + public REntityServer renderSimulator(Simulator simulator) { + if (simulator == null) { + return null; + } + + REntityServer server = entityServers.computeIfAbsent(simulator, __ -> new REntityServer()); + + server.getEntities().forEach(REntity::die); + + Map>> positionCache = new HashMap<>(); + simulator.getGroups().stream().map(group -> group.getElements().stream().map(element -> new Pair<>(group, element)).collect(Collectors.toList())) + .flatMap(List::stream).forEach(pair -> { + SimulatorGroup group = pair.getKey(); + SimulatorElement element = pair.getValue(); + + boolean wasNotPresent = positionCache.computeIfAbsent(element.getPosition(), __ -> new HashSet<>()).add(element.getClass()); + if (!wasNotPresent) + return; + Material material = group.isDisabled() || element.isDisabled() ? element.getWorldDisabledMaterial() : element.getWorldMaterial(); + Location location = element.getWorldPos().toLocation(WORLD); + RFallingBlockEntity rFallingBlockEntity = new RFallingBlockEntity(server, location, material); + rFallingBlockEntity.setNoGravity(true); + }); + return server; + } +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/StabStep.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/StabStep.java index 6a0e1a2f..0375577c 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/StabStep.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/StabStep.java @@ -1,26 +1,24 @@ /* * This file is a part of the SteamWar software. * - * Copyright (C) 2020 SteamWar.de-Serverteam + * Copyright (C) 2020 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see . */ package de.steamwar.bausystem.features.simulator.execute; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.features.simulator.SimulatorWatcher; +import de.steamwar.bausystem.features.simulator.display.SimulatorRenderer; import de.steamwar.bausystem.utils.bossbar.BauSystemBossbar; import de.steamwar.bausystem.utils.bossbar.BossBarService; import org.bukkit.Bukkit; @@ -72,7 +70,7 @@ public abstract class StabStep { protected final void stop() { data.simulator.setStabGenerator(null); - SimulatorWatcher.update(data.simulator); + SimulatorRenderer.update(data.simulator); for (Player player : Bukkit.getOnlinePlayers()) { BauSystemBossbar bossbar = BossBarService.instance.get(player, data.region, "simulator_stab_generator"); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupChooserGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupChooserGui.java index 10396677..3c35c1fe 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupChooserGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupChooserGui.java @@ -1,28 +1,26 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2023 SteamWar.de-Serverteam + * Copyright (C) 2023 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see . */ package de.steamwar.bausystem.features.simulator.gui; -import de.steamwar.bausystem.features.simulator.SimulatorWatcher; import de.steamwar.bausystem.features.simulator.data.Simulator; import de.steamwar.bausystem.features.simulator.data.SimulatorElement; import de.steamwar.bausystem.features.simulator.data.SimulatorGroup; +import de.steamwar.bausystem.features.simulator.display.SimulatorRenderer; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorPageGui; import de.steamwar.inventory.InvCallback; @@ -39,7 +37,8 @@ public class SimulatorGroupChooserGui extends SimulatorPageGui { private final SimulatorBaseGui back; public SimulatorGroupChooserGui(Player player, Simulator simulator, SimulatorElement subject, SimulatorGroup parent, SimulatorBaseGui back) { - super(player, simulator, 6 * 9, simulator.getGroups().stream().filter(e -> e != parent).filter(e -> subject.canBeInGroup(e)).collect(Collectors.toList())); + super(player, simulator, 6 * 9, + simulator.getGroups().stream().filter(e -> e != parent).filter(e -> subject.canBeInGroup(e)).collect(Collectors.toList())); this.subject = subject; this.parent = parent; this.back = back; @@ -56,7 +55,7 @@ public class SimulatorGroupChooserGui extends SimulatorPageGui { simulator.getGroups().add(newParent); parent.getElements().remove(subject); back.open(); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); if (parent.getElements().size() == 1) { parent.setDisabled(false); parent.setMaterial(Material.BARREL); @@ -83,7 +82,7 @@ public class SimulatorGroupChooserGui extends SimulatorPageGui { parent.setMaterial(Material.BARREL); } back.open(); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }; return simulatorGroup.toItem(player, invCallback, invCallback); } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupGui.java index e18ef66e..1f433ac0 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupGui.java @@ -1,28 +1,26 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2023 SteamWar.de-Serverteam + * Copyright (C) 2023 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see . */ package de.steamwar.bausystem.features.simulator.gui; -import de.steamwar.bausystem.features.simulator.SimulatorWatcher; import de.steamwar.bausystem.features.simulator.data.Simulator; import de.steamwar.bausystem.features.simulator.data.SimulatorElement; import de.steamwar.bausystem.features.simulator.data.SimulatorGroup; +import de.steamwar.bausystem.features.simulator.display.SimulatorRenderer; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorPageGui; import de.steamwar.data.CMDs; @@ -60,7 +58,7 @@ public class SimulatorGroupGui extends SimulatorPageGui> { } if (simulatorGroup.getElements().removeIf(element -> element.getPhases().isEmpty())) { - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); } if (simulatorGroup.getElements().size() < 2) { back.open(); @@ -75,11 +73,12 @@ public class SimulatorGroupGui extends SimulatorPageGui> { inventory.setItem(8, new SWItem(Material.BARRIER, "§eDelete", clickType -> { simulatorGroup.getElements().clear(); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DELETE)); inventory.setItem(4, simulatorGroup.toItem(player, clickType -> { - if (simulatorGroup.getMaterial() == null) return; + if (simulatorGroup.getMaterial() == null) + return; new SimulatorMaterialGui(player, simulator, simulatorGroup::getMaterial, simulatorGroup::setMaterial, this).open(); }, clickType -> { })); @@ -87,17 +86,19 @@ public class SimulatorGroupGui extends SimulatorPageGui> { inventory.setItem(48, new SWItem(Material.REPEATER, "§eSettings", clickType -> { new SimulatorGroupSettingsGui(player, simulator, simulatorGroup, this).open(); }).setCustomModelData(CMDs.Simulator.SETTINGS)); - boolean disabled = simulatorGroup.getMaterial() == null ? simulatorGroup.getElements().stream().allMatch(SimulatorElement::isDisabled) : simulatorGroup.isDisabled(); - inventory.setItem(50, new SWItem(disabled ? Material.ENDER_PEARL : Material.ENDER_EYE, simulatorGroup.isDisabled() ? "§cDisabled" : "§aEnabled", clickType -> { - if (simulatorGroup.getMaterial() == null) { - simulatorGroup.getElements().forEach(simulatorElement -> { - simulatorElement.setDisabled(!disabled); - }); - } else { - simulatorGroup.setDisabled(!disabled); - } - SimulatorWatcher.update(simulator); - }).setCustomModelData(CMDs.Simulator.ENABLED_OR_DISABLED)); + boolean disabled = simulatorGroup.getMaterial() == null ? simulatorGroup.getElements().stream().allMatch(SimulatorElement::isDisabled) + : simulatorGroup.isDisabled(); + inventory.setItem(50, + new SWItem(disabled ? Material.ENDER_PEARL : Material.ENDER_EYE, simulatorGroup.isDisabled() ? "§cDisabled" : "§aEnabled", clickType -> { + if (simulatorGroup.getMaterial() == null) { + simulatorGroup.getElements().forEach(simulatorElement -> { + simulatorElement.setDisabled(!disabled); + }); + } else { + simulatorGroup.setDisabled(!disabled); + } + SimulatorRenderer.update(simulator); + }).setCustomModelData(CMDs.Simulator.ENABLED_OR_DISABLED)); } @Override diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupSettingsGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupSettingsGui.java index acb80f2f..9ba30bc8 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupSettingsGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupSettingsGui.java @@ -1,28 +1,26 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2023 SteamWar.de-Serverteam + * Copyright (C) 2023 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see . */ package de.steamwar.bausystem.features.simulator.gui; -import de.steamwar.bausystem.features.simulator.SimulatorWatcher; import de.steamwar.bausystem.features.simulator.data.Simulator; import de.steamwar.bausystem.features.simulator.data.SimulatorGroup; import de.steamwar.bausystem.features.simulator.data.tnt.TNTElement; +import de.steamwar.bausystem.features.simulator.display.SimulatorRenderer; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorAnvilGui; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.data.CMDs; @@ -62,7 +60,8 @@ public class SimulatorGroupSettingsGui extends SimulatorBaseGui { // Material Chooser inventory.setItem(4, simulatorGroup.toItem(player, clickType -> { - if (simulatorGroup.getMaterial() == null) return; + if (simulatorGroup.getMaterial() == null) + return; new SimulatorMaterialGui(player, simulator, simulatorGroup::getMaterial, simulatorGroup::setMaterial, this).open(); }, clickType -> { })); @@ -71,13 +70,14 @@ public class SimulatorGroupSettingsGui extends SimulatorBaseGui { int baseTicks = simulatorGroup.getBaseTick(); inventory.setItem(9, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { simulatorGroup.changeBaseTicks(clickType.isShiftClick() ? 5 : 1); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); SWItem baseTick = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + baseTicks, clickType -> { new SimulatorAnvilGui<>(player, "Ticks", baseTicks + "", Integer::parseInt, integer -> { - if (integer < 0) return false; + if (integer < 0) + return false; simulatorGroup.changeBaseTicks(integer - baseTicks); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).setItem(Material.REPEATER).open(); }); @@ -89,7 +89,7 @@ public class SimulatorGroupSettingsGui extends SimulatorBaseGui { } else { simulatorGroup.changeBaseTicks(clickType.isShiftClick() ? -5 : -1); } - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); boolean allTNT = simulatorGroup.getElements().stream().allMatch(TNTElement.class::isInstance); @@ -97,129 +97,119 @@ public class SimulatorGroupSettingsGui extends SimulatorBaseGui { if (allTNT) { // Subpixel Alignment inventory.setItem(21, new SWItem(Material.SUNFLOWER, "§7Align§8: §eCenter", clickType -> { - simulatorGroup.getElements().stream() - .map(TNTElement.class::cast) - .forEach(tntElement -> { - tntElement.alignX(0); - tntElement.alignZ(0); - }); - SimulatorWatcher.update(simulator); + simulatorGroup.getElements().stream().map(TNTElement.class::cast).forEach(tntElement -> { + tntElement.alignX(0); + tntElement.alignZ(0); + }); + SimulatorRenderer.update(simulator); })); // Z SWItem negativZItem = new SWItem(Material.OAK_BUTTON, "§7Align§8: §eNegativ Z", clickType -> { - simulatorGroup.getElements().stream() - .map(TNTElement.class::cast) - .forEach(tntElement -> { - if (tntElement.getAlignment().getZ() != -1) tntElement.alignZ(-1); - }); - SimulatorWatcher.update(simulator); + simulatorGroup.getElements().stream().map(TNTElement.class::cast).forEach(tntElement -> { + if (tntElement.getAlignment().getZ() != -1) + tntElement.alignZ(-1); + }); + SimulatorRenderer.update(simulator); }); - negativZItem.setEnchanted(simulatorGroup.getElements().stream() - .map(TNTElement.class::cast) - .allMatch(tntElement -> tntElement.getAlignment().getZ() == -1)); + negativZItem.setEnchanted( + simulatorGroup.getElements().stream().map(TNTElement.class::cast).allMatch(tntElement -> tntElement.getAlignment().getZ() == -1)); inventory.setItem(20, negativZItem); SWItem positivZItem = new SWItem(Material.OAK_BUTTON, "§7Align§8: §ePositiv Z", clickType -> { - simulatorGroup.getElements().stream() - .map(TNTElement.class::cast) - .forEach(tntElement -> { - if (tntElement.getAlignment().getZ() != 1) tntElement.alignZ(1); - }); - SimulatorWatcher.update(simulator); + simulatorGroup.getElements().stream().map(TNTElement.class::cast).forEach(tntElement -> { + if (tntElement.getAlignment().getZ() != 1) + tntElement.alignZ(1); + }); + SimulatorRenderer.update(simulator); }); - positivZItem.setEnchanted(simulatorGroup.getElements().stream() - .map(TNTElement.class::cast) - .allMatch(tntElement -> tntElement.getAlignment().getZ() == 1)); + positivZItem.setEnchanted( + simulatorGroup.getElements().stream().map(TNTElement.class::cast).allMatch(tntElement -> tntElement.getAlignment().getZ() == 1)); inventory.setItem(22, positivZItem); // X SWItem negativXItem = new SWItem(Material.STONE_BUTTON, "§7Align§8: §eNegativ X", clickType -> { - simulatorGroup.getElements().stream() - .map(TNTElement.class::cast) - .forEach(tntElement -> { - if (tntElement.getAlignment().getX() != -1) tntElement.alignX(-1); - }); + simulatorGroup.getElements().stream().map(TNTElement.class::cast).forEach(tntElement -> { + if (tntElement.getAlignment().getX() != -1) + tntElement.alignX(-1); + }); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }); - negativXItem.setEnchanted(simulatorGroup.getElements().stream() - .map(TNTElement.class::cast) - .allMatch(tntElement -> tntElement.getAlignment().getX() == -1)); + negativXItem.setEnchanted( + simulatorGroup.getElements().stream().map(TNTElement.class::cast).allMatch(tntElement -> tntElement.getAlignment().getX() == -1)); inventory.setItem(12, negativXItem); - SWItem positivXItem = new SWItem(Material.STONE_BUTTON, "§7Align§8: §ePositiv X", clickType -> { - simulatorGroup.getElements().stream() - .map(TNTElement.class::cast) - .forEach(tntElement -> { - if (tntElement.getAlignment().getX() != 1) tntElement.alignX(1); - }); - SimulatorWatcher.update(simulator); + SWItem positivXItem = new SWItem(Material.STONE_BUTTON, "§7Align§8: §ePositiv X", clickType -> { + simulatorGroup.getElements().stream().map(TNTElement.class::cast).forEach(tntElement -> { + if (tntElement.getAlignment().getX() != 1) + tntElement.alignX(1); + }); + SimulatorRenderer.update(simulator); }); - positivXItem.setEnchanted(simulatorGroup.getElements().stream() - .map(TNTElement.class::cast) - .allMatch(tntElement -> tntElement.getAlignment().getX() == -1)); + positivXItem.setEnchanted( + simulatorGroup.getElements().stream().map(TNTElement.class::cast).allMatch(tntElement -> tntElement.getAlignment().getX() == -1)); inventory.setItem(30, positivXItem); } - //Pos X + // Pos X inventory.setItem(15, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList(allTNT ? "§7Shift§8: §e+0.0625" : "§7Shift§8: §e+5"), false, clickType -> { simulatorGroup.move(clickType.isShiftClick() ? (allTNT ? 0.0625 : 5) : 1, 0, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); inventory.setItem(24, new SWItem(Material.PAPER, "§eX", clickType -> { new SimulatorAnvilGui<>(player, "Relative X", "", Double::parseDouble, number -> { - if(!allTNT){ + if (!allTNT) { number = (double) Math.round(number); } simulatorGroup.move(number, 0, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).setItem(Material.PAPER).open(); })); inventory.setItem(33, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList(allTNT ? "§7Shift§8: §e-0.0625" : "§7Shift§8: §e-5"), false, clickType -> { simulatorGroup.move(clickType.isShiftClick() ? (allTNT ? -0.0625 : -5) : -1, 0, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); - //Pos Y + // Pos Y inventory.setItem(16, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList(allTNT ? "§7Shift§8: §e+0.0625" : "§7Shift§8: §e+5"), false, clickType -> { simulatorGroup.move(0, clickType.isShiftClick() ? (allTNT ? 0.0625 : 5) : 1, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); inventory.setItem(25, new SWItem(Material.PAPER, "§eY", clickType -> { new SimulatorAnvilGui<>(player, "Relative Y", "", Double::parseDouble, number -> { - if(!allTNT){ + if (!allTNT) { number = (double) Math.round(number); } simulatorGroup.move(0, number, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).setItem(Material.PAPER).open(); })); inventory.setItem(34, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList(allTNT ? "§7Shift§8: §e-0.0625" : "§7Shift§8: §e-5"), false, clickType -> { simulatorGroup.move(0, clickType.isShiftClick() ? (allTNT ? -0.0625 : -5) : -1, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.ENABLED_OR_DISABLED)); - //Pos Z + // Pos Z inventory.setItem(17, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList(allTNT ? "§7Shift§8: §e+0.0625" : "§7Shift§8: §e+5"), false, clickType -> { simulatorGroup.move(0, 0, clickType.isShiftClick() ? (allTNT ? 0.0625 : 5) : 1); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); inventory.setItem(26, new SWItem(Material.PAPER, "§eZ", clickType -> { new SimulatorAnvilGui<>(player, "Relative Z", "", Double::parseDouble, number -> { - if(!allTNT){ + if (!allTNT) { number = (double) Math.round(number); } simulatorGroup.move(0, 0, number); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).setItem(Material.PAPER).open(); })); inventory.setItem(35, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList(allTNT ? "§7Shift§8: §e-0.0625" : "§7Shift§8: §e-5"), false, clickType -> { simulatorGroup.move(0, 0, clickType.isShiftClick() ? (allTNT ? -0.0625 : -5) : -1); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGui.java index c53e6613..288719de 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGui.java @@ -1,28 +1,26 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2023 SteamWar.de-Serverteam + * Copyright (C) 2023 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see . */ package de.steamwar.bausystem.features.simulator.gui; -import de.steamwar.bausystem.features.simulator.SimulatorWatcher; import de.steamwar.bausystem.features.simulator.data.Simulator; import de.steamwar.bausystem.features.simulator.data.SimulatorElement; import de.steamwar.bausystem.features.simulator.data.SimulatorGroup; +import de.steamwar.bausystem.features.simulator.display.SimulatorRenderer; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorPageGui; import de.steamwar.data.CMDs; import de.steamwar.inventory.SWItem; @@ -42,8 +40,9 @@ public class SimulatorGui extends SimulatorPageGui { @Override public void headerAndFooter() { - if (simulator.getGroups().removeIf(element -> element.getElements().isEmpty() || element.getElements().stream().allMatch(simulatorElement -> simulatorElement.getPhases().isEmpty()))) { - SimulatorWatcher.update(simulator); + if (simulator.getGroups().removeIf(element -> element.getElements().isEmpty() + || element.getElements().stream().allMatch(simulatorElement -> simulatorElement.getPhases().isEmpty()))) { + SimulatorRenderer.update(simulator); } inventory.setItem(4, simulator.toItem(player, clickType -> { diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorMaterialGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorMaterialGui.java index 5d509a99..50e7cb9f 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorMaterialGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorMaterialGui.java @@ -1,26 +1,24 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2023 SteamWar.de-Serverteam + * Copyright (C) 2023 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see . */ package de.steamwar.bausystem.features.simulator.gui; -import de.steamwar.bausystem.features.simulator.SimulatorWatcher; import de.steamwar.bausystem.features.simulator.data.Simulator; +import de.steamwar.bausystem.features.simulator.display.SimulatorRenderer; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorPageGui; import de.steamwar.data.CMDs; @@ -36,11 +34,8 @@ import java.util.stream.Collectors; public class SimulatorMaterialGui extends SimulatorPageGui { - private static final List MATERIALS = Arrays.stream(Material.values()) - .filter(material -> !material.isAir()) - .filter(material -> !material.isLegacy()) - .filter(Material::isItem) - .collect(Collectors.toList()); + private static final List MATERIALS = Arrays.stream(Material.values()).filter(material -> !material.isAir()) + .filter(material -> !material.isLegacy()).filter(Material::isItem).collect(Collectors.toList()); private final Supplier currentMaterial; private Material material; @@ -60,7 +55,7 @@ public class SimulatorMaterialGui extends SimulatorPageGui { return true; } change.accept(player.getItemOnCursor().getType()); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return false; } @@ -81,9 +76,10 @@ public class SimulatorMaterialGui extends SimulatorPageGui { @Override public SWItem convert(Material material) { - return new SWItem(material, "§eNew Material", Arrays.asList(material == this.material ? "§eSelected" : "§eClick to select"), material == this.material, clickType -> { - change.accept(material); - SimulatorWatcher.update(simulator); - }); + return new SWItem(material, "§eNew Material", Arrays.asList(material == this.material ? "§eSelected" : "§eClick to select"), material == this.material, + clickType -> { + change.accept(material); + SimulatorRenderer.update(simulator); + }); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverGui.java index ef41229f..ab180d99 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverGui.java @@ -1,29 +1,27 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2023 SteamWar.de-Serverteam + * Copyright (C) 2023 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see . */ package de.steamwar.bausystem.features.simulator.gui; -import de.steamwar.bausystem.features.simulator.SimulatorWatcher; import de.steamwar.bausystem.features.simulator.data.Simulator; import de.steamwar.bausystem.features.simulator.data.SimulatorGroup; import de.steamwar.bausystem.features.simulator.data.observer.ObserverElement; import de.steamwar.bausystem.features.simulator.data.observer.ObserverPhase; +import de.steamwar.bausystem.features.simulator.display.SimulatorRenderer; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorScrollGui; import de.steamwar.data.CMDs; @@ -60,7 +58,7 @@ public class SimulatorObserverGui extends SimulatorScrollGui { public void headerAndFooter() { if (observer.getPhases().isEmpty()) { back.open(); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return; } @@ -87,7 +85,7 @@ public class SimulatorObserverGui extends SimulatorScrollGui { inventory.setItem(8, new SWItem(Material.BARRIER, "§eDelete", clickType -> { observer.getPhases().clear(); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DELETE)); // Material Chooser @@ -101,10 +99,11 @@ public class SimulatorObserverGui extends SimulatorScrollGui { }).setCustomModelData(CMDs.Simulator.SETTINGS)); // Enable/Disable - inventory.setItem(48, new SWItem(observer.isDisabled() ? Material.ENDER_PEARL : Material.ENDER_EYE, observer.isDisabled() ? "§cDisabled" : "§aEnabled", clickType -> { - observer.setDisabled(!observer.isDisabled()); - SimulatorWatcher.update(simulator); - }).setCustomModelData(CMDs.Simulator.ENABLED_OR_DISABLED)); + inventory.setItem(48, + new SWItem(observer.isDisabled() ? Material.ENDER_PEARL : Material.ENDER_EYE, observer.isDisabled() ? "§cDisabled" : "§aEnabled", clickType -> { + observer.setDisabled(!observer.isDisabled()); + SimulatorRenderer.update(simulator); + }).setCustomModelData(CMDs.Simulator.ENABLED_OR_DISABLED)); // Group chooser inventory.setItem(51, new SWItem(Material.LEAD, "§eJoin Group", clickType -> { @@ -139,7 +138,7 @@ public class SimulatorObserverGui extends SimulatorScrollGui { SWItem observer = new SWItem(Material.OBSERVER, "§eObserver", lore, false, clickType -> { if (clickType == ClickType.MIDDLE) { this.observer.getPhases().remove(observerPhase); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); } else { new SimulatorObserverPhaseSettingsGui(player, simulator, this.observer, observerPhase, this).open(); } @@ -148,42 +147,35 @@ public class SimulatorObserverGui extends SimulatorScrollGui { Supplier getter = observerPhase::getTickOffset; Consumer setter = observerPhase::setTickOffset; - return new SWItem[] { - new SWItem(SWItem.getDye(getter.get() < max ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { - setter.accept(Math.min(max, getter.get() + (clickType.isShiftClick() ? 5 : 1))); - SimulatorWatcher.update(simulator); - }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED), - observer, + return new SWItem[] {new SWItem(SWItem.getDye(getter.get() < max ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { + setter.accept(Math.min(max, getter.get() + (clickType.isShiftClick() ? 5 : 1))); + SimulatorRenderer.update(simulator); + }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED), observer, new SWItem(SWItem.getDye(getter.get() > min ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8:§e -5"), false, clickType -> { setter.accept(Math.max(min, getter.get() - (clickType.isShiftClick() ? 5 : 1))); - SimulatorWatcher.update(simulator); - }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED), - new SWItem(Material.ANVIL, "§eEdit Activation", clickType -> { + SimulatorRenderer.update(simulator); + }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED), new SWItem(Material.ANVIL, "§eEdit Activation", clickType -> { new SimulatorObserverPhaseSettingsGui(player, simulator, this.observer, observerPhase, this).open(); - }).setCustomModelData(CMDs.Simulator.EDIT_ACTIVATION), - }; + }).setCustomModelData(CMDs.Simulator.EDIT_ACTIVATION),}; } @Override public SWItem[] lastColumn() { - return new SWItem[]{ - new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { - addNewPhase(clickType.isShiftClick()); - }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED), - new SWItem(Material.QUARTZ, "§eObserver§8:§a New Phase", clickType -> { - addNewPhase(false); - }).setCustomModelData(CMDs.Simulator.NEW_PHASE), - new SWItem(SWItem.getDye(8), "§7", clickType -> { - }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED), - }; + return new SWItem[] {new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { + addNewPhase(clickType.isShiftClick()); + }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED), new SWItem(Material.QUARTZ, "§eObserver§8:§a New Phase", clickType -> { + addNewPhase(false); + }).setCustomModelData(CMDs.Simulator.NEW_PHASE), new SWItem(SWItem.getDye(8), "§7", clickType -> { + }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED),}; } private void addNewPhase(boolean shift) { ObserverPhase lastElement = observer.getPhases().get(observer.getPhases().size() - 1); ObserverPhase newPhase = new ObserverPhase(lastElement.getTickOffset() + 4); - if (shift) newPhase.setTickOffset(newPhase.getTickOffset() + 5); + if (shift) + newPhase.setTickOffset(newPhase.getTickOffset() + 5); scroll += 2; observer.add(newPhase); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverPhaseSettingsGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverPhaseSettingsGui.java index 503d5957..be3b3458 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverPhaseSettingsGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverPhaseSettingsGui.java @@ -1,29 +1,27 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2023 SteamWar.de-Serverteam + * Copyright (C) 2023 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see . */ package de.steamwar.bausystem.features.simulator.gui; -import de.steamwar.bausystem.features.simulator.SimulatorWatcher; import de.steamwar.bausystem.features.simulator.data.Simulator; import de.steamwar.bausystem.features.simulator.data.SimulatorPhase; import de.steamwar.bausystem.features.simulator.data.observer.ObserverElement; import de.steamwar.bausystem.features.simulator.data.observer.ObserverPhase; +import de.steamwar.bausystem.features.simulator.display.SimulatorRenderer; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorAnvilGui; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.core.Core; @@ -41,7 +39,8 @@ public class SimulatorObserverPhaseSettingsGui extends SimulatorBaseGui { private final ObserverPhase observer; private final SimulatorBaseGui back; - public SimulatorObserverPhaseSettingsGui(Player player, Simulator simulator, ObserverElement observerElement, ObserverPhase observer, SimulatorBaseGui back) { + public SimulatorObserverPhaseSettingsGui(Player player, Simulator simulator, ObserverElement observerElement, ObserverPhase observer, + SimulatorBaseGui back) { super(player, simulator, 5 * 9); this.observerElement = observerElement; this.observer = observer; @@ -74,7 +73,7 @@ public class SimulatorObserverPhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(8, new SWItem(Material.BARRIER, "§eDelete", clickType -> { observerElement.getPhases().remove(observer); back.open(); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DELETE)); int index = observerElement.getPhases().indexOf(observer); @@ -94,18 +93,19 @@ public class SimulatorObserverPhaseSettingsGui extends SimulatorBaseGui { max = Integer.MAX_VALUE - 4; } - //Tick Offset + // Tick Offset int offset = observer.getTickOffset(); inventory.setItem(10, new SWItem(SWItem.getDye(offset < max ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { observer.setTickOffset(Math.min(max, offset + (clickType.isShiftClick() ? 5 : 1))); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); SWItem offsetItem = new SWItem(Material.REPEATER, "§eStart at§8:§7 " + offset, clickType -> { new SimulatorAnvilGui<>(player, "Start at", offset + "", Integer::parseInt, integer -> { - if (integer < 0) return false; + if (integer < 0) + return false; observer.setTickOffset(Math.min(Math.max(integer, min), max)); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).setItem(Material.REPEATER).open(); }); @@ -114,60 +114,66 @@ public class SimulatorObserverPhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(28, new SWItem(SWItem.getDye(offset > min ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { observer.setTickOffset(Math.max(min, offset - (clickType.isShiftClick() ? 5 : 1))); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); - //Order + // Order int order = observer.getOrder(); - inventory.setItem(13, new SWItem(SWItem.getDye(order < SimulatorPhase.ORDER_LIMIT ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { - observer.setOrder(Math.min(SimulatorPhase.ORDER_LIMIT, order + (clickType.isShiftClick() ? 5 : 1))); - SimulatorWatcher.update(simulator); - }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); + inventory.setItem(13, + new SWItem(SWItem.getDye(order < SimulatorPhase.ORDER_LIMIT ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + observer.setOrder(Math.min(SimulatorPhase.ORDER_LIMIT, order + (clickType.isShiftClick() ? 5 : 1))); + SimulatorRenderer.update(simulator); + }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); Material negativeNumbers = Material.getMaterial(Core.getVersion() >= 19 ? "RECOVERY_COMPASS" : "FIREWORK_STAR"); SWItem orderItem = new SWItem(order >= 0 ? Material.COMPASS : negativeNumbers, "§eActivation Order§8:§7 " + order, clickType -> { new SimulatorAnvilGui<>(player, "Activation Order", order + "", Integer::parseInt, integer -> { - if (integer < -SimulatorPhase.ORDER_LIMIT) return false; - if (integer > SimulatorPhase.ORDER_LIMIT) return false; + if (integer < -SimulatorPhase.ORDER_LIMIT) + return false; + if (integer > SimulatorPhase.ORDER_LIMIT) + return false; observer.setOrder(integer); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).setItem(order >= 0 ? Material.COMPASS : negativeNumbers).open(); }); orderItem.getItemStack().setAmount(Math.max(1, Math.min(Math.abs(order), 30))); inventory.setItem(22, orderItem); - inventory.setItem(31, new SWItem(SWItem.getDye(order > -SimulatorPhase.ORDER_LIMIT ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { - observer.setOrder(Math.max(-SimulatorPhase.ORDER_LIMIT, order - (clickType.isShiftClick() ? 5 : 1))); - SimulatorWatcher.update(simulator); - }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); + inventory.setItem(31, + new SWItem(SWItem.getDye(order > -SimulatorPhase.ORDER_LIMIT ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + observer.setOrder(Math.max(-SimulatorPhase.ORDER_LIMIT, order - (clickType.isShiftClick() ? 5 : 1))); + SimulatorRenderer.update(simulator); + }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); // Update orientation inventory.setItem(25, new SWItem(Material.SUNFLOWER, "§7", clickType -> { })); inventory.setItem(15, new SWItem(observer.getOrientation() == BlockFace.UP ? Material.LIME_CONCRETE : Material.GRAY_CONCRETE, "§eUp", clickType -> { observer.setOrientation(BlockFace.UP); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); })); inventory.setItem(33, new SWItem(observer.getOrientation() == BlockFace.DOWN ? Material.RED_CONCRETE : Material.GRAY_CONCRETE, "§eDown", clickType -> { observer.setOrientation(BlockFace.DOWN); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); })); inventory.setItem(16, new SWItem(observer.getOrientation() == BlockFace.NORTH ? Material.LIME_WOOL : Material.GRAY_WOOL, "§eNorth", clickType -> { observer.setOrientation(BlockFace.NORTH); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); })); inventory.setItem(34, new SWItem(observer.getOrientation() == BlockFace.SOUTH ? Material.RED_WOOL : Material.GRAY_WOOL, "§eSouth", clickType -> { observer.setOrientation(BlockFace.SOUTH); - SimulatorWatcher.update(simulator); - })); - inventory.setItem(24, new SWItem(observer.getOrientation() == BlockFace.EAST ? Material.LIME_STAINED_GLASS : Material.GRAY_STAINED_GLASS, "§eEast", clickType -> { - observer.setOrientation(BlockFace.EAST); - SimulatorWatcher.update(simulator); - })); - inventory.setItem(26, new SWItem(observer.getOrientation() == BlockFace.WEST ? Material.RED_STAINED_GLASS : Material.GRAY_STAINED_GLASS, "§eWest", clickType -> { - observer.setOrientation(BlockFace.WEST); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); })); + inventory.setItem(24, + new SWItem(observer.getOrientation() == BlockFace.EAST ? Material.LIME_STAINED_GLASS : Material.GRAY_STAINED_GLASS, "§eEast", clickType -> { + observer.setOrientation(BlockFace.EAST); + SimulatorRenderer.update(simulator); + })); + inventory.setItem(26, + new SWItem(observer.getOrientation() == BlockFace.WEST ? Material.RED_STAINED_GLASS : Material.GRAY_STAINED_GLASS, "§eWest", clickType -> { + observer.setOrientation(BlockFace.WEST); + SimulatorRenderer.update(simulator); + })); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverSettingsGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverSettingsGui.java index 1abfc090..215826d6 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverSettingsGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverSettingsGui.java @@ -1,27 +1,25 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2023 SteamWar.de-Serverteam + * Copyright (C) 2023 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see . */ package de.steamwar.bausystem.features.simulator.gui; -import de.steamwar.bausystem.features.simulator.SimulatorWatcher; import de.steamwar.bausystem.features.simulator.data.Simulator; import de.steamwar.bausystem.features.simulator.data.observer.ObserverElement; +import de.steamwar.bausystem.features.simulator.display.SimulatorRenderer; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorAnvilGui; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.data.CMDs; @@ -68,13 +66,14 @@ public class SimulatorObserverSettingsGui extends SimulatorBaseGui { int baseTicks = observer.getBaseTick(); inventory.setItem(9, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { observer.changeBaseTicks(clickType.isShiftClick() ? 5 : 1); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); SWItem baseTick = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + baseTicks, clickType -> { new SimulatorAnvilGui<>(player, "Ticks", baseTicks + "", Integer::parseInt, integer -> { - if (integer < 0) return false; + if (integer < 0) + return false; observer.changeBaseTicks(integer - baseTicks); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).setItem(Material.REPEATER).open(); }); @@ -86,58 +85,58 @@ public class SimulatorObserverSettingsGui extends SimulatorBaseGui { } else { observer.changeBaseTicks(clickType.isShiftClick() ? -5 : -1); } - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); - //Pos X - inventory.setItem(15, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + // Pos X + inventory.setItem(15, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { observer.move(clickType.isShiftClick() ? 5 : 1, 0, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); inventory.setItem(24, new SWItem(Material.PAPER, "§eX§8:§7 " + observer.getPosition().getBlockX(), clickType -> { new SimulatorAnvilGui<>(player, "X", observer.getPosition().getBlockX() + "", Integer::parseInt, i -> { observer.getPosition().setX(i); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).open(); })); inventory.setItem(33, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { observer.move(clickType.isShiftClick() ? -5 : -1, 0, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); - //Pos Y + // Pos Y inventory.setItem(16, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { observer.move(0, clickType.isShiftClick() ? 5 : 1, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.ENABLED_OR_DISABLED)); inventory.setItem(25, new SWItem(Material.PAPER, "§eY§8:§7 " + observer.getPosition().getBlockY(), clickType -> { new SimulatorAnvilGui<>(player, "Y", observer.getPosition().getBlockY() + "", Integer::parseInt, i -> { observer.getPosition().setY(i); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).open(); })); inventory.setItem(34, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { observer.move(0, clickType.isShiftClick() ? -5 : -1, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); - //Pos Z + // Pos Z inventory.setItem(17, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { observer.move(0, 0, clickType.isShiftClick() ? 5 : 1); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.ENABLED_OR_DISABLED)); inventory.setItem(26, new SWItem(Material.PAPER, "§eZ§8:§7 " + observer.getPosition().getBlockZ(), clickType -> { new SimulatorAnvilGui<>(player, "Z", observer.getPosition().getBlockZ() + "", Integer::parseInt, i -> { observer.getPosition().setZ(i); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).open(); })); inventory.setItem(35, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { observer.move(0, 0, clickType.isShiftClick() ? -5 : -1); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneGui.java index 29589b8e..382c3ee7 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneGui.java @@ -1,29 +1,27 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2023 SteamWar.de-Serverteam + * Copyright (C) 2023 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see . */ package de.steamwar.bausystem.features.simulator.gui; -import de.steamwar.bausystem.features.simulator.SimulatorWatcher; import de.steamwar.bausystem.features.simulator.data.Simulator; import de.steamwar.bausystem.features.simulator.data.SimulatorGroup; import de.steamwar.bausystem.features.simulator.data.redstone.RedstoneElement; import de.steamwar.bausystem.features.simulator.data.redstone.RedstonePhase; +import de.steamwar.bausystem.features.simulator.display.SimulatorRenderer; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorScrollGui; import de.steamwar.data.CMDs; @@ -61,7 +59,7 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { redstone.getPhases().clear(); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DELETE)); // Material Chooser @@ -107,10 +105,11 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { - redstone.setDisabled(!redstone.isDisabled()); - SimulatorWatcher.update(simulator); - }).setCustomModelData(CMDs.Simulator.ENABLED_OR_DISABLED)); + inventory.setItem(48, + new SWItem(redstone.isDisabled() ? Material.ENDER_PEARL : Material.ENDER_EYE, redstone.isDisabled() ? "§cDisabled" : "§aEnabled", clickType -> { + redstone.setDisabled(!redstone.isDisabled()); + SimulatorRenderer.update(simulator); + }).setCustomModelData(CMDs.Simulator.ENABLED_OR_DISABLED)); // Group chooser inventory.setItem(51, new SWItem(Material.LEAD, "§eJoin Group", clickType -> { @@ -151,55 +150,49 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { - if (clickType == ClickType.MIDDLE) { - this.redstone.getPhases().remove(redstoneSubPhase.phase); - SimulatorWatcher.update(simulator); - } else { - new SimulatorRedstonePhaseSettingsGui(player, simulator, this.redstone, redstoneSubPhase.phase, this).open(); - } - }); + SWItem redstone = new SWItem(redstoneSubPhase.place ? Material.REDSTONE_BLOCK : Material.STONE, redstoneSubPhase.place ? "§eActivate" : "§eDeactivate", + lore, false, clickType -> { + if (clickType == ClickType.MIDDLE) { + this.redstone.getPhases().remove(redstoneSubPhase.phase); + SimulatorRenderer.update(simulator); + } else { + new SimulatorRedstonePhaseSettingsGui(player, simulator, this.redstone, redstoneSubPhase.phase, this).open(); + } + }); redstone.getItemStack().setAmount(Math.max(1, Math.min(time, 64))); Supplier getter = redstoneSubPhase.place ? redstoneSubPhase.phase::getTickOffset : redstoneSubPhase.phase::getLifetime; Consumer setter = redstoneSubPhase.place ? redstoneSubPhase.phase::setTickOffset : redstoneSubPhase.phase::setLifetime; - return new SWItem[] { - new SWItem(SWItem.getDye(getter.get() < max ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { - setter.accept(Math.min(max, getter.get() + (clickType.isShiftClick() ? 5 : 1))); - SimulatorWatcher.update(simulator); - }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED), - redstone, + return new SWItem[] {new SWItem(SWItem.getDye(getter.get() < max ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { + setter.accept(Math.min(max, getter.get() + (clickType.isShiftClick() ? 5 : 1))); + SimulatorRenderer.update(simulator); + }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED), redstone, new SWItem(SWItem.getDye(getter.get() > min ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8:§e -5"), false, clickType -> { setter.accept(Math.max(min, getter.get() - (clickType.isShiftClick() ? 5 : 1))); - SimulatorWatcher.update(simulator); - }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED), - new SWItem(Material.ANVIL, "§eEdit Activation", clickType -> { + SimulatorRenderer.update(simulator); + }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED), new SWItem(Material.ANVIL, "§eEdit Activation", clickType -> { new SimulatorRedstonePhaseSettingsGui(player, simulator, this.redstone, redstoneSubPhase.phase, this).open(); - }).setCustomModelData(CMDs.Simulator.EDIT_ACTIVATION), - }; + }).setCustomModelData(CMDs.Simulator.EDIT_ACTIVATION),}; } @Override public SWItem[] lastColumn() { - return new SWItem[]{ - new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { - addNewPhase(clickType.isShiftClick()); - }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED), - new SWItem(Material.REDSTONE, "§eRedstone§8:§a New Phase", clickType -> { - addNewPhase(false); - }).setCustomModelData(CMDs.Simulator.NEW_PHASE), - new SWItem(SWItem.getDye(8), "§7", clickType -> { - }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED), - }; + return new SWItem[] {new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { + addNewPhase(clickType.isShiftClick()); + }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED), new SWItem(Material.REDSTONE, "§eRedstone§8:§a New Phase", clickType -> { + addNewPhase(false); + }).setCustomModelData(CMDs.Simulator.NEW_PHASE), new SWItem(SWItem.getDye(8), "§7", clickType -> { + }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED),}; } private void addNewPhase(boolean shift) { RedstonePhase lastElement = redstone.getPhases().get(redstone.getPhases().size() - 1); RedstonePhase newPhase = new RedstonePhase(lastElement.getTickOffset() + lastElement.getLifetime() + 1); - if (shift) newPhase.setTickOffset(newPhase.getTickOffset() + 5); + if (shift) + newPhase.setTickOffset(newPhase.getTickOffset() + 5); scroll += 2; redstone.add(newPhase); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); } @AllArgsConstructor diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java index 6994d4e8..bd80e432 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java @@ -1,29 +1,27 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2023 SteamWar.de-Serverteam + * Copyright (C) 2023 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see . */ package de.steamwar.bausystem.features.simulator.gui; -import de.steamwar.bausystem.features.simulator.SimulatorWatcher; import de.steamwar.bausystem.features.simulator.data.Simulator; import de.steamwar.bausystem.features.simulator.data.SimulatorPhase; import de.steamwar.bausystem.features.simulator.data.redstone.RedstoneElement; import de.steamwar.bausystem.features.simulator.data.redstone.RedstonePhase; +import de.steamwar.bausystem.features.simulator.display.SimulatorRenderer; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorAnvilGui; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.core.Core; @@ -39,7 +37,8 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { private final RedstonePhase redstone; private final SimulatorBaseGui back; - public SimulatorRedstonePhaseSettingsGui(Player player, Simulator simulator, RedstoneElement redstoneElement, RedstonePhase redstone, SimulatorBaseGui back) { + public SimulatorRedstonePhaseSettingsGui(Player player, Simulator simulator, RedstoneElement redstoneElement, RedstonePhase redstone, + SimulatorBaseGui back) { super(player, simulator, 5 * 9); this.redstoneElement = redstoneElement; this.redstone = redstone; @@ -72,7 +71,7 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(8, new SWItem(Material.BARRIER, "§eDelete", clickType -> { redstoneElement.getPhases().remove(redstone); back.open(); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DELETE)); int index = redstoneElement.getPhases().indexOf(redstone); @@ -95,18 +94,19 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { maxOffset = Integer.MAX_VALUE - 5; } - //Tick Offset + // Tick Offset int offset = redstone.getTickOffset(); inventory.setItem(10, new SWItem(SWItem.getDye(offset < maxOffset ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { redstone.setTickOffset(Math.min(maxOffset, offset + (clickType.isShiftClick() ? 5 : 1))); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); SWItem offsetItem = new SWItem(Material.REPEATER, "§eStart at§8:§7 " + offset, clickType -> { new SimulatorAnvilGui<>(player, "Start at", offset + "", Integer::parseInt, integer -> { - if (integer < 0) return false; + if (integer < 0) + return false; redstone.setTickOffset(Math.min(Math.max(integer, min), maxOffset)); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).setItem(Material.REPEATER).open(); }); @@ -115,21 +115,22 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(28, new SWItem(SWItem.getDye(offset > min ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { redstone.setTickOffset(Math.max(min, offset - (clickType.isShiftClick() ? 5 : 1))); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); - //Lifetime + // Lifetime int lifetime = redstone.getLifetime(); inventory.setItem(11, new SWItem(SWItem.getDye(lifetime < maxLifetime ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { redstone.setLifetime(Math.min(maxLifetime, lifetime + (clickType.isShiftClick() ? 5 : 1))); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); SWItem lifetimeItem = new SWItem(Material.CLOCK, "§eActivation Time§8:§7 " + lifetime, clickType -> { new SimulatorAnvilGui<>(player, "Activation Time", lifetime + "", Integer::parseInt, integer -> { - if (integer < 0) return false; + if (integer < 0) + return false; redstone.setLifetime(Math.min(integer, maxLifetime)); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).setItem(Material.CLOCK).open(); }); @@ -138,32 +139,36 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(29, new SWItem(SWItem.getDye(lifetime > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { redstone.setLifetime(Math.max(0, lifetime - (clickType.isShiftClick() ? 5 : 1))); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); - //Order + // Order int order = redstone.getOrder(); - inventory.setItem(13, new SWItem(SWItem.getDye(order < SimulatorPhase.ORDER_LIMIT ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { - redstone.setOrder(Math.min(SimulatorPhase.ORDER_LIMIT, order + (clickType.isShiftClick() ? 5 : 1))); - SimulatorWatcher.update(simulator); - }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); + inventory.setItem(13, + new SWItem(SWItem.getDye(order < SimulatorPhase.ORDER_LIMIT ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + redstone.setOrder(Math.min(SimulatorPhase.ORDER_LIMIT, order + (clickType.isShiftClick() ? 5 : 1))); + SimulatorRenderer.update(simulator); + }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); Material negativeNumbers = Material.getMaterial(Core.getVersion() >= 19 ? "RECOVERY_COMPASS" : "FIREWORK_STAR"); SWItem orderItem = new SWItem(order >= 0 ? Material.COMPASS : negativeNumbers, "§eActivation Order§8:§7 " + order, clickType -> { new SimulatorAnvilGui<>(player, "Activation Order", order + "", Integer::parseInt, integer -> { - if (integer < -SimulatorPhase.ORDER_LIMIT) return false; - if (integer > SimulatorPhase.ORDER_LIMIT) return false; + if (integer < -SimulatorPhase.ORDER_LIMIT) + return false; + if (integer > SimulatorPhase.ORDER_LIMIT) + return false; redstone.setOrder(integer); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).setItem(order >= 0 ? Material.COMPASS : negativeNumbers).open(); }); orderItem.getItemStack().setAmount(Math.max(1, Math.min(Math.abs(order), 30))); inventory.setItem(22, orderItem); - inventory.setItem(31, new SWItem(SWItem.getDye(order > -SimulatorPhase.ORDER_LIMIT ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { - redstone.setOrder(Math.max(-SimulatorPhase.ORDER_LIMIT, order - (clickType.isShiftClick() ? 5 : 1))); - SimulatorWatcher.update(simulator); - }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); + inventory.setItem(31, + new SWItem(SWItem.getDye(order > -SimulatorPhase.ORDER_LIMIT ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + redstone.setOrder(Math.max(-SimulatorPhase.ORDER_LIMIT, order - (clickType.isShiftClick() ? 5 : 1))); + SimulatorRenderer.update(simulator); + }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneSettingsGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneSettingsGui.java index 629e2aa5..816bce7d 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneSettingsGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneSettingsGui.java @@ -1,27 +1,25 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2023 SteamWar.de-Serverteam + * Copyright (C) 2023 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see . */ package de.steamwar.bausystem.features.simulator.gui; -import de.steamwar.bausystem.features.simulator.SimulatorWatcher; import de.steamwar.bausystem.features.simulator.data.Simulator; import de.steamwar.bausystem.features.simulator.data.redstone.RedstoneElement; +import de.steamwar.bausystem.features.simulator.display.SimulatorRenderer; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorAnvilGui; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.data.CMDs; @@ -67,13 +65,14 @@ public class SimulatorRedstoneSettingsGui extends SimulatorBaseGui { int baseTicks = redstone.getBaseTick(); inventory.setItem(9, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { redstone.changeBaseTicks(clickType.isShiftClick() ? 5 : 1); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); SWItem baseTick = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + baseTicks, clickType -> { new SimulatorAnvilGui<>(player, "Ticks", baseTicks + "", Integer::parseInt, integer -> { - if (integer < 0) return false; + if (integer < 0) + return false; redstone.changeBaseTicks(integer - baseTicks); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).setItem(Material.REPEATER).open(); }); @@ -85,58 +84,58 @@ public class SimulatorRedstoneSettingsGui extends SimulatorBaseGui { } else { redstone.changeBaseTicks(clickType.isShiftClick() ? -5 : -1); } - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); - //Pos X + // Pos X inventory.setItem(15, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { redstone.move(clickType.isShiftClick() ? 5 : 1, 0, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); inventory.setItem(24, new SWItem(Material.PAPER, "§eX§8:§7 " + redstone.getPosition().getBlockX(), clickType -> { new SimulatorAnvilGui<>(player, "X", redstone.getPosition().getBlockX() + "", Integer::parseInt, i -> { redstone.getPosition().setX(i); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).open(); })); inventory.setItem(33, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { redstone.move(clickType.isShiftClick() ? -5 : -1, 0, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); - //Pos Y + // Pos Y inventory.setItem(16, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { redstone.move(0, clickType.isShiftClick() ? 5 : 1, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); inventory.setItem(25, new SWItem(Material.PAPER, "§eY§8:§7 " + redstone.getPosition().getBlockY(), clickType -> { new SimulatorAnvilGui<>(player, "Y", redstone.getPosition().getBlockY() + "", Integer::parseInt, i -> { redstone.getPosition().setY(i); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).open(); })); inventory.setItem(34, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { redstone.move(0, clickType.isShiftClick() ? -5 : -1, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); - //Pos Z + // Pos Z inventory.setItem(17, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { redstone.move(0, 0, clickType.isShiftClick() ? 5 : 1); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); inventory.setItem(26, new SWItem(Material.PAPER, "§eZ§8:§7 " + redstone.getPosition().getBlockZ(), clickType -> { new SimulatorAnvilGui<>(player, "Z", redstone.getPosition().getBlockZ() + "", Integer::parseInt, i -> { redstone.getPosition().setZ(i); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).open(); })); inventory.setItem(35, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { redstone.move(0, 0, clickType.isShiftClick() ? -5 : -1); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorSettingsGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorSettingsGui.java index b69ca41b..dd1725c1 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorSettingsGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorSettingsGui.java @@ -1,26 +1,24 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2023 SteamWar.de-Serverteam + * Copyright (C) 2023 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see . */ package de.steamwar.bausystem.features.simulator.gui; -import de.steamwar.bausystem.features.simulator.SimulatorWatcher; import de.steamwar.bausystem.features.simulator.data.Simulator; +import de.steamwar.bausystem.features.simulator.display.SimulatorRenderer; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.data.CMDs; import de.steamwar.inventory.SWItem; @@ -55,50 +53,52 @@ public class SimulatorSettingsGui extends SimulatorBaseGui { new SimulatorMaterialGui(player, simulator, simulator::getMaterial, simulator::setMaterial, this).open(); })); - //AutoTrace - inventory.setItem(19, new SWItem(simulator.isAutoTrace() ? Material.CHAIN_COMMAND_BLOCK : Material.COMMAND_BLOCK, "§eAutoTrace§8: " + (simulator.isAutoTrace() ? "§aOn" : "§cOff"), clickType -> { - simulator.setAutoTrace(!simulator.isAutoTrace()); - SimulatorWatcher.update(simulator); - })); - inventory.setItem(20, new SWItem(simulator.isAutoTestblock() ? Material.END_STONE : Material.BARRIER, "§eTestblock§8: " + (simulator.isAutoTestblock() ? "§aOn" : "§cOff"), clickType -> { - simulator.setAutoTestblock(!simulator.isAutoTestblock()); - SimulatorWatcher.update(simulator); - })); + // AutoTrace + inventory.setItem(19, new SWItem(simulator.isAutoTrace() ? Material.CHAIN_COMMAND_BLOCK : Material.COMMAND_BLOCK, + "§eAutoTrace§8: " + (simulator.isAutoTrace() ? "§aOn" : "§cOff"), clickType -> { + simulator.setAutoTrace(!simulator.isAutoTrace()); + SimulatorRenderer.update(simulator); + })); + inventory.setItem(20, new SWItem(simulator.isAutoTestblock() ? Material.END_STONE : Material.BARRIER, + "§eTestblock§8: " + (simulator.isAutoTestblock() ? "§aOn" : "§cOff"), clickType -> { + simulator.setAutoTestblock(!simulator.isAutoTestblock()); + SimulatorRenderer.update(simulator); + })); - //Pos X + // Pos X inventory.setItem(15, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { simulator.move(clickType.isShiftClick() ? 5 : 1, 0, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); inventory.setItem(24, new SWItem(Material.PAPER, "§eX", clickType -> { })); inventory.setItem(33, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { simulator.move(clickType.isShiftClick() ? -5 : -1, 0, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); - //Pos Y + // Pos Y inventory.setItem(16, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { simulator.move(0, clickType.isShiftClick() ? 5 : 1, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); inventory.setItem(25, new SWItem(Material.PAPER, "§eY", clickType -> { })); inventory.setItem(34, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { simulator.move(0, clickType.isShiftClick() ? -5 : -1, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); - //Pos Z + // Pos Z inventory.setItem(17, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { simulator.move(0, 0, clickType.isShiftClick() ? 5 : 1); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); inventory.setItem(26, new SWItem(Material.PAPER, "§eZ", clickType -> { })); inventory.setItem(35, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { simulator.move(0, 0, clickType.isShiftClick() ? -5 : -1); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTGui.java index 471270c9..cacda08f 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTGui.java @@ -1,29 +1,27 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2023 SteamWar.de-Serverteam + * Copyright (C) 2023 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see . */ package de.steamwar.bausystem.features.simulator.gui; -import de.steamwar.bausystem.features.simulator.SimulatorWatcher; import de.steamwar.bausystem.features.simulator.data.Simulator; import de.steamwar.bausystem.features.simulator.data.SimulatorGroup; import de.steamwar.bausystem.features.simulator.data.tnt.TNTElement; import de.steamwar.bausystem.features.simulator.data.tnt.TNTPhase; +import de.steamwar.bausystem.features.simulator.display.SimulatorRenderer; import de.steamwar.bausystem.features.simulator.execute.SimulatorStabGenerator; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorAnvilGui; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; @@ -60,7 +58,7 @@ public class SimulatorTNTGui extends SimulatorScrollGui { public void headerAndFooter() { if (tnt.getPhases().isEmpty()) { back.open(); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return; } @@ -87,7 +85,7 @@ public class SimulatorTNTGui extends SimulatorScrollGui { inventory.setItem(8, new SWItem(Material.BARRIER, "§eDelete", clickType -> { tnt.getPhases().clear(); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DELETE)); // Material Chooser @@ -98,16 +96,18 @@ public class SimulatorTNTGui extends SimulatorScrollGui { inventory.setItem(47, new SWItem(Material.REPEATER, "§eSettings", clickType -> { new SimulatorTNTSettingsGui(player, simulator, tnt, this).open(); }).setCustomModelData(CMDs.Simulator.SETTINGS)); - inventory.setItem(48, new SWItem(tnt.isDisabled() ? Material.ENDER_PEARL : Material.ENDER_EYE, tnt.isDisabled() ? "§cDisabled" : "§aEnabled", clickType -> { - tnt.setDisabled(!tnt.isDisabled()); - SimulatorWatcher.update(simulator); - }).setCustomModelData(CMDs.Simulator.ENABLED_OR_DISABLED)); + inventory.setItem(48, + new SWItem(tnt.isDisabled() ? Material.ENDER_PEARL : Material.ENDER_EYE, tnt.isDisabled() ? "§cDisabled" : "§aEnabled", clickType -> { + tnt.setDisabled(!tnt.isDisabled()); + SimulatorRenderer.update(simulator); + }).setCustomModelData(CMDs.Simulator.ENABLED_OR_DISABLED)); if (Core.getVersion() > 19) { inventory.setItem(49, new SWItem(Material.CALIBRATED_SCULK_SENSOR, "§eCreate Stab", click -> { new SimulatorAnvilGui<>(player, "Depth Limit", "", Integer::parseInt, depthLimit -> { - if (depthLimit <= 0) return false; + if (depthLimit <= 0) + return false; simulator.setStabGenerator(new SimulatorStabGenerator(Region.getRegion(player.getLocation()), simulator, tnt, depthLimit)); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, null).open(); }).setCustomModelData(CMDs.Simulator.CREATE_STAB)); @@ -117,7 +117,7 @@ public class SimulatorTNTGui extends SimulatorScrollGui { tntElement.add(new TNTPhase()); parent.add(tntElement); new SimulatorGroupGui(player, simulator, parent, new SimulatorGui(player, simulator)).open(); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.MAKE_GROUP)); inventory.setItem(51, new SWItem(Material.LEAD, "§eJoin Group", clickType -> { new SimulatorGroupChooserGui(player, simulator, tnt, tnt.getGroup(simulator), this).open(); @@ -126,52 +126,50 @@ public class SimulatorTNTGui extends SimulatorScrollGui { @Override public SWItem[] column(TNTPhase tntSetting, int index) { - SWItem tnt = new SWItem(Material.TNT, "§eTNT§8:§7 " + tntSetting.getCount(), Arrays.asList("§7Tick§8: §e" + tntSetting.getTickOffset(), "§7Fuse§8:§e " + tntSetting.getLifetime(), "", "§7Order§8:§e " + tntSetting.getOrder(), "", "§7X-Jump§8: " + (tntSetting.isXJump() ? "§aOn" : "§cOff"), "§7Y-Jump§8: " + (tntSetting.isYJump() ? "§aOn" : "§cOff"), "§7Z-Jump§8: " + (tntSetting.isZJump() ? "§aOn" : "§cOff"), "", "§7Click§8:§e Edit", "§7Middle-Click§8:§e Remove"), false, clickType -> { - if (clickType == ClickType.MIDDLE) { - this.tnt.getPhases().remove(tntSetting); - SimulatorWatcher.update(simulator); - } else { - new SimulatorTNTPhaseSettingsGui(player, simulator, this.tnt, tntSetting, this).open(); - } - }); + SWItem tnt = new SWItem(Material.TNT, "§eTNT§8:§7 " + tntSetting.getCount(), + Arrays.asList("§7Tick§8: §e" + tntSetting.getTickOffset(), "§7Fuse§8:§e " + tntSetting.getLifetime(), "", + "§7Order§8:§e " + tntSetting.getOrder(), "", "§7X-Jump§8: " + (tntSetting.isXJump() ? "§aOn" : "§cOff"), + "§7Y-Jump§8: " + (tntSetting.isYJump() ? "§aOn" : "§cOff"), "§7Z-Jump§8: " + (tntSetting.isZJump() ? "§aOn" : "§cOff"), "", + "§7Click§8:§e Edit", "§7Middle-Click§8:§e Remove"), + false, clickType -> { + if (clickType == ClickType.MIDDLE) { + this.tnt.getPhases().remove(tntSetting); + SimulatorRenderer.update(simulator); + } else { + new SimulatorTNTPhaseSettingsGui(player, simulator, this.tnt, tntSetting, this).open(); + } + }); tnt.getItemStack().setAmount(Math.min(tntSetting.getCount(), 64)); - return new SWItem[]{ - new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { - tntSetting.setCount(tntSetting.getCount() + (clickType.isShiftClick() ? 5 : 1)); - SimulatorWatcher.update(simulator); - }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED), - tnt, + return new SWItem[] {new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { + tntSetting.setCount(tntSetting.getCount() + (clickType.isShiftClick() ? 5 : 1)); + SimulatorRenderer.update(simulator); + }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED), tnt, new SWItem(SWItem.getDye(tntSetting.getCount() > 1 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8:§e -5"), false, clickType -> { tntSetting.setCount(Math.max(1, tntSetting.getCount() - (clickType.isShiftClick() ? 5 : 1))); - SimulatorWatcher.update(simulator); - }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED), - new SWItem(Material.ANVIL, "§eEdit Phase", clickType -> { + SimulatorRenderer.update(simulator); + }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED), new SWItem(Material.ANVIL, "§eEdit Phase", clickType -> { new SimulatorTNTPhaseSettingsGui(player, simulator, this.tnt, tntSetting, this).open(); - }).setCustomModelData(CMDs.Simulator.EDIT_ACTIVATION), - }; + }).setCustomModelData(CMDs.Simulator.EDIT_ACTIVATION),}; } @Override public SWItem[] lastColumn() { - return new SWItem[]{ - new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { - addNewPhase(clickType.isShiftClick()); - }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED), - new SWItem(Material.GUNPOWDER, "§eTNT§8:§a New Phase", clickType -> { - addNewPhase(false); - }).setCustomModelData(CMDs.Simulator.NEW_PHASE), - new SWItem(SWItem.getDye(8), "§7", clickType -> { - }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED), - }; + return new SWItem[] {new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { + addNewPhase(clickType.isShiftClick()); + }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED), new SWItem(Material.GUNPOWDER, "§eTNT§8:§a New Phase", clickType -> { + addNewPhase(false); + }).setCustomModelData(CMDs.Simulator.NEW_PHASE), new SWItem(SWItem.getDye(8), "§7", clickType -> { + }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED),}; } private void addNewPhase(boolean shift) { TNTPhase lastElement = tnt.getPhases().get(tnt.getPhases().size() - 1); TNTPhase newPhase = new TNTPhase(lastElement.getTickOffset() + 1); - if (shift) newPhase.setCount(newPhase.getCount() + 5); + if (shift) + newPhase.setCount(newPhase.getCount() + 5); scroll++; tnt.add(newPhase); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java index 5b4775d3..eb84d81f 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java @@ -1,29 +1,27 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2023 SteamWar.de-Serverteam + * Copyright (C) 2023 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see . */ package de.steamwar.bausystem.features.simulator.gui; -import de.steamwar.bausystem.features.simulator.SimulatorWatcher; import de.steamwar.bausystem.features.simulator.data.Simulator; import de.steamwar.bausystem.features.simulator.data.SimulatorPhase; import de.steamwar.bausystem.features.simulator.data.tnt.TNTElement; import de.steamwar.bausystem.features.simulator.data.tnt.TNTPhase; +import de.steamwar.bausystem.features.simulator.display.SimulatorRenderer; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorAnvilGui; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.core.Core; @@ -68,25 +66,26 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { new SimulatorMaterialGui(player, simulator, tntElement::getMaterial, tntElement::setMaterial, this).open(); })); - //Delete + // Delete inventory.setItem(8, new SWItem(Material.BARRIER, "§eDelete", clickType -> { tntElement.getPhases().remove(tnt); back.open(); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DELETE)); - //Count + // Count int count = tnt.getCount(); inventory.setItem(9, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { tnt.setCount(count + (clickType.isShiftClick() ? 5 : 1)); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); SWItem countItem = new SWItem(Material.TNT, "§eCount§8:§7 " + count, clickType -> { new SimulatorAnvilGui<>(player, "Count", count + "", Integer::parseInt, integer -> { - if (integer < 1) return false; + if (integer < 1) + return false; tnt.setCount(integer); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).setItem(Material.TNT).open(); }); @@ -95,21 +94,22 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(27, new SWItem(SWItem.getDye(count > 1 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { tnt.setCount(Math.max(1, count - (clickType.isShiftClick() ? 5 : 1))); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); - //Tick Offset + // Tick Offset int offset = tnt.getTickOffset(); inventory.setItem(10, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { tnt.setTickOffset(offset + (clickType.isShiftClick() ? 5 : 1)); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); SWItem offsetItem = new SWItem(Material.REPEATER, "§eStart at§8:§7 " + offset, clickType -> { new SimulatorAnvilGui<>(player, "Start at", offset + "", Integer::parseInt, integer -> { - if (integer < 0) return false; + if (integer < 0) + return false; tnt.setTickOffset(integer); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).setItem(Material.REPEATER).open(); }); @@ -118,21 +118,22 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(28, new SWItem(SWItem.getDye(offset > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { tnt.setTickOffset(Math.max(0, offset - (clickType.isShiftClick() ? 5 : 1))); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); - //Lifetime + // Lifetime int lifetime = tnt.getLifetime(); inventory.setItem(11, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { tnt.setLifetime(lifetime + (clickType.isShiftClick() ? 5 : 1)); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); SWItem lifetimeItem = new SWItem(Material.CLOCK, "§eLifetime§8:§7 " + lifetime, clickType -> { new SimulatorAnvilGui<>(player, "Lifetime", lifetime + "", Integer::parseInt, integer -> { - if (integer < 1) return false; + if (integer < 1) + return false; tnt.setLifetime(integer); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).setItem(Material.CLOCK).open(); }); @@ -141,56 +142,63 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(29, new SWItem(SWItem.getDye(lifetime > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { tnt.setLifetime(Math.max(1, lifetime - (clickType.isShiftClick() ? 5 : 1))); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); - //Order + // Order int order = tnt.getOrder(); - inventory.setItem(13, new SWItem(SWItem.getDye(order < SimulatorPhase.ORDER_LIMIT ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { - tnt.setOrder(Math.min(SimulatorPhase.ORDER_LIMIT, order + (clickType.isShiftClick() ? 5 : 1))); - SimulatorWatcher.update(simulator); - }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); + inventory.setItem(13, + new SWItem(SWItem.getDye(order < SimulatorPhase.ORDER_LIMIT ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + tnt.setOrder(Math.min(SimulatorPhase.ORDER_LIMIT, order + (clickType.isShiftClick() ? 5 : 1))); + SimulatorRenderer.update(simulator); + }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); Material negativeNumbers = Material.getMaterial(Core.getVersion() >= 19 ? "RECOVERY_COMPASS" : "FIREWORK_STAR"); SWItem orderItem = new SWItem(order >= 0 ? Material.COMPASS : negativeNumbers, "§eCalculation Order§8:§7 " + order, clickType -> { new SimulatorAnvilGui<>(player, "Calculation Order", order + "", Integer::parseInt, integer -> { - if (integer < -SimulatorPhase.ORDER_LIMIT) return false; - if (integer > SimulatorPhase.ORDER_LIMIT) return false; + if (integer < -SimulatorPhase.ORDER_LIMIT) + return false; + if (integer > SimulatorPhase.ORDER_LIMIT) + return false; tnt.setOrder(integer); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).setItem(order >= 0 ? Material.COMPASS : negativeNumbers).open(); }); orderItem.getItemStack().setAmount(Math.max(1, Math.min(Math.abs(order), 30))); inventory.setItem(22, orderItem); - inventory.setItem(31, new SWItem(SWItem.getDye(order > -SimulatorPhase.ORDER_LIMIT ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { - tnt.setOrder(Math.max(-SimulatorPhase.ORDER_LIMIT, order - (clickType.isShiftClick() ? 5 : 1))); - SimulatorWatcher.update(simulator); - }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); + inventory.setItem(31, + new SWItem(SWItem.getDye(order > -SimulatorPhase.ORDER_LIMIT ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + tnt.setOrder(Math.max(-SimulatorPhase.ORDER_LIMIT, order - (clickType.isShiftClick() ? 5 : 1))); + SimulatorRenderer.update(simulator); + }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); - //Jump - SWItem jumpX = new SWItem(tnt.isXJump() ? Material.LIME_WOOL : Material.RED_WOOL, "§7TNT §eJump X§8: " + (tnt.isZJump() ? "§aon" : "§coff"), clickType -> { - tnt.setXJump(!tnt.isXJump()); - SimulatorWatcher.update(simulator); - }); + // Jump + SWItem jumpX = + new SWItem(tnt.isXJump() ? Material.LIME_WOOL : Material.RED_WOOL, "§7TNT §eJump X§8: " + (tnt.isZJump() ? "§aon" : "§coff"), clickType -> { + tnt.setXJump(!tnt.isXJump()); + SimulatorRenderer.update(simulator); + }); inventory.setItem(33, jumpX); - SWItem jumpY = new SWItem(tnt.isYJump() ? Material.LIME_WOOL : Material.RED_WOOL, "§7TNT §eJump Y§8: " + (tnt.isYJump() ? "§aon" : "§coff"), clickType -> { - tnt.setYJump(!tnt.isYJump()); - SimulatorWatcher.update(simulator); - }); + SWItem jumpY = + new SWItem(tnt.isYJump() ? Material.LIME_WOOL : Material.RED_WOOL, "§7TNT §eJump Y§8: " + (tnt.isYJump() ? "§aon" : "§coff"), clickType -> { + tnt.setYJump(!tnt.isYJump()); + SimulatorRenderer.update(simulator); + }); inventory.setItem(16, jumpY); - SWItem jumpZ = new SWItem(tnt.isZJump() ? Material.LIME_WOOL : Material.RED_WOOL, "§7TNT §eJump Z§8: " + (tnt.isZJump() ? "§aon" : "§coff"), clickType -> { - tnt.setZJump(!tnt.isZJump()); - SimulatorWatcher.update(simulator); - }); + SWItem jumpZ = + new SWItem(tnt.isZJump() ? Material.LIME_WOOL : Material.RED_WOOL, "§7TNT §eJump Z§8: " + (tnt.isZJump() ? "§aon" : "§coff"), clickType -> { + tnt.setZJump(!tnt.isZJump()); + SimulatorRenderer.update(simulator); + }); inventory.setItem(35, jumpZ); SWItem jumpAll = new SWItem(Material.TNT, "§7TNT §eJump §8: " + (tnt.hasJump() ? "§aon" : "§coff"), clickType -> { tnt.setJump(!tnt.hasJump()); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }); inventory.setItem(25, jumpAll); } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java index 04a3334e..518f3875 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java @@ -1,27 +1,25 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2023 SteamWar.de-Serverteam + * Copyright (C) 2023 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see . */ package de.steamwar.bausystem.features.simulator.gui; -import de.steamwar.bausystem.features.simulator.SimulatorWatcher; import de.steamwar.bausystem.features.simulator.data.Simulator; import de.steamwar.bausystem.features.simulator.data.tnt.TNTElement; +import de.steamwar.bausystem.features.simulator.display.SimulatorRenderer; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorAnvilGui; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.data.CMDs; @@ -76,13 +74,14 @@ public class SimulatorTNTSettingsGui extends SimulatorBaseGui { int baseTicks = tnt.getBaseTick(); inventory.setItem(9, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { tnt.changeBaseTicks(clickType.isShiftClick() ? 5 : 1); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); SWItem baseTick = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + baseTicks, clickType -> { new SimulatorAnvilGui<>(player, "Ticks", baseTicks + "", Integer::parseInt, integer -> { - if (integer < 0) return false; + if (integer < 0) + return false; tnt.changeBaseTicks(integer - baseTicks); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).setItem(Material.REPEATER).open(); }); @@ -94,42 +93,46 @@ public class SimulatorTNTSettingsGui extends SimulatorBaseGui { } else { tnt.changeBaseTicks(clickType.isShiftClick() ? -5 : -1); } - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); // Subpixel Alignment inventory.setItem(21, new SWItem(Material.SUNFLOWER, "§7Align§8: §eCenter", clickType -> { tnt.alignX(0); tnt.alignZ(0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); })); // Z SWItem negativZItem = new SWItem(Material.OAK_BUTTON, "§7Align§8: §eNegativ Z", clickType -> { - if (tnt.getAlignment().getZ() != -1) tnt.alignZ(-1); - SimulatorWatcher.update(simulator); + if (tnt.getAlignment().getZ() != -1) + tnt.alignZ(-1); + SimulatorRenderer.update(simulator); }); negativZItem.setEnchanted(tnt.getAlignment().getZ() == -1); inventory.setItem(20, negativZItem); SWItem positivZItem = new SWItem(Material.OAK_BUTTON, "§7Align§8: §ePositiv Z", clickType -> { - if (tnt.getAlignment().getZ() != 1) tnt.alignZ(1); - SimulatorWatcher.update(simulator); + if (tnt.getAlignment().getZ() != 1) + tnt.alignZ(1); + SimulatorRenderer.update(simulator); }); positivZItem.setEnchanted(tnt.getAlignment().getZ() == 1); inventory.setItem(22, positivZItem); // X SWItem negativXItem = new SWItem(Material.STONE_BUTTON, "§7Align§8: §eNegativ X", clickType -> { - if (tnt.getAlignment().getX() != -1) tnt.alignX(-1); - SimulatorWatcher.update(simulator); + if (tnt.getAlignment().getX() != -1) + tnt.alignX(-1); + SimulatorRenderer.update(simulator); }); negativXItem.setEnchanted(tnt.getAlignment().getX() == -1); inventory.setItem(12, negativXItem); - SWItem positivXItem = new SWItem(Material.STONE_BUTTON, "§7Align§8: §ePositiv X", clickType -> { - if(tnt.getAlignment().getX() != 1) tnt.alignX(1); - SimulatorWatcher.update(simulator); + SWItem positivXItem = new SWItem(Material.STONE_BUTTON, "§7Align§8: §ePositiv X", clickType -> { + if (tnt.getAlignment().getX() != 1) + tnt.alignX(1); + SimulatorRenderer.update(simulator); }); positivXItem.setEnchanted(tnt.getAlignment().getX() == 1); inventory.setItem(30, positivXItem); @@ -137,52 +140,52 @@ public class SimulatorTNTSettingsGui extends SimulatorBaseGui { // Pos X inventory.setItem(15, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+0.0625"), false, clickType -> { tnt.move(clickType.isShiftClick() ? 0.0625 : 1, 0, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); inventory.setItem(24, new SWItem(Material.PAPER, "§eX§8:§7 " + tnt.getPosition().getX(), clickType -> { new SimulatorAnvilGui<>(player, "X", tnt.getPosition().getX() + "", Double::parseDouble, d -> { tnt.getPosition().setX(d); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).open(); })); inventory.setItem(33, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-0.0625"), false, clickType -> { tnt.move(clickType.isShiftClick() ? -0.0625 : -1, 0, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); // Pos Y inventory.setItem(16, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+0.0625"), false, clickType -> { tnt.move(0, clickType.isShiftClick() ? 0.0625 : 1, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); inventory.setItem(25, new SWItem(Material.PAPER, "§eY§8:§7 " + tnt.getPosition().getY(), clickType -> { new SimulatorAnvilGui<>(player, "Y", tnt.getPosition().getY() + "", Double::parseDouble, d -> { tnt.getPosition().setY(d); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).open(); })); inventory.setItem(34, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-0.0625"), false, clickType -> { tnt.move(0, clickType.isShiftClick() ? -0.0625 : -1, 0); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); // Pos Z inventory.setItem(17, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+0.0625"), false, clickType -> { tnt.move(0, 0, clickType.isShiftClick() ? 0.0625 : 1); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); inventory.setItem(26, new SWItem(Material.PAPER, "§eZ§8:§7 " + tnt.getPosition().getZ(), clickType -> { new SimulatorAnvilGui<>(player, "Z", tnt.getPosition().getZ() + "", Double::parseDouble, d -> { tnt.getPosition().setZ(d); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); return true; }, this).open(); })); inventory.setItem(35, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-0.0625"), false, clickType -> { tnt.move(0, 0, clickType.isShiftClick() ? -0.0625 : -1); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorBaseGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorBaseGui.java index aeb4da13..cfb71868 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorBaseGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorBaseGui.java @@ -1,26 +1,24 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2023 SteamWar.de-Serverteam + * Copyright (C) 2023 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see . */ package de.steamwar.bausystem.features.simulator.gui.base; -import de.steamwar.bausystem.features.simulator.SimulatorWatcher; import de.steamwar.bausystem.features.simulator.data.Simulator; +import de.steamwar.bausystem.features.simulator.display.SimulatorRenderer; import de.steamwar.core.Core; import de.steamwar.inventory.SWInventory; import de.steamwar.inventory.SWItem; @@ -45,7 +43,8 @@ public abstract class SimulatorBaseGui { } public final void open() { - if (!shouldOpen()) return; + if (!shouldOpen()) + return; String newTitle = title(); String originalTitle = player.getOpenInventory().getTitle(); @@ -58,7 +57,6 @@ public abstract class SimulatorBaseGui { setup(); if (player.getOpenInventory().getTopInventory() != inv) { inventory.open(); - SimulatorWatcher.watch(player, simulator, this::open); } if (Core.getVersion() > 19) { player.getOpenInventory().setTitle(title()); @@ -70,7 +68,6 @@ public abstract class SimulatorBaseGui { } if (player.getOpenInventory().getTopInventory() == inv) { inventory.open(); - SimulatorWatcher.watch(player, simulator, this::open); } return; } @@ -82,11 +79,7 @@ public abstract class SimulatorBaseGui { return inv; }); setup(); - inventory.addCloseCallback(clickType -> { - SimulatorWatcher.watch(player, null, null); - }); - SimulatorWatcher.watch(player, simulator, this::open); if (simulator != null && simulator.getStabGenerator() != null) { populateStabGenerator(); } else { @@ -98,7 +91,7 @@ public abstract class SimulatorBaseGui { private void populateStabGenerator() { inventory.setItem(22, new SWItem(Material.BARRIER, "§cCancel Stab Generator", click -> { simulator.getStabGenerator().cancel(); - SimulatorWatcher.update(simulator); + SimulatorRenderer.update(simulator); })); } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/RCursor.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/Cursor.java similarity index 87% rename from BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/RCursor.java rename to BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/Cursor.java index ef475eb3..8199aa3a 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/RCursor.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/Cursor.java @@ -18,11 +18,12 @@ import org.bukkit.util.Vector; import java.util.Comparator; import java.util.List; +import java.util.Optional; import java.util.function.BiFunction; import java.util.function.Predicate; @Getter -public class RCursor { +public abstract class Cursor { private final World WORLD = Bukkit.getWorlds().get(0); private final REntityServer targetServer; @@ -30,7 +31,6 @@ public class RCursor { private final Player owner; private final Material highlightMaterial; - private final ClickHandler onClickHandler; private RFallingBlockEntity cursorEntity; @@ -45,18 +45,17 @@ public class RCursor { - public RCursor(REntityServer targetServer, Player owner, Material highlightMaterial, Material cursorMaterial, List allowedModes, ClickHandler onClickHandler) { + protected Cursor(REntityServer targetServer, Player owner, Material highlightMaterial, Material cursorMaterial, List allowedModes) { this.targetServer = targetServer; this.owner = owner; this.highlightMaterial = highlightMaterial; this.cursorMaterial = cursorMaterial; this.allowedCursorModes = allowedModes; - this.onClickHandler = onClickHandler; cursorServer = new REntityServer(); cursorServer.addPlayer(owner); - RCursorManager.getInstance().registerCursor(this); + CursorManager.getInstance().registerCursor(this); } public void render() { @@ -75,7 +74,8 @@ public class RCursor { Material activeCursorMaterial = hitEntity == null ? cursorMaterial : highlightMaterial; - CursorMode activeCursorMode = allowedCursorModes.stream().filter((mode) -> mode.isActive.test(owner)).min(Comparator.comparingInt(a -> a.priority)).orElse(CursorMode.BLOCK_ALIGNED); + CursorMode activeCursorMode = allowedCursorModes.stream().filter((mode) -> mode.isActive.test(owner)).min(Comparator.comparingInt(a -> a.priority)) + .orElse(CursorMode.BLOCK_ALIGNED); Location activeCursorLocation = hitEntity == null ? activeCursorMode.positionTransform.apply(owner, rayTraceResult).toLocation(WORLD) : new Vector(hitEntity.getX(), hitEntity.getY(), hitEntity.getZ()).toLocation(WORLD); @@ -110,16 +110,16 @@ public class RCursor { visible = true; } - void handleClick(Action action) { - if (!visible || cursorLocation == null) + final void handleClick(Action action) { + if (!visible) return; - onClickHandler.handle(cursorLocation, isHittingEntity, action); + onClick(Optional.ofNullable(this.cursorLocation), isHittingEntity, action); } public void close() { cursorServer.close(); - RCursorManager.getInstance().unregisterCursor(this); + CursorManager.getInstance().unregisterCursor(this); } @AllArgsConstructor @@ -155,7 +155,9 @@ public class RCursor { } return pos; - }, (player) -> player.isSneaking()), BLOCK_ALIGNED(0, (player, rayTraceResult) -> { + }, (player) -> player.isSneaking()), + + BLOCK_ALIGNED(0, (player, rayTraceResult) -> { Vector pos = rayTraceResult.getHitPosition(); BlockFace face = rayTraceResult.getHitBlockFace(); @@ -197,7 +199,5 @@ public class RCursor { private final Predicate isActive; } - public interface ClickHandler { - void handle(Location cursorLocation, boolean didHitEntity, Action action); - } + public abstract void onClick(Optional cursorLocation, boolean didHitEntity, Action action); } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/RCursorManager.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/CursorManager.java similarity index 79% rename from BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/RCursorManager.java rename to BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/CursorManager.java index a67f7bad..3341d930 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/RCursorManager.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/CursorManager.java @@ -20,14 +20,14 @@ import java.util.Set; import java.util.function.BiFunction; @Linked -public class RCursorManager implements Listener { +public class CursorManager implements Listener { @Getter - private static RCursorManager instance; + private static CursorManager instance; private final Set calculationActive = new HashSet<>(); - private final Map> activeCursors = new HashMap<>(); + private final Map> activeCursors = new HashMap<>(); - public RCursorManager() { + public CursorManager() { if (instance == null) { instance = this; } @@ -52,14 +52,14 @@ public class RCursorManager implements Listener { TinyProtocol.instance.addFilter(positionLookPacketClass, function); } - void registerCursor(RCursor cursor) { - List cursorsOfPlayer = activeCursors.getOrDefault(cursor.getOwner(), new ArrayList<>()); + void registerCursor(Cursor cursor) { + List cursorsOfPlayer = activeCursors.getOrDefault(cursor.getOwner(), new ArrayList<>()); cursorsOfPlayer.add(cursor); activeCursors.put(cursor.getOwner(), cursorsOfPlayer); } - void unregisterCursor(RCursor cursor) { - List cursorsOfPlayer = activeCursors.get(cursor.getOwner()); + void unregisterCursor(Cursor cursor) { + List cursorsOfPlayer = activeCursors.get(cursor.getOwner()); if (cursorsOfPlayer != null) { cursorsOfPlayer.remove(cursor); if (cursorsOfPlayer.isEmpty()) { @@ -69,9 +69,9 @@ public class RCursorManager implements Listener { } private void closeCursorsOf(Player player) { - List cursorsOfPlayer = activeCursors.remove(player); + List cursorsOfPlayer = activeCursors.remove(player); if (cursorsOfPlayer != null) { - new ArrayList<>(cursorsOfPlayer).forEach(RCursor::close); + new ArrayList<>(cursorsOfPlayer).forEach(Cursor::close); } } @@ -90,10 +90,10 @@ public class RCursorManager implements Listener { } } - List cursors = activeCursors.get(player); + List cursors = activeCursors.get(player); if (cursors != null) { - cursors.forEach(RCursor::render); + cursors.forEach(Cursor::render); } synchronized (calculationActive) { @@ -105,7 +105,7 @@ public class RCursorManager implements Listener { private void handlePlayerInteract(PlayerInteractEvent event) { Player player = event.getPlayer(); - List cursorsOfPlayer = activeCursors.get(player); + List cursorsOfPlayer = activeCursors.get(player); if (cursorsOfPlayer != null) { cursorsOfPlayer.forEach(cursor -> cursor.handleClick(event.getAction())); }