From 08706d705dd317f41fa198c0f8d8c5c5c75b85f0 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sat, 18 Oct 2025 07:48:29 +0200 Subject: [PATCH] Update SimulatorCursor --- .../features/simulator/SimulatorCursor.java | 58 ++++++++-------- .../gui/SimulatorCursorSwitcherGui.java | 67 +++++++++++++++++++ .../features/simulator/gui/SimulatorGui.java | 7 +- 3 files changed, 100 insertions(+), 32 deletions(-) create mode 100644 BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorCursorSwitcherGui.java 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 index 5cfbaad6..568b20b2 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java @@ -40,13 +40,10 @@ 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.data.CMDs; import de.steamwar.entity.REntity; import de.steamwar.entity.REntityServer; import de.steamwar.entity.RFallingBlockEntity; import de.steamwar.inventory.SWAnvilInv; -import de.steamwar.inventory.SWInventory; -import de.steamwar.inventory.SWItem; import de.steamwar.linkage.Linked; import de.steamwar.linkage.MinVersion; import lombok.AllArgsConstructor; @@ -74,14 +71,14 @@ import java.util.stream.Collectors; @MinVersion(19) public class SimulatorCursor implements Listener { - private final World WORLD = Bukkit.getWorlds().get(0); + private static 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<>(); + private static Map cursorType = Collections.synchronizedMap(new HashMap<>()); + private static Map cursors = Collections.synchronizedMap(new HashMap<>()); + private static final Set calculating = new HashSet<>(); public static boolean isSimulatorItem(ItemStack itemStack) { return ItemUtils.isItem(itemStack, "simulator"); @@ -121,7 +118,7 @@ public class SimulatorCursor implements Listener { @EventHandler public void onBauMemberUpdate(BauMemberUpdateEvent event) { - event.getChanged().forEach(this::calcCursor); + event.getChanged().forEach(SimulatorCursor::calcCursor); } @EventHandler @@ -150,29 +147,28 @@ public class SimulatorCursor implements Listener { return; } if (LAST_SNEAKS.containsKey(player)) { - SWInventory swInventory = new SWInventory(player, 9, "Simulator Cursor"); - int slot = 2; CursorType currentType = cursorType.getOrDefault(player, CursorType.TNT); - for (CursorType type : CursorType.values()) { - boolean selected = type == currentType; - SWItem swItem = new SWItem(selected ? type.material : type.nonSelectedMaterial, "§e" + type.name) - .setCustomModelData(selected ? 0 : CMDs.Simulator.NEW_PHASE) - .setLore(Collections.singletonList("§eClick to select")) - .setCallback(click -> { - cursorType.put(player, type); - calcCursor(player); - player.closeInventory(); - }); - swInventory.setItem(slot, swItem); - slot += 2; + if (currentType == CursorType.TNT) { + cursorType.put(player, CursorType.REDSTONE_BLOCK); + } else { + cursorType.put(player, CursorType.TNT); } - swInventory.open(); + calcCursor(player); } else { LAST_SNEAKS.put(player, System.currentTimeMillis()); } } - public void calcCursor(Player player) { + public static CursorType getCursorType(Player player) { + return cursorType.getOrDefault(player, CursorType.TNT); + } + + public static void setCursorType(Player player, CursorType cursorType) { + SimulatorCursor.cursorType.put(player, cursorType); + calcCursor(player); + } + + public static void calcCursor(Player player) { synchronized (calculating) { if (calculating.contains(player)) return; calculating.add(player); @@ -220,7 +216,7 @@ public class SimulatorCursor implements Listener { } } - private synchronized boolean removeCursor(Player player) { + private static synchronized boolean removeCursor(Player player) { REntityServer entityServer = cursors.get(player); boolean hadCursor = entityServer != null && !entityServer.getEntities().isEmpty(); if (entityServer != null) { @@ -229,7 +225,7 @@ public class SimulatorCursor implements Listener { return hadCursor; } - private synchronized void showCursor(Player player, RayTraceUtils.RRayTraceResult rayTraceResult, boolean hasSimulatorSelected) { + private static synchronized void showCursor(Player player, RayTraceUtils.RRayTraceResult rayTraceResult, boolean hasSimulatorSelected) { REntityServer entityServer = cursors.computeIfAbsent(player, __ -> { REntityServer rEntityServer = new REntityServer(); rEntityServer.addPlayer(player); @@ -354,11 +350,11 @@ public class SimulatorCursor implements Listener { OBSERVER(Material.OBSERVER, Material.QUARTZ, SimulatorCursor::getPosBlockAligned, "Observer", vector -> new ObserverElement(vector).add(new ObserverPhase())), ; - private Material material; - private Material nonSelectedMaterial; - private BiFunction position; - private String name; - private Function> elementFunction; + public final Material material; + public final Material nonSelectedMaterial; + public final BiFunction position; + public final String name; + public final Function> elementFunction; } @EventHandler diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorCursorSwitcherGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorCursorSwitcherGui.java new file mode 100644 index 00000000..734fe597 --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorCursorSwitcherGui.java @@ -0,0 +1,67 @@ +/* + * This file is a part of the SteamWar software. + * + * 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 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.gui; + +import de.steamwar.bausystem.features.simulator.SimulatorCursor; +import de.steamwar.bausystem.features.simulator.data.Simulator; +import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; +import de.steamwar.data.CMDs; +import de.steamwar.inventory.SWItem; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import java.util.Collections; + +public class SimulatorCursorSwitcherGui extends SimulatorBaseGui { + + private SimulatorBaseGui back; + + public SimulatorCursorSwitcherGui(Player player, Simulator simulator, SimulatorBaseGui back) { + super(player, simulator, 9); + this.back = back; + } + + @Override + public String title() { + return "Simulator Cursor"; + } + + @Override + public void populate() { + inventory.setItem(0, new SWItem(Material.ARROW, "§eBack", clickType -> { + back.open(); + }).setCustomModelData(CMDs.BACK)); + + int slot = 2; + SimulatorCursor.CursorType currentType = SimulatorCursor.getCursorType(player); + for (SimulatorCursor.CursorType type : SimulatorCursor.CursorType.values()) { + boolean selected = type == currentType; + SWItem swItem = new SWItem(selected ? type.material : type.nonSelectedMaterial, "§e" + type.name) + .setCustomModelData(selected ? 0 : CMDs.Simulator.NEW_PHASE) + .setLore(Collections.singletonList("§eClick to select")) + .setCallback(click -> { + SimulatorCursor.setCursorType(player, type); + player.closeInventory(); + }); + inventory.setItem(slot, swItem); + slot += 2; + } + } +} 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..22e6d39c 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 @@ -19,6 +19,7 @@ package de.steamwar.bausystem.features.simulator.gui; +import de.steamwar.bausystem.features.simulator.SimulatorCursor; import de.steamwar.bausystem.features.simulator.SimulatorWatcher; import de.steamwar.bausystem.features.simulator.data.Simulator; import de.steamwar.bausystem.features.simulator.data.SimulatorElement; @@ -49,7 +50,11 @@ public class SimulatorGui extends SimulatorPageGui { inventory.setItem(4, simulator.toItem(player, clickType -> { new SimulatorMaterialGui(player, simulator, simulator::getMaterial, simulator::setMaterial, this).open(); })); - inventory.setItem(49, new SWItem(Material.REPEATER, "§eSettings", clickType -> { + SimulatorCursor.CursorType cursorType = SimulatorCursor.getCursorType(player); + inventory.setItem(48, new SWItem(cursorType.material, "§7Placing §8-§e " + cursorType.name, clickType -> { + new SimulatorCursorSwitcherGui(player, simulator, this).open(); + })); + inventory.setItem(50, new SWItem(Material.REPEATER, "§eSettings", clickType -> { new SimulatorSettingsGui(player, simulator, this).open(); }).setCustomModelData(CMDs.Simulator.SETTINGS)); }