From 44f6d1c15dd8fb66992a0c50b1b19c6f759ed6ff Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Sun, 8 Oct 2023 11:58:05 +0200 Subject: [PATCH 01/48] Added new sim data structure --- .../bausystem/features/simulator2/data/Simulator.java | 4 ++++ .../bausystem/features/simulator2/data/SimulatorElement.java | 4 ++++ .../bausystem/features/simulator2/data/SimulatorGroup.java | 4 ++++ .../features/simulator2/data/redstone/RedstoneElement.java | 5 +++++ .../features/simulator2/data/redstone/RedstoneSetting.java | 4 ++++ .../bausystem/features/simulator2/data/tnt/TNTElement.java | 4 ++++ .../bausystem/features/simulator2/data/tnt/TNTSetting.java | 4 ++++ 7 files changed, 29 insertions(+) create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/Simulator.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorElement.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorGroup.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneElement.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneSetting.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTElement.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTSetting.java 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 new file mode 100644 index 00000000..9354b78a --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/Simulator.java @@ -0,0 +1,4 @@ +package de.steamwar.bausystem.features.simulator2.data; + +public class Simulator { +} 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 new file mode 100644 index 00000000..61f20f42 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorElement.java @@ -0,0 +1,4 @@ +package de.steamwar.bausystem.features.simulator2.data; + +public abstract class SimulatorElement { +} 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 new file mode 100644 index 00000000..b212828c --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorGroup.java @@ -0,0 +1,4 @@ +package de.steamwar.bausystem.features.simulator2.data; + +public class SimulatorGroup { +} 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 new file mode 100644 index 00000000..ddcf6c4c --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneElement.java @@ -0,0 +1,5 @@ +package de.steamwar.bausystem.features.simulator2.data.redstone; + +public class RedstoneElement { + +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneSetting.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneSetting.java new file mode 100644 index 00000000..e849a230 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneSetting.java @@ -0,0 +1,4 @@ +package de.steamwar.bausystem.features.simulator2.data.redstone; + +public class RedstoneSetting { +} 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 new file mode 100644 index 00000000..aeb86a57 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTElement.java @@ -0,0 +1,4 @@ +package de.steamwar.bausystem.features.simulator2.data.tnt; + +public class TNTElement { +} 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 new file mode 100644 index 00000000..147aa3fd --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTSetting.java @@ -0,0 +1,4 @@ +package de.steamwar.bausystem.features.simulator2.data.tnt; + +public class TNTSetting { +} From 077a9854a509eba39c1f7a7a48101353937508b5 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Sun, 8 Oct 2023 12:06:48 +0200 Subject: [PATCH 02/48] Add class Hierarchy --- .../features/simulator2/data/Simulator.java | 4 ++++ .../simulator2/data/SimulatorElement.java | 8 ++++++- .../simulator2/data/SimulatorGroup.java | 4 ++++ .../simulator2/data/SimulatorSetting.java | 23 +++++++++++++++++++ .../data/redstone/RedstoneElement.java | 4 +++- .../data/redstone/RedstoneSetting.java | 4 +++- .../simulator2/data/tnt/TNTElement.java | 4 +++- .../simulator2/data/tnt/TNTSetting.java | 4 +++- 8 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorSetting.java 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 9354b78a..becfb213 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 @@ -1,4 +1,8 @@ package de.steamwar.bausystem.features.simulator2.data; +import java.util.ArrayList; +import java.util.List; + public class Simulator { + private List elements = new ArrayList<>(); } 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 61f20f42..76139dee 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 @@ -1,4 +1,10 @@ package de.steamwar.bausystem.features.simulator2.data; -public abstract class SimulatorElement { +import java.util.ArrayList; +import java.util.List; + +public abstract class SimulatorElement { + protected List settings = new ArrayList<>(); + + } 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 b212828c..1ed3aa3a 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 @@ -1,4 +1,8 @@ package de.steamwar.bausystem.features.simulator2.data; +import java.util.ArrayList; +import java.util.List; + public class SimulatorGroup { + private List> elements = new ArrayList<>(); } 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 new file mode 100644 index 00000000..0f5e36a2 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorSetting.java @@ -0,0 +1,23 @@ +/* + * 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.data; + +public interface SimulatorSetting { +} 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 ddcf6c4c..eace1fad 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 @@ -1,5 +1,7 @@ package de.steamwar.bausystem.features.simulator2.data.redstone; -public class RedstoneElement { +import de.steamwar.bausystem.features.simulator2.data.SimulatorElement; + +public class RedstoneElement extends SimulatorElement { } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneSetting.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneSetting.java index e849a230..931403b6 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneSetting.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneSetting.java @@ -1,4 +1,6 @@ package de.steamwar.bausystem.features.simulator2.data.redstone; -public class RedstoneSetting { +import de.steamwar.bausystem.features.simulator2.data.SimulatorSetting; + +public class RedstoneSetting implements SimulatorSetting { } 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 aeb86a57..96e7ae3c 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 @@ -1,4 +1,6 @@ package de.steamwar.bausystem.features.simulator2.data.tnt; -public class TNTElement { +import de.steamwar.bausystem.features.simulator2.data.SimulatorElement; + +public class TNTElement extends SimulatorElement { } 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 147aa3fd..1ba71387 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 @@ -1,4 +1,6 @@ package de.steamwar.bausystem.features.simulator2.data.tnt; -public class TNTSetting { +import de.steamwar.bausystem.features.simulator2.data.SimulatorSetting; + +public class TNTSetting implements SimulatorSetting { } From 0f1a8f55315c7fe124e82206787b63bf16a86c32 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Sun, 8 Oct 2023 12:22:31 +0200 Subject: [PATCH 03/48] Add final DataStructure --- .../bausystem/features/simulator2/data/Simulator.java | 3 +++ .../features/simulator2/data/SimulatorElement.java | 7 +++++-- .../bausystem/features/simulator2/data/SimulatorGroup.java | 3 +++ .../features/simulator2/data/SimulatorSetting.java | 5 ++++- .../features/simulator2/data/redstone/RedstoneSetting.java | 2 +- .../bausystem/features/simulator2/data/tnt/TNTSetting.java | 7 ++++++- 6 files changed, 22 insertions(+), 5 deletions(-) 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 becfb213..f2b0774e 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 @@ -1,8 +1,11 @@ package de.steamwar.bausystem.features.simulator2.data; +import org.bukkit.Material; + import java.util.ArrayList; import java.util.List; public class Simulator { + private Material material = Material.BARREL; private List elements = new ArrayList<>(); } 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 76139dee..d369b6a7 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 @@ -1,10 +1,13 @@ package de.steamwar.bausystem.features.simulator2.data; +import org.bukkit.Material; +import org.bukkit.util.Vector; + import java.util.ArrayList; import java.util.List; public abstract class SimulatorElement { + protected Material material; + protected Vector position; protected List settings = new ArrayList<>(); - - } 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 1ed3aa3a..c3bedb7b 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 @@ -1,8 +1,11 @@ package de.steamwar.bausystem.features.simulator2.data; +import org.bukkit.Material; + import java.util.ArrayList; import java.util.List; public class SimulatorGroup { + private Material material = Material.CHEST; private List> elements = new ArrayList<>(); } 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 0f5e36a2..393e03f2 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,5 +19,8 @@ package de.steamwar.bausystem.features.simulator2.data; -public interface SimulatorSetting { +public abstract class SimulatorSetting { + protected int tickOffset; + protected int lifetime = 80; + protected int order = 1; } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneSetting.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneSetting.java index 931403b6..5c3d9b55 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneSetting.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneSetting.java @@ -2,5 +2,5 @@ package de.steamwar.bausystem.features.simulator2.data.redstone; import de.steamwar.bausystem.features.simulator2.data.SimulatorSetting; -public class RedstoneSetting implements SimulatorSetting { +public class RedstoneSetting extends SimulatorSetting { } 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 1ba71387..40561321 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 @@ -2,5 +2,10 @@ package de.steamwar.bausystem.features.simulator2.data.tnt; import de.steamwar.bausystem.features.simulator2.data.SimulatorSetting; -public class TNTSetting implements SimulatorSetting { +public class TNTSetting extends SimulatorSetting { + private int count = 1; + private boolean xJump = false; + private boolean yJump = false; + private boolean zJump = false; + } From 7980f49dfac3466a280369aecd716084c058e952 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Sun, 8 Oct 2023 12:30:38 +0200 Subject: [PATCH 04/48] Add Licence header --- .../features/simulator2/data/Simulator.java | 20 +++++++++++++++++++ .../simulator2/data/SimulatorElement.java | 20 +++++++++++++++++++ .../simulator2/data/SimulatorGroup.java | 20 +++++++++++++++++++ .../data/redstone/RedstoneElement.java | 19 ++++++++++++++++++ .../data/redstone/RedstoneSetting.java | 19 ++++++++++++++++++ .../simulator2/data/tnt/TNTElement.java | 19 ++++++++++++++++++ .../simulator2/data/tnt/TNTSetting.java | 19 ++++++++++++++++++ 7 files changed, 136 insertions(+) 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 f2b0774e..082a1c43 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 @@ -1,3 +1,22 @@ +/* + * 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.data; import org.bukkit.Material; @@ -7,5 +26,6 @@ import java.util.List; public class Simulator { private Material material = Material.BARREL; + private boolean autoTrace = false; private List elements = new ArrayList<>(); } 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 d369b6a7..8b6401ab 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 @@ -1,3 +1,22 @@ +/* + * 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.data; import org.bukkit.Material; @@ -9,5 +28,6 @@ import java.util.List; public abstract class SimulatorElement { protected Material material; protected Vector position; + protected boolean disabled = false; protected List settings = new ArrayList<>(); } 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 c3bedb7b..b02103d6 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 @@ -1,3 +1,22 @@ +/* + * 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.data; import org.bukkit.Material; @@ -7,5 +26,6 @@ import java.util.List; public class SimulatorGroup { private Material material = Material.CHEST; + protected boolean disabled = false; private List> elements = new ArrayList<>(); } 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 eace1fad..0c5f8cdc 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 @@ -1,3 +1,22 @@ +/* + * 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.data.redstone; import de.steamwar.bausystem.features.simulator2.data.SimulatorElement; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneSetting.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneSetting.java index 5c3d9b55..522f27a8 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneSetting.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneSetting.java @@ -1,3 +1,22 @@ +/* + * 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.data.redstone; import de.steamwar.bausystem.features.simulator2.data.SimulatorSetting; 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 96e7ae3c..ba79a5f4 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 @@ -1,3 +1,22 @@ +/* + * 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.data.tnt; import de.steamwar.bausystem.features.simulator2.data.SimulatorElement; 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 40561321..8c044fa2 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 @@ -1,3 +1,22 @@ +/* + * 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.data.tnt; import de.steamwar.bausystem.features.simulator2.data.SimulatorSetting; From fbe4f00ac0852a9333a137e177656ce72d127bc2 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sun, 8 Oct 2023 21:37:15 +0200 Subject: [PATCH 05/48] Add basic GUI's Signed-off-by: yoyosource --- .../simulator2/SimulatorTestCommand.java | 56 +++++++ .../features/simulator2/SimulatorWatcher.java | 64 ++++++++ .../features/simulator2/data/Simulator.java | 15 +- .../simulator2/data/SimulatorElement.java | 39 ++++- .../simulator2/data/SimulatorGroup.java | 30 +++- .../simulator2/data/SimulatorSetting.java | 5 + .../data/redstone/RedstoneElement.java | 10 ++ .../simulator2/data/tnt/TNTElement.java | 39 +++++ .../simulator2/data/tnt/TNTSetting.java | 5 +- .../simulator2/gui/SimulatorGroupGui.java | 106 +++++++++++++ .../gui/SimulatorGroupSettingsGui.java | 126 +++++++++++++++ .../features/simulator2/gui/SimulatorGui.java | 94 +++++++++++ .../simulator2/gui/SimulatorRedstoneGui.java | 122 +++++++++++++++ .../gui/SimulatorRedstonePhaseGui.java | 73 +++++++++ .../gui/SimulatorRedstoneSettingsGui.java | 125 +++++++++++++++ .../simulator2/gui/SimulatorSettingsGui.java | 97 ++++++++++++ .../simulator2/gui/SimulatorTNTGui.java | 110 +++++++++++++ .../gui/SimulatorTNTSettingsGui.java | 148 ++++++++++++++++++ .../simulator2/gui/base/SimulatorBaseGui.java | 79 ++++++++++ .../simulator2/gui/base/SimulatorPageGui.java | 82 ++++++++++ .../gui/base/SimulatorScrollGui.java | 80 ++++++++++ .../gui/utils/SimulatorMaterialGui.java | 77 +++++++++ 22 files changed, 1577 insertions(+), 5 deletions(-) create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupSettingsGui.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseGui.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneSettingsGui.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorSettingsGui.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTSettingsGui.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/base/SimulatorBaseGui.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/base/SimulatorPageGui.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/base/SimulatorScrollGui.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/utils/SimulatorMaterialGui.java 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); + }); + } +} From 148761fa6387633ff5e43dca08b2d12fb461a29e Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Mon, 9 Oct 2023 16:54:41 +0200 Subject: [PATCH 06/48] Add Subpixel alignment to SimTNTSettingGui --- .../simulator2/gui/SimulatorTNTSettingsGui.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) 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 index dc90b12b..3f338eed 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTSettingsGui.java @@ -27,6 +27,7 @@ import de.steamwar.bausystem.features.simulator2.gui.utils.SimulatorMaterialGui; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.util.Vector; import java.util.ArrayList; import java.util.Arrays; @@ -86,29 +87,29 @@ public class SimulatorTNTSettingsGui extends SimulatorBaseGui { // Subpixel Alignment inventory.setItem(24, new SWItem(Material.SUNFLOWER, "§7Align§8: §eCenter", clickType -> { - // tnt.align(new Vector()); TODO Finalize + tnt.align(new Vector(0.5, 0, 0.5)); SimulatorWatcher.update(simulator); })); //z inventory.setItem(23, new SWItem(Material.OAK_BUTTON, "§7Align§8: §eNegativ Z", clickType -> { - + tnt.align(new Vector(0, 0, 0.49)); SimulatorWatcher.update(simulator); })); inventory.setItem(25, new SWItem(Material.OAK_BUTTON, "§7Align§8: §ePositiv Z", clickType -> { - + tnt.align(new Vector(0, 0, 0.51)); SimulatorWatcher.update(simulator); })); //X - inventory.setItem(15, new SWItem(Material.OAK_BUTTON, "§7Align§8: §eNegativ Z", clickType -> { - + inventory.setItem(15, new SWItem(Material.OAK_BUTTON, "§7Align§8: §eNegativ X", clickType -> { + tnt.align(new Vector(0.49, 0, 0)); SimulatorWatcher.update(simulator); })); - inventory.setItem(33, new SWItem(Material.OAK_BUTTON, "§7Align§8: §ePositiv Z", clickType -> { - + inventory.setItem(33, new SWItem(Material.OAK_BUTTON, "§7Align§8: §ePositiv X", clickType -> { + tnt.align(new Vector(0.51, 0, 0)); SimulatorWatcher.update(simulator); })); From 420cf4a5b84e0707ce73cd5db35fdd587e229603 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Tue, 10 Oct 2023 00:08:33 +0200 Subject: [PATCH 07/48] Finalize first gui version --- .../simulator2/data/SimulatorSetting.java | 12 ++ .../simulator2/data/tnt/TNTSetting.java | 11 ++ .../gui/SimulatorRedstonePhaseGui.java | 64 +++++- .../simulator2/gui/SimulatorTntPhaseGui.java | 182 ++++++++++++++++++ 4 files changed, 268 insertions(+), 1 deletion(-) create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseGui.java 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 b8ecb79c..47385a47 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 @@ -28,4 +28,16 @@ public abstract class SimulatorSetting { protected int tickOffset; protected int lifetime = 80; protected int order = 1; + + public void changeOffset(int tick){ + tickOffset += tick; + } + + public void changeLifetime(int tick){ + lifetime += tick; + } + + public void changeOrder(int tick){ + order += tick; + } } 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 601c3ac5..58c64990 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 @@ -30,4 +30,15 @@ public class TNTSetting extends SimulatorSetting { private boolean xJump = false; private boolean yJump = false; private boolean zJump = false; + + public boolean hasJump(){ + if(xJump || yJump || zJump) return true; + else return false; + } + + public void setJump(boolean jump){ + xJump = jump; + yJump = jump; + zJump = jump; + } } 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 index 60be2a34..3a7ac38c 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseGui.java @@ -29,6 +29,8 @@ import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; +import java.util.Arrays; + public class SimulatorRedstonePhaseGui extends SimulatorBaseGui { private final RedstoneElement redstoneElement; @@ -48,7 +50,7 @@ public class SimulatorRedstonePhaseGui extends SimulatorBaseGui { } @Override - public void populate() { // TODO: Finalize + public void populate() { if (!redstoneElement.getSettings().contains(redstone)) { back.open(); return; @@ -69,5 +71,65 @@ public class SimulatorRedstonePhaseGui extends SimulatorBaseGui { back.open(); SimulatorWatcher.update(simulator); })); + + //Tick Offset + int offset = redstone.getTickOffset(); + inventory.setItem(11, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + redstone.changeOffset(clickType.isShiftClick() ? 5 : 1); + SimulatorWatcher.update(simulator); + }); + + SWItem offsetItem = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + offset, clickType -> {}); + + offsetItem.getItemStack().setAmount(Math.max(1, Math.min(offset, 64))); + inventory.setItem(20, offsetItem); + inventory.setItem(29, SWItem.getDye(offset > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (offset - (clickType.isShiftClick() ? 5 : 1) < 0) { + redstone.changeOffset(-offset); + } else { + redstone.changeOffset(clickType.isShiftClick() ? -5 : -1); + } + SimulatorWatcher.update(simulator); + }); + + //Lifetime + int lifetime = redstone.getLifetime(); + inventory.setItem(12, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + redstone.changeLifetime(clickType.isShiftClick() ? 5 : 1); + SimulatorWatcher.update(simulator); + }); + + SWItem lifetimeItem = new SWItem(Material.CLOCK, "§eLifetime§8:§7 " + lifetime, clickType -> {}); + + lifetimeItem.getItemStack().setAmount(Math.max(1, Math.min(lifetime, 64))); + inventory.setItem(21, lifetimeItem); + inventory.setItem(30, SWItem.getDye(lifetime > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (lifetime - (clickType.isShiftClick() ? 5 : 1) < 0) { + redstone.changeLifetime(-lifetime); + } else { + redstone.changeLifetime(clickType.isShiftClick() ? -5 : -1); + } + SimulatorWatcher.update(simulator); + }); + + //Order + int order = redstone.getOrder(); + inventory.setItem(14, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + redstone.changeOrder(clickType.isShiftClick() ? 5 : 1); + SimulatorWatcher.update(simulator); + }); + + SWItem orderItem = new SWItem(Material.COMPASS, "§eOrder§8:§7 " + order, clickType -> {}); + + orderItem.getItemStack().setAmount(Math.max(1, Math.min(order, 64))); + inventory.setItem(23, orderItem); + inventory.setItem(32, SWItem.getDye(order > 1 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (order - (clickType.isShiftClick() ? 5 : 1) < 1) { + redstone.changeOrder(-order); + } else { + redstone.changeOrder(clickType.isShiftClick() ? -5 : -1); + } + SimulatorWatcher.update(simulator); + }); } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseGui.java new file mode 100644 index 00000000..db009b3c --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseGui.java @@ -0,0 +1,182 @@ +/* + * 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.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.utils.SimulatorMaterialGui; +import de.steamwar.inventory.SWItem; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import java.util.Arrays; + +public class SimulatorTntPhaseGui extends SimulatorBaseGui{ + private final TNTElement tntElement; + private final TNTSetting tnt; + private final SimulatorBaseGui back; + + public SimulatorTntPhaseGui(Player player, Simulator simulator, TNTElement tntElement, TNTSetting tnt, SimulatorBaseGui back) { + super(player, simulator, 5 * 9); + this.tntElement = tntElement; + this.tnt = tnt; + this.back = back; + } + + @Override + public String title() { + return "Tnt"; + } + + @Override + public void populate() { + if (!tntElement.getSettings().contains(tnt)) { + back.open(); + return; + } + + // Back Arrow + inventory.setItem(0, new SWItem(Material.ARROW, "§eBack", clickType -> { + back.open(); + })); + + // Material Chooser + inventory.setItem(4, new SWItem(tntElement.getMaterial(), "§TNT", clickType -> { + new SimulatorMaterialGui(player, simulator, tntElement::getMaterial, tntElement::setMaterial, this).open(); + })); + + inventory.setItem(8, new SWItem(Material.BARRIER, "§eDelete", clickType -> { + tntElement.getSettings().remove(tnt); + back.open(); + SimulatorWatcher.update(simulator); + })); + + //Count + int count = tnt.getCount(); + inventory.setItem(10, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + tnt.setCount(count + (clickType.isShiftClick() ? 5 : 1)); + SimulatorWatcher.update(simulator); + }); + + SWItem countItem = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + count, clickType -> {}); + + countItem.getItemStack().setAmount(Math.max(1, Math.min(count, 64))); + inventory.setItem(19, countItem); + inventory.setItem(28, SWItem.getDye(count > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (count - (clickType.isShiftClick() ? 5 : 1) < 1) { + tnt.setCount(1); + } else { + tnt.setCount(count + (clickType.isShiftClick() ? -5 : -1)); + } + SimulatorWatcher.update(simulator); + }); + + //Tick Offset + int offset = tnt.getTickOffset(); + inventory.setItem(10, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + tnt.changeOffset(clickType.isShiftClick() ? 5 : 1); + SimulatorWatcher.update(simulator); + }); + + SWItem offsetItem = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + offset, clickType -> {}); + + offsetItem.getItemStack().setAmount(Math.max(1, Math.min(offset, 64))); + inventory.setItem(19, offsetItem); + inventory.setItem(28, SWItem.getDye(offset > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (offset - (clickType.isShiftClick() ? 5 : 1) < 0) { + tnt.changeOffset(-offset); + } else { + tnt.changeOffset(clickType.isShiftClick() ? -5 : -1); + } + SimulatorWatcher.update(simulator); + }); + + //Lifetime + int lifetime = tnt.getLifetime(); + inventory.setItem(11, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + tnt.changeLifetime(clickType.isShiftClick() ? 5 : 1); + SimulatorWatcher.update(simulator); + }); + + SWItem lifetimeItem = new SWItem(Material.CLOCK, "§eLifetime§8:§7 " + lifetime, clickType -> {}); + + lifetimeItem.getItemStack().setAmount(Math.max(1, Math.min(lifetime, 64))); + inventory.setItem(20, lifetimeItem); + inventory.setItem(29, SWItem.getDye(lifetime > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (lifetime - (clickType.isShiftClick() ? 5 : 1) < 0) { + tnt.changeLifetime(-lifetime); + } else { + tnt.changeLifetime(clickType.isShiftClick() ? -5 : -1); + } + SimulatorWatcher.update(simulator); + }); + + //Order + int order = tnt.getOrder(); + inventory.setItem(13, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + tnt.changeOrder(clickType.isShiftClick() ? 5 : 1); + SimulatorWatcher.update(simulator); + }); + + SWItem orderItem = new SWItem(Material.COMPASS, "§eLifetime§8:§7 " + order, clickType -> {}); + + orderItem.getItemStack().setAmount(Math.max(1, Math.min(order, 64))); + inventory.setItem(22, orderItem); + inventory.setItem(31, SWItem.getDye(order > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (order - (clickType.isShiftClick() ? 5 : 1) < 1) { + tnt.changeOrder(-order); + } else { + tnt.changeOrder(clickType.isShiftClick() ? -5 : -1); + } + SimulatorWatcher.update(simulator); + }); + + //Jump + SWItem jumpX = new SWItem(tnt.isXJump() ? Material.GREEN_WOOL : Material.RED_WOOL, "§7TNT §eJump X§8: " + (tnt.isZJump() ? "§aon" : "§coff"), clickType -> { + tnt.setXJump(!tnt.isXJump()); + SimulatorWatcher.update(simulator); + }); + inventory.setItem(33, jumpX); + + SWItem jumpY = new SWItem(tnt.isYJump() ? Material.GREEN_WOOL : Material.RED_WOOL, "§7TNT §eJump Y§8: " + (tnt.isYJump() ? "§aon" : "§coff"), clickType -> { + tnt.setYJump(!tnt.isYJump()); + SimulatorWatcher.update(simulator); + }); + inventory.setItem(16, jumpY); + + SWItem jumpZ = new SWItem(tnt.isZJump() ? Material.GREEN_WOOL : Material.RED_WOOL, "§7TNT §eJump Z§8: " + (tnt.isZJump() ? "§aon" : "§coff"), clickType -> { + tnt.setZJump(!tnt.isZJump()); + SimulatorWatcher.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); + }); + + //inventory.setItem(); + } +} From 273fba879e11d4845abaae717bf8bb44e50d5aa3 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Tue, 10 Oct 2023 00:17:38 +0200 Subject: [PATCH 08/48] Add Phase order upper limit --- .../bausystem/features/simulator2/data/SimulatorSetting.java | 1 + .../features/simulator2/gui/SimulatorRedstonePhaseGui.java | 4 ++-- .../features/simulator2/gui/SimulatorTntPhaseGui.java | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) 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 47385a47..bcea1058 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 @@ -25,6 +25,7 @@ import lombok.Setter; @Getter @Setter public abstract class SimulatorSetting { + public static final int ORDER_LIMIT = 64; protected int tickOffset; protected int lifetime = 80; protected int order = 1; 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 index 3a7ac38c..bb06e7cb 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseGui.java @@ -21,6 +21,7 @@ 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.SimulatorSetting; 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; @@ -32,7 +33,6 @@ import org.bukkit.entity.Player; import java.util.Arrays; public class SimulatorRedstonePhaseGui extends SimulatorBaseGui { - private final RedstoneElement redstoneElement; private final RedstoneSetting redstone; private final SimulatorBaseGui back; @@ -115,7 +115,7 @@ public class SimulatorRedstonePhaseGui extends SimulatorBaseGui { //Order int order = redstone.getOrder(); inventory.setItem(14, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { - redstone.changeOrder(clickType.isShiftClick() ? 5 : 1); + redstone.setOrder(Math.min(SimulatorSetting.ORDER_LIMIT, order + (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseGui.java index db009b3c..9d732f03 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseGui.java @@ -21,6 +21,7 @@ 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.SimulatorSetting; 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; @@ -136,7 +137,7 @@ public class SimulatorTntPhaseGui extends SimulatorBaseGui{ //Order int order = tnt.getOrder(); inventory.setItem(13, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { - tnt.changeOrder(clickType.isShiftClick() ? 5 : 1); + tnt.setOrder(Math.min(SimulatorSetting.ORDER_LIMIT, order + (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }); From f067e55d1fe40234c39b55821abf3a488553fa58 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Tue, 10 Oct 2023 00:37:19 +0200 Subject: [PATCH 09/48] Refactored PhaseGuis --- .../simulator2/data/SimulatorSetting.java | 12 ------ .../gui/SimulatorRedstonePhaseGui.java | 29 +++++--------- .../simulator2/gui/SimulatorTntPhaseGui.java | 38 ++++++------------- 3 files changed, 20 insertions(+), 59 deletions(-) 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 bcea1058..46d5a151 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 @@ -29,16 +29,4 @@ public abstract class SimulatorSetting { protected int tickOffset; protected int lifetime = 80; protected int order = 1; - - public void changeOffset(int tick){ - tickOffset += tick; - } - - public void changeLifetime(int tick){ - lifetime += tick; - } - - public void changeOrder(int tick){ - order += tick; - } } 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 index bb06e7cb..fd8b992a 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseGui.java @@ -66,6 +66,7 @@ public class SimulatorRedstonePhaseGui extends SimulatorBaseGui { new SimulatorMaterialGui(player, simulator, redstoneElement::getMaterial, redstoneElement::setMaterial, this).open(); })); + // Delete inventory.setItem(8, new SWItem(Material.BARRIER, "§eDelete", clickType -> { redstoneElement.getSettings().remove(redstone); back.open(); @@ -75,40 +76,32 @@ public class SimulatorRedstonePhaseGui extends SimulatorBaseGui { //Tick Offset int offset = redstone.getTickOffset(); inventory.setItem(11, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { - redstone.changeOffset(clickType.isShiftClick() ? 5 : 1); + redstone.setTickOffset(offset + (clickType.isShiftClick() ? 5 : 1)); SimulatorWatcher.update(simulator); }); SWItem offsetItem = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + offset, clickType -> {}); - offsetItem.getItemStack().setAmount(Math.max(1, Math.min(offset, 64))); inventory.setItem(20, offsetItem); + inventory.setItem(29, SWItem.getDye(offset > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { - if (offset - (clickType.isShiftClick() ? 5 : 1) < 0) { - redstone.changeOffset(-offset); - } else { - redstone.changeOffset(clickType.isShiftClick() ? -5 : -1); - } + redstone.setTickOffset(Math.max(1, offset - (clickType.isShiftClick() ? -5 : -1))); SimulatorWatcher.update(simulator); }); //Lifetime int lifetime = redstone.getLifetime(); inventory.setItem(12, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { - redstone.changeLifetime(clickType.isShiftClick() ? 5 : 1); + redstone.setLifetime(lifetime + (clickType.isShiftClick() ? 5 : 1)); SimulatorWatcher.update(simulator); }); SWItem lifetimeItem = new SWItem(Material.CLOCK, "§eLifetime§8:§7 " + lifetime, clickType -> {}); - lifetimeItem.getItemStack().setAmount(Math.max(1, Math.min(lifetime, 64))); inventory.setItem(21, lifetimeItem); + inventory.setItem(30, SWItem.getDye(lifetime > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { - if (lifetime - (clickType.isShiftClick() ? 5 : 1) < 0) { - redstone.changeLifetime(-lifetime); - } else { - redstone.changeLifetime(clickType.isShiftClick() ? -5 : -1); - } + redstone.setLifetime(Math.max(1, lifetime - (clickType.isShiftClick() ? -5 : -1))); SimulatorWatcher.update(simulator); }); @@ -120,15 +113,11 @@ public class SimulatorRedstonePhaseGui extends SimulatorBaseGui { }); SWItem orderItem = new SWItem(Material.COMPASS, "§eOrder§8:§7 " + order, clickType -> {}); - orderItem.getItemStack().setAmount(Math.max(1, Math.min(order, 64))); inventory.setItem(23, orderItem); + inventory.setItem(32, SWItem.getDye(order > 1 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { - if (order - (clickType.isShiftClick() ? 5 : 1) < 1) { - redstone.changeOrder(-order); - } else { - redstone.changeOrder(clickType.isShiftClick() ? -5 : -1); - } + redstone.setOrder(Math.max(1, order - (clickType.isShiftClick() ? -5 : -1))); SimulatorWatcher.update(simulator); }); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseGui.java index 9d732f03..c8a45d1f 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseGui.java @@ -68,6 +68,7 @@ public class SimulatorTntPhaseGui extends SimulatorBaseGui{ new SimulatorMaterialGui(player, simulator, tntElement::getMaterial, tntElement::setMaterial, this).open(); })); + //Delete inventory.setItem(8, new SWItem(Material.BARRIER, "§eDelete", clickType -> { tntElement.getSettings().remove(tnt); back.open(); @@ -82,55 +83,43 @@ public class SimulatorTntPhaseGui extends SimulatorBaseGui{ }); SWItem countItem = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + count, clickType -> {}); - countItem.getItemStack().setAmount(Math.max(1, Math.min(count, 64))); inventory.setItem(19, countItem); + inventory.setItem(28, SWItem.getDye(count > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { - if (count - (clickType.isShiftClick() ? 5 : 1) < 1) { - tnt.setCount(1); - } else { - tnt.setCount(count + (clickType.isShiftClick() ? -5 : -1)); - } + tnt.setCount(Math.max(1, count - (clickType.isShiftClick() ? -5 : -1))); SimulatorWatcher.update(simulator); }); //Tick Offset int offset = tnt.getTickOffset(); inventory.setItem(10, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { - tnt.changeOffset(clickType.isShiftClick() ? 5 : 1); + tnt.setTickOffset(offset + (clickType.isShiftClick() ? 5 : 1)); SimulatorWatcher.update(simulator); }); SWItem offsetItem = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + offset, clickType -> {}); - offsetItem.getItemStack().setAmount(Math.max(1, Math.min(offset, 64))); inventory.setItem(19, offsetItem); + inventory.setItem(28, SWItem.getDye(offset > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { - if (offset - (clickType.isShiftClick() ? 5 : 1) < 0) { - tnt.changeOffset(-offset); - } else { - tnt.changeOffset(clickType.isShiftClick() ? -5 : -1); - } + tnt.setTickOffset(Math.max(1, offset - (clickType.isShiftClick() ? -5 : -1))); SimulatorWatcher.update(simulator); }); //Lifetime int lifetime = tnt.getLifetime(); inventory.setItem(11, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { - tnt.changeLifetime(clickType.isShiftClick() ? 5 : 1); + tnt.setLifetime(lifetime + (clickType.isShiftClick() ? 5 : 1)); SimulatorWatcher.update(simulator); }); SWItem lifetimeItem = new SWItem(Material.CLOCK, "§eLifetime§8:§7 " + lifetime, clickType -> {}); - lifetimeItem.getItemStack().setAmount(Math.max(1, Math.min(lifetime, 64))); inventory.setItem(20, lifetimeItem); + inventory.setItem(29, SWItem.getDye(lifetime > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { - if (lifetime - (clickType.isShiftClick() ? 5 : 1) < 0) { - tnt.changeLifetime(-lifetime); - } else { - tnt.changeLifetime(clickType.isShiftClick() ? -5 : -1); - } + tnt.setLifetime(Math.max(1, lifetime - (clickType.isShiftClick() ? -5 : -1))); SimulatorWatcher.update(simulator); }); @@ -146,11 +135,7 @@ public class SimulatorTntPhaseGui extends SimulatorBaseGui{ orderItem.getItemStack().setAmount(Math.max(1, Math.min(order, 64))); inventory.setItem(22, orderItem); inventory.setItem(31, SWItem.getDye(order > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { - if (order - (clickType.isShiftClick() ? 5 : 1) < 1) { - tnt.changeOrder(-order); - } else { - tnt.changeOrder(clickType.isShiftClick() ? -5 : -1); - } + tnt.setOrder(Math.max(1, order - (clickType.isShiftClick() ? -5 : -1))); SimulatorWatcher.update(simulator); }); @@ -177,7 +162,6 @@ public class SimulatorTntPhaseGui extends SimulatorBaseGui{ tnt.setJump(!tnt.hasJump()); SimulatorWatcher.update(simulator); }); - - //inventory.setItem(); + inventory.setItem(25, jumpAll); } } From 1b2d19c31dd816f54f0d4162a9b90183983f1fc9 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Tue, 10 Oct 2023 01:06:46 +0200 Subject: [PATCH 10/48] Add call to tnt phase menu --- .../bausystem/features/simulator2/gui/SimulatorTNTGui.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index b979e930..ab522d11 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java @@ -103,7 +103,7 @@ public class SimulatorTNTGui extends SimulatorScrollGui { SimulatorWatcher.update(simulator); }), new SWItem(Material.ANVIL, "§eEdit Phase", clickType -> { - // Open Edit Phase menu + new SimulatorTntPhaseGui(player, simulator, tntElement, tntSetting, this).open(); }), }; } From 6e39f3e92a283726186b7c77d0d9cf82eb7f5ec1 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Tue, 10 Oct 2023 17:27:55 +0200 Subject: [PATCH 11/48] Made some fixes --- .../simulator2/gui/SimulatorTntPhaseGui.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseGui.java index c8a45d1f..e9b3defd 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseGui.java @@ -86,7 +86,7 @@ public class SimulatorTntPhaseGui extends SimulatorBaseGui{ countItem.getItemStack().setAmount(Math.max(1, Math.min(count, 64))); inventory.setItem(19, countItem); - inventory.setItem(28, SWItem.getDye(count > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + inventory.setItem(28, 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); }); @@ -125,34 +125,34 @@ public class SimulatorTntPhaseGui extends SimulatorBaseGui{ //Order int order = tnt.getOrder(); - inventory.setItem(13, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + inventory.setItem(13, SWItem.getDye(order < SimulatorSetting.ORDER_LIMIT ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { tnt.setOrder(Math.min(SimulatorSetting.ORDER_LIMIT, order + (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }); SWItem orderItem = new SWItem(Material.COMPASS, "§eLifetime§8:§7 " + order, clickType -> {}); - orderItem.getItemStack().setAmount(Math.max(1, Math.min(order, 64))); inventory.setItem(22, orderItem); - inventory.setItem(31, SWItem.getDye(order > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + + inventory.setItem(31, SWItem.getDye(order > 1 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { tnt.setOrder(Math.max(1, order - (clickType.isShiftClick() ? -5 : -1))); SimulatorWatcher.update(simulator); }); //Jump - SWItem jumpX = new SWItem(tnt.isXJump() ? Material.GREEN_WOOL : Material.RED_WOOL, "§7TNT §eJump X§8: " + (tnt.isZJump() ? "§aon" : "§coff"), clickType -> { + 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); }); inventory.setItem(33, jumpX); - SWItem jumpY = new SWItem(tnt.isYJump() ? Material.GREEN_WOOL : Material.RED_WOOL, "§7TNT §eJump Y§8: " + (tnt.isYJump() ? "§aon" : "§coff"), clickType -> { + 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); }); inventory.setItem(16, jumpY); - SWItem jumpZ = new SWItem(tnt.isZJump() ? Material.GREEN_WOOL : Material.RED_WOOL, "§7TNT §eJump Z§8: " + (tnt.isZJump() ? "§aon" : "§coff"), clickType -> { + 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); }); From b5a81eb6db096dc67570d3384d8e1f054f21a0d8 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Thu, 12 Oct 2023 10:25:40 +0200 Subject: [PATCH 12/48] Add rmoval of empty group --- .../bausystem/features/simulator2/gui/SimulatorGui.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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 index 1a5d5325..2b019260 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java @@ -31,6 +31,7 @@ import org.bukkit.Material; import org.bukkit.entity.Player; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; public class SimulatorGui extends SimulatorPageGui { @@ -46,7 +47,12 @@ public class SimulatorGui extends SimulatorPageGui { @Override public void headerAndFooter() { - // TODO: Remove empty Groups + for(Iterator i = simulator.getElements().iterator(); i.hasNext();){ + if(i.next().getElements().isEmpty()){ + i.remove(); + } + } + inventory.setItem(4, new SWItem(simulator.getMaterial(), "§e" + simulator.getName(), clickType -> { new SimulatorMaterialGui(player, simulator, simulator::getMaterial, simulator::setMaterial, this).open(); })); From 0f7c19da5a523c19e63cb94a2f6638d1a48e8d6f Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Thu, 12 Oct 2023 10:35:42 +0200 Subject: [PATCH 13/48] Add quick delete fo phases --- .../features/simulator2/gui/SimulatorRedstoneGui.java | 6 +++++- .../bausystem/features/simulator2/gui/SimulatorTNTGui.java | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) 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 index ae5a019a..08270b59 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java @@ -101,7 +101,11 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { @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 -> {}); + 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 -> { + //Quick remove per rightclick + if (clickType.isRightClick()) redstoneElement.getSettings().remove(redstoneSetting); + SimulatorWatcher.update(simulator); + }); redstone.getItemStack().setAmount(Math.max(1, Math.min(redstoneSetting.getTickOffset(), 64))); return new SWItem[] { 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 index ab522d11..532cc38c 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java @@ -89,7 +89,11 @@ public class SimulatorTNTGui extends SimulatorScrollGui { @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 -> {}); + 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 -> { + //Quick remove per rightclick + if (clickType.isRightClick()) tntElement.getSettings().remove(tntSetting); + SimulatorWatcher.update(simulator); + }); tnt.getItemStack().setAmount(Math.min(tntSetting.getCount(), 64)); return new SWItem[] { From 68f81c8c3ed3f2d3216ed260b8a5eb9cd7b527a2 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Fri, 13 Oct 2023 12:02:55 +0200 Subject: [PATCH 14/48] Add last Phase and option for adding phase Refactored for coherent naming sceme --- .../simulator2/SimulatorTestCommand.java | 10 +++--- .../simulator2/data/SimulatorElement.java | 10 +++--- ...ulatorSetting.java => SimulatorPhase.java} | 7 ++-- .../data/redstone/RedstoneElement.java | 3 +- ...edstoneSetting.java => RedstonePhase.java} | 9 +++-- .../simulator2/data/tnt/TNTElement.java | 2 +- .../tnt/{TNTSetting.java => TNTPhase.java} | 8 +++-- .../simulator2/gui/SimulatorGroupGui.java | 2 +- .../features/simulator2/gui/SimulatorGui.java | 2 +- .../simulator2/gui/SimulatorRedstoneGui.java | 34 ++++++++++++------- ...=> SimulatorRedstonePhaseSettingsGui.java} | 16 ++++----- .../gui/SimulatorRedstoneSettingsGui.java | 4 +-- .../simulator2/gui/SimulatorTNTGui.java | 28 +++++++++++---- .../gui/SimulatorTNTSettingsGui.java | 2 +- ...java => SimulatorTntPhaseSettingsGui.java} | 20 +++++------ .../gui/base/SimulatorScrollGui.java | 29 ++++++++++++---- 16 files changed, 118 insertions(+), 68 deletions(-) rename BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/{SimulatorSetting.java => SimulatorPhase.java} (90%) rename BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/{RedstoneSetting.java => RedstonePhase.java} (76%) rename BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/{TNTSetting.java => TNTPhase.java} (85%) rename BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/{SimulatorRedstonePhaseGui.java => SimulatorRedstonePhaseSettingsGui.java} (89%) rename BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/{SimulatorTntPhaseGui.java => SimulatorTntPhaseSettingsGui.java} (88%) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java index 1117a766..82b7703e 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java @@ -22,9 +22,9 @@ 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.redstone.RedstonePhase; import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement; -import de.steamwar.bausystem.features.simulator2.data.tnt.TNTSetting; +import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase; import de.steamwar.bausystem.features.simulator2.gui.SimulatorGui; import de.steamwar.command.SWCommand; import de.steamwar.linkage.Linked; @@ -39,13 +39,13 @@ public class SimulatorTestCommand extends SWCommand { 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())); + SimulatorGroup group1 = new SimulatorGroup().add(new TNTElement(new Vector(0, 0, 0)).add(new TNTPhase())).add(new TNTElement(new Vector(0, 0, 0)).add(new TNTPhase())); SIMULATOR.getElements().add(group1); - SimulatorGroup group2 = new SimulatorGroup().add(new TNTElement(new Vector(0, 0, 0)).add(new TNTSetting())); + SimulatorGroup group2 = new SimulatorGroup().add(new TNTElement(new Vector(0, 0, 0)).add(new TNTPhase())); SIMULATOR.getElements().add(group2); - SimulatorGroup group3 = new SimulatorGroup().add(new RedstoneElement(new Vector(0, 0, 0)).add(new RedstoneSetting())); + SimulatorGroup group3 = new SimulatorGroup().add(new RedstoneElement(new Vector(0, 0, 0)).add(new RedstonePhase())); SIMULATOR.getElements().add(group3); } 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 a218ea6b..1274f7c8 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 @@ -29,11 +29,11 @@ import java.util.List; @Getter @Setter -public abstract class SimulatorElement { +public abstract class SimulatorElement { protected Material material; protected final Vector position; protected boolean disabled = false; - protected final List settings = new ArrayList<>(); + protected final List phases = new ArrayList<>(); protected SimulatorElement(Material material, Vector position) { this.material = material; @@ -41,21 +41,21 @@ public abstract class SimulatorElement { } public SimulatorElement add(T setting) { - settings.add(setting); + phases.add(setting); return this; } public abstract String getName(); public int getBaseTick() { - return settings.stream() + return phases.stream() .mapToInt(value -> value.tickOffset) .min() .orElse(0); } public void changeBaseTicks(int tick) { - settings.forEach(t -> { + phases.forEach(t -> { t.tickOffset += tick; }); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorSetting.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java similarity index 90% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorSetting.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java index 46d5a151..c77c2396 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorSetting.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java @@ -24,9 +24,12 @@ import lombok.Setter; @Getter @Setter -public abstract class SimulatorSetting { +public abstract class SimulatorPhase { public static final int ORDER_LIMIT = 64; - protected int tickOffset; + + protected int tickOffset = 0; protected int lifetime = 80; protected int order = 1; + + public SimulatorPhase(){}; } 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 a633ac45..bea1c83d 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 @@ -23,8 +23,7 @@ import de.steamwar.bausystem.features.simulator2.data.SimulatorElement; import org.bukkit.Material; import org.bukkit.util.Vector; -public class RedstoneElement extends SimulatorElement { - +public class RedstoneElement extends SimulatorElement { public RedstoneElement(Vector position) { super(Material.REDSTONE_BLOCK, position); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneSetting.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java similarity index 76% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneSetting.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java index 522f27a8..f22b3cee 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneSetting.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java @@ -19,7 +19,12 @@ package de.steamwar.bausystem.features.simulator2.data.redstone; -import de.steamwar.bausystem.features.simulator2.data.SimulatorSetting; +import de.steamwar.bausystem.features.simulator2.data.SimulatorPhase; +import org.bukkit.Material; -public class RedstoneSetting extends SimulatorSetting { +public class RedstonePhase extends SimulatorPhase { + public RedstonePhase(){}; + public RedstonePhase(int tickOffset){ + this.tickOffset = tickOffset; + } } 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 bbcfae6f..3eb27a82 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 @@ -23,7 +23,7 @@ import de.steamwar.bausystem.features.simulator2.data.SimulatorElement; import org.bukkit.Material; import org.bukkit.util.Vector; -public class TNTElement extends SimulatorElement { +public class TNTElement extends SimulatorElement { public TNTElement(Vector position) { super(Material.TNT, position); 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/TNTPhase.java similarity index 85% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTSetting.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTPhase.java index 58c64990..82bd03b6 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/TNTPhase.java @@ -19,18 +19,22 @@ package de.steamwar.bausystem.features.simulator2.data.tnt; -import de.steamwar.bausystem.features.simulator2.data.SimulatorSetting; +import de.steamwar.bausystem.features.simulator2.data.SimulatorPhase; import lombok.Getter; import lombok.Setter; @Getter @Setter -public class TNTSetting extends SimulatorSetting { +public class TNTPhase extends SimulatorPhase { private int count = 1; private boolean xJump = false; private boolean yJump = false; private boolean zJump = false; + public TNTPhase(){} + + public TNTPhase(int tickOffset){this.tickOffset = tickOffset;} + public boolean hasJump(){ if(xJump || yJump || zJump) return true; else return 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 index c9a4c68e..c38edc90 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java @@ -85,7 +85,7 @@ public class SimulatorGroupGui extends SimulatorPageGui> { @Override public SWItem convert(SimulatorElement element) { List lore = new ArrayList<>(); - lore.add("§7Phase count§8:§e " + element.getSettings().size()); + lore.add("§7Phase count§8:§e " + element.getPhases().size()); lore.add("§7Tick§8:§e " + element.getBaseTick()); lore.add(""); lore.add("§7X§8:§e " + element.getPosition().getX()); 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 index 2b019260..309c8b70 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java @@ -67,7 +67,7 @@ public class SimulatorGui extends SimulatorPageGui { if (elements.size() == 1) { SimulatorElement element = elements.get(0); List lore = new ArrayList<>(); - lore.add("§7Phase count§8:§e " + element.getSettings().size()); + lore.add("§7Phase count§8:§e " + element.getPhases().size()); lore.add("§7Tick§8:§e " + element.getBaseTick()); lore.add(""); lore.add("§7X§8:§e " + element.getPosition().getX()); 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 index 08270b59..0f09eeab 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java @@ -23,8 +23,7 @@ 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.data.redstone.RedstonePhase; 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; @@ -36,14 +35,14 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class SimulatorRedstoneGui extends SimulatorScrollGui { +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()); + super(player, simulator, 6 * 9, redstoneElement.getPhases()); this.simulatorGroup = simulatorGroup; this.redstoneElement = redstoneElement; this.back = back; @@ -56,12 +55,6 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { @Override public void headerAndFooter() { - if (redstoneElement.getSettings().isEmpty()) { - simulatorGroup.getElements().remove(redstoneElement); - back.open(); - return; - } - // TODO Sort Data List // Back Arrow @@ -100,10 +93,10 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { } @Override - public SWItem[] column(RedstoneSetting redstoneSetting) { + public SWItem[] column(RedstonePhase 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 -> { //Quick remove per rightclick - if (clickType.isRightClick()) redstoneElement.getSettings().remove(redstoneSetting); + if (clickType.isRightClick()) redstoneElement.getPhases().remove(redstoneSetting); SimulatorWatcher.update(simulator); }); redstone.getItemStack().setAmount(Math.max(1, Math.min(redstoneSetting.getTickOffset(), 64))); @@ -119,8 +112,23 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { SimulatorWatcher.update(simulator); }), new SWItem(Material.ANVIL, "§eEdit Activation", clickType -> { - new SimulatorRedstonePhaseGui(player, simulator, redstoneElement, redstoneSetting, this).open(); + new SimulatorRedstonePhaseSettingsGui(player, simulator, redstoneElement, redstoneSetting, this).open(); }), }; } + + @Override + public SWItem[] lastColumn() { + return new SWItem[] { + new SWItem(SWItem.getDye(10), "§aNew Phase", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { + RedstonePhase lastElement = redstoneElement.getPhases().get(redstoneElement.getPhases().size() - 1); + RedstonePhase newPhase = new RedstonePhase(lastElement.getTickOffset() + 1); + if(clickType.isShiftClick()) newPhase.setTickOffset(newPhase.getTickOffset() + 4); + redstoneElement.add(newPhase); + SimulatorWatcher.update(simulator); + }), + new SWItem(Material.REDSTONE_BLOCK, "§eRedstone§8:§a New Phase", Arrays.asList(), false, clickType -> {}), + new SWItem(SWItem.getDye(8), "", Arrays.asList(), false, clickType -> {}), + }; + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java similarity index 89% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseGui.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java index fd8b992a..4479d75d 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java @@ -21,9 +21,9 @@ 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.SimulatorSetting; +import de.steamwar.bausystem.features.simulator2.data.SimulatorPhase; 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.redstone.RedstonePhase; import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui; import de.steamwar.bausystem.features.simulator2.gui.utils.SimulatorMaterialGui; import de.steamwar.inventory.SWItem; @@ -32,12 +32,12 @@ import org.bukkit.entity.Player; import java.util.Arrays; -public class SimulatorRedstonePhaseGui extends SimulatorBaseGui { +public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { private final RedstoneElement redstoneElement; - private final RedstoneSetting redstone; + private final RedstonePhase redstone; private final SimulatorBaseGui back; - public SimulatorRedstonePhaseGui(Player player, Simulator simulator, RedstoneElement redstoneElement, RedstoneSetting 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; @@ -51,7 +51,7 @@ public class SimulatorRedstonePhaseGui extends SimulatorBaseGui { @Override public void populate() { - if (!redstoneElement.getSettings().contains(redstone)) { + if (!redstoneElement.getPhases().contains(redstone)) { back.open(); return; } @@ -68,7 +68,7 @@ public class SimulatorRedstonePhaseGui extends SimulatorBaseGui { // Delete inventory.setItem(8, new SWItem(Material.BARRIER, "§eDelete", clickType -> { - redstoneElement.getSettings().remove(redstone); + redstoneElement.getPhases().remove(redstone); back.open(); SimulatorWatcher.update(simulator); })); @@ -108,7 +108,7 @@ public class SimulatorRedstonePhaseGui extends SimulatorBaseGui { //Order int order = redstone.getOrder(); inventory.setItem(14, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { - redstone.setOrder(Math.min(SimulatorSetting.ORDER_LIMIT, order + (clickType.isShiftClick() ? 5 : 1))); + redstone.setOrder(Math.min(SimulatorPhase.ORDER_LIMIT, order + (clickType.isShiftClick() ? 5 : 1))); 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 index c191f862..6461eb80 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneSettingsGui.java @@ -49,7 +49,7 @@ public class SimulatorRedstoneSettingsGui extends SimulatorBaseGui { @Override public void populate() { - if (redstone.getSettings().isEmpty()) { + if (redstone.getPhases().isEmpty()) { back.open(); return; } @@ -61,7 +61,7 @@ public class SimulatorRedstoneSettingsGui extends SimulatorBaseGui { // Material Chooser List lore = new ArrayList<>(); - lore.add("§7Activation count§8:§e " + redstone.getSettings().size()); + lore.add("§7Activation count§8:§e " + redstone.getPhases().size()); lore.add("§7Tick§8:§e " + redstone.getBaseTick()); if (redstone.isDisabled()) { lore.add(""); 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 index 532cc38c..15451b16 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java @@ -21,8 +21,9 @@ 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.RedstonePhase; import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement; -import de.steamwar.bausystem.features.simulator2.data.tnt.TNTSetting; +import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase; 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; @@ -34,13 +35,13 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class SimulatorTNTGui extends SimulatorScrollGui { +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()); + super(player, simulator, 6 * 9, tntElement.getPhases()); this.tntElement = tntElement; this.back = back; } @@ -88,10 +89,10 @@ public class SimulatorTNTGui extends SimulatorScrollGui { } @Override - public SWItem[] column(TNTSetting tntSetting) { + public SWItem[] column(TNTPhase 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 -> { //Quick remove per rightclick - if (clickType.isRightClick()) tntElement.getSettings().remove(tntSetting); + if (clickType.isRightClick()) tntElement.getPhases().remove(tntSetting); SimulatorWatcher.update(simulator); }); tnt.getItemStack().setAmount(Math.min(tntSetting.getCount(), 64)); @@ -107,8 +108,23 @@ public class SimulatorTNTGui extends SimulatorScrollGui { SimulatorWatcher.update(simulator); }), new SWItem(Material.ANVIL, "§eEdit Phase", clickType -> { - new SimulatorTntPhaseGui(player, simulator, tntElement, tntSetting, this).open(); + new SimulatorTntPhaseSettingsGui(player, simulator, tntElement, tntSetting, this).open(); }), }; } + + @Override + public SWItem[] lastColumn() { + return new SWItem[] { + new SWItem(SWItem.getDye(10), "§aNew Phase", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { + TNTPhase lastElement = tntElement.getPhases().get(tntElement.getPhases().size() - 1); + TNTPhase newPhase = new TNTPhase(lastElement.getTickOffset() + 1); + if(clickType.isShiftClick()) newPhase.setCount(newPhase.getCount() + 4); + tntElement.add(newPhase); + SimulatorWatcher.update(simulator); + }), + new SWItem(Material.TNT, "§TNT§8:§a New Phase", Arrays.asList(), false, clickType -> {}), + new SWItem(SWItem.getDye(8), "", Arrays.asList(), false, clickType -> {}), + }; + } } 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 index 3f338eed..aaaed03e 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTSettingsGui.java @@ -57,7 +57,7 @@ public class SimulatorTNTSettingsGui extends SimulatorBaseGui { // Material Chooser List lore = new ArrayList<>(); - lore.add("§7Phase count§8:§e " + tnt.getSettings().size()); + lore.add("§7Phase count§8:§e " + tnt.getPhases().size()); lore.add("§7Tick§8:§e " + tnt.getBaseTick()); if (tnt.isDisabled()) { lore.add(""); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseSettingsGui.java similarity index 88% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseGui.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseSettingsGui.java index e9b3defd..3c0a7daf 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseSettingsGui.java @@ -21,11 +21,9 @@ 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.SimulatorSetting; -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.SimulatorPhase; import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement; -import de.steamwar.bausystem.features.simulator2.data.tnt.TNTSetting; +import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase; import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui; import de.steamwar.bausystem.features.simulator2.gui.utils.SimulatorMaterialGui; import de.steamwar.inventory.SWItem; @@ -34,12 +32,12 @@ import org.bukkit.entity.Player; import java.util.Arrays; -public class SimulatorTntPhaseGui extends SimulatorBaseGui{ +public class SimulatorTntPhaseSettingsGui extends SimulatorBaseGui{ private final TNTElement tntElement; - private final TNTSetting tnt; + private final TNTPhase tnt; private final SimulatorBaseGui back; - public SimulatorTntPhaseGui(Player player, Simulator simulator, TNTElement tntElement, TNTSetting tnt, SimulatorBaseGui back) { + public SimulatorTntPhaseSettingsGui(Player player, Simulator simulator, TNTElement tntElement, TNTPhase tnt, SimulatorBaseGui back) { super(player, simulator, 5 * 9); this.tntElement = tntElement; this.tnt = tnt; @@ -53,7 +51,7 @@ public class SimulatorTntPhaseGui extends SimulatorBaseGui{ @Override public void populate() { - if (!tntElement.getSettings().contains(tnt)) { + if (!tntElement.getPhases().contains(tnt)) { back.open(); return; } @@ -70,7 +68,7 @@ public class SimulatorTntPhaseGui extends SimulatorBaseGui{ //Delete inventory.setItem(8, new SWItem(Material.BARRIER, "§eDelete", clickType -> { - tntElement.getSettings().remove(tnt); + tntElement.getPhases().remove(tnt); back.open(); SimulatorWatcher.update(simulator); })); @@ -125,8 +123,8 @@ public class SimulatorTntPhaseGui extends SimulatorBaseGui{ //Order int order = tnt.getOrder(); - inventory.setItem(13, SWItem.getDye(order < SimulatorSetting.ORDER_LIMIT ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { - tnt.setOrder(Math.min(SimulatorSetting.ORDER_LIMIT, order + (clickType.isShiftClick() ? 5 : 1))); + inventory.setItem(13, 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); }); 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 index a61a4971..ab1bd0a7 100644 --- 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 @@ -19,11 +19,15 @@ 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.bausystem.features.simulator2.data.redstone.RedstonePhase; import de.steamwar.core.Core; import de.steamwar.inventory.SWItem; +import org.bukkit.Material; import org.bukkit.entity.Player; +import java.util.Arrays; import java.util.List; public abstract class SimulatorScrollGui extends SimulatorBaseGui { // TODO: Last Column? @@ -36,7 +40,7 @@ public abstract class SimulatorScrollGui extends SimulatorBaseGui { // TODO: } private int maxScroll() { - return Math.max(0, Math.min(scroll, data.size() - 9)); + return Math.max(0, Math.min(scroll, data.size() - 9 + 1)); } @Override @@ -63,11 +67,16 @@ public abstract class SimulatorScrollGui extends SimulatorBaseGui { // TODO: } }); - 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]); + for (int i = 0; i < 9; i++) { + if(i < data.size()){ + T element = data.get(scroll + i); + SWItem[] column = column(element); + populateColumn(column, i); + } + else { + SWItem[] column = lastColumn(); + populateColumn(column, i); + break; } } } @@ -76,5 +85,13 @@ public abstract class SimulatorScrollGui extends SimulatorBaseGui { // TODO: public void headerAndFooter() { } + + public void populateColumn(SWItem[] column, int index){ + for (int j = 0; j < column.length; j++) { + inventory.setItem(index + j * 9 + 9, column[j]); + } + } public abstract SWItem[] column(T t); + + public abstract SWItem[] lastColumn(); } From 4eb3a310a787cd0a660a56eabd1f754b2dd3049b Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Fri, 13 Oct 2023 13:00:36 +0200 Subject: [PATCH 15/48] Add sorting of phases --- .../features/simulator2/data/SimulatorElement.java | 5 +++++ .../features/simulator2/gui/SimulatorRedstoneGui.java | 2 +- .../bausystem/features/simulator2/gui/SimulatorTNTGui.java | 5 +---- .../features/simulator2/gui/base/SimulatorScrollGui.java | 7 ++----- 4 files changed, 9 insertions(+), 10 deletions(-) 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 1274f7c8..477c59e4 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 @@ -25,6 +25,7 @@ import org.bukkit.Material; import org.bukkit.util.Vector; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; @Getter @@ -45,6 +46,10 @@ public abstract class SimulatorElement { return this; } + public void sort(){ + phases.sort(Comparator.comparingInt(SimulatorPhase::getTickOffset)); + } + public abstract String getName(); public int getBaseTick() { 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 index 0f09eeab..77637112 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java @@ -55,7 +55,7 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { @Override public void headerAndFooter() { - // TODO Sort Data List + redstoneElement.sort(); // Back Arrow inventory.setItem(0, new SWItem(Material.ARROW, "§eBack", clickType -> { 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 index 15451b16..1cf8f6a4 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java @@ -21,7 +21,6 @@ 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.RedstonePhase; import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement; import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase; import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui; @@ -53,15 +52,13 @@ public class SimulatorTNTGui extends SimulatorScrollGui { @Override public void headerAndFooter() { - // TODO Back Jump + tntElement.sort(); // 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()); 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 index ab1bd0a7..d23d491b 100644 --- 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 @@ -19,18 +19,15 @@ 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.bausystem.features.simulator2.data.redstone.RedstonePhase; import de.steamwar.core.Core; import de.steamwar.inventory.SWItem; -import org.bukkit.Material; import org.bukkit.entity.Player; -import java.util.Arrays; import java.util.List; -public abstract class SimulatorScrollGui extends SimulatorBaseGui { // TODO: Last Column? +public abstract class SimulatorScrollGui extends SimulatorBaseGui { protected int scroll = 0; protected final List data; From e47cf80d60a18c66966f6dd071ad233175e243e2 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Tue, 17 Oct 2023 15:02:48 +0200 Subject: [PATCH 16/48] Finalize GUI --- .../features/simulator2/SimulatorWatcher.java | 2 +- .../simulator2/data/SimulatorElement.java | 2 +- .../simulator2/data/SimulatorGroup.java | 5 ++ .../simulator2/data/SimulatorPhase.java | 4 +- .../data/redstone/RedstoneElement.java | 1 + .../data/redstone/RedstonePhase.java | 10 ++- .../simulator2/data/tnt/TNTPhase.java | 17 ++--- .../features/simulator2/execute/.gitkeep | 0 .../simulator2/gui/SimulatorGroupGui.java | 2 + .../gui/SimulatorGroupSettingsGui.java | 3 +- .../features/simulator2/gui/SimulatorGui.java | 4 +- .../simulator2/gui/SimulatorRedstoneGui.java | 71 +++++++++++-------- .../SimulatorRedstonePhaseSettingsGui.java | 11 ++- .../gui/SimulatorRedstoneSettingsGui.java | 12 ++-- .../simulator2/gui/SimulatorSettingsGui.java | 2 +- .../simulator2/gui/SimulatorTNTGui.java | 71 +++++++++++-------- ...java => SimulatorTNTPhaseSettingsGui.java} | 24 ++++--- .../gui/SimulatorTNTSettingsGui.java | 39 ++++++---- .../simulator2/gui/base/SimulatorBaseGui.java | 21 ++++-- .../simulator2/gui/base/SimulatorPageGui.java | 3 +- .../gui/base/SimulatorScrollGui.java | 14 ++-- .../gui/utils/SimulatorMaterialGui.java | 3 +- .../features/simulator2/world/.gitkeep | 0 23 files changed, 197 insertions(+), 124 deletions(-) create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/execute/.gitkeep rename BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/{SimulatorTntPhaseSettingsGui.java => SimulatorTNTPhaseSettingsGui.java} (90%) create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/world/.gitkeep diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java index 6c9a0c1e..2c6f8cbf 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java @@ -36,7 +36,7 @@ import java.util.Map; 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); 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 477c59e4..59e39852 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 @@ -46,7 +46,7 @@ public abstract class SimulatorElement { return this; } - public void sort(){ + public void sort() { phases.sort(Comparator.comparingInt(SimulatorPhase::getTickOffset)); } 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 b0a705b4..db52d1c3 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 @@ -24,6 +24,7 @@ import lombok.Setter; import org.bukkit.Material; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; @Getter @@ -38,6 +39,10 @@ public class SimulatorGroup { return this; } + public void sort() { + elements.sort(Comparator.comparingInt(SimulatorElement::getBaseTick)); + } + public int getBaseTick() { return elements.stream() .mapToInt(SimulatorElement::getBaseTick) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java index c77c2396..cc9c0011 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java @@ -25,11 +25,9 @@ import lombok.Setter; @Getter @Setter public abstract class SimulatorPhase { - public static final int ORDER_LIMIT = 64; + public static final int ORDER_LIMIT = 30; protected int tickOffset = 0; protected int lifetime = 80; protected int order = 1; - - public SimulatorPhase(){}; } 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 bea1c83d..f6acc458 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 @@ -24,6 +24,7 @@ import org.bukkit.Material; import org.bukkit.util.Vector; public class RedstoneElement extends SimulatorElement { + public RedstoneElement(Vector position) { super(Material.REDSTONE_BLOCK, position); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java index f22b3cee..54686631 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java @@ -20,11 +20,17 @@ package de.steamwar.bausystem.features.simulator2.data.redstone; import de.steamwar.bausystem.features.simulator2.data.SimulatorPhase; +import lombok.NoArgsConstructor; import org.bukkit.Material; +@NoArgsConstructor public class RedstonePhase extends SimulatorPhase { - public RedstonePhase(){}; - public RedstonePhase(int tickOffset){ + + public RedstonePhase(int tickOffset) { this.tickOffset = tickOffset; } + + { + this.lifetime = 1; + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTPhase.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTPhase.java index 82bd03b6..0f04cdd9 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTPhase.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTPhase.java @@ -21,26 +21,27 @@ package de.steamwar.bausystem.features.simulator2.data.tnt; import de.steamwar.bausystem.features.simulator2.data.SimulatorPhase; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; @Getter @Setter +@NoArgsConstructor public class TNTPhase extends SimulatorPhase { private int count = 1; private boolean xJump = false; private boolean yJump = false; private boolean zJump = false; - public TNTPhase(){} - - public TNTPhase(int tickOffset){this.tickOffset = tickOffset;} - - public boolean hasJump(){ - if(xJump || yJump || zJump) return true; - else return false; + public TNTPhase(int tickOffset) { + this.tickOffset = tickOffset; } - public void setJump(boolean jump){ + public boolean hasJump() { + return xJump || yJump || zJump; + } + + public void setJump(boolean jump) { xJump = jump; yJump = jump; zJump = jump; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/execute/.gitkeep b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/execute/.gitkeep new file mode 100644 index 00000000..e69de29b 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 index c38edc90..85addcb4 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java @@ -58,6 +58,8 @@ public class SimulatorGroupGui extends SimulatorPageGui> { return; } + simulatorGroup.sort(); + inventory.setItem(0, new SWItem(Material.ARROW, "§eBack", clickType -> { back.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 index 905972a0..2e335524 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupSettingsGui.java @@ -78,7 +78,8 @@ public class SimulatorGroupSettingsGui extends SimulatorBaseGui { simulatorGroup.changeBaseTicks(clickType.isShiftClick() ? 5 : 1); SimulatorWatcher.update(simulator); }); - SWItem baseTick = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + baseTicks, clickType -> {}); + 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 -> { 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 index 309c8b70..8387c540 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java @@ -47,8 +47,8 @@ public class SimulatorGui extends SimulatorPageGui { @Override public void headerAndFooter() { - for(Iterator i = simulator.getElements().iterator(); i.hasNext();){ - if(i.next().getElements().isEmpty()){ + for (Iterator i = simulator.getElements().iterator(); i.hasNext(); ) { + if (i.next().getElements().isEmpty()) { i.remove(); } } 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 index 77637112..759aa0ed 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java @@ -30,6 +30,7 @@ import de.steamwar.bausystem.features.simulator2.gui.utils.SimulatorMaterialGui; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; import java.util.ArrayList; import java.util.Arrays; @@ -38,13 +39,13 @@ import java.util.List; public class SimulatorRedstoneGui extends SimulatorScrollGui { private final SimulatorGroup simulatorGroup; - private final RedstoneElement redstoneElement; + private final RedstoneElement redstone; private final SimulatorBaseGui back; - public SimulatorRedstoneGui(Player player, Simulator simulator, SimulatorGroup simulatorGroup, RedstoneElement redstoneElement, SimulatorBaseGui back) { - super(player, simulator, 6 * 9, redstoneElement.getPhases()); + public SimulatorRedstoneGui(Player player, Simulator simulator, SimulatorGroup simulatorGroup, RedstoneElement redstone, SimulatorBaseGui back) { + super(player, simulator, 6 * 9, redstone.getPhases()); this.simulatorGroup = simulatorGroup; - this.redstoneElement = redstoneElement; + this.redstone = redstone; this.back = back; } @@ -55,7 +56,12 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { @Override public void headerAndFooter() { - redstoneElement.sort(); + if (redstone.getPhases().isEmpty()) { + back.open(); + return; + } + + redstone.sort(); // Back Arrow inventory.setItem(0, new SWItem(Material.ARROW, "§eBack", clickType -> { @@ -65,43 +71,42 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { // Material Chooser List lore = new ArrayList<>(); lore.add("§7Activation count§8:§e " + data.size()); - lore.add("§7Tick§8:§e " + redstoneElement.getBaseTick()); + lore.add("§7Tick§8:§e " + redstone.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("§7X§8:§e " + redstone.getPosition().getX()); + lore.add("§7Y§8:§e " + redstone.getPosition().getY()); + lore.add("§7Z§8:§e " + redstone.getPosition().getZ()); + if (redstone.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(); + inventory.setItem(4, new SWItem(redstone.getMaterial(), "§eTNT", lore, redstone.isDisabled(), clickType -> { + new SimulatorMaterialGui(player, simulator, redstone::getMaterial, redstone::setMaterial, this).open(); })); //Settings inventory.setItem(48, new SWItem(Material.REPEATER, "§eSettings", clickType -> { - new SimulatorRedstoneSettingsGui(player, simulator, redstoneElement, this).open(); + new SimulatorRedstoneSettingsGui(player, simulator, redstone, 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()); + inventory.setItem(50, new SWItem(redstone.isDisabled() ? Material.ENDER_PEARL : Material.ENDER_EYE, redstone.isDisabled() ? "§cDisabled" : "§aEnabled", clickType -> { + redstone.setDisabled(!redstone.isDisabled()); SimulatorWatcher.update(simulator); })); } @Override public SWItem[] column(RedstonePhase 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 -> { - //Quick remove per rightclick - if (clickType.isRightClick()) redstoneElement.getPhases().remove(redstoneSetting); + SWItem redstone = new SWItem(Material.REDSTONE_BLOCK, "§eRedstone§8:§7 " + redstoneSetting.getTickOffset(), Arrays.asList("§7Activation Time§8:§e " + redstoneSetting.getLifetime(), "", "§7Middle-Click§8:§e Remove"), false, clickType -> { + if (clickType == ClickType.MIDDLE) this.redstone.getPhases().remove(redstoneSetting); SimulatorWatcher.update(simulator); }); redstone.getItemStack().setAmount(Math.max(1, Math.min(redstoneSetting.getTickOffset(), 64))); - return new SWItem[] { + 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); @@ -112,23 +117,31 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { SimulatorWatcher.update(simulator); }), new SWItem(Material.ANVIL, "§eEdit Activation", clickType -> { - new SimulatorRedstonePhaseSettingsGui(player, simulator, redstoneElement, redstoneSetting, this).open(); + new SimulatorRedstonePhaseSettingsGui(player, simulator, this.redstone, redstoneSetting, this).open(); }), }; } @Override public SWItem[] lastColumn() { - return new SWItem[] { - new SWItem(SWItem.getDye(10), "§aNew Phase", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { - RedstonePhase lastElement = redstoneElement.getPhases().get(redstoneElement.getPhases().size() - 1); - RedstonePhase newPhase = new RedstonePhase(lastElement.getTickOffset() + 1); - if(clickType.isShiftClick()) newPhase.setTickOffset(newPhase.getTickOffset() + 4); - redstoneElement.add(newPhase); - SimulatorWatcher.update(simulator); + return new SWItem[]{ + new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { + addNewPhase(clickType.isShiftClick()); + }), + new SWItem(Material.REDSTONE_BLOCK, "§eRedstone§8:§a New Phase", clickType -> { + addNewPhase(false); + }), + new SWItem(SWItem.getDye(8), "§7", clickType -> { }), - new SWItem(Material.REDSTONE_BLOCK, "§eRedstone§8:§a New Phase", Arrays.asList(), false, clickType -> {}), - new SWItem(SWItem.getDye(8), "", Arrays.asList(), false, clickType -> {}), }; } + + private void addNewPhase(boolean shift) { + RedstonePhase lastElement = redstone.getPhases().get(redstone.getPhases().size() - 1); + RedstonePhase newPhase = new RedstonePhase(lastElement.getTickOffset() + 1); + if (shift) newPhase.setTickOffset(newPhase.getTickOffset() + 5); + scroll++; + redstone.add(newPhase); + SimulatorWatcher.update(simulator); + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java index 4479d75d..72f56fb3 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java @@ -80,7 +80,8 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { SimulatorWatcher.update(simulator); }); - SWItem offsetItem = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + offset, clickType -> {}); + SWItem offsetItem = new SWItem(Material.REPEATER, "§eStart at§8:§7 " + offset, clickType -> { + }); offsetItem.getItemStack().setAmount(Math.max(1, Math.min(offset, 64))); inventory.setItem(20, offsetItem); @@ -96,7 +97,8 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { SimulatorWatcher.update(simulator); }); - SWItem lifetimeItem = new SWItem(Material.CLOCK, "§eLifetime§8:§7 " + lifetime, clickType -> {}); + SWItem lifetimeItem = new SWItem(Material.CLOCK, "§eActivation Time§8:§7 " + lifetime, clickType -> { + }); lifetimeItem.getItemStack().setAmount(Math.max(1, Math.min(lifetime, 64))); inventory.setItem(21, lifetimeItem); @@ -106,13 +108,15 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { }); //Order + /* int order = redstone.getOrder(); inventory.setItem(14, SWItem.getDye(10), "§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); }); - SWItem orderItem = new SWItem(Material.COMPASS, "§eOrder§8:§7 " + order, clickType -> {}); + SWItem orderItem = new SWItem(Material.COMPASS, "§eOrder§8:§7 " + order, clickType -> { + }); orderItem.getItemStack().setAmount(Math.max(1, Math.min(order, 64))); inventory.setItem(23, orderItem); @@ -120,5 +124,6 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { redstone.setOrder(Math.max(1, order - (clickType.isShiftClick() ? -5 : -1))); 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 index 6461eb80..692a6858 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneSettingsGui.java @@ -77,7 +77,8 @@ public class SimulatorRedstoneSettingsGui extends SimulatorBaseGui { redstone.changeBaseTicks(clickType.isShiftClick() ? 5 : 1); SimulatorWatcher.update(simulator); }); - SWItem baseTick = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + baseTicks, clickType -> {}); + 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 -> { @@ -94,7 +95,8 @@ public class SimulatorRedstoneSettingsGui extends SimulatorBaseGui { redstone.move(clickType.isShiftClick() ? 5 : 1, 0, 0); SimulatorWatcher.update(simulator); }); - inventory.setItem(24, new SWItem(Material.PAPER, "§eX")); + inventory.setItem(24, new SWItem(Material.PAPER, "§eX§8:§7 " + redstone.getPosition().getBlockX(), clickType -> { + })); 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); @@ -105,7 +107,8 @@ public class SimulatorRedstoneSettingsGui extends SimulatorBaseGui { redstone.move(0, clickType.isShiftClick() ? 5 : 1, 0); SimulatorWatcher.update(simulator); }); - inventory.setItem(25, new SWItem(Material.PAPER, "§eY")); + inventory.setItem(25, new SWItem(Material.PAPER, "§eY§8:§7 " + redstone.getPosition().getBlockY(), clickType -> { + })); 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); @@ -116,7 +119,8 @@ public class SimulatorRedstoneSettingsGui extends SimulatorBaseGui { redstone.move(0, 0, clickType.isShiftClick() ? 5 : 1); SimulatorWatcher.update(simulator); }); - inventory.setItem(26, new SWItem(Material.PAPER, "§eZ")); + inventory.setItem(26, new SWItem(Material.PAPER, "§eZ§8:§7" + redstone.getPosition().getBlockZ(), clickType -> { + })); 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 index acaf01da..d7d92bac 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorSettingsGui.java @@ -49,7 +49,7 @@ public class SimulatorSettingsGui extends SimulatorBaseGui { 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(); 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 index 1cf8f6a4..9ea81ce6 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java @@ -29,6 +29,7 @@ import de.steamwar.bausystem.features.simulator2.gui.utils.SimulatorMaterialGui; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; import java.util.ArrayList; import java.util.Arrays; @@ -36,12 +37,12 @@ import java.util.List; public class SimulatorTNTGui extends SimulatorScrollGui { - private TNTElement tntElement; + private TNTElement tnt; private SimulatorBaseGui back; - public SimulatorTNTGui(Player player, Simulator simulator, TNTElement tntElement, SimulatorBaseGui back) { - super(player, simulator, 6 * 9, tntElement.getPhases()); - this.tntElement = tntElement; + public SimulatorTNTGui(Player player, Simulator simulator, TNTElement tnt, SimulatorBaseGui back) { + super(player, simulator, 6 * 9, tnt.getPhases()); + this.tnt = tnt; this.back = back; } @@ -52,7 +53,12 @@ public class SimulatorTNTGui extends SimulatorScrollGui { @Override public void headerAndFooter() { - tntElement.sort(); + if (tnt.getPhases().isEmpty()) { + back.open(); + return; + } + + tnt.sort(); // Back Arrow inventory.setItem(0, new SWItem(Material.ARROW, "§eBack", clickType -> { @@ -62,39 +68,38 @@ public class SimulatorTNTGui extends SimulatorScrollGui { // Material Chooser List lore = new ArrayList<>(); lore.add("§7Phase count§8:§e " + data.size()); - lore.add("§7Tick§8:§e " + tntElement.getBaseTick()); + lore.add("§7Tick§8:§e " + tnt.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("§7X§8:§e " + tnt.getPosition().getX()); + lore.add("§7Y§8:§e " + tnt.getPosition().getY()); + lore.add("§7Z§8:§e " + tnt.getPosition().getZ()); + if (tnt.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(4, new SWItem(tnt.getMaterial(), "§eTNT", lore, tnt.isDisabled(), clickType -> { + new SimulatorMaterialGui(player, simulator, tnt::getMaterial, tnt::setMaterial, this).open(); })); inventory.setItem(48, new SWItem(Material.REPEATER, "§eSettings", clickType -> { - // new SimulatorGroupSettingsGui(player, simulator, simulatorGroup, this).open(); + new SimulatorTNTSettingsGui(player, simulator, tnt, 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()); + inventory.setItem(50, new SWItem(tnt.isDisabled() ? Material.ENDER_PEARL : Material.ENDER_EYE, tnt.isDisabled() ? "§cDisabled" : "§aEnabled", clickType -> { + tnt.setDisabled(!tnt.isDisabled()); SimulatorWatcher.update(simulator); })); } @Override public SWItem[] column(TNTPhase 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 -> { - //Quick remove per rightclick - if (clickType.isRightClick()) tntElement.getPhases().remove(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"), "", "§7Middle-Click§8:§e Remove"), false, clickType -> { + if (clickType == ClickType.MIDDLE) this.tnt.getPhases().remove(tntSetting); SimulatorWatcher.update(simulator); }); tnt.getItemStack().setAmount(Math.min(tntSetting.getCount(), 64)); - return new SWItem[] { + 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); @@ -105,23 +110,31 @@ public class SimulatorTNTGui extends SimulatorScrollGui { SimulatorWatcher.update(simulator); }), new SWItem(Material.ANVIL, "§eEdit Phase", clickType -> { - new SimulatorTntPhaseSettingsGui(player, simulator, tntElement, tntSetting, this).open(); + new SimulatorTNTPhaseSettingsGui(player, simulator, this.tnt, tntSetting, this).open(); }), }; } @Override public SWItem[] lastColumn() { - return new SWItem[] { - new SWItem(SWItem.getDye(10), "§aNew Phase", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { - TNTPhase lastElement = tntElement.getPhases().get(tntElement.getPhases().size() - 1); - TNTPhase newPhase = new TNTPhase(lastElement.getTickOffset() + 1); - if(clickType.isShiftClick()) newPhase.setCount(newPhase.getCount() + 4); - tntElement.add(newPhase); - SimulatorWatcher.update(simulator); + return new SWItem[]{ + new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { + addNewPhase(clickType.isShiftClick()); + }), + new SWItem(Material.TNT, "§eTNT§8:§a New Phase", clickType -> { + addNewPhase(false); + }), + new SWItem(SWItem.getDye(8), "§7", clickType -> { }), - new SWItem(Material.TNT, "§TNT§8:§a New Phase", Arrays.asList(), false, clickType -> {}), - new SWItem(SWItem.getDye(8), "", Arrays.asList(), false, clickType -> {}), }; } + + 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); + scroll++; + tnt.add(newPhase); + SimulatorWatcher.update(simulator); + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java similarity index 90% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseSettingsGui.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java index 3c0a7daf..4f5fafad 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTntPhaseSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java @@ -32,12 +32,12 @@ import org.bukkit.entity.Player; import java.util.Arrays; -public class SimulatorTntPhaseSettingsGui extends SimulatorBaseGui{ +public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { private final TNTElement tntElement; private final TNTPhase tnt; private final SimulatorBaseGui back; - public SimulatorTntPhaseSettingsGui(Player player, Simulator simulator, TNTElement tntElement, TNTPhase tnt, SimulatorBaseGui back) { + public SimulatorTNTPhaseSettingsGui(Player player, Simulator simulator, TNTElement tntElement, TNTPhase tnt, SimulatorBaseGui back) { super(player, simulator, 5 * 9); this.tntElement = tntElement; this.tnt = tnt; @@ -46,7 +46,7 @@ public class SimulatorTntPhaseSettingsGui extends SimulatorBaseGui{ @Override public String title() { - return "Tnt"; + return "TNT"; } @Override @@ -75,14 +75,15 @@ public class SimulatorTntPhaseSettingsGui extends SimulatorBaseGui{ //Count int count = tnt.getCount(); - inventory.setItem(10, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + inventory.setItem(9, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { tnt.setCount(count + (clickType.isShiftClick() ? 5 : 1)); SimulatorWatcher.update(simulator); }); - SWItem countItem = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + count, clickType -> {}); + SWItem countItem = new SWItem(Material.TNT, "§eCount§8:§7 " + count, clickType -> { + }); countItem.getItemStack().setAmount(Math.max(1, Math.min(count, 64))); - inventory.setItem(19, countItem); + inventory.setItem(18, countItem); inventory.setItem(28, 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))); @@ -96,7 +97,8 @@ public class SimulatorTntPhaseSettingsGui extends SimulatorBaseGui{ SimulatorWatcher.update(simulator); }); - SWItem offsetItem = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + offset, clickType -> {}); + SWItem offsetItem = new SWItem(Material.REPEATER, "§eStart at§8:§7 " + offset, clickType -> { + }); offsetItem.getItemStack().setAmount(Math.max(1, Math.min(offset, 64))); inventory.setItem(19, offsetItem); @@ -112,7 +114,8 @@ public class SimulatorTntPhaseSettingsGui extends SimulatorBaseGui{ SimulatorWatcher.update(simulator); }); - SWItem lifetimeItem = new SWItem(Material.CLOCK, "§eLifetime§8:§7 " + lifetime, clickType -> {}); + SWItem lifetimeItem = new SWItem(Material.CLOCK, "§eLifetime§8:§7 " + lifetime, clickType -> { + }); lifetimeItem.getItemStack().setAmount(Math.max(1, Math.min(lifetime, 64))); inventory.setItem(20, lifetimeItem); @@ -128,8 +131,9 @@ public class SimulatorTntPhaseSettingsGui extends SimulatorBaseGui{ SimulatorWatcher.update(simulator); }); - SWItem orderItem = new SWItem(Material.COMPASS, "§eLifetime§8:§7 " + order, clickType -> {}); - orderItem.getItemStack().setAmount(Math.max(1, Math.min(order, 64))); + SWItem orderItem = new SWItem(Material.COMPASS, "§eCalculation Order§8:§7 " + order, clickType -> { + }); + orderItem.getItemStack().setAmount(Math.max(1, Math.min(order, 30))); inventory.setItem(22, orderItem); inventory.setItem(31, SWItem.getDye(order > 1 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { 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 index aaaed03e..c9d47366 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTSettingsGui.java @@ -50,6 +50,11 @@ public class SimulatorTNTSettingsGui extends SimulatorBaseGui { @Override public void populate() { + if (tnt.getPhases().isEmpty()) { + back.open(); + return; + } + // Back Arrow inventory.setItem(0, new SWItem(Material.ARROW, "§eBack", clickType -> { back.open(); @@ -73,7 +78,8 @@ public class SimulatorTNTSettingsGui extends SimulatorBaseGui { tnt.changeBaseTicks(clickType.isShiftClick() ? 5 : 1); SimulatorWatcher.update(simulator); }); - SWItem baseTick = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + baseTicks, clickType -> {}); + 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 -> { @@ -86,61 +92,64 @@ public class SimulatorTNTSettingsGui extends SimulatorBaseGui { }); // Subpixel Alignment - inventory.setItem(24, new SWItem(Material.SUNFLOWER, "§7Align§8: §eCenter", clickType -> { + inventory.setItem(21, new SWItem(Material.SUNFLOWER, "§7Align§8: §eCenter", clickType -> { tnt.align(new Vector(0.5, 0, 0.5)); SimulatorWatcher.update(simulator); })); - - //z - inventory.setItem(23, new SWItem(Material.OAK_BUTTON, "§7Align§8: §eNegativ Z", clickType -> { + + // Z + inventory.setItem(20, new SWItem(Material.OAK_BUTTON, "§7Align§8: §eNegativ Z", clickType -> { tnt.align(new Vector(0, 0, 0.49)); SimulatorWatcher.update(simulator); })); - inventory.setItem(25, new SWItem(Material.OAK_BUTTON, "§7Align§8: §ePositiv Z", clickType -> { + inventory.setItem(22, new SWItem(Material.OAK_BUTTON, "§7Align§8: §ePositiv Z", clickType -> { tnt.align(new Vector(0, 0, 0.51)); SimulatorWatcher.update(simulator); })); - //X - inventory.setItem(15, new SWItem(Material.OAK_BUTTON, "§7Align§8: §eNegativ X", clickType -> { + // X + inventory.setItem(12, new SWItem(Material.OAK_BUTTON, "§7Align§8: §eNegativ X", clickType -> { tnt.align(new Vector(0.49, 0, 0)); SimulatorWatcher.update(simulator); })); - inventory.setItem(33, new SWItem(Material.OAK_BUTTON, "§7Align§8: §ePositiv X", clickType -> { + inventory.setItem(30, new SWItem(Material.OAK_BUTTON, "§7Align§8: §ePositiv X", clickType -> { tnt.align(new Vector(0.51, 0, 0)); SimulatorWatcher.update(simulator); })); - //Pos X + // 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(24, new SWItem(Material.PAPER, "§eX§8:§7 " + tnt.getPosition().getX(), clickType -> { + })); 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 + // 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(25, new SWItem(Material.PAPER, "§eY§8:§7 " + tnt.getPosition().getY(), clickType -> { + })); 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 + // 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(26, new SWItem(Material.PAPER, "§eZ§8:§7 " + tnt.getPosition().getZ(), clickType -> { + })); 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 index 59079c64..5d1b667e 100644 --- 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 @@ -21,6 +21,7 @@ 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.core.Core; import de.steamwar.inventory.SWInventory; import de.steamwar.inventory.SWItem; import org.bukkit.Bukkit; @@ -44,7 +45,9 @@ public abstract class SimulatorBaseGui { } public final void open() { - if (inv != null) { + if (inv != null && Core.getVersion() > 19) { + inv.clear(); + setup(); if (player.getOpenInventory().getTopInventory() != inv) { inventory.open(); SimulatorWatcher.watch(player, simulator, this::open); @@ -60,10 +63,7 @@ public abstract class SimulatorBaseGui { 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 -> {})); - } + setup(); inventory.addCloseCallback(clickType -> { SimulatorWatcher.watch(player, null, null); }); @@ -72,7 +72,16 @@ public abstract class SimulatorBaseGui { SimulatorWatcher.watch(player, simulator, this::open); populate(); } - + + private void setup() { + 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 -> { + })); + } + } + 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 index 22db341e..42eb1e17 100644 --- 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 @@ -69,7 +69,7 @@ public abstract class SimulatorPageGui extends SimulatorBaseGui { int index = 9; for (int i = minElement; i < maxElement; i++) { - T element = data.get(i); + T element = data.get(i); inventory.setItem(index++, convert(element)); } } @@ -78,5 +78,6 @@ public abstract class SimulatorPageGui extends SimulatorBaseGui { 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 index d23d491b..4a4fb128 100644 --- 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 @@ -42,7 +42,7 @@ public abstract class SimulatorScrollGui extends SimulatorBaseGui { @Override public final String title() { - return baseTitle() + " " + scroll + "/" + maxScroll(); + return baseTitle() + " " + maxScroll() + "/" + Math.max((data.size() - 9 + 1), 0); } @Override @@ -56,21 +56,20 @@ public abstract class SimulatorScrollGui extends SimulatorBaseGui { open(); } }); - boolean hasNext = scroll < maxScroll() - (data.size() % 9 == 0 ? 1 : 0); + boolean hasNext = (data.size() + 1) - scroll > 9; 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()); + scroll = Math.min(scroll + 9, data.size() + 1 - 9); open(); } }); for (int i = 0; i < 9; i++) { - if(i < data.size()){ + if (scroll + i < data.size()) { T element = data.get(scroll + i); SWItem[] column = column(element); populateColumn(column, i); - } - else { + } else { SWItem[] column = lastColumn(); populateColumn(column, i); break; @@ -83,11 +82,12 @@ public abstract class SimulatorScrollGui extends SimulatorBaseGui { public void headerAndFooter() { } - public void populateColumn(SWItem[] column, int index){ + public void populateColumn(SWItem[] column, int index) { for (int j = 0; j < column.length; j++) { inventory.setItem(index + j * 9 + 9, column[j]); } } + public abstract SWItem[] column(T t); public abstract SWItem[] lastColumn(); 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 index 2acac329..95d321a7 100644 --- 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 @@ -61,7 +61,8 @@ public class SimulatorMaterialGui extends SimulatorPageGui { @Override public void headerAndFooter() { material = currentMaterial.get(); - inventory.setItem(4, new SWItem(material, "§eMaterial", clickType -> {})); + inventory.setItem(4, new SWItem(material, "§eMaterial", clickType -> { + })); inventory.setItem(0, new SWItem(Material.ARROW, "§eBack", clickType -> { back.open(); })); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/world/.gitkeep b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/world/.gitkeep new file mode 100644 index 00000000..e69de29b From b090b3150325d112e869681de8e15255378125a9 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Tue, 17 Oct 2023 15:03:08 +0200 Subject: [PATCH 17/48] Finalize GUI --- .../gui/SimulatorRedstonePhaseSettingsGui.java | 6 +++--- .../simulator2/gui/SimulatorTNTPhaseSettingsGui.java | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java index 72f56fb3..0bce321f 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java @@ -86,7 +86,7 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(20, offsetItem); inventory.setItem(29, SWItem.getDye(offset > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { - redstone.setTickOffset(Math.max(1, offset - (clickType.isShiftClick() ? -5 : -1))); + redstone.setTickOffset(Math.max(0, offset - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }); @@ -103,7 +103,7 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(21, lifetimeItem); inventory.setItem(30, SWItem.getDye(lifetime > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { - redstone.setLifetime(Math.max(1, lifetime - (clickType.isShiftClick() ? -5 : -1))); + redstone.setLifetime(Math.max(0, lifetime - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }); @@ -121,7 +121,7 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(23, orderItem); inventory.setItem(32, SWItem.getDye(order > 1 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { - redstone.setOrder(Math.max(1, order - (clickType.isShiftClick() ? -5 : -1))); + redstone.setOrder(Math.max(1, order - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }); */ diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java index 4f5fafad..852eadd3 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java @@ -85,8 +85,8 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { countItem.getItemStack().setAmount(Math.max(1, Math.min(count, 64))); inventory.setItem(18, countItem); - inventory.setItem(28, 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))); + inventory.setItem(27, 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); }); @@ -103,7 +103,7 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(19, offsetItem); inventory.setItem(28, SWItem.getDye(offset > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { - tnt.setTickOffset(Math.max(1, offset - (clickType.isShiftClick() ? -5 : -1))); + tnt.setTickOffset(Math.max(1, offset - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }); @@ -120,7 +120,7 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(20, lifetimeItem); inventory.setItem(29, 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))); + tnt.setLifetime(Math.max(1, lifetime - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }); @@ -136,8 +136,8 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { orderItem.getItemStack().setAmount(Math.max(1, Math.min(order, 30))); inventory.setItem(22, orderItem); - inventory.setItem(31, SWItem.getDye(order > 1 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { - tnt.setOrder(Math.max(1, order - (clickType.isShiftClick() ? -5 : -1))); + inventory.setItem(31, SWItem.getDye(order > -30 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + tnt.setOrder(Math.max(-30, order - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }); From aef8edca07e4a622a71a41ae3a0c4913413fefc8 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Thu, 19 Oct 2023 10:29:59 +0200 Subject: [PATCH 18/48] Add group choosing and creation --- .../gui/SimulatorGroupChooserGui.java | 113 ++++++++++++++++++ .../simulator2/gui/SimulatorGroupGui.java | 4 +- .../features/simulator2/gui/SimulatorGui.java | 10 +- .../simulator2/gui/SimulatorRedstoneGui.java | 4 +- .../simulator2/gui/SimulatorTNTGui.java | 9 +- .../gui/SimulatorTNTSettingsGui.java | 4 +- 6 files changed, 130 insertions(+), 14 deletions(-) create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupChooserGui.java diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupChooserGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupChooserGui.java new file mode 100644 index 00000000..3a2e78f7 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupChooserGui.java @@ -0,0 +1,113 @@ +/* + * 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 SimulatorGroupChooserGui extends SimulatorPageGui { + + private final SimulatorElement subject; + private final SimulatorGroup parent; + private final SimulatorBaseGui back; + + public SimulatorGroupChooserGui(Player player, Simulator simulator, List data, SimulatorElement subject, SimulatorGroup parent, SimulatorBaseGui back){ + super(player, simulator, 6*9, data); + this.subject = subject; + this.parent = parent; + this.back = back; + } + + @Override + public void headerAndFooter() { + simulator.getElements().removeIf(element -> element.getElements().isEmpty()); + + inventory.setItem(4, new SWItem(simulator.getMaterial(), "§e" + simulator.getName(), clickType -> {})); + if(parent.getElements().size() != 1){ + inventory.setItem(49 , new SWItem(Material.BARRIER, "§c Remove from Group", clickType -> { + SimulatorGroup newParent = new SimulatorGroup(); + newParent.add(subject); + simulator.getElements().add(newParent); + back.open(); + SimulatorWatcher.update(simulator); + })); + } + } + @Override + public String baseTitle() { + return "§eChoose group to add to or element, to create new group"; + } + + @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.getPhases().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 -> { + SimulatorGroup newParent = new SimulatorGroup(); + newParent.add(subject); + newParent.add(element); + simulatorGroup.getElements().remove(element); + parent.getElements().remove(subject); + simulator.getElements().add(newParent); + back.open(); + SimulatorWatcher.update(simulator); + }); + } + + 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 -> { + simulatorGroup.add(subject); + parent.getElements().remove(subject); + back.open(); + SimulatorWatcher.update(simulator); + }); + } +} 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 index 85addcb4..47dc1586 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java @@ -35,7 +35,7 @@ import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.List; -public class SimulatorGroupGui extends SimulatorPageGui> { +public class SimulatorGroupGui extends SimulatorPageGui> { //TODO Disolve group option ? private final SimulatorGroup simulatorGroup; private final SimulatorBaseGui back; @@ -99,7 +99,7 @@ public class SimulatorGroupGui extends SimulatorPageGui> { } return new SWItem(element.getMaterial(), "§e" + element.getName(), lore, element.isDisabled(), clickType -> { if (element instanceof TNTElement) { - new SimulatorTNTGui(player, simulator, (TNTElement) element, this).open(); + new SimulatorTNTGui(player, simulator, (TNTElement) element, simulatorGroup, 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/SimulatorGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java index 8387c540..c4e233e6 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java @@ -34,7 +34,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -public class SimulatorGui extends SimulatorPageGui { +public class SimulatorGui extends SimulatorPageGui {//TODO Groupcreation public SimulatorGui(Player player, Simulator simulator) { super(player, simulator, 6 * 9, simulator.getElements()); @@ -47,11 +47,7 @@ public class SimulatorGui extends SimulatorPageGui { @Override public void headerAndFooter() { - for (Iterator i = simulator.getElements().iterator(); i.hasNext(); ) { - if (i.next().getElements().isEmpty()) { - i.remove(); - } - } + simulator.getElements().removeIf(element -> element.getElements().isEmpty()); inventory.setItem(4, new SWItem(simulator.getMaterial(), "§e" + simulator.getName(), clickType -> { new SimulatorMaterialGui(player, simulator, simulator::getMaterial, simulator::setMaterial, this).open(); @@ -79,7 +75,7 @@ public class SimulatorGui extends SimulatorPageGui { } return new SWItem(element.getMaterial(), "§e" + element.getName(), lore, element.isDisabled(), clickType -> { if (element instanceof TNTElement) { - new SimulatorTNTGui(player, simulator, (TNTElement) element, this).open(); + new SimulatorTNTGui(player, simulator, (TNTElement) element, simulatorGroup,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/SimulatorRedstoneGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java index 759aa0ed..6d66cd33 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java @@ -89,7 +89,9 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { new SimulatorRedstoneSettingsGui(player, simulator, redstone, this).open(); })); - // 49 Lead? + inventory.setItem(49, new SWItem(Material.LEAD, "§eMove", clickType -> { + new SimulatorGroupChooserGui(player, simulator, simulator.getElements(), redstone, simulatorGroup, this).open(); + })); //Enable/Disable inventory.setItem(50, new SWItem(redstone.isDisabled() ? Material.ENDER_PEARL : Material.ENDER_EYE, redstone.isDisabled() ? "§cDisabled" : "§aEnabled", clickType -> { 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 index 9ea81ce6..1672564f 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java @@ -21,11 +21,13 @@ 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.tnt.TNTElement; import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase; 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.bausystem.features.simulator2.gui.SimulatorTNTPhaseSettingsGui; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -38,9 +40,10 @@ import java.util.List; public class SimulatorTNTGui extends SimulatorScrollGui { private TNTElement tnt; + private SimulatorGroup parent; private SimulatorBaseGui back; - public SimulatorTNTGui(Player player, Simulator simulator, TNTElement tnt, SimulatorBaseGui back) { + public SimulatorTNTGui(Player player, Simulator simulator, TNTElement tnt, SimulatorGroup parent, SimulatorBaseGui back) { super(player, simulator, 6 * 9, tnt.getPhases()); this.tnt = tnt; this.back = back; @@ -84,7 +87,9 @@ public class SimulatorTNTGui extends SimulatorScrollGui { inventory.setItem(48, new SWItem(Material.REPEATER, "§eSettings", clickType -> { new SimulatorTNTSettingsGui(player, simulator, tnt, this).open(); })); - // 49 Lead? + inventory.setItem(49, new SWItem(Material.LEAD, "§eMove", clickType -> { + new SimulatorGroupChooserGui(player, simulator, simulator.getElements(), tnt, parent, this).open(); + })); inventory.setItem(50, new SWItem(tnt.isDisabled() ? Material.ENDER_PEARL : Material.ENDER_EYE, tnt.isDisabled() ? "§cDisabled" : "§aEnabled", clickType -> { tnt.setDisabled(!tnt.isDisabled()); SimulatorWatcher.update(simulator); 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 index c9d47366..1daf0ae4 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTSettingsGui.java @@ -109,12 +109,12 @@ public class SimulatorTNTSettingsGui extends SimulatorBaseGui { })); // X - inventory.setItem(12, new SWItem(Material.OAK_BUTTON, "§7Align§8: §eNegativ X", clickType -> { + inventory.setItem(12, new SWItem(Material.STONE_BUTTON, "§7Align§8: §eNegativ X", clickType -> { tnt.align(new Vector(0.49, 0, 0)); SimulatorWatcher.update(simulator); })); - inventory.setItem(30, new SWItem(Material.OAK_BUTTON, "§7Align§8: §ePositiv X", clickType -> { + inventory.setItem(30, new SWItem(Material.STONE_BUTTON, "§7Align§8: §ePositiv X", clickType -> { tnt.align(new Vector(0.51, 0, 0)); SimulatorWatcher.update(simulator); })); From 647ef97bfb2ed5b23917235cebd8d2fdb159c1de Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Sun, 22 Oct 2023 12:23:33 +0200 Subject: [PATCH 19/48] Add group chooser fix --- .../bausystem/features/simulator2/gui/SimulatorRedstoneGui.java | 1 + .../bausystem/features/simulator2/gui/SimulatorTNTGui.java | 1 + 2 files changed, 2 insertions(+) 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 index 6d66cd33..a283e898 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java @@ -89,6 +89,7 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { new SimulatorRedstoneSettingsGui(player, simulator, redstone, this).open(); })); + //Group chooser inventory.setItem(49, new SWItem(Material.LEAD, "§eMove", clickType -> { new SimulatorGroupChooserGui(player, simulator, simulator.getElements(), redstone, simulatorGroup, this).open(); })); 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 index 1672564f..091315b4 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java @@ -46,6 +46,7 @@ public class SimulatorTNTGui extends SimulatorScrollGui { public SimulatorTNTGui(Player player, Simulator simulator, TNTElement tnt, SimulatorGroup parent, SimulatorBaseGui back) { super(player, simulator, 6 * 9, tnt.getPhases()); this.tnt = tnt; + this.parent = parent; this.back = back; } From 9ceb8b40aeb3bceac7b5120f1a6ec1b86f65bf62 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sun, 22 Oct 2023 12:29:38 +0200 Subject: [PATCH 20/48] Fix useless reopening in old versions --- BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java | 5 ----- .../features/simulator2/gui/base/SimulatorBaseGui.java | 9 +++++++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java b/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java index 88a46ddc..bb60156f 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java @@ -31,7 +31,6 @@ import de.steamwar.bausystem.worlddata.WorldData; import de.steamwar.message.Message; import lombok.Getter; import org.bukkit.Bukkit; -import org.bukkit.World; import org.bukkit.event.Listener; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; @@ -53,12 +52,8 @@ public class BauSystem extends JavaPlugin implements Listener { @Getter private static BauSystem instance; - private World world; - @Override public void onEnable() { - world = Bukkit.getWorlds().get(0); - // LOGGER fixLogging(); 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 index 5d1b667e..00ef9c24 100644 --- 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 @@ -45,14 +45,19 @@ public abstract class SimulatorBaseGui { } public final void open() { - if (inv != null && Core.getVersion() > 19) { + String newTitle = title(); + String originalTitle = player.getOpenInventory().getTitle(); + + if (inv != null && (newTitle.equals(originalTitle) || Core.getVersion() > 19)) { inv.clear(); setup(); if (player.getOpenInventory().getTopInventory() != inv) { inventory.open(); SimulatorWatcher.watch(player, simulator, this::open); } - player.getOpenInventory().setTitle(title()); + if (Core.getVersion() > 19) { + player.getOpenInventory().setTitle(title()); + } populate(); return; } From f6ee55c44fdcca521de84084a09cf2875f417631 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sun, 22 Oct 2023 12:31:19 +0200 Subject: [PATCH 21/48] Optimize SimulatorBaseGui --- .../features/simulator2/gui/base/SimulatorBaseGui.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 00ef9c24..b15ba629 100644 --- 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 @@ -48,7 +48,7 @@ public abstract class SimulatorBaseGui { String newTitle = title(); String originalTitle = player.getOpenInventory().getTitle(); - if (inv != null && (newTitle.equals(originalTitle) || Core.getVersion() > 19)) { + if (inv != null && (Core.getVersion() > 19 || newTitle.equals(originalTitle))) { inv.clear(); setup(); if (player.getOpenInventory().getTopInventory() != inv) { From 933e4fe7d9e9a1c0fe968b4e8001d580749ffaea Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Sun, 22 Oct 2023 12:43:20 +0200 Subject: [PATCH 22/48] Removed parent group from group chooser menu --- .../features/simulator2/gui/SimulatorRedstoneGui.java | 3 ++- .../bausystem/features/simulator2/gui/SimulatorTNTGui.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) 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 index a283e898..23af0ac4 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java @@ -35,6 +35,7 @@ import org.bukkit.event.inventory.ClickType; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; public class SimulatorRedstoneGui extends SimulatorScrollGui { @@ -91,7 +92,7 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { //Group chooser inventory.setItem(49, new SWItem(Material.LEAD, "§eMove", clickType -> { - new SimulatorGroupChooserGui(player, simulator, simulator.getElements(), redstone, simulatorGroup, this).open(); + new SimulatorGroupChooserGui(player, simulator, simulator.getElements().stream().filter( e -> e != simulatorGroup).collect(Collectors.toList()), redstone, simulatorGroup, this).open(); })); //Enable/Disable 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 index 091315b4..d6dc192a 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java @@ -36,6 +36,7 @@ import org.bukkit.event.inventory.ClickType; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; public class SimulatorTNTGui extends SimulatorScrollGui { @@ -89,7 +90,7 @@ public class SimulatorTNTGui extends SimulatorScrollGui { new SimulatorTNTSettingsGui(player, simulator, tnt, this).open(); })); inventory.setItem(49, new SWItem(Material.LEAD, "§eMove", clickType -> { - new SimulatorGroupChooserGui(player, simulator, simulator.getElements(), tnt, parent, this).open(); + new SimulatorGroupChooserGui(player, simulator, simulator.getElements().stream().filter( e -> e != parent).collect(Collectors.toList()), tnt, parent, this).open(); })); inventory.setItem(50, new SWItem(tnt.isDisabled() ? Material.ENDER_PEARL : Material.ENDER_EYE, tnt.isDisabled() ? "§cDisabled" : "§aEnabled", clickType -> { tnt.setDisabled(!tnt.isDisabled()); From 327dded73b8d000fe62d291a4e9eb26232392aec Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sun, 22 Oct 2023 13:24:50 +0200 Subject: [PATCH 23/48] Consolidate Item Generation Fix Back arrow in element gui --- .../features/simulator2/data/Simulator.java | 7 +++ .../simulator2/data/SimulatorElement.java | 18 ++++++ .../simulator2/data/SimulatorGroup.java | 18 ++++++ .../gui/SimulatorGroupChooserGui.java | 61 ++++--------------- .../simulator2/gui/SimulatorGroupGui.java | 29 ++------- .../gui/SimulatorGroupSettingsGui.java | 13 +--- .../features/simulator2/gui/SimulatorGui.java | 47 +++----------- .../simulator2/gui/SimulatorRedstoneGui.java | 41 +++++++------ .../SimulatorRedstonePhaseSettingsGui.java | 2 +- .../gui/SimulatorRedstoneSettingsGui.java | 9 +-- .../simulator2/gui/SimulatorSettingsGui.java | 2 +- .../simulator2/gui/SimulatorTNTGui.java | 34 ++++++----- .../gui/SimulatorTNTPhaseSettingsGui.java | 2 +- .../gui/SimulatorTNTSettingsGui.java | 2 +- 14 files changed, 120 insertions(+), 165 deletions(-) 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 a856a54a..df486e6c 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,10 +19,13 @@ package de.steamwar.bausystem.features.simulator2.data; +import de.steamwar.inventory.InvCallback; +import de.steamwar.inventory.SWItem; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; import org.bukkit.Material; +import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.List; @@ -41,4 +44,8 @@ public class Simulator { simulatorGroup.move(x, y, z); }); } + + public SWItem toItem(Player player, InvCallback invCallback) { + return new SWItem(material, "§e" + name, invCallback); + } } 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 59e39852..3a5cf861 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,9 +19,12 @@ package de.steamwar.bausystem.features.simulator2.data; +import de.steamwar.inventory.InvCallback; +import de.steamwar.inventory.SWItem; import lombok.Getter; import lombok.Setter; import org.bukkit.Material; +import org.bukkit.entity.Player; import org.bukkit.util.Vector; import java.util.ArrayList; @@ -70,4 +73,19 @@ public abstract class SimulatorElement { position.setY(position.getY() + y); position.setZ(position.getZ() + z); } + + public SWItem toItem(Player player, InvCallback invCallback) { + List lore = new ArrayList<>(); + lore.add("§7Phase count§8:§e " + phases.size()); + lore.add("§7Tick§8:§e " + getBaseTick()); + lore.add(""); + lore.add("§7X§8:§e " + position.getX()); + lore.add("§7Y§8:§e " + position.getY()); + lore.add("§7Z§8:§e " + position.getZ()); + if (disabled) { + lore.add(""); + lore.add("§cDisabled"); + } + return new SWItem(material, "§e" + getName(), lore, disabled, invCallback); + } } 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 db52d1c3..86bcba99 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,9 +19,12 @@ package de.steamwar.bausystem.features.simulator2.data; +import de.steamwar.inventory.InvCallback; +import de.steamwar.inventory.SWItem; import lombok.Getter; import lombok.Setter; import org.bukkit.Material; +import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.Comparator; @@ -61,4 +64,19 @@ public class SimulatorGroup { simulatorElement.move(x, y, z); }); } + + public SWItem toItem(Player player, InvCallback groupCallback, InvCallback itemCallback) { + if (elements.size() == 1) { + return elements.get(0).toItem(player, itemCallback); + } else { + List lore = new ArrayList<>(); + lore.add("§7Element count§8:§e " + elements.size()); + lore.add("§7Tick§8:§e " + getBaseTick()); + if (disabled) { + lore.add(""); + lore.add("§cDisabled"); + } + return new SWItem(material, "§eGroup", lore, disabled, groupCallback); + } + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupChooserGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupChooserGui.java index 3a2e78f7..8cecb246 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupChooserGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupChooserGui.java @@ -23,17 +23,14 @@ 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.InvCallback; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.List; +import java.util.stream.Collectors; public class SimulatorGroupChooserGui extends SimulatorPageGui { @@ -41,8 +38,8 @@ public class SimulatorGroupChooserGui extends SimulatorPageGui { private final SimulatorGroup parent; private final SimulatorBaseGui back; - public SimulatorGroupChooserGui(Player player, Simulator simulator, List data, SimulatorElement subject, SimulatorGroup parent, SimulatorBaseGui back){ - super(player, simulator, 6*9, data); + public SimulatorGroupChooserGui(Player player, Simulator simulator, SimulatorElement subject, SimulatorGroup parent, SimulatorBaseGui back) { + super(player, simulator, 6 * 9, simulator.getElements().stream().filter(e -> e != parent).collect(Collectors.toList())); this.subject = subject; this.parent = parent; this.back = back; @@ -50,11 +47,10 @@ public class SimulatorGroupChooserGui extends SimulatorPageGui { @Override public void headerAndFooter() { - simulator.getElements().removeIf(element -> element.getElements().isEmpty()); - - inventory.setItem(4, new SWItem(simulator.getMaterial(), "§e" + simulator.getName(), clickType -> {})); - if(parent.getElements().size() != 1){ - inventory.setItem(49 , new SWItem(Material.BARRIER, "§c Remove from Group", clickType -> { + inventory.setItem(4, new SWItem(simulator.getMaterial(), "§e" + simulator.getName(), clickType -> { + })); + if (parent.getElements().size() != 1) { + inventory.setItem(49, new SWItem(Material.BARRIER, "§cRemove from Group", clickType -> { SimulatorGroup newParent = new SimulatorGroup(); newParent.add(subject); simulator.getElements().add(newParent); @@ -63,51 +59,20 @@ public class SimulatorGroupChooserGui extends SimulatorPageGui { })); } } + @Override public String baseTitle() { - return "§eChoose group to add to or element, to create new group"; + return "Choose Group"; } @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.getPhases().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 -> { - SimulatorGroup newParent = new SimulatorGroup(); - newParent.add(subject); - newParent.add(element); - simulatorGroup.getElements().remove(element); - parent.getElements().remove(subject); - simulator.getElements().add(newParent); - back.open(); - SimulatorWatcher.update(simulator); - }); - } - - 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 -> { + InvCallback invCallback = clickType -> { simulatorGroup.add(subject); parent.getElements().remove(subject); back.open(); SimulatorWatcher.update(simulator); - }); + }; + return simulatorGroup.toItem(player, invCallback, invCallback); } } 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 index 47dc1586..23a2354c 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java @@ -32,10 +32,7 @@ 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> { //TODO Disolve group option ? +public class SimulatorGroupGui extends SimulatorPageGui> { private final SimulatorGroup simulatorGroup; private final SimulatorBaseGui back; @@ -64,16 +61,9 @@ public class SimulatorGroupGui extends SimulatorPageGui> { / 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 -> { + inventory.setItem(4, simulatorGroup.toItem(player, clickType -> { new SimulatorMaterialGui(player, simulator, simulatorGroup::getMaterial, simulatorGroup::setMaterial, this).open(); - })); + }, clickType -> {})); inventory.setItem(48, new SWItem(Material.REPEATER, "§eSettings", clickType -> { new SimulatorGroupSettingsGui(player, simulator, simulatorGroup, this).open(); @@ -86,18 +76,7 @@ public class SimulatorGroupGui extends SimulatorPageGui> { / @Override public SWItem convert(SimulatorElement element) { - List lore = new ArrayList<>(); - lore.add("§7Phase count§8:§e " + element.getPhases().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 -> { + return element.toItem(player, clickType -> { if (element instanceof TNTElement) { new SimulatorTNTGui(player, simulator, (TNTElement) element, simulatorGroup, this).open(); } else if (element instanceof RedstoneElement) { 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 index 2e335524..df5b06fe 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupSettingsGui.java @@ -28,9 +28,7 @@ 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 { @@ -61,16 +59,9 @@ public class SimulatorGroupSettingsGui extends SimulatorBaseGui { })); // 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 -> { + inventory.setItem(4, simulatorGroup.toItem(player, clickType -> { new SimulatorMaterialGui(player, simulator, simulatorGroup::getMaterial, simulatorGroup::setMaterial, this).open(); - })); + }, clickType -> {})); // Base Tick int baseTicks = simulatorGroup.getBaseTick(); 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 index c4e233e6..932fc4a5 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java @@ -30,11 +30,7 @@ import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -public class SimulatorGui extends SimulatorPageGui {//TODO Groupcreation +public class SimulatorGui extends SimulatorPageGui { public SimulatorGui(Player player, Simulator simulator) { super(player, simulator, 6 * 9, simulator.getElements()); @@ -49,7 +45,7 @@ public class SimulatorGui extends SimulatorPageGui {//TODO Group public void headerAndFooter() { simulator.getElements().removeIf(element -> element.getElements().isEmpty()); - inventory.setItem(4, new SWItem(simulator.getMaterial(), "§e" + simulator.getName(), clickType -> { + 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 -> { @@ -59,38 +55,15 @@ public class SimulatorGui extends SimulatorPageGui {//TODO Group @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.getPhases().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, simulatorGroup,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 -> { + return simulatorGroup.toItem(player, clickType -> { new SimulatorGroupGui(player, simulator, simulatorGroup, this).open(); + }, clickType -> { + SimulatorElement element = simulatorGroup.getElements().get(0); + if (element instanceof TNTElement) { + new SimulatorTNTGui(player, simulator, (TNTElement) element, simulatorGroup,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/SimulatorRedstoneGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java index 23af0ac4..efb64277 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java @@ -35,17 +35,16 @@ import org.bukkit.event.inventory.ClickType; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; public class SimulatorRedstoneGui extends SimulatorScrollGui { - private final SimulatorGroup simulatorGroup; + private final SimulatorGroup parent; private final RedstoneElement redstone; private final SimulatorBaseGui back; - public SimulatorRedstoneGui(Player player, Simulator simulator, SimulatorGroup simulatorGroup, RedstoneElement redstone, SimulatorBaseGui back) { + public SimulatorRedstoneGui(Player player, Simulator simulator, SimulatorGroup parent, RedstoneElement redstone, SimulatorBaseGui back) { super(player, simulator, 6 * 9, redstone.getPhases()); - this.simulatorGroup = simulatorGroup; + this.parent = parent; this.redstone = redstone; this.back = back; } @@ -66,22 +65,28 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { // Back Arrow inventory.setItem(0, new SWItem(Material.ARROW, "§eBack", clickType -> { - back.open(); + if (parent.getElements().contains(redstone)) { + back.open(); + } else { + SimulatorGroup newParent = simulator.getElements().stream() + .filter(simulatorGroup -> simulatorGroup.getElements().contains(redstone)) + .findFirst() + .orElse(null); + if (newParent == null) { + player.closeInventory(); + return; + } + SimulatorGui simulatorGui = new SimulatorGui(player, simulator); + if (newParent.getElements().size() == 1) { + simulatorGui.open(); + } else { + new SimulatorGroupGui(player, simulator, newParent, simulatorGui).open(); + } + } })); // Material Chooser - List lore = new ArrayList<>(); - lore.add("§7Activation count§8:§e " + data.size()); - lore.add("§7Tick§8:§e " + redstone.getBaseTick()); - lore.add(""); - lore.add("§7X§8:§e " + redstone.getPosition().getX()); - lore.add("§7Y§8:§e " + redstone.getPosition().getY()); - lore.add("§7Z§8:§e " + redstone.getPosition().getZ()); - if (redstone.isDisabled()) { - lore.add(""); - lore.add("§cDisabled"); - } - inventory.setItem(4, new SWItem(redstone.getMaterial(), "§eTNT", lore, redstone.isDisabled(), clickType -> { + inventory.setItem(4, redstone.toItem(player, clickType -> { new SimulatorMaterialGui(player, simulator, redstone::getMaterial, redstone::setMaterial, this).open(); })); @@ -92,7 +97,7 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { //Group chooser inventory.setItem(49, new SWItem(Material.LEAD, "§eMove", clickType -> { - new SimulatorGroupChooserGui(player, simulator, simulator.getElements().stream().filter( e -> e != simulatorGroup).collect(Collectors.toList()), redstone, simulatorGroup, this).open(); + new SimulatorGroupChooserGui(player, simulator, redstone, parent, this).open(); })); //Enable/Disable diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java index 0bce321f..7835261d 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java @@ -62,7 +62,7 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { })); // Material Chooser - inventory.setItem(4, new SWItem(redstoneElement.getMaterial(), "§eRedstone", clickType -> { + inventory.setItem(4, redstoneElement.toItem(player, clickType -> { new SimulatorMaterialGui(player, simulator, redstoneElement::getMaterial, redstoneElement::setMaterial, this).open(); })); 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 index 692a6858..7152cc6f 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneSettingsGui.java @@ -60,14 +60,7 @@ public class SimulatorRedstoneSettingsGui extends SimulatorBaseGui { })); // Material Chooser - List lore = new ArrayList<>(); - lore.add("§7Activation count§8:§e " + redstone.getPhases().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 -> { + inventory.setItem(4, redstone.toItem(player, clickType -> { new SimulatorMaterialGui(player, simulator, redstone::getMaterial, redstone::setMaterial, this).open(); })); 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 index d7d92bac..b9e75a5e 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorSettingsGui.java @@ -51,7 +51,7 @@ public class SimulatorSettingsGui extends SimulatorBaseGui { })); // Material Chooser - inventory.setItem(4, new SWItem(simulator.getMaterial(), "§e" + simulator.getName(), clickType -> { + inventory.setItem(4, simulator.toItem(player, clickType -> { new SimulatorMaterialGui(player, simulator, simulator::getMaterial, simulator::setMaterial, this).open(); })); 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 index d6dc192a..34906cd0 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java @@ -67,22 +67,28 @@ public class SimulatorTNTGui extends SimulatorScrollGui { // Back Arrow inventory.setItem(0, new SWItem(Material.ARROW, "§eBack", clickType -> { - back.open(); + if (parent.getElements().contains(tnt)) { + back.open(); + } else { + SimulatorGroup newParent = simulator.getElements().stream() + .filter(simulatorGroup -> simulatorGroup.getElements().contains(tnt)) + .findFirst() + .orElse(null); + if (newParent == null) { + player.closeInventory(); + return; + } + SimulatorGui simulatorGui = new SimulatorGui(player, simulator); + if (newParent.getElements().size() == 1) { + simulatorGui.open(); + } else { + new SimulatorGroupGui(player, simulator, newParent, simulatorGui).open(); + } + } })); // Material Chooser - List lore = new ArrayList<>(); - lore.add("§7Phase count§8:§e " + data.size()); - lore.add("§7Tick§8:§e " + tnt.getBaseTick()); - lore.add(""); - lore.add("§7X§8:§e " + tnt.getPosition().getX()); - lore.add("§7Y§8:§e " + tnt.getPosition().getY()); - lore.add("§7Z§8:§e " + tnt.getPosition().getZ()); - if (tnt.isDisabled()) { - lore.add(""); - lore.add("§cDisabled"); - } - inventory.setItem(4, new SWItem(tnt.getMaterial(), "§eTNT", lore, tnt.isDisabled(), clickType -> { + inventory.setItem(4, tnt.toItem(player, clickType -> { new SimulatorMaterialGui(player, simulator, tnt::getMaterial, tnt::setMaterial, this).open(); })); @@ -90,7 +96,7 @@ public class SimulatorTNTGui extends SimulatorScrollGui { new SimulatorTNTSettingsGui(player, simulator, tnt, this).open(); })); inventory.setItem(49, new SWItem(Material.LEAD, "§eMove", clickType -> { - new SimulatorGroupChooserGui(player, simulator, simulator.getElements().stream().filter( e -> e != parent).collect(Collectors.toList()), tnt, parent, this).open(); + new SimulatorGroupChooserGui(player, simulator, tnt, parent, this).open(); })); inventory.setItem(50, new SWItem(tnt.isDisabled() ? Material.ENDER_PEARL : Material.ENDER_EYE, tnt.isDisabled() ? "§cDisabled" : "§aEnabled", clickType -> { tnt.setDisabled(!tnt.isDisabled()); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java index 852eadd3..2f8d548a 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java @@ -62,7 +62,7 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { })); // Material Chooser - inventory.setItem(4, new SWItem(tntElement.getMaterial(), "§TNT", clickType -> { + inventory.setItem(4, tntElement.toItem(player, clickType -> { new SimulatorMaterialGui(player, simulator, tntElement::getMaterial, tntElement::setMaterial, this).open(); })); 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 index 1daf0ae4..074e86c4 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTSettingsGui.java @@ -68,7 +68,7 @@ public class SimulatorTNTSettingsGui extends SimulatorBaseGui { lore.add(""); lore.add("§cDisabled"); } - inventory.setItem(4, new SWItem(tnt.getMaterial(), "§eTNT", lore, tnt.isDisabled(), clickType -> { + inventory.setItem(4, tnt.toItem(player, clickType -> { new SimulatorMaterialGui(player, simulator, tnt::getMaterial, tnt::setMaterial, this).open(); })); From 834039c4d403b30f554f4c0e722cdc65c9d60f89 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sun, 22 Oct 2023 13:25:00 +0200 Subject: [PATCH 24/48] Consolidate Item Generation Fix Back arrow in element gui --- .../features/simulator2/gui/SimulatorGroupChooserGui.java | 1 + 1 file changed, 1 insertion(+) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupChooserGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupChooserGui.java index 8cecb246..503feb86 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupChooserGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupChooserGui.java @@ -54,6 +54,7 @@ public class SimulatorGroupChooserGui extends SimulatorPageGui { SimulatorGroup newParent = new SimulatorGroup(); newParent.add(subject); simulator.getElements().add(newParent); + parent.getElements().remove(subject); back.open(); SimulatorWatcher.update(simulator); })); From 35060834168ed1299dd6e9ca18483306a8cb0cec Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sun, 22 Oct 2023 14:25:54 +0200 Subject: [PATCH 25/48] Add SimulatorExecutor --- .../simulator2/SimulatorTestCommand.java | 17 ++-- .../features/simulator2/data/Simulator.java | 8 ++ .../simulator2/data/SimulatorElement.java | 9 +++ .../simulator2/data/SimulatorGroup.java | 9 +++ .../simulator2/data/SimulatorPhase.java | 7 ++ .../data/redstone/RedstonePhase.java | 32 ++++++++ .../simulator2/data/tnt/TNTPhase.java | 22 +++++ .../features/simulator2/execute/.gitkeep | 0 .../simulator2/execute/SimulatorAction.java | 36 +++++++++ .../simulator2/execute/SimulatorExecutor.java | 81 +++++++++++++++++++ .../gui/SimulatorTNTPhaseSettingsGui.java | 2 +- 11 files changed, 217 insertions(+), 6 deletions(-) delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/execute/.gitkeep create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/execute/SimulatorAction.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/execute/SimulatorExecutor.java diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java index 82b7703e..e66d7f21 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java @@ -25,9 +25,11 @@ import de.steamwar.bausystem.features.simulator2.data.redstone.RedstoneElement; import de.steamwar.bausystem.features.simulator2.data.redstone.RedstonePhase; import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement; import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase; +import de.steamwar.bausystem.features.simulator2.execute.SimulatorExecutor; import de.steamwar.bausystem.features.simulator2.gui.SimulatorGui; import de.steamwar.command.SWCommand; import de.steamwar.linkage.Linked; +import jdk.jfr.Registered; import org.bukkit.entity.Player; import org.bukkit.util.Vector; @@ -39,18 +41,23 @@ public class SimulatorTestCommand extends SWCommand { public SimulatorTestCommand() { super("simtest"); - SimulatorGroup group1 = new SimulatorGroup().add(new TNTElement(new Vector(0, 0, 0)).add(new TNTPhase())).add(new TNTElement(new Vector(0, 0, 0)).add(new TNTPhase())); + SimulatorGroup group1 = new SimulatorGroup().add(new TNTElement(new Vector(-477.5, 46, 311.5)).add(new TNTPhase())); SIMULATOR.getElements().add(group1); - SimulatorGroup group2 = new SimulatorGroup().add(new TNTElement(new Vector(0, 0, 0)).add(new TNTPhase())); + SimulatorGroup group2 = new SimulatorGroup().add(new TNTElement(new Vector(-477.5, 47, 312.5)).add(new TNTPhase())); SIMULATOR.getElements().add(group2); - SimulatorGroup group3 = new SimulatorGroup().add(new RedstoneElement(new Vector(0, 0, 0)).add(new RedstonePhase())); + SimulatorGroup group3 = new SimulatorGroup().add(new RedstoneElement(new Vector(-484, 47, 307)).add(new RedstonePhase())); SIMULATOR.getElements().add(group3); } - @Register - public void genericCommand(Player player, String... args) { + @Register("open") + public void openCommand(Player player) { new SimulatorGui(player, SIMULATOR).open(); } + + @Register("run") + public void runCommand(Player player) { + SimulatorExecutor.run(SIMULATOR); + } } 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 df486e6c..73f0ab1d 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,6 +19,7 @@ package de.steamwar.bausystem.features.simulator2.data; +import de.steamwar.bausystem.features.simulator2.execute.SimulatorAction; import de.steamwar.inventory.InvCallback; import de.steamwar.inventory.SWItem; import lombok.Getter; @@ -29,6 +30,7 @@ import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.List; +import java.util.Map; @Getter @Setter @@ -48,4 +50,10 @@ public class Simulator { public SWItem toItem(Player player, InvCallback invCallback) { return new SWItem(material, "§e" + name, invCallback); } + + public void toSimulatorActions(Map> actions) { + elements.forEach(simulatorGroup -> { + simulatorGroup.toSimulatorActions(actions); + }); + } } 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 3a5cf861..3f5136c0 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,6 +19,7 @@ package de.steamwar.bausystem.features.simulator2.data; +import de.steamwar.bausystem.features.simulator2.execute.SimulatorAction; import de.steamwar.inventory.InvCallback; import de.steamwar.inventory.SWItem; import lombok.Getter; @@ -30,6 +31,7 @@ import org.bukkit.util.Vector; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; @Getter @Setter @@ -88,4 +90,11 @@ public abstract class SimulatorElement { } return new SWItem(material, "§e" + getName(), lore, disabled, invCallback); } + + public void toSimulatorActions(Map> actions) { + if (disabled) return; + phases.forEach(phase -> { + phase.toSimulatorActions(actions, position.clone()); + }); + } } 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 86bcba99..1c3ac29c 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,6 +19,7 @@ package de.steamwar.bausystem.features.simulator2.data; +import de.steamwar.bausystem.features.simulator2.execute.SimulatorAction; import de.steamwar.inventory.InvCallback; import de.steamwar.inventory.SWItem; import lombok.Getter; @@ -29,6 +30,7 @@ import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; @Getter @Setter @@ -79,4 +81,11 @@ public class SimulatorGroup { return new SWItem(material, "§eGroup", lore, disabled, groupCallback); } } + + public void toSimulatorActions(Map> actions) { + if (disabled) return; + elements.forEach(simulatorElement -> { + simulatorElement.toSimulatorActions(actions); + }); + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java index cc9c0011..126775b5 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java @@ -19,8 +19,13 @@ package de.steamwar.bausystem.features.simulator2.data; +import de.steamwar.bausystem.features.simulator2.execute.SimulatorAction; import lombok.Getter; import lombok.Setter; +import org.bukkit.util.Vector; + +import java.util.List; +import java.util.Map; @Getter @Setter @@ -30,4 +35,6 @@ public abstract class SimulatorPhase { protected int tickOffset = 0; protected int lifetime = 80; protected int order = 1; + + public abstract void toSimulatorActions(Map> actions, Vector position); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java index 54686631..e8b1c210 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java @@ -20,8 +20,18 @@ package de.steamwar.bausystem.features.simulator2.data.redstone; import de.steamwar.bausystem.features.simulator2.data.SimulatorPhase; +import de.steamwar.bausystem.features.simulator2.execute.SimulatorAction; import lombok.NoArgsConstructor; import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; @NoArgsConstructor public class RedstonePhase extends SimulatorPhase { @@ -33,4 +43,26 @@ public class RedstonePhase extends SimulatorPhase { { this.lifetime = 1; } + + @Override + public void toSimulatorActions(Map> actions, Vector position) { + AtomicReference previousBlockState = new AtomicReference<>(); + actions.computeIfAbsent(tickOffset, __ -> new ArrayList<>()) + .add(new SimulatorAction(0, 1) { + @Override + public void accept(World world) { + Block block = world.getBlockAt(position.getBlockX(), position.getBlockY(), position.getBlockZ()); + previousBlockState.set(block.getState()); + block.setType(Material.REDSTONE_BLOCK); + } + }); + + actions.computeIfAbsent(tickOffset + lifetime, __ -> new ArrayList<>()) + .add(new SimulatorAction(0, 1) { + @Override + public void accept(World world) { + previousBlockState.get().update(true, true); + } + }); + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTPhase.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTPhase.java index 0f04cdd9..36c2d2f6 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTPhase.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTPhase.java @@ -20,9 +20,17 @@ package de.steamwar.bausystem.features.simulator2.data.tnt; import de.steamwar.bausystem.features.simulator2.data.SimulatorPhase; +import de.steamwar.bausystem.features.simulator2.execute.SimulatorAction; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.bukkit.World; +import org.bukkit.entity.TNTPrimed; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; @Getter @Setter @@ -46,4 +54,18 @@ public class TNTPhase extends SimulatorPhase { yJump = jump; zJump = jump; } + + @Override + public void toSimulatorActions(Map> actions, Vector position) { + actions.computeIfAbsent(tickOffset, __ -> new ArrayList<>()).add(new SimulatorAction(order, count) { + @Override + public void accept(World world) { + TNTPrimed tnt = world.spawn(position.toLocation(world), TNTPrimed.class); + if (!xJump) tnt.setVelocity(tnt.getVelocity().setX(0)); + if (!yJump) tnt.setVelocity(tnt.getVelocity().setY(0)); + if (!zJump) tnt.setVelocity(tnt.getVelocity().setZ(0)); + tnt.setFuseTicks(lifetime); + } + }); + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/execute/.gitkeep b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/execute/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/execute/SimulatorAction.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/execute/SimulatorAction.java new file mode 100644 index 00000000..bacc0ffd --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/execute/SimulatorAction.java @@ -0,0 +1,36 @@ +/* + * 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.execute; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.World; + +import java.util.function.Consumer; + +@Getter +@AllArgsConstructor +public abstract class SimulatorAction implements Consumer { + private int order; + + @Setter + private int count; +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/execute/SimulatorExecutor.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/execute/SimulatorExecutor.java new file mode 100644 index 00000000..0f755aa6 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/execute/SimulatorExecutor.java @@ -0,0 +1,81 @@ +/* + * 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.execute; + +import de.steamwar.bausystem.BauSystem; +import de.steamwar.bausystem.features.simulator2.data.Simulator; +import lombok.experimental.UtilityClass; +import org.bukkit.Bukkit; +import org.bukkit.World; + +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; + +@UtilityClass +public class SimulatorExecutor { + + private static final World WORLD = Bukkit.getWorlds().get(0); + private static Set currentlyRunning = new HashSet<>(); + + public boolean run(Simulator simulator) { + if (currentlyRunning.contains(simulator)) return false; + + Map> map = new HashMap<>(); + simulator.toSimulatorActions(map); + + Map>> actions = new HashMap<>(); + map.forEach((integer, simulatorActions) -> { + simulatorActions.forEach(simulatorAction -> { + actions.computeIfAbsent(integer, __ -> new HashMap<>()).computeIfAbsent(simulatorAction.getOrder(), __ -> new ArrayList<>()).add(simulatorAction); + }); + }); + + AtomicInteger tick = new AtomicInteger(); + BauSystem.runTaskTimer(BauSystem.getInstance(), bukkitTask -> { + if (actions.isEmpty()) { + bukkitTask.cancel(); + currentlyRunning.remove(simulator); + return; + } + + int currentTick = tick.getAndIncrement(); + Map> actionsToRun = actions.remove(currentTick); + if (actionsToRun == null) return; + List keys = new ArrayList<>(actionsToRun.keySet()); + keys.sort(null); + + for (int actionKey : keys) { + List keyedActions = actionsToRun.get(actionKey); + while (!keyedActions.isEmpty()) { + Collections.shuffle(keyedActions); + for (int i = keyedActions.size() - 1 ; i >= 0; i--) { + SimulatorAction action = keyedActions.get(i); + action.accept(WORLD); + action.setCount(action.getCount() - 1); + if (action.getCount() == 0) { + keyedActions.remove(i); + } + } + } + } + }, 0, 1); + return true; + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java index 2f8d548a..4e68d0dd 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java @@ -136,7 +136,7 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { orderItem.getItemStack().setAmount(Math.max(1, Math.min(order, 30))); inventory.setItem(22, orderItem); - inventory.setItem(31, SWItem.getDye(order > -30 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + inventory.setItem(31, SWItem.getDye(order > -SimulatorPhase.ORDER_LIMIT ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { tnt.setOrder(Math.max(-30, order - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }); From 4e6ee3b95b58ebb9f094276fc49f93fc72599b2f Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sun, 22 Oct 2023 18:05:13 +0200 Subject: [PATCH 26/48] Add SimulatorWatcher.show, SimulatorWatcher.hide --- .../simulator2/SimulatorTestCommand.java | 10 ++++ .../features/simulator2/SimulatorWatcher.java | 54 +++++++++++++++++-- .../simulator2/data/SimulatorElement.java | 6 +++ .../data/redstone/RedstoneElement.java | 10 ++++ .../simulator2/data/tnt/TNTElement.java | 16 ++++++ .../simulator2/gui/SimulatorGroupGui.java | 4 +- .../features/simulator2/gui/SimulatorGui.java | 4 +- 7 files changed, 98 insertions(+), 6 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java index e66d7f21..d7f8a766 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java @@ -60,4 +60,14 @@ public class SimulatorTestCommand extends SWCommand { public void runCommand(Player player) { SimulatorExecutor.run(SIMULATOR); } + + @Register("show") + public void showCommand(Player player) { + SimulatorWatcher.show(SIMULATOR, player); + } + + @Register("hide") + public void hideCommand(Player player) { + SimulatorWatcher.hide(SIMULATOR, player); + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java index 2c6f8cbf..5c1e8ddb 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java @@ -20,21 +20,32 @@ package de.steamwar.bausystem.features.simulator2; 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.tnt.TNTElement; 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 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.ArrayList; -import java.util.HashMap; -import java.util.Map; +import java.util.*; @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) { @@ -46,6 +57,10 @@ public class SimulatorWatcher { } public void update(Simulator simulator) { + REntityServer rEntityServer = entityServers.get(simulator); + rEntityServer.getEntities().forEach(REntity::die); + createSim(rEntityServer, simulator); + new ArrayList<>(watchers.values()).forEach(simulatorRunnablePair -> { if (simulatorRunnablePair.getKey() == simulator) { simulatorRunnablePair.getValue().run(); @@ -59,6 +74,39 @@ public class SimulatorWatcher { @EventHandler public void onPlayerQuit(PlayerQuitEvent event) { watchers.remove(event.getPlayer()); + hide(event.getPlayer()); } } + + private REntityServer createSim(REntityServer server, Simulator simulator) { + Map>> positionCache = new HashMap<>(); + simulator.getElements().stream().map(SimulatorGroup::getElements).flatMap(List::stream).forEach(simulatorElement -> { + boolean wasNotPresent = positionCache.computeIfAbsent(simulatorElement.getPosition(), __ -> new HashSet<>()) + .add(simulatorElement.getClass()); + if (!wasNotPresent) return; + Material material = simulatorElement.getWorldMaterial(); + Location location = simulatorElement.getWorldPos().toLocation(WORLD); + RFallingBlockEntity rFallingBlockEntity = new RFallingBlockEntity(server, location, material); + rFallingBlockEntity.setNoGravity(true); + }); + return server; + } + + public void show(Simulator sim, Player player) { + entityServers.computeIfAbsent(sim, __ -> createSim(new REntityServer(), sim)).addPlayer(player); + } + + public void hide(Player player) { + entityServers.replaceAll((simulator, rEntityServer) -> { + rEntityServer.removePlayer(player); + return rEntityServer.getPlayers().isEmpty() ? null : rEntityServer; + }); + } + + public void hide(Simulator sim, Player player) { + entityServers.computeIfPresent(sim, (simulator, rEntityServer) -> { + rEntityServer.removePlayer(player); + return rEntityServer.getPlayers().isEmpty() ? null : rEntityServer; + }); + } } 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 3f5136c0..c61e33d9 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 @@ -76,6 +76,12 @@ public abstract class SimulatorElement { position.setZ(position.getZ() + z); } + public abstract Material getWorldMaterial(); + + public Vector getWorldPos() { + return position; + } + public SWItem toItem(Player player, InvCallback invCallback) { List lore = new ArrayList<>(); lore.add("§7Phase count§8:§e " + phases.size()); 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 f6acc458..85158939 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 @@ -33,4 +33,14 @@ public class RedstoneElement extends SimulatorElement { public String getName() { return "Redstone"; } + + @Override + public Material getWorldMaterial() { + return Material.REDSTONE_BLOCK; + } + + @Override + public Vector getWorldPos() { + return position.clone().add(new Vector(0.5, 0, 0.5)); + } } 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 3eb27a82..f5335903 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,7 +20,10 @@ package de.steamwar.bausystem.features.simulator2.data.tnt; import de.steamwar.bausystem.features.simulator2.data.SimulatorElement; +import de.steamwar.inventory.InvCallback; +import de.steamwar.inventory.SWItem; import org.bukkit.Material; +import org.bukkit.entity.Player; import org.bukkit.util.Vector; public class TNTElement extends SimulatorElement { @@ -61,4 +64,17 @@ public class TNTElement extends SimulatorElement { position.setZ(position.getBlockZ() + offset.getZ()); } } + + @Override + public SWItem toItem(Player player, InvCallback invCallback) { + long sum = phases.stream().mapToInt(TNTPhase::getCount).sum(); + SWItem swItem = super.toItem(player, invCallback); + swItem.getItemStack().setAmount((int) Math.min(64, Math.max(1, sum))); + return swItem; + } + + @Override + public Material getWorldMaterial() { + return Material.TNT; + } } 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 index 23a2354c..2cab54cc 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java @@ -50,6 +50,7 @@ public class SimulatorGroupGui extends SimulatorPageGui> { @Override public void headerAndFooter() { + simulatorGroup.getElements().removeIf(element -> element.getPhases().isEmpty()); if (simulatorGroup.getElements().size() < 2) { back.open(); return; @@ -63,7 +64,8 @@ public class SimulatorGroupGui extends SimulatorPageGui> { inventory.setItem(4, simulatorGroup.toItem(player, clickType -> { new SimulatorMaterialGui(player, simulator, simulatorGroup::getMaterial, simulatorGroup::setMaterial, this).open(); - }, clickType -> {})); + }, clickType -> { + })); inventory.setItem(48, new SWItem(Material.REPEATER, "§eSettings", clickType -> { new SimulatorGroupSettingsGui(player, simulator, simulatorGroup, this).open(); 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 index 932fc4a5..757918a3 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java @@ -43,7 +43,7 @@ public class SimulatorGui extends SimulatorPageGui { @Override public void headerAndFooter() { - simulator.getElements().removeIf(element -> element.getElements().isEmpty()); + simulator.getElements().removeIf(element -> element.getElements().isEmpty() || element.getElements().stream().allMatch(simulatorElement -> simulatorElement.getPhases().isEmpty())); inventory.setItem(4, simulator.toItem(player, clickType -> { new SimulatorMaterialGui(player, simulator, simulator::getMaterial, simulator::setMaterial, this).open(); @@ -60,7 +60,7 @@ public class SimulatorGui extends SimulatorPageGui { }, clickType -> { SimulatorElement element = simulatorGroup.getElements().get(0); if (element instanceof TNTElement) { - new SimulatorTNTGui(player, simulator, (TNTElement) element, simulatorGroup,this).open(); + new SimulatorTNTGui(player, simulator, (TNTElement) element, simulatorGroup, this).open(); } else if (element instanceof RedstoneElement) { new SimulatorRedstoneGui(player, simulator, simulatorGroup, (RedstoneElement) element, this).open(); } From 648482183a0c946bdecf9d72654ba60e43974e8a Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sun, 22 Oct 2023 22:54:59 +0200 Subject: [PATCH 27/48] Move some stuff and add SimulatorCursor --- .../features/simulator2/SimulatorCursor.java | 199 ++++++++++++++++++ .../simulator2/gui/SimulatorGroupGui.java | 1 - .../gui/SimulatorGroupSettingsGui.java | 1 - .../features/simulator2/gui/SimulatorGui.java | 1 - .../gui/{utils => }/SimulatorMaterialGui.java | 2 +- .../simulator2/gui/SimulatorRedstoneGui.java | 3 - .../SimulatorRedstonePhaseSettingsGui.java | 2 - .../gui/SimulatorRedstoneSettingsGui.java | 3 - .../simulator2/gui/SimulatorSettingsGui.java | 1 - .../simulator2/gui/SimulatorTNTGui.java | 5 - .../gui/SimulatorTNTPhaseSettingsGui.java | 1 - .../gui/SimulatorTNTSettingsGui.java | 1 - 12 files changed, 200 insertions(+), 20 deletions(-) create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java rename BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/{utils => }/SimulatorMaterialGui.java (97%) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java new file mode 100644 index 00000000..485bcd83 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java @@ -0,0 +1,199 @@ +/* + * 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 com.comphenix.tinyprotocol.Reflection; +import com.comphenix.tinyprotocol.TinyProtocol; +import de.steamwar.bausystem.BauSystem; +import de.steamwar.bausystem.SWUtils; +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.linkage.Linked; +import de.steamwar.linkage.api.Plain; +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.Listener; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerItemHeldEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiFunction; + +@Linked +public class SimulatorCursor implements Plain, Listener { + + private final World WORLD = Bukkit.getWorlds().get(0); + private Class position = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInFlying$PacketPlayInPosition"); + private Class look = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInFlying$PacketPlayInLook"); + private Class positionLook = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInFlying$PacketPlayInPositionLook"); + + private Map cursors = new HashMap<>(); + + public static boolean isSimulatorItem(ItemStack itemStack) { + return ItemUtils.isItem(itemStack, "simulator"); + } + + public SimulatorCursor() { + BiFunction function = (player, object) -> { + if (!isSimulatorItem(player.getInventory().getItemInMainHand()) && !isSimulatorItem(player.getInventory().getItemInOffHand())) { + removeCursor(player); + return object; + } + RayTraceUtils.RRayTraceResult rayTraceResult = RayTraceUtils.traceREntity(player, player.getLocation(), new ArrayList<>()); + if (rayTraceResult == null) { + removeCursor(player); + return object; + } + + showCursor(player, rayTraceResult); + return object; + }; + TinyProtocol.instance.addFilter(position, function); + TinyProtocol.instance.addFilter(look, function); + TinyProtocol.instance.addFilter(positionLook, function); + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + if (!isSimulatorItem(player.getInventory().getItemInMainHand()) && !isSimulatorItem(player.getInventory().getItemInOffHand())) { + return; + } + RayTraceUtils.RRayTraceResult rayTraceResult = RayTraceUtils.traceREntity(player, player.getLocation(), new ArrayList<>()); + if (rayTraceResult == null) { + return; + } + + showCursor(player, rayTraceResult); + } + + @EventHandler + public void onPlayerDropItem(PlayerDropItemEvent event) { + Player player = event.getPlayer(); + if (!isSimulatorItem(player.getInventory().getItemInMainHand()) && !isSimulatorItem(player.getInventory().getItemInOffHand())) { + removeCursor(player); + return; + } + RayTraceUtils.RRayTraceResult rayTraceResult = RayTraceUtils.traceREntity(player, player.getLocation(), new ArrayList<>()); + if (rayTraceResult == null) { + removeCursor(player); + return; + } + + showCursor(player, rayTraceResult); + } + + @EventHandler + public void onPlayerItemHeld(PlayerItemHeldEvent event) { + Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> { + Player player = event.getPlayer(); + if (!isSimulatorItem(player.getInventory().getItemInMainHand()) && !isSimulatorItem(player.getInventory().getItemInOffHand())) { + removeCursor(player); + return; + } + RayTraceUtils.RRayTraceResult rayTraceResult = RayTraceUtils.traceREntity(player, player.getLocation(), new ArrayList<>()); + if (rayTraceResult == null) { + removeCursor(player); + return; + } + + showCursor(player, rayTraceResult); + }, 1); + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + cursors.remove(event.getPlayer()); + } + + private void removeCursor(Player player) { + cursors.computeIfPresent(player, (player1, rEntityServer) -> { + rEntityServer.close(); + return null; + }); + } + + private void showCursor(Player player, RayTraceUtils.RRayTraceResult rayTraceResult) { + REntityServer entityServer = cursors.computeIfAbsent(player, __ -> { + REntityServer rEntityServer = new REntityServer(); + rEntityServer.addPlayer(player); + RFallingBlockEntity rFallingBlockEntity = new RFallingBlockEntity(rEntityServer, new Location(WORLD, 0, 0, 0, 0, 0), Material.GLASS); + rFallingBlockEntity.setNoGravity(true); + return rEntityServer; + }); + entityServer.getEntities().forEach(rEntity -> { + rEntity.move(getPos(player, rayTraceResult).toLocation(WORLD)); + }); + } + + public static Vector getPos(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; + } +} 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 index 2cab54cc..f1bce0f2 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java @@ -27,7 +27,6 @@ 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; 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 index df5b06fe..6f945bdf 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupSettingsGui.java @@ -23,7 +23,6 @@ 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; 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 index 757918a3..d2e5ce95 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java @@ -25,7 +25,6 @@ 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; 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/SimulatorMaterialGui.java similarity index 97% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/utils/SimulatorMaterialGui.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorMaterialGui.java index 95d321a7..9e8e6081 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/utils/SimulatorMaterialGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorMaterialGui.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.gui.utils; +package de.steamwar.bausystem.features.simulator2.gui; import de.steamwar.bausystem.features.simulator2.SimulatorWatcher; import de.steamwar.bausystem.features.simulator2.data.Simulator; 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 index efb64277..27222540 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java @@ -26,15 +26,12 @@ import de.steamwar.bausystem.features.simulator2.data.redstone.RedstoneElement; import de.steamwar.bausystem.features.simulator2.data.redstone.RedstonePhase; 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 org.bukkit.event.inventory.ClickType; -import java.util.ArrayList; import java.util.Arrays; -import java.util.List; public class SimulatorRedstoneGui extends SimulatorScrollGui { diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java index 7835261d..7b93f595 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java @@ -21,11 +21,9 @@ 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.SimulatorPhase; import de.steamwar.bausystem.features.simulator2.data.redstone.RedstoneElement; import de.steamwar.bausystem.features.simulator2.data.redstone.RedstonePhase; 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; 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 index 7152cc6f..ed4a99cb 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneSettingsGui.java @@ -23,14 +23,11 @@ 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; 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 index b9e75a5e..8ed72b0e 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorSettingsGui.java @@ -22,7 +22,6 @@ 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; 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 index 34906cd0..a21cf414 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java @@ -26,17 +26,12 @@ import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement; import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase; 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.bausystem.features.simulator2.gui.SimulatorTNTPhaseSettingsGui; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; -import java.util.ArrayList; import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; public class SimulatorTNTGui extends SimulatorScrollGui { diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java index 4e68d0dd..fffb767a 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java @@ -25,7 +25,6 @@ import de.steamwar.bausystem.features.simulator2.data.SimulatorPhase; import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement; import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase; 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; 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 index 074e86c4..f93cc648 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTSettingsGui.java @@ -23,7 +23,6 @@ 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; From c0551c0cf89604df7d6ff4b6a185c7e13907a739 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Mon, 23 Oct 2023 21:22:17 +0200 Subject: [PATCH 28/48] Fix SimulatorWatcher for non watched Simulator --- .../bausystem/features/simulator2/SimulatorWatcher.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java index 5c1e8ddb..8bc0d8c6 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java @@ -58,8 +58,10 @@ public class SimulatorWatcher { public void update(Simulator simulator) { REntityServer rEntityServer = entityServers.get(simulator); - rEntityServer.getEntities().forEach(REntity::die); - createSim(rEntityServer, simulator); + if (rEntityServer != null) { + rEntityServer.getEntities().forEach(REntity::die); + createSim(rEntityServer, simulator); + } new ArrayList<>(watchers.values()).forEach(simulatorRunnablePair -> { if (simulatorRunnablePair.getKey() == simulator) { From d09c3548a78d07744426b05e29b55e6771ffc60d Mon Sep 17 00:00:00 2001 From: yoyosource Date: Tue, 24 Oct 2023 18:11:04 +0200 Subject: [PATCH 29/48] Add SimulatorStorage Add SimulatorCursor showing highlighted entity --- .../features/simulator/SimulatorCursor.java | 1 + .../features/simulator2/SimulatorCursor.java | 198 ++++++++++++------ .../features/simulator2/SimulatorStorage.java | 57 +++++ .../simulator2/SimulatorTestCommand.java | 2 +- .../features/simulator2/SimulatorWatcher.java | 8 + .../features/simulator2/world/.gitkeep | 0 6 files changed, 200 insertions(+), 66 deletions(-) create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/world/.gitkeep diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java index e8fc1bac..eede5d32 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java @@ -44,6 +44,7 @@ public class SimulatorCursor { private Map rEntityServerMap = new HashMap<>(); public void show(Player player, TNTSimulator tntSimulator, RayTraceUtils.RRayTraceResult result) { + if (true) return; REntityServer cursor = rEntityServerMap.get(player); if (cursor != null) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java index 485bcd83..323ef04a 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java @@ -22,7 +22,7 @@ package de.steamwar.bausystem.features.simulator2; import com.comphenix.tinyprotocol.Reflection; import com.comphenix.tinyprotocol.TinyProtocol; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.SWUtils; +import de.steamwar.bausystem.features.simulator2.data.Simulator; import de.steamwar.bausystem.utils.ItemUtils; import de.steamwar.bausystem.utils.RayTraceUtils; import de.steamwar.entity.REntity; @@ -30,6 +30,8 @@ import de.steamwar.entity.REntityServer; import de.steamwar.entity.RFallingBlockEntity; import de.steamwar.linkage.Linked; import de.steamwar.linkage.api.Plain; +import lombok.AllArgsConstructor; +import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -37,17 +39,13 @@ 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.player.PlayerDropItemEvent; -import org.bukkit.event.player.PlayerItemHeldEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.*; import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import java.util.function.BiFunction; @Linked @@ -58,7 +56,8 @@ public class SimulatorCursor implements Plain, Listener { private Class look = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInFlying$PacketPlayInLook"); private Class positionLook = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInFlying$PacketPlayInPositionLook"); - private Map cursors = new HashMap<>(); + private Map cursorType = Collections.synchronizedMap(new HashMap<>()); + private Map cursors = Collections.synchronizedMap(new HashMap<>()); public static boolean isSimulatorItem(ItemStack itemStack) { return ItemUtils.isItem(itemStack, "simulator"); @@ -66,17 +65,7 @@ public class SimulatorCursor implements Plain, Listener { public SimulatorCursor() { BiFunction function = (player, object) -> { - if (!isSimulatorItem(player.getInventory().getItemInMainHand()) && !isSimulatorItem(player.getInventory().getItemInOffHand())) { - removeCursor(player); - return object; - } - RayTraceUtils.RRayTraceResult rayTraceResult = RayTraceUtils.traceREntity(player, player.getLocation(), new ArrayList<>()); - if (rayTraceResult == null) { - removeCursor(player); - return object; - } - - showCursor(player, rayTraceResult); + calcCursor(player); return object; }; TinyProtocol.instance.addFilter(position, function); @@ -86,78 +75,107 @@ public class SimulatorCursor implements Plain, Listener { @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { - Player player = event.getPlayer(); - if (!isSimulatorItem(player.getInventory().getItemInMainHand()) && !isSimulatorItem(player.getInventory().getItemInOffHand())) { - return; - } - RayTraceUtils.RRayTraceResult rayTraceResult = RayTraceUtils.traceREntity(player, player.getLocation(), new ArrayList<>()); - if (rayTraceResult == null) { - return; - } - - showCursor(player, rayTraceResult); + calcCursor(event.getPlayer()); } @EventHandler public void onPlayerDropItem(PlayerDropItemEvent event) { - Player player = event.getPlayer(); - if (!isSimulatorItem(player.getInventory().getItemInMainHand()) && !isSimulatorItem(player.getInventory().getItemInOffHand())) { - removeCursor(player); - return; - } - RayTraceUtils.RRayTraceResult rayTraceResult = RayTraceUtils.traceREntity(player, player.getLocation(), new ArrayList<>()); - if (rayTraceResult == null) { - removeCursor(player); - return; - } - - showCursor(player, rayTraceResult); + calcCursor(event.getPlayer()); } @EventHandler public void onPlayerItemHeld(PlayerItemHeldEvent event) { Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> { - Player player = event.getPlayer(); - if (!isSimulatorItem(player.getInventory().getItemInMainHand()) && !isSimulatorItem(player.getInventory().getItemInOffHand())) { - removeCursor(player); - return; - } - RayTraceUtils.RRayTraceResult rayTraceResult = RayTraceUtils.traceREntity(player, player.getLocation(), new ArrayList<>()); - if (rayTraceResult == null) { - removeCursor(player); - return; - } - - showCursor(player, rayTraceResult); + calcCursor(event.getPlayer()); }, 1); } @EventHandler public void onPlayerQuit(PlayerQuitEvent event) { + cursorType.remove(event.getPlayer()); cursors.remove(event.getPlayer()); } - private void removeCursor(Player player) { - cursors.computeIfPresent(player, (player1, rEntityServer) -> { - rEntityServer.close(); - return null; - }); + 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); } - private void showCursor(Player player, RayTraceUtils.RRayTraceResult rayTraceResult) { + @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 type = cursorType.getOrDefault(player, CursorType.TNT).switchType(); + cursorType.put(player, type); + calcCursor(player); + } else { + LAST_SNEAKS.put(player, System.currentTimeMillis()); + } + } + + private void calcCursor(Player player) { + if (!isSimulatorItem(player.getInventory().getItemInMainHand()) && !isSimulatorItem(player.getInventory().getItemInOffHand())) { + removeCursor(player); + return; + } + Simulator simulator = SimulatorStorage.getSimulator(player); + List entities = SimulatorWatcher.getEntitiesOfSimulator(simulator); + RayTraceUtils.RRayTraceResult rayTraceResult = RayTraceUtils.traceREntity(player, player.getLocation(), entities); + if (rayTraceResult == null) { + removeCursor(player); + return; + } + + showCursor(player, rayTraceResult); + } + + private void removeCursor(Player player) { + REntityServer entityServer = cursors.get(player); + if (entityServer != null) { + entityServer.getEntities().forEach(REntity::die); + } + } + + private synchronized void showCursor(Player player, RayTraceUtils.RRayTraceResult rayTraceResult) { REntityServer entityServer = cursors.computeIfAbsent(player, __ -> { REntityServer rEntityServer = new REntityServer(); rEntityServer.addPlayer(player); - RFallingBlockEntity rFallingBlockEntity = new RFallingBlockEntity(rEntityServer, new Location(WORLD, 0, 0, 0, 0, 0), Material.GLASS); - rFallingBlockEntity.setNoGravity(true); return rEntityServer; }); - entityServer.getEntities().forEach(rEntity -> { - rEntity.move(getPos(player, rayTraceResult).toLocation(WORLD)); + + 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); + } + } } - public static Vector getPos(Player player, RayTraceUtils.RRayTraceResult result) { + public static Vector getPosTNT(Player player, RayTraceUtils.RRayTraceResult result) { Vector pos = result.getHitPosition(); BlockFace face = result.getHitBlockFace(); @@ -196,4 +214,54 @@ public class SimulatorCursor implements Plain, Listener { return pos; } + + private static Vector getPosRedstoneBlock(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); + pos.setY(pos.getBlockY()); + pos.setZ(pos.getBlockZ() + 0.5); + return pos; + } + + @Getter + @AllArgsConstructor + public enum CursorType { + TNT(Material.TNT, SimulatorCursor::getPosTNT), + REDSTONE_BLOCK(Material.REDSTONE_BLOCK, SimulatorCursor::getPosRedstoneBlock), + ; + + private Material material; + private BiFunction position; + + public CursorType switchType() { + if (this == TNT) { + return REDSTONE_BLOCK; + } + return TNT; + } + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java new file mode 100644 index 00000000..a4b7b7e6 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java @@ -0,0 +1,57 @@ +/* + * 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.SWUtils; +import de.steamwar.bausystem.features.simulator2.data.Simulator; +import de.steamwar.bausystem.utils.ItemUtils; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.HashMap; +import java.util.Map; + +public class SimulatorStorage { + + private static Map simulatorMap = new HashMap<>(); + private static NamespacedKey simulatorSelection = SWUtils.getNamespaceKey("simulator_selection"); + + public static Simulator getSimulator(Player player) { + Simulator simulator = getSimulator(player.getInventory().getItemInMainHand()); + if (simulator != null) return simulator; + return getSimulator(player.getInventory().getItemInOffHand()); + } + + public static Simulator getSimulator(ItemStack itemStack) { + if (!SimulatorCursor.isSimulatorItem(itemStack)) { + return null; + } + String selection = ItemUtils.getTag(itemStack, simulatorSelection); + if (selection == null) { + return null; + } + return simulatorMap.computeIfAbsent(selection, SimulatorStorage::loadSimulator); + } + + private static Simulator loadSimulator(String name) { + return SimulatorTestCommand.SIMULATOR; // TODO: Implement Loading and legacy Loading + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java index d7f8a766..4a739a77 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java @@ -36,7 +36,7 @@ import org.bukkit.util.Vector; @Linked public class SimulatorTestCommand extends SWCommand { - private static final Simulator SIMULATOR = new Simulator("TestSim"); + static final Simulator SIMULATOR = new Simulator("TestSim"); public SimulatorTestCommand() { super("simtest"); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java index 8bc0d8c6..b15e6889 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java @@ -111,4 +111,12 @@ public class SimulatorWatcher { return rEntityServer.getPlayers().isEmpty() ? null : rEntityServer; }); } + + List getEntitiesOfSimulator(Simulator simulator) { + REntityServer entityServer = entityServers.get(simulator); + if (entityServer == null) { + return Collections.emptyList(); + } + return entityServer.getEntities(); + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/world/.gitkeep b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/world/.gitkeep deleted file mode 100644 index e69de29b..00000000 From 20b116f228feed17ce7f42a7bbb58ef710bb4fd1 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Tue, 24 Oct 2023 23:05:16 +0200 Subject: [PATCH 30/48] Update many GUI's Add SimulatorCursor.onPlayerInteract --- .../simulator/TNTSimulatorListener.java | 2 +- .../features/simulator2/SimulatorCursor.java | 142 ++++++++++++++++-- .../simulator2/SimulatorTestCommand.java | 10 -- .../features/simulator2/SimulatorWatcher.java | 26 ++-- .../simulator2/data/SimulatorElement.java | 10 ++ .../simulator2/data/SimulatorGroup.java | 2 +- .../simulator2/data/SimulatorPhase.java | 2 +- .../data/redstone/RedstoneElement.java | 10 ++ .../data/redstone/RedstonePhase.java | 5 + .../simulator2/data/tnt/TNTElement.java | 9 ++ .../simulator2/gui/SimulatorGroupGui.java | 23 +-- .../gui/SimulatorGroupSettingsGui.java | 1 + .../features/simulator2/gui/SimulatorGui.java | 11 +- .../simulator2/gui/SimulatorRedstoneGui.java | 6 +- .../gui/SimulatorRedstoneSettingsGui.java | 2 +- .../simulator2/gui/SimulatorTNTGui.java | 6 +- .../gui/SimulatorTNTPhaseSettingsGui.java | 6 +- 17 files changed, 207 insertions(+), 66 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulatorListener.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulatorListener.java index a3862c9f..bfead637 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulatorListener.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulatorListener.java @@ -35,7 +35,7 @@ import org.bukkit.inventory.PlayerInventory; import java.util.function.Function; -@Linked +// @Linked public class TNTSimulatorListener implements Listener { private boolean permissionCheck(Player player) { diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java index 323ef04a..b7a38046 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java @@ -22,14 +22,25 @@ package de.steamwar.bausystem.features.simulator2; import com.comphenix.tinyprotocol.Reflection; import com.comphenix.tinyprotocol.TinyProtocol; import de.steamwar.bausystem.BauSystem; +import de.steamwar.bausystem.SWUtils; 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.redstone.RedstonePhase; +import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement; +import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase; +import de.steamwar.bausystem.features.simulator2.execute.SimulatorExecutor; +import de.steamwar.bausystem.features.simulator2.gui.SimulatorGroupGui; +import de.steamwar.bausystem.features.simulator2.gui.SimulatorGui; +import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui; 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.api.Plain; import lombok.AllArgsConstructor; import lombok.Getter; import org.bukkit.Bukkit; @@ -41,15 +52,21 @@ 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.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.stream.Collectors; @Linked -public class SimulatorCursor implements Plain, Listener { +public class SimulatorCursor implements Listener { private final World WORLD = Bukkit.getWorlds().get(0); private Class position = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInFlying$PacketPlayInPosition"); @@ -113,8 +130,7 @@ public class SimulatorCursor implements Plain, Listener { return; } if (LAST_SNEAKS.containsKey(player)) { - CursorType type = cursorType.getOrDefault(player, CursorType.TNT).switchType(); - cursorType.put(player, type); + cursorType.put(player, cursorType.getOrDefault(player, CursorType.TNT).switchType()); calcCursor(player); } else { LAST_SNEAKS.put(player, System.currentTimeMillis()); @@ -124,27 +140,32 @@ public class SimulatorCursor implements Plain, Listener { private void calcCursor(Player player) { if (!isSimulatorItem(player.getInventory().getItemInMainHand()) && !isSimulatorItem(player.getInventory().getItemInOffHand())) { removeCursor(player); + SimulatorWatcher.show(null, player); + SWUtils.sendToActionbar(player, ""); return; } Simulator simulator = SimulatorStorage.getSimulator(player); + SimulatorWatcher.show(simulator, player); + List entities = SimulatorWatcher.getEntitiesOfSimulator(simulator); RayTraceUtils.RRayTraceResult rayTraceResult = RayTraceUtils.traceREntity(player, player.getLocation(), entities); if (rayTraceResult == null) { removeCursor(player); + SWUtils.sendToActionbar(player, ""); return; } - showCursor(player, rayTraceResult); + showCursor(player, rayTraceResult, simulator != null); } - private void removeCursor(Player player) { + private synchronized void removeCursor(Player player) { REntityServer entityServer = cursors.get(player); if (entityServer != null) { entityServer.getEntities().forEach(REntity::die); } } - private synchronized void showCursor(Player player, RayTraceUtils.RRayTraceResult rayTraceResult) { + private synchronized void showCursor(Player player, RayTraceUtils.RRayTraceResult rayTraceResult, boolean hasSimulatorSelected) { REntityServer entityServer = cursors.computeIfAbsent(player, __ -> { REntityServer rEntityServer = new REntityServer(); rEntityServer.addPlayer(player); @@ -173,6 +194,16 @@ public class SimulatorCursor implements Plain, Listener { 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 getPosTNT(Player player, RayTraceUtils.RRayTraceResult result) { @@ -250,12 +281,14 @@ public class SimulatorCursor implements Plain, Listener { @Getter @AllArgsConstructor public enum CursorType { - TNT(Material.TNT, SimulatorCursor::getPosTNT), - REDSTONE_BLOCK(Material.REDSTONE_BLOCK, SimulatorCursor::getPosRedstoneBlock), + TNT(Material.TNT, SimulatorCursor::getPosTNT, "TNT", vector -> new TNTElement(vector).add(new TNTPhase())), + REDSTONE_BLOCK(Material.REDSTONE_BLOCK, SimulatorCursor::getPosRedstoneBlock, "Redstone Block", vector -> new RedstoneElement(vector).add(new RedstonePhase())), ; private Material material; private BiFunction position; + private String name; + private Function> elementFunction; public CursorType switchType() { if (this == TNT) { @@ -264,4 +297,93 @@ public class SimulatorCursor implements Plain, Listener { return TNT; } } + + @EventHandler + public void onPlayerInteract(PlayerInteractEvent event) { + 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(simulator); + 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) { + // TODO: Open Simulator Selection GUI + } else { + SWAnvilInv anvilInv = new SWAnvilInv(player, "Name"); + anvilInv.setCallback(s -> { + // TODO: Check if Sim exists then close and message, otherwise create sim and add first tnt open that! + }); + 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.getElements().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: + // Open multi element present in Simulator + 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 + 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.getElements().add(group); + SimulatorGui simulatorGui = new SimulatorGui(player, simulator); + element.open(player, simulator, group, simulatorGui); + SimulatorWatcher.update(simulator); + calcCursor(player); + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java index 4a739a77..be44ee99 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java @@ -60,14 +60,4 @@ public class SimulatorTestCommand extends SWCommand { public void runCommand(Player player) { SimulatorExecutor.run(SIMULATOR); } - - @Register("show") - public void showCommand(Player player) { - SimulatorWatcher.show(SIMULATOR, player); - } - - @Register("hide") - public void hideCommand(Player player) { - SimulatorWatcher.hide(SIMULATOR, player); - } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java index b15e6889..dc239c0d 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java @@ -76,11 +76,14 @@ public class SimulatorWatcher { @EventHandler public void onPlayerQuit(PlayerQuitEvent event) { watchers.remove(event.getPlayer()); - hide(event.getPlayer()); + show(null, event.getPlayer()); } } private REntityServer createSim(REntityServer server, Simulator simulator) { + if (simulator == null) { + return null; + } Map>> positionCache = new HashMap<>(); simulator.getElements().stream().map(SimulatorGroup::getElements).flatMap(List::stream).forEach(simulatorElement -> { boolean wasNotPresent = positionCache.computeIfAbsent(simulatorElement.getPosition(), __ -> new HashSet<>()) @@ -95,23 +98,16 @@ public class SimulatorWatcher { } public void show(Simulator sim, Player player) { + entityServers.forEach((simulator, rEntityServer) -> { + if (rEntityServer == null) return; + if (rEntityServer.getPlayers().contains(player) && sim != simulator) { + rEntityServer.removePlayer(player); + } + }); + if (sim == null) return; entityServers.computeIfAbsent(sim, __ -> createSim(new REntityServer(), sim)).addPlayer(player); } - public void hide(Player player) { - entityServers.replaceAll((simulator, rEntityServer) -> { - rEntityServer.removePlayer(player); - return rEntityServer.getPlayers().isEmpty() ? null : rEntityServer; - }); - } - - public void hide(Simulator sim, Player player) { - entityServers.computeIfPresent(sim, (simulator, rEntityServer) -> { - rEntityServer.removePlayer(player); - return rEntityServer.getPlayers().isEmpty() ? null : rEntityServer; - }); - } - List getEntitiesOfSimulator(Simulator simulator) { REntityServer entityServer = entityServers.get(simulator); if (entityServer == null) { 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 c61e33d9..b3c2b934 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 @@ -20,6 +20,7 @@ package de.steamwar.bausystem.features.simulator2.data; import de.steamwar.bausystem.features.simulator2.execute.SimulatorAction; +import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui; import de.steamwar.inventory.InvCallback; import de.steamwar.inventory.SWItem; import lombok.Getter; @@ -103,4 +104,13 @@ public abstract class SimulatorElement { phase.toSimulatorActions(actions, position.clone()); }); } + + public abstract void open(Player player, Simulator simulator, SimulatorGroup group, SimulatorBaseGui back); + + public SimulatorGroup getGroup(Simulator simulator) { + return simulator.getElements().stream() + .filter(simulatorGroup -> simulatorGroup.getElements().contains(this)) + .findFirst() + .orElse(null); + } } 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 1c3ac29c..4e643fda 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 @@ -78,7 +78,7 @@ public class SimulatorGroup { lore.add(""); lore.add("§cDisabled"); } - return new SWItem(material, "§eGroup", lore, disabled, groupCallback); + return new SWItem(material != null ? material : Material.ENDER_CHEST, "§eGroup", lore, disabled, groupCallback); } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java index 126775b5..d70acee5 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java @@ -34,7 +34,7 @@ public abstract class SimulatorPhase { protected int tickOffset = 0; protected int lifetime = 80; - protected int order = 1; + protected int order = 0; public abstract void toSimulatorActions(Map> actions, Vector position); } 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 85158939..158dfef4 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 @@ -19,8 +19,13 @@ package de.steamwar.bausystem.features.simulator2.data.redstone; +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.gui.SimulatorRedstoneGui; +import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui; import org.bukkit.Material; +import org.bukkit.entity.Player; import org.bukkit.util.Vector; public class RedstoneElement extends SimulatorElement { @@ -43,4 +48,9 @@ public class RedstoneElement extends SimulatorElement { public Vector getWorldPos() { return position.clone().add(new Vector(0.5, 0, 0.5)); } + + @Override + public void open(Player player, Simulator simulator, SimulatorGroup group, SimulatorBaseGui back) { + new SimulatorRedstoneGui(player, simulator, group, this, back).open(); + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java index e8b1c210..cd269703 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java @@ -51,12 +51,17 @@ public class RedstonePhase extends SimulatorPhase { .add(new SimulatorAction(0, 1) { @Override public void accept(World world) { + // TODO: 0 Tick Pistons not working Block block = world.getBlockAt(position.getBlockX(), position.getBlockY(), position.getBlockZ()); previousBlockState.set(block.getState()); block.setType(Material.REDSTONE_BLOCK); + previousBlockState.get().update(true, true); } }); + if (lifetime == 0) { + return; + } actions.computeIfAbsent(tickOffset + lifetime, __ -> new ArrayList<>()) .add(new SimulatorAction(0, 1) { @Override 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 f5335903..2a3037e0 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 @@ -19,7 +19,11 @@ package de.steamwar.bausystem.features.simulator2.data.tnt; +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.gui.SimulatorTNTGui; +import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui; import de.steamwar.inventory.InvCallback; import de.steamwar.inventory.SWItem; import org.bukkit.Material; @@ -77,4 +81,9 @@ public class TNTElement extends SimulatorElement { public Material getWorldMaterial() { return Material.TNT; } + + @Override + public void open(Player player, Simulator simulator, SimulatorGroup group, SimulatorBaseGui back) { + new SimulatorTNTGui(player, simulator, this, group, back).open(); + } } 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 index f1bce0f2..4360bcef 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java @@ -49,7 +49,9 @@ public class SimulatorGroupGui extends SimulatorPageGui> { @Override public void headerAndFooter() { - simulatorGroup.getElements().removeIf(element -> element.getPhases().isEmpty()); + if (simulatorGroup.getElements().removeIf(element -> element.getPhases().isEmpty())) { + SimulatorWatcher.update(simulator); + } if (simulatorGroup.getElements().size() < 2) { back.open(); return; @@ -62,27 +64,26 @@ public class SimulatorGroupGui extends SimulatorPageGui> { })); inventory.setItem(4, simulatorGroup.toItem(player, clickType -> { + if (simulatorGroup.getMaterial() == null) return; new SimulatorMaterialGui(player, simulator, simulatorGroup::getMaterial, simulatorGroup::setMaterial, this).open(); }, clickType -> { })); - inventory.setItem(48, new SWItem(Material.REPEATER, "§eSettings", clickType -> { + inventory.setItem(simulatorGroup.getMaterial() != null ? 48 : 49, 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); - })); + if (simulatorGroup.getMaterial() != null) { + 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) { return element.toItem(player, clickType -> { - if (element instanceof TNTElement) { - new SimulatorTNTGui(player, simulator, (TNTElement) element, simulatorGroup, this).open(); - } else if (element instanceof RedstoneElement) { - new SimulatorRedstoneGui(player, simulator, simulatorGroup, (RedstoneElement) element, this).open(); - } + element.open(player, simulator, simulatorGroup, this); }); } } 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 index 6f945bdf..eb27c8b2 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupSettingsGui.java @@ -59,6 +59,7 @@ public class SimulatorGroupSettingsGui extends SimulatorBaseGui { // Material Chooser inventory.setItem(4, simulatorGroup.toItem(player, clickType -> { + if (simulatorGroup.getMaterial() == null) return; new SimulatorMaterialGui(player, simulator, simulatorGroup::getMaterial, simulatorGroup::setMaterial, this).open(); }, clickType -> {})); 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 index d2e5ce95..192d239c 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java @@ -19,6 +19,7 @@ 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; @@ -42,7 +43,9 @@ public class SimulatorGui extends SimulatorPageGui { @Override public void headerAndFooter() { - simulator.getElements().removeIf(element -> element.getElements().isEmpty() || element.getElements().stream().allMatch(simulatorElement -> simulatorElement.getPhases().isEmpty())); + if (simulator.getElements().removeIf(element -> element.getElements().isEmpty() || element.getElements().stream().allMatch(simulatorElement -> simulatorElement.getPhases().isEmpty()))) { + SimulatorWatcher.update(simulator); + } inventory.setItem(4, simulator.toItem(player, clickType -> { new SimulatorMaterialGui(player, simulator, simulator::getMaterial, simulator::setMaterial, this).open(); @@ -58,11 +61,7 @@ public class SimulatorGui extends SimulatorPageGui { new SimulatorGroupGui(player, simulator, simulatorGroup, this).open(); }, clickType -> { SimulatorElement element = simulatorGroup.getElements().get(0); - if (element instanceof TNTElement) { - new SimulatorTNTGui(player, simulator, (TNTElement) element, simulatorGroup, this).open(); - } else if (element instanceof RedstoneElement) { - new SimulatorRedstoneGui(player, simulator, simulatorGroup, (RedstoneElement) element, this).open(); - } + element.open(player, simulator, simulatorGroup, this); }); } } 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 index 27222540..81c58b4e 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java @@ -55,6 +55,7 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { public void headerAndFooter() { if (redstone.getPhases().isEmpty()) { back.open(); + SimulatorWatcher.update(simulator); return; } @@ -65,10 +66,7 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { if (parent.getElements().contains(redstone)) { back.open(); } else { - SimulatorGroup newParent = simulator.getElements().stream() - .filter(simulatorGroup -> simulatorGroup.getElements().contains(redstone)) - .findFirst() - .orElse(null); + SimulatorGroup newParent = redstone.getGroup(simulator); if (newParent == null) { player.closeInventory(); return; 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 index ed4a99cb..25db707e 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneSettingsGui.java @@ -109,7 +109,7 @@ public class SimulatorRedstoneSettingsGui extends SimulatorBaseGui { redstone.move(0, 0, clickType.isShiftClick() ? 5 : 1); SimulatorWatcher.update(simulator); }); - inventory.setItem(26, new SWItem(Material.PAPER, "§eZ§8:§7" + redstone.getPosition().getBlockZ(), clickType -> { + inventory.setItem(26, new SWItem(Material.PAPER, "§eZ§8:§7 " + redstone.getPosition().getBlockZ(), clickType -> { })); inventory.setItem(35, SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { redstone.move(0, 0, clickType.isShiftClick() ? -5 : -1); 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 index a21cf414..c046a756 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java @@ -55,6 +55,7 @@ public class SimulatorTNTGui extends SimulatorScrollGui { public void headerAndFooter() { if (tnt.getPhases().isEmpty()) { back.open(); + SimulatorWatcher.update(simulator); return; } @@ -65,10 +66,7 @@ public class SimulatorTNTGui extends SimulatorScrollGui { if (parent.getElements().contains(tnt)) { back.open(); } else { - SimulatorGroup newParent = simulator.getElements().stream() - .filter(simulatorGroup -> simulatorGroup.getElements().contains(tnt)) - .findFirst() - .orElse(null); + SimulatorGroup newParent = tnt.getGroup(simulator); if (newParent == null) { player.closeInventory(); return; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java index fffb767a..613f1dc7 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java @@ -25,6 +25,7 @@ import de.steamwar.bausystem.features.simulator2.data.SimulatorPhase; import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement; import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase; import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui; +import de.steamwar.core.Core; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -130,9 +131,10 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { SimulatorWatcher.update(simulator); }); - SWItem orderItem = new SWItem(Material.COMPASS, "§eCalculation Order§8:§7 " + order, clickType -> { + 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 -> { }); - orderItem.getItemStack().setAmount(Math.max(1, Math.min(order, 30))); + orderItem.getItemStack().setAmount(Math.max(1, Math.min(Math.abs(order), 30))); inventory.setItem(22, orderItem); inventory.setItem(31, SWItem.getDye(order > -SimulatorPhase.ORDER_LIMIT ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { From 21ec66b4e2373f851be204316bf6e5fa5c2acb7d Mon Sep 17 00:00:00 2001 From: yoyosource Date: Wed, 25 Oct 2023 14:13:45 +0200 Subject: [PATCH 31/48] Fix many things --- .../features/simulator2/SimulatorCursor.java | 25 ++++++++++++++--- .../features/simulator2/SimulatorStorage.java | 28 +++++++++++++++++++ .../features/simulator2/SimulatorWatcher.java | 21 ++++++++------ .../data/redstone/RedstonePhase.java | 4 ++- 4 files changed, 65 insertions(+), 13 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java index b7a38046..3f443d26 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java @@ -34,12 +34,14 @@ import de.steamwar.bausystem.features.simulator2.execute.SimulatorExecutor; import de.steamwar.bausystem.features.simulator2.gui.SimulatorGroupGui; import de.steamwar.bausystem.features.simulator2.gui.SimulatorGui; import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui; +import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorPageGui; 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.inventory.SWItem; import de.steamwar.linkage.Linked; import lombok.AllArgsConstructor; import lombok.Getter; @@ -137,7 +139,7 @@ public class SimulatorCursor implements Listener { } } - private void calcCursor(Player player) { + private synchronized void calcCursor(Player player) { if (!isSimulatorItem(player.getInventory().getItemInMainHand()) && !isSimulatorItem(player.getInventory().getItemInOffHand())) { removeCursor(player); SimulatorWatcher.show(null, player); @@ -151,7 +153,11 @@ public class SimulatorCursor implements Listener { RayTraceUtils.RRayTraceResult rayTraceResult = RayTraceUtils.traceREntity(player, player.getLocation(), entities); if (rayTraceResult == null) { removeCursor(player); - SWUtils.sendToActionbar(player, ""); + if (simulator == null) { + SWUtils.sendToActionbar(player, "§eSelect Simulator"); + } else { + SWUtils.sendToActionbar(player, "§eOpen Simulator"); + } return; } @@ -324,11 +330,18 @@ public class SimulatorCursor implements Listener { RayTraceUtils.RRayTraceResult rayTraceResult = RayTraceUtils.traceREntity(player, player.getLocation(), SimulatorWatcher.getEntitiesOfSimulator(simulator)); if (simulator == null) { if (rayTraceResult == null) { - // TODO: Open Simulator Selection GUI + SimulatorStorage.openSimulatorSelector(player); } else { SWAnvilInv anvilInv = new SWAnvilInv(player, "Name"); anvilInv.setCallback(s -> { - // TODO: Check if Sim exists then close and message, otherwise create sim and add first tnt open that! + Simulator sim = SimulatorStorage.getSimulator(s); + if (sim != null) { + player.sendMessage("§cThe simulator " + s + " already exists"); + return; + } + sim = new Simulator(s); + SimulatorStorage.addSimulator(s, sim); + createElement(player, rayTraceResult, sim); }); anvilInv.open(); } @@ -373,6 +386,10 @@ public class SimulatorCursor implements Listener { } // 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) { diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java index a4b7b7e6..0dca6740 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java @@ -21,11 +21,14 @@ package de.steamwar.bausystem.features.simulator2; import de.steamwar.bausystem.SWUtils; import de.steamwar.bausystem.features.simulator2.data.Simulator; +import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorPageGui; import de.steamwar.bausystem.utils.ItemUtils; +import de.steamwar.inventory.SWItem; import org.bukkit.NamespacedKey; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -51,7 +54,32 @@ public class SimulatorStorage { return simulatorMap.computeIfAbsent(selection, SimulatorStorage::loadSimulator); } + public static Simulator getSimulator(String name) { + return simulatorMap.computeIfAbsent(name, SimulatorStorage::loadSimulator); + } + + public static void addSimulator(String name, Simulator simulator) { + simulatorMap.putIfAbsent(name, simulator); + } + private static Simulator loadSimulator(String name) { return SimulatorTestCommand.SIMULATOR; // TODO: Implement Loading and legacy Loading } + + public static void openSimulatorSelector(Player player) { + SimulatorPageGui simulatorPageGui = new SimulatorPageGui(player, null, 6*9, new ArrayList<>(simulatorMap.values())) { + @Override + public String baseTitle() { + return "Simulators"; + } + + @Override + public SWItem convert(Simulator simulator) { + return simulator.toItem(player, clickType -> { + System.out.println(clickType); + }); + } + }; + simulatorPageGui.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 index dc239c0d..470f9f12 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java @@ -40,6 +40,7 @@ import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.util.Vector; import java.util.*; +import java.util.stream.Collectors; @UtilityClass public class SimulatorWatcher { @@ -56,7 +57,7 @@ public class SimulatorWatcher { } } - public void update(Simulator simulator) { + public synchronized void update(Simulator simulator) { REntityServer rEntityServer = entityServers.get(simulator); if (rEntityServer != null) { rEntityServer.getEntities().forEach(REntity::die); @@ -85,19 +86,23 @@ public class SimulatorWatcher { return null; } Map>> positionCache = new HashMap<>(); - simulator.getElements().stream().map(SimulatorGroup::getElements).flatMap(List::stream).forEach(simulatorElement -> { - boolean wasNotPresent = positionCache.computeIfAbsent(simulatorElement.getPosition(), __ -> new HashSet<>()) - .add(simulatorElement.getClass()); + simulator.getElements().stream().map(group -> group.getElements().stream().map(element -> new Pair<>(group, element)).collect(Collectors.toList())).flatMap(List::stream).forEach(pair -> { + SimulatorGroup group = pair.getKey(); + // TODO: Disabled material + SimulatorElement element = pair.getValue(); + + boolean wasNotPresent = positionCache.computeIfAbsent(element.getPosition(), __ -> new HashSet<>()) + .add(element.getClass()); if (!wasNotPresent) return; - Material material = simulatorElement.getWorldMaterial(); - Location location = simulatorElement.getWorldPos().toLocation(WORLD); + Material material = element.getWorldMaterial(); + Location location = element.getWorldPos().toLocation(WORLD); RFallingBlockEntity rFallingBlockEntity = new RFallingBlockEntity(server, location, material); rFallingBlockEntity.setNoGravity(true); }); return server; } - public void show(Simulator sim, Player player) { + public synchronized void show(Simulator sim, Player player) { entityServers.forEach((simulator, rEntityServer) -> { if (rEntityServer == null) return; if (rEntityServer.getPlayers().contains(player) && sim != simulator) { @@ -108,7 +113,7 @@ public class SimulatorWatcher { entityServers.computeIfAbsent(sim, __ -> createSim(new REntityServer(), sim)).addPlayer(player); } - List getEntitiesOfSimulator(Simulator simulator) { + synchronized List getEntitiesOfSimulator(Simulator simulator) { REntityServer entityServer = entityServers.get(simulator); if (entityServer == null) { return Collections.emptyList(); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java index cd269703..df2e06e2 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java @@ -55,7 +55,9 @@ public class RedstonePhase extends SimulatorPhase { Block block = world.getBlockAt(position.getBlockX(), position.getBlockY(), position.getBlockZ()); previousBlockState.set(block.getState()); block.setType(Material.REDSTONE_BLOCK); - previousBlockState.get().update(true, true); + if (lifetime == 0) { + previousBlockState.get().update(true, true); + } } }); From 61f7218fc09748e15779f1436ef3d27896db3c1d Mon Sep 17 00:00:00 2001 From: yoyosource Date: Wed, 25 Oct 2023 23:03:59 +0200 Subject: [PATCH 32/48] Add some QOL Simulator changes --- .../features/simulator2/SimulatorCursor.java | 30 ++++++++++------- .../features/simulator2/SimulatorStorage.java | 23 ++++++++++++- .../simulator2/SimulatorTestCommand.java | 10 ------ .../features/simulator2/SimulatorWatcher.java | 3 +- .../simulator2/data/SimulatorElement.java | 2 ++ .../data/redstone/RedstoneElement.java | 5 +++ .../simulator2/data/tnt/TNTElement.java | 5 +++ .../simulator2/gui/SimulatorGroupGui.java | 32 ++++++++++++++----- .../simulator2/gui/SimulatorRedstoneGui.java | 6 ++-- .../simulator2/gui/SimulatorTNTGui.java | 2 +- .../simulator2/gui/base/SimulatorPageGui.java | 2 +- 11 files changed, 83 insertions(+), 37 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java index 3f443d26..2b1f2f87 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java @@ -59,10 +59,7 @@ import org.bukkit.event.player.*; import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.BiFunction; import java.util.function.Function; import java.util.stream.Collectors; @@ -279,7 +276,11 @@ public class SimulatorCursor implements Listener { } pos.setX(pos.getBlockX() + 0.5); - pos.setY(pos.getBlockY()); + 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; } @@ -374,12 +375,19 @@ public class SimulatorCursor implements Listener { element.open(player, simulator, group1, back); break; default: - // Open multi element present in Simulator - SimulatorGroup group2 = new SimulatorGroup(); - group2.setMaterial(null); - group2.getElements().addAll(elements); - SimulatorGui simulatorGui = new SimulatorGui(player, simulator); - new SimulatorGroupGui(player, simulator, group2, simulatorGui).open(); + 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; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java index 0dca6740..c81b55f2 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java @@ -19,6 +19,7 @@ package de.steamwar.bausystem.features.simulator2; +import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.SWUtils; import de.steamwar.bausystem.features.simulator2.data.Simulator; import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorPageGui; @@ -27,6 +28,7 @@ import de.steamwar.inventory.SWItem; import org.bukkit.NamespacedKey; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import java.util.ArrayList; import java.util.HashMap; @@ -76,7 +78,26 @@ public class SimulatorStorage { @Override public SWItem convert(Simulator simulator) { return simulator.toItem(player, clickType -> { - System.out.println(clickType); + ItemStack mainHand = player.getInventory().getItemInMainHand(); + ItemStack offHand = player.getInventory().getItemInOffHand(); + ItemStack itemStack; + if (SimulatorCursor.isSimulatorItem(mainHand)) { + itemStack = mainHand; + } else if (SimulatorCursor.isSimulatorItem(offHand)) { + itemStack = offHand; + } else { + itemStack = null; + } + if (itemStack == null) { + return; + } + + // TODO: Dynamic Item Lore, and remove if simulator does not exist anymore (On Join for every Player Inventory Slot with Simulator...) + ItemUtils.setTag(itemStack, simulatorSelection, simulator.getName()); + ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.setDisplayName(BauSystem.MESSAGE.parse("SIMULATOR_WAND_NAME_SELECTED", player, simulator.getName())); + itemStack.setItemMeta(itemMeta); + player.closeInventory(); }); } }; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java index be44ee99..b3f668cb 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java @@ -50,14 +50,4 @@ public class SimulatorTestCommand extends SWCommand { SimulatorGroup group3 = new SimulatorGroup().add(new RedstoneElement(new Vector(-484, 47, 307)).add(new RedstonePhase())); SIMULATOR.getElements().add(group3); } - - @Register("open") - public void openCommand(Player player) { - new SimulatorGui(player, SIMULATOR).open(); - } - - @Register("run") - public void runCommand(Player player) { - SimulatorExecutor.run(SIMULATOR); - } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java index 470f9f12..eb888615 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java @@ -88,13 +88,12 @@ public class SimulatorWatcher { Map>> positionCache = new HashMap<>(); simulator.getElements().stream().map(group -> group.getElements().stream().map(element -> new Pair<>(group, element)).collect(Collectors.toList())).flatMap(List::stream).forEach(pair -> { SimulatorGroup group = pair.getKey(); - // TODO: Disabled material SimulatorElement element = pair.getValue(); boolean wasNotPresent = positionCache.computeIfAbsent(element.getPosition(), __ -> new HashSet<>()) .add(element.getClass()); if (!wasNotPresent) return; - Material material = element.getWorldMaterial(); + 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); 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 b3c2b934..e01ef88c 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 @@ -79,6 +79,8 @@ public abstract class SimulatorElement { public abstract Material getWorldMaterial(); + public abstract Material getWorldDisabledMaterial(); + public Vector getWorldPos() { return position; } 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 158dfef4..4ba337a8 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 @@ -44,6 +44,11 @@ public class RedstoneElement extends SimulatorElement { return Material.REDSTONE_BLOCK; } + @Override + public Material getWorldDisabledMaterial() { + return Material.WHITE_STAINED_GLASS; + } + @Override public Vector getWorldPos() { return position.clone().add(new Vector(0.5, 0, 0.5)); 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 2a3037e0..62982a22 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 @@ -82,6 +82,11 @@ public class TNTElement extends SimulatorElement { return Material.TNT; } + @Override + public Material getWorldDisabledMaterial() { + return Material.RED_STAINED_GLASS; + } + @Override public void open(Player player, Simulator simulator, SimulatorGroup group, SimulatorBaseGui back) { new SimulatorTNTGui(player, simulator, this, group, back).open(); 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 index 4360bcef..33d87d76 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java @@ -31,9 +31,12 @@ import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; +import java.util.List; +import java.util.stream.Collectors; + public class SimulatorGroupGui extends SimulatorPageGui> { - private final SimulatorGroup simulatorGroup; + private SimulatorGroup simulatorGroup; private final SimulatorBaseGui back; public SimulatorGroupGui(Player player, Simulator simulator, SimulatorGroup simulatorGroup, SimulatorBaseGui back) { @@ -49,6 +52,14 @@ public class SimulatorGroupGui extends SimulatorPageGui> { @Override public void headerAndFooter() { + if (simulatorGroup.getMaterial() == null) { + List parents = data.stream().map(e -> e.getGroup(simulator)).distinct().collect(Collectors.toList()); + if (parents.size() == 1) { + simulatorGroup = parents.get(0); + data = simulatorGroup.getElements(); + } + } + if (simulatorGroup.getElements().removeIf(element -> element.getPhases().isEmpty())) { SimulatorWatcher.update(simulator); } @@ -69,15 +80,20 @@ public class SimulatorGroupGui extends SimulatorPageGui> { }, clickType -> { })); - inventory.setItem(simulatorGroup.getMaterial() != null ? 48 : 49, new SWItem(Material.REPEATER, "§eSettings", clickType -> { + inventory.setItem(48, new SWItem(Material.REPEATER, "§eSettings", clickType -> { new SimulatorGroupSettingsGui(player, simulator, simulatorGroup, this).open(); })); - if (simulatorGroup.getMaterial() != null) { - 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); - })); - } + 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); + })); } @Override 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 index 81c58b4e..bc2b36c5 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java @@ -85,14 +85,14 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { new SimulatorMaterialGui(player, simulator, redstone::getMaterial, redstone::setMaterial, this).open(); })); - //Settings + // Settings inventory.setItem(48, new SWItem(Material.REPEATER, "§eSettings", clickType -> { new SimulatorRedstoneSettingsGui(player, simulator, redstone, this).open(); })); - //Group chooser + // Group chooser inventory.setItem(49, new SWItem(Material.LEAD, "§eMove", clickType -> { - new SimulatorGroupChooserGui(player, simulator, redstone, parent, this).open(); + new SimulatorGroupChooserGui(player, simulator, redstone, redstone.getGroup(simulator), this).open(); })); //Enable/Disable 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 index c046a756..f4c80ebe 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java @@ -89,7 +89,7 @@ public class SimulatorTNTGui extends SimulatorScrollGui { new SimulatorTNTSettingsGui(player, simulator, tnt, this).open(); })); inventory.setItem(49, new SWItem(Material.LEAD, "§eMove", clickType -> { - new SimulatorGroupChooserGui(player, simulator, tnt, parent, this).open(); + new SimulatorGroupChooserGui(player, simulator, tnt, tnt.getGroup(simulator), this).open(); })); inventory.setItem(50, new SWItem(tnt.isDisabled() ? Material.ENDER_PEARL : Material.ENDER_EYE, tnt.isDisabled() ? "§cDisabled" : "§aEnabled", clickType -> { tnt.setDisabled(!tnt.isDisabled()); 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 index 42eb1e17..14c2d786 100644 --- 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 @@ -29,7 +29,7 @@ import java.util.List; public abstract class SimulatorPageGui extends SimulatorBaseGui { protected int page = 0; - protected final List data; + protected List data; protected SimulatorPageGui(Player player, Simulator simulator, int size, List data) { super(player, simulator, size); From 61d1f0bd4552257aaf0c89e4d668c3b6076b0a76 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Thu, 26 Oct 2023 18:07:25 +0200 Subject: [PATCH 33/48] Add loading and saving methods and fix many QOL things --- .../features/simulator2/SimulatorCursor.java | 8 +- .../features/simulator2/SimulatorStorage.java | 48 ++++--- .../features/simulator2/data/Simulator.java | 7 +- .../simulator2/data/SimulatorElement.java | 9 +- .../simulator2/data/SimulatorGroup.java | 4 +- .../simulator2/data/SimulatorPhase.java | 3 + .../data/redstone/RedstoneElement.java | 9 +- .../data/redstone/RedstonePhase.java | 3 +- .../simulator2/data/tnt/TNTElement.java | 10 +- .../simulator2/data/tnt/TNTPhase.java | 19 ++- .../gui/SimulatorGroupChooserGui.java | 8 ++ .../simulator2/gui/SimulatorGroupGui.java | 2 - .../simulator2/gui/base/SimulatorBaseGui.java | 5 +- .../storage/SimFormatSimulatorLoader.java | 130 +++++++++++++++++ .../SimulatorFormatSimulatorLoader.java | 136 ++++++++++++++++++ .../simulator2/storage/SimulatorLoader.java | 31 ++++ .../simulator2/storage/SimulatorSaver.java | 81 +++++++++++ .../storage/YAPIONFormatSimulatorLoader.java | 90 ++++++++++++ 18 files changed, 564 insertions(+), 39 deletions(-) create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimFormatSimulatorLoader.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorFormatSimulatorLoader.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorLoader.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorSaver.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/YAPIONFormatSimulatorLoader.java diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java index 2b1f2f87..90feb161 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java @@ -34,14 +34,12 @@ import de.steamwar.bausystem.features.simulator2.execute.SimulatorExecutor; import de.steamwar.bausystem.features.simulator2.gui.SimulatorGroupGui; import de.steamwar.bausystem.features.simulator2.gui.SimulatorGui; import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui; -import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorPageGui; 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.inventory.SWItem; import de.steamwar.linkage.Linked; import lombok.AllArgsConstructor; import lombok.Getter; @@ -59,7 +57,10 @@ import org.bukkit.event.player.*; import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; -import java.util.*; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.function.BiFunction; import java.util.function.Function; import java.util.stream.Collectors; @@ -343,6 +344,7 @@ public class SimulatorCursor implements Listener { sim = new Simulator(s); SimulatorStorage.addSimulator(s, sim); createElement(player, rayTraceResult, sim); + SimulatorStorage.setSimulator(player, sim); }); anvilInv.open(); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java index c81b55f2..8c49a66a 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java @@ -22,6 +22,7 @@ package de.steamwar.bausystem.features.simulator2; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.SWUtils; 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.bausystem.utils.ItemUtils; import de.steamwar.inventory.SWItem; @@ -53,11 +54,11 @@ public class SimulatorStorage { if (selection == null) { return null; } - return simulatorMap.computeIfAbsent(selection, SimulatorStorage::loadSimulator); + return simulatorMap.get(selection); } public static Simulator getSimulator(String name) { - return simulatorMap.computeIfAbsent(name, SimulatorStorage::loadSimulator); + return simulatorMap.get(name); } public static void addSimulator(String name, Simulator simulator) { @@ -69,7 +70,7 @@ public class SimulatorStorage { } public static void openSimulatorSelector(Player player) { - SimulatorPageGui simulatorPageGui = new SimulatorPageGui(player, null, 6*9, new ArrayList<>(simulatorMap.values())) { + SimulatorPageGui simulatorPageGui = new SimulatorPageGui(player, null, 6 * 9, new ArrayList<>(simulatorMap.values())) { @Override public String baseTitle() { return "Simulators"; @@ -78,29 +79,32 @@ public class SimulatorStorage { @Override public SWItem convert(Simulator simulator) { return simulator.toItem(player, clickType -> { - ItemStack mainHand = player.getInventory().getItemInMainHand(); - ItemStack offHand = player.getInventory().getItemInOffHand(); - ItemStack itemStack; - if (SimulatorCursor.isSimulatorItem(mainHand)) { - itemStack = mainHand; - } else if (SimulatorCursor.isSimulatorItem(offHand)) { - itemStack = offHand; - } else { - itemStack = null; - } - if (itemStack == null) { - return; - } - - // TODO: Dynamic Item Lore, and remove if simulator does not exist anymore (On Join for every Player Inventory Slot with Simulator...) - ItemUtils.setTag(itemStack, simulatorSelection, simulator.getName()); - ItemMeta itemMeta = itemStack.getItemMeta(); - itemMeta.setDisplayName(BauSystem.MESSAGE.parse("SIMULATOR_WAND_NAME_SELECTED", player, simulator.getName())); - itemStack.setItemMeta(itemMeta); + setSimulator(player, simulator); player.closeInventory(); }); } }; simulatorPageGui.open(); } + + public static void setSimulator(Player player, Simulator simulator) { + ItemStack mainHand = player.getInventory().getItemInMainHand(); + ItemStack offHand = player.getInventory().getItemInOffHand(); + ItemStack itemStack; + if (SimulatorCursor.isSimulatorItem(mainHand)) { + itemStack = mainHand; + } else if (SimulatorCursor.isSimulatorItem(offHand)) { + itemStack = offHand; + } else { + itemStack = null; + } + if (itemStack == null) { + return; + } + + ItemUtils.setTag(itemStack, simulatorSelection, simulator.getName()); + ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.setDisplayName(BauSystem.MESSAGE.parse("SIMULATOR_WAND_NAME_SELECTED", player, simulator.getName())); + itemStack.setItemMeta(itemMeta); + } } 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 73f0ab1d..b1f6c6f6 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 @@ -35,7 +35,7 @@ import java.util.Map; @Getter @Setter @RequiredArgsConstructor -public class Simulator { +public final class Simulator { private Material material = Material.BARREL; private final String name; private boolean autoTrace = false; @@ -56,4 +56,9 @@ public class Simulator { simulatorGroup.toSimulatorActions(actions); }); } + + public Simulator add(SimulatorGroup group) { + elements.add(group); + return this; + } } 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 e01ef88c..aeb99c42 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 @@ -28,6 +28,7 @@ import lombok.Setter; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.util.Vector; +import yapion.hierarchy.types.YAPIONObject; import java.util.ArrayList; import java.util.Comparator; @@ -56,7 +57,7 @@ public abstract class SimulatorElement { phases.sort(Comparator.comparingInt(SimulatorPhase::getTickOffset)); } - public abstract String getName(); + public abstract String getName(Player player); public int getBaseTick() { return phases.stream() @@ -97,7 +98,7 @@ public abstract class SimulatorElement { lore.add(""); lore.add("§cDisabled"); } - return new SWItem(material, "§e" + getName(), lore, disabled, invCallback); + return new SWItem(material, "§e" + getName(player), lore, disabled, invCallback); } public void toSimulatorActions(Map> actions) { @@ -115,4 +116,8 @@ public abstract class SimulatorElement { .findFirst() .orElse(null); } + + public abstract String getType(); + public void saveExtra(YAPIONObject elementObject) {} + public void loadExtra(YAPIONObject elementObject) {} } 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 4e643fda..a4b6d031 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 @@ -34,9 +34,9 @@ import java.util.Map; @Getter @Setter -public class SimulatorGroup { +public final class SimulatorGroup { private Material material = Material.CHEST; - protected boolean disabled = false; + private boolean disabled = false; private final List> elements = new ArrayList<>(); public SimulatorGroup add(SimulatorElement element) { diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java index d70acee5..09e174fd 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java @@ -23,6 +23,7 @@ import de.steamwar.bausystem.features.simulator2.execute.SimulatorAction; import lombok.Getter; import lombok.Setter; import org.bukkit.util.Vector; +import yapion.hierarchy.types.YAPIONObject; import java.util.List; import java.util.Map; @@ -37,4 +38,6 @@ public abstract class SimulatorPhase { protected int order = 0; public abstract void toSimulatorActions(Map> actions, Vector position); + public void saveExtra(YAPIONObject phaseObject) {} + public void loadExtra(YAPIONObject phaseObject) {} } 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 4ba337a8..4394f27f 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 @@ -28,14 +28,14 @@ import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.util.Vector; -public class RedstoneElement extends SimulatorElement { +public final class RedstoneElement extends SimulatorElement { public RedstoneElement(Vector position) { super(Material.REDSTONE_BLOCK, position); } @Override - public String getName() { + public String getName(Player player) { return "Redstone"; } @@ -58,4 +58,9 @@ public class RedstoneElement extends SimulatorElement { public void open(Player player, Simulator simulator, SimulatorGroup group, SimulatorBaseGui back) { new SimulatorRedstoneGui(player, simulator, group, this, back).open(); } + + @Override + public String getType() { + return "Redstone"; + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java index df2e06e2..0972c4ca 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java @@ -1,3 +1,4 @@ + /* * This file is a part of the SteamWar software. * @@ -34,7 +35,7 @@ import java.util.Map; import java.util.concurrent.atomic.AtomicReference; @NoArgsConstructor -public class RedstonePhase extends SimulatorPhase { +public final class RedstonePhase extends SimulatorPhase { public RedstonePhase(int tickOffset) { this.tickOffset = tickOffset; 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 62982a22..69b7c67f 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 @@ -30,14 +30,14 @@ import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.util.Vector; -public class TNTElement extends SimulatorElement { +public final class TNTElement extends SimulatorElement { public TNTElement(Vector position) { super(Material.TNT, position); } @Override - public String getName() { + public String getName(Player player) { return "TNT"; } @@ -74,6 +74,7 @@ public class TNTElement extends SimulatorElement { long sum = phases.stream().mapToInt(TNTPhase::getCount).sum(); SWItem swItem = super.toItem(player, invCallback); swItem.getItemStack().setAmount((int) Math.min(64, Math.max(1, sum))); + swItem.setName("§e" + getName(player) + "§8:§7 " + sum); return swItem; } @@ -91,4 +92,9 @@ public class TNTElement extends SimulatorElement { public void open(Player player, Simulator simulator, SimulatorGroup group, SimulatorBaseGui back) { new SimulatorTNTGui(player, simulator, this, group, back).open(); } + + @Override + public String getType() { + return "TNT"; + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTPhase.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTPhase.java index 36c2d2f6..7becfec9 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTPhase.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTPhase.java @@ -27,6 +27,7 @@ import lombok.Setter; import org.bukkit.World; import org.bukkit.entity.TNTPrimed; import org.bukkit.util.Vector; +import yapion.hierarchy.types.YAPIONObject; import java.util.ArrayList; import java.util.List; @@ -35,7 +36,7 @@ import java.util.Map; @Getter @Setter @NoArgsConstructor -public class TNTPhase extends SimulatorPhase { +public final class TNTPhase extends SimulatorPhase { private int count = 1; private boolean xJump = false; private boolean yJump = false; @@ -68,4 +69,20 @@ public class TNTPhase extends SimulatorPhase { } }); } + + @Override + public void saveExtra(YAPIONObject phaseObject) { + phaseObject.add("count", count); + phaseObject.add("xJump", xJump); + phaseObject.add("yJump", yJump); + phaseObject.add("zJump", zJump); + } + + @Override + public void loadExtra(YAPIONObject phaseObject) { + count = phaseObject.getPlainValue("count"); + xJump = phaseObject.getPlainValue("xJump"); + yJump = phaseObject.getPlainValue("yJump"); + zJump = phaseObject.getPlainValue("zJump"); + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupChooserGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupChooserGui.java index 503feb86..f71e7f4c 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupChooserGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupChooserGui.java @@ -57,6 +57,10 @@ public class SimulatorGroupChooserGui extends SimulatorPageGui { parent.getElements().remove(subject); back.open(); SimulatorWatcher.update(simulator); + if (parent.getElements().size() == 1) { + parent.setDisabled(false); + parent.setMaterial(Material.BARREL); + } })); } } @@ -71,6 +75,10 @@ public class SimulatorGroupChooserGui extends SimulatorPageGui { InvCallback invCallback = clickType -> { simulatorGroup.add(subject); parent.getElements().remove(subject); + if (parent.getElements().size() == 1) { + parent.setDisabled(false); + parent.setMaterial(Material.BARREL); + } back.open(); SimulatorWatcher.update(simulator); }; 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 index 33d87d76..7fe8e6b4 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java @@ -23,8 +23,6 @@ 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.inventory.SWItem; 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 index b15ba629..326425de 100644 --- 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 @@ -49,7 +49,10 @@ public abstract class SimulatorBaseGui { String originalTitle = player.getOpenInventory().getTitle(); if (inv != null && (Core.getVersion() > 19 || newTitle.equals(originalTitle))) { - inv.clear(); + // TODO: Flickering is better but not gone! + for (int i = 9; i < size - 9; i++) { + inv.setItem(i, null); + } setup(); if (player.getOpenInventory().getTopInventory() != inv) { inventory.open(); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimFormatSimulatorLoader.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimFormatSimulatorLoader.java new file mode 100644 index 00000000..4082850f --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimFormatSimulatorLoader.java @@ -0,0 +1,130 @@ +/* + * 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.storage; + +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.SimulatorPhase; +import de.steamwar.bausystem.features.simulator2.data.redstone.RedstoneElement; +import de.steamwar.bausystem.features.simulator2.data.redstone.RedstonePhase; +import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement; +import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase; +import org.bukkit.Material; +import org.bukkit.util.Vector; +import yapion.exceptions.YAPIONException; +import yapion.hierarchy.types.YAPIONArray; +import yapion.hierarchy.types.YAPIONObject; +import yapion.parser.YAPIONParser; + +import java.io.File; +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +public class SimFormatSimulatorLoader implements SimulatorLoader { + + @Override + public Optional> load(File file) { + if (!file.getName().endsWith(".sim")) { + return Optional.empty(); + } + + YAPIONObject yapionObject; + try { + yapionObject = YAPIONParser.parse(file); + } catch (YAPIONException | IOException e) { + return Optional.empty(); + } + + String name = file.getName().substring(0, file.getName().length() - ".sim".length()); + + Simulator simulator = new Simulator(name); + loadSimulator(yapionObject, simulator); + return Optional.of(Collections.singletonList(simulator)); + } + + private void loadSimulator(YAPIONObject simulatorObject, Simulator simulator) { + simulator.setMaterial(Material.valueOf(simulatorObject.getPlainValue("material"))); + simulator.setAutoTrace(simulatorObject.getPlainValue("autoTrace")); + + YAPIONArray groups = simulatorObject.getArray("groups"); + groups.streamObject().forEach(groupObject -> { + SimulatorGroup simulatorGroup = new SimulatorGroup(); + loadGroup(groupObject, simulatorGroup); + simulator.add(simulatorGroup); + }); + } + + private void loadGroup(YAPIONObject groupObject, SimulatorGroup group) { + group.setMaterial(Material.valueOf(groupObject.getPlainValue("material"))); + group.setDisabled(groupObject.getPlainValue("disabled")); + + YAPIONArray elements = groupObject.getArray("elements"); + elements.streamObject().forEach(elementObject -> { + SimulatorElement element; + Supplier phaseConstructor; + Vector position = new Vector(groupObject.getDouble("x"), groupObject.getDouble("y"), groupObject.getDouble("z")); + String type = groupObject.getPlainValue("type"); + switch (type) { + case "TNT": + element = new TNTElement(position); + phaseConstructor = TNTPhase::new; + break; + case "Redstone": + element = new RedstoneElement(position); + phaseConstructor = RedstonePhase::new; + break; + default: + element = null; + phaseConstructor = null; + break; + } + if (element == null) { + return; + } + loadElement(elementObject, element, phaseConstructor); + group.add(element); + }); + } + + private void loadElement(YAPIONObject elementObject, SimulatorElement element, Supplier phaseConstructor) { + element.setMaterial(Material.valueOf(elementObject.getPlainValue("material"))); + element.setDisabled(elementObject.getPlainValue("disabled")); + element.loadExtra(elementObject); + + YAPIONArray phases = elementObject.getArray("phases"); + phases.streamObject().forEach(phaseObject -> { + SimulatorPhase phase = phaseConstructor.get(); + loadPhase(phaseObject, phase); + ((SimulatorElement) element).add(phase); + }); + } + + private void loadPhase(YAPIONObject phaseObject, SimulatorPhase phase) { + phase.setTickOffset(phaseObject.getPlainValue("tickOffset")); + phase.setLifetime(phaseObject.getPlainValue("lifetime")); + phase.setOrder(phaseObject.getPlainValue("order")); + phase.loadExtra(phaseObject); + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorFormatSimulatorLoader.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorFormatSimulatorLoader.java new file mode 100644 index 00000000..86bc406e --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorFormatSimulatorLoader.java @@ -0,0 +1,136 @@ +/* + * 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.storage; + +import de.steamwar.bausystem.features.simulator2.data.Simulator; +import de.steamwar.bausystem.features.simulator2.data.SimulatorGroup; +import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement; +import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase; +import org.bukkit.Material; +import org.bukkit.util.Vector; +import yapion.exceptions.YAPIONException; +import yapion.hierarchy.types.YAPIONArray; +import yapion.hierarchy.types.YAPIONObject; +import yapion.parser.YAPIONParser; + +import java.io.File; +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +public class SimulatorFormatSimulatorLoader implements SimulatorLoader { + + @Override + public Optional> load(File file) { + if (!file.getName().endsWith(".simulator")) { + return Optional.empty(); + } + + YAPIONObject yapionObject; + try { + yapionObject = YAPIONParser.parse(file); + } catch (YAPIONException | IOException e) { + return Optional.empty(); + } + + String name = file.getName().substring(0, file.getName().length() - ".simulator".length()); + + Simulator simulator = new Simulator(name); + simulator.setMaterial(Material.valueOf(yapionObject.getStringOrDefault("material", "BARREL"))); + + YAPIONArray tntElements = yapionObject.getArrayOrDefault("tntElements", new YAPIONArray()); + for (YAPIONObject element : tntElements.streamObject().collect(Collectors.toList())) { + if (element.containsKey("elements")) { + simulator.add(loadGroup(element)); + } else { + simulator.add(loadElement(element)); + } + } + + file.delete(); + return Optional.of(Collections.singletonList(simulator)); + } + + private SimulatorGroup loadGroup(YAPIONObject element) { + double x = element.getDoubleOrDefault("x", 0); + double y = element.getDoubleOrDefault("y", 0); + double z = element.getDoubleOrDefault("z", 0); + int tickOffset = element.getIntOrDefault("tickOffset", 0); + + SimulatorGroup simulatorGroup = new SimulatorGroup(); + simulatorGroup.setDisabled(element.getBooleanOrDefault("disabled", false)); + + YAPIONArray elements = element.getArrayOrDefault("elements", new YAPIONArray()); + for (YAPIONObject e : elements.streamObject().collect(Collectors.toList())) { + simulatorGroup.add(loadElement(e, x, y, z, tickOffset)); + } + + return simulatorGroup; + } + + private TNTElement loadElement(YAPIONObject element, double dx, double dy, double dz, int dTickOffset) { + TNTElement tntElement = new TNTElement(new Vector(element.getDouble("x") + dx, element.getDouble("y") + dy, element.getDouble("z") + dz)); + tntElement.setDisabled(element.getBooleanOrDefault("disabled", false)); + tntElement.setMaterial(Material.valueOf(element.getStringOrDefault("material", "TNT"))); + + TNTPhase tntPhase = loadPhase(element); + tntPhase.setTickOffset(tntPhase.getTickOffset() + dTickOffset); + tntElement.add(tntPhase); + + return tntElement; + } + + private SimulatorGroup loadElement(YAPIONObject element) { + SimulatorGroup simulatorGroup = new SimulatorGroup(); + + TNTElement tntElement = new TNTElement(new Vector(element.getDouble("x"), element.getDouble("y"), element.getDouble("z"))); + tntElement.setDisabled(element.getBooleanOrDefault("disabled", false)); + tntElement.setMaterial(Material.valueOf(element.getStringOrDefault("material", "TNT"))); + simulatorGroup.add(tntElement); + + tntElement.add(loadPhase(element)); + + return simulatorGroup; + } + + private TNTPhase loadPhase(YAPIONObject element) { + TNTPhase tntPhase = new TNTPhase(); + tntPhase.setLifetime(element.getIntOrDefault("fuseTicks", 80)); + tntPhase.setCount(element.getIntOrDefault("count", 1)); + tntPhase.setTickOffset(element.getIntOrDefault("tickOffset", 0)); + tntPhase.setXJump(element.getBooleanOrDefault("xVelocity", false)); + tntPhase.setYJump(element.getBooleanOrDefault("yVelocity", false)); + tntPhase.setZJump(element.getBooleanOrDefault("zVelocity", false)); + switch (element.getStringOrDefault("order", "REPEATER")) { + case "REPEATER": + tntPhase.setOrder(0); + break; + case "OBSERVER": + tntPhase.setOrder(1); + break; + case "COMPARATOR": + tntPhase.setOrder(2); + break; + } + return tntPhase; + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorLoader.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorLoader.java new file mode 100644 index 00000000..70659936 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorLoader.java @@ -0,0 +1,31 @@ +/* + * 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.storage; + +import de.steamwar.bausystem.features.simulator2.data.Simulator; + +import java.io.File; +import java.util.List; +import java.util.Optional; + +public interface SimulatorLoader { + + Optional> load(File file); +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorSaver.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorSaver.java new file mode 100644 index 00000000..bb19c48d --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorSaver.java @@ -0,0 +1,81 @@ +/* + * 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.storage; + +import de.steamwar.bausystem.features.simulator2.data.Simulator; +import lombok.experimental.UtilityClass; +import yapion.hierarchy.output.FileOutput; +import yapion.hierarchy.types.YAPIONArray; +import yapion.hierarchy.types.YAPIONObject; + +import java.io.File; +import java.io.IOException; + +@UtilityClass +public class SimulatorSaver { + + public void saveSimulator(File directory, Simulator simulator) { + YAPIONObject simulatorObject = new YAPIONObject(); + simulatorObject.add("material", simulator.getMaterial().name()); + simulatorObject.add("autoTrace", simulator.isAutoTrace()); + + YAPIONArray groups = new YAPIONArray(); + simulator.getElements().forEach(group -> { + YAPIONObject groupObject = new YAPIONObject(); + groupObject.add("material", group.getMaterial().name()); + groupObject.add("disabled", group.isDisabled()); + groups.add(groupObject); + + YAPIONArray elements = new YAPIONArray(); + group.getElements().forEach(element -> { + YAPIONObject elementObject = new YAPIONObject(); + elementObject.add("type", element.getType()); + elementObject.add("material", element.getMaterial()); + elementObject.add("disabled", element.isDisabled()); + elementObject.add("x", element.getPosition().getX()); + elementObject.add("y", element.getPosition().getY()); + elementObject.add("z", element.getPosition().getZ()); + element.saveExtra(elementObject); + + YAPIONArray phases = new YAPIONArray(); + element.getPhases().forEach(phase -> { + YAPIONObject phaseObject = new YAPIONObject(); + phaseObject.add("tickOffset", phase.getTickOffset()); + phaseObject.add("lifetime", phase.getLifetime()); + phaseObject.add("order", phase.getOrder()); + phase.saveExtra(phaseObject); + phases.add(phaseObject); + }); + elementObject.add("phases", phases); + elements.add(elementObject); + }); + groupObject.add("elements", elements); + groups.add(groupObject); + }); + simulatorObject.add("groups", groups); + + File file = new File(directory, simulator.getName() + ".sim"); + try { + simulatorObject.toJSON(new FileOutput(file)).close(); + } catch (IOException e) { + // Ignore + } + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/YAPIONFormatSimulatorLoader.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/YAPIONFormatSimulatorLoader.java new file mode 100644 index 00000000..6434fcc0 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/YAPIONFormatSimulatorLoader.java @@ -0,0 +1,90 @@ +/* + * 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.storage; + +import de.steamwar.bausystem.features.simulator2.data.Simulator; +import de.steamwar.bausystem.features.simulator2.data.SimulatorGroup; +import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement; +import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase; +import de.steamwar.sql.SteamwarUser; +import org.bukkit.Material; +import org.bukkit.util.Vector; +import yapion.exceptions.YAPIONException; +import yapion.hierarchy.types.YAPIONArray; +import yapion.hierarchy.types.YAPIONObject; +import yapion.parser.YAPIONParser; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +public class YAPIONFormatSimulatorLoader implements SimulatorLoader { + + @Override + public Optional> load(File file) { + if (!file.getName().endsWith(".yapion")) { + return Optional.empty(); + } + + YAPIONObject yapionObject; + try { + yapionObject = YAPIONParser.parse(file); + } catch (YAPIONException | IOException e) { + return Optional.empty(); + } + + String name = file.getName().substring(0, file.getName().length() - 7); + SteamwarUser steamwarUser = SteamwarUser.get(Integer.parseInt(name)); + + List simulators = new ArrayList<>(); + for (String s : yapionObject.getKeys()) { + String newName = steamwarUser.getUserName() + (s.isEmpty() ? "" : "_" + s); + YAPIONArray content = yapionObject.getArray(s); + if (content.isEmpty()) continue; + Simulator simulator = new Simulator(newName); + for (YAPIONObject element : content.streamObject().collect(Collectors.toList())) { + SimulatorGroup simulatorGroup = new SimulatorGroup(); + simulator.add(simulatorGroup); + + TNTElement tntElement = new TNTElement(new Vector(element.getDouble("positionX"), element.getDouble("positionY"), element.getDouble("positionZ"))); + tntElement.setDisabled(element.getBooleanOrDefault("disabled", false)); // IDK if this existed back then? + tntElement.setMaterial(Material.valueOf(element.getStringOrDefault("material", "TNT"))); + simulatorGroup.add(tntElement); + + TNTPhase tntPhase = new TNTPhase(); + tntPhase.setLifetime(element.getIntOrDefault("fuseTicks", 80)); + tntPhase.setCount(element.getIntOrDefault("count", 1)); + tntPhase.setTickOffset(element.getIntOrDefault("tickOffset", 0)); + tntPhase.setXJump(element.getBooleanOrDefault("xVelocity", false)); + tntPhase.setYJump(element.getBooleanOrDefault("yVelocity", false)); + tntPhase.setZJump(element.getBooleanOrDefault("zVelocity", false)); + tntPhase.setOrder(element.getBooleanOrDefault("comparator", false) ? 2 : 0); + tntElement.add(tntPhase); + } + simulators.add(simulator); + } + + file.delete(); + return Optional.of(simulators); + } +} From b49c75d6bd6520394fc2dae00c2fa9920c174cf6 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Thu, 26 Oct 2023 22:31:30 +0200 Subject: [PATCH 34/48] Add storage api and implement SimulatorStorage --- BauSystem_15/build.gradle | 4 +- BauSystem_18/build.gradle | 4 +- BauSystem_19/build.gradle | 4 +- BauSystem_20/build.gradle | 4 +- BauSystem_Linkage/build.gradle | 4 +- BauSystem_Main/build.gradle | 4 +- .../features/simulator/SimulatorStorage.java | 2 +- .../features/simulator2/SimulatorStorage.java | 66 +++++++++++++++++-- .../features/simulator2/SimulatorWatcher.java | 2 + .../SimulatorFormatSimulatorLoader.java | 2 +- .../simulator2/storage/SimulatorSaver.java | 5 +- 11 files changed, 77 insertions(+), 24 deletions(-) diff --git a/BauSystem_15/build.gradle b/BauSystem_15/build.gradle index 87ae1928..180c7022 100644 --- a/BauSystem_15/build.gradle +++ b/BauSystem_15/build.gradle @@ -27,8 +27,8 @@ version '1.0' compileJava.options.encoding = 'UTF-8' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 sourceSets { main { diff --git a/BauSystem_18/build.gradle b/BauSystem_18/build.gradle index 8deb57fd..8fb54099 100644 --- a/BauSystem_18/build.gradle +++ b/BauSystem_18/build.gradle @@ -27,8 +27,8 @@ version '1.0' compileJava.options.encoding = 'UTF-8' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 sourceSets { main { diff --git a/BauSystem_19/build.gradle b/BauSystem_19/build.gradle index fb86e3ac..e7be349d 100644 --- a/BauSystem_19/build.gradle +++ b/BauSystem_19/build.gradle @@ -27,8 +27,8 @@ version '1.0' compileJava.options.encoding = 'UTF-8' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 sourceSets { main { diff --git a/BauSystem_20/build.gradle b/BauSystem_20/build.gradle index bfb7c724..be167e64 100644 --- a/BauSystem_20/build.gradle +++ b/BauSystem_20/build.gradle @@ -27,8 +27,8 @@ version '1.0' compileJava.options.encoding = 'UTF-8' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 sourceSets { main { diff --git a/BauSystem_Linkage/build.gradle b/BauSystem_Linkage/build.gradle index 2169557f..de3818a5 100644 --- a/BauSystem_Linkage/build.gradle +++ b/BauSystem_Linkage/build.gradle @@ -27,8 +27,8 @@ version '1.0' compileJava.options.encoding = 'UTF-8' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 sourceSets { main { diff --git a/BauSystem_Main/build.gradle b/BauSystem_Main/build.gradle index 62d604cf..bf61d861 100644 --- a/BauSystem_Main/build.gradle +++ b/BauSystem_Main/build.gradle @@ -27,8 +27,8 @@ version '1.0' compileJava.options.encoding = 'UTF-8' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 sourceSets { main { diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java index a549e0a2..5103136a 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java @@ -48,7 +48,7 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -@Linked +// @Linked public class SimulatorStorage implements Enable, Disable { public static final World WORLD = Bukkit.getWorlds().get(0); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java index 8c49a66a..7bae9ba9 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java @@ -22,21 +22,28 @@ package de.steamwar.bausystem.features.simulator2; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.SWUtils; 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.bausystem.features.simulator2.storage.SimFormatSimulatorLoader; +import de.steamwar.bausystem.features.simulator2.storage.SimulatorFormatSimulatorLoader; +import de.steamwar.bausystem.features.simulator2.storage.SimulatorSaver; +import de.steamwar.bausystem.features.simulator2.storage.YAPIONFormatSimulatorLoader; import de.steamwar.bausystem.utils.ItemUtils; import de.steamwar.inventory.SWItem; +import de.steamwar.linkage.Linked; +import de.steamwar.linkage.api.Enable; +import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; +import java.io.File; +import java.util.*; -public class SimulatorStorage { +@Linked +public class SimulatorStorage implements Enable { + public static final File simulatorsDir = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "simulators"); private static Map simulatorMap = new HashMap<>(); private static NamespacedKey simulatorSelection = SWUtils.getNamespaceKey("simulator_selection"); @@ -65,8 +72,53 @@ public class SimulatorStorage { simulatorMap.putIfAbsent(name, simulator); } - private static Simulator loadSimulator(String name) { - return SimulatorTestCommand.SIMULATOR; // TODO: Implement Loading and legacy Loading + @Override + public void enable() { + SimFormatSimulatorLoader simFormatSimulatorLoader = new SimFormatSimulatorLoader(); + SimulatorFormatSimulatorLoader simulatorFormatSimulatorLoader = new SimulatorFormatSimulatorLoader(); + YAPIONFormatSimulatorLoader yapionFormatSimulatorLoader = new YAPIONFormatSimulatorLoader(); + + for (File file : simulatorsDir.listFiles()) { + try { + List simulators = simFormatSimulatorLoader.load(file) + .orElse(null); + if (simulators != null) { + simulators.forEach(simulator -> { + simulatorMap.put(simulator.getName(), simulator); + }); + continue; + } + } catch (Exception e) { + // Ignore + } + + try { + List simulators = simulatorFormatSimulatorLoader.load(file) + .orElse(null); + if (simulators != null) { + simulators.forEach(simulator -> { + simulatorMap.put(simulator.getName(), simulator); + SimulatorSaver.saveSimulator(simulatorsDir, simulator); + }); + continue; + } + } catch (Exception e) { + // Ignore + } + + try { + List simulators = yapionFormatSimulatorLoader.load(file) + .orElse(null); + if (simulators != null) { + simulators.forEach(simulator -> { + simulatorMap.put(simulator.getName(), simulator); + SimulatorSaver.saveSimulator(simulatorsDir, simulator); + }); + } + } catch (Exception e) { + // Ignore + } + } } public static void openSimulatorSelector(Player player) { diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java index eb888615..edb97005 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java @@ -23,6 +23,7 @@ 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.tnt.TNTElement; +import de.steamwar.bausystem.features.simulator2.storage.SimulatorSaver; import de.steamwar.bausystem.shared.Pair; import de.steamwar.entity.REntity; import de.steamwar.entity.REntityServer; @@ -69,6 +70,7 @@ public class SimulatorWatcher { simulatorRunnablePair.getValue().run(); } }); + SimulatorSaver.saveSimulator(SimulatorStorage.simulatorsDir, simulator); } @Linked diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorFormatSimulatorLoader.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorFormatSimulatorLoader.java index 86bc406e..3783f833 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorFormatSimulatorLoader.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorFormatSimulatorLoader.java @@ -66,7 +66,7 @@ public class SimulatorFormatSimulatorLoader implements SimulatorLoader { } } - file.delete(); + // file.delete(); return Optional.of(Collections.singletonList(simulator)); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorSaver.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorSaver.java index bb19c48d..9f1fadb1 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorSaver.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorSaver.java @@ -41,13 +41,12 @@ public class SimulatorSaver { YAPIONObject groupObject = new YAPIONObject(); groupObject.add("material", group.getMaterial().name()); groupObject.add("disabled", group.isDisabled()); - groups.add(groupObject); YAPIONArray elements = new YAPIONArray(); group.getElements().forEach(element -> { YAPIONObject elementObject = new YAPIONObject(); elementObject.add("type", element.getType()); - elementObject.add("material", element.getMaterial()); + elementObject.add("material", element.getMaterial().name()); elementObject.add("disabled", element.isDisabled()); elementObject.add("x", element.getPosition().getX()); elementObject.add("y", element.getPosition().getY()); @@ -73,7 +72,7 @@ public class SimulatorSaver { File file = new File(directory, simulator.getName() + ".sim"); try { - simulatorObject.toJSON(new FileOutput(file)).close(); + simulatorObject.toJSONLossy(new FileOutput(file)).close(); } catch (IOException e) { // Ignore } From c050046820ffd2687fd9291839f536202e69ed6e Mon Sep 17 00:00:00 2001 From: yoyosource Date: Fri, 27 Oct 2023 11:55:47 +0200 Subject: [PATCH 35/48] Remove old and move new --- BauSystem_Main/src/BauSystem.properties | 1 + BauSystem_Main/src/BauSystem_de.properties | 1 + .../features/simulator/OrderUtils.java | 92 ---- .../simulator/SimulatorBauGuiItem.java | 60 --- .../features/simulator/SimulatorCommand.java | 121 ++--- .../features/simulator/SimulatorCursor.java | 417 +++++++++++++++--- .../features/simulator/SimulatorStorage.java | 269 +++++------ .../SimulatorWatcher.java | 11 +- .../features/simulator/TNTSimulator.java | 270 ------------ .../simulator/TNTSimulatorListener.java | 130 ------ .../data/Simulator.java | 4 +- .../data/SimulatorElement.java | 6 +- .../data/SimulatorGroup.java | 4 +- .../data/SimulatorPhase.java | 4 +- .../data/redstone/RedstoneElement.java | 12 +- .../data/redstone/RedstonePhase.java | 6 +- .../data/tnt/TNTElement.java | 12 +- .../data/tnt/TNTPhase.java | 6 +- .../execute/SimulatorAction.java | 2 +- .../execute/SimulatorExecutor.java | 4 +- .../features/simulator/gui/ItemUtils.java | 39 -- .../gui/SimulatorGroupChooserGui.java | 14 +- .../gui/SimulatorGroupGui.java | 14 +- .../gui/SimulatorGroupSettingsGui.java | 10 +- .../gui/SimulatorGui.java | 14 +- .../gui/SimulatorMaterialGui.java | 10 +- .../gui/SimulatorRedstoneGui.java | 16 +- .../SimulatorRedstonePhaseSettingsGui.java | 12 +- .../gui/SimulatorRedstoneSettingsGui.java | 10 +- .../simulator/gui/SimulatorSelectionGUI.java | 79 ---- .../gui/SimulatorSettingsGui.java | 8 +- .../gui/SimulatorTNTGui.java | 16 +- .../gui/SimulatorTNTPhaseSettingsGui.java | 14 +- .../gui/SimulatorTNTSettingsGui.java | 10 +- .../features/simulator/gui/TNTElementGUI.java | 390 ---------------- .../simulator/gui/TNTGroupEditGUI.java | 198 --------- .../simulator/gui/TNTSimulatorGui.java | 216 --------- .../gui/base/SimulatorBaseGui.java | 6 +- .../gui/base/SimulatorPageGui.java | 4 +- .../gui/base/SimulatorScrollGui.java | 4 +- .../gui/components/ChangeMaterial.java | 66 --- .../gui/components/ChangePosition.java | 163 ------- .../simulator/gui/components/Disabled.java | 42 -- .../storage/SimFormatSimulatorLoader.java | 19 +- .../SimulatorFormatSimulatorLoader.java | 12 +- .../storage/SimulatorLoader.java | 4 +- .../storage/SimulatorSaver.java | 4 +- .../storage/YAPIONFormatSimulatorLoader.java | 10 +- .../simulator/tnt/SimulatorElement.java | 90 ---- .../features/simulator/tnt/TNTElement.java | 318 ------------- .../features/simulator/tnt/TNTGroup.java | 186 -------- .../features/simulator2/SimulatorCursor.java | 416 ----------------- .../features/simulator2/SimulatorStorage.java | 162 ------- .../simulator2/SimulatorTestCommand.java | 53 --- 54 files changed, 670 insertions(+), 3391 deletions(-) delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator/OrderUtils.java delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorBauGuiItem.java rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/SimulatorWatcher.java (92%) delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulator.java delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulatorListener.java rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/data/Simulator.java (93%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/data/SimulatorElement.java (94%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/data/SimulatorGroup.java (95%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/data/SimulatorPhase.java (91%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/data/redstone/RedstoneElement.java (80%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/data/redstone/RedstonePhase.java (92%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/data/tnt/TNTElement.java (88%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/data/tnt/TNTPhase.java (93%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/execute/SimulatorAction.java (94%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/execute/SimulatorExecutor.java (96%) delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/ItemUtils.java rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/gui/SimulatorGroupChooserGui.java (86%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/gui/SimulatorGroupGui.java (88%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/gui/SimulatorGroupSettingsGui.java (93%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/gui/SimulatorGui.java (80%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/gui/SimulatorMaterialGui.java (88%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/gui/SimulatorRedstoneGui.java (91%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/gui/SimulatorRedstonePhaseSettingsGui.java (92%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/gui/SimulatorRedstoneSettingsGui.java (93%) delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorSelectionGUI.java rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/gui/SimulatorSettingsGui.java (93%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/gui/SimulatorTNTGui.java (91%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/gui/SimulatorTNTPhaseSettingsGui.java (93%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/gui/SimulatorTNTSettingsGui.java (94%) delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTElementGUI.java delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTGroupEditGUI.java delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTSimulatorGui.java rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/gui/base/SimulatorBaseGui.java (94%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/gui/base/SimulatorPageGui.java (95%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/gui/base/SimulatorScrollGui.java (96%) delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/components/ChangeMaterial.java delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/components/ChangePosition.java delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/components/Disabled.java rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/storage/SimFormatSimulatorLoader.java (87%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/storage/SimulatorFormatSimulatorLoader.java (93%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/storage/SimulatorLoader.java (88%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/storage/SimulatorSaver.java (96%) rename BauSystem_Main/src/de/steamwar/bausystem/features/{simulator2 => simulator}/storage/YAPIONFormatSimulatorLoader.java (91%) delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/SimulatorElement.java delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTElement.java delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTGroup.java delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java diff --git a/BauSystem_Main/src/BauSystem.properties b/BauSystem_Main/src/BauSystem.properties index 0037825c..ff127af6 100644 --- a/BauSystem_Main/src/BauSystem.properties +++ b/BauSystem_Main/src/BauSystem.properties @@ -313,6 +313,7 @@ SIMULATOR_GUI_CREATE_SIM = §eCreate simulator SIMULATOR_GUI_CREATE_SIM_GUI = Create simulator SIMULATOR_NAME_ALREADY_EXISTS = §cSimulator already exists SIMULATOR_NAME_INVALID = §cInvalid name +SIMULATOR_ERROR_COPY = §cCopy failed SIMULATOR_NOT_EXISTS = §cSimulator does not exist SIMULATOR_CREATE = §aSimulator created SIMULATOR_EDIT_LOCATION = §7Edit position diff --git a/BauSystem_Main/src/BauSystem_de.properties b/BauSystem_Main/src/BauSystem_de.properties index e5da397d..de6de310 100644 --- a/BauSystem_Main/src/BauSystem_de.properties +++ b/BauSystem_Main/src/BauSystem_de.properties @@ -305,6 +305,7 @@ SIMULATOR_GUI_CREATE_SIM = §eSimulator erstellen SIMULATOR_GUI_CREATE_SIM_GUI = Simulator erstellen SIMULATOR_NAME_ALREADY_EXISTS = §cSimulator existiert bereits SIMULATOR_NAME_INVALID = §cUngültiger Name +SIMULATOR_ERROR_COPY = §cFehler beim kopieren SIMULATOR_NOT_EXISTS = §cSimulator existiert nicht SIMULATOR_CREATE = §aSimulator erstellt SIMULATOR_EDIT_LOCATION = §7Editiere Positionen diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/OrderUtils.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/OrderUtils.java deleted file mode 100644 index 2c377cea..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/OrderUtils.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2022 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.BauSystem; -import lombok.experimental.UtilityClass; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@UtilityClass -public class OrderUtils { - - private final List activationOrder = new ArrayList<>(); - - private final Map nameMap = new HashMap<>(); - - static { - add(Material.REPEATER, "SIMULATOR_TNT_SPAWN_ACTIVATED_WITH_REPEATER"); - add(Material.OBSERVER, "SIMULATOR_TNT_SPAWN_ACTIVATED_WITH_OBSERVER"); - add(Material.COMPARATOR, "SIMULATOR_TNT_SPAWN_ACTIVATED_WITH_COMPARATOR"); - } - - public Material next(Material material) { - int index = activationOrder.indexOf(material); - if (index == -1) { - return activationOrder.get(0); - } - if (index + 1 >= activationOrder.size()) { - return activationOrder.get(0); - } - return activationOrder.get(index + 1); - } - - public Material previous(Material material) { - int index = activationOrder.indexOf(material); - if (index == -1) { - return activationOrder.get(0); - } - if (index - 1 < 0) { - return activationOrder.get(activationOrder.size() - 1); - } - return activationOrder.get(index - 1); - } - - public List orderList(Material material, Player player) { - List lore = new ArrayList<>(); - for (Material m : activationOrder) { - String element = BauSystem.MESSAGE.parse(name(m), player); - if (m == material) { - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_ACTIVE", player, element)); - } else { - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_INACTIVE", player, element)); - } - } - return lore; - } - - public int order(Material material) { - return activationOrder.indexOf(material); - } - - public String name(Material material) { - return nameMap.getOrDefault(material, "SIMULATOR_TNT_SPAWN_ACTIVATED_WITH_UNKNOWN"); - } - - private void add(Material material, String name) { - activationOrder.add(material); - nameMap.put(material, name); - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorBauGuiItem.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorBauGuiItem.java deleted file mode 100644 index baae7add..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorBauGuiItem.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2021 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.BauSystem; -import de.steamwar.bausystem.Permission; -import de.steamwar.bausystem.linkage.specific.BauGuiItem; -import de.steamwar.inventory.SWItem; -import de.steamwar.linkage.Linked; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -@Linked -public class SimulatorBauGuiItem extends BauGuiItem { - - public SimulatorBauGuiItem() { - super(20); - } - - @Override - public ItemStack getItem(Player player) { - ItemStack itemStack = new SWItem(Material.BLAZE_ROD, BauSystem.MESSAGE.parse("SIMULATOR_GUI_ITEM_NAME", player)).getItemStack(); - ItemMeta itemMeta = itemStack.getItemMeta(); - itemMeta.setCustomModelData(1); - itemStack.setItemMeta(itemMeta); - return itemStack; - } - - @Override - public boolean click(ClickType click, Player p) { - p.closeInventory(); - p.performCommand("sim"); - return false; - } - - @Override - public Permission permission() { - return Permission.WORLD; - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCommand.java index 640d0360..5f320fc5 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCommand.java @@ -1,20 +1,20 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2022 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,105 +22,76 @@ package de.steamwar.bausystem.features.simulator; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.SWUtils; -import de.steamwar.bausystem.features.simulator.gui.SimulatorSelectionGUI; -import de.steamwar.bausystem.utils.ItemUtils; +import de.steamwar.bausystem.features.simulator.data.Simulator; +import de.steamwar.bausystem.features.simulator.execute.SimulatorExecutor; import de.steamwar.command.PreviousArguments; import de.steamwar.command.SWCommand; import de.steamwar.command.TypeMapper; import de.steamwar.command.TypeValidator; import de.steamwar.linkage.Linked; +import de.steamwar.linkage.LinkedInstance; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; import java.util.Collection; @Linked public class SimulatorCommand extends SWCommand { + @LinkedInstance + public SimulatorCursor simulatorCursor; + public SimulatorCommand() { - super("simulator", "sim"); + super("sim", "simulator"); } @Register(description = "SIMULATOR_HELP") public void genericCommand(@Validator Player p) { - SimulatorCursor.hide(p, null); SWUtils.giveItemToPlayer(p, SimulatorStorage.getWand(p)); + simulatorCursor.calcCursor(p); } @Register(value = "change", description = "SIMULATOR_CHANGE_HELP") public void change(@Validator Player p) { - ItemStack itemStack = p.getInventory().getItemInMainHand(); - if (!ItemUtils.isItem(itemStack, "simulator")) { + if (!SimulatorCursor.isSimulatorItem(p.getInventory().getItemInMainHand()) && !SimulatorCursor.isSimulatorItem(p.getInventory().getItemInOffHand())) { BauSystem.MESSAGE.send("SIMULATOR_NO_SIM_IN_HAND", p); return; } - SimulatorSelectionGUI.open(p, itemStack); - } - - @Register(value = "create", description = "SIMULATOR_CREATE_HELP") - public void create(@Validator Player p, String name) { - createSimulator(p, name); - } - - public static boolean createSimulator(Player p, String name) { - if (SimulatorStorage.getSimulatorNames().contains(name)) { - BauSystem.MESSAGE.send("SIMULATOR_NAME_ALREADY_EXISTS", p); - return false; - } - if (!name.matches("[a-zA-Z_0-9-]+")) { - BauSystem.MESSAGE.send("SIMULATOR_NAME_INVALID", p); - return false; - } - SimulatorStorage.createNewSimulator(name); - BauSystem.MESSAGE.send("SIMULATOR_CREATE", p); - return true; - } - - @Register(value = "delete", description = "SIMULATOR_DELETE_HELP") - public void delete(@Validator Player p, @Mapper("simulators") String name) { - if (!SimulatorStorage.getSimulatorNames().contains(name)) { - BauSystem.MESSAGE.send("SIMULATOR_NOT_EXISTS", p); - return; - } - SimulatorStorage.delete(name); - BauSystem.MESSAGE.send("SIMULATOR_DELETED", p); - } - - @Register(value = "start", description = "SIMULATOR_START_HELP") - public void start(@Validator Player p, @Mapper("simulators") String name) { - TNTSimulator tntSimulator = SimulatorStorage.getSimulator(name); - if (tntSimulator == null) { - BauSystem.MESSAGE.send("SIMULATOR_NOT_EXISTS", p); - return; - } - tntSimulator.start(p); + SimulatorStorage.openSimulatorSelector(p); } @Register(value = "copy", description = "SIMULATOR_COPY_HELP") - public void copy(@Validator Player p, @Mapper("simulators") String toCopy, String name) { - TNTSimulator tntSimulator = SimulatorStorage.getSimulator(toCopy); - if (tntSimulator == null) { - BauSystem.MESSAGE.send("SIMULATOR_NOT_EXISTS", p); - return; - } + public void copy(@Validator Player p, @ErrorMessage("SIMULATOR_NOT_EXISTS") Simulator simulator, String name) { if (SimulatorStorage.getSimulator(name) != null) { BauSystem.MESSAGE.send("SIMULATOR_NAME_ALREADY_EXISTS", p); return; } - SimulatorStorage.copySimulator(tntSimulator, name); + if (!name.matches("[a-zA-Z_0-9-]+")) { + BauSystem.MESSAGE.send("SIMULATOR_NAME_INVALID", p); + return; + } + if (!SimulatorStorage.copy(simulator, name)) { + BauSystem.MESSAGE.send("SIMULATOR_ERROR_COPY", p); + } } - @Mapper("simulators") - public TypeMapper allSimulators() { - return new TypeMapper() { + @Register(value = "delete", description = "SIMULATOR_DELETE_HELP") + public void delete(@Validator Player p, @ErrorMessage("SIMULATOR_NOT_EXISTS") Simulator simulator) { + SimulatorStorage.delete(simulator); + BauSystem.MESSAGE.send("SIMULATOR_DELETED", p); + } + + @Register(value = "start", description = "SIMULATOR_START_HELP") + public void start(@Validator Player p, @ErrorMessage("SIMULATOR_NOT_EXISTS") Simulator simulator) { + SimulatorExecutor.run(simulator); + } + + @ClassMapper(value = Simulator.class, local = true) + public TypeMapper allSimulators() { + return new TypeMapper<>() { @Override - public String map(CommandSender commandSender, PreviousArguments previousArguments, String s) { - if (SimulatorStorage.getSimulatorNames().contains(s)) { - return s; - } else { - return null; - } + public Simulator map(CommandSender commandSender, PreviousArguments previousArguments, String s) { + return SimulatorStorage.getSimulator(s); } @Override diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java index eede5d32..39564fa6 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java @@ -1,108 +1,219 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2022 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; +import com.comphenix.tinyprotocol.Reflection; +import com.comphenix.tinyprotocol.TinyProtocol; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.features.simulator.tnt.SimulatorElement; +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.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.ItemUtils; import de.steamwar.bausystem.utils.RayTraceUtils; +import de.steamwar.entity.REntity; import de.steamwar.entity.REntityServer; import de.steamwar.entity.RFallingBlockEntity; -import lombok.experimental.UtilityClass; -import net.md_5.bungee.api.ChatMessageType; +import de.steamwar.inventory.SWAnvilInv; +import de.steamwar.linkage.Linked; +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.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.stream.Collectors; -@UtilityClass -public class SimulatorCursor { +@Linked +public class SimulatorCursor implements Listener { - private static final World WORLD = Bukkit.getWorlds().get(0); - private Map rEntityServerMap = new HashMap<>(); + private final World WORLD = Bukkit.getWorlds().get(0); + private Class position = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInFlying$PacketPlayInPosition"); + private Class look = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInFlying$PacketPlayInLook"); + private Class positionLook = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInFlying$PacketPlayInPositionLook"); - public void show(Player player, TNTSimulator tntSimulator, RayTraceUtils.RRayTraceResult result) { - if (true) return; - REntityServer cursor = rEntityServerMap.get(player); + private Map cursorType = Collections.synchronizedMap(new HashMap<>()); + private Map cursors = Collections.synchronizedMap(new HashMap<>()); - if (cursor != null) - cursor.close(); - - tntSimulator.show(player); - - if (result == null) - return; - - if (result.getHitEntity() != null) { - List elements = tntSimulator.getEntity(result.getHitEntity()); - - cursor = new REntityServer(); - RFallingBlockEntity entity = new RFallingBlockEntity(cursor, (elements.isEmpty() ? getPos(player, result) : elements.get(0).getPosition()).toLocation(WORLD), Material.TNT); - entity.setNoGravity(true); - entity.setGlowing(true); - cursor.addPlayer(player); - rEntityServerMap.put(player, cursor); - BauSystem.MESSAGE.sendPrefixless("SIMULATOR_POSITION_EDIT", player, ChatMessageType.ACTION_BAR); - return; - } - - if (SimulatorStorage.getSimulator(player.getInventory().getItemInOffHand()) != null && result.getHitPosition().distanceSquared(player.getLocation().toVector()) < 25) { - return; - } - - cursor = new REntityServer(); - RFallingBlockEntity entity = new RFallingBlockEntity(cursor, getPos(player, result).toLocation(WORLD), Material.TNT); - entity.setNoGravity(true); - cursor.addPlayer(player); - rEntityServerMap.put(player, cursor); - BauSystem.MESSAGE.sendPrefixless("SIMULATOR_POSITION_ADD", player, ChatMessageType.ACTION_BAR); + public static boolean isSimulatorItem(ItemStack itemStack) { + return ItemUtils.isItem(itemStack, "simulator"); } - public void hide(Player player) { - REntityServer cursor = rEntityServerMap.get(player); - if (cursor == null) return; + 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); + } - cursor.close(); - SimulatorStorage.getSimulatorNames().forEach(s -> { - SimulatorStorage.getSimulator(s).hide(player); + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + calcCursor(event.getPlayer()); + } + + @EventHandler + public void onPlayerDropItem(PlayerDropItemEvent event) { + calcCursor(event.getPlayer()); + } + + @EventHandler + public void onPlayerItemHeld(PlayerItemHeldEvent event) { + Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> { + calcCursor(event.getPlayer()); + }, 1); + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + cursorType.remove(event.getPlayer()); + cursors.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 synchronized void calcCursor(Player player) { + if (!isSimulatorItem(player.getInventory().getItemInMainHand()) && !isSimulatorItem(player.getInventory().getItemInOffHand())) { + if (removeCursor(player)) { + SimulatorWatcher.show(null, player); + SWUtils.sendToActionbar(player, ""); + } + return; + } + Simulator simulator = SimulatorStorage.getSimulator(player); + 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"); + } + return; + } + + showCursor(player, rayTraceResult, simulator != null); + } + + 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; }); - } - public void hide(Player player, TNTSimulator tntSimulator) { - REntityServer cursor = rEntityServerMap.get(player); + 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); - if (cursor != null) - cursor.close(); - - if (tntSimulator != null) { - tntSimulator.hide(player); + 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"); } - rEntityServerMap.remove(player); } - public static Vector getPos(Player player, RayTraceUtils.RRayTraceResult result) { + public static Vector getPosTNT(Player player, RayTraceUtils.RRayTraceResult result) { Vector pos = result.getHitPosition(); BlockFace face = result.getHitBlockFace(); @@ -141,4 +252,172 @@ public class SimulatorCursor { return pos; } + + private static Vector getPosRedstoneBlock(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::getPosTNT, "TNT", vector -> new TNTElement(vector).add(new TNTPhase())), + REDSTONE_BLOCK(Material.REDSTONE_BLOCK, SimulatorCursor::getPosRedstoneBlock, "Redstone Block", vector -> new RedstoneElement(vector).add(new RedstonePhase())), + ; + + private Material material; + private BiFunction position; + private String name; + private Function> elementFunction; + + public CursorType switchType() { + if (this == TNT) { + return REDSTONE_BLOCK; + } + return TNT; + } + } + + @EventHandler + public void onPlayerInteract(PlayerInteractEvent event) { + 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(simulator); + 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.getElements().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.getElements().add(group); + SimulatorGui simulatorGui = new SimulatorGui(player, simulator); + element.open(player, simulator, group, simulatorGui); + SimulatorWatcher.update(simulator); + calcCursor(player); + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java index 5103136a..071a2acd 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java @@ -1,124 +1,145 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2022 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; +import com.google.common.io.Files; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.SWUtils; -import de.steamwar.bausystem.features.simulator.tnt.TNTElement; +import de.steamwar.bausystem.features.simulator.data.Simulator; +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; +import de.steamwar.bausystem.features.simulator.storage.SimulatorSaver; +import de.steamwar.bausystem.features.simulator.storage.YAPIONFormatSimulatorLoader; import de.steamwar.bausystem.utils.ItemUtils; import de.steamwar.inventory.SWItem; import de.steamwar.linkage.Linked; -import de.steamwar.linkage.api.Disable; import de.steamwar.linkage.api.Enable; -import de.steamwar.sql.SteamwarUser; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.NamespacedKey; -import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import yapion.exceptions.YAPIONException; -import yapion.hierarchy.types.YAPIONArray; -import yapion.hierarchy.types.YAPIONObject; -import yapion.parser.YAPIONParser; import java.io.File; import java.io.IOException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; +import java.util.*; -// @Linked -public class SimulatorStorage implements Enable, Disable { - - public static final World WORLD = Bukkit.getWorlds().get(0); - private static final File simulatorsDir = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "simulators"); +@Linked +public class SimulatorStorage implements Enable { + public static final File simulatorsDir = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "simulators"); + private static Map simulatorMap = new HashMap<>(); private static NamespacedKey simulatorSelection = SWUtils.getNamespaceKey("simulator_selection"); - private static Map tntSimulators = new HashMap<>(); - - public static void createNewSimulator(String name) { - tntSimulators.put(name, new TNTSimulator()); - } - - public static Set getSimulatorNames() { - return tntSimulators.keySet(); - } - - public static TNTSimulator getSimulator(String name) { - return tntSimulators.get(name); - } - - public static TNTSimulator getSimulator(Player player) { - TNTSimulator current = getSimulator(player.getInventory().getItemInMainHand()); - if (current != null) return current; + public static Simulator getSimulator(Player player) { + Simulator simulator = getSimulator(player.getInventory().getItemInMainHand()); + if (simulator != null) return simulator; return getSimulator(player.getInventory().getItemInOffHand()); } - public static TNTSimulator getSimulator(ItemStack itemStack) { - if (itemStack == null) { - return null; - } - if (!ItemUtils.isItem(itemStack, "simulator")) { + public static Simulator getSimulator(ItemStack itemStack) { + if (!SimulatorCursor.isSimulatorItem(itemStack)) { return null; } String selection = ItemUtils.getTag(itemStack, simulatorSelection); if (selection == null) { return null; } - return tntSimulators.get(selection); + return simulatorMap.get(selection); } - public static void setSimulator(Player player, ItemStack itemStack, TNTSimulator simulator) { - for (Map.Entry entry : tntSimulators.entrySet()) { - if (entry.getValue() == simulator) { - ItemUtils.setTag(itemStack, simulatorSelection, entry.getKey()); - ItemMeta itemMeta = itemStack.getItemMeta(); - itemMeta.setDisplayName(BauSystem.MESSAGE.parse("SIMULATOR_WAND_NAME_SELECTED", player, entry.getKey())); - itemStack.setItemMeta(itemMeta); - return; + public static Simulator getSimulator(String name) { + return simulatorMap.get(name); + } + + public static void addSimulator(String name, Simulator simulator) { + simulatorMap.putIfAbsent(name, simulator); + } + + @Override + public void enable() { + SimFormatSimulatorLoader simFormatSimulatorLoader = new SimFormatSimulatorLoader(); + SimulatorFormatSimulatorLoader simulatorFormatSimulatorLoader = new SimulatorFormatSimulatorLoader(); + YAPIONFormatSimulatorLoader yapionFormatSimulatorLoader = new YAPIONFormatSimulatorLoader(); + + for (File file : simulatorsDir.listFiles()) { + try { + List simulators = simFormatSimulatorLoader.load(file) + .orElse(null); + if (simulators != null) { + simulators.forEach(simulator -> { + simulatorMap.put(simulator.getName(), simulator); + }); + continue; + } + } catch (Exception e) { + // Ignore + } + + try { + List simulators = simulatorFormatSimulatorLoader.load(file) + .orElse(null); + if (simulators != null) { + simulators.forEach(simulator -> { + simulatorMap.put(simulator.getName(), simulator); + SimulatorSaver.saveSimulator(simulatorsDir, simulator); + }); + continue; + } + } catch (Exception e) { + // Ignore + } + + try { + List simulators = yapionFormatSimulatorLoader.load(file) + .orElse(null); + if (simulators != null) { + simulators.forEach(simulator -> { + simulatorMap.put(simulator.getName(), simulator); + SimulatorSaver.saveSimulator(simulatorsDir, simulator); + }); + } + } catch (Exception e) { + // Ignore } } } - public static void delete(String name) { - TNTSimulator tntSimulator = tntSimulators.remove(name); - if (tntSimulator != null) { - tntSimulator.close(); - } - new File(simulatorsDir, name + ".simulator").delete(); - } + public static void openSimulatorSelector(Player player) { + SimulatorPageGui simulatorPageGui = new SimulatorPageGui(player, null, 6 * 9, new ArrayList<>(simulatorMap.values())) { + @Override + public String baseTitle() { + return "Simulators"; + } - public static void copySimulator(TNTSimulator tntSimulator, String name) { - tntSimulators.put(name, new TNTSimulator(tntSimulator.toYAPION())); - } - - public static void removeSimulator(ItemStack itemStack) { - if (!ItemUtils.isItem(itemStack, "simulator")) { - return; - } - ItemUtils.setTag(itemStack, simulatorSelection, null); + @Override + public SWItem convert(Simulator simulator) { + return simulator.toItem(player, clickType -> { + setSimulator(player, simulator); + player.closeInventory(); + }); + } + }; + simulatorPageGui.open(); } public static ItemStack getWand(Player p) { @@ -130,68 +151,48 @@ public class SimulatorStorage implements Enable, Disable { return itemStack; } - @Override - public void enable() { - if (!simulatorsDir.exists()) { - simulatorsDir.mkdir(); + public static void setSimulator(Player player, Simulator simulator) { + ItemStack mainHand = player.getInventory().getItemInMainHand(); + ItemStack offHand = player.getInventory().getItemInOffHand(); + ItemStack itemStack; + if (SimulatorCursor.isSimulatorItem(mainHand)) { + itemStack = mainHand; + } else if (SimulatorCursor.isSimulatorItem(offHand)) { + itemStack = offHand; + } else { + itemStack = null; } - File[] files = simulatorsDir.listFiles(); - if (files == null) return; - - for (File file : files) { - YAPIONObject yapionObject; - try { - yapionObject = YAPIONParser.parse(file); - } catch (YAPIONException | IOException e) { - continue; - } - if (file.getName().endsWith(".yapion")) { - String name = file.getName().substring(0, file.getName().length() - 7); - try { - SteamwarUser steamwarUser = SteamwarUser.get(Integer.parseInt(name)); - convert(file, steamwarUser); - } catch (Exception e) { - file.delete(); - } - } else { - String name = file.getName().substring(0, file.getName().length() - ".simulator".length()); - tntSimulators.put(name, new TNTSimulator(yapionObject)); - } - } - } - - private static void convert(File file, SteamwarUser steamwarUser) { - YAPIONObject yapionObject; - try { - yapionObject = YAPIONParser.parse(file); - } catch (YAPIONException | IOException e) { + if (itemStack == null) { return; } - try { - file.delete(); - } catch (Exception e) { - e.printStackTrace(); - } - for (String s : yapionObject.getKeys()) { - String newName = steamwarUser.getUserName() + (s.isEmpty() ? "" : "_" + s); - YAPIONArray content = yapionObject.getArray(s); - if (content.isEmpty()) continue; - TNTSimulator tntSimulator = new TNTSimulator(); - for (YAPIONObject element : content.streamObject().collect(Collectors.toList())) { - tntSimulator.getTntElementList().add(new TNTElement(element, null, tntSimulator.getEntityServer())); - } - tntSimulators.put(newName, tntSimulator); - } + + ItemUtils.setTag(itemStack, simulatorSelection, simulator.getName()); + ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.setDisplayName(BauSystem.MESSAGE.parse("SIMULATOR_WAND_NAME_SELECTED", player, simulator.getName())); + itemStack.setItemMeta(itemMeta); } - @Override - public void disable() { - for (Map.Entry entry : tntSimulators.entrySet()) { - try { - entry.getValue().toYAPION().toFile(new File(simulatorsDir, entry.getKey() + ".simulator")); - } catch (Exception e) { - e.printStackTrace(); - } + public static List getSimulatorNames() { + return new ArrayList<>(simulatorMap.keySet()); + } + + public static void delete(Simulator simulator) { + simulatorMap.remove(simulator.getName()); + new File(simulatorsDir, simulator.getName() + ".sim").delete(); + } + + public static boolean copy(Simulator simulator, String name) { + try { + File file = new File(simulatorsDir, name + ".sim"); + Files.copy(new File(simulatorsDir, simulator.getName() + ".sim"), file); + new SimFormatSimulatorLoader().load(file).ifPresent(simulators -> { + simulators.forEach(sim -> { + simulatorMap.put(sim.getName(), sim); + }); + }); + return true; + } catch (IOException e) { + return false; } } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorWatcher.java similarity index 92% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorWatcher.java index edb97005..1a3f3987 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorWatcher.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorWatcher.java @@ -17,13 +17,12 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2; +package de.steamwar.bausystem.features.simulator; -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.tnt.TNTElement; -import de.steamwar.bausystem.features.simulator2.storage.SimulatorSaver; +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; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulator.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulator.java deleted file mode 100644 index d1a71b95..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulator.java +++ /dev/null @@ -1,270 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2022 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.BauSystem; -import de.steamwar.bausystem.configplayer.Config; -import de.steamwar.bausystem.features.simulator.gui.TNTElementGUI; -import de.steamwar.bausystem.features.simulator.gui.TNTSimulatorGui; -import de.steamwar.bausystem.features.simulator.tnt.SimulatorElement; -import de.steamwar.bausystem.features.simulator.tnt.TNTElement; -import de.steamwar.bausystem.features.simulator.tnt.TNTGroup; -import de.steamwar.bausystem.features.tracer.record.Recorder; -import de.steamwar.bausystem.features.tracer.record.SingleTraceRecorder; -import de.steamwar.bausystem.region.Region; -import de.steamwar.bausystem.shared.Pair; -import de.steamwar.bausystem.utils.RayTraceUtils; -import de.steamwar.entity.REntity; -import de.steamwar.entity.REntityServer; -import lombok.Getter; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import yapion.hierarchy.types.YAPIONArray; -import yapion.hierarchy.types.YAPIONObject; -import yapion.hierarchy.types.YAPIONType; - -import java.util.*; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; - -@Getter -public class TNTSimulator { - - private Set players = new HashSet<>(); - private REntityServer entityServer = new REntityServer(); - - private Material material = Material.TNT; - - private List tntElementList = new ArrayList<>(); - - public TNTSimulator() { - - } - - public TNTSimulator(YAPIONObject yapionObject) { - material = Material.valueOf(yapionObject.getStringOrDefault("material", Material.TNT.name())); - YAPIONArray yapionArray = yapionObject.getArrayOrDefault("tntElements", new YAPIONArray()); - for (YAPIONObject element : yapionArray.streamObject().collect(Collectors.toList())) { - if (element.containsKey("elements", YAPIONType.ARRAY)) { - tntElementList.add(new TNTGroup(element, entityServer)); - } else { - tntElementList.add(new TNTElement(element, null, entityServer)); - } - } - } - - public YAPIONObject toYAPION() { - YAPIONObject yapionObject = new YAPIONObject(); - yapionObject.add("material", material.name()); - YAPIONArray yapionArray = new YAPIONArray(); - for (SimulatorElement element : tntElementList) { - yapionArray.add(element.toYAPION()); - } - yapionObject.add("tntElements", yapionArray); - return yapionObject; - } - - public void close() { - entityServer.close(); - } - - public void show(Player player) { - if (!players.contains(player)) { - entityServer.addPlayer(player); - players.add(player); - } - } - - public void hide(Player player) { - if (players.contains(player)) { - entityServer.removePlayer(player); - players.remove(player); - } - } - - void _hide(Player player) { - players.remove(player); - } - - public List getEntities() { - return tntElementList.stream().flatMap(element -> element.getEntities().stream()).collect(Collectors.toList()); - } - - public List getEntity(REntity entity) { - List tntSpawns = new ArrayList<>(); - for (SimulatorElement spawn : tntElementList) { - spawn.getEntity(tntSpawns, entity); - } - return tntSpawns; - } - - public void clear() { - new ArrayList<>(tntElementList).forEach(this::remove); - } - - public void remove(SimulatorElement element) { - if (element instanceof TNTElement) { - TNTElement tntElement = (TNTElement) element; - if (tntElement.hasParent()) { - tntElement.getParent().remove(tntElement); - if (tntElement.getParent().getElements().isEmpty()) { - remove(tntElement.getParent()); - } - } else { - element.remove(tntElement); - } - } else if (element instanceof TNTGroup) { - TNTGroup tntGroup = (TNTGroup) element; - tntGroup.getElements().forEach(tntElement -> { - tntElement.remove(tntElement); - }); - tntGroup.getElements().clear(); - } - element.close(); - tntElementList.remove(element); - } - - public void change() { - tntElementList.forEach(simulatorElement -> { - simulatorElement.change(); - if (simulatorElement instanceof TNTGroup) { - ((TNTGroup) simulatorElement).getElements().forEach(SimulatorElement::change); - } - }); - } - - public void edit(Player player, RayTraceUtils.RRayTraceResult result) { - if (result == null) { - TNTSimulatorGui.open(player, this, null, this::getTntElementList, null); - return; - } - - SimulatorCursor.show(player, this, result); - - if (result.getHitEntity() != null) { - List elements = getEntity(result.getHitEntity()); - if (elements.isEmpty()) return; - - if (elements.size() == 1) { - TNTElementGUI.open(player, (TNTElement) elements.get(0), null); - } else { - List tntGroups = tntElementList.stream().filter(TNTGroup.class::isInstance).map(TNTGroup.class::cast).collect(Collectors.toList()); - List newElementList = new ArrayList<>(); - for (TNTGroup tntGroup : tntGroups) { - if (new HashSet<>(elements).containsAll(tntGroup.getElements())) { - newElementList.add(tntGroup); - elements.removeAll(tntGroup.getElements()); - } - } - newElementList.addAll(elements); - if (newElementList.size() == 1) { - SimulatorElement element = newElementList.get(0); - if (element instanceof TNTGroup) { - TNTGroup tntGroup = (TNTGroup) element; - TNTSimulatorGui.open(player, null, tntGroup, () -> { - List elementList = new ArrayList<>(); - elementList.addAll(tntGroup.getElements()); - return elementList; - }, null); - } else { - TNTElementGUI.open(player, (TNTElement) elements.get(0), null); - } - } else { - TNTSimulatorGui.open(player, null, null, () -> newElementList, null); - } - } - return; - } - - if (SimulatorStorage.getSimulator(player.getInventory().getItemInOffHand()) != null && result.getHitPosition().distanceSquared(player.getLocation().toVector()) < 25) { - return; - } - - TNTElement tntElement = new TNTElement(SimulatorCursor.getPos(player, result), null, entityServer); - tntElementList.add(tntElement); - TNTElementGUI.open(player, tntElement, null); - } - - public void start(Player p) { - Region region = Region.getRegion(p.getLocation()); - Map>>> result = new HashMap<>(); - boolean regionFrozen = false; - for (SimulatorElement element : tntElementList) { - regionFrozen |= element.locations(result, region, p.getLocation()); - } - if (regionFrozen) { - BauSystem.MESSAGE.send("SIMULATOR_REGION_FROZEN", p); - return; - } - - AtomicBoolean needsAutoTrace = new AtomicBoolean(); - players.forEach(player -> { - boolean simulatorAutoTrace = Config.getInstance().get(player).getPlainValueOrDefault("simulatorAutoTrace", false); - if (simulatorAutoTrace) { - needsAutoTrace.set(true); - player.performCommand("trace show"); - } - }); - if (needsAutoTrace.get()) { - Recorder.INSTANCE.set(region, new SingleTraceRecorder(region)); - } - - AtomicInteger maxTick = new AtomicInteger(0); - Map>>> toSpawn = new HashMap<>(); - result.forEach((integer, integerSetMap) -> { - List>>> internal = new ArrayList<>(); - integerSetMap.forEach((integer1, pairs) -> { - internal.add(new Pair<>(integer1, pairs)); - }); - internal.sort(Comparator.comparingInt(Pair::getKey)); - - toSpawn.put(integer, internal.stream().map(Pair::getValue).map(ArrayList::new).peek(Collections::shuffle).collect(Collectors.toList())); - - if (maxTick.get() < integer) { - maxTick.set(integer); - } - }); - - AtomicInteger currentTick = new AtomicInteger(0); - BauSystem.runTaskTimer(BauSystem.getInstance(), bukkitTask -> { - int tick = currentTick.get(); - if (tick > maxTick.get()) bukkitTask.cancel(); - currentTick.incrementAndGet(); - - List>> toSpawnInTick = toSpawn.get(tick); - if (toSpawnInTick == null) return; - toSpawnInTick.forEach(pairs -> { - AtomicBoolean hasSomeLeft = new AtomicBoolean(true); - while(hasSomeLeft.get()) { - hasSomeLeft.set(false); - pairs.forEach(pair -> { - if (pair.getValue() > 0) { - hasSomeLeft.set(true); - pair.getKey().run(); - pair.setValue(pair.getValue() - 1); - } - }); - } - }); - }, 1, 1); - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulatorListener.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulatorListener.java deleted file mode 100644 index bfead637..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulatorListener.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2022 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.BauSystem; -import de.steamwar.bausystem.Permission; -import de.steamwar.bausystem.features.simulator.gui.SimulatorSelectionGUI; -import de.steamwar.bausystem.utils.ItemUtils; -import de.steamwar.bausystem.utils.RayTraceUtils; -import de.steamwar.linkage.Linked; -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.*; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; - -import java.util.function.Function; - -// @Linked -public class TNTSimulatorListener implements Listener { - - private boolean permissionCheck(Player player) { - if (!Permission.hasPermission(player, Permission.WORLD)) { - BauSystem.MESSAGE.send("SIMULATOR_NO_PERMS", player); - return false; - } - return true; - } - - static RayTraceUtils.RRayTraceResult trace(Player player, Location to, TNTSimulator simulator) { - return RayTraceUtils.traceREntity(player, to, simulator.getEntities()); - } - - @EventHandler - public void onPlayerMove(PlayerMoveEvent e) { - if (ItemUtils.isItem(e.getPlayer().getInventory().getItemInMainHand(), "simulator")) { - simulatorShowHide(e.getPlayer(), i -> null, PlayerInventory::getItemInMainHand, e.getTo()); - } else { - SimulatorCursor.hide(e.getPlayer()); - } - } - - @EventHandler - public void onPlayerItemHeld(PlayerItemHeldEvent e) { - simulatorShowHide(e.getPlayer(), i -> i.getItem(e.getPreviousSlot()), i -> i.getItem(e.getNewSlot()), e.getPlayer().getLocation()); - } - - @EventHandler - public void onPlayerDropItem(PlayerDropItemEvent e) { - simulatorShowHide(e.getPlayer(), i -> e.getItemDrop().getItemStack(), i -> null, e.getPlayer().getLocation()); - } - - private TNTSimulator simulatorShowHide(Player player, Function oldItemFunction, Function newItemFunction, Location location) { - TNTSimulator oldSimulator = SimulatorStorage.getSimulator(oldItemFunction.apply(player.getInventory())); - SimulatorCursor.hide(player, oldSimulator); - - TNTSimulator simulator = SimulatorStorage.getSimulator(newItemFunction.apply(player.getInventory())); - if (simulator == null) return null; - - SimulatorCursor.show(player, simulator, trace(player, location, simulator)); - return simulator; - } - - @EventHandler - public void onPlayerJoin(PlayerJoinEvent e) { - if (ItemUtils.isItem(e.getPlayer().getInventory().getItemInMainHand(), "simulator")) { - simulatorShowHide(e.getPlayer(), i -> null, PlayerInventory::getItemInMainHand, e.getPlayer().getLocation()); - } - } - - @EventHandler - public void onPlayerQuit(PlayerQuitEvent event) { - SimulatorCursor.hide(event.getPlayer(), null); - SimulatorStorage.getSimulatorNames().forEach(s -> { - SimulatorStorage.getSimulator(s)._hide(event.getPlayer()); - }); - } - - @EventHandler - public void onPlayerInteract(PlayerInteractEvent event) { - if (!ItemUtils.isItem(event.getItem(), "simulator")) { - return; - } - - event.setCancelled(true); - if (!permissionCheck(event.getPlayer())) { - return; - } - TNTSimulator simulator = SimulatorStorage.getSimulator(event.getItem()); - - switch (event.getAction()) { - case LEFT_CLICK_BLOCK: - case LEFT_CLICK_AIR: - if (simulator == null) { - return; - } - simulator.start(event.getPlayer()); - break; - case RIGHT_CLICK_BLOCK: - case RIGHT_CLICK_AIR: - if (simulator == null) { - SimulatorSelectionGUI.open(event.getPlayer(), event.getItem()); - } else { - simulator.edit(event.getPlayer(), trace(event.getPlayer(), event.getPlayer().getLocation(), simulator)); - } - break; - default: - break; - } - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/Simulator.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/Simulator.java similarity index 93% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/Simulator.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/Simulator.java index b1f6c6f6..75e79765 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/Simulator.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/Simulator.java @@ -17,9 +17,9 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.data; +package de.steamwar.bausystem.features.simulator.data; -import de.steamwar.bausystem.features.simulator2.execute.SimulatorAction; +import de.steamwar.bausystem.features.simulator.execute.SimulatorAction; import de.steamwar.inventory.InvCallback; import de.steamwar.inventory.SWItem; import lombok.Getter; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorElement.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorElement.java similarity index 94% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorElement.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorElement.java index aeb99c42..a79a7dad 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorElement.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorElement.java @@ -17,10 +17,10 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.data; +package de.steamwar.bausystem.features.simulator.data; -import de.steamwar.bausystem.features.simulator2.execute.SimulatorAction; -import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui; +import de.steamwar.bausystem.features.simulator.execute.SimulatorAction; +import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.inventory.InvCallback; import de.steamwar.inventory.SWItem; import lombok.Getter; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorGroup.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorGroup.java similarity index 95% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorGroup.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorGroup.java index a4b6d031..3b09e8b3 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorGroup.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorGroup.java @@ -17,9 +17,9 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.data; +package de.steamwar.bausystem.features.simulator.data; -import de.steamwar.bausystem.features.simulator2.execute.SimulatorAction; +import de.steamwar.bausystem.features.simulator.execute.SimulatorAction; import de.steamwar.inventory.InvCallback; import de.steamwar.inventory.SWItem; import lombok.Getter; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorPhase.java similarity index 91% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorPhase.java index 09e174fd..33009044 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/SimulatorPhase.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorPhase.java @@ -17,9 +17,9 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.data; +package de.steamwar.bausystem.features.simulator.data; -import de.steamwar.bausystem.features.simulator2.execute.SimulatorAction; +import de.steamwar.bausystem.features.simulator.execute.SimulatorAction; import lombok.Getter; import lombok.Setter; import org.bukkit.util.Vector; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneElement.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/redstone/RedstoneElement.java similarity index 80% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneElement.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/redstone/RedstoneElement.java index 4394f27f..ac130e03 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstoneElement.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/redstone/RedstoneElement.java @@ -17,13 +17,13 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.data.redstone; +package de.steamwar.bausystem.features.simulator.data.redstone; -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.gui.SimulatorRedstoneGui; -import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui; +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.gui.SimulatorRedstoneGui; +import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.util.Vector; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/redstone/RedstonePhase.java similarity index 92% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/redstone/RedstonePhase.java index 0972c4ca..f67dfb45 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/redstone/RedstonePhase.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/redstone/RedstonePhase.java @@ -18,10 +18,10 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.data.redstone; +package de.steamwar.bausystem.features.simulator.data.redstone; -import de.steamwar.bausystem.features.simulator2.data.SimulatorPhase; -import de.steamwar.bausystem.features.simulator2.execute.SimulatorAction; +import de.steamwar.bausystem.features.simulator.data.SimulatorPhase; +import de.steamwar.bausystem.features.simulator.execute.SimulatorAction; import lombok.NoArgsConstructor; import org.bukkit.Material; import org.bukkit.World; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTElement.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTElement.java similarity index 88% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTElement.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTElement.java index 69b7c67f..36b10130 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTElement.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTElement.java @@ -17,13 +17,13 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.data.tnt; +package de.steamwar.bausystem.features.simulator.data.tnt; -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.gui.SimulatorTNTGui; -import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui; +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.gui.SimulatorTNTGui; +import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.inventory.InvCallback; import de.steamwar.inventory.SWItem; import org.bukkit.Material; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTPhase.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTPhase.java similarity index 93% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTPhase.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTPhase.java index 7becfec9..d776edb8 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/data/tnt/TNTPhase.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTPhase.java @@ -17,10 +17,10 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.data.tnt; +package de.steamwar.bausystem.features.simulator.data.tnt; -import de.steamwar.bausystem.features.simulator2.data.SimulatorPhase; -import de.steamwar.bausystem.features.simulator2.execute.SimulatorAction; +import de.steamwar.bausystem.features.simulator.data.SimulatorPhase; +import de.steamwar.bausystem.features.simulator.execute.SimulatorAction; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/execute/SimulatorAction.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/SimulatorAction.java similarity index 94% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/execute/SimulatorAction.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/SimulatorAction.java index bacc0ffd..c6c9f1da 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/execute/SimulatorAction.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/SimulatorAction.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.execute; +package de.steamwar.bausystem.features.simulator.execute; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/execute/SimulatorExecutor.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/SimulatorExecutor.java similarity index 96% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/execute/SimulatorExecutor.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/SimulatorExecutor.java index 0f755aa6..65f15009 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/execute/SimulatorExecutor.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/SimulatorExecutor.java @@ -17,10 +17,10 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.execute; +package de.steamwar.bausystem.features.simulator.execute; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.features.simulator2.data.Simulator; +import de.steamwar.bausystem.features.simulator.data.Simulator; import lombok.experimental.UtilityClass; import org.bukkit.Bukkit; import org.bukkit.World; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/ItemUtils.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/ItemUtils.java deleted file mode 100644 index 8a4bceb5..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/ItemUtils.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2022 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.inventory.SWItem; -import lombok.experimental.UtilityClass; -import org.bukkit.NamespacedKey; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.persistence.PersistentDataType; - -import java.util.UUID; - -@UtilityClass -public class ItemUtils { - - public static SWItem unique(SWItem swItem) { - ItemMeta itemMeta = swItem.getItemMeta(); - itemMeta.getPersistentDataContainer().set(NamespacedKey.minecraft(UUID.randomUUID().toString()), PersistentDataType.INTEGER, 0); - swItem.setItemMeta(itemMeta); - return swItem; - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupChooserGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupChooserGui.java similarity index 86% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupChooserGui.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupChooserGui.java index f71e7f4c..c431420c 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupChooserGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupChooserGui.java @@ -17,14 +17,14 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.gui; +package de.steamwar.bausystem.features.simulator.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.gui.base.SimulatorBaseGui; -import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorPageGui; +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.gui.base.SimulatorBaseGui; +import de.steamwar.bausystem.features.simulator.gui.base.SimulatorPageGui; import de.steamwar.inventory.InvCallback; import de.steamwar.inventory.SWItem; import org.bukkit.Material; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupGui.java similarity index 88% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupGui.java index 7fe8e6b4..06df5e5e 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupGui.java @@ -17,14 +17,14 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.gui; +package de.steamwar.bausystem.features.simulator.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.gui.base.SimulatorBaseGui; -import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorPageGui; +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.gui.base.SimulatorBaseGui; +import de.steamwar.bausystem.features.simulator.gui.base.SimulatorPageGui; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupSettingsGui.java similarity index 93% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupSettingsGui.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupSettingsGui.java index eb27c8b2..2aa11e98 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGroupSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupSettingsGui.java @@ -17,12 +17,12 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.gui; +package de.steamwar.bausystem.features.simulator.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.simulator.SimulatorWatcher; +import de.steamwar.bausystem.features.simulator.data.Simulator; +import de.steamwar.bausystem.features.simulator.data.SimulatorGroup; +import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGui.java similarity index 80% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGui.java index 192d239c..dfc612ec 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGui.java @@ -17,15 +17,13 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.gui; +package de.steamwar.bausystem.features.simulator.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.SimulatorPageGui; +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.gui.base.SimulatorPageGui; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorMaterialGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorMaterialGui.java similarity index 88% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorMaterialGui.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorMaterialGui.java index 9e8e6081..84f1e682 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorMaterialGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorMaterialGui.java @@ -17,12 +17,12 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.gui; +package de.steamwar.bausystem.features.simulator.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.base.SimulatorPageGui; +import de.steamwar.bausystem.features.simulator.SimulatorWatcher; +import de.steamwar.bausystem.features.simulator.data.Simulator; +import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; +import de.steamwar.bausystem.features.simulator.gui.base.SimulatorPageGui; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneGui.java similarity index 91% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneGui.java index bc2b36c5..d934df37 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneGui.java @@ -17,15 +17,15 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.gui; +package de.steamwar.bausystem.features.simulator.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.RedstonePhase; -import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui; -import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorScrollGui; +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.gui.base.SimulatorBaseGui; +import de.steamwar.bausystem.features.simulator.gui.base.SimulatorScrollGui; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java similarity index 92% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java index 7b93f595..3a03deed 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstonePhaseSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java @@ -17,13 +17,13 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.gui; +package de.steamwar.bausystem.features.simulator.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.RedstonePhase; -import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui; +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.data.redstone.RedstonePhase; +import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneSettingsGui.java similarity index 93% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneSettingsGui.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneSettingsGui.java index 25db707e..eb0ea99e 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorRedstoneSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneSettingsGui.java @@ -17,12 +17,12 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.gui; +package de.steamwar.bausystem.features.simulator.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.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.gui.base.SimulatorBaseGui; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorSelectionGUI.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorSelectionGUI.java deleted file mode 100644 index 2ca90d2a..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorSelectionGUI.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2022 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.BauSystem; -import de.steamwar.bausystem.features.simulator.SimulatorCommand; -import de.steamwar.bausystem.features.simulator.SimulatorStorage; -import de.steamwar.bausystem.features.simulator.TNTSimulator; -import de.steamwar.inventory.SWAnvilInv; -import de.steamwar.inventory.SWItem; -import de.steamwar.inventory.SWListInv; -import lombok.experimental.UtilityClass; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import java.util.ArrayList; -import java.util.List; - -@UtilityClass -public class SimulatorSelectionGUI { - - public void open(Player player, ItemStack hand) { - List> swListEntryList = new ArrayList<>(); - - for (String name : SimulatorStorage.getSimulatorNames()) { - TNTSimulator simulator = SimulatorStorage.getSimulator(name); - SWItem swItem = new SWItem(simulator.getMaterial(), "§f" + name, new ArrayList<>(), false, null); - swListEntryList.add(new SWListInv.SWListEntry<>(swItem, simulator)); - } - - SWListInv inv = new SWListInv<>(player, BauSystem.MESSAGE.parse("SIMULATOR_GUI_SELECT_SIM", player), false, swListEntryList, (clickType, tntSimulator) -> { - TNTSimulator current = SimulatorStorage.getSimulator(hand); - if (current != null) { - current.hide(player); - } - SimulatorStorage.setSimulator(player, hand, tntSimulator); - player.getInventory().setItemInMainHand(hand); - player.closeInventory(); - }); - - inv.setItem(49, new SWItem(Material.NAME_TAG, BauSystem.MESSAGE.parse("SIMULATOR_GUI_CREATE_SIM", player), clickType -> { - SWAnvilInv swAnvilInv = new SWAnvilInv(player, BauSystem.MESSAGE.parse("SIMULATOR_GUI_CREATE_SIM_GUI", player), ""); - swAnvilInv.setItem(Material.PAPER); - swAnvilInv.setCallback(s -> { - player.closeInventory(); - if (SimulatorCommand.createSimulator(player, s)) { - TNTSimulator current = SimulatorStorage.getSimulator(hand); - if (current != null) { - current.hide(player); - } - TNTSimulator tntSimulator = SimulatorStorage.getSimulator(s); - SimulatorStorage.setSimulator(player, hand, tntSimulator); - player.getInventory().setItemInMainHand(hand); - } - }); - swAnvilInv.open(); - })); - - inv.open(); - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorSettingsGui.java similarity index 93% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorSettingsGui.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorSettingsGui.java index 8ed72b0e..45b2e22a 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorSettingsGui.java @@ -17,11 +17,11 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.gui; +package de.steamwar.bausystem.features.simulator.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.simulator.SimulatorWatcher; +import de.steamwar.bausystem.features.simulator.data.Simulator; +import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTGui.java similarity index 91% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTGui.java index f4c80ebe..7b9fc71a 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTGui.java @@ -17,15 +17,15 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.gui; +package de.steamwar.bausystem.features.simulator.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.tnt.TNTElement; -import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase; -import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui; -import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorScrollGui; +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.gui.base.SimulatorBaseGui; +import de.steamwar.bausystem.features.simulator.gui.base.SimulatorScrollGui; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java similarity index 93% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java index 613f1dc7..149fb599 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTPhaseSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java @@ -17,14 +17,14 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.gui; +package de.steamwar.bausystem.features.simulator.gui; -import de.steamwar.bausystem.features.simulator2.SimulatorWatcher; -import de.steamwar.bausystem.features.simulator2.data.Simulator; -import de.steamwar.bausystem.features.simulator2.data.SimulatorPhase; -import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement; -import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase; -import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui; +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.gui.base.SimulatorBaseGui; import de.steamwar.core.Core; import de.steamwar.inventory.SWItem; import org.bukkit.Material; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java similarity index 94% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTSettingsGui.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java index f93cc648..e1698c6f 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/SimulatorTNTSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java @@ -17,12 +17,12 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.gui; +package de.steamwar.bausystem.features.simulator.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.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.gui.base.SimulatorBaseGui; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTElementGUI.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTElementGUI.java deleted file mode 100644 index 93181f90..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTElementGUI.java +++ /dev/null @@ -1,390 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2022 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.BauSystem; -import de.steamwar.bausystem.features.simulator.OrderUtils; -import de.steamwar.bausystem.features.simulator.SimulatorStorage; -import de.steamwar.bausystem.features.simulator.TNTSimulator; -import de.steamwar.bausystem.features.simulator.gui.components.ChangeMaterial; -import de.steamwar.bausystem.features.simulator.gui.components.ChangePosition; -import de.steamwar.bausystem.features.simulator.gui.components.Disabled; -import de.steamwar.bausystem.features.simulator.tnt.TNTElement; -import de.steamwar.bausystem.features.simulator.tnt.TNTGroup; -import de.steamwar.inventory.SWAnvilInv; -import de.steamwar.inventory.SWInventory; -import de.steamwar.inventory.SWItem; -import lombok.experimental.UtilityClass; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.util.Consumer; -import org.bukkit.util.Vector; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import static de.steamwar.bausystem.features.simulator.gui.ItemUtils.unique; - -@UtilityClass -public class TNTElementGUI { - - private SWInventory open(Player player, String name) { - SWInventory inv = new SWInventory(player, 45, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_GUI_NAME", player, name)); - SWItem gray = new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§f", clickType -> {}); - for (int i = 0; i < 9; i++) { - inv.setItem(i, gray); - inv.setItem(i + 36, gray); - } - return inv; - } - - public void open(Player player, TNTElement tntElement, Runnable back) { - SWInventory inv = open(player, ""); - if (back != null) { - inv.setItem(36, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("SIMULATOR_BACK", player), clickType -> back.run())); - } - - TNTSimulator tntSimulator = SimulatorStorage.getSimulator(player); - Runnable editObserver = () -> { - List locationLore = new ArrayList<>(); - locationLore.add(""); - locationLore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_X", player, tntElement.getPosition().getX())); - locationLore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_Y", player, tntElement.getPosition().getY())); - locationLore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_Z", player, tntElement.getPosition().getZ())); - inv.setItem(20, new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("SIMULATOR_EDIT_LOCATION", player), locationLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - editLocation(player, tntElement, () -> open(player, tntElement, back)); - })); - - List propertiesLore = new ArrayList<>(); - propertiesLore.add(""); - propertiesLore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_COUNT", player, tntElement.getCount())); - propertiesLore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_TICK", player, tntElement.getTickOffset())); - propertiesLore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_FUSE", player, tntElement.getFuseTicks())); - propertiesLore.add(""); - propertiesLore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_VELOCITY_X", player, active(player, tntElement.isXVelocity()))); - propertiesLore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_VELOCITY_Y", player, active(player, tntElement.isYVelocity()))); - propertiesLore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_VELOCITY_Z", player, active(player, tntElement.isZVelocity()))); - inv.setItem(22, new SWItem(Material.TNT, BauSystem.MESSAGE.parse("SIMULATOR_EDIT_PROPERTIES", player), propertiesLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - editProperties(player, tntElement, () -> open(player, tntElement, back)); - })); - - List otherLore = new ArrayList<>(); - otherLore.add(""); - otherLore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_ACTIVATED_WITH", player, BauSystem.MESSAGE.parse(OrderUtils.name(tntElement.getOrder()), player))); - otherLore.add(BauSystem.MESSAGE.parse("SIMULATOR_MATERIAL_NAME_LORE", player, tntElement.getMaterial().name())); - if (tntElement.isDisabled()) { - otherLore.add(""); - otherLore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_DISABLED", player)); - } - inv.setItem(24, new SWItem(Material.ANVIL, BauSystem.MESSAGE.parse("SIMULATOR_EDIT_OTHER", player), otherLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - editOther(player, tntElement, () -> open(player, tntElement, back)); - })); - - // Delete tnt - inv.setItem(44, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_REMOVE_TNT", player), clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - tntSimulator.remove(tntElement); - player.closeInventory(); - })); - }; - editObserver.run(); - tntElement.register(editObserver, player::closeInventory); - inv.addCloseRunnable(() -> { - tntElement.unregister(editObserver); - }); - - inv.open(); - } - - private void editLocation(Player player, TNTElement tntElement, Runnable back) { - SWInventory inv = open(player, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_EDIT_LOCATION", player)); - if (back != null) { - inv.setItem(36, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("SIMULATOR_BACK", player), clickType -> back.run())); - } - - Runnable editObserver = () -> { - ChangePosition.show(inv, player, tntElement, vectorUnaryOperator -> { - if (tntElement.getParent() == null) { - tntElement.setPosition(vectorUnaryOperator.apply(tntElement.getPosition())); - } else { - tntElement.setPosition(vectorUnaryOperator.apply(tntElement.getPosition()).subtract(tntElement.getParent().getPosition())); - } - }, () -> editLocation(player, tntElement, back)); - - // Alignment - inv.setItem(23, new SWItem(Material.OAK_BUTTON, BauSystem.MESSAGE.parse("SIMULATOR_ALIGNMENT_NEGATIVE_Z", player), clickType -> { // Z negative - if (clickType == ClickType.DOUBLE_CLICK) return; - tntElement.align(new Vector(0, 0, 0.49)); - tntElement.change(); - })); - inv.setItem(25, new SWItem(Material.OAK_BUTTON, BauSystem.MESSAGE.parse("SIMULATOR_ALIGNMENT_POSITIVE_Z", player), clickType -> { // Z positive - if (clickType == ClickType.DOUBLE_CLICK) return; - tntElement.align(new Vector(0, 0, 0.51)); - tntElement.change(); - })); - inv.setItem(15, new SWItem(Material.OAK_BUTTON, BauSystem.MESSAGE.parse("SIMULATOR_ALIGNMENT_POSITIVE_X", player), clickType -> { // X positive - if (clickType == ClickType.DOUBLE_CLICK) return; - tntElement.align(new Vector(0.51, 0, 0)); - tntElement.change(); - })); - inv.setItem(33, new SWItem(Material.OAK_BUTTON, BauSystem.MESSAGE.parse("SIMULATOR_ALIGNMENT_NEGATIVE_X", player), clickType -> { // X negative - if (clickType == ClickType.DOUBLE_CLICK) return; - tntElement.align(new Vector(0.49, 0, 0)); - tntElement.change(); - })); - inv.setItem(24, new SWItem(Material.SUNFLOWER, BauSystem.MESSAGE.parse("SIMULATOR_ALIGNMENT_CENTER", player), clickType -> { // CENTER - if (clickType == ClickType.DOUBLE_CLICK) return; - tntElement.align(new Vector(0.5, 0, 0.5)); - tntElement.change(); - })); - }; - editObserver.run(); - tntElement.register(editObserver, player::closeInventory); - inv.addCloseRunnable(() -> { - tntElement.unregister(editObserver); - }); - - inv.open(); - } - - private void editProperties(Player player, TNTElement tntElement, Runnable back) { - SWInventory inv = open(player, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_EDIT_PROPERTIES", player)); - if (back != null) { - inv.setItem(36, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("SIMULATOR_BACK", player), clickType -> back.run())); - } - - String plusOneName = BauSystem.MESSAGE.parse("SIMULATOR_PLUS_ONE", player); - String minusOneName = BauSystem.MESSAGE.parse("SIMULATOR_MINUS_ONE", player); - List plusOneFiveShiftLore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_PLUS_FIVE_SHIFT", player)); - List minusOneFiveShiftLore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_MINUS_FIVE_SHIFT", player)); - List lore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_LORE", player)); - - TNTSimulator tntSimulator = SimulatorStorage.getSimulator(player); - Runnable editObserver = () -> { - // Change Count of spawned TNT - inv.setItem(10, unique(new SWItem(SWItem.getDye(10), plusOneName, plusOneFiveShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - tntElement.setCount(tntElement.getCount() + ((clickType.isShiftClick()) ? 5 : 1)); - tntElement.change(); - }))); - SWItem countItem = new SWItem(Material.TNT, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_COUNT", player, tntElement.getCount()), lore, false, clickType -> changeCount(player, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_COUNT_ANVIL_GUI_NAME", player), tntElement.getCount(), c -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - tntElement.setCount(c); - tntElement.change(); - editProperties(player, tntElement, back); - }, () -> editProperties(player, tntElement, back))); - countItem.getItemStack().setAmount(tntElement.getCount()); - inv.setItem(19, countItem); - inv.setItem(28, unique(new SWItem(SWItem.getDye(1), minusOneName, minusOneFiveShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - tntElement.setCount(tntElement.getCount() - ((clickType.isShiftClick()) ? 5 : 1)); - tntElement.change(); - }))); - - // Change TickOffset - inv.setItem(11, unique(new SWItem(SWItem.getDye(10), plusOneName, plusOneFiveShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - tntElement.setTickOffset(tntElement.getOwnTickOffset() + (clickType.isShiftClick() ? 5 : 1)); - tntElement.change(); - }))); - SWItem tickItem = new SWItem(SWItem.getMaterial("DIODE"), BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_TICK", player, tntElement.getTickOffset()), lore, false, clickType -> changeCount(player, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_TICK_ANVIL_GUI_NAME", player), tntElement.getTickOffset(), tick -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - tntElement.setTickOffset(tick - tntElement.getParentTickOffset()); - tntElement.change(); - editProperties(player, tntElement, back); - }, () -> editProperties(player, tntElement, back))); - tickItem.getItemStack().setAmount(Math.max(tntElement.getTickOffset(), 1)); - inv.setItem(20, tickItem); - inv.setItem(29, unique(new SWItem(SWItem.getDye(1), minusOneName, minusOneFiveShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - tntElement.setTickOffset(tntElement.getOwnTickOffset() - (clickType.isShiftClick() ? 5 : 1)); - tntElement.change(); - }))); - - // Change FuseTicks - inv.setItem(12, unique(new SWItem(SWItem.getDye(10), plusOneName, plusOneFiveShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - tntElement.setFuseTicks(tntElement.getFuseTicks() + (clickType.isShiftClick() ? 5 : 1)); - tntElement.change(); - }))); - SWItem fuseTickItem = new SWItem(Material.CLOCK, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_FUSE", player, tntElement.getFuseTicks()), lore, false, clickType -> changeCount(player, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_FUSE_ANVIL_GUI_NAME", player), tntElement.getFuseTicks(), tick -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - tntElement.setFuseTicks(tick); - tntElement.change(); - editProperties(player, tntElement, back); - }, () -> editProperties(player, tntElement, back))); - fuseTickItem.getItemStack().setAmount(Math.max(tntElement.getFuseTicks(), 1)); - inv.setItem(21, fuseTickItem); - inv.setItem(30, unique(new SWItem(SWItem.getDye(1), minusOneName, minusOneFiveShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - tntElement.setFuseTicks(tntElement.getFuseTicks() - (clickType.isShiftClick() ? 5 : 1)); - tntElement.change(); - }))); - - // Velocity Settings - inv.setItem(24, Material.TNT, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_VELOCITY_NAME", player), clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - if (tntElement.isXVelocity() || tntElement.isYVelocity() || tntElement.isZVelocity()) { - tntElement.setXVelocity(false); - tntElement.setYVelocity(false); - tntElement.setZVelocity(false); - } else { - tntElement.setXVelocity(true); - tntElement.setYVelocity(true); - tntElement.setZVelocity(true); - } - tntElement.change(); - }); - inv.setItem(32, new SWItem(getWool(tntElement.isXVelocity()), getColor(tntElement.isXVelocity()), BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_VELOCITY_X", player, active(player, tntElement.isXVelocity())), clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - tntElement.setXVelocity(!tntElement.isXVelocity()); - tntElement.change(); - })); - inv.setItem(15, new SWItem(getWool(tntElement.isYVelocity()), getColor(tntElement.isYVelocity()), BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_VELOCITY_Y", player, active(player, tntElement.isYVelocity())), clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - tntElement.setYVelocity(!tntElement.isYVelocity()); - tntElement.change(); - })); - inv.setItem(34, new SWItem(getWool(tntElement.isZVelocity()), getColor(tntElement.isZVelocity()), BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_VELOCITY_Z", player, active(player, tntElement.isZVelocity())), clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - tntElement.setZVelocity(!tntElement.isZVelocity()); - tntElement.change(); - })); - }; - editObserver.run(); - tntElement.register(editObserver, player::closeInventory); - inv.addCloseRunnable(() -> { - tntElement.unregister(editObserver); - }); - - inv.open(); - } - - private void editOther(Player player, TNTElement tntElement, Runnable back) { - SWInventory inv = open(player, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_EDIT_OTHER", player)); - if (back != null) { - inv.setItem(36, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("SIMULATOR_BACK", player), clickType -> back.run())); - } - - TNTSimulator tntSimulator = SimulatorStorage.getSimulator(player); - Runnable editObserver = () -> { - inv.setItem(19, new SWItem(tntElement.getOrder(), BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_ACTIVATED_NAME", player), OrderUtils.orderList(tntElement.getOrder(), player), false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - if (clickType.isShiftClick()) { - tntElement.setOrder(OrderUtils.previous(tntElement.getOrder())); - } else { - tntElement.setOrder(OrderUtils.next(tntElement.getOrder())); - } - tntElement.change(); - })); - - ChangeMaterial.show(inv, player, 21, tntElement, Material.BARREL, () -> editOther(player, tntElement, back)); - Disabled.show(inv, player, 22, tntSimulator, tntElement); - - if (!tntElement.hasParent()) { - inv.setItem(24, new SWItem(Material.TNT, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_ADD_IGNITION_PHASE", player), Arrays.asList(), false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - // Create TNTGroup - tntSimulator.getTntElementList().remove(tntElement); - Vector vector = tntElement.getOwnPosition().clone(); - int tickOffset = tntElement.getOwnTickOffset(); - TNTGroup tntGroup = new TNTGroup(vector); - tntGroup.setTickOffset(tickOffset); - tntGroup.add(tntElement); - tntElement.setTickOffset(0); - tntElement.setPosition(new Vector(0, 0, 0)); - tntSimulator.getTntElementList().add(tntGroup); - - // Add new TNT - TNTElement newElement = new TNTElement(new Vector(0, 0, 0), tntGroup, tntSimulator.getEntityServer()); - newElement.setTickOffset(1); - tntGroup.add(newElement); - - tntElement.change(); - open(player, newElement, () -> TNTSimulatorGui.open(player, null, tntGroup, () -> new ArrayList<>(tntGroup.getElements()), () -> { - TNTSimulatorGui.open(player, tntSimulator, null, () -> new ArrayList<>(tntSimulator.getTntElementList()), null); - })); - })); - } else { - inv.setItem(24, new SWItem()); - } - - inv.setItem(25, new SWItem(Material.DISPENSER, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_ADD_TNT", player), clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - Vector vector = tntElement.getOwnPosition().clone(); - TNTElement newElement = new TNTElement(vector, null, tntSimulator.getEntityServer()); - if (tntElement.hasParent()) { - newElement.setTickOffset(tntElement.getOwnTickOffset() + 1); - tntElement.getParent().add(newElement); - open(player, newElement, () -> TNTSimulatorGui.open(player, null, tntElement.getParent(), () -> new ArrayList<>(tntElement.getParent().getElements()), () -> { - TNTSimulatorGui.open(player, tntSimulator, null, () -> new ArrayList<>(tntSimulator.getTntElementList()), null); - })); - } else { - tntSimulator.getTntElementList().add(newElement); - open(player, newElement, () -> TNTSimulatorGui.open(player, tntSimulator, null, tntSimulator::getTntElementList, null)); - } - })); - - // Delete tnt - inv.setItem(44, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_REMOVE_TNT", player), clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - tntSimulator.remove(tntElement); - player.closeInventory(); - })); - }; - editObserver.run(); - tntElement.register(editObserver, player::closeInventory); - inv.addCloseRunnable(() -> { - tntElement.unregister(editObserver); - }); - - inv.open(); - } - - private String active(Player p, boolean active) { - return active ? BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_VELOCITY_ON", p) : BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_VELOCITY_OFF", p); - } - - private Material getWool(boolean b) { - return b ? Material.LIME_WOOL : Material.RED_WOOL; - } - - private byte getColor(boolean b) { - return (byte) (b ? 10 : 1); - } - - private void changeCount(Player player, String name, int defaultValue, Consumer result, Runnable failure) { - SWAnvilInv swAnvilInv = new SWAnvilInv(player, name, defaultValue + ""); - swAnvilInv.setItem(Material.PAPER); - swAnvilInv.setCallback(s -> { - try { - result.accept(Integer.parseInt(s)); - } catch (NumberFormatException e) { - failure.run(); - } - }); - swAnvilInv.open(); - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTGroupEditGUI.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTGroupEditGUI.java deleted file mode 100644 index 9c4aa70a..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTGroupEditGUI.java +++ /dev/null @@ -1,198 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2022 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.BauSystem; -import de.steamwar.bausystem.features.simulator.SimulatorStorage; -import de.steamwar.bausystem.features.simulator.TNTSimulator; -import de.steamwar.bausystem.features.simulator.gui.components.ChangeMaterial; -import de.steamwar.bausystem.features.simulator.gui.components.ChangePosition; -import de.steamwar.bausystem.features.simulator.gui.components.Disabled; -import de.steamwar.bausystem.features.simulator.tnt.SimulatorElement; -import de.steamwar.bausystem.features.simulator.tnt.TNTElement; -import de.steamwar.bausystem.features.simulator.tnt.TNTGroup; -import de.steamwar.inventory.SWAnvilInv; -import de.steamwar.inventory.SWInventory; -import de.steamwar.inventory.SWItem; -import lombok.experimental.UtilityClass; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.util.Consumer; -import org.bukkit.util.Vector; - -import java.util.Arrays; -import java.util.List; -import java.util.function.UnaryOperator; - -import static de.steamwar.bausystem.features.simulator.gui.ItemUtils.unique; - -@UtilityClass -public class TNTGroupEditGUI { - - private static final Vector X_VECTOR = new Vector(0.0625, 0, 0); - private static final Vector Y_VECTOR = new Vector(0, 0.0625, 0); - private static final Vector Z_VECTOR = new Vector(0, 0, 0.0625); - - private static final Vector FX_VECTOR = new Vector(1, 0, 0); - private static final Vector FY_VECTOR = new Vector(0, 1, 0); - private static final Vector FZ_VECTOR = new Vector(0, 0, 1); - - public void open(Player player, TNTSimulator tntSimulator, List simulatorElements, Runnable back) { - SWInventory inv = new SWInventory(player, 45, BauSystem.MESSAGE.parse("SIMULATOR_MOVE_ALL_GUI_NAME", player)); - SWItem gray = new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§f", clickType -> {}); - for (int i = 0; i < 9; i++) { - inv.setItem(i, gray); - inv.setItem(i + 36, gray); - } - - if (back != null) { - inv.setItem(36, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("SIMULATOR_BACK", player), clickType -> back.run())); - } - - String plusOneName = BauSystem.MESSAGE.parse("SIMULATOR_PLUS_ONE", player); - String minusOneName = BauSystem.MESSAGE.parse("SIMULATOR_MINUS_ONE", player); - List plusOnePixelShiftLore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_PLUS_PIXEL_SHIFT", player)); - List minusOnePixelShiftLore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_MINUS_PIXEL_SHIFT", player)); - List lore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_LORE", player)); - - Vector vector = simulatorElements.get(0).getPosition(); - - // X Position - inv.setItem(12, unique(new SWItem(SWItem.getDye(10), plusOneName, plusOnePixelShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - moveAll(simulatorElements, clickType.isShiftClick() ? X_VECTOR : FX_VECTOR); - tntSimulator.change(); - }))); - inv.setItem(21, new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_X", player, vector.getX()), lore, false, clickType -> {})); - inv.setItem(30, unique(new SWItem(SWItem.getDye(1), minusOneName, minusOnePixelShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - moveAll(simulatorElements, (clickType.isShiftClick() ? X_VECTOR : FX_VECTOR).clone().multiply(-1)); - tntSimulator.change(); - }))); - - // Y Position - inv.setItem(13, unique(new SWItem(SWItem.getDye(10), plusOneName, plusOnePixelShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - moveAll(simulatorElements, clickType.isShiftClick() ? Y_VECTOR : FY_VECTOR); - tntSimulator.change(); - }))); - inv.setItem(22, new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_Y", player, vector.getY()), lore, false, clickType -> {})); - inv.setItem(31, unique(new SWItem(SWItem.getDye(1), minusOneName, minusOnePixelShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - moveAll(simulatorElements, (clickType.isShiftClick() ? Y_VECTOR : FY_VECTOR).clone().multiply(-1)); - tntSimulator.change(); - }))); - - // Z Position - inv.setItem(14, unique(new SWItem(SWItem.getDye(10), plusOneName, plusOnePixelShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - moveAll(simulatorElements, clickType.isShiftClick() ? Z_VECTOR : FZ_VECTOR); - tntSimulator.change(); - }))); - inv.setItem(23, new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_Z", player, vector.getZ()), lore, false, clickType -> {})); - inv.setItem(32, unique(new SWItem(SWItem.getDye(1), minusOneName, minusOnePixelShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - moveAll(simulatorElements, (clickType.isShiftClick() ? Z_VECTOR : FZ_VECTOR).clone().multiply(-1)); - }))); - - inv.open(); - } - - public void moveAll(List simulatorElements, Vector vector) { - for (SimulatorElement element : simulatorElements) { - if (element instanceof TNTGroup) { - TNTGroup group = (TNTGroup) element; - group.setPosition(group.getPosition().add(vector)); - } else if (element instanceof TNTElement) { - TNTElement tntElement = (TNTElement) element; - tntElement.setPosition(tntElement.getOwnPosition().add(vector)); - } - } - } - - public void open(Player player, TNTGroup tntGroup, Runnable back) { - SWInventory inv = new SWInventory(player, 45, BauSystem.MESSAGE.parse("SIMULATOR_EDIT_GROUP_MENU", player)); - SWItem gray = new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§f", clickType -> {}); - for (int i = 0; i < 9; i++) { - inv.setItem(i, gray); - inv.setItem(i + 36, gray); - } - - if (back != null) { - inv.setItem(36, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("SIMULATOR_BACK", player), clickType -> back.run())); - } - - String plusOneName = BauSystem.MESSAGE.parse("SIMULATOR_PLUS_ONE", player); - String minusOneName = BauSystem.MESSAGE.parse("SIMULATOR_MINUS_ONE", player); - List plusOneFiveShiftLore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_PLUS_FIVE_SHIFT", player)); - List minusOneFiveShiftLore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_MINUS_FIVE_SHIFT", player)); - List lore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_LORE", player)); - - TNTSimulator tntSimulator = SimulatorStorage.getSimulator(player); - Runnable editObserver = () -> { - ChangePosition.show(inv, player, tntGroup, vectorUnaryOperator -> { - tntGroup.setPosition(vectorUnaryOperator.apply(tntGroup.getPosition())); - }, () -> open(player, tntGroup, back)); - ChangeMaterial.show(inv, player, 14, tntGroup, Material.BARREL, () -> open(player, tntGroup, back)); - Disabled.show(inv, player, 32, tntSimulator, tntGroup); - - // Change TickOffset - inv.setItem(16, new SWItem(SWItem.getDye(10), plusOneName, plusOneFiveShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - tntGroup.setTickOffset(tntGroup.getTickOffset() + (clickType.isShiftClick() ? 5 : 1)); - tntGroup.change(); - })); - SWItem tickItem = new SWItem(SWItem.getMaterial("DIODE"), BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_TICK", player, tntGroup.getTickOffset()), lore, false, clickType -> changeCount(player, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_TICK_ANVIL_GUI_NAME", player), tntGroup.getTickOffset(), tick -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - tntGroup.setTickOffset(tick); - tntGroup.change(); - open(player, tntGroup, back); - }, () -> open(player, tntGroup, back))); - tickItem.getItemStack().setAmount(Math.max(tntGroup.getTickOffset(), 1)); - inv.setItem(25, tickItem); - inv.setItem(34, new SWItem(SWItem.getDye(1), minusOneName, minusOneFiveShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - tntGroup.setTickOffset(tntGroup.getTickOffset() - (clickType.isShiftClick() ? 5 : 1)); - tntGroup.change(); - })); - }; - editObserver.run(); - tntGroup.register(editObserver, player::closeInventory); - inv.addCloseRunnable(() -> { - tntGroup.unregister(editObserver); - }); - - inv.open(); - } - - private void changeCount(Player player, String name, int defaultValue, Consumer result, Runnable failure) { - SWAnvilInv swAnvilInv = new SWAnvilInv(player, name, defaultValue + ""); - swAnvilInv.setItem(Material.PAPER); - swAnvilInv.setCallback(s -> { - try { - result.accept(Integer.parseInt(s)); - } catch (NumberFormatException e) { - failure.run(); - } - }); - swAnvilInv.open(); - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTSimulatorGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTSimulatorGui.java deleted file mode 100644 index e813580a..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTSimulatorGui.java +++ /dev/null @@ -1,216 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2022 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.BauSystem; -import de.steamwar.bausystem.configplayer.Config; -import de.steamwar.bausystem.features.simulator.SimulatorStorage; -import de.steamwar.bausystem.features.simulator.TNTSimulator; -import de.steamwar.bausystem.features.simulator.tnt.SimulatorElement; -import de.steamwar.bausystem.features.simulator.tnt.TNTElement; -import de.steamwar.bausystem.features.simulator.tnt.TNTGroup; -import de.steamwar.inventory.SWInventory; -import de.steamwar.inventory.SWItem; -import de.steamwar.inventory.SWListInv; -import lombok.experimental.UtilityClass; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.util.Vector; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.List; -import java.util.function.Supplier; - -import static de.steamwar.bausystem.features.simulator.gui.ItemUtils.unique; - -@UtilityClass -public class TNTSimulatorGui { - - private static final Vector X_VECTOR = new Vector(0.0625, 0, 0); - private static final Vector Y_VECTOR = new Vector(0, 0.0625, 0); - private static final Vector Z_VECTOR = new Vector(0, 0, 0.0625); - - private static final Vector FX_VECTOR = new Vector(1, 0, 0); - private static final Vector FY_VECTOR = new Vector(0, 1, 0); - private static final Vector FZ_VECTOR = new Vector(0, 0, 1); - - public void open(Player player, TNTSimulator currentTntSimulator, TNTGroup currentTntGroup, Supplier> simulatorElements, Runnable back) { - List> swListEntryList = new ArrayList<>(); - - int totalTNTCount = 0; - for (SimulatorElement element : simulatorElements.get()) { - swListEntryList.add(new SWListInv.SWListEntry<>(element.menu(player), element)); - totalTNTCount += element.tntCount(); - } - swListEntryList.sort(Comparator.comparing(o -> o.getObject().tick())); - - SWListInv inv = new SWListInv<>(player, BauSystem.MESSAGE.parse("SIMULATOR_GUI_NAME", player), false, swListEntryList, (clickType, simulatorElement) -> { - if (simulatorElement instanceof TNTGroup) { - TNTGroup tntGroup = (TNTGroup) simulatorElement; - open(player, null, tntGroup, () -> new ArrayList<>(tntGroup.getElements()), () -> open(player, currentTntSimulator, currentTntGroup, simulatorElements, back)); - } else { - TNTElementGUI.open(player, (TNTElement) simulatorElement, () -> open(player, currentTntSimulator, currentTntGroup, simulatorElements, back)); - } - }); - if (back != null) { - inv.setItem(47, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("SIMULATOR_BACK", player), clickType -> back.run())); - } - SWItem swItem = new SWItem(Material.TNT_MINECART, BauSystem.MESSAGE.parse("SIMULATOR_GUI_TOTAL_TNT", player, totalTNTCount), clickType -> { - }); - swItem.getItemStack().setAmount(totalTNTCount); - List elements = simulatorElements.get(); - inv.setItem(elements.isEmpty() ? 49 : 50, swItem); - if (currentTntGroup != null) { - Runnable editObserver = () -> { - List otherLore = new ArrayList<>(); - otherLore.add(""); - otherLore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_X", player, currentTntGroup.getPosition().getX())); - otherLore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_Y", player, currentTntGroup.getPosition().getY())); - otherLore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_Z", player, currentTntGroup.getPosition().getZ())); - otherLore.add(""); - otherLore.add(BauSystem.MESSAGE.parse("SIMULATOR_MATERIAL_NAME_LORE", player, currentTntGroup.getMaterial().name())); - otherLore.add(""); - otherLore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_TICK", player, currentTntGroup.getTickOffset())); - if (currentTntGroup.isDisabled()) { - otherLore.add(""); - otherLore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_DISABLED", player)); - } - inv.setItem(48, new SWItem(Material.ANVIL, BauSystem.MESSAGE.parse("SIMULATOR_EDIT_GROUP", player), otherLore, false, clickType -> { - TNTGroupEditGUI.open(player, currentTntGroup, () -> open(player, currentTntSimulator, currentTntGroup, simulatorElements, back)); - })); - }; - editObserver.run(); - currentTntGroup.register(editObserver, player::closeInventory); - inv.addCloseRunnable(() -> { - currentTntGroup.unregister(editObserver); - }); - } else { - if (!elements.isEmpty()) { - TNTSimulator tntSimulator = SimulatorStorage.getSimulator(player); - inv.setItem(48, new SWItem(Material.ANVIL, BauSystem.MESSAGE.parse("SIMULATOR_EDIT_GROUP", player), new ArrayList<>(), false, clickType -> { - TNTGroupEditGUI.open(player, tntSimulator, elements, () -> open(player, currentTntSimulator, currentTntGroup, simulatorElements, back)); - })); - } - } - if (currentTntSimulator != null) { - if (totalTNTCount > 0) { - inv.setItem(48, new SWItem(Material.MAGENTA_GLAZED_TERRACOTTA, BauSystem.MESSAGE.parse("SIMULATOR_GUI_MOVE_ALL", player), clickType -> { - moveAll(player, currentTntSimulator, () -> open(player, currentTntSimulator, currentTntGroup, simulatorElements, back)); - })); - } - - boolean simulatorAutoTrace = Config.getInstance().get(player).getPlainValueOrDefault("simulatorAutoTrace", false); - inv.setItem(47, new SWItem(simulatorAutoTrace ? Material.CHAIN_COMMAND_BLOCK : Material.COMMAND_BLOCK, BauSystem.MESSAGE.parse("SIMULATOR_GUI_AUTO_TRACE", player, simulatorAutoTrace), clickType -> { - Config.getInstance().get(player).put("simulatorAutoTrace", !simulatorAutoTrace); - open(player, currentTntSimulator, currentTntGroup, simulatorElements, back); - })); - } - - if (currentTntSimulator != null || currentTntGroup != null) { - inv.setItem(51, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("SIMULATOR_GUI_DELETE", player), clickType -> { - if (currentTntSimulator != null) { - currentTntSimulator.getTntElementList().forEach(SimulatorElement::close); - currentTntSimulator.clear(); - player.closeInventory(); - } else { - TNTSimulator tntSimulator = SimulatorStorage.getSimulator(player); - tntSimulator.remove(currentTntGroup); - } - })); - } - - inv.open(); - } - - public void moveAll(Player player, TNTSimulator tntSimulator, Runnable back) { - SWInventory inv = new SWInventory(player, 45, BauSystem.MESSAGE.parse("SIMULATOR_MOVE_ALL_GUI_NAME", player)); - SWItem gray = new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§f", clickType -> {}); - for (int i = 0; i < 9; i++) { - inv.setItem(i, gray); - inv.setItem(i + 36, gray); - } - - if (back != null) { - inv.setItem(36, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("SIMULATOR_BACK", player), clickType -> back.run())); - } - - String plusOneName = BauSystem.MESSAGE.parse("SIMULATOR_PLUS_ONE", player); - String minusOneName = BauSystem.MESSAGE.parse("SIMULATOR_MINUS_ONE", player); - List plusOnePixelShiftLore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_PLUS_PIXEL_SHIFT", player)); - List minusOnePixelShiftLore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_MINUS_PIXEL_SHIFT", player)); - List lore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_LORE", player)); - - // X Position - inv.setItem(12, unique(new SWItem(SWItem.getDye(10), plusOneName, plusOnePixelShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - moveAll(tntSimulator, clickType.isShiftClick() ? X_VECTOR : FX_VECTOR); - tntSimulator.change(); - }))); - inv.setItem(21, new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("SIMULATOR_POSITION_X", player), lore, false, clickType -> {})); - inv.setItem(30, unique(new SWItem(SWItem.getDye(1), minusOneName, minusOnePixelShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - moveAll(tntSimulator, (clickType.isShiftClick() ? X_VECTOR : FX_VECTOR).clone().multiply(-1)); - tntSimulator.change(); - }))); - - // Y Position - inv.setItem(13, unique(new SWItem(SWItem.getDye(10), plusOneName, plusOnePixelShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - moveAll(tntSimulator, clickType.isShiftClick() ? Y_VECTOR : FY_VECTOR); - tntSimulator.change(); - }))); - inv.setItem(22, new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("SIMULATOR_POSITION_Y", player), lore, false, clickType -> {})); - inv.setItem(31, unique(new SWItem(SWItem.getDye(1), minusOneName, minusOnePixelShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - moveAll(tntSimulator, (clickType.isShiftClick() ? Y_VECTOR : FY_VECTOR).clone().multiply(-1)); - tntSimulator.change(); - }))); - - // Z Position - inv.setItem(14, unique(new SWItem(SWItem.getDye(10), plusOneName, plusOnePixelShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - moveAll(tntSimulator, clickType.isShiftClick() ? Z_VECTOR : FZ_VECTOR); - tntSimulator.change(); - }))); - inv.setItem(23, new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("SIMULATOR_POSITION_Z", player), lore, false, clickType -> {})); - inv.setItem(32, unique(new SWItem(SWItem.getDye(1), minusOneName, minusOnePixelShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - moveAll(tntSimulator, (clickType.isShiftClick() ? Z_VECTOR : FZ_VECTOR).clone().multiply(-1)); - tntSimulator.change(); - }))); - - inv.open(); - } - - public void moveAll(TNTSimulator tntSimulator, Vector vector) { - for (SimulatorElement element : tntSimulator.getTntElementList()) { - if (element instanceof TNTGroup) { - TNTGroup group = (TNTGroup) element; - group.setPosition(group.getPosition().add(vector)); - } else if (element instanceof TNTElement) { - TNTElement tntElement = (TNTElement) element; - tntElement.setPosition(tntElement.getOwnPosition().add(vector)); - } - } - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/base/SimulatorBaseGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorBaseGui.java similarity index 94% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/base/SimulatorBaseGui.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorBaseGui.java index 326425de..9f79a613 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/base/SimulatorBaseGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorBaseGui.java @@ -17,10 +17,10 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.gui.base; +package de.steamwar.bausystem.features.simulator.gui.base; -import de.steamwar.bausystem.features.simulator2.SimulatorWatcher; -import de.steamwar.bausystem.features.simulator2.data.Simulator; +import de.steamwar.bausystem.features.simulator.SimulatorWatcher; +import de.steamwar.bausystem.features.simulator.data.Simulator; import de.steamwar.core.Core; import de.steamwar.inventory.SWInventory; import de.steamwar.inventory.SWItem; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/base/SimulatorPageGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorPageGui.java similarity index 95% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/base/SimulatorPageGui.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorPageGui.java index 14c2d786..e3c3ccbd 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/base/SimulatorPageGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorPageGui.java @@ -17,9 +17,9 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.gui.base; +package de.steamwar.bausystem.features.simulator.gui.base; -import de.steamwar.bausystem.features.simulator2.data.Simulator; +import de.steamwar.bausystem.features.simulator.data.Simulator; import de.steamwar.core.Core; import de.steamwar.inventory.SWItem; import org.bukkit.entity.Player; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/base/SimulatorScrollGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorScrollGui.java similarity index 96% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/base/SimulatorScrollGui.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorScrollGui.java index 4a4fb128..1c6d30e5 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/gui/base/SimulatorScrollGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorScrollGui.java @@ -17,10 +17,10 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.gui.base; +package de.steamwar.bausystem.features.simulator.gui.base; -import de.steamwar.bausystem.features.simulator2.data.Simulator; +import de.steamwar.bausystem.features.simulator.data.Simulator; import de.steamwar.core.Core; import de.steamwar.inventory.SWItem; import org.bukkit.entity.Player; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/components/ChangeMaterial.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/components/ChangeMaterial.java deleted file mode 100644 index 5c6750fc..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/components/ChangeMaterial.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2022 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.components; - -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.features.simulator.tnt.SimulatorElement; -import de.steamwar.inventory.SWInventory; -import de.steamwar.inventory.SWItem; -import de.steamwar.inventory.SWListInv; -import lombok.experimental.UtilityClass; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -@UtilityClass -public class ChangeMaterial { - - private static final List MATERIALS = new ArrayList<>(); - static { - Arrays.stream(Material.values()) - .filter(Material::isItem) - .filter(material -> !material.isLegacy()) - .forEach(MATERIALS::add); - } - - public void show(SWInventory inv, Player player, int position, SimulatorElement simulatorElement, Material defaultMaterial, Runnable back) { - inv.setItem(position, new SWItem(simulatorElement.getMaterial(), BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_MATERIAL", player), Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_MATERIAL_LORE_1", player, simulatorElement.getMaterial().name().toLowerCase()), BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_MATERIAL_LORE_2", player), BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_MATERIAL_LORE_3", player)), false, clickType -> { - if (clickType.isLeftClick()) { - List> swListEntries = new ArrayList<>(); - MATERIALS.forEach(current -> { - swListEntries.add(new SWListInv.SWListEntry<>(new SWItem(current, BauSystem.MESSAGE.parse("SIMULATOR_MATERIAL_NAME", player, current.name().toLowerCase()), Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_MATERIAL_CLICK", player)), false, ignored -> { - }), current)); - }); - SWListInv swListInv = new SWListInv<>(player, BauSystem.MESSAGE.parse("SIMULATOR_MATERIAL_GUI_NAME", player), false, swListEntries, (invClickType, material) -> { - simulatorElement.setMaterial(material); - simulatorElement.change(); - back.run(); - }); - swListInv.open(); - } else { - simulatorElement.setMaterial(defaultMaterial); - simulatorElement.change(); - } - })); - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/components/ChangePosition.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/components/ChangePosition.java deleted file mode 100644 index 16f1090c..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/components/ChangePosition.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2022 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.components; - -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.features.simulator.TNTSimulator; -import de.steamwar.bausystem.features.simulator.tnt.SimulatorElement; -import de.steamwar.inventory.SWAnvilInv; -import de.steamwar.inventory.SWInventory; -import de.steamwar.inventory.SWItem; -import lombok.experimental.UtilityClass; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.util.Consumer; -import org.bukkit.util.Vector; - -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.function.UnaryOperator; - -import static de.steamwar.bausystem.features.simulator.gui.ItemUtils.unique; - -@UtilityClass -public class ChangePosition { - - private static final Vector X_VECTOR = new Vector(0.0625, 0, 0); - private static final Vector Y_VECTOR = new Vector(0, 0.0625, 0); - private static final Vector Z_VECTOR = new Vector(0, 0, 0.0625); - - private static final Vector FX_VECTOR = new Vector(1, 0, 0); - private static final Vector FY_VECTOR = new Vector(0, 1, 0); - private static final Vector FZ_VECTOR = new Vector(0, 0, 1); - - public void show(SWInventory inv, Player player, SimulatorElement simulatorElement, Consumer> toChangeVector, Runnable back) { - String plusOneName = BauSystem.MESSAGE.parse("SIMULATOR_PLUS_ONE", player); - String minusOneName = BauSystem.MESSAGE.parse("SIMULATOR_MINUS_ONE", player); - List plusOnePixelShiftLore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_PLUS_PIXEL_SHIFT", player)); - List minusOnePixelShiftLore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_MINUS_PIXEL_SHIFT", player)); - List lore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_LORE", player)); - - // X Position - inv.setItem(10, unique(new SWItem(SWItem.getDye(10), plusOneName, plusOnePixelShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - toChangeVector.accept(vector -> { - vector.add(clickType.isShiftClick() ? X_VECTOR : FX_VECTOR); - return vector; - }); - simulatorElement.change(); - }))); - inv.setItem(19, new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_X", player, simulatorElement.getPosition().getX()), lore, false, clickType -> { - changePosition(player, simulatorElement.getPosition().getX(), x -> { - toChangeVector.accept(vector -> { - vector.setX(clamp(x)); - return vector; - }); - simulatorElement.change(); - back.run(); - }, back); - })); - inv.setItem(28, unique(new SWItem(SWItem.getDye(1), minusOneName, minusOnePixelShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - toChangeVector.accept(vector -> { - vector.subtract(clickType.isShiftClick() ? X_VECTOR : FX_VECTOR); - return vector; - }); - simulatorElement.change(); - }))); - - // Y Position - inv.setItem(11, unique(new SWItem(SWItem.getDye(10), plusOneName, plusOnePixelShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - toChangeVector.accept(vector -> { - vector.add(clickType.isShiftClick() ? Y_VECTOR : FY_VECTOR); - return vector; - }); - simulatorElement.change(); - }))); - inv.setItem(20, new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_Y", player, simulatorElement.getPosition().getY()), lore, false, clickType -> { - changePosition(player, simulatorElement.getPosition().getY(), y -> { - toChangeVector.accept(vector -> { - vector.setY(clamp(y)); - return vector; - }); - simulatorElement.change(); - back.run(); - }, back); - })); - inv.setItem(29, unique(new SWItem(SWItem.getDye(1), minusOneName, minusOnePixelShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - toChangeVector.accept(vector -> { - vector.subtract(clickType.isShiftClick() ? Y_VECTOR : FY_VECTOR); - return vector; - }); - simulatorElement.change(); - }))); - - // Z Position - inv.setItem(12, unique(new SWItem(SWItem.getDye(10), plusOneName, plusOnePixelShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - toChangeVector.accept(vector -> { - vector.add(clickType.isShiftClick() ? Z_VECTOR : FZ_VECTOR); - return vector; - }); - simulatorElement.change(); - }))); - inv.setItem(21, new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_Z", player, simulatorElement.getPosition().getZ()), lore, false, clickType -> { - changePosition(player, simulatorElement.getPosition().getZ(), z -> { - toChangeVector.accept(vector -> { - vector.setZ(clamp(z)); - return vector; - }); - simulatorElement.change(); - back.run(); - }, back); - })); - inv.setItem(30, unique(new SWItem(SWItem.getDye(1), minusOneName, minusOnePixelShiftLore, false, clickType -> { - if (clickType == ClickType.DOUBLE_CLICK) return; - toChangeVector.accept(vector -> { - vector.subtract(clickType.isShiftClick() ? Z_VECTOR : FZ_VECTOR); - return vector; - }); - simulatorElement.change(); - }))); - } - - private double clamp(double d) { - return (int) (d * 10000) * 0.0001; - } - - private void changePosition(Player player, double defaultValue, Consumer result, Runnable failure) { - SWAnvilInv swAnvilInv = new SWAnvilInv(player, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_ANVIL_GUI_NAME", player), defaultValue + ""); - swAnvilInv.setItem(Material.PAPER); - swAnvilInv.setCallback(s -> { - try { - result.accept(Double.parseDouble(s.replace(',', '.'))); - } catch (NumberFormatException e) { - failure.run(); - } - }); - swAnvilInv.open(); - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/components/Disabled.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/components/Disabled.java deleted file mode 100644 index a6798165..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/components/Disabled.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2022 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.components; - -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.features.simulator.TNTSimulator; -import de.steamwar.bausystem.features.simulator.tnt.SimulatorElement; -import de.steamwar.inventory.SWInventory; -import de.steamwar.inventory.SWItem; -import lombok.experimental.UtilityClass; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -import java.util.ArrayList; - -@UtilityClass -public class Disabled { - - public void show(SWInventory inv, Player player, int position, TNTSimulator tntSimulator, SimulatorElement simulatorElement) { - inv.setItem(position, new SWItem(simulatorElement.isDisabled() ? Material.ENDER_PEARL : Material.ENDER_EYE, BauSystem.MESSAGE.parse(simulatorElement.isDisabled() ? "SIMULATOR_TNT_SPAWN_DISABLED" : "SIMULATOR_TNT_SPAWN_ENABLED", player), new ArrayList<>(), !simulatorElement.isDisabled(), clickType -> { - simulatorElement.setDisabled(!simulatorElement.isDisabled()); - simulatorElement.change(); - })); - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimFormatSimulatorLoader.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/SimFormatSimulatorLoader.java similarity index 87% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimFormatSimulatorLoader.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/SimFormatSimulatorLoader.java index 4082850f..18089002 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimFormatSimulatorLoader.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/SimFormatSimulatorLoader.java @@ -17,16 +17,16 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.storage; +package de.steamwar.bausystem.features.simulator.storage; -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.SimulatorPhase; -import de.steamwar.bausystem.features.simulator2.data.redstone.RedstoneElement; -import de.steamwar.bausystem.features.simulator2.data.redstone.RedstonePhase; -import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement; -import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase; +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.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.data.tnt.TNTElement; +import de.steamwar.bausystem.features.simulator.data.tnt.TNTPhase; import org.bukkit.Material; import org.bukkit.util.Vector; import yapion.exceptions.YAPIONException; @@ -40,7 +40,6 @@ import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.function.Supplier; -import java.util.stream.Collectors; public class SimFormatSimulatorLoader implements SimulatorLoader { diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorFormatSimulatorLoader.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/SimulatorFormatSimulatorLoader.java similarity index 93% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorFormatSimulatorLoader.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/SimulatorFormatSimulatorLoader.java index 3783f833..a386f86d 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorFormatSimulatorLoader.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/SimulatorFormatSimulatorLoader.java @@ -17,12 +17,12 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.storage; +package de.steamwar.bausystem.features.simulator.storage; -import de.steamwar.bausystem.features.simulator2.data.Simulator; -import de.steamwar.bausystem.features.simulator2.data.SimulatorGroup; -import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement; -import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase; +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 org.bukkit.Material; import org.bukkit.util.Vector; import yapion.exceptions.YAPIONException; @@ -66,7 +66,7 @@ public class SimulatorFormatSimulatorLoader implements SimulatorLoader { } } - // file.delete(); + file.delete(); return Optional.of(Collections.singletonList(simulator)); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorLoader.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/SimulatorLoader.java similarity index 88% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorLoader.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/SimulatorLoader.java index 70659936..4c9e3f92 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorLoader.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/SimulatorLoader.java @@ -17,9 +17,9 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.storage; +package de.steamwar.bausystem.features.simulator.storage; -import de.steamwar.bausystem.features.simulator2.data.Simulator; +import de.steamwar.bausystem.features.simulator.data.Simulator; import java.io.File; import java.util.List; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorSaver.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/SimulatorSaver.java similarity index 96% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorSaver.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/SimulatorSaver.java index 9f1fadb1..67260e4f 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/SimulatorSaver.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/SimulatorSaver.java @@ -17,9 +17,9 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.storage; +package de.steamwar.bausystem.features.simulator.storage; -import de.steamwar.bausystem.features.simulator2.data.Simulator; +import de.steamwar.bausystem.features.simulator.data.Simulator; import lombok.experimental.UtilityClass; import yapion.hierarchy.output.FileOutput; import yapion.hierarchy.types.YAPIONArray; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/YAPIONFormatSimulatorLoader.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/YAPIONFormatSimulatorLoader.java similarity index 91% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/YAPIONFormatSimulatorLoader.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/YAPIONFormatSimulatorLoader.java index 6434fcc0..0c715443 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/storage/YAPIONFormatSimulatorLoader.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/YAPIONFormatSimulatorLoader.java @@ -17,12 +17,12 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator2.storage; +package de.steamwar.bausystem.features.simulator.storage; -import de.steamwar.bausystem.features.simulator2.data.Simulator; -import de.steamwar.bausystem.features.simulator2.data.SimulatorGroup; -import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement; -import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase; +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.sql.SteamwarUser; import org.bukkit.Material; import org.bukkit.util.Vector; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/SimulatorElement.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/SimulatorElement.java deleted file mode 100644 index 181e3389..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/SimulatorElement.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2022 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.tnt; - -import de.steamwar.bausystem.region.Region; -import de.steamwar.bausystem.shared.Pair; -import de.steamwar.entity.REntity; -import de.steamwar.inventory.SWItem; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.util.Vector; -import yapion.hierarchy.types.YAPIONObject; - -import java.util.*; - -public interface SimulatorElement { - - Map> observer = new HashMap<>(); - Map closeObserver = new HashMap<>(); - - YAPIONObject toYAPION(); - List getEntities(); - void getEntity(List elements, REntity entity); - - Vector getPosition(); - void setPosition(Vector position); - - void remove(TNTElement tntElement); - - SWItem menu(Player p); - boolean locations(Map>>> result, Region region, Location location); // Ticks to subtick order to spawning runnable to count of activations - int tntCount(); - int tick(); - - // Observer - default void change() { - observer.getOrDefault(this, new HashSet<>()).forEach(Runnable::run); - if (this instanceof TNTGroup) { - ((TNTGroup) this).getElements().forEach(SimulatorElement::change); - } - } - default void register(Runnable observer, Runnable close) { - SimulatorElement.observer.computeIfAbsent(this, k -> new HashSet<>()).add(observer); - SimulatorElement.closeObserver.put(observer, close); - } - default void unregister(Runnable observer) { - SimulatorElement.observer.computeIfPresent(this, (k, v) -> { - v.remove(observer); - return v.isEmpty() ? null : v; - }); - SimulatorElement.closeObserver.remove(observer); - } - default void close() { - Set allRunnables = observer.remove(this); - if (allRunnables == null) return; - allRunnables.forEach(runnable -> { - Runnable closeRunnable = closeObserver.remove(runnable); - if (closeRunnable == null) return; - closeRunnable.run(); - }); - if (this instanceof TNTGroup) { - ((TNTGroup) this).getElements().forEach(SimulatorElement::close); - } - } - - // API - Material getMaterial(); - void setMaterial(Material material); - - boolean isDisabled(); - void setDisabled(boolean disabled); -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTElement.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTElement.java deleted file mode 100644 index 666c3359..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTElement.java +++ /dev/null @@ -1,318 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2022 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.tnt; - -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.features.simulator.OrderUtils; -import de.steamwar.bausystem.features.simulator.SimulatorStorage; -import de.steamwar.bausystem.region.Region; -import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.FreezeMode; -import de.steamwar.bausystem.region.utils.RegionExtensionType; -import de.steamwar.bausystem.region.utils.RegionType; -import de.steamwar.bausystem.shared.Pair; -import de.steamwar.entity.REntity; -import de.steamwar.entity.REntityServer; -import de.steamwar.entity.RFallingBlockEntity; -import de.steamwar.inventory.SWItem; -import lombok.Getter; -import lombok.Setter; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.entity.Player; -import org.bukkit.entity.TNTPrimed; -import org.bukkit.util.Vector; -import yapion.hierarchy.types.YAPIONObject; - -import java.util.*; - -@Getter -public class TNTElement implements SimulatorElement { - - private static final World WORLD = Bukkit.getWorlds().get(0); - - private final REntityServer entityServer; - private RFallingBlockEntity entity; - TNTGroup tntGroup = null; - - private final Vector position; - private int fuseTicks = 80; - private int count = 1; - private int tickOffset = 0; - - @Setter - private boolean xVelocity = false; - - @Setter - private boolean yVelocity = false; - - @Setter - private boolean zVelocity = false; - private Material order = Material.REPEATER; - private Material material = Material.TNT; - private boolean disabled = false; - - public TNTElement(Vector position, TNTGroup tntGroup, REntityServer entityServer) { - this.entityServer = entityServer; - this.tntGroup = tntGroup; - this.position = position; - initEntity(); - } - - public TNTElement(YAPIONObject yapionObject, TNTGroup tntGroup, REntityServer entityServer) { - this.entityServer = entityServer; - this.tntGroup = tntGroup; - this.position = new Vector(yapionObject.getDoubleOrDefault("x", yapionObject.getDoubleOrDefault("positionX", 0)), yapionObject.getDoubleOrDefault("y", yapionObject.getDoubleOrDefault("positionY", 0)), yapionObject.getDoubleOrDefault("z", yapionObject.getDoubleOrDefault("positionZ", 0))); - this.disabled = yapionObject.getBooleanOrDefault("disabled", false); - this.fuseTicks = yapionObject.getIntOrDefault("fuseTicks", 80); - this.count = yapionObject.getIntOrDefault("count", 1); - this.tickOffset = yapionObject.getIntOrDefault("tickOffset", 0); - this.xVelocity = yapionObject.getBooleanOrDefault("xVelocity", false); - this.yVelocity = yapionObject.getBooleanOrDefault("yVelocity", false); - this.zVelocity = yapionObject.getBooleanOrDefault("zVelocity", false); - this.order = Material.valueOf(yapionObject.getStringOrDefault("order", yapionObject.getBooleanOrDefault("comparator", false) ? Material.COMPARATOR.name() : Material.REPEATER.name())); - this.material = Material.valueOf(yapionObject.getStringOrDefault("material", Material.TNT.name())); - initEntity(); - } - - private void initEntity() { - this.entity = new RFallingBlockEntity(entityServer, getPosition().toLocation(WORLD), Material.TNT); - this.entity.setNoGravity(true); - _updatePosition(); - } - - @Override - public YAPIONObject toYAPION() { - YAPIONObject yapionObject = new YAPIONObject(); - yapionObject.add("x", position.getX()); - yapionObject.add("y", position.getY()); - yapionObject.add("z", position.getZ()); - yapionObject.add("fuseTicks", fuseTicks); - yapionObject.add("count", count); - yapionObject.add("tickOffset", tickOffset); - yapionObject.add("xVelocity", xVelocity); - yapionObject.add("yVelocity", yVelocity); - yapionObject.add("zVelocity", zVelocity); - yapionObject.add("order", order.name()); - yapionObject.add("material", material.name()); - yapionObject.add("disabled", disabled); - return yapionObject; - } - - @Override - public List getEntities() { - if (disabled) return new ArrayList<>(); - return Arrays.asList(entity); - } - - @Override - public void getEntity(List elements, REntity entity) { - if (disabled) return; - if (this.entity.getEntityId() == entity.getEntityId() || getPosition().distanceSquared(new Vector(entity.getX(), entity.getY(), entity.getZ())) < 0.01) { - elements.add(this); - } - } - - @Override - public Vector getPosition() { - if (tntGroup != null) { - return tntGroup.getPosition().clone().add(position); - } - return position.clone(); - } - - @Override - public void setPosition(Vector position) { - this.position.setX(position.getX()); - this.position.setY(position.getY()); - this.position.setZ(position.getZ()); - _updatePosition(); - } - - void _updatePosition() { - if (disabled || (getParent() != null && getParent().isDisabled())) { - entity.move(-200000, 0, -200000, 0F, 0F, (byte) 0); - } else { - Vector position = getPosition(); - entity.move(position.getX(), position.getY(), position.getZ(), 0F, 0F, (byte) 0); - } - } - - public int getTickOffset() { - if (tntGroup != null) { - return tntGroup.getTickOffset() + tickOffset; - } - return tickOffset; - } - - @Override - public void remove(TNTElement tntElement) { - entity.die(); - } - - @Override - public SWItem menu(Player p) { - List lore = new ArrayList<>(); - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_SPAWN_LORE_1", p, count)); - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_SPAWN_LORE_2", p, getTickOffset())); - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_SPAWN_LORE_3", p, getFuseTicks())); - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_SPAWN_LORE_4", p)); - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_SPAWN_LORE_5", p, getPosition().getX())); - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_SPAWN_LORE_6", p, getPosition().getY())); - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_SPAWN_LORE_7", p, getPosition().getZ())); - if (disabled) { - lore.add(""); - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_DISABLED", p)); - } - SWItem swItem = new SWItem(material, BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_SPAWN_NAME", p), lore, disabled, null); - if (!disabled) swItem.getItemStack().setAmount(Math.max(tntCount(), 1)); - return swItem; - } - - @Override - public boolean locations(Map>>> result, Region region, Location radius) { - if (disabled) return false; - Location location = getPosition().toLocation(SimulatorStorage.WORLD); - if (region.isGlobal() && location.distanceSquared(radius) > 10000) { - return false; - } - if (!region.inRegion(location, RegionType.NORMAL, RegionExtensionType.NORMAL)) { - return false; - } - Region thisRegion = Region.getRegion(location); - if (thisRegion.getFlagStorage().get(Flag.FREEZE) == FreezeMode.ACTIVE) { - return true; - } - - result.computeIfAbsent(getTickOffset(), ignore -> new HashMap<>()) - .computeIfAbsent(OrderUtils.order(order), ignore -> new HashSet<>()) - .add(new Pair<>(() -> { - SimulatorStorage.WORLD.spawn(location, TNTPrimed.class, tntPrimed -> { - tntPrimed.setFuseTicks(fuseTicks); - if (!xVelocity) tntPrimed.setVelocity(tntPrimed.getVelocity().setX(0)); - if (!yVelocity) tntPrimed.setVelocity(tntPrimed.getVelocity().setY(0)); - if (!zVelocity) tntPrimed.setVelocity(tntPrimed.getVelocity().setZ(0)); - }); - }, count)); - return false; - } - - @Override - public int tntCount() { - return disabled ? 0 : count; - } - - @Override - public int tick() { - return getTickOffset(); - } - - public void setCount(int count) { - if (count < 0) count = 0; - if (count > 400) count = 400; - this.count = count; - } - - public int getOwnTickOffset() { - return tickOffset; - } - - public int getParentTickOffset() { - if (tntGroup != null) { - return tntGroup.getTickOffset(); - } - return 0; - } - - public void setTickOffset(int tickOffset) { - if (getTickOffset() - this.tickOffset + tickOffset < 0) { - this.tickOffset = -this.getParentTickOffset(); - return; - } - if (getTickOffset() - this.tickOffset + tickOffset > 400) { - this.tickOffset = 400 - this.getParentTickOffset(); - return; - } - this.tickOffset = tickOffset; - } - - public void setFuseTicks(int fuseTicks) { - if (fuseTicks < 0) fuseTicks = 0; - if (fuseTicks > 160) fuseTicks = 160; - this.fuseTicks = fuseTicks; - } - - public Vector getOwnPosition() { - return position.clone(); - } - - public void setOrder(Material material) { - this.order = material; - } - - public void setMaterial(Material material) { - this.material = material; - } - - public boolean hasParent() { - return tntGroup != null; - } - - public TNTGroup getParent() { - return tntGroup; - } - - public void setDisabled(boolean disabled) { - this.disabled = disabled; - _updatePosition(); - } - - public void align(Vector offset) { - Vector vector = getPosition(); - Vector parentVector = new Vector(0, 0, 0); - if (tntGroup != null) { - parentVector = tntGroup.getPosition(); - } - - if (offset.getX() != 0) { - if (vector.getX() - (int) vector.getX() == 0.49) { - vector.setX(vector.getX() + 0.02); - } - if (vector.getX() - (int) vector.getX() == -0.49) { - vector.setX(vector.getX() - 0.02); - } - vector.setX(vector.getBlockX() + offset.getX()); - } - - if (offset.getZ() != 0) { - if (vector.getZ() - (int) vector.getZ() == 0.49) { - vector.setZ(vector.getZ() + 0.02); - } - if (vector.getZ() - (int) vector.getZ() == -0.49) { - vector.setZ(vector.getZ() - 0.02); - } - vector.setZ(vector.getBlockZ() + offset.getZ()); - } - - setPosition(vector.subtract(parentVector)); - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTGroup.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTGroup.java deleted file mode 100644 index f3327578..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTGroup.java +++ /dev/null @@ -1,186 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2022 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.tnt; - -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.region.Region; -import de.steamwar.bausystem.shared.Pair; -import de.steamwar.entity.REntity; -import de.steamwar.entity.REntityServer; -import de.steamwar.inventory.SWItem; -import lombok.Getter; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.util.Vector; -import yapion.hierarchy.types.YAPIONArray; -import yapion.hierarchy.types.YAPIONObject; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -@Getter -public class TNTGroup implements SimulatorElement { - - private final Vector position; - private int tickOffset = 0; - private Material material = Material.BARREL; - private boolean disabled = false; - private List elements = new ArrayList<>(); - - public TNTGroup(Vector position) { - this.position = position; - } - - public TNTGroup(YAPIONObject yapionObject, REntityServer entityServer) { - this.position = new Vector(yapionObject.getDoubleOrDefault("x", 0), yapionObject.getDoubleOrDefault("y", 0), yapionObject.getDoubleOrDefault("z", 0)); - this.tickOffset = yapionObject.getIntOrDefault("tickOffset", 0); - this.material = Material.getMaterial(yapionObject.getStringOrDefault("material", "BARREL")); - this.disabled = yapionObject.getBooleanOrDefault("disabled", false); - YAPIONArray elements = yapionObject.getArrayOrDefault("elements", new YAPIONArray()); - for (YAPIONObject element : elements.streamObject().collect(Collectors.toList())) { - TNTElement tntElement = new TNTElement(element, this, entityServer); - this.elements.add(tntElement); - tntElement._updatePosition(); - } - } - - @Override - public YAPIONObject toYAPION() { - YAPIONObject yapionObject = new YAPIONObject(); - yapionObject.add("x", position.getX()); - yapionObject.add("y", position.getY()); - yapionObject.add("z", position.getZ()); - yapionObject.add("tickOffset", tickOffset); - yapionObject.add("material", material.name()); - yapionObject.add("disabled", disabled); - YAPIONArray yapionArray = new YAPIONArray(); - for (TNTElement element : elements) { - yapionArray.add(element.toYAPION()); - } - yapionObject.add("elements", yapionArray); - return yapionObject; - } - - public void add(TNTElement tntElement) { - tntElement.tntGroup = this; - elements.add(tntElement); - } - - @Override - public List getEntities() { - if (disabled) new ArrayList<>(); - return elements.stream().flatMap(tntElement -> tntElement.getEntities().stream()).collect(Collectors.toList()); - } - - @Override - public void getEntity(List elements, REntity entity) { - if (disabled) return; - for (TNTElement tntElement : this.elements) { - tntElement.getEntity(elements, entity); - } - } - - @Override - public Vector getPosition() { - return position.clone(); - } - - @Override - public void setPosition(Vector position) { - this.position.setX(position.getX()); - this.position.setY(position.getY()); - this.position.setZ(position.getZ()); - elements.forEach(TNTElement::_updatePosition); - } - - @Override - public void remove(TNTElement tntElement) { - if (elements.remove(tntElement)) { - tntElement.remove(tntElement); - } - } - - @Override - public SWItem menu(Player p) { - List lore = new ArrayList<>(); - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_GROUP_LORE_1", p, elements.size())); - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_GROUP_LORE_2", p, tickOffset)); - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_GROUP_LORE_3", p)); - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_GROUP_LORE_4", p, position.getX())); - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_GROUP_LORE_5", p, position.getY())); - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_GROUP_LORE_6", p, position.getZ())); - if (disabled) { - lore.add(""); - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_DISABLED", p)); - } - SWItem swItem = new SWItem(material, BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_GROUP_NAME", p), lore, disabled, null); - if (!disabled) swItem.getItemStack().setAmount(Math.max(tntCount(), 1)); - return swItem; - } - - @Override - public boolean locations(Map>>> result, Region region, Location location) { - if (disabled) return false; - for (TNTElement element : elements) { - if (element.locations(result, region, location)) { - return true; - } - } - return false; - } - - @Override - public int tntCount() { - if (disabled) return 0; - return elements.stream().mapToInt(TNTElement::tntCount).sum(); - } - - @Override - public int tick() { - return getTickOffset(); - } - - public void setTickOffset(int tickOffset) { - if (tickOffset < 0) tickOffset = 0; - if (tickOffset > 400) tickOffset = 400; - for (TNTElement tntElement : elements) { - if (tntElement.getTickOffset() - this.tickOffset + tickOffset < 0) { - tickOffset = Math.max(tickOffset, -tntElement.getOwnTickOffset()); - } - if (tntElement.getTickOffset() - this.tickOffset + tickOffset > 400) { - tickOffset = Math.min(tickOffset, 400 - tntElement.getOwnTickOffset()); - } - } - this.tickOffset = tickOffset; - } - - public void setMaterial(Material material) { - this.material = material; - } - - public void setDisabled(boolean disabled) { - this.disabled = disabled; - elements.forEach(TNTElement::_updatePosition); - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java deleted file mode 100644 index 90feb161..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorCursor.java +++ /dev/null @@ -1,416 +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.simulator2; - -import com.comphenix.tinyprotocol.Reflection; -import com.comphenix.tinyprotocol.TinyProtocol; -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.SWUtils; -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.redstone.RedstonePhase; -import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement; -import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase; -import de.steamwar.bausystem.features.simulator2.execute.SimulatorExecutor; -import de.steamwar.bausystem.features.simulator2.gui.SimulatorGroupGui; -import de.steamwar.bausystem.features.simulator2.gui.SimulatorGui; -import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorBaseGui; -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 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.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.stream.Collectors; - -@Linked -public class SimulatorCursor implements Listener { - - private final World WORLD = Bukkit.getWorlds().get(0); - private Class position = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInFlying$PacketPlayInPosition"); - private Class look = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInFlying$PacketPlayInLook"); - private Class positionLook = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInFlying$PacketPlayInPositionLook"); - - private Map cursorType = Collections.synchronizedMap(new HashMap<>()); - private Map cursors = Collections.synchronizedMap(new HashMap<>()); - - 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) { - calcCursor(event.getPlayer()); - } - - @EventHandler - public void onPlayerDropItem(PlayerDropItemEvent event) { - calcCursor(event.getPlayer()); - } - - @EventHandler - public void onPlayerItemHeld(PlayerItemHeldEvent event) { - Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> { - calcCursor(event.getPlayer()); - }, 1); - } - - @EventHandler - public void onPlayerQuit(PlayerQuitEvent event) { - cursorType.remove(event.getPlayer()); - cursors.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()); - } - } - - private synchronized void calcCursor(Player player) { - if (!isSimulatorItem(player.getInventory().getItemInMainHand()) && !isSimulatorItem(player.getInventory().getItemInOffHand())) { - removeCursor(player); - SimulatorWatcher.show(null, player); - SWUtils.sendToActionbar(player, ""); - return; - } - Simulator simulator = SimulatorStorage.getSimulator(player); - 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"); - } - return; - } - - showCursor(player, rayTraceResult, simulator != null); - } - - private synchronized void removeCursor(Player player) { - REntityServer entityServer = cursors.get(player); - if (entityServer != null) { - entityServer.getEntities().forEach(REntity::die); - } - } - - 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 getPosTNT(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 getPosRedstoneBlock(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::getPosTNT, "TNT", vector -> new TNTElement(vector).add(new TNTPhase())), - REDSTONE_BLOCK(Material.REDSTONE_BLOCK, SimulatorCursor::getPosRedstoneBlock, "Redstone Block", vector -> new RedstoneElement(vector).add(new RedstonePhase())), - ; - - private Material material; - private BiFunction position; - private String name; - private Function> elementFunction; - - public CursorType switchType() { - if (this == TNT) { - return REDSTONE_BLOCK; - } - return TNT; - } - } - - @EventHandler - public void onPlayerInteract(PlayerInteractEvent event) { - 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(simulator); - 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) { - player.sendMessage("§cThe simulator " + s + " already exists"); - 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.getElements().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.getElements().add(group); - SimulatorGui simulatorGui = new SimulatorGui(player, simulator); - element.open(player, simulator, group, simulatorGui); - SimulatorWatcher.update(simulator); - calcCursor(player); - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java deleted file mode 100644 index 7bae9ba9..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorStorage.java +++ /dev/null @@ -1,162 +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.simulator2; - -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.SWUtils; -import de.steamwar.bausystem.features.simulator2.data.Simulator; -import de.steamwar.bausystem.features.simulator2.gui.base.SimulatorPageGui; -import de.steamwar.bausystem.features.simulator2.storage.SimFormatSimulatorLoader; -import de.steamwar.bausystem.features.simulator2.storage.SimulatorFormatSimulatorLoader; -import de.steamwar.bausystem.features.simulator2.storage.SimulatorSaver; -import de.steamwar.bausystem.features.simulator2.storage.YAPIONFormatSimulatorLoader; -import de.steamwar.bausystem.utils.ItemUtils; -import de.steamwar.inventory.SWItem; -import de.steamwar.linkage.Linked; -import de.steamwar.linkage.api.Enable; -import org.bukkit.Bukkit; -import org.bukkit.NamespacedKey; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.io.File; -import java.util.*; - -@Linked -public class SimulatorStorage implements Enable { - - public static final File simulatorsDir = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "simulators"); - private static Map simulatorMap = new HashMap<>(); - private static NamespacedKey simulatorSelection = SWUtils.getNamespaceKey("simulator_selection"); - - public static Simulator getSimulator(Player player) { - Simulator simulator = getSimulator(player.getInventory().getItemInMainHand()); - if (simulator != null) return simulator; - return getSimulator(player.getInventory().getItemInOffHand()); - } - - public static Simulator getSimulator(ItemStack itemStack) { - if (!SimulatorCursor.isSimulatorItem(itemStack)) { - return null; - } - String selection = ItemUtils.getTag(itemStack, simulatorSelection); - if (selection == null) { - return null; - } - return simulatorMap.get(selection); - } - - public static Simulator getSimulator(String name) { - return simulatorMap.get(name); - } - - public static void addSimulator(String name, Simulator simulator) { - simulatorMap.putIfAbsent(name, simulator); - } - - @Override - public void enable() { - SimFormatSimulatorLoader simFormatSimulatorLoader = new SimFormatSimulatorLoader(); - SimulatorFormatSimulatorLoader simulatorFormatSimulatorLoader = new SimulatorFormatSimulatorLoader(); - YAPIONFormatSimulatorLoader yapionFormatSimulatorLoader = new YAPIONFormatSimulatorLoader(); - - for (File file : simulatorsDir.listFiles()) { - try { - List simulators = simFormatSimulatorLoader.load(file) - .orElse(null); - if (simulators != null) { - simulators.forEach(simulator -> { - simulatorMap.put(simulator.getName(), simulator); - }); - continue; - } - } catch (Exception e) { - // Ignore - } - - try { - List simulators = simulatorFormatSimulatorLoader.load(file) - .orElse(null); - if (simulators != null) { - simulators.forEach(simulator -> { - simulatorMap.put(simulator.getName(), simulator); - SimulatorSaver.saveSimulator(simulatorsDir, simulator); - }); - continue; - } - } catch (Exception e) { - // Ignore - } - - try { - List simulators = yapionFormatSimulatorLoader.load(file) - .orElse(null); - if (simulators != null) { - simulators.forEach(simulator -> { - simulatorMap.put(simulator.getName(), simulator); - SimulatorSaver.saveSimulator(simulatorsDir, simulator); - }); - } - } catch (Exception e) { - // Ignore - } - } - } - - public static void openSimulatorSelector(Player player) { - SimulatorPageGui simulatorPageGui = new SimulatorPageGui(player, null, 6 * 9, new ArrayList<>(simulatorMap.values())) { - @Override - public String baseTitle() { - return "Simulators"; - } - - @Override - public SWItem convert(Simulator simulator) { - return simulator.toItem(player, clickType -> { - setSimulator(player, simulator); - player.closeInventory(); - }); - } - }; - simulatorPageGui.open(); - } - - public static void setSimulator(Player player, Simulator simulator) { - ItemStack mainHand = player.getInventory().getItemInMainHand(); - ItemStack offHand = player.getInventory().getItemInOffHand(); - ItemStack itemStack; - if (SimulatorCursor.isSimulatorItem(mainHand)) { - itemStack = mainHand; - } else if (SimulatorCursor.isSimulatorItem(offHand)) { - itemStack = offHand; - } else { - itemStack = null; - } - if (itemStack == null) { - return; - } - - ItemUtils.setTag(itemStack, simulatorSelection, simulator.getName()); - ItemMeta itemMeta = itemStack.getItemMeta(); - itemMeta.setDisplayName(BauSystem.MESSAGE.parse("SIMULATOR_WAND_NAME_SELECTED", player, simulator.getName())); - itemStack.setItemMeta(itemMeta); - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java deleted file mode 100644 index b3f668cb..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator2/SimulatorTestCommand.java +++ /dev/null @@ -1,53 +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.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.RedstonePhase; -import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement; -import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase; -import de.steamwar.bausystem.features.simulator2.execute.SimulatorExecutor; -import de.steamwar.bausystem.features.simulator2.gui.SimulatorGui; -import de.steamwar.command.SWCommand; -import de.steamwar.linkage.Linked; -import jdk.jfr.Registered; -import org.bukkit.entity.Player; -import org.bukkit.util.Vector; - -@Linked -public class SimulatorTestCommand extends SWCommand { - - static final Simulator SIMULATOR = new Simulator("TestSim"); - - public SimulatorTestCommand() { - super("simtest"); - - SimulatorGroup group1 = new SimulatorGroup().add(new TNTElement(new Vector(-477.5, 46, 311.5)).add(new TNTPhase())); - SIMULATOR.getElements().add(group1); - - SimulatorGroup group2 = new SimulatorGroup().add(new TNTElement(new Vector(-477.5, 47, 312.5)).add(new TNTPhase())); - SIMULATOR.getElements().add(group2); - - SimulatorGroup group3 = new SimulatorGroup().add(new RedstoneElement(new Vector(-484, 47, 307)).add(new RedstonePhase())); - SIMULATOR.getElements().add(group3); - } -} From c05724efda4d2a802a8c4e0905b6142a50aaa47f Mon Sep 17 00:00:00 2001 From: yoyosource Date: Fri, 27 Oct 2023 16:34:54 +0200 Subject: [PATCH 36/48] Update SimulatorExecutor and fix many bugs --- .../bausystem/utils/TickListener15.java | 23 ++++ BauSystem_19/build.gradle | 1 + .../bausystem/utils/TickListener19.java | 51 ++++++++ .../src/de/steamwar/bausystem/BauSystem.java | 2 + .../features/simulator/SimulatorCommand.java | 2 + .../features/simulator/SimulatorCursor.java | 6 +- .../features/simulator/SimulatorStorage.java | 2 + .../features/simulator/SimulatorWatcher.java | 4 +- .../features/simulator/data/Simulator.java | 13 ++- .../simulator/data/SimulatorElement.java | 7 +- .../simulator/data/SimulatorGroup.java | 9 +- .../simulator/data/SimulatorPhase.java | 3 +- .../data/redstone/RedstonePhase.java | 50 ++++---- .../features/simulator/data/tnt/TNTPhase.java | 5 +- .../simulator/execute/SimulatorExecutor.java | 109 +++++++++++------- .../gui/SimulatorGroupChooserGui.java | 4 +- .../features/simulator/gui/SimulatorGui.java | 4 +- .../gui/SimulatorTNTSettingsGui.java | 2 +- .../storage/SimFormatSimulatorLoader.java | 4 +- .../simulator/storage/SimulatorSaver.java | 2 +- .../bausystem/utils/TickEndEvent.java | 36 ++++++ .../bausystem/utils/TickListener.java | 31 +++++ .../bausystem/utils/TickStartEvent.java | 36 ++++++ build.gradle | 4 + 24 files changed, 316 insertions(+), 94 deletions(-) create mode 100644 BauSystem_15/src/de/steamwar/bausystem/utils/TickListener15.java create mode 100644 BauSystem_19/src/de/steamwar/bausystem/utils/TickListener19.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/utils/TickEndEvent.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/utils/TickListener.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/utils/TickStartEvent.java diff --git a/BauSystem_15/src/de/steamwar/bausystem/utils/TickListener15.java b/BauSystem_15/src/de/steamwar/bausystem/utils/TickListener15.java new file mode 100644 index 00000000..f2b604ac --- /dev/null +++ b/BauSystem_15/src/de/steamwar/bausystem/utils/TickListener15.java @@ -0,0 +1,23 @@ +/* + * 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.utils; + +public class TickListener15 implements TickListener { +} diff --git a/BauSystem_19/build.gradle b/BauSystem_19/build.gradle index e7be349d..b1c37d01 100644 --- a/BauSystem_19/build.gradle +++ b/BauSystem_19/build.gradle @@ -51,6 +51,7 @@ dependencies { implementation project(":BauSystem_Main") compileOnly 'org.spigotmc:spigot-api:1.19-R0.1-SNAPSHOT' + compileOnly 'io.papermc.paper:paper-api:1.19.2-R0.1-SNAPSHOT' compileOnly 'it.unimi.dsi:fastutil:8.5.6' compileOnly 'com.mojang:datafixerupper:4.0.26' compileOnly 'io.netty:netty-all:4.1.68.Final' diff --git a/BauSystem_19/src/de/steamwar/bausystem/utils/TickListener19.java b/BauSystem_19/src/de/steamwar/bausystem/utils/TickListener19.java new file mode 100644 index 00000000..5191b38b --- /dev/null +++ b/BauSystem_19/src/de/steamwar/bausystem/utils/TickListener19.java @@ -0,0 +1,51 @@ +/* + * 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.utils; + +import com.destroystokyo.paper.event.server.ServerTickEndEvent; +import com.destroystokyo.paper.event.server.ServerTickStartEvent; +import de.steamwar.bausystem.BauSystem; +import de.steamwar.bausystem.features.tpslimit.TPSFreezeUtils; +import org.bukkit.Bukkit; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class TickListener19 implements TickListener, Listener { + + private boolean tickStartRan = false; + + public TickListener19() { + Bukkit.getPluginManager().registerEvents(this, BauSystem.getInstance()); + } + + @EventHandler + public void onServerTickStart(ServerTickStartEvent event) { + if (TPSFreezeUtils.isFrozen()) return; + Bukkit.getPluginManager().callEvent(new TickStartEvent()); + tickStartRan = true; + } + + @EventHandler + public void onServerTickEnd(ServerTickEndEvent event) { + if (!tickStartRan) return; + Bukkit.getPluginManager().callEvent(new TickEndEvent()); + tickStartRan = false; + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java b/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java index bb60156f..10b36297 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java @@ -27,6 +27,7 @@ import de.steamwar.bausystem.linkage.LinkageUtils; import de.steamwar.bausystem.region.loader.PrototypeLoader; import de.steamwar.bausystem.region.loader.RegionLoader; import de.steamwar.bausystem.region.loader.Updater; +import de.steamwar.bausystem.utils.TickListener; import de.steamwar.bausystem.worlddata.WorldData; import de.steamwar.message.Message; import lombok.Getter; @@ -76,6 +77,7 @@ public class BauSystem extends JavaPlugin implements Listener { LinkageUtils.link(); RamUsage.init(); + TickListener.impl.init(); // This could disable any watchdog stuff. We need to investigate if this is a problem. /* diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCommand.java index 5f320fc5..56991431 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCommand.java @@ -30,12 +30,14 @@ import de.steamwar.command.TypeMapper; import de.steamwar.command.TypeValidator; import de.steamwar.linkage.Linked; import de.steamwar.linkage.LinkedInstance; +import de.steamwar.linkage.MinVersion; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import java.util.Collection; @Linked +@MinVersion(19) public class SimulatorCommand extends SWCommand { @LinkedInstance diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java index 39564fa6..ff545a86 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java @@ -41,6 +41,7 @@ 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; @@ -66,6 +67,7 @@ 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); @@ -366,7 +368,7 @@ public class SimulatorCursor implements Listener { if (rayTraceResult.getHitEntity() != null) { REntity hitEntity = rayTraceResult.getHitEntity(); Vector vector = new Vector(hitEntity.getX(), hitEntity.getY(), hitEntity.getZ()); - List> elements = simulator.getElements().stream().map(SimulatorGroup::getElements).flatMap(List::stream).filter(element -> { + 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()); @@ -414,7 +416,7 @@ public class SimulatorCursor implements Listener { } SimulatorElement element = type.elementFunction.apply(vector); SimulatorGroup group = new SimulatorGroup().add(element); - simulator.getElements().add(group); + simulator.getGroups().add(group); SimulatorGui simulatorGui = new SimulatorGui(player, simulator); element.open(player, simulator, group, simulatorGui); SimulatorWatcher.update(simulator); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java index 071a2acd..9ad4701d 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java @@ -31,6 +31,7 @@ import de.steamwar.bausystem.features.simulator.storage.YAPIONFormatSimulatorLoa import de.steamwar.bausystem.utils.ItemUtils; import de.steamwar.inventory.SWItem; import de.steamwar.linkage.Linked; +import de.steamwar.linkage.MinVersion; import de.steamwar.linkage.api.Enable; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -44,6 +45,7 @@ import java.io.IOException; import java.util.*; @Linked +@MinVersion(19) public class SimulatorStorage implements Enable { public static final File simulatorsDir = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "simulators"); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorWatcher.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorWatcher.java index 1a3f3987..4ea413d8 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorWatcher.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorWatcher.java @@ -28,6 +28,7 @@ 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; @@ -73,6 +74,7 @@ public class SimulatorWatcher { } @Linked + @MinVersion(19) public static class QuitListener implements Listener { @EventHandler @@ -87,7 +89,7 @@ public class SimulatorWatcher { return null; } Map>> positionCache = new HashMap<>(); - simulator.getElements().stream().map(group -> group.getElements().stream().map(element -> new Pair<>(group, element)).collect(Collectors.toList())).flatMap(List::stream).forEach(pair -> { + 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(); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/Simulator.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/Simulator.java index 75e79765..91b7a8e1 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/Simulator.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/Simulator.java @@ -31,6 +31,7 @@ import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.BiConsumer; @Getter @Setter @@ -39,10 +40,10 @@ public final class Simulator { private Material material = Material.BARREL; private final String name; private boolean autoTrace = false; - private final List elements = new ArrayList<>(); + private final List groups = new ArrayList<>(); public void move(int x, int y, int z) { - elements.forEach(simulatorGroup -> { + groups.forEach(simulatorGroup -> { simulatorGroup.move(x, y, z); }); } @@ -51,14 +52,14 @@ public final class Simulator { return new SWItem(material, "§e" + name, invCallback); } - public void toSimulatorActions(Map> actions) { - elements.forEach(simulatorGroup -> { - simulatorGroup.toSimulatorActions(actions); + public void toSimulatorActions(BiConsumer tickStart, BiConsumer tickEnd) { + groups.forEach(simulatorGroup -> { + simulatorGroup.toSimulatorActions(tickStart, tickEnd); }); } public Simulator add(SimulatorGroup group) { - elements.add(group); + groups.add(group); return this; } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorElement.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorElement.java index a79a7dad..df5b13a4 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorElement.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorElement.java @@ -34,6 +34,7 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Map; +import java.util.function.BiConsumer; @Getter @Setter @@ -101,17 +102,17 @@ public abstract class SimulatorElement { return new SWItem(material, "§e" + getName(player), lore, disabled, invCallback); } - public void toSimulatorActions(Map> actions) { + public void toSimulatorActions(BiConsumer tickStart, BiConsumer tickEnd) { if (disabled) return; phases.forEach(phase -> { - phase.toSimulatorActions(actions, position.clone()); + phase.toSimulatorActions(position.clone(), tickStart, tickEnd); }); } public abstract void open(Player player, Simulator simulator, SimulatorGroup group, SimulatorBaseGui back); public SimulatorGroup getGroup(Simulator simulator) { - return simulator.getElements().stream() + return simulator.getGroups().stream() .filter(simulatorGroup -> simulatorGroup.getElements().contains(this)) .findFirst() .orElse(null); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorGroup.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorGroup.java index 3b09e8b3..0e90903c 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorGroup.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorGroup.java @@ -31,6 +31,7 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Map; +import java.util.function.BiConsumer; @Getter @Setter @@ -40,7 +41,9 @@ public final class SimulatorGroup { private final List> elements = new ArrayList<>(); public SimulatorGroup add(SimulatorElement element) { - elements.add(element); + if (!elements.contains(element)) { + elements.add(element); + } return this; } @@ -82,10 +85,10 @@ public final class SimulatorGroup { } } - public void toSimulatorActions(Map> actions) { + public void toSimulatorActions(BiConsumer tickStart, BiConsumer tickEnd) { if (disabled) return; elements.forEach(simulatorElement -> { - simulatorElement.toSimulatorActions(actions); + simulatorElement.toSimulatorActions(tickStart, tickEnd); }); } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorPhase.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorPhase.java index 33009044..b226d124 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorPhase.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorPhase.java @@ -27,6 +27,7 @@ import yapion.hierarchy.types.YAPIONObject; import java.util.List; import java.util.Map; +import java.util.function.BiConsumer; @Getter @Setter @@ -37,7 +38,7 @@ public abstract class SimulatorPhase { protected int lifetime = 80; protected int order = 0; - public abstract void toSimulatorActions(Map> actions, Vector position); + public abstract void toSimulatorActions(Vector position, BiConsumer tickStart, BiConsumer tickEnd); public void saveExtra(YAPIONObject phaseObject) {} public void loadExtra(YAPIONObject phaseObject) {} } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/redstone/RedstonePhase.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/redstone/RedstonePhase.java index f67dfb45..e54abf62 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/redstone/RedstonePhase.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/redstone/RedstonePhase.java @@ -20,6 +20,7 @@ package de.steamwar.bausystem.features.simulator.data.redstone; +import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.features.simulator.data.SimulatorPhase; import de.steamwar.bausystem.features.simulator.execute.SimulatorAction; import lombok.NoArgsConstructor; @@ -33,6 +34,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; +import java.util.function.BiConsumer; @NoArgsConstructor public final class RedstonePhase extends SimulatorPhase { @@ -46,31 +48,27 @@ public final class RedstonePhase extends SimulatorPhase { } @Override - public void toSimulatorActions(Map> actions, Vector position) { - AtomicReference previousBlockState = new AtomicReference<>(); - actions.computeIfAbsent(tickOffset, __ -> new ArrayList<>()) - .add(new SimulatorAction(0, 1) { - @Override - public void accept(World world) { - // TODO: 0 Tick Pistons not working - Block block = world.getBlockAt(position.getBlockX(), position.getBlockY(), position.getBlockZ()); - previousBlockState.set(block.getState()); - block.setType(Material.REDSTONE_BLOCK); - if (lifetime == 0) { - previousBlockState.get().update(true, true); - } - } - }); - - if (lifetime == 0) { - return; - } - actions.computeIfAbsent(tickOffset + lifetime, __ -> new ArrayList<>()) - .add(new SimulatorAction(0, 1) { - @Override - public void accept(World world) { - previousBlockState.get().update(true, true); - } - }); + public void toSimulatorActions(Vector position, BiConsumer tickStart, BiConsumer tickEnd) { + AtomicReference blockState = new AtomicReference<>(); + tickStart.accept(tickOffset, new SimulatorAction(order, 1) { + @Override + public void accept(World world) { + Block block = world.getBlockAt(position.getBlockX(), position.getBlockY(), position.getBlockZ()); + blockState.set(block.getState()); + block.setType(Material.REDSTONE_BLOCK); + } + }); + tickEnd.accept(tickOffset + lifetime, new SimulatorAction(0, 1) { + @Override + public void accept(World world) { + BlockState state = blockState.get(); + if (state != null) { + state.update(true, true); + } else { + Block block = world.getBlockAt(position.getBlockX(), position.getBlockY(), position.getBlockZ()); + block.setType(Material.AIR); + } + } + }); } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTPhase.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTPhase.java index d776edb8..7583834b 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTPhase.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTPhase.java @@ -32,6 +32,7 @@ import yapion.hierarchy.types.YAPIONObject; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.BiConsumer; @Getter @Setter @@ -57,8 +58,8 @@ public final class TNTPhase extends SimulatorPhase { } @Override - public void toSimulatorActions(Map> actions, Vector position) { - actions.computeIfAbsent(tickOffset, __ -> new ArrayList<>()).add(new SimulatorAction(order, count) { + public void toSimulatorActions(Vector position, BiConsumer tickStart, BiConsumer tickEnd) { + tickStart.accept(tickOffset, new SimulatorAction(order, count) { @Override public void accept(World world) { TNTPrimed tnt = world.spawn(position.toLocation(world), TNTPrimed.class); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/SimulatorExecutor.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/SimulatorExecutor.java index 65f15009..cbc848e4 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/SimulatorExecutor.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/SimulatorExecutor.java @@ -19,63 +19,88 @@ package de.steamwar.bausystem.features.simulator.execute; -import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.features.simulator.data.Simulator; -import lombok.experimental.UtilityClass; +import de.steamwar.bausystem.features.tpslimit.TPSUtils; +import de.steamwar.bausystem.utils.TickEndEvent; +import de.steamwar.bausystem.utils.TickStartEvent; +import de.steamwar.linkage.Linked; +import de.steamwar.linkage.MinVersion; import org.bukkit.Bukkit; import org.bukkit.World; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; import java.util.*; -import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; -@UtilityClass -public class SimulatorExecutor { +@Linked +@MinVersion(19) +public class SimulatorExecutor implements Listener { private static final World WORLD = Bukkit.getWorlds().get(0); private static Set currentlyRunning = new HashSet<>(); + private static Map>> tickStartActions = new HashMap<>(); + private static Map> tickEndActions = new HashMap<>(); - public boolean run(Simulator simulator) { + public static boolean run(Simulator simulator) { if (currentlyRunning.contains(simulator)) return false; + currentlyRunning.add(simulator); - Map> map = new HashMap<>(); - simulator.toSimulatorActions(map); - - Map>> actions = new HashMap<>(); - map.forEach((integer, simulatorActions) -> { - simulatorActions.forEach(simulatorAction -> { - actions.computeIfAbsent(integer, __ -> new HashMap<>()).computeIfAbsent(simulatorAction.getOrder(), __ -> new ArrayList<>()).add(simulatorAction); - }); + long currentTick = TPSUtils.currentRealTick.get(); + AtomicLong lastTick = new AtomicLong(); + simulator.toSimulatorActions((tickOffset, simulatorAction) -> { + lastTick.set(Math.max(lastTick.get(), tickOffset)); + tickStartActions.computeIfAbsent(currentTick + tickOffset, __ -> new HashMap<>()) + .computeIfAbsent(simulatorAction.getOrder(), __ -> new ArrayList<>()) + .add(simulatorAction); + }, (tickOffset, simulatorAction) -> { + lastTick.set(Math.max(lastTick.get(), tickOffset)); + tickEndActions.computeIfAbsent(currentTick + tickOffset, __ -> new ArrayList<>()) + .add(simulatorAction); }); - AtomicInteger tick = new AtomicInteger(); - BauSystem.runTaskTimer(BauSystem.getInstance(), bukkitTask -> { - if (actions.isEmpty()) { - bukkitTask.cancel(); - currentlyRunning.remove(simulator); - return; - } - - int currentTick = tick.getAndIncrement(); - Map> actionsToRun = actions.remove(currentTick); - if (actionsToRun == null) return; - List keys = new ArrayList<>(actionsToRun.keySet()); - keys.sort(null); - - for (int actionKey : keys) { - List keyedActions = actionsToRun.get(actionKey); - while (!keyedActions.isEmpty()) { - Collections.shuffle(keyedActions); - for (int i = keyedActions.size() - 1 ; i >= 0; i--) { - SimulatorAction action = keyedActions.get(i); - action.accept(WORLD); - action.setCount(action.getCount() - 1); - if (action.getCount() == 0) { - keyedActions.remove(i); - } + tickEndActions.computeIfAbsent(currentTick + lastTick.get() + 4, __ -> new ArrayList<>()) + .add(new SimulatorAction(0, 1) { + @Override + public void accept(World world) { + currentlyRunning.remove(simulator); } - } - } - }, 0, 1); + }); return true; } + + @EventHandler + public void onTickStart(TickStartEvent event) { + long currentTick = TPSUtils.currentRealTick.get(); + Map> actionsToRun = tickStartActions.remove(currentTick); + if (actionsToRun == null) return; + + List keys = new ArrayList<>(actionsToRun.keySet()); + keys.sort(null); + for (int actionKey : keys) { + runActions(actionsToRun.get(actionKey)); + } + } + + @EventHandler + public void onTickEnd(TickEndEvent event) { + long currentTick = TPSUtils.currentRealTick.get() - 1; + List actionsToRun = tickEndActions.remove(currentTick); + if (actionsToRun == null) return; + runActions(actionsToRun); + } + + private void runActions(List actionsToRun) { + while (!actionsToRun.isEmpty()) { + Collections.shuffle(actionsToRun); + for (int i = actionsToRun.size() - 1 ; i >= 0; i--) { + SimulatorAction action = actionsToRun.get(i); + action.accept(WORLD); + action.setCount(action.getCount() - 1); + if (action.getCount() == 0) { + actionsToRun.remove(i); + } + } + } + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupChooserGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupChooserGui.java index c431420c..9778c6c6 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupChooserGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupChooserGui.java @@ -39,7 +39,7 @@ 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.getElements().stream().filter(e -> e != parent).collect(Collectors.toList())); + super(player, simulator, 6 * 9, simulator.getGroups().stream().filter(e -> e != parent).collect(Collectors.toList())); this.subject = subject; this.parent = parent; this.back = back; @@ -53,7 +53,7 @@ public class SimulatorGroupChooserGui extends SimulatorPageGui { inventory.setItem(49, new SWItem(Material.BARRIER, "§cRemove from Group", clickType -> { SimulatorGroup newParent = new SimulatorGroup(); newParent.add(subject); - simulator.getElements().add(newParent); + simulator.getGroups().add(newParent); parent.getElements().remove(subject); back.open(); SimulatorWatcher.update(simulator); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGui.java index dfc612ec..e35f0eaa 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGui.java @@ -31,7 +31,7 @@ import org.bukkit.entity.Player; public class SimulatorGui extends SimulatorPageGui { public SimulatorGui(Player player, Simulator simulator) { - super(player, simulator, 6 * 9, simulator.getElements()); + super(player, simulator, 6 * 9, simulator.getGroups()); } @Override @@ -41,7 +41,7 @@ public class SimulatorGui extends SimulatorPageGui { @Override public void headerAndFooter() { - if (simulator.getElements().removeIf(element -> element.getElements().isEmpty() || element.getElements().stream().allMatch(simulatorElement -> simulatorElement.getPhases().isEmpty()))) { + if (simulator.getGroups().removeIf(element -> element.getElements().isEmpty() || element.getElements().stream().allMatch(simulatorElement -> simulatorElement.getPhases().isEmpty()))) { SimulatorWatcher.update(simulator); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java index e1698c6f..d880ca5e 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java @@ -32,7 +32,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class SimulatorTNTSettingsGui extends SimulatorBaseGui { +public class SimulatorTNTSettingsGui extends SimulatorBaseGui { // TODO: Anvil GUI's! private final TNTElement tnt; private final SimulatorBaseGui back; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/SimFormatSimulatorLoader.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/SimFormatSimulatorLoader.java index 18089002..15af2e4a 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/SimFormatSimulatorLoader.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/SimFormatSimulatorLoader.java @@ -83,8 +83,8 @@ public class SimFormatSimulatorLoader implements SimulatorLoader { elements.streamObject().forEach(elementObject -> { SimulatorElement element; Supplier phaseConstructor; - Vector position = new Vector(groupObject.getDouble("x"), groupObject.getDouble("y"), groupObject.getDouble("z")); - String type = groupObject.getPlainValue("type"); + Vector position = new Vector(elementObject.getDouble("x"), elementObject.getDouble("y"), elementObject.getDouble("z")); + String type = elementObject.getPlainValue("type"); switch (type) { case "TNT": element = new TNTElement(position); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/SimulatorSaver.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/SimulatorSaver.java index 67260e4f..285be22f 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/SimulatorSaver.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/storage/SimulatorSaver.java @@ -37,7 +37,7 @@ public class SimulatorSaver { simulatorObject.add("autoTrace", simulator.isAutoTrace()); YAPIONArray groups = new YAPIONArray(); - simulator.getElements().forEach(group -> { + simulator.getGroups().forEach(group -> { YAPIONObject groupObject = new YAPIONObject(); groupObject.add("material", group.getMaterial().name()); groupObject.add("disabled", group.isDisabled()); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/utils/TickEndEvent.java b/BauSystem_Main/src/de/steamwar/bausystem/utils/TickEndEvent.java new file mode 100644 index 00000000..11b90f80 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/utils/TickEndEvent.java @@ -0,0 +1,36 @@ +/* + * 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.utils; + +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class TickEndEvent extends Event { + + private static final HandlerList handlers = new HandlerList(); + + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/utils/TickListener.java b/BauSystem_Main/src/de/steamwar/bausystem/utils/TickListener.java new file mode 100644 index 00000000..029a2e5c --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/utils/TickListener.java @@ -0,0 +1,31 @@ +/* + * 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.utils; + +import de.steamwar.bausystem.BauSystem; +import de.steamwar.core.VersionDependent; + +public interface TickListener { + + TickListener impl = VersionDependent.getVersionImpl(BauSystem.getInstance()); + + default void init() { + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/utils/TickStartEvent.java b/BauSystem_Main/src/de/steamwar/bausystem/utils/TickStartEvent.java new file mode 100644 index 00000000..1134a832 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/utils/TickStartEvent.java @@ -0,0 +1,36 @@ +/* + * 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.utils; + +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class TickStartEvent extends Event { + + private static final HandlerList handlers = new HandlerList(); + + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +} diff --git a/build.gradle b/build.gradle index 48c8df51..5ce3ebaf 100644 --- a/build.gradle +++ b/build.gradle @@ -61,6 +61,10 @@ allprojects { maven { url = uri('https://libraries.minecraft.net') } + + maven { + url = uri("https://repo.papermc.io/repository/maven-public/") + } } } From 402de21c4722a3858438acda2e7fd18c91bc5bf6 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Fri, 27 Oct 2023 16:43:03 +0200 Subject: [PATCH 37/48] Add order to SimulatorRedstonePhaseSettingsGui --- .../gui/SimulatorRedstonePhaseSettingsGui.java | 17 +++++++++-------- .../gui/SimulatorTNTPhaseSettingsGui.java | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java index 3a03deed..7103cb59 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java @@ -21,9 +21,11 @@ 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.gui.base.SimulatorBaseGui; +import de.steamwar.core.Core; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -106,22 +108,21 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { }); //Order - /* int order = redstone.getOrder(); - inventory.setItem(14, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + inventory.setItem(13, 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); }); - SWItem orderItem = new SWItem(Material.COMPASS, "§eOrder§8:§7 " + order, clickType -> { + 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 -> { }); - orderItem.getItemStack().setAmount(Math.max(1, Math.min(order, 64))); - inventory.setItem(23, orderItem); + orderItem.getItemStack().setAmount(Math.max(1, Math.min(Math.abs(order), 30))); + inventory.setItem(22, orderItem); - inventory.setItem(32, SWItem.getDye(order > 1 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { - redstone.setOrder(Math.max(1, order - (clickType.isShiftClick() ? 5 : 1))); + inventory.setItem(31, 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); }); - */ } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java index 149fb599..4022c82b 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java @@ -138,7 +138,7 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(22, orderItem); inventory.setItem(31, SWItem.getDye(order > -SimulatorPhase.ORDER_LIMIT ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { - tnt.setOrder(Math.max(-30, order - (clickType.isShiftClick() ? 5 : 1))); + tnt.setOrder(Math.max(-SimulatorPhase.ORDER_LIMIT, order - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }); From b379f8457de1f18d44eae829323f74c3c4916345 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Fri, 27 Oct 2023 16:46:56 +0200 Subject: [PATCH 38/48] Fix simulator double activation while tnt still present --- .../bausystem/features/simulator/data/tnt/TNTPhase.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTPhase.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTPhase.java index 7583834b..34ae0572 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTPhase.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTPhase.java @@ -69,6 +69,11 @@ public final class TNTPhase extends SimulatorPhase { tnt.setFuseTicks(lifetime); } }); + tickEnd.accept(tickOffset + lifetime, new SimulatorAction(0, 1) { + @Override + public void accept(World world) { + } + }); } @Override From a0859923f01ea10f842cd09e1d24fe07f529b046 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Fri, 27 Oct 2023 17:41:10 +0200 Subject: [PATCH 39/48] Add SimulatorAnvilGui and add anvil gui's to everything --- .../simulator/execute/SimulatorExecutor.java | 21 ++++++ .../gui/SimulatorGroupSettingsGui.java | 7 ++ .../SimulatorRedstonePhaseSettingsGui.java | 20 +++++ .../gui/SimulatorRedstoneSettingsGui.java | 22 ++++++ .../gui/SimulatorTNTPhaseSettingsGui.java | 26 +++++++ .../gui/SimulatorTNTSettingsGui.java | 22 ++++++ .../simulator/gui/base/SimulatorAnvilGui.java | 73 +++++++++++++++++++ .../features/tracer/record/Recorder.java | 4 + .../tracer/record/SingleTraceRecorder.java | 2 +- 9 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorAnvilGui.java diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/SimulatorExecutor.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/SimulatorExecutor.java index cbc848e4..893161f4 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/SimulatorExecutor.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/SimulatorExecutor.java @@ -20,7 +20,12 @@ package de.steamwar.bausystem.features.simulator.execute; 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.tpslimit.TPSUtils; +import de.steamwar.bausystem.features.tracer.record.Recorder; +import de.steamwar.bausystem.features.tracer.record.SingleTraceRecorder; +import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.utils.TickEndEvent; import de.steamwar.bausystem.utils.TickStartEvent; import de.steamwar.linkage.Linked; @@ -66,6 +71,22 @@ public class SimulatorExecutor implements Listener { currentlyRunning.remove(simulator); } }); + + if (simulator.isAutoTrace()) { + simulator.getGroups() + .stream() + .map(SimulatorGroup::getElements) + .flatMap(List::stream) + .map(SimulatorElement::getPosition) + .map(pos -> pos.toLocation(WORLD)) + .map(Region::getRegion) + .distinct() + .forEach(region -> { + if (Recorder.INSTANCE.isDisabled(region)) { + Recorder.INSTANCE.set(region, new SingleTraceRecorder(region)); + } + }); + } return true; } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupSettingsGui.java index 2aa11e98..4c1e8d74 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupSettingsGui.java @@ -22,6 +22,7 @@ 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.gui.base.SimulatorAnvilGui; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.inventory.SWItem; import org.bukkit.Material; @@ -70,6 +71,12 @@ public class SimulatorGroupSettingsGui extends SimulatorBaseGui { SimulatorWatcher.update(simulator); }); SWItem baseTick = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + baseTicks, clickType -> { + new SimulatorAnvilGui<>(player, "Ticks", baseTicks + "", Integer::parseInt, integer -> { + if (integer < 0) return false; + simulatorGroup.changeBaseTicks(integer - baseTicks); + SimulatorWatcher.update(simulator); + return true; + }, this).setItem(Material.REPEATER).open(); }); baseTick.getItemStack().setAmount(Math.max(1, Math.min(baseTicks, 64))); inventory.setItem(18, baseTick); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java index 7103cb59..07f55a73 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java @@ -24,6 +24,7 @@ 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.gui.base.SimulatorAnvilGui; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.core.Core; import de.steamwar.inventory.SWItem; @@ -81,6 +82,12 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { }); 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; + redstone.setTickOffset(integer); + SimulatorWatcher.update(simulator); + return true; + }, this).setItem(Material.REPEATER).open(); }); offsetItem.getItemStack().setAmount(Math.max(1, Math.min(offset, 64))); inventory.setItem(20, offsetItem); @@ -98,6 +105,12 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { }); 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; + redstone.setLifetime(integer); + SimulatorWatcher.update(simulator); + return true; + }, this).setItem(Material.CLOCK).open(); }); lifetimeItem.getItemStack().setAmount(Math.max(1, Math.min(lifetime, 64))); inventory.setItem(21, lifetimeItem); @@ -116,6 +129,13 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { 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; + redstone.setOrder(integer); + SimulatorWatcher.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); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneSettingsGui.java index eb0ea99e..184d73a1 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneSettingsGui.java @@ -22,6 +22,7 @@ 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.gui.base.SimulatorAnvilGui; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.inventory.SWItem; import org.bukkit.Material; @@ -68,6 +69,12 @@ public class SimulatorRedstoneSettingsGui extends SimulatorBaseGui { SimulatorWatcher.update(simulator); }); SWItem baseTick = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + baseTicks, clickType -> { + new SimulatorAnvilGui<>(player, "Ticks", baseTicks + "", Integer::parseInt, integer -> { + if (integer < 0) return false; + redstone.changeBaseTicks(integer - baseTicks); + SimulatorWatcher.update(simulator); + return true; + }, this).setItem(Material.REPEATER).open(); }); baseTick.getItemStack().setAmount(Math.max(1, Math.min(baseTicks, 64))); inventory.setItem(18, baseTick); @@ -86,6 +93,11 @@ public class SimulatorRedstoneSettingsGui extends SimulatorBaseGui { SimulatorWatcher.update(simulator); }); 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); + return true; + }, this).open(); })); inventory.setItem(33, SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { redstone.move(clickType.isShiftClick() ? -5 : -1, 0, 0); @@ -98,6 +110,11 @@ public class SimulatorRedstoneSettingsGui extends SimulatorBaseGui { SimulatorWatcher.update(simulator); }); 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); + return true; + }, this).open(); })); inventory.setItem(34, SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { redstone.move(0, clickType.isShiftClick() ? -5 : -1, 0); @@ -110,6 +127,11 @@ public class SimulatorRedstoneSettingsGui extends SimulatorBaseGui { SimulatorWatcher.update(simulator); }); 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); + return true; + }, this).open(); })); inventory.setItem(35, SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { redstone.move(0, 0, clickType.isShiftClick() ? -5 : -1); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java index 4022c82b..6541c112 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java @@ -24,6 +24,7 @@ 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.gui.base.SimulatorAnvilGui; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.core.Core; import de.steamwar.inventory.SWItem; @@ -81,6 +82,12 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { }); SWItem countItem = new SWItem(Material.TNT, "§eCount§8:§7 " + count, clickType -> { + new SimulatorAnvilGui<>(player, "Count", count + "", Integer::parseInt, integer -> { + if (integer < 0) return false; + tnt.setCount(integer); + SimulatorWatcher.update(simulator); + return true; + }, this).setItem(Material.TNT).open(); }); countItem.getItemStack().setAmount(Math.max(1, Math.min(count, 64))); inventory.setItem(18, countItem); @@ -98,6 +105,12 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { }); 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; + tnt.setTickOffset(integer); + SimulatorWatcher.update(simulator); + return true; + }, this).setItem(Material.REPEATER).open(); }); offsetItem.getItemStack().setAmount(Math.max(1, Math.min(offset, 64))); inventory.setItem(19, offsetItem); @@ -115,6 +128,12 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { }); SWItem lifetimeItem = new SWItem(Material.CLOCK, "§eLifetime§8:§7 " + lifetime, clickType -> { + new SimulatorAnvilGui<>(player, "Lifetime", lifetime + "", Integer::parseInt, integer -> { + if (integer < 0) return false; + tnt.setLifetime(integer); + SimulatorWatcher.update(simulator); + return true; + }, this).setItem(Material.CLOCK).open(); }); lifetimeItem.getItemStack().setAmount(Math.max(1, Math.min(lifetime, 64))); inventory.setItem(20, lifetimeItem); @@ -133,6 +152,13 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { 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; + tnt.setOrder(integer); + SimulatorWatcher.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); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java index d880ca5e..20f695e4 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java @@ -22,6 +22,7 @@ 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.gui.base.SimulatorAnvilGui; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.inventory.SWItem; import org.bukkit.Material; @@ -78,6 +79,12 @@ public class SimulatorTNTSettingsGui extends SimulatorBaseGui { // TODO: Anvil G SimulatorWatcher.update(simulator); }); SWItem baseTick = new SWItem(Material.REPEATER, "§eTicks§8:§7 " + baseTicks, clickType -> { + new SimulatorAnvilGui<>(player, "Ticks", baseTicks + "", Integer::parseInt, integer -> { + if (integer < 0) return false; + tnt.changeBaseTicks(integer - baseTicks); + SimulatorWatcher.update(simulator); + return true; + }, this).setItem(Material.REPEATER).open(); }); baseTick.getItemStack().setAmount(Math.max(1, Math.min(baseTicks, 64))); inventory.setItem(18, baseTick); @@ -124,6 +131,11 @@ public class SimulatorTNTSettingsGui extends SimulatorBaseGui { // TODO: Anvil G SimulatorWatcher.update(simulator); }); 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); + return true; + }, this).open(); })); 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); @@ -136,6 +148,11 @@ public class SimulatorTNTSettingsGui extends SimulatorBaseGui { // TODO: Anvil G SimulatorWatcher.update(simulator); }); 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); + return true; + }, this).open(); })); 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); @@ -148,6 +165,11 @@ public class SimulatorTNTSettingsGui extends SimulatorBaseGui { // TODO: Anvil G SimulatorWatcher.update(simulator); }); 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); + return true; + }, this).open(); })); 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); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorAnvilGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorAnvilGui.java new file mode 100644 index 00000000..e492a304 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorAnvilGui.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.simulator.gui.base; + +import de.steamwar.bausystem.BauSystem; +import de.steamwar.inventory.SWAnvilInv; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import java.util.Objects; +import java.util.function.Consumer; +import java.util.function.Function; + +public class SimulatorAnvilGui { + + private SWAnvilInv anvilInv; + + public SimulatorAnvilGui(Player player, String title, String defaultText, Function mapper, Function value, SimulatorBaseGui back) { + if (defaultText == null) { + anvilInv = new SWAnvilInv(player, title); + } else { + anvilInv = new SWAnvilInv(player, title, defaultText); + } + anvilInv.addCloseCallback(() -> { + Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> { + back.open(); + }, 0); + }); + anvilInv.setCallback(s -> { + T t; + try { + t = mapper.apply(s); + } catch (NumberFormatException e) { + new SimulatorAnvilGui<>(player, title, s, mapper, value, back).open(); + return; + } + try { + if (!value.apply(t)) { + new SimulatorAnvilGui<>(player, title, s, mapper, value, back).open(); + } + } finally { + back.open(); + } + }); + } + + public SimulatorAnvilGui setItem(Material material) { + anvilInv.setItem(material); + return this; + } + + public void open() { + anvilInv.open(); + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/record/Recorder.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/record/Recorder.java index 1bd04377..1a310d35 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/record/Recorder.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/record/Recorder.java @@ -86,6 +86,10 @@ public class Recorder implements Listener { return get(tntTraceRecorderMap.computeIfAbsent(tntPrimed, e -> Region.getRegion(e.getLocation()))); } + public boolean isDisabled(Region region) { + return !regionTraceRecorderMap.containsKey(region); + } + public TraceRecorder get(Region region) { return regionTraceRecorderMap.getOrDefault(region, DISABLED); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/record/SingleTraceRecorder.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/record/SingleTraceRecorder.java index 6eae0b06..046f0368 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/record/SingleTraceRecorder.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/record/SingleTraceRecorder.java @@ -36,7 +36,7 @@ public class SingleTraceRecorder extends AutoTraceRecorder { @Override protected boolean shouldStartRecording(StartType startType) { - return startType == StartType.EXPLODE; + return startType == StartType.IGNITE; } @Override From 08839343c36e80ff155b0efddf400a6333d21d40 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Fri, 27 Oct 2023 17:43:59 +0200 Subject: [PATCH 40/48] Fix SimulatorSettingsGui click on XYZ --- .../features/simulator/gui/SimulatorSettingsGui.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorSettingsGui.java index 45b2e22a..ccb00412 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorSettingsGui.java @@ -65,7 +65,8 @@ public class SimulatorSettingsGui extends SimulatorBaseGui { simulator.move(clickType.isShiftClick() ? 5 : 1, 0, 0); SimulatorWatcher.update(simulator); }); - inventory.setItem(24, new SWItem(Material.PAPER, "§eX")); + inventory.setItem(24, new SWItem(Material.PAPER, "§eX", clickType -> { + })); 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); @@ -76,7 +77,8 @@ public class SimulatorSettingsGui extends SimulatorBaseGui { simulator.move(0, clickType.isShiftClick() ? 5 : 1, 0); SimulatorWatcher.update(simulator); }); - inventory.setItem(25, new SWItem(Material.PAPER, "§eY")); + inventory.setItem(25, new SWItem(Material.PAPER, "§eY", clickType -> { + })); 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); @@ -87,7 +89,8 @@ public class SimulatorSettingsGui extends SimulatorBaseGui { simulator.move(0, 0, clickType.isShiftClick() ? 5 : 1); SimulatorWatcher.update(simulator); }); - inventory.setItem(26, new SWItem(Material.PAPER, "§eZ")); + inventory.setItem(26, new SWItem(Material.PAPER, "§eZ", clickType -> { + })); 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); From 98455a29cefd785b79ff08053c74c86271a3623f Mon Sep 17 00:00:00 2001 From: yoyosource Date: Fri, 27 Oct 2023 17:48:02 +0200 Subject: [PATCH 41/48] Fix source/target compatibility --- BauSystem_19/build.gradle | 4 ++-- BauSystem_20/build.gradle | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/BauSystem_19/build.gradle b/BauSystem_19/build.gradle index b1c37d01..7973f1b0 100644 --- a/BauSystem_19/build.gradle +++ b/BauSystem_19/build.gradle @@ -27,8 +27,8 @@ version '1.0' compileJava.options.encoding = 'UTF-8' -sourceCompatibility = 11 -targetCompatibility = 11 +sourceCompatibility = 17 +targetCompatibility = 17 sourceSets { main { diff --git a/BauSystem_20/build.gradle b/BauSystem_20/build.gradle index be167e64..17121b8d 100644 --- a/BauSystem_20/build.gradle +++ b/BauSystem_20/build.gradle @@ -27,8 +27,8 @@ version '1.0' compileJava.options.encoding = 'UTF-8' -sourceCompatibility = 11 -targetCompatibility = 11 +sourceCompatibility = 17 +targetCompatibility = 17 sourceSets { main { From 5686b6bc4030711f87946bfbba51fcf6a35cebb2 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Fri, 27 Oct 2023 17:50:33 +0200 Subject: [PATCH 42/48] Fix source/target compatibility --- BauSystem_19/build.gradle | 2 +- BauSystem_20/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/BauSystem_19/build.gradle b/BauSystem_19/build.gradle index 7973f1b0..900fce9d 100644 --- a/BauSystem_19/build.gradle +++ b/BauSystem_19/build.gradle @@ -28,7 +28,7 @@ version '1.0' compileJava.options.encoding = 'UTF-8' sourceCompatibility = 17 -targetCompatibility = 17 +targetCompatibility = 11 sourceSets { main { diff --git a/BauSystem_20/build.gradle b/BauSystem_20/build.gradle index 17121b8d..b2620127 100644 --- a/BauSystem_20/build.gradle +++ b/BauSystem_20/build.gradle @@ -28,7 +28,7 @@ version '1.0' compileJava.options.encoding = 'UTF-8' sourceCompatibility = 17 -targetCompatibility = 17 +targetCompatibility = 11 sourceSets { main { From 8fb4a4669ad12f0ec2b9a47f132fae1438597cf9 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Fri, 27 Oct 2023 17:55:13 +0200 Subject: [PATCH 43/48] Fix source/target compatibility --- BauSystem_15/build.gradle | 4 ++-- BauSystem_18/build.gradle | 4 ++-- BauSystem_19/build.gradle | 2 +- BauSystem_20/build.gradle | 2 +- BauSystem_Linkage/build.gradle | 4 ++-- BauSystem_Main/build.gradle | 4 ++-- build.gradle | 4 ++-- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/BauSystem_15/build.gradle b/BauSystem_15/build.gradle index 180c7022..d0acd9b2 100644 --- a/BauSystem_15/build.gradle +++ b/BauSystem_15/build.gradle @@ -27,8 +27,8 @@ version '1.0' compileJava.options.encoding = 'UTF-8' -sourceCompatibility = 11 -targetCompatibility = 11 +sourceCompatibility = 17 +targetCompatibility = 17 sourceSets { main { diff --git a/BauSystem_18/build.gradle b/BauSystem_18/build.gradle index 8fb54099..4ac724e0 100644 --- a/BauSystem_18/build.gradle +++ b/BauSystem_18/build.gradle @@ -27,8 +27,8 @@ version '1.0' compileJava.options.encoding = 'UTF-8' -sourceCompatibility = 11 -targetCompatibility = 11 +sourceCompatibility = 17 +targetCompatibility = 17 sourceSets { main { diff --git a/BauSystem_19/build.gradle b/BauSystem_19/build.gradle index 900fce9d..7973f1b0 100644 --- a/BauSystem_19/build.gradle +++ b/BauSystem_19/build.gradle @@ -28,7 +28,7 @@ version '1.0' compileJava.options.encoding = 'UTF-8' sourceCompatibility = 17 -targetCompatibility = 11 +targetCompatibility = 17 sourceSets { main { diff --git a/BauSystem_20/build.gradle b/BauSystem_20/build.gradle index b2620127..17121b8d 100644 --- a/BauSystem_20/build.gradle +++ b/BauSystem_20/build.gradle @@ -28,7 +28,7 @@ version '1.0' compileJava.options.encoding = 'UTF-8' sourceCompatibility = 17 -targetCompatibility = 11 +targetCompatibility = 17 sourceSets { main { diff --git a/BauSystem_Linkage/build.gradle b/BauSystem_Linkage/build.gradle index de3818a5..7b54641a 100644 --- a/BauSystem_Linkage/build.gradle +++ b/BauSystem_Linkage/build.gradle @@ -27,8 +27,8 @@ version '1.0' compileJava.options.encoding = 'UTF-8' -sourceCompatibility = 11 -targetCompatibility = 11 +sourceCompatibility = 17 +targetCompatibility = 17 sourceSets { main { diff --git a/BauSystem_Main/build.gradle b/BauSystem_Main/build.gradle index bf61d861..38432993 100644 --- a/BauSystem_Main/build.gradle +++ b/BauSystem_Main/build.gradle @@ -27,8 +27,8 @@ version '1.0' compileJava.options.encoding = 'UTF-8' -sourceCompatibility = 11 -targetCompatibility = 11 +sourceCompatibility = 17 +targetCompatibility = 17 sourceSets { main { diff --git a/build.gradle b/build.gradle index 5ce3ebaf..5b8a3f12 100644 --- a/build.gradle +++ b/build.gradle @@ -37,8 +37,8 @@ version '' compileJava.options.encoding = 'UTF-8' compileJava.options.compilerArgs << '-parameter' -sourceCompatibility = 11 -targetCompatibility = 11 +sourceCompatibility = 17 +targetCompatibility = 17 mainClassName = '' From 11fdd08f799f6565e9935a51c4778fb2143e22a1 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Fri, 27 Oct 2023 21:08:02 +0200 Subject: [PATCH 44/48] Fix some stuff and layout --- .../features/simulator/SimulatorCursor.java | 3 +-- .../features/simulator/SimulatorWatcher.java | 8 ++++++-- .../gui/SimulatorRedstonePhaseSettingsGui.java | 12 ++++++------ .../simulator/gui/SimulatorTNTPhaseSettingsGui.java | 4 ++-- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java index ff545a86..2f4b0f8b 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java @@ -141,8 +141,7 @@ public class SimulatorCursor implements Listener { public synchronized void calcCursor(Player player) { if (!isSimulatorItem(player.getInventory().getItemInMainHand()) && !isSimulatorItem(player.getInventory().getItemInOffHand())) { - if (removeCursor(player)) { - SimulatorWatcher.show(null, player); + if (removeCursor(player) || SimulatorWatcher.show(null, player)) { SWUtils.sendToActionbar(player, ""); } return; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorWatcher.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorWatcher.java index 4ea413d8..d5f98986 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorWatcher.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorWatcher.java @@ -41,6 +41,7 @@ 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 @@ -104,15 +105,18 @@ public class SimulatorWatcher { return server; } - public synchronized void show(Simulator sim, Player player) { + 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; + if (sim == null) return removed.get(); entityServers.computeIfAbsent(sim, __ -> createSim(new REntityServer(), sim)).addPlayer(player); + return removed.get(); } synchronized List getEntitiesOfSimulator(Simulator simulator) { diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java index 07f55a73..70a1bf9c 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java @@ -76,7 +76,7 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { //Tick Offset int offset = redstone.getTickOffset(); - inventory.setItem(11, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + inventory.setItem(10, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { redstone.setTickOffset(offset + (clickType.isShiftClick() ? 5 : 1)); SimulatorWatcher.update(simulator); }); @@ -90,16 +90,16 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { }, this).setItem(Material.REPEATER).open(); }); offsetItem.getItemStack().setAmount(Math.max(1, Math.min(offset, 64))); - inventory.setItem(20, offsetItem); + inventory.setItem(19, offsetItem); - inventory.setItem(29, SWItem.getDye(offset > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + inventory.setItem(28, SWItem.getDye(offset > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { redstone.setTickOffset(Math.max(0, offset - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }); //Lifetime int lifetime = redstone.getLifetime(); - inventory.setItem(12, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + inventory.setItem(11, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { redstone.setLifetime(lifetime + (clickType.isShiftClick() ? 5 : 1)); SimulatorWatcher.update(simulator); }); @@ -113,9 +113,9 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { }, this).setItem(Material.CLOCK).open(); }); lifetimeItem.getItemStack().setAmount(Math.max(1, Math.min(lifetime, 64))); - inventory.setItem(21, lifetimeItem); + inventory.setItem(20, lifetimeItem); - inventory.setItem(30, SWItem.getDye(lifetime > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + inventory.setItem(29, 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); }); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java index 6541c112..01ec8b04 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java @@ -116,7 +116,7 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(19, offsetItem); inventory.setItem(28, SWItem.getDye(offset > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { - tnt.setTickOffset(Math.max(1, offset - (clickType.isShiftClick() ? 5 : 1))); + tnt.setTickOffset(Math.max(0, offset - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }); @@ -129,7 +129,7 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { SWItem lifetimeItem = new SWItem(Material.CLOCK, "§eLifetime§8:§7 " + lifetime, clickType -> { new SimulatorAnvilGui<>(player, "Lifetime", lifetime + "", Integer::parseInt, integer -> { - if (integer < 0) return false; + if (integer < 1) return false; tnt.setLifetime(integer); SimulatorWatcher.update(simulator); return true; From 06a68a70040237c11bd352add18a8af0466abd2a Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sat, 28 Oct 2023 09:56:24 +0200 Subject: [PATCH 45/48] Fix lore of sim item --- BauSystem_Main/src/BauSystem.properties | 2 +- BauSystem_Main/src/BauSystem_de.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/BauSystem_Main/src/BauSystem.properties b/BauSystem_Main/src/BauSystem.properties index ff127af6..27ca6f67 100644 --- a/BauSystem_Main/src/BauSystem.properties +++ b/BauSystem_Main/src/BauSystem.properties @@ -329,7 +329,7 @@ SIMULATOR_WAND_LORE_1 = §eRight click §8- §7Adds a position SIMULATOR_WAND_LORE_2 = §eSneaking §8- §7Free movement SIMULATOR_WAND_LORE_3 = §eLeft click §8- §7Start the simulation SIMULATOR_WAND_LORE_4 = §eRight click in air §8- §7Opens the gui -SIMULATOR_WAND_LORE_5 = §eOffhand §8- §7Simulator preview +SIMULATOR_WAND_LORE_5 = §eDouble Sneak §8- §7Swap between TNT and Redstone Block SIMULATOR_REGION_FROZEN = §cSimulator cannot be used inside frozen regions diff --git a/BauSystem_Main/src/BauSystem_de.properties b/BauSystem_Main/src/BauSystem_de.properties index de6de310..439267cf 100644 --- a/BauSystem_Main/src/BauSystem_de.properties +++ b/BauSystem_Main/src/BauSystem_de.properties @@ -321,7 +321,7 @@ SIMULATOR_WAND_LORE_1 = §eRechtsklick §8- §7Füge eine Position hinzu SIMULATOR_WAND_LORE_2 = §eSneaken §8- §7Freie Bewegung SIMULATOR_WAND_LORE_3 = §eLinksklick §8- §7Starte die Simulation SIMULATOR_WAND_LORE_4 = §eRechtsklick Luft §8- §7Öffne die GUI -SIMULATOR_WAND_LORE_5 = §eOffhand §8- §7Simulator Vorschau +SIMULATOR_WAND_LORE_5 = §eDoppel Shift §8- §7Wechsel zwischen TNT und Redstone Block SIMULATOR_REGION_FROZEN = §cSimulator kann nicht in eingefrorenen Regionen genutzt werden From fdc201e99d657d8a3715df350156ef4e33e05d3f Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sat, 28 Oct 2023 23:14:35 +0200 Subject: [PATCH 46/48] Add only similar elements inside of groups Add delete to group gui and redstone and tnt Rework SimulatorRedstoneGui Add 'Make Group' option to SimulatorTNTGui Fix Player Join server crash Add 'Create Sim' to Select Simulator Gui --- .../features/simulator/SimulatorCursor.java | 4 +- .../features/simulator/SimulatorStorage.java | 23 ++++ .../simulator/data/SimulatorElement.java | 4 +- .../simulator/data/SimulatorGroup.java | 3 +- .../data/redstone/RedstoneElement.java | 5 + .../simulator/data/tnt/TNTElement.java | 5 + .../gui/SimulatorGroupChooserGui.java | 2 +- .../simulator/gui/SimulatorGroupGui.java | 5 + .../gui/SimulatorGroupSettingsGui.java | 83 +++++++++--- .../simulator/gui/SimulatorRedstoneGui.java | 122 +++++++++++++++--- .../simulator/gui/SimulatorTNTGui.java | 32 +++-- .../simulator/gui/base/SimulatorAnvilGui.java | 21 +-- .../gui/base/SimulatorScrollGui.java | 4 +- 13 files changed, 254 insertions(+), 59 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java index 2f4b0f8b..6ff78e19 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java @@ -94,7 +94,9 @@ public class SimulatorCursor implements Listener { @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { - calcCursor(event.getPlayer()); + Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> { + calcCursor(event.getPlayer()); + }, 0); } @EventHandler diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java index 9ad4701d..9ac84989 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java @@ -29,6 +29,7 @@ import de.steamwar.bausystem.features.simulator.storage.SimulatorFormatSimulator import de.steamwar.bausystem.features.simulator.storage.SimulatorSaver; import de.steamwar.bausystem.features.simulator.storage.YAPIONFormatSimulatorLoader; import de.steamwar.bausystem.utils.ItemUtils; +import de.steamwar.inventory.SWAnvilInv; import de.steamwar.inventory.SWItem; import de.steamwar.linkage.Linked; import de.steamwar.linkage.MinVersion; @@ -133,6 +134,28 @@ public class SimulatorStorage implements Enable { return "Simulators"; } + @Override + public void headerAndFooter() { + inventory.setItem(49, new SWItem(Material.NAME_TAG, "§eCreate", clickType -> { + 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); + SimulatorStorage.setSimulator(player, sim); + }); + anvilInv.open(); + })); + } + @Override public SWItem convert(Simulator simulator) { return simulator.toItem(player, clickType -> { diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorElement.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorElement.java index df5b13a4..119143db 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorElement.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorElement.java @@ -73,7 +73,7 @@ public abstract class SimulatorElement { }); } - public void move(int x, int y, int z) { + public void move(double x, double y, double z) { position.setX(position.getX() + x); position.setY(position.getY() + y); position.setZ(position.getZ() + z); @@ -83,6 +83,8 @@ public abstract class SimulatorElement { public abstract Material getWorldDisabledMaterial(); + public abstract boolean canBeInGroup(SimulatorGroup simulatorGroup); + public Vector getWorldPos() { return position; } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorGroup.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorGroup.java index 0e90903c..8031dd1c 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorGroup.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorGroup.java @@ -30,7 +30,6 @@ import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.Comparator; import java.util.List; -import java.util.Map; import java.util.function.BiConsumer; @Getter @@ -64,7 +63,7 @@ public final class SimulatorGroup { }); } - public void move(int x, int y, int z) { + public void move(double x, double y, double z) { elements.forEach(simulatorElement -> { simulatorElement.move(x, y, z); }); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/redstone/RedstoneElement.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/redstone/RedstoneElement.java index ac130e03..2eb7aca2 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/redstone/RedstoneElement.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/redstone/RedstoneElement.java @@ -49,6 +49,11 @@ public final class RedstoneElement extends SimulatorElement { return Material.WHITE_STAINED_GLASS; } + @Override + public boolean canBeInGroup(SimulatorGroup simulatorGroup) { + return simulatorGroup.getElements().stream().allMatch(RedstoneElement.class::isInstance); + } + @Override public Vector getWorldPos() { return position.clone().add(new Vector(0.5, 0, 0.5)); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTElement.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTElement.java index 36b10130..29e90d83 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTElement.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTElement.java @@ -88,6 +88,11 @@ public final class TNTElement extends SimulatorElement { return Material.RED_STAINED_GLASS; } + @Override + public boolean canBeInGroup(SimulatorGroup simulatorGroup) { + return simulatorGroup.getElements().stream().allMatch(TNTElement.class::isInstance); + } + @Override public void open(Player player, Simulator simulator, SimulatorGroup group, SimulatorBaseGui back) { new SimulatorTNTGui(player, simulator, this, group, back).open(); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupChooserGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupChooserGui.java index 9778c6c6..fabbfac3 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupChooserGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupChooserGui.java @@ -39,7 +39,7 @@ 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).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; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupGui.java index 06df5e5e..c3b8ee1a 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupGui.java @@ -72,6 +72,11 @@ public class SimulatorGroupGui extends SimulatorPageGui> { back.open(); })); + inventory.setItem(8, new SWItem(Material.BARRIER, "§eDelete", clickType -> { + simulatorGroup.getElements().clear(); + SimulatorWatcher.update(simulator); + })); + inventory.setItem(4, simulatorGroup.toItem(player, clickType -> { if (simulatorGroup.getMaterial() == null) return; new SimulatorMaterialGui(player, simulator, simulatorGroup::getMaterial, simulatorGroup::setMaterial, this).open(); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupSettingsGui.java index 4c1e8d74..873011f9 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupSettingsGui.java @@ -22,11 +22,13 @@ 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.gui.base.SimulatorAnvilGui; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.util.Vector; import java.util.Arrays; @@ -62,7 +64,8 @@ public class SimulatorGroupSettingsGui extends SimulatorBaseGui { inventory.setItem(4, simulatorGroup.toItem(player, clickType -> { if (simulatorGroup.getMaterial() == null) return; new SimulatorMaterialGui(player, simulator, simulatorGroup::getMaterial, simulatorGroup::setMaterial, this).open(); - }, clickType -> {})); + }, clickType -> { + })); // Base Tick int baseTicks = simulatorGroup.getBaseTick(); @@ -89,36 +92,84 @@ public class SimulatorGroupSettingsGui extends SimulatorBaseGui { SimulatorWatcher.update(simulator); }); + boolean allTNT = simulatorGroup.getElements().stream().allMatch(TNTElement.class::isInstance); + + if (allTNT) { + // Subpixel Alignment + inventory.setItem(21, new SWItem(Material.SUNFLOWER, "§7Align§8: §eCenter", clickType -> { + simulatorGroup.getElements().stream().map(TNTElement.class::cast).forEach(tnt -> { + tnt.align(new Vector(0.5, 0, 0.5)); + }); + SimulatorWatcher.update(simulator); + })); + + // Z + inventory.setItem(20, new SWItem(Material.OAK_BUTTON, "§7Align§8: §eNegativ Z", clickType -> { + simulatorGroup.getElements().stream().map(TNTElement.class::cast).forEach(tnt -> { + tnt.align(new Vector(0, 0, 0.49)); + }); + SimulatorWatcher.update(simulator); + })); + + inventory.setItem(22, new SWItem(Material.OAK_BUTTON, "§7Align§8: §ePositiv Z", clickType -> { + simulatorGroup.getElements().stream().map(TNTElement.class::cast).forEach(tnt -> { + tnt.align(new Vector(0, 0, 0.51)); + }); + SimulatorWatcher.update(simulator); + })); + + // X + inventory.setItem(12, new SWItem(Material.STONE_BUTTON, "§7Align§8: §eNegativ X", clickType -> { + simulatorGroup.getElements().stream().map(TNTElement.class::cast).forEach(tnt -> { + tnt.align(new Vector(0.49, 0, 0)); + }); + SimulatorWatcher.update(simulator); + })); + + inventory.setItem(30, new SWItem(Material.STONE_BUTTON, "§7Align§8: §ePositiv X", clickType -> { + simulatorGroup.getElements().stream().map(TNTElement.class::cast).forEach(tnt -> { + tnt.align(new Vector(0.51, 0, 0)); + }); + 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); + inventory.setItem(15, 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); }); - 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); + inventory.setItem(24, new SWItem(Material.PAPER, "§eX", clickType -> { + // TODO: Change X Anvil GUI + })); + inventory.setItem(33, 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); }); //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); + inventory.setItem(16, 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); }); - 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); + inventory.setItem(25, new SWItem(Material.PAPER, "§eY", clickType -> { + // TODO: Change Y Anvil GUI + })); + inventory.setItem(34, 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); }); //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); + inventory.setItem(17, 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); }); - 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); + inventory.setItem(26, new SWItem(Material.PAPER, "§eZ", clickType -> { + // TODO: Change Z Anvil GUI + })); + inventory.setItem(35, 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); }); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneGui.java index d934df37..81cc7f4e 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneGui.java @@ -27,20 +27,25 @@ import de.steamwar.bausystem.features.simulator.data.redstone.RedstonePhase; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui; import de.steamwar.bausystem.features.simulator.gui.base.SimulatorScrollGui; import de.steamwar.inventory.SWItem; +import lombok.AllArgsConstructor; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; -public class SimulatorRedstoneGui extends SimulatorScrollGui { +public class SimulatorRedstoneGui extends SimulatorScrollGui { private final SimulatorGroup parent; private final RedstoneElement redstone; private final SimulatorBaseGui back; public SimulatorRedstoneGui(Player player, Simulator simulator, SimulatorGroup parent, RedstoneElement redstone, SimulatorBaseGui back) { - super(player, simulator, 6 * 9, redstone.getPhases()); + super(player, simulator, 6 * 9, new ArrayList<>()); this.parent = parent; this.redstone = redstone; this.back = back; @@ -59,7 +64,12 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { return; } - redstone.sort(); + data.clear(); + redstone.getPhases().forEach(redstonePhase -> { + data.add(new RedstoneSubPhase(true, redstonePhase)); + data.add(new RedstoneSubPhase(false, redstonePhase)); + }); + data.sort(null); // Back Arrow inventory.setItem(0, new SWItem(Material.ARROW, "§eBack", clickType -> { @@ -80,6 +90,11 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { } })); + inventory.setItem(8, new SWItem(Material.BARRIER, "§eDelete", clickType -> { + redstone.getPhases().clear(); + SimulatorWatcher.update(simulator); + })); + // Material Chooser inventory.setItem(4, redstone.toItem(player, clickType -> { new SimulatorMaterialGui(player, simulator, redstone::getMaterial, redstone::setMaterial, this).open(); @@ -91,11 +106,11 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { })); // Group chooser - inventory.setItem(49, new SWItem(Material.LEAD, "§eMove", clickType -> { + inventory.setItem(49, new SWItem(Material.LEAD, "§eJoin Group", clickType -> { new SimulatorGroupChooserGui(player, simulator, redstone, redstone.getGroup(simulator), this).open(); })); - //Enable/Disable + // Enable/Disable inventory.setItem(50, new SWItem(redstone.isDisabled() ? Material.ENDER_PEARL : Material.ENDER_EYE, redstone.isDisabled() ? "§cDisabled" : "§aEnabled", clickType -> { redstone.setDisabled(!redstone.isDisabled()); SimulatorWatcher.update(simulator); @@ -103,25 +118,63 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { } @Override - public SWItem[] column(RedstonePhase redstoneSetting) { - SWItem redstone = new SWItem(Material.REDSTONE_BLOCK, "§eRedstone§8:§7 " + redstoneSetting.getTickOffset(), Arrays.asList("§7Activation Time§8:§e " + redstoneSetting.getLifetime(), "", "§7Middle-Click§8:§e Remove"), false, clickType -> { - if (clickType == ClickType.MIDDLE) this.redstone.getPhases().remove(redstoneSetting); - SimulatorWatcher.update(simulator); - }); - redstone.getItemStack().setAmount(Math.max(1, Math.min(redstoneSetting.getTickOffset(), 64))); + public SWItem[] column(RedstoneSubPhase redstoneSubPhase, int index) { + // TODO: Add to the phase edit menus and split those to better reflect the scroll gui state + int min; + if (index % 2 == 0 && index > 0) { + RedstoneSubPhase subPhase = data.get(index - 1); + min = subPhase.phase.getTickOffset() + subPhase.phase.getLifetime() + 1; + } else { + min = 0; + } - 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)); + int max; + if (index % 2 == 0 && index < data.size() - 2) { + RedstoneSubPhase subPhase = data.get(index + 2); + max = subPhase.phase.getTickOffset() - redstoneSubPhase.phase.getLifetime() - 1; + } else if (index % 2 != 0 && index < data.size() - 1) { + RedstoneSubPhase subPhase = data.get(index + 1); + max = subPhase.phase.getTickOffset() - redstoneSubPhase.phase.getTickOffset() - 1; + } else { + max = Integer.MAX_VALUE - 5; + } + + List lore = new ArrayList<>(); + int time = redstoneSubPhase.phase.getTickOffset() + (redstoneSubPhase.place ? 0 : redstoneSubPhase.phase.getLifetime()); + if (redstoneSubPhase.place) { + lore.add("§7Time§8:§e " + time); + lore.add("§7Order§8:§e " + redstoneSubPhase.phase.getOrder()); + } else { + lore.add("§7Time§8:§e " + time); + lore.add("§7Activation Time§8:§e " + redstoneSubPhase.phase.getLifetime()); + } + lore.add(""); + lore.add("§7Click§8:§e Edit"); + lore.add("§7Middle-Click§8:§e Remove"); + 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); + SimulatorWatcher.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); }), 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))); + 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); }), new SWItem(Material.ANVIL, "§eEdit Activation", clickType -> { - new SimulatorRedstonePhaseSettingsGui(player, simulator, this.redstone, redstoneSetting, this).open(); + new SimulatorRedstonePhaseSettingsGui(player, simulator, this.redstone, redstoneSubPhase.phase, this).open(); }), }; } @@ -132,7 +185,7 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { addNewPhase(clickType.isShiftClick()); }), - new SWItem(Material.REDSTONE_BLOCK, "§eRedstone§8:§a New Phase", clickType -> { + new SWItem(Material.REDSTONE, "§eRedstone§8:§a New Phase", clickType -> { addNewPhase(false); }), new SWItem(SWItem.getDye(8), "§7", clickType -> { @@ -142,10 +195,39 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui { private void addNewPhase(boolean shift) { RedstonePhase lastElement = redstone.getPhases().get(redstone.getPhases().size() - 1); - RedstonePhase newPhase = new RedstonePhase(lastElement.getTickOffset() + 1); + RedstonePhase newPhase = new RedstonePhase(lastElement.getTickOffset() + lastElement.getLifetime() + 1); if (shift) newPhase.setTickOffset(newPhase.getTickOffset() + 5); - scroll++; + scroll += 2; redstone.add(newPhase); SimulatorWatcher.update(simulator); } + + @AllArgsConstructor + public static class RedstoneSubPhase implements Comparable { + private boolean place; + private RedstonePhase phase; + + @Override + public int compareTo(RedstoneSubPhase o) { + int thisTick = phase.getTickOffset() + (place ? 0 : phase.getLifetime()); + int otherTick = o.phase.getTickOffset() + (o.place ? 0 : o.phase.getLifetime()); + + int compare = Integer.compare(thisTick, otherTick); + if (compare != 0) { + return compare; + } + + if (place && !o.place) { + return -1; + } + if (!place && o.place) { + return 1; + } + if (!place) { + return 0; + } + + return Integer.compare(phase.getOrder(), o.phase.getOrder()); + } + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTGui.java index 7b9fc71a..a6d6c944 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTGui.java @@ -80,28 +80,44 @@ public class SimulatorTNTGui extends SimulatorScrollGui { } })); + inventory.setItem(8, new SWItem(Material.BARRIER, "§eDelete", clickType -> { + tnt.getPhases().clear(); + SimulatorWatcher.update(simulator); + })); + // Material Chooser inventory.setItem(4, tnt.toItem(player, clickType -> { new SimulatorMaterialGui(player, simulator, tnt::getMaterial, tnt::setMaterial, this).open(); })); - inventory.setItem(48, new SWItem(Material.REPEATER, "§eSettings", clickType -> { + inventory.setItem(47, new SWItem(Material.REPEATER, "§eSettings", clickType -> { new SimulatorTNTSettingsGui(player, simulator, tnt, this).open(); })); - inventory.setItem(49, new SWItem(Material.LEAD, "§eMove", clickType -> { + inventory.setItem(48, new SWItem(Material.LEAD, "§eJoin Group", clickType -> { new SimulatorGroupChooserGui(player, simulator, tnt, tnt.getGroup(simulator), this).open(); })); - inventory.setItem(50, new SWItem(tnt.isDisabled() ? Material.ENDER_PEARL : Material.ENDER_EYE, tnt.isDisabled() ? "§cDisabled" : "§aEnabled", clickType -> { + inventory.setItem(50, new SWItem(Material.CHEST, parent.getElements().size() == 1 ? "§eMake Group" : "§eAdd another TNT to Group", clickType -> { + TNTElement tntElement = new TNTElement(tnt.getPosition().clone()); + tntElement.add(new TNTPhase()); + parent.add(tntElement); + new SimulatorGroupGui(player, simulator, parent, new SimulatorGui(player, simulator)).open(); + SimulatorWatcher.update(simulator); + })); + inventory.setItem(51, new SWItem(tnt.isDisabled() ? Material.ENDER_PEARL : Material.ENDER_EYE, tnt.isDisabled() ? "§cDisabled" : "§aEnabled", clickType -> { tnt.setDisabled(!tnt.isDisabled()); SimulatorWatcher.update(simulator); })); } @Override - public SWItem[] column(TNTPhase 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"), "", "§7Middle-Click§8:§e Remove"), false, clickType -> { - if (clickType == ClickType.MIDDLE) this.tnt.getPhases().remove(tntSetting); - SimulatorWatcher.update(simulator); + 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(); + } }); tnt.getItemStack().setAmount(Math.min(tntSetting.getCount(), 64)); @@ -127,7 +143,7 @@ public class SimulatorTNTGui extends SimulatorScrollGui { new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { addNewPhase(clickType.isShiftClick()); }), - new SWItem(Material.TNT, "§eTNT§8:§a New Phase", clickType -> { + new SWItem(Material.GUNPOWDER, "§eTNT§8:§a New Phase", clickType -> { addNewPhase(false); }), new SWItem(SWItem.getDye(8), "§7", clickType -> { diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorAnvilGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorAnvilGui.java index e492a304..380dc618 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorAnvilGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorAnvilGui.java @@ -25,8 +25,7 @@ import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; -import java.util.Objects; -import java.util.function.Consumer; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Function; public class SimulatorAnvilGui { @@ -37,11 +36,17 @@ public class SimulatorAnvilGui { if (defaultText == null) { anvilInv = new SWAnvilInv(player, title); } else { - anvilInv = new SWAnvilInv(player, title, defaultText); + anvilInv = new SWAnvilInv(player, title + ": " + defaultText); } + AtomicBoolean error = new AtomicBoolean(); anvilInv.addCloseCallback(() -> { Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> { - back.open(); + if (error.get()) { + anvilInv.open(); + } else { + back.open(); + } + error.set(false); }, 0); }); anvilInv.setCallback(s -> { @@ -49,15 +54,15 @@ public class SimulatorAnvilGui { try { t = mapper.apply(s); } catch (NumberFormatException e) { - new SimulatorAnvilGui<>(player, title, s, mapper, value, back).open(); + error.set(true); return; } try { if (!value.apply(t)) { - new SimulatorAnvilGui<>(player, title, s, mapper, value, back).open(); + error.set(true); } - } finally { - back.open(); + } catch (Exception e) { + // Ignore } }); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorScrollGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorScrollGui.java index 1c6d30e5..a4cfbb5d 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorScrollGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/base/SimulatorScrollGui.java @@ -67,7 +67,7 @@ public abstract class SimulatorScrollGui extends SimulatorBaseGui { for (int i = 0; i < 9; i++) { if (scroll + i < data.size()) { T element = data.get(scroll + i); - SWItem[] column = column(element); + SWItem[] column = column(element, scroll + i); populateColumn(column, i); } else { SWItem[] column = lastColumn(); @@ -88,7 +88,7 @@ public abstract class SimulatorScrollGui extends SimulatorBaseGui { } } - public abstract SWItem[] column(T t); + public abstract SWItem[] column(T t, int index); public abstract SWItem[] lastColumn(); } From a0ff726fb4b40a6a86bcedfaefccd2d4c9124c70 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Fri, 15 Dec 2023 19:56:59 +0100 Subject: [PATCH 47/48] Add several Anvil Guis Fix some lifetime and offset contraints for RedstonePhases --- .../gui/SimulatorGroupChooserGui.java | 3 ++ .../gui/SimulatorGroupSettingsGui.java | 3 -- .../simulator/gui/SimulatorRedstoneGui.java | 1 - .../SimulatorRedstonePhaseSettingsGui.java | 36 ++++++++++++++----- .../gui/SimulatorTNTSettingsGui.java | 2 +- 5 files changed, 32 insertions(+), 13 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupChooserGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupChooserGui.java index fabbfac3..10396677 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupChooserGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupChooserGui.java @@ -63,6 +63,9 @@ public class SimulatorGroupChooserGui extends SimulatorPageGui { } })); } + inventory.addCloseCallback(clickType -> { + back.open(); + }); } @Override diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupSettingsGui.java index 873011f9..e9439ce9 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorGroupSettingsGui.java @@ -140,7 +140,6 @@ public class SimulatorGroupSettingsGui extends SimulatorBaseGui { SimulatorWatcher.update(simulator); }); inventory.setItem(24, new SWItem(Material.PAPER, "§eX", clickType -> { - // TODO: Change X Anvil GUI })); inventory.setItem(33, 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); @@ -153,7 +152,6 @@ public class SimulatorGroupSettingsGui extends SimulatorBaseGui { SimulatorWatcher.update(simulator); }); inventory.setItem(25, new SWItem(Material.PAPER, "§eY", clickType -> { - // TODO: Change Y Anvil GUI })); inventory.setItem(34, 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); @@ -166,7 +164,6 @@ public class SimulatorGroupSettingsGui extends SimulatorBaseGui { SimulatorWatcher.update(simulator); }); inventory.setItem(26, new SWItem(Material.PAPER, "§eZ", clickType -> { - // TODO: Change Z Anvil GUI })); inventory.setItem(35, 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); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneGui.java index 81cc7f4e..1475cee4 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneGui.java @@ -119,7 +119,6 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui 0) { RedstoneSubPhase subPhase = data.get(index - 1); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java index 70a1bf9c..27901b09 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java @@ -74,17 +74,37 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { SimulatorWatcher.update(simulator); })); + int index = redstoneElement.getPhases().indexOf(redstone); + int min; + if (index > 0) { + RedstonePhase previous = redstoneElement.getPhases().get(index - 1); + min = previous.getTickOffset() + previous.getLifetime() + 1; + } else { + min = 0; + } + + int maxLifetime; + int maxOffset; + if (index < redstoneElement.getPhases().size() - 1) { + RedstonePhase next = redstoneElement.getPhases().get(index + 1); + maxLifetime = next.getTickOffset() - redstone.getTickOffset() - 1; + maxOffset = next.getTickOffset() - redstone.getLifetime() - 1; + } else { + maxLifetime = Integer.MAX_VALUE - 5; + maxOffset = Integer.MAX_VALUE - 5; + } + //Tick Offset int offset = redstone.getTickOffset(); - inventory.setItem(10, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { - redstone.setTickOffset(offset + (clickType.isShiftClick() ? 5 : 1)); + inventory.setItem(10, 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); }); 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; - redstone.setTickOffset(integer); + redstone.setTickOffset(Math.min(Math.max(integer, min), maxOffset)); SimulatorWatcher.update(simulator); return true; }, this).setItem(Material.REPEATER).open(); @@ -92,22 +112,22 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { offsetItem.getItemStack().setAmount(Math.max(1, Math.min(offset, 64))); inventory.setItem(19, offsetItem); - inventory.setItem(28, SWItem.getDye(offset > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { - redstone.setTickOffset(Math.max(0, offset - (clickType.isShiftClick() ? 5 : 1))); + inventory.setItem(28, 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); }); //Lifetime int lifetime = redstone.getLifetime(); - inventory.setItem(11, SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { - redstone.setLifetime(lifetime + (clickType.isShiftClick() ? 5 : 1)); + inventory.setItem(11, 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); }); 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; - redstone.setLifetime(integer); + redstone.setLifetime(Math.min(integer, maxLifetime)); SimulatorWatcher.update(simulator); return true; }, this).setItem(Material.CLOCK).open(); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java index 20f695e4..1dcf005c 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java @@ -33,7 +33,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class SimulatorTNTSettingsGui extends SimulatorBaseGui { // TODO: Anvil GUI's! +public class SimulatorTNTSettingsGui extends SimulatorBaseGui { private final TNTElement tnt; private final SimulatorBaseGui back; From 52fcb69e1e781bc3e89284889893949ee9853033 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sat, 16 Dec 2023 12:27:33 +0100 Subject: [PATCH 48/48] Optimize imports --- .../features/simulator/data/redstone/RedstonePhase.java | 4 ---- .../bausystem/features/simulator/data/tnt/TNTPhase.java | 3 --- 2 files changed, 7 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/redstone/RedstonePhase.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/redstone/RedstonePhase.java index e54abf62..f2b99d36 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/redstone/RedstonePhase.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/redstone/RedstonePhase.java @@ -20,7 +20,6 @@ package de.steamwar.bausystem.features.simulator.data.redstone; -import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.features.simulator.data.SimulatorPhase; import de.steamwar.bausystem.features.simulator.execute.SimulatorAction; import lombok.NoArgsConstructor; @@ -30,9 +29,6 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.util.Vector; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiConsumer; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTPhase.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTPhase.java index 34ae0572..4af3dc15 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTPhase.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTPhase.java @@ -29,9 +29,6 @@ import org.bukkit.entity.TNTPrimed; import org.bukkit.util.Vector; import yapion.hierarchy.types.YAPIONObject; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; import java.util.function.BiConsumer; @Getter