diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java
new file mode 100644
index 00000000..1117a766
--- /dev/null
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java
@@ -0,0 +1,56 @@
+/*
+ * 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.simulator2;
+
+import de.steamwar.bausystem.features.simulator2.data.Simulator;
+import de.steamwar.bausystem.features.simulator2.data.SimulatorGroup;
+import de.steamwar.bausystem.features.simulator2.data.redstone.RedstoneElement;
+import de.steamwar.bausystem.features.simulator2.data.redstone.RedstoneSetting;
+import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement;
+import de.steamwar.bausystem.features.simulator2.data.tnt.TNTSetting;
+import de.steamwar.bausystem.features.simulator2.gui.SimulatorGui;
+import de.steamwar.command.SWCommand;
+import de.steamwar.linkage.Linked;
+import org.bukkit.entity.Player;
+import org.bukkit.util.Vector;
+
+@Linked
+public class SimulatorTestCommand extends SWCommand {
+
+ private static final Simulator SIMULATOR = new Simulator("TestSim");
+
+ public SimulatorTestCommand() {
+ super("simtest");
+
+ SimulatorGroup group1 = new SimulatorGroup().add(new TNTElement(new Vector(0, 0, 0)).add(new TNTSetting())).add(new TNTElement(new Vector(0, 0, 0)).add(new TNTSetting()));
+ SIMULATOR.getElements().add(group1);
+
+ SimulatorGroup group2 = new SimulatorGroup().add(new TNTElement(new Vector(0, 0, 0)).add(new TNTSetting()));
+ SIMULATOR.getElements().add(group2);
+
+ SimulatorGroup group3 = new SimulatorGroup().add(new RedstoneElement(new Vector(0, 0, 0)).add(new RedstoneSetting()));
+ SIMULATOR.getElements().add(group3);
+ }
+
+ @Register
+ public void genericCommand(Player player, String... args) {
+ new SimulatorGui(player, SIMULATOR).open();
+ }
+}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java
new file mode 100644
index 00000000..6c9a0c1e
--- /dev/null
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java
@@ -0,0 +1,64 @@
+/*
+ * 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.simulator2;
+
+import de.steamwar.bausystem.features.simulator2.data.Simulator;
+import de.steamwar.bausystem.shared.Pair;
+import de.steamwar.linkage.Linked;
+import lombok.experimental.UtilityClass;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerQuitEvent;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+@UtilityClass
+public class SimulatorWatcher {
+
+ 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 void update(Simulator simulator) {
+ new ArrayList<>(watchers.values()).forEach(simulatorRunnablePair -> {
+ if (simulatorRunnablePair.getKey() == simulator) {
+ simulatorRunnablePair.getValue().run();
+ }
+ });
+ }
+
+ @Linked
+ public static class QuitListener implements Listener {
+
+ @EventHandler
+ public void onPlayerQuit(PlayerQuitEvent event) {
+ watchers.remove(event.getPlayer());
+ }
+ }
+}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/Simulator.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/Simulator.java
index 082a1c43..a856a54a 100644
--- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/Simulator.java
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/Simulator.java
@@ -19,13 +19,26 @@
package de.steamwar.bausystem.features.simulator2.data;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
import org.bukkit.Material;
import java.util.ArrayList;
import java.util.List;
+@Getter
+@Setter
+@RequiredArgsConstructor
public class Simulator {
private Material material = Material.BARREL;
+ private final String name;
private boolean autoTrace = false;
- private List elements = new ArrayList<>();
+ private final List elements = new ArrayList<>();
+
+ public void move(int x, int y, int z) {
+ elements.forEach(simulatorGroup -> {
+ simulatorGroup.move(x, y, z);
+ });
+ }
}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorElement.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorElement.java
index 8b6401ab..a218ea6b 100644
--- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorElement.java
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorElement.java
@@ -19,15 +19,50 @@
package de.steamwar.bausystem.features.simulator2.data;
+import lombok.Getter;
+import lombok.Setter;
import org.bukkit.Material;
import org.bukkit.util.Vector;
import java.util.ArrayList;
import java.util.List;
+@Getter
+@Setter
public abstract class SimulatorElement {
protected Material material;
- protected Vector position;
+ protected final Vector position;
protected boolean disabled = false;
- protected List settings = new ArrayList<>();
+ protected final List settings = new ArrayList<>();
+
+ protected SimulatorElement(Material material, Vector position) {
+ this.material = material;
+ this.position = position;
+ }
+
+ public SimulatorElement add(T setting) {
+ settings.add(setting);
+ return this;
+ }
+
+ public abstract String getName();
+
+ public int getBaseTick() {
+ return settings.stream()
+ .mapToInt(value -> value.tickOffset)
+ .min()
+ .orElse(0);
+ }
+
+ public void changeBaseTicks(int tick) {
+ settings.forEach(t -> {
+ t.tickOffset += tick;
+ });
+ }
+
+ public void move(int x, int y, int z) {
+ position.setX(position.getX() + x);
+ position.setY(position.getY() + y);
+ position.setZ(position.getZ() + z);
+ }
}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorGroup.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorGroup.java
index b02103d6..b0a705b4 100644
--- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorGroup.java
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorGroup.java
@@ -19,13 +19,41 @@
package de.steamwar.bausystem.features.simulator2.data;
+import lombok.Getter;
+import lombok.Setter;
import org.bukkit.Material;
import java.util.ArrayList;
import java.util.List;
+@Getter
+@Setter
public class SimulatorGroup {
private Material material = Material.CHEST;
protected boolean disabled = false;
- private List> elements = new ArrayList<>();
+ private final List> elements = new ArrayList<>();
+
+ public SimulatorGroup add(SimulatorElement> element) {
+ elements.add(element);
+ return this;
+ }
+
+ public int getBaseTick() {
+ return elements.stream()
+ .mapToInt(SimulatorElement::getBaseTick)
+ .min()
+ .orElse(0);
+ }
+
+ public void changeBaseTicks(int tick) {
+ elements.forEach(simulatorElement -> {
+ simulatorElement.changeBaseTicks(tick);
+ });
+ }
+
+ public void move(int x, int y, int z) {
+ elements.forEach(simulatorElement -> {
+ simulatorElement.move(x, y, z);
+ });
+ }
}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorSetting.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorSetting.java
index 393e03f2..b8ecb79c 100644
--- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorSetting.java
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorSetting.java
@@ -19,6 +19,11 @@
package de.steamwar.bausystem.features.simulator2.data;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
public abstract class SimulatorSetting {
protected int tickOffset;
protected int lifetime = 80;
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneElement.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneElement.java
index 0c5f8cdc..a633ac45 100644
--- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneElement.java
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneElement.java
@@ -20,7 +20,17 @@
package de.steamwar.bausystem.features.simulator2.data.redstone;
import de.steamwar.bausystem.features.simulator2.data.SimulatorElement;
+import org.bukkit.Material;
+import org.bukkit.util.Vector;
public class RedstoneElement extends SimulatorElement {
+ public RedstoneElement(Vector position) {
+ super(Material.REDSTONE_BLOCK, position);
+ }
+
+ @Override
+ public String getName() {
+ return "Redstone";
+ }
}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTElement.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTElement.java
index ba79a5f4..bbcfae6f 100644
--- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTElement.java
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTElement.java
@@ -20,6 +20,45 @@
package de.steamwar.bausystem.features.simulator2.data.tnt;
import de.steamwar.bausystem.features.simulator2.data.SimulatorElement;
+import org.bukkit.Material;
+import org.bukkit.util.Vector;
public class TNTElement extends SimulatorElement {
+
+ public TNTElement(Vector position) {
+ super(Material.TNT, position);
+ }
+
+ @Override
+ public String getName() {
+ return "TNT";
+ }
+
+ public void move(double x, double y, double z) {
+ position.setX(position.getX() + x);
+ position.setY(position.getY() + y);
+ position.setZ(position.getZ() + z);
+ }
+
+ public void align(Vector offset) {
+ if (offset.getX() != 0) {
+ if (position.getX() - (int) position.getX() == 0.49) {
+ position.setX(position.getX() + 0.02);
+ }
+ if (position.getX() - (int) position.getX() == -0.49) {
+ position.setX(position.getX() - 0.02);
+ }
+ position.setX(position.getBlockX() + offset.getX());
+ }
+
+ if (offset.getZ() != 0) {
+ if (position.getZ() - (int) position.getZ() == 0.49) {
+ position.setZ(position.getZ() + 0.02);
+ }
+ if (position.getZ() - (int) position.getZ() == -0.49) {
+ position.setZ(position.getZ() - 0.02);
+ }
+ position.setZ(position.getBlockZ() + offset.getZ());
+ }
+ }
}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTSetting.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTSetting.java
index 8c044fa2..601c3ac5 100644
--- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTSetting.java
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTSetting.java
@@ -20,11 +20,14 @@
package de.steamwar.bausystem.features.simulator2.data.tnt;
import de.steamwar.bausystem.features.simulator2.data.SimulatorSetting;
+import lombok.Getter;
+import lombok.Setter;
+@Getter
+@Setter
public class TNTSetting extends SimulatorSetting {
private int count = 1;
private boolean xJump = false;
private boolean yJump = false;
private boolean zJump = false;
-
}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java
new file mode 100644
index 00000000..c9a4c68e
--- /dev/null
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java
@@ -0,0 +1,106 @@
+/*
+ * 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.simulator2.gui;
+
+import de.steamwar.bausystem.features.simulator2.SimulatorWatcher;
+import de.steamwar.bausystem.features.simulator2.data.Simulator;
+import de.steamwar.bausystem.features.simulator2.data.SimulatorElement;
+import de.steamwar.bausystem.features.simulator2.data.SimulatorGroup;
+import de.steamwar.bausystem.features.simulator2.data.redstone.RedstoneElement;
+import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement;
+import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui;
+import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorPageGui;
+import de.steamwar.bausystem.features.simulator2.gui.utils.SimulatorMaterialGui;
+import de.steamwar.inventory.SWItem;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SimulatorGroupGui extends SimulatorPageGui> {
+
+ private final SimulatorGroup simulatorGroup;
+ private final SimulatorBaseGui back;
+
+ public SimulatorGroupGui(Player player, Simulator simulator, SimulatorGroup simulatorGroup, SimulatorBaseGui back) {
+ super(player, simulator, 6 * 9, simulatorGroup.getElements());
+ this.simulatorGroup = simulatorGroup;
+ this.back = back;
+ }
+
+ @Override
+ public String baseTitle() {
+ return "Group";
+ }
+
+ @Override
+ public void headerAndFooter() {
+ if (simulatorGroup.getElements().size() < 2) {
+ back.open();
+ return;
+ }
+
+ inventory.setItem(0, new SWItem(Material.ARROW, "§eBack", clickType -> {
+ back.open();
+ }));
+
+ List lore = new ArrayList<>();
+ lore.add("§7Element count§8:§e " + data.size());
+ lore.add("§7Tick§8:§e " + simulatorGroup.getBaseTick());
+ if (simulatorGroup.isDisabled()) {
+ lore.add("");
+ lore.add("§cDisabled");
+ }
+ inventory.setItem(4, new SWItem(simulatorGroup.getMaterial(), "§eGroup", lore, simulatorGroup.isDisabled(), clickType -> {
+ new SimulatorMaterialGui(player, simulator, simulatorGroup::getMaterial, simulatorGroup::setMaterial, this).open();
+ }));
+
+ inventory.setItem(48, new SWItem(Material.REPEATER, "§eSettings", clickType -> {
+ new SimulatorGroupSettingsGui(player, simulator, simulatorGroup, this).open();
+ }));
+ inventory.setItem(50, new SWItem(simulatorGroup.isDisabled() ? Material.ENDER_PEARL : Material.ENDER_EYE, simulatorGroup.isDisabled() ? "§cDisabled" : "§aEnabled", clickType -> {
+ simulatorGroup.setDisabled(!simulatorGroup.isDisabled());
+ SimulatorWatcher.update(simulator);
+ }));
+ }
+
+ @Override
+ public SWItem convert(SimulatorElement> element) {
+ List lore = new ArrayList<>();
+ lore.add("§7Phase count§8:§e " + element.getSettings().size());
+ lore.add("§7Tick§8:§e " + element.getBaseTick());
+ lore.add("");
+ lore.add("§7X§8:§e " + element.getPosition().getX());
+ lore.add("§7Y§8:§e " + element.getPosition().getY());
+ lore.add("§7Z§8:§e " + element.getPosition().getZ());
+ if (element.isDisabled()) {
+ lore.add("");
+ lore.add("§cDisabled");
+ }
+ return new SWItem(element.getMaterial(), "§e" + element.getName(), lore, element.isDisabled(), clickType -> {
+ if (element instanceof TNTElement) {
+ new SimulatorTNTGui(player, simulator, (TNTElement) element, this).open();
+ } else if (element instanceof RedstoneElement) {
+ new SimulatorRedstoneGui(player, simulator, simulatorGroup, (RedstoneElement) element, this).open();
+ }
+ });
+ }
+}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupSettingsGui.java
new file mode 100644
index 00000000..905972a0
--- /dev/null
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupSettingsGui.java
@@ -0,0 +1,126 @@
+/*
+ * 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.simulator2.gui;
+
+import de.steamwar.bausystem.features.simulator2.SimulatorWatcher;
+import de.steamwar.bausystem.features.simulator2.data.Simulator;
+import de.steamwar.bausystem.features.simulator2.data.SimulatorGroup;
+import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui;
+import de.steamwar.bausystem.features.simulator2.gui.utils.SimulatorMaterialGui;
+import de.steamwar.inventory.SWItem;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class SimulatorGroupSettingsGui extends SimulatorBaseGui {
+
+ private final SimulatorGroup simulatorGroup;
+ private final SimulatorBaseGui back;
+
+ public SimulatorGroupSettingsGui(Player player, Simulator simulator, SimulatorGroup simulatorGroup, SimulatorBaseGui back) {
+ super(player, simulator, 5 * 9);
+ this.simulatorGroup = simulatorGroup;
+ this.back = back;
+ }
+
+ @Override
+ public String title() {
+ return "Group";
+ }
+
+ @Override
+ public void populate() {
+ if (simulatorGroup.getElements().size() < 2) {
+ back.open();
+ return;
+ }
+
+ // Back Arrow
+ inventory.setItem(0, new SWItem(Material.ARROW, "§eBack", clickType -> {
+ back.open();
+ }));
+
+ // Material Chooser
+ List lore = new ArrayList<>();
+ lore.add("§7Element count§8:§e " + simulatorGroup.getElements().size());
+ lore.add("§7Tick§8:§e " + simulatorGroup.getBaseTick());
+ if (simulatorGroup.isDisabled()) {
+ lore.add("");
+ lore.add("§cDisabled");
+ }
+ inventory.setItem(4, new SWItem(simulatorGroup.getMaterial(), "§eGroup", lore, simulatorGroup.isDisabled(), clickType -> {
+ new SimulatorMaterialGui(player, simulator, simulatorGroup::getMaterial, simulatorGroup::setMaterial, this).open();
+ }));
+
+ // Base Tick
+ int baseTicks = simulatorGroup.getBaseTick();
+ inventory.setItem(9, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> {
+ simulatorGroup.changeBaseTicks(clickType.isShiftClick() ? 5 : 1);
+ SimulatorWatcher.update(simulator);
+ });
+ SWItem baseTick = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + baseTicks, clickType -> {});
+ baseTick.getItemStack().setAmount(Math.max(1, Math.min(baseTicks, 64)));
+ inventory.setItem(18, baseTick);
+ inventory.setItem(27, SWItem.getDye(baseTicks > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> {
+ if (baseTicks - (clickType.isShiftClick() ? 5 : 1) < 0) {
+ simulatorGroup.changeBaseTicks(-baseTicks);
+ } else {
+ simulatorGroup.changeBaseTicks(clickType.isShiftClick() ? -5 : -1);
+ }
+ SimulatorWatcher.update(simulator);
+ });
+
+ //Pos X
+ inventory.setItem(15, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> {
+ simulatorGroup.move(clickType.isShiftClick() ? 5 : 1, 0, 0);
+ SimulatorWatcher.update(simulator);
+ });
+ inventory.setItem(24, new SWItem(Material.PAPER, "§eX"));
+ inventory.setItem(33, SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> {
+ simulatorGroup.move(clickType.isShiftClick() ? -5 : -1, 0, 0);
+ SimulatorWatcher.update(simulator);
+ });
+
+ //Pos Y
+ inventory.setItem(16, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> {
+ simulatorGroup.move(0, clickType.isShiftClick() ? 5 : 1, 0);
+ SimulatorWatcher.update(simulator);
+ });
+ inventory.setItem(25, new SWItem(Material.PAPER, "§eY"));
+ inventory.setItem(34, SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> {
+ simulatorGroup.move(0, clickType.isShiftClick() ? -5 : -1, 0);
+ SimulatorWatcher.update(simulator);
+ });
+
+ //Pos Z
+ inventory.setItem(17, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> {
+ simulatorGroup.move(0, 0, clickType.isShiftClick() ? 5 : 1);
+ SimulatorWatcher.update(simulator);
+ });
+ inventory.setItem(26, new SWItem(Material.PAPER, "§eZ"));
+ inventory.setItem(35, SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> {
+ simulatorGroup.move(0, 0, clickType.isShiftClick() ? -5 : -1);
+ SimulatorWatcher.update(simulator);
+ });
+ }
+}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java
new file mode 100644
index 00000000..1a5d5325
--- /dev/null
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java
@@ -0,0 +1,94 @@
+/*
+ * 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.simulator2.gui;
+
+import de.steamwar.bausystem.features.simulator2.data.Simulator;
+import de.steamwar.bausystem.features.simulator2.data.SimulatorElement;
+import de.steamwar.bausystem.features.simulator2.data.SimulatorGroup;
+import de.steamwar.bausystem.features.simulator2.data.redstone.RedstoneElement;
+import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement;
+import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorPageGui;
+import de.steamwar.bausystem.features.simulator2.gui.utils.SimulatorMaterialGui;
+import de.steamwar.inventory.SWItem;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SimulatorGui extends SimulatorPageGui {
+
+ public SimulatorGui(Player player, Simulator simulator) {
+ super(player, simulator, 6 * 9, simulator.getElements());
+ }
+
+ @Override
+ public String baseTitle() {
+ return "Simulator - " + simulator.getName();
+ }
+
+ @Override
+ public void headerAndFooter() {
+ // TODO: Remove empty Groups
+ inventory.setItem(4, new SWItem(simulator.getMaterial(), "§e" + simulator.getName(), clickType -> {
+ new SimulatorMaterialGui(player, simulator, simulator::getMaterial, simulator::setMaterial, this).open();
+ }));
+ inventory.setItem(49, new SWItem(Material.REPEATER, "§eSettings", clickType -> {
+ new SimulatorSettingsGui(player, simulator, this).open();
+ }));
+ }
+
+ @Override
+ public SWItem convert(SimulatorGroup simulatorGroup) {
+ List> elements = simulatorGroup.getElements();
+ if (elements.size() == 1) {
+ SimulatorElement> element = elements.get(0);
+ List lore = new ArrayList<>();
+ lore.add("§7Phase count§8:§e " + element.getSettings().size());
+ lore.add("§7Tick§8:§e " + element.getBaseTick());
+ lore.add("");
+ lore.add("§7X§8:§e " + element.getPosition().getX());
+ lore.add("§7Y§8:§e " + element.getPosition().getY());
+ lore.add("§7Z§8:§e " + element.getPosition().getZ());
+ if (element.isDisabled()) {
+ lore.add("");
+ lore.add("§cDisabled");
+ }
+ return new SWItem(element.getMaterial(), "§e" + element.getName(), lore, element.isDisabled(), clickType -> {
+ if (element instanceof TNTElement) {
+ new SimulatorTNTGui(player, simulator, (TNTElement) element, this).open();
+ } else if (element instanceof RedstoneElement) {
+ new SimulatorRedstoneGui(player, simulator, simulatorGroup, (RedstoneElement) element, this).open();
+ }
+ });
+ }
+
+ List lore = new ArrayList<>();
+ lore.add("§7Element count§8:§e " + elements.size());
+ lore.add("§7Tick§8:§e " + simulatorGroup.getBaseTick());
+ if (simulatorGroup.isDisabled()) {
+ lore.add("");
+ lore.add("§cDisabled");
+ }
+ return new SWItem(simulatorGroup.getMaterial(), "§eGroup", lore, simulatorGroup.isDisabled(), clickType -> {
+ new SimulatorGroupGui(player, simulator, simulatorGroup, this).open();
+ });
+ }
+}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java
new file mode 100644
index 00000000..ae5a019a
--- /dev/null
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java
@@ -0,0 +1,122 @@
+/*
+ * 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.simulator2.gui;
+
+import de.steamwar.bausystem.features.simulator2.SimulatorWatcher;
+import de.steamwar.bausystem.features.simulator2.data.Simulator;
+import de.steamwar.bausystem.features.simulator2.data.SimulatorGroup;
+import de.steamwar.bausystem.features.simulator2.data.redstone.RedstoneElement;
+import de.steamwar.bausystem.features.simulator2.data.redstone.RedstoneSetting;
+import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement;
+import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui;
+import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorScrollGui;
+import de.steamwar.bausystem.features.simulator2.gui.utils.SimulatorMaterialGui;
+import de.steamwar.inventory.SWItem;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class SimulatorRedstoneGui extends SimulatorScrollGui {
+
+ private final SimulatorGroup simulatorGroup;
+ private final RedstoneElement redstoneElement;
+ private final SimulatorBaseGui back;
+
+ public SimulatorRedstoneGui(Player player, Simulator simulator, SimulatorGroup simulatorGroup, RedstoneElement redstoneElement, SimulatorBaseGui back) {
+ super(player, simulator, 6 * 9, redstoneElement.getSettings());
+ this.simulatorGroup = simulatorGroup;
+ this.redstoneElement = redstoneElement;
+ this.back = back;
+ }
+
+ @Override
+ public String baseTitle() {
+ return "Redstone";
+ }
+
+ @Override
+ public void headerAndFooter() {
+ if (redstoneElement.getSettings().isEmpty()) {
+ simulatorGroup.getElements().remove(redstoneElement);
+ back.open();
+ return;
+ }
+
+ // TODO Sort Data List
+
+ // Back Arrow
+ inventory.setItem(0, new SWItem(Material.ARROW, "§eBack", clickType -> {
+ back.open();
+ }));
+
+ // Material Chooser
+ List lore = new ArrayList<>();
+ lore.add("§7Activation count§8:§e " + data.size());
+ lore.add("§7Tick§8:§e " + redstoneElement.getBaseTick());
+ lore.add("");
+ lore.add("§7X§8:§e " + redstoneElement.getPosition().getX());
+ lore.add("§7Y§8:§e " + redstoneElement.getPosition().getY());
+ lore.add("§7Z§8:§e " + redstoneElement.getPosition().getZ());
+ if (redstoneElement.isDisabled()) {
+ lore.add("");
+ lore.add("§cDisabled");
+ }
+ inventory.setItem(4, new SWItem(redstoneElement.getMaterial(), "§eTNT", lore, redstoneElement.isDisabled(), clickType -> {
+ new SimulatorMaterialGui(player, simulator, redstoneElement::getMaterial, redstoneElement::setMaterial, this).open();
+ }));
+
+ //Settings
+ inventory.setItem(48, new SWItem(Material.REPEATER, "§eSettings", clickType -> {
+ new SimulatorRedstoneSettingsGui(player, simulator, redstoneElement, this).open();
+ }));
+
+ // 49 Lead?
+
+ //Enable/Disable
+ inventory.setItem(50, new SWItem(redstoneElement.isDisabled() ? Material.ENDER_PEARL : Material.ENDER_EYE, redstoneElement.isDisabled() ? "§cDisabled" : "§aEnabled", clickType -> {
+ redstoneElement.setDisabled(!redstoneElement.isDisabled());
+ SimulatorWatcher.update(simulator);
+ }));
+ }
+
+ @Override
+ public SWItem[] column(RedstoneSetting redstoneSetting) {
+ SWItem redstone = new SWItem(Material.REDSTONE_BLOCK, "§eRedstone§8:§7 " + redstoneSetting.getTickOffset(), Arrays.asList("§7Fuse§8:§e " + redstoneSetting.getLifetime(), "", "§7Order§8:§e " + redstoneSetting.getOrder()), false, clickType -> {});
+ redstone.getItemStack().setAmount(Math.max(1, Math.min(redstoneSetting.getTickOffset(), 64)));
+
+ return new SWItem[] {
+ new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> {
+ redstoneSetting.setTickOffset(redstoneSetting.getTickOffset() + (clickType.isShiftClick() ? 5 : 1));
+ SimulatorWatcher.update(simulator);
+ }),
+ redstone,
+ new SWItem(SWItem.getDye(redstoneSetting.getTickOffset() > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8:§e -5"), false, clickType -> {
+ redstoneSetting.setTickOffset(Math.max(0, redstoneSetting.getTickOffset() - (clickType.isShiftClick() ? 5 : 1)));
+ SimulatorWatcher.update(simulator);
+ }),
+ new SWItem(Material.ANVIL, "§eEdit Activation", clickType -> {
+ new SimulatorRedstonePhaseGui(player, simulator, redstoneElement, redstoneSetting, this).open();
+ }),
+ };
+ }
+}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseGui.java
new file mode 100644
index 00000000..60be2a34
--- /dev/null
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseGui.java
@@ -0,0 +1,73 @@
+/*
+ * 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.simulator2.gui;
+
+import de.steamwar.bausystem.features.simulator2.SimulatorWatcher;
+import de.steamwar.bausystem.features.simulator2.data.Simulator;
+import de.steamwar.bausystem.features.simulator2.data.redstone.RedstoneElement;
+import de.steamwar.bausystem.features.simulator2.data.redstone.RedstoneSetting;
+import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui;
+import de.steamwar.bausystem.features.simulator2.gui.utils.SimulatorMaterialGui;
+import de.steamwar.inventory.SWItem;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+
+public class SimulatorRedstonePhaseGui extends SimulatorBaseGui {
+
+ private final RedstoneElement redstoneElement;
+ private final RedstoneSetting redstone;
+ private final SimulatorBaseGui back;
+
+ public SimulatorRedstonePhaseGui(Player player, Simulator simulator, RedstoneElement redstoneElement, RedstoneSetting redstone, SimulatorBaseGui back) {
+ super(player, simulator, 5 * 9);
+ this.redstoneElement = redstoneElement;
+ this.redstone = redstone;
+ this.back = back;
+ }
+
+ @Override
+ public String title() {
+ return "Redstone";
+ }
+
+ @Override
+ public void populate() { // TODO: Finalize
+ if (!redstoneElement.getSettings().contains(redstone)) {
+ back.open();
+ return;
+ }
+
+ // Back Arrow
+ inventory.setItem(0, new SWItem(Material.ARROW, "§eBack", clickType -> {
+ back.open();
+ }));
+
+ // Material Chooser
+ inventory.setItem(4, new SWItem(redstoneElement.getMaterial(), "§eRedstone", clickType -> {
+ new SimulatorMaterialGui(player, simulator, redstoneElement::getMaterial, redstoneElement::setMaterial, this).open();
+ }));
+
+ inventory.setItem(8, new SWItem(Material.BARRIER, "§eDelete", clickType -> {
+ redstoneElement.getSettings().remove(redstone);
+ back.open();
+ SimulatorWatcher.update(simulator);
+ }));
+ }
+}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneSettingsGui.java
new file mode 100644
index 00000000..c191f862
--- /dev/null
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneSettingsGui.java
@@ -0,0 +1,125 @@
+/*
+ * 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.simulator2.gui;
+
+import de.steamwar.bausystem.features.simulator2.SimulatorWatcher;
+import de.steamwar.bausystem.features.simulator2.data.Simulator;
+import de.steamwar.bausystem.features.simulator2.data.redstone.RedstoneElement;
+import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui;
+import de.steamwar.bausystem.features.simulator2.gui.utils.SimulatorMaterialGui;
+import de.steamwar.inventory.SWItem;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class SimulatorRedstoneSettingsGui extends SimulatorBaseGui {
+ private final RedstoneElement redstone;
+ private final SimulatorBaseGui back;
+
+ public SimulatorRedstoneSettingsGui(Player player, Simulator simulator, RedstoneElement redstone, SimulatorBaseGui back) {
+ super(player, simulator, 5 * 9);
+ this.redstone = redstone;
+ this.back = back;
+ }
+
+ @Override
+ public String title() {
+ return "Redstone";
+ }
+
+ @Override
+ public void populate() {
+ if (redstone.getSettings().isEmpty()) {
+ back.open();
+ return;
+ }
+
+ // Back Arrow
+ inventory.setItem(0, new SWItem(Material.ARROW, "§eBack", clickType -> {
+ back.open();
+ }));
+
+ // Material Chooser
+ List lore = new ArrayList<>();
+ lore.add("§7Activation count§8:§e " + redstone.getSettings().size());
+ lore.add("§7Tick§8:§e " + redstone.getBaseTick());
+ if (redstone.isDisabled()) {
+ lore.add("");
+ lore.add("§cDisabled");
+ }
+ inventory.setItem(4, new SWItem(redstone.getMaterial(), "§eRedstone", lore, redstone.isDisabled(), clickType -> {
+ new SimulatorMaterialGui(player, simulator, redstone::getMaterial, redstone::setMaterial, this).open();
+ }));
+
+ // Base Tick
+ int baseTicks = redstone.getBaseTick();
+ inventory.setItem(9, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> {
+ redstone.changeBaseTicks(clickType.isShiftClick() ? 5 : 1);
+ SimulatorWatcher.update(simulator);
+ });
+ SWItem baseTick = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + baseTicks, clickType -> {});
+ baseTick.getItemStack().setAmount(Math.max(1, Math.min(baseTicks, 64)));
+ inventory.setItem(18, baseTick);
+ inventory.setItem(27, SWItem.getDye(baseTicks > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> {
+ if (baseTicks - (clickType.isShiftClick() ? 5 : 1) < 0) {
+ redstone.changeBaseTicks(-baseTicks);
+ } else {
+ redstone.changeBaseTicks(clickType.isShiftClick() ? -5 : -1);
+ }
+ SimulatorWatcher.update(simulator);
+ });
+
+ //Pos X
+ inventory.setItem(15, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> {
+ redstone.move(clickType.isShiftClick() ? 5 : 1, 0, 0);
+ SimulatorWatcher.update(simulator);
+ });
+ inventory.setItem(24, new SWItem(Material.PAPER, "§eX"));
+ inventory.setItem(33, SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> {
+ redstone.move(clickType.isShiftClick() ? -5 : -1, 0, 0);
+ SimulatorWatcher.update(simulator);
+ });
+
+ //Pos Y
+ inventory.setItem(16, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> {
+ redstone.move(0, clickType.isShiftClick() ? 5 : 1, 0);
+ SimulatorWatcher.update(simulator);
+ });
+ inventory.setItem(25, new SWItem(Material.PAPER, "§eY"));
+ inventory.setItem(34, SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> {
+ redstone.move(0, clickType.isShiftClick() ? -5 : -1, 0);
+ SimulatorWatcher.update(simulator);
+ });
+
+ //Pos Z
+ inventory.setItem(17, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> {
+ redstone.move(0, 0, clickType.isShiftClick() ? 5 : 1);
+ SimulatorWatcher.update(simulator);
+ });
+ inventory.setItem(26, new SWItem(Material.PAPER, "§eZ"));
+ inventory.setItem(35, SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> {
+ redstone.move(0, 0, clickType.isShiftClick() ? -5 : -1);
+ SimulatorWatcher.update(simulator);
+ });
+ }
+}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorSettingsGui.java
new file mode 100644
index 00000000..acaf01da
--- /dev/null
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorSettingsGui.java
@@ -0,0 +1,97 @@
+/*
+ * 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.simulator2.gui;
+
+import de.steamwar.bausystem.features.simulator2.SimulatorWatcher;
+import de.steamwar.bausystem.features.simulator2.data.Simulator;
+import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui;
+import de.steamwar.bausystem.features.simulator2.gui.utils.SimulatorMaterialGui;
+import de.steamwar.inventory.SWItem;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+
+import java.util.Arrays;
+
+public class SimulatorSettingsGui extends SimulatorBaseGui {
+
+ private final SimulatorBaseGui back;
+
+ public SimulatorSettingsGui(Player player, Simulator simulator, SimulatorBaseGui back) {
+ super(player, simulator, 5 * 9);
+ this.back = back;
+ }
+
+ @Override
+ public String title() {
+ return simulator.getName() + " Settings";
+ }
+
+ @Override
+ public void populate() {
+ // Back Arrow
+ inventory.setItem(0, new SWItem(Material.ARROW, "§eBack", clickType -> {
+ back.open();
+ }));
+
+ // Material Chooser
+ inventory.setItem(4, new SWItem(simulator.getMaterial(), "§e" + simulator.getName(), clickType -> {
+ new SimulatorMaterialGui(player, simulator, simulator::getMaterial, simulator::setMaterial, this).open();
+ }));
+
+ //AutoTrace
+ inventory.setItem(20, 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);
+ }));
+
+ //Pos X
+ inventory.setItem(15, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> {
+ simulator.move(clickType.isShiftClick() ? 5 : 1, 0, 0);
+ SimulatorWatcher.update(simulator);
+ });
+ inventory.setItem(24, new SWItem(Material.PAPER, "§eX"));
+ inventory.setItem(33, SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> {
+ simulator.move(clickType.isShiftClick() ? -5 : -1, 0, 0);
+ SimulatorWatcher.update(simulator);
+ });
+
+ //Pos Y
+ inventory.setItem(16, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> {
+ simulator.move(0, clickType.isShiftClick() ? 5 : 1, 0);
+ SimulatorWatcher.update(simulator);
+ });
+ inventory.setItem(25, new SWItem(Material.PAPER, "§eY"));
+ inventory.setItem(34, SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> {
+ simulator.move(0, clickType.isShiftClick() ? -5 : -1, 0);
+ SimulatorWatcher.update(simulator);
+ });
+
+ //Pos Z
+ inventory.setItem(17, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> {
+ simulator.move(0, 0, clickType.isShiftClick() ? 5 : 1);
+ SimulatorWatcher.update(simulator);
+ });
+ inventory.setItem(26, new SWItem(Material.PAPER, "§eZ"));
+ inventory.setItem(35, SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> {
+ simulator.move(0, 0, clickType.isShiftClick() ? -5 : -1);
+ SimulatorWatcher.update(simulator);
+ });
+ }
+}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java
new file mode 100644
index 00000000..b979e930
--- /dev/null
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java
@@ -0,0 +1,110 @@
+/*
+ * 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.simulator2.gui;
+
+import de.steamwar.bausystem.features.simulator2.SimulatorWatcher;
+import de.steamwar.bausystem.features.simulator2.data.Simulator;
+import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement;
+import de.steamwar.bausystem.features.simulator2.data.tnt.TNTSetting;
+import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui;
+import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorScrollGui;
+import de.steamwar.bausystem.features.simulator2.gui.utils.SimulatorMaterialGui;
+import de.steamwar.inventory.SWItem;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class SimulatorTNTGui extends SimulatorScrollGui {
+
+ private TNTElement tntElement;
+ private SimulatorBaseGui back;
+
+ public SimulatorTNTGui(Player player, Simulator simulator, TNTElement tntElement, SimulatorBaseGui back) {
+ super(player, simulator, 6 * 9, tntElement.getSettings());
+ this.tntElement = tntElement;
+ this.back = back;
+ }
+
+ @Override
+ public String baseTitle() {
+ return "TNT";
+ }
+
+ @Override
+ public void headerAndFooter() {
+ // TODO Back Jump
+
+ // Back Arrow
+ inventory.setItem(0, new SWItem(Material.ARROW, "§eBack", clickType -> {
+ back.open();
+ }));
+
+ // TODO Sort Data List
+
+ // Material Chooser
+ List lore = new ArrayList<>();
+ lore.add("§7Phase count§8:§e " + data.size());
+ lore.add("§7Tick§8:§e " + tntElement.getBaseTick());
+ lore.add("");
+ lore.add("§7X§8:§e " + tntElement.getPosition().getX());
+ lore.add("§7Y§8:§e " + tntElement.getPosition().getY());
+ lore.add("§7Z§8:§e " + tntElement.getPosition().getZ());
+ if (tntElement.isDisabled()) {
+ lore.add("");
+ lore.add("§cDisabled");
+ }
+ inventory.setItem(4, new SWItem(tntElement.getMaterial(), "§eTNT", lore, tntElement.isDisabled(), clickType -> {
+ new SimulatorMaterialGui(player, simulator, tntElement::getMaterial, tntElement::setMaterial, this).open();
+ }));
+
+ inventory.setItem(48, new SWItem(Material.REPEATER, "§eSettings", clickType -> {
+ // new SimulatorGroupSettingsGui(player, simulator, simulatorGroup, this).open();
+ }));
+ // 49 Lead?
+ inventory.setItem(50, new SWItem(tntElement.isDisabled() ? Material.ENDER_PEARL : Material.ENDER_EYE, tntElement.isDisabled() ? "§cDisabled" : "§aEnabled", clickType -> {
+ tntElement.setDisabled(!tntElement.isDisabled());
+ SimulatorWatcher.update(simulator);
+ }));
+ }
+
+ @Override
+ public SWItem[] column(TNTSetting tntSetting) {
+ 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")), false, clickType -> {});
+ 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);
+ }),
+ 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);
+ }),
+ new SWItem(Material.ANVIL, "§eEdit Phase", clickType -> {
+ // Open Edit Phase menu
+ }),
+ };
+ }
+}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTSettingsGui.java
new file mode 100644
index 00000000..dc90b12b
--- /dev/null
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTSettingsGui.java
@@ -0,0 +1,148 @@
+/*
+ * 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.simulator2.gui;
+
+import de.steamwar.bausystem.features.simulator2.SimulatorWatcher;
+import de.steamwar.bausystem.features.simulator2.data.Simulator;
+import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement;
+import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui;
+import de.steamwar.bausystem.features.simulator2.gui.utils.SimulatorMaterialGui;
+import de.steamwar.inventory.SWItem;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class SimulatorTNTSettingsGui extends SimulatorBaseGui {
+ private final TNTElement tnt;
+ private final SimulatorBaseGui back;
+
+ public SimulatorTNTSettingsGui(Player player, Simulator simulator, TNTElement tnt, SimulatorBaseGui back) {
+ super(player, simulator, 5 * 9);
+ this.tnt = tnt;
+ this.back = back;
+ }
+
+ @Override
+ public String title() {
+ return "TNT";
+ }
+
+ @Override
+ public void populate() {
+ // Back Arrow
+ inventory.setItem(0, new SWItem(Material.ARROW, "§eBack", clickType -> {
+ back.open();
+ }));
+
+ // Material Chooser
+ List lore = new ArrayList<>();
+ lore.add("§7Phase count§8:§e " + tnt.getSettings().size());
+ lore.add("§7Tick§8:§e " + tnt.getBaseTick());
+ if (tnt.isDisabled()) {
+ lore.add("");
+ lore.add("§cDisabled");
+ }
+ inventory.setItem(4, new SWItem(tnt.getMaterial(), "§eTNT", lore, tnt.isDisabled(), clickType -> {
+ new SimulatorMaterialGui(player, simulator, tnt::getMaterial, tnt::setMaterial, this).open();
+ }));
+
+ // Base Tick
+ int baseTicks = tnt.getBaseTick();
+ inventory.setItem(9, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> {
+ tnt.changeBaseTicks(clickType.isShiftClick() ? 5 : 1);
+ SimulatorWatcher.update(simulator);
+ });
+ SWItem baseTick = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + baseTicks, clickType -> {});
+ baseTick.getItemStack().setAmount(Math.max(1, Math.min(baseTicks, 64)));
+ inventory.setItem(18, baseTick);
+ inventory.setItem(27, SWItem.getDye(baseTicks > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> {
+ if (baseTicks - (clickType.isShiftClick() ? 5 : 1) < 0) {
+ tnt.changeBaseTicks(-baseTicks);
+ } else {
+ tnt.changeBaseTicks(clickType.isShiftClick() ? -5 : -1);
+ }
+ SimulatorWatcher.update(simulator);
+ });
+
+ // Subpixel Alignment
+ inventory.setItem(24, new SWItem(Material.SUNFLOWER, "§7Align§8: §eCenter", clickType -> {
+ // tnt.align(new Vector()); TODO Finalize
+ SimulatorWatcher.update(simulator);
+ }));
+
+ //z
+ inventory.setItem(23, new SWItem(Material.OAK_BUTTON, "§7Align§8: §eNegativ Z", clickType -> {
+
+ SimulatorWatcher.update(simulator);
+ }));
+
+ inventory.setItem(25, new SWItem(Material.OAK_BUTTON, "§7Align§8: §ePositiv Z", clickType -> {
+
+ SimulatorWatcher.update(simulator);
+ }));
+
+ //X
+ inventory.setItem(15, new SWItem(Material.OAK_BUTTON, "§7Align§8: §eNegativ Z", clickType -> {
+
+ SimulatorWatcher.update(simulator);
+ }));
+
+ inventory.setItem(33, new SWItem(Material.OAK_BUTTON, "§7Align§8: §ePositiv Z", clickType -> {
+
+ SimulatorWatcher.update(simulator);
+ }));
+
+ //Pos X
+ inventory.setItem(15, 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);
+ });
+ inventory.setItem(24, new SWItem(Material.PAPER, "§eX"));
+ inventory.setItem(33, 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);
+ });
+
+ //Pos Y
+ inventory.setItem(16, 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);
+ });
+ inventory.setItem(25, new SWItem(Material.PAPER, "§eY"));
+ inventory.setItem(34, 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);
+ });
+
+ //Pos Z
+ inventory.setItem(17, 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);
+ });
+ inventory.setItem(26, new SWItem(Material.PAPER, "§eZ"));
+ inventory.setItem(35, 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);
+ });
+ }
+}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/base/SimulatorBaseGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/base/SimulatorBaseGui.java
new file mode 100644
index 00000000..59079c64
--- /dev/null
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/base/SimulatorBaseGui.java
@@ -0,0 +1,79 @@
+/*
+ * 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.simulator2.gui.base;
+
+import de.steamwar.bausystem.features.simulator2.SimulatorWatcher;
+import de.steamwar.bausystem.features.simulator2.data.Simulator;
+import de.steamwar.inventory.SWInventory;
+import de.steamwar.inventory.SWItem;
+import org.bukkit.Bukkit;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.Inventory;
+
+public abstract class SimulatorBaseGui {
+
+ protected final Player player;
+ protected final Simulator simulator;
+ private Inventory inv;
+ protected SWInventory inventory;
+
+ protected final int size;
+
+ protected SimulatorBaseGui(Player player, Simulator simulator, int size) {
+ this.player = player;
+ this.simulator = simulator;
+ this.size = size;
+ }
+
+ public final void open() {
+ if (inv != null) {
+ if (player.getOpenInventory().getTopInventory() != inv) {
+ inventory.open();
+ SimulatorWatcher.watch(player, simulator, this::open);
+ }
+ player.getOpenInventory().setTitle(title());
+ populate();
+ return;
+ }
+
+ player.getOpenInventory().close();
+
+ inventory = new SWInventory(player, () -> {
+ inv = Bukkit.createInventory(null, size, title());
+ return inv;
+ });
+ for (int i = 0; i < 9; i++) {
+ inventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§8", clickType -> {}));
+ inventory.setItem(size - 9 + i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§8", clickType -> {}));
+ }
+ inventory.addCloseCallback(clickType -> {
+ SimulatorWatcher.watch(player, null, null);
+ });
+
+ inventory.open();
+ SimulatorWatcher.watch(player, simulator, this::open);
+ populate();
+ }
+
+ public abstract String title();
+
+ public abstract void populate();
+}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/base/SimulatorPageGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/base/SimulatorPageGui.java
new file mode 100644
index 00000000..22db341e
--- /dev/null
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/base/SimulatorPageGui.java
@@ -0,0 +1,82 @@
+/*
+ * 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.simulator2.gui.base;
+
+import de.steamwar.bausystem.features.simulator2.data.Simulator;
+import de.steamwar.core.Core;
+import de.steamwar.inventory.SWItem;
+import org.bukkit.entity.Player;
+
+import java.util.List;
+
+public abstract class SimulatorPageGui extends SimulatorBaseGui {
+
+ protected int page = 0;
+ protected final List data;
+
+ protected SimulatorPageGui(Player player, Simulator simulator, int size, List data) {
+ super(player, simulator, size);
+ this.data = data;
+ }
+
+ public final int maxPage() {
+ return data.size() / (size - 18);
+ }
+
+ @Override
+ public final String title() {
+ return baseTitle() + " " + (page + 1) + "/" + (maxPage() + 1);
+ }
+
+ @Override
+ public final void populate() {
+ headerAndFooter();
+ page = Math.min(page, maxPage());
+
+ inventory.setItem(size - 9, SWItem.getDye(page > 0 ? 10 : 8), page > 0 ? (byte) 10 : (byte) 8, Core.MESSAGE.parse(page > 0 ? "SWLISINV_PREVIOUS_PAGE_ACTIVE" : "SWLISINV_PREVIOUS_PAGE_INACTIVE", player), clickType -> {
+ if (page > 0) {
+ page--;
+ open();
+ }
+ });
+ boolean hasNext = page < maxPage() - (data.size() % (size - 18) == 0 ? 1 : 0);
+ inventory.setItem(size - 1, SWItem.getDye(hasNext ? 10 : 8), hasNext ? (byte) 10 : (byte) 8, Core.MESSAGE.parse(hasNext ? "SWLISINV_NEXT_PAGE_ACTIVE" : "SWLISINV_NEXT_PAGE_INACTIVE", player), clickType -> {
+ if (hasNext) {
+ page++;
+ open();
+ }
+ });
+
+ int minElement = page * (size - 18);
+ int maxElement = Math.min(data.size(), (page + 1) * (size - 18));
+ int index = 9;
+
+ for (int i = minElement; i < maxElement; i++) {
+ T element = data.get(i);
+ inventory.setItem(index++, convert(element));
+ }
+ }
+
+ public abstract String baseTitle();
+
+ public void headerAndFooter() {
+ }
+ public abstract SWItem convert(T t);
+}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/base/SimulatorScrollGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/base/SimulatorScrollGui.java
new file mode 100644
index 00000000..a61a4971
--- /dev/null
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/base/SimulatorScrollGui.java
@@ -0,0 +1,80 @@
+/*
+ * 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.simulator2.gui.base;
+
+import de.steamwar.bausystem.features.simulator2.data.Simulator;
+import de.steamwar.core.Core;
+import de.steamwar.inventory.SWItem;
+import org.bukkit.entity.Player;
+
+import java.util.List;
+
+public abstract class SimulatorScrollGui extends SimulatorBaseGui { // TODO: Last Column?
+ protected int scroll = 0;
+ protected final List data;
+
+ protected SimulatorScrollGui(Player player, Simulator simulator, int size, List data) {
+ super(player, simulator, size);
+ this.data = data;
+ }
+
+ private int maxScroll() {
+ return Math.max(0, Math.min(scroll, data.size() - 9));
+ }
+
+ @Override
+ public final String title() {
+ return baseTitle() + " " + scroll + "/" + maxScroll();
+ }
+
+ @Override
+ public final void populate() {
+ headerAndFooter();
+ scroll = maxScroll();
+
+ inventory.setItem(size - 9, SWItem.getDye(scroll > 0 ? 10 : 8), scroll > 0 ? (byte) 10 : (byte) 8, Core.MESSAGE.parse(scroll > 0 ? "SWLISINV_PREVIOUS_PAGE_ACTIVE" : "SWLISINV_PREVIOUS_PAGE_INACTIVE", player), clickType -> {
+ if (scroll > 0) {
+ scroll = Math.max(0, scroll - 9);
+ open();
+ }
+ });
+ boolean hasNext = scroll < maxScroll() - (data.size() % 9 == 0 ? 1 : 0);
+ inventory.setItem(size - 1, SWItem.getDye(hasNext ? 10 : 8), hasNext ? (byte) 10 : (byte) 8, Core.MESSAGE.parse(hasNext ? "SWLISINV_NEXT_PAGE_ACTIVE" : "SWLISINV_NEXT_PAGE_INACTIVE", player), clickType -> {
+ if (hasNext) {
+ scroll = Math.min(scroll + 9, maxScroll());
+ open();
+ }
+ });
+
+ for (int i = 0; i < Math.min(9, data.size()); i++) {
+ T element = data.get(scroll + i);
+ SWItem[] column = column(element);
+ for (int j = 0; j < column.length; j++) {
+ inventory.setItem(i + j * 9 + 9, column[j]);
+ }
+ }
+ }
+
+ public abstract String baseTitle();
+
+ public void headerAndFooter() {
+ }
+ public abstract SWItem[] column(T t);
+}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/utils/SimulatorMaterialGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/utils/SimulatorMaterialGui.java
new file mode 100644
index 00000000..2acac329
--- /dev/null
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/utils/SimulatorMaterialGui.java
@@ -0,0 +1,77 @@
+/*
+ * 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.simulator2.gui.utils;
+
+import de.steamwar.bausystem.features.simulator2.SimulatorWatcher;
+import de.steamwar.bausystem.features.simulator2.data.Simulator;
+import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui;
+import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorPageGui;
+import de.steamwar.inventory.SWItem;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+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 final Supplier currentMaterial;
+ private Material material;
+ private final Consumer change;
+ private final SimulatorBaseGui back;
+
+ public SimulatorMaterialGui(Player player, Simulator simulator, Supplier currentMaterial, Consumer change, SimulatorBaseGui back) {
+ super(player, simulator, 6 * 9, MATERIALS);
+ this.currentMaterial = currentMaterial;
+ this.change = change;
+ this.back = back;
+ }
+
+ @Override
+ public String baseTitle() {
+ return "Material";
+ }
+
+ @Override
+ public void headerAndFooter() {
+ material = currentMaterial.get();
+ inventory.setItem(4, new SWItem(material, "§eMaterial", clickType -> {}));
+ inventory.setItem(0, new SWItem(Material.ARROW, "§eBack", clickType -> {
+ back.open();
+ }));
+ }
+
+ @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);
+ });
+ }
+}