From c0163d813ed131468ee0f4c72fd699c23fd49f48 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Tue, 28 Oct 2025 23:00:53 +0100 Subject: [PATCH 01/62] Add WindchargeStopper to handle wind charge entity removal based on fight boundaries Signed-off-by: Chaoscaot --- .../listener/WindchargeStopper21.java | 51 +++++++++++++++++++ .../listener/WindchargeStopper8.java | 27 ++++++++++ .../listener/WindchargeStopper.java | 37 ++++++++++++++ 3 files changed, 115 insertions(+) create mode 100644 FightSystem/FightSystem_21/src/de/steamwar/fightsystem/listener/WindchargeStopper21.java create mode 100644 FightSystem/FightSystem_8/src/de/steamwar/fightsystem/listener/WindchargeStopper8.java create mode 100644 FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/WindchargeStopper.java diff --git a/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/listener/WindchargeStopper21.java b/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/listener/WindchargeStopper21.java new file mode 100644 index 00000000..90ae8a54 --- /dev/null +++ b/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/listener/WindchargeStopper21.java @@ -0,0 +1,51 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2025 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.fightsystem.listener; + +import de.steamwar.fightsystem.Config; +import de.steamwar.fightsystem.states.FightState; +import de.steamwar.fightsystem.states.StateDependentTask; +import net.minecraft.world.entity.projectile.windcharge.WindCharge; +import org.bukkit.Location; + +public class WindchargeStopper21 implements WindchargeStopper.IWindchargeStopper { + @Override + public void init() { + new StateDependentTask(true, FightState.Running, this::run, 1, 1); + } + + private static final int middleLine = Config.SpecSpawn.getBlockZ(); + + private static final Class windChargeClass = WindCharge.class; + + private void run() { + Recording.iterateOverEntities(windChargeClass::isInstance, entity -> { + Location location = entity.getLocation(); + Location prevLocation = location.clone().subtract(entity.getVelocity()); + + boolean passedMiddle = location.getBlockZ() > middleLine && prevLocation.getBlockZ() > middleLine || + location.getBlockZ() < middleLine && prevLocation.getBlockZ() < middleLine; + + if(!passedMiddle) { + entity.remove(); + } + }); + } +} diff --git a/FightSystem/FightSystem_8/src/de/steamwar/fightsystem/listener/WindchargeStopper8.java b/FightSystem/FightSystem_8/src/de/steamwar/fightsystem/listener/WindchargeStopper8.java new file mode 100644 index 00000000..c8863680 --- /dev/null +++ b/FightSystem/FightSystem_8/src/de/steamwar/fightsystem/listener/WindchargeStopper8.java @@ -0,0 +1,27 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2025 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.fightsystem.listener; + +public class WindchargeStopper8 implements WindchargeStopper.IWindchargeStopper { + @Override + public void init() { + + } +} diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/WindchargeStopper.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/WindchargeStopper.java new file mode 100644 index 00000000..d0301006 --- /dev/null +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/WindchargeStopper.java @@ -0,0 +1,37 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2025 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.fightsystem.listener; + +import de.steamwar.core.VersionDependent; +import de.steamwar.fightsystem.FightSystem; +import de.steamwar.linkage.Linked; + +@Linked +public class WindchargeStopper { + private static final IWindchargeStopper impl = VersionDependent.getVersionImpl(FightSystem.getPlugin()); + + public WindchargeStopper() { + impl.init(); + } + + public interface IWindchargeStopper { + void init(); + } +} From 25116c3865f9fe9a36102162338bb479796a4370 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Sat, 3 Jan 2026 02:30:36 +0100 Subject: [PATCH 02/62] Add CreateKitCommand Signed-off-by: Chaoscaot --- .../features/dev/CreateKitCommand.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/dev/CreateKitCommand.java diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/dev/CreateKitCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/dev/CreateKitCommand.java new file mode 100644 index 00000000..2f0fc185 --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/dev/CreateKitCommand.java @@ -0,0 +1,63 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2026 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.dev; + +import de.steamwar.command.SWCommand; +import de.steamwar.linkage.Linked; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; + +import java.io.File; +import java.io.IOException; + +@Linked +public class CreateKitCommand extends SWCommand { + public CreateKitCommand() { + super("createkit"); + if (System.getProperty("user.name").equals("minecraft")) { + unregister(); + } + } + + @Register + public void onCommand(Player player, String name) { + YamlConfiguration yaml = new YamlConfiguration(); + + yaml.set("Items", player.getInventory().getContents()); + yaml.set("Armor", player.getInventory().getArmorContents()); + yaml.set("Effects", player.getActivePotionEffects()); + yaml.set("LeaderAllowed", true); + yaml.set("MemberAllowed", true); + yaml.set("EnterStage", 0); + yaml.set("TNT", true); + + YamlConfiguration kits = new YamlConfiguration(); + + kits.set("Kits." + name, yaml); + + try { + kits.save(new File("new.kits.yaml")); + + player.sendMessage("Kit created!"); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} From 46a11af6ca8bddacb1eb3812bd3a9e1037598b1f Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Mon, 2 Feb 2026 19:12:34 +0100 Subject: [PATCH 03/62] Fix Ban Command Signed-off-by: Chaoscaot --- CommonCore/SQL/src/de/steamwar/sql/BannedUserIPs.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CommonCore/SQL/src/de/steamwar/sql/BannedUserIPs.kt b/CommonCore/SQL/src/de/steamwar/sql/BannedUserIPs.kt index 495238ad..032f02d0 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/BannedUserIPs.kt +++ b/CommonCore/SQL/src/de/steamwar/sql/BannedUserIPs.kt @@ -35,7 +35,11 @@ import java.time.Instant object BannedUserIPsTable: CompositeIdTable("BannedUserIPs") { val userId = reference("UserID", SteamwarUserTable) val timestamp = timestamp("Timestamp") - val ip = varchar("IP", 45) + val ip = varchar("IP", 45).entityId() + + init { + addIdColumn(userId) + } override val primaryKey = PrimaryKey(userId, ip) } From 30b7bbc2837945fe8a158cac0a49a5638f7fce94 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Mon, 9 Feb 2026 09:28:14 +0100 Subject: [PATCH 04/62] Fix WebPW Command Signed-off-by: Chaoscaot --- CommonCore/SQL/src/de/steamwar/sql/SteamwarUser.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CommonCore/SQL/src/de/steamwar/sql/SteamwarUser.kt b/CommonCore/SQL/src/de/steamwar/sql/SteamwarUser.kt index fdd8204c..b135ab97 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/SteamwarUser.kt +++ b/CommonCore/SQL/src/de/steamwar/sql/SteamwarUser.kt @@ -186,10 +186,10 @@ class SteamwarUser(id: EntityID): IntEntity(id) { val salt = ByteArray(16) random.nextBytes(salt) - val saltString = Base64.getEncoder().encode(salt) + val saltString = Base64.getEncoder().encodeToString(salt) val hash = generateHash(value, salt) - val hashString = Base64.getEncoder().encode(hash) + val hashString = Base64.getEncoder().encodeToString(hash) useDb { passwordInternal = "$hashString:$saltString" From bce07a4ac826eff72624da4773e92594a17ac6a3 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sun, 1 Mar 2026 21:36:29 +0100 Subject: [PATCH 05/62] Add GameModeConfig.ArenaConfig.WaterDamage for hard water damage by setting air or normal handling --- CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java | 8 ++++++++ .../src/de/steamwar/fightsystem/listener/Permanent.java | 1 + 2 files changed, 9 insertions(+) diff --git a/CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java b/CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java index 2a737508..dc4e7300 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java +++ b/CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java @@ -402,6 +402,13 @@ public final class GameModeConfig { */ public final int WaterDepth; + /** + * If TNT should break blocks even underwater + * + * @implSpec {@code true} by default + */ + public final boolean WaterDamage; + /** * The outer border of the arena, measured in blocks around the schematic areas */ @@ -457,6 +464,7 @@ public final class GameModeConfig { private ArenaConfig(YMLWrapper loader, SchematicConfig.SizeConfig Size, List EnterStages) { loaded = loader.canLoad(); WaterDepth = loader.getInt("WaterDepth", 0); + WaterDamage = loader.getBoolean("WaterDamage", true); Schem2Border = new Schem2BorderConfig(loader.with("Schem2Border")); SpawnOffset = new SpawnOffsetConfig(loader.with("SpawnOffset"), Size); BorderFromSchematic = loader.getInt("BorderFromSchematic", 21); diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Permanent.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Permanent.java index f878e12c..9d353d30 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Permanent.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Permanent.java @@ -182,6 +182,7 @@ public class Permanent implements Listener { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onExplosion(EntityExplodeEvent e) { if (!(e.getEntity() instanceof TNTPrimed)) return; + if (!Config.GameModeConfig.Arena.WaterDamage) return; e.blockList().removeIf(block -> { if(block.getType() == Material.TNT) { return false; From 5d245810384c87fba8d83955e39b8673ae6268ff Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sun, 1 Mar 2026 21:47:22 +0100 Subject: [PATCH 06/62] Fix WaterRemover.handleEntityExplode --- .../src/de/steamwar/fightsystem/listener/WaterRemover.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/WaterRemover.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/WaterRemover.java index c8dda3cb..84d5cab2 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/WaterRemover.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/WaterRemover.java @@ -73,7 +73,7 @@ public class WaterRemover implements Listener { event.setYield(0); //No drops (additionally to world config) FightTeam spawn = tnt.remove(event.getEntity().getEntityId()); - if(spawn != null && !spawn.getExtendRegion().inRegion(event.getLocation())) { + if(Config.GameModeConfig.Arena.WaterDamage && spawn != null && !spawn.getExtendRegion().inRegion(event.getLocation())) { Block b = event.getLocation().getBlock(); for(int y = -1; y <= 1; y++) { for(int z = -1; z <= 1; z++) { From 008ff1091f491e3125dbe8ce0ebd7b219eadf3d7 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Mon, 2 Mar 2026 11:59:52 +0100 Subject: [PATCH 07/62] Hotfix DevCommand --- .../src/de/steamwar/velocitycore/commands/DevCommand.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/VelocityCore/src/de/steamwar/velocitycore/commands/DevCommand.java b/VelocityCore/src/de/steamwar/velocitycore/commands/DevCommand.java index 45479c39..724eb925 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/commands/DevCommand.java +++ b/VelocityCore/src/de/steamwar/velocitycore/commands/DevCommand.java @@ -128,8 +128,10 @@ public class DevCommand extends SWCommand { if (serverFiles != null) { for (String serverFile : serverFiles) { String[] server = serverFile.split("\\."); + int version = Integer.parseInt(server[2]); + if (version == 0) continue; devServerPorts.put(server[0], Integer.parseInt(server[1])); - devServerVersions.put(server[0], Integer.parseInt(server[2])); + devServerVersions.put(server[0], version); } } From a750185df0e86c8f2c5e25a51038de924a6b4932 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Mon, 2 Mar 2026 12:10:18 +0100 Subject: [PATCH 08/62] Fix stop not working for DevServer starter --- buildSrc/src/steamwar.devserver.gradle | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/steamwar.devserver.gradle b/buildSrc/src/steamwar.devserver.gradle index b712fd73..19c2570d 100644 --- a/buildSrc/src/steamwar.devserver.gradle +++ b/buildSrc/src/steamwar.devserver.gradle @@ -109,11 +109,11 @@ class DevServer extends DefaultTask { Finalizer() { super() doLast { - running = false if (processInput != null) { processInput.write(template.endsWith("Velocity") ? "end\n" : "stop\n") processInput.flush() } + running = false } } } @@ -245,10 +245,12 @@ class DevServer extends DefaultTask { processInput.newLine() processInput.flush() } - processInput.close() }).start() process.waitFor() + if (processInput != null) { + processInput.close() + } processInput = null running = false } From ab85c72fe3b1786596f6a11f69e7be7d0df184ac Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Fri, 13 Mar 2026 21:08:00 +0100 Subject: [PATCH 09/62] Fix DesignEndStone Closes: #292 Closes: #288 --- .../features/design/endstone/DesignEndStone.java | 15 ++++++--------- .../SQL/src/de/steamwar/sql/GameModeConfig.java | 4 ++-- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/design/endstone/DesignEndStone.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/design/endstone/DesignEndStone.java index fe529864..a4836c33 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/design/endstone/DesignEndStone.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/design/endstone/DesignEndStone.java @@ -31,10 +31,7 @@ import org.bukkit.Material; import org.bukkit.World; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; public class DesignEndStone { @@ -56,12 +53,12 @@ public class DesignEndStone { this.maxY = region.getBuildArea().getMaxPoint(false).getY(); this.maxZ = region.getBuildArea().getMaxPoint(false).getZ(); - limited = region.getGameModeConfig().Schematic.Limited - .entrySet() - .stream() - .filter(entry -> entry.getValue() == 0) - .flatMap(entry -> entry.getKey().stream()) + limited = Arrays.stream(Material.values()) + .filter(Material::isBlock) + .filter(material -> !material.isLegacy()) + .filter(material -> material.getBlastResistance() > region.getGameModeConfig().Schematic.MaxDesignBlastResistance) .collect(Collectors.toSet()); + System.out.println(limited); calculateFromBottom = region.getGameModeConfig().Arena.NoFloor; entityServer.setCallback((player, rEntity, entityAction) -> { diff --git a/CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java b/CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java index dc4e7300..e0b942ef 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java +++ b/CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java @@ -649,7 +649,7 @@ public final class GameModeConfig { /** * Maximal blast resistance for the design blocks * - * @implSpec {@code Double.MAX_VALUE} by default + * @implSpec {@link SchematicConfig#MaxBlastResistance} by default */ public final double MaxDesignBlastResistance; @@ -679,7 +679,7 @@ public final class GameModeConfig { MaxBlocks = loader.getInt("MaxBlocks", 0); MaxDispenserItems = loader.getInt("MaxDispenserItems", 128); MaxBlastResistance = loader.getDouble("MaxBlastResistance", Double.MAX_VALUE); - MaxDesignBlastResistance = loader.getDouble("MaxDesignBlastResistance", Double.MAX_VALUE); + MaxDesignBlastResistance = loader.getDouble("MaxDesignBlastResistance", MaxBlastResistance); Map, Integer> Limited = new HashMap<>(); for (Map entry : loader.getMapList("Limited")) { From 236944ff69842d320e68e43f8e8a00510aa56149 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Fri, 13 Mar 2026 21:12:34 +0100 Subject: [PATCH 10/62] Remove useless System.out --- .../bausystem/features/design/endstone/DesignEndStone.java | 1 - 1 file changed, 1 deletion(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/design/endstone/DesignEndStone.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/design/endstone/DesignEndStone.java index a4836c33..ad4afc56 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/design/endstone/DesignEndStone.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/design/endstone/DesignEndStone.java @@ -58,7 +58,6 @@ public class DesignEndStone { .filter(material -> !material.isLegacy()) .filter(material -> material.getBlastResistance() > region.getGameModeConfig().Schematic.MaxDesignBlastResistance) .collect(Collectors.toSet()); - System.out.println(limited); calculateFromBottom = region.getGameModeConfig().Arena.NoFloor; entityServer.setCallback((player, rEntity, entityAction) -> { From c1221e5cf51b869bb6bd4c2ab6bb902d47be2293 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Fri, 13 Mar 2026 21:16:13 +0100 Subject: [PATCH 11/62] Remove SWTSI (SteamWar Teamserver Integration) --- CommonCore/SQL/src/de/steamwar/sql/Team.kt | 14 ---- .../velocitycore/commands/TeamCommand.java | 77 ------------------- .../velocitycore/listeners/PluginMessage.java | 14 +--- 3 files changed, 1 insertion(+), 104 deletions(-) diff --git a/CommonCore/SQL/src/de/steamwar/sql/Team.kt b/CommonCore/SQL/src/de/steamwar/sql/Team.kt index fa5a1433..8000fbb0 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/Team.kt +++ b/CommonCore/SQL/src/de/steamwar/sql/Team.kt @@ -67,8 +67,6 @@ class Team(id: EntityID) : IntEntity(id) { private var name by TeamTable.name var deleted by TeamTable.deleted private set - private var teamAddress by TeamTable.address - private var teamPort by TeamTable.port val members by lazy { useDb { SteamwarUserTable.select(SteamwarUserTable.id).where { SteamwarUserTable.team eq teamId }.map { it[SteamwarUserTable.id].value } } } fun size() = useDb { SteamwarUser.find { SteamwarUserTable.team eq teamId }.count().toInt() } @@ -96,16 +94,4 @@ class Team(id: EntityID) : IntEntity(id) { set(value) = useDb { name = value } - - var address: String? - get() = teamAddress - set(value) = useDb { - teamAddress = value - } - - var port: Int - get() = teamPort.toInt() - set(value) = useDb { - teamPort = value.toUShort() - } } \ No newline at end of file diff --git a/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java b/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java index b17a4fcc..3d861398 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java +++ b/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java @@ -430,83 +430,6 @@ public class TeamCommand extends SWCommand { DiscordBot.withBot(bot -> bot.getEventChannel().update()); } - @Register("tp") - public void tp(@Validator("isInTeam") PlayerChatter sender) { - Team team = Team.byId(sender.user().getTeam()); - tp(sender, team); - } - - @Register("tp") - public void tp(PlayerChatter sender, @ErrorMessage("TEAM_TP_NO_TEAM") Team targetTeam) { - if (targetTeam.getAddress() == null || targetTeam.getAddress().isEmpty()) { - sender.system("TEAM_NO_ADDRESS"); - return; - } - - InetSocketAddress address; - ServerInfo serverInfo; - try { - address = new InetSocketAddress(targetTeam.getAddress(), targetTeam.getPort()); - serverInfo = Storage.teamServers.computeIfAbsent(targetTeam.getTeamId(), integer -> { - ServerInfo info = new ServerInfo("Team " + targetTeam.getTeamKuerzel(), address); - RegisteredServer server = VelocityCore.getProxy().registerServer(info); - ServerPing serverPing = server.ping().join(); - ((VelocityViaConfig) Via.getConfig()).getVelocityServerProtocols().put(info.getName(), serverPing.getVersion().getProtocol()); - return info; - }); - } catch (Exception e) { - sender.system("TEAM_NO_ADDRESS"); - return; - } - - if (!address.equals(serverInfo.getAddress())) { - VelocityCore.getProxy().unregisterServer(Storage.teamServers.remove(targetTeam.getTeamId())); - tp(sender, targetTeam); - return; - } - - sender.getPlayer().createConnectionRequest(VelocityCore.getProxy().getServer(serverInfo.getName()).orElseThrow()).connect().whenComplete((result, throwable) -> { - if(result.getStatus() != ConnectionRequestBuilder.Status.SUCCESS || throwable != null) - sender.system("TEAM_OFFLINE"); - }); - } - - @Register(value = "server", description = "TEAM_SERVER_USAGE") - public void server(@Validator("isLeader") Chatter sender, String server, @Min(intValue = 1) @Max(intValue = 65535) @ErrorMessage("TEAM_SERVER_PORT_INVALID") int port){ - Team team = Team.byId(sender.user().getTeam()); - if (PunishmentCommand.isPunishedWithMessage(sender, Punishment.PunishmentType.NoTeamServer)) { - return; - } - - try { - if (isLocalhost(InetAddress.getByName(server))) { - sender.system("TEAM_SERVER_ADDRESS_INVALID"); - return; - } - } catch (UnknownHostException e) { - sender.system("TEAM_SERVER_ADDRESS_INVALID"); - return; - } - - team.setAddress(server); - team.setPort(port); - Storage.teamServers.remove(team.getTeamId()); - sender.system("TEAM_SERVER_SET"); - } - - public static boolean isLocalhost(InetAddress addr) { - // Check if the address is a valid special local or loop back - if (addr.isAnyLocalAddress() || addr.isLoopbackAddress()) - return true; - - // Check if the address is defined on any interface - try { - return NetworkInterface.getByInetAddress(addr) != null; - } catch (SocketException e) { - return false; - } - } - private static final Map COLOR_CODES = new HashMap<>(); static { diff --git a/VelocityCore/src/de/steamwar/velocitycore/listeners/PluginMessage.java b/VelocityCore/src/de/steamwar/velocitycore/listeners/PluginMessage.java index adfd90ae..567ccfab 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/listeners/PluginMessage.java +++ b/VelocityCore/src/de/steamwar/velocitycore/listeners/PluginMessage.java @@ -27,7 +27,6 @@ import com.velocitypowered.api.network.ProtocolVersion; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ServerConnection; import com.velocitypowered.api.proxy.messages.ChannelIdentifier; -import com.velocitypowered.api.proxy.messages.ChannelMessageSource; import com.velocitypowered.api.proxy.messages.LegacyChannelIdentifier; import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; import com.velocitypowered.proxy.protocol.ProtocolUtils; @@ -37,7 +36,6 @@ import de.steamwar.network.packets.NetworkPacket; import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.UserPerm; import de.steamwar.velocitycore.VelocityCore; -import de.steamwar.velocitycore.commands.TeamCommand; import de.steamwar.velocitycore.mods.*; import de.steamwar.velocitycore.network.ServerMetaInfo; import io.netty.buffer.ByteBuf; @@ -470,7 +468,7 @@ public class PluginMessage extends BasicListener { register("minecraft:brand", false, directional(this::steamWarBrand, UNKNOWN)); //Needs to be registered cause paper refuses to send PluginMessages on unregistered channels... - register("sw:bridge", true, directional(onlySWSource(async(event -> NetworkPacket.handle(new ServerMetaInfo((ServerConnection) event.getSource()), event.getData()))), UNKNOWN)); + register("sw:bridge", true, directional(async(event -> NetworkPacket.handle(new ServerMetaInfo((ServerConnection) event.getSource()), event.getData())), UNKNOWN)); registerPassthroughToServer("sw:hotkeys"); register("fabricmodsender:mods", true, directional(UNKNOWN, async(new FabricModSender()::handlePluginMessage))); @@ -574,16 +572,6 @@ public class PluginMessage extends BasicListener { }; } - private Parser onlySWSource(Parser parser) { - return event -> { - ChannelMessageSource sender = event.getSource(); - if(TeamCommand.isLocalhost(sender instanceof Player player ? IPSanitizer.getTrueAddress(player) : ((ServerConnection) sender).getServerInfo().getAddress().getAddress())) - parser.handle(event); - else - UNKNOWN.handle(event); - }; - } - private Parser async(Parser parser) { return event -> VelocityCore.schedule(() -> parser.handle(event)).schedule(); } From f00bd153fe89bc1023cb5cb77e19a9f30b940518 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sun, 15 Mar 2026 12:49:13 +0100 Subject: [PATCH 12/62] Add GameModeConfig#Schematic#ReplacementsWithoutBlockUpdates Add GameModeConfig#Schematic#ReplacementsWithBlockUpdates --- .../src/de/steamwar/sql/GameModeConfig.java | 17 ++++++++------- .../SQL/src/de/steamwar/sql/YMLWrapper.java | 21 +++++++++++++++---- .../fightsystem/fight/FightSchematic.java | 21 ++++++++++++------- 3 files changed, 40 insertions(+), 19 deletions(-) diff --git a/CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java b/CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java index e0b942ef..48989139 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java +++ b/CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java @@ -605,18 +605,18 @@ public final class GameModeConfig { public final boolean IgnorePublicOnly; /** - * If obsidian and bedrock should be replaced during PRE_RUNNING + * Replacements that should be done during PRE_RUNNING with no block updates * - * @implSpec {@code false} by default + * @implSpec {@code {}} by default */ - public final boolean ReplaceObsidianBedrock; + public final Map ReplacementsWithoutBlockUpdates; /** - * If the replacement should happen with block updates + * Replacements that should be done during PRE_RUNNING with block updates * - * @implSpec {@code false} by default + * @implSpec {@code {}} by default */ - public final boolean ReplaceWithBlockupdates; + public final Map ReplacementsWithBlockUpdates; /** * If the schematic perparation arena mode is time limited @@ -673,8 +673,6 @@ public final class GameModeConfig { PasteAligned = loader.getBoolean("PasteAligned", false); OnlyPublicSchematics = loader.getBoolean("OnlyPublicSchematics", false); IgnorePublicOnly = loader.getBoolean("IgnorePublicOnly", false); - ReplaceObsidianBedrock = loader.getBoolean("ReplaceObsidianBedrock", false); - ReplaceWithBlockupdates = loader.getBoolean("ReplaceWithBlockupdates", false); UnlimitedPrepare = loader.getBoolean("UnlimitedPrepare", false); MaxBlocks = loader.getInt("MaxBlocks", 0); MaxDispenserItems = loader.getInt("MaxDispenserItems", 128); @@ -698,6 +696,9 @@ public final class GameModeConfig { Limited.put(Collections.singleton((M) material), 0); }); this.Limited = Collections.unmodifiableMap(Limited); + + this.ReplacementsWithoutBlockUpdates = loader.getMap("ReplacementsWithoutBlockUpdates", loader.materialMapper, loader.materialMapper); + this.ReplacementsWithBlockUpdates = loader.getMap("ReplacementsWithBlockUpdates", loader.materialMapper, loader.materialMapper); } @ToString diff --git a/CommonCore/SQL/src/de/steamwar/sql/YMLWrapper.java b/CommonCore/SQL/src/de/steamwar/sql/YMLWrapper.java index 5a5f62aa..39eff9bb 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/YMLWrapper.java +++ b/CommonCore/SQL/src/de/steamwar/sql/YMLWrapper.java @@ -24,10 +24,7 @@ import org.yaml.snakeyaml.Yaml; import java.io.File; import java.io.FileReader; import java.io.IOException; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -160,6 +157,22 @@ final class YMLWrapper { } } + public Map getMap(String path, Function keyFunction, Function valueFunction) { + Object data = this.document.get(path); + if (data instanceof Map) { + Map result = new HashMap<>(); + ((Map) data).forEach((keyString, valueString) -> { + K key = keyFunction.apply(keyString.toUpperCase()); + V value = valueFunction.apply(valueString.toUpperCase()); + if (key == null || value == null) return; + result.put(key, value); + }); + return Collections.unmodifiableMap(result); + } else { + return Collections.emptyMap(); + } + } + public List> getMapList(String path) { Object value = this.document.get(path); if (value instanceof List) { diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java index 6345f888..7496f76a 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java @@ -45,6 +45,7 @@ import org.bukkit.util.Vector; import java.io.IOException; import java.util.List; +import java.util.Map; import java.util.Random; import java.util.logging.Level; @@ -179,18 +180,24 @@ public class FightSchematic extends StateDependent { @Override public void disable() { - if(!Config.GameModeConfig.Schematic.ReplaceObsidianBedrock || Config.mode == ArenaMode.PREPARE) + if (Config.mode == ArenaMode.PREPARE) { return; + } FreezeWorld freezer = null; - if(!Config.GameModeConfig.Schematic.ReplaceWithBlockupdates) + if (!Config.GameModeConfig.Schematic.ReplacementsWithoutBlockUpdates.isEmpty()) { freezer = new FreezeWorld(); - - replaceSync(Material.OBSIDIAN, Material.TNT); - replaceSync(Material.BEDROCK, Material.SLIME_BLOCK); - - if(!Config.GameModeConfig.Schematic.ReplaceWithBlockupdates) + } + for (Map.Entry replacement : Config.GameModeConfig.Schematic.ReplacementsWithoutBlockUpdates.entrySet()) { + replaceSync(replacement.getKey(), replacement.getValue()); + } + if (freezer != null) { freezer.disable(); + } + + for (Map.Entry replacement : Config.GameModeConfig.Schematic.ReplacementsWithBlockUpdates.entrySet()) { + replaceSync(replacement.getKey(), replacement.getValue()); + } } public void pasteTeamName(){ From ca70c6685cb770dbc6cafe36e95dd41ff807cf1f Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sun, 15 Mar 2026 12:52:56 +0100 Subject: [PATCH 13/62] Remove Lunar client support They currently have a problem with their maven repository --- VelocityCore/Dependencies/build.gradle.kts | 1 - .../de/steamwar/velocitycore/mods/Lunar.java | 72 +------------------ settings.gradle.kts | 8 --- 3 files changed, 1 insertion(+), 80 deletions(-) diff --git a/VelocityCore/Dependencies/build.gradle.kts b/VelocityCore/Dependencies/build.gradle.kts index 7d510778..2b0beeb2 100644 --- a/VelocityCore/Dependencies/build.gradle.kts +++ b/VelocityCore/Dependencies/build.gradle.kts @@ -57,7 +57,6 @@ dependencies { implementation(libs.mysql) implementation(libs.msgpack) - implementation(libs.apolloprotos) implementation(libs.nbt) diff --git a/VelocityCore/src/de/steamwar/velocitycore/mods/Lunar.java b/VelocityCore/src/de/steamwar/velocitycore/mods/Lunar.java index fbd7497c..59e4633d 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/mods/Lunar.java +++ b/VelocityCore/src/de/steamwar/velocitycore/mods/Lunar.java @@ -19,25 +19,9 @@ package de.steamwar.velocitycore.mods; -import com.google.protobuf.Any; -import com.google.protobuf.InvalidProtocolBufferException; -import com.google.protobuf.Value; -import com.lunarclient.apollo.configurable.v1.ConfigurableSettings; -import com.lunarclient.apollo.configurable.v1.OverrideConfigurableSettingsMessage; -import com.lunarclient.apollo.player.v1.ModMessage; -import com.lunarclient.apollo.player.v1.PlayerHandshakeMessage; import com.velocitypowered.api.event.connection.PluginMessageEvent; import com.velocitypowered.api.proxy.Player; -import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; import de.steamwar.messages.Chatter; -import de.steamwar.sql.Mod; -import de.steamwar.sql.SteamwarUser; -import de.steamwar.sql.UserPerm; -import de.steamwar.velocitycore.VelocityCore; - -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Level; public class Lunar { // https://lunarclient.dev/apollo/introduction @@ -45,61 +29,7 @@ public class Lunar { public static final String CHANNEL = "lunar:apollo"; - private final byte[] packet; - - public Lunar() { - ConfigurableSettings.Builder builder = ConfigurableSettings.newBuilder() - .setApolloModule("mod_setting") - .setEnable(true); - - for(String property : List.of( - "freelook.enabled", "hypixel-mod.enabled", "minimap.enabled", "nametag.enabled", "replaymod.enabled", - "team-view.enabled", "tnt-countdown.enabled", "toggle-sneak.toggle-sneak-container" - )) - builder.putProperties(property, Value.newBuilder().setBoolValue(false).build()); - - packet = Any.pack(OverrideConfigurableSettingsMessage.newBuilder().addConfigurableSettings(builder).build()).toByteArray(); - } - - public void sendRestrictions(Player player) { - player.sendPluginMessage(MinecraftChannelIdentifier.from(CHANNEL), packet); - } - public void handlePluginMessage(PluginMessageEvent event) { - try { - Any packet = Any.parseFrom(event.getData()); - if(packet.is(PlayerHandshakeMessage.class)) - handle((Player) event.getSource(), packet.unpack(PlayerHandshakeMessage.class)); - } catch (InvalidProtocolBufferException e) { - throw new SecurityException(e); - } - } - - private void handle(Player player, PlayerHandshakeMessage packet) { - if (!SteamwarUser.get(player.getUniqueId()).hasPerm(UserPerm.RESTRICTED_MODS)) { - Chatter.disconnect(player).prefixless("MOD_YELLOW_SING", "Lunar"); - return; - } - - List mods = new ArrayList<>(); - - for(ModMessage mod : packet.getInstalledModsList()) { - switch(mod.getType()) { - case TYPE_FABRIC_INTERNAL, TYPE_FORGE_INTERNAL: - // Controlled with ModSettings - break; - case TYPE_FABRIC_EXTERNAL: - mods.add(Mod.getOrCreate(mod.getName(), Mod.Platform.FABRIC)); - break; - case TYPE_FORGE_EXTERNAL: - mods.add(Mod.getOrCreate(mod.getName(), Mod.Platform.FORGE)); - break; - default: - VelocityCore.getLogger().log(Level.INFO, () -> player.getUsername() + " uses Lunar mod with unknown type " + mod); - break; - } - } - - ModUtils.handleMods(player, mods); + Chatter.disconnect((Player) event.getSource()).prefixless("MOD_YELLOW_SING", "lunar"); } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 323b0517..5f364d5b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -34,13 +34,6 @@ dependencyResolutionManagement { } } - maven { - url = URI("https://repo.lunarclient.dev") - content { - includeGroup("com.lunarclient") - } - } - maven { if (isInCi) { url = URI("file:///var/www/maven/") @@ -141,7 +134,6 @@ dependencyResolutionManagement { library("viavelocity", "com.viaversion:viaversion-velocity:4.3.1") library("jda", "net.dv8tion:JDA:5.5.1") library("msgpack", "org.msgpack:msgpack-core:0.9.8") - library("apolloprotos", "com.lunarclient:apollo-protos:1.0-SNAPSHOT") library("logback", "ch.qos.logback:logback-classic:1.5.6") From 5e19629df57fb31ee86bbfcad0c601c11171aab3 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sun, 15 Mar 2026 12:54:43 +0100 Subject: [PATCH 14/62] Fix build --- .../de/steamwar/velocitycore/listeners/PluginMessage.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/VelocityCore/src/de/steamwar/velocitycore/listeners/PluginMessage.java b/VelocityCore/src/de/steamwar/velocitycore/listeners/PluginMessage.java index 567ccfab..1df1936f 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/listeners/PluginMessage.java +++ b/VelocityCore/src/de/steamwar/velocitycore/listeners/PluginMessage.java @@ -514,11 +514,8 @@ public class PluginMessage extends BasicListener { Player player = event.getPlayer(); String brand = event.getBrand(); - boolean lunarclient = brand.startsWith("lunarclient:"); - VelocityCore.getLogger().log(knownBrands.contains(brand) || lunarclient ? Level.INFO : Level.WARNING, () -> player.getUsername() + " joins with brand: " + brand); - if(lunarclient) - lunar.sendRestrictions(player); + VelocityCore.getLogger().log(knownBrands.contains(brand) ? Level.INFO : Level.WARNING, () -> player.getUsername() + " joins with brand: " + brand); if(brand.equals("badlion")) badlion.sendRestrictions(player); } From 71767ef6d9736efccd03fc9cde542b4df747d7aa Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sat, 21 Mar 2026 09:20:57 +0100 Subject: [PATCH 15/62] Fix TeamCommand /team event ... --- .../steamwar/messages/BungeeCore.properties | 1 - .../messages/BungeeCore_de.properties | 1 - .../velocitycore/commands/TeamCommand.java | 26 +++++++++---------- 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/VelocityCore/src/de/steamwar/messages/BungeeCore.properties b/VelocityCore/src/de/steamwar/messages/BungeeCore.properties index 66d439df..5e619e84 100644 --- a/VelocityCore/src/de/steamwar/messages/BungeeCore.properties +++ b/VelocityCore/src/de/steamwar/messages/BungeeCore.properties @@ -419,7 +419,6 @@ TEAM_NOT_IN_EVENT=§cThis is not possible during an event. TEAM_HELP_HEADER=§7Manage your team with §e/team. TEAM_HELP_LIST=§8/§7team list §8- §7List all teams. TEAM_HELP_INFO=§8/§7team info §8- §7Get information on a team. -TEAM_HELP_TP=§8/§7team tp §8(§7Team§8) §8- §7Teleport to a team server. TEAM_HELP_CREATE=§8/§7team create §8- §7Create your own team. TEAM_HELP_JOIN=§8/§7team join §8- §7Join a team. TEAM_HELP_CHAT=§8/§7teamchat §8- §7Send messages to your team. diff --git a/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties b/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties index 71e55412..ed0edfc4 100644 --- a/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties +++ b/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties @@ -391,7 +391,6 @@ TEAM_NOT_IN_EVENT=§cDies ist während eines Events nicht möglich. TEAM_HELP_HEADER=§7Mit §e/team §7verwaltest du dein Team. TEAM_HELP_LIST=§8/§7team list §8- §7Liste alle Teams auf. TEAM_HELP_INFO=§8/§7team info §8- §7Informiere dich über ein Team. -TEAM_HELP_TP=§8/§7team tp §8(§7Team§8) §8- §7Teleportiert zum Teamserver. TEAM_HELP_CREATE=§8/§7team create §8- §7Erstelle dein eigenes Team. TEAM_HELP_JOIN=§8/§7team join §8- §7Trete einem Team bei. TEAM_HELP_CHAT=§8/§7teamchat §8- §7Sende Nachrichten an dein Team. diff --git a/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java b/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java index 3d861398..70bde6a2 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java +++ b/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java @@ -19,12 +19,6 @@ package de.steamwar.velocitycore.commands; -import com.velocitypowered.api.proxy.ConnectionRequestBuilder; -import com.velocitypowered.api.proxy.server.RegisteredServer; -import com.velocitypowered.api.proxy.server.ServerInfo; -import com.velocitypowered.api.proxy.server.ServerPing; -import com.viaversion.viaversion.api.Via; -import com.viaversion.viaversion.velocity.platform.VelocityViaConfig; import de.steamwar.command.PreviousArguments; import de.steamwar.command.SWCommand; import de.steamwar.command.TypeMapper; @@ -33,19 +27,19 @@ import de.steamwar.linkage.Linked; import de.steamwar.messages.Chatter; import de.steamwar.messages.Message; import de.steamwar.messages.PlayerChatter; -import de.steamwar.persistent.Storage; -import de.steamwar.sql.*; +import de.steamwar.sql.Event; +import de.steamwar.sql.SteamwarUser; +import de.steamwar.sql.Team; +import de.steamwar.sql.TeamTeilnahme; import de.steamwar.velocitycore.VelocityCore; import de.steamwar.velocitycore.discord.DiscordBot; import de.steamwar.velocitycore.inventory.SWItem; import de.steamwar.velocitycore.inventory.SWListInv; -import lombok.val; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.format.NamedTextColor; -import java.net.*; import java.time.Instant; import java.time.format.DateTimeFormatter; import java.util.*; @@ -63,7 +57,7 @@ public class TeamCommand extends SWCommand { @Register(noTabComplete = true) public void help(Chatter sender, String... args){ - helpMessages(sender, "TEAM_HELP_HEADER", "TEAM_HELP_LIST", "TEAM_HELP_INFO", "TEAM_HELP_TP"); + helpMessages(sender, "TEAM_HELP_HEADER", "TEAM_HELP_LIST", "TEAM_HELP_INFO"); SteamwarUser user = sender.user(); if(user.getTeam() == 0) { @@ -469,10 +463,14 @@ public class TeamCommand extends SWCommand { @ClassMapper(Event.class) public TypeMapper eventTypeMapper() { - return new TypeMapper() { + return new TypeMapper<>() { @Override public Event map(Chatter sender, PreviousArguments previousArguments, String s) { - return Event.get(s); + try { + return Event.byId(Integer.parseInt(s)); + } catch (NumberFormatException e) { + return null; + } } @Override @@ -487,7 +485,7 @@ public class TeamCommand extends SWCommand { @Override public Collection tabCompletes(Chatter sender, PreviousArguments previousArguments, String s) { - return Event.getComing().stream().map(Event::getEventName).toList(); + return Event.getComing().stream().map(Event::getEventID).map(i -> i + "").toList(); } }; } From 72e88502d2b44b0d7cc374f8eb8339d502c69378 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sat, 21 Mar 2026 09:26:02 +0100 Subject: [PATCH 16/62] Fix TeamCommand /team event ... --- .../steamwar/velocitycore/commands/TeamCommand.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java b/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java index 70bde6a2..16270087 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java +++ b/VelocityCore/src/de/steamwar/velocitycore/commands/TeamCommand.java @@ -466,11 +466,11 @@ public class TeamCommand extends SWCommand { return new TypeMapper<>() { @Override public Event map(Chatter sender, PreviousArguments previousArguments, String s) { - try { - return Event.byId(Integer.parseInt(s)); - } catch (NumberFormatException e) { - return null; - } + return Event.getComing() + .stream() + .filter(event -> event.getEventName().replace(" ", "").equalsIgnoreCase(s)) + .findFirst() + .orElse(null); } @Override @@ -485,7 +485,7 @@ public class TeamCommand extends SWCommand { @Override public Collection tabCompletes(Chatter sender, PreviousArguments previousArguments, String s) { - return Event.getComing().stream().map(Event::getEventID).map(i -> i + "").toList(); + return Event.getComing().stream().map(Event::getEventName).map(e -> e.replace(" ", "")).toList(); } }; } From 63ad85f727484d5042a6223ff5e2ed3dc3b70678 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sat, 21 Mar 2026 09:37:05 +0100 Subject: [PATCH 17/62] Fix TickManager21.stepTicks --- .../src/de/steamwar/bausystem/utils/TickManager21.java | 1 - 1 file changed, 1 deletion(-) diff --git a/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/TickManager21.java b/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/TickManager21.java index af3792f7..ad6ca6c2 100644 --- a/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/TickManager21.java +++ b/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/TickManager21.java @@ -100,7 +100,6 @@ public class TickManager21 implements TickManager { manager.setFrozen(true); bukkitTask.cancel(); }, 1, 1); - manager.tick(); } @Override From 14dc807fd9385c1683e8451a5621a4bfee3b713b Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sat, 21 Mar 2026 09:39:17 +0100 Subject: [PATCH 18/62] Fix SoulSand in LaufbauCommand --- .../bausystem/features/slaves/laufbau/BlockBoundingBox.java | 2 +- .../bausystem/features/slaves/laufbau/LaufbauCommand.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/BlockBoundingBox.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/BlockBoundingBox.java index 223cdfe6..ee9d48f4 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/BlockBoundingBox.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/BlockBoundingBox.java @@ -101,7 +101,7 @@ public class BlockBoundingBox { addPixel(Material.END_STONE.createBlockData(), 0, 0, 0, 16, 16, 16, null); addPixel(NMSWrapper.impl.pathMaterial().createBlockData(), 0, 0, 0, 16, 15, 16, createItem("LAUFBAU_BLOCK_GRASS_PATH", NMSWrapper.impl.pathMaterial())); - addPixel(Material.SOUL_SAND.createBlockData(), 0, 0, 0, 16, 14, 16, createItem("LAUFBAU_BLOCK_SOUL_SAND", Material.SOUL_SAND)); + addPixel(Material.MUD.createBlockData(), 0, 0, 0, 16, 14, 16, createItem("LAUFBAU_BLOCK_SOUL_SAND", Material.SOUL_SAND)); Cocoa cocoaNorth = (Cocoa) Material.COCOA.createBlockData(); cocoaNorth.setAge(2); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/LaufbauCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/LaufbauCommand.java index 9c568a56..42ed812d 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/LaufbauCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/LaufbauCommand.java @@ -25,12 +25,14 @@ import de.steamwar.bausystem.shared.Pair; import de.steamwar.bausystem.utils.WorldEditUtils; import de.steamwar.command.SWCommand; import de.steamwar.linkage.Linked; +import de.steamwar.linkage.MinVersion; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; @Linked +@MinVersion(19) public class LaufbauCommand extends SWCommand { public LaufbauCommand() { From 9587b9e1fdda6d1580c1740a31fec63542d15b0c Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sat, 21 Mar 2026 09:46:20 +0100 Subject: [PATCH 19/62] Fix Laufbau double click --- .../simulator/gui/SimulatorObserverGui.java | 2 ++ .../gui/SimulatorObserverPhaseSettingsGui.java | 5 +++++ .../simulator/gui/SimulatorObserverSettingsGui.java | 9 +++++++++ .../simulator/gui/SimulatorRedstoneGui.java | 2 ++ .../gui/SimulatorRedstonePhaseSettingsGui.java | 7 +++++++ .../simulator/gui/SimulatorRedstoneSettingsGui.java | 9 +++++++++ .../features/simulator/gui/SimulatorTNTGui.java | 2 ++ .../simulator/gui/SimulatorTNTPhaseSettingsGui.java | 13 +++++++++++++ .../simulator/gui/SimulatorTNTSettingsGui.java | 9 +++++++++ 9 files changed, 58 insertions(+) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverGui.java index adfec3a5..b6ad62a0 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverGui.java @@ -150,11 +150,13 @@ public class SimulatorObserverGui extends SimulatorScrollGui { Consumer setter = observerPhase::setTickOffset; return new SWItem[] { new SWItem(SWItem.getDye(getter.get() < max ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; setter.accept(Math.min(max, getter.get() + (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED), observer, new SWItem(SWItem.getDye(getter.get() > min ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8:§e -5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; setter.accept(Math.max(min, getter.get() - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED), diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverPhaseSettingsGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverPhaseSettingsGui.java index d7d54981..16f036b0 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverPhaseSettingsGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverPhaseSettingsGui.java @@ -32,6 +32,7 @@ import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.block.BlockFace; import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; import java.util.Arrays; @@ -97,6 +98,7 @@ public class SimulatorObserverPhaseSettingsGui extends SimulatorBaseGui { //Tick Offset int offset = observer.getTickOffset(); inventory.setItem(10, new SWItem(SWItem.getDye(offset < max ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; observer.setTickOffset(Math.min(max, offset + (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); @@ -113,6 +115,7 @@ public class SimulatorObserverPhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(19, offsetItem); inventory.setItem(28, new SWItem(SWItem.getDye(offset > min ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; observer.setTickOffset(Math.max(min, offset - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); @@ -120,6 +123,7 @@ public class SimulatorObserverPhaseSettingsGui extends SimulatorBaseGui { //Order int order = observer.getOrder(); inventory.setItem(13, new SWItem(SWItem.getDye(order < SimulatorPhase.ORDER_LIMIT ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; observer.setOrder(Math.min(SimulatorPhase.ORDER_LIMIT, order + (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); @@ -138,6 +142,7 @@ public class SimulatorObserverPhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(22, orderItem); inventory.setItem(31, new SWItem(SWItem.getDye(order > -SimulatorPhase.ORDER_LIMIT ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; observer.setOrder(Math.max(-SimulatorPhase.ORDER_LIMIT, order - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverSettingsGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverSettingsGui.java index c31687f5..cd424170 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverSettingsGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorObserverSettingsGui.java @@ -28,6 +28,7 @@ import de.steamwar.data.CMDs; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; import java.util.Arrays; @@ -67,6 +68,7 @@ public class SimulatorObserverSettingsGui extends SimulatorBaseGui { // Base Tick int baseTicks = observer.getBaseTick(); inventory.setItem(9, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; observer.changeBaseTicks(clickType.isShiftClick() ? 5 : 1); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); @@ -81,6 +83,7 @@ public class SimulatorObserverSettingsGui extends SimulatorBaseGui { baseTick.getItemStack().setAmount(Math.max(1, Math.min(baseTicks, 64))); inventory.setItem(18, baseTick); inventory.setItem(27, new SWItem(SWItem.getDye(baseTicks > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; if (baseTicks - (clickType.isShiftClick() ? 5 : 1) < 0) { observer.changeBaseTicks(-baseTicks); } else { @@ -91,6 +94,7 @@ public class SimulatorObserverSettingsGui extends SimulatorBaseGui { //Pos X inventory.setItem(15, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; observer.move(clickType.isShiftClick() ? 5 : 1, 0, 0); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); @@ -102,12 +106,14 @@ public class SimulatorObserverSettingsGui extends SimulatorBaseGui { }, this).open(); })); inventory.setItem(33, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; observer.move(clickType.isShiftClick() ? -5 : -1, 0, 0); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); //Pos Y inventory.setItem(16, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; observer.move(0, clickType.isShiftClick() ? 5 : 1, 0); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.ENABLED_OR_DISABLED)); @@ -119,12 +125,14 @@ public class SimulatorObserverSettingsGui extends SimulatorBaseGui { }, this).open(); })); inventory.setItem(34, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; observer.move(0, clickType.isShiftClick() ? -5 : -1, 0); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); //Pos Z inventory.setItem(17, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; observer.move(0, 0, clickType.isShiftClick() ? 5 : 1); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.ENABLED_OR_DISABLED)); @@ -136,6 +144,7 @@ public class SimulatorObserverSettingsGui extends SimulatorBaseGui { }, this).open(); })); inventory.setItem(35, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; observer.move(0, 0, clickType.isShiftClick() ? -5 : -1); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneGui.java index 847ba882..fcaecd9a 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneGui.java @@ -165,11 +165,13 @@ public class SimulatorRedstoneGui extends SimulatorScrollGui 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 -> { + if (clickType == ClickType.DOUBLE_CLICK) return; setter.accept(Math.min(max, getter.get() + (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED), redstone, new SWItem(SWItem.getDye(getter.get() > min ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8:§e -5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; setter.accept(Math.max(min, getter.get() - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED), diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java index 37825397..cf7726bd 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstonePhaseSettingsGui.java @@ -31,6 +31,7 @@ import de.steamwar.data.CMDs; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; import java.util.Arrays; @@ -98,6 +99,7 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { //Tick Offset int offset = redstone.getTickOffset(); inventory.setItem(10, new SWItem(SWItem.getDye(offset < maxOffset ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; redstone.setTickOffset(Math.min(maxOffset, offset + (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); @@ -114,6 +116,7 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(19, offsetItem); inventory.setItem(28, new SWItem(SWItem.getDye(offset > min ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; redstone.setTickOffset(Math.max(min, offset - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); @@ -121,6 +124,7 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { //Lifetime int lifetime = redstone.getLifetime(); inventory.setItem(11, new SWItem(SWItem.getDye(lifetime < maxLifetime ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; redstone.setLifetime(Math.min(maxLifetime, lifetime + (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); @@ -137,6 +141,7 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(20, lifetimeItem); inventory.setItem(29, new SWItem(SWItem.getDye(lifetime > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; redstone.setLifetime(Math.max(0, lifetime - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); @@ -144,6 +149,7 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { //Order int order = redstone.getOrder(); inventory.setItem(13, new SWItem(SWItem.getDye(order < SimulatorPhase.ORDER_LIMIT ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; redstone.setOrder(Math.min(SimulatorPhase.ORDER_LIMIT, order + (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); @@ -162,6 +168,7 @@ public class SimulatorRedstonePhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(22, orderItem); inventory.setItem(31, new SWItem(SWItem.getDye(order > -SimulatorPhase.ORDER_LIMIT ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; redstone.setOrder(Math.max(-SimulatorPhase.ORDER_LIMIT, order - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneSettingsGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneSettingsGui.java index 23206e27..a2901797 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneSettingsGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorRedstoneSettingsGui.java @@ -28,6 +28,7 @@ import de.steamwar.data.CMDs; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; import java.util.Arrays; @@ -66,6 +67,7 @@ public class SimulatorRedstoneSettingsGui extends SimulatorBaseGui { // Base Tick int baseTicks = redstone.getBaseTick(); inventory.setItem(9, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; redstone.changeBaseTicks(clickType.isShiftClick() ? 5 : 1); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); @@ -80,6 +82,7 @@ public class SimulatorRedstoneSettingsGui extends SimulatorBaseGui { baseTick.getItemStack().setAmount(Math.max(1, Math.min(baseTicks, 64))); inventory.setItem(18, baseTick); inventory.setItem(27, new SWItem(SWItem.getDye(baseTicks > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; if (baseTicks - (clickType.isShiftClick() ? 5 : 1) < 0) { redstone.changeBaseTicks(-baseTicks); } else { @@ -90,6 +93,7 @@ public class SimulatorRedstoneSettingsGui extends SimulatorBaseGui { //Pos X inventory.setItem(15, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; redstone.move(clickType.isShiftClick() ? 5 : 1, 0, 0); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); @@ -101,12 +105,14 @@ public class SimulatorRedstoneSettingsGui extends SimulatorBaseGui { }, this).open(); })); inventory.setItem(33, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; redstone.move(clickType.isShiftClick() ? -5 : -1, 0, 0); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); //Pos Y inventory.setItem(16, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; redstone.move(0, clickType.isShiftClick() ? 5 : 1, 0); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); @@ -118,12 +124,14 @@ public class SimulatorRedstoneSettingsGui extends SimulatorBaseGui { }, this).open(); })); inventory.setItem(34, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; redstone.move(0, clickType.isShiftClick() ? -5 : -1, 0); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); //Pos Z inventory.setItem(17, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; redstone.move(0, 0, clickType.isShiftClick() ? 5 : 1); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); @@ -135,6 +143,7 @@ public class SimulatorRedstoneSettingsGui extends SimulatorBaseGui { }, this).open(); })); inventory.setItem(35, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; redstone.move(0, 0, clickType.isShiftClick() ? -5 : -1); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTGui.java index a089f806..08d3628d 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTGui.java @@ -138,11 +138,13 @@ public class SimulatorTNTGui extends SimulatorScrollGui { return new SWItem[]{ new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8:§e +5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; tntSetting.setCount(tntSetting.getCount() + (clickType.isShiftClick() ? 5 : 1)); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED), tnt, new SWItem(SWItem.getDye(tntSetting.getCount() > 1 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8:§e -5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; tntSetting.setCount(Math.max(1, tntSetting.getCount() - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED), diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java index d1850fc9..e66449fb 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTPhaseSettingsGui.java @@ -31,6 +31,7 @@ import de.steamwar.data.CMDs; import de.steamwar.inventory.SWItem; import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; import java.util.Arrays; @@ -78,6 +79,7 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { //Count int count = tnt.getCount(); inventory.setItem(9, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; tnt.setCount(count + (clickType.isShiftClick() ? 5 : 1)); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); @@ -94,6 +96,7 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(18, countItem); inventory.setItem(27, new SWItem(SWItem.getDye(count > 1 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; tnt.setCount(Math.max(1, count - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); @@ -101,6 +104,7 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { //Tick Offset int offset = tnt.getTickOffset(); inventory.setItem(10, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; tnt.setTickOffset(offset + (clickType.isShiftClick() ? 5 : 1)); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); @@ -117,6 +121,7 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(19, offsetItem); inventory.setItem(28, new SWItem(SWItem.getDye(offset > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; tnt.setTickOffset(Math.max(0, offset - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); @@ -124,6 +129,7 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { //Lifetime int lifetime = tnt.getLifetime(); inventory.setItem(11, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; tnt.setLifetime(lifetime + (clickType.isShiftClick() ? 5 : 1)); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); @@ -140,6 +146,7 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(20, lifetimeItem); inventory.setItem(29, new SWItem(SWItem.getDye(lifetime > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; tnt.setLifetime(Math.max(1, lifetime - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); @@ -147,6 +154,7 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { //Order int order = tnt.getOrder(); inventory.setItem(13, new SWItem(SWItem.getDye(order < SimulatorPhase.ORDER_LIMIT ? 10 : 8), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; tnt.setOrder(Math.min(SimulatorPhase.ORDER_LIMIT, order + (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); @@ -165,30 +173,35 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui { inventory.setItem(22, orderItem); inventory.setItem(31, new SWItem(SWItem.getDye(order > -SimulatorPhase.ORDER_LIMIT ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; tnt.setOrder(Math.max(-SimulatorPhase.ORDER_LIMIT, order - (clickType.isShiftClick() ? 5 : 1))); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); //Jump SWItem jumpX = new SWItem(tnt.isXJump() ? Material.LIME_WOOL : Material.RED_WOOL, "§7TNT §eJump X§8: " + (tnt.isZJump() ? "§aon" : "§coff"), clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; tnt.setXJump(!tnt.isXJump()); SimulatorWatcher.update(simulator); }); inventory.setItem(33, jumpX); SWItem jumpY = new SWItem(tnt.isYJump() ? Material.LIME_WOOL : Material.RED_WOOL, "§7TNT §eJump Y§8: " + (tnt.isYJump() ? "§aon" : "§coff"), clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; tnt.setYJump(!tnt.isYJump()); SimulatorWatcher.update(simulator); }); inventory.setItem(16, jumpY); SWItem jumpZ = new SWItem(tnt.isZJump() ? Material.LIME_WOOL : Material.RED_WOOL, "§7TNT §eJump Z§8: " + (tnt.isZJump() ? "§aon" : "§coff"), clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; 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 -> { + if (clickType == ClickType.DOUBLE_CLICK) return; tnt.setJump(!tnt.hasJump()); SimulatorWatcher.update(simulator); }); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java index e835ba43..9640b066 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorTNTSettingsGui.java @@ -28,6 +28,7 @@ import de.steamwar.data.CMDs; 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; @@ -75,6 +76,7 @@ public class SimulatorTNTSettingsGui extends SimulatorBaseGui { // Base Tick int baseTicks = tnt.getBaseTick(); inventory.setItem(9, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; tnt.changeBaseTicks(clickType.isShiftClick() ? 5 : 1); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); @@ -89,6 +91,7 @@ public class SimulatorTNTSettingsGui extends SimulatorBaseGui { baseTick.getItemStack().setAmount(Math.max(1, Math.min(baseTicks, 64))); inventory.setItem(18, baseTick); inventory.setItem(27, new SWItem(SWItem.getDye(baseTicks > 0 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; if (baseTicks - (clickType.isShiftClick() ? 5 : 1) < 0) { tnt.changeBaseTicks(-baseTicks); } else { @@ -136,6 +139,7 @@ public class SimulatorTNTSettingsGui extends SimulatorBaseGui { // Pos X inventory.setItem(15, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+0.0625"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; tnt.move(clickType.isShiftClick() ? 0.0625 : 1, 0, 0); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); @@ -147,12 +151,14 @@ public class SimulatorTNTSettingsGui extends SimulatorBaseGui { }, this).open(); })); inventory.setItem(33, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-0.0625"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; tnt.move(clickType.isShiftClick() ? -0.0625 : -1, 0, 0); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); // Pos Y inventory.setItem(16, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+0.0625"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; tnt.move(0, clickType.isShiftClick() ? 0.0625 : 1, 0); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); @@ -164,12 +170,14 @@ public class SimulatorTNTSettingsGui extends SimulatorBaseGui { }, this).open(); })); inventory.setItem(34, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-0.0625"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; tnt.move(0, clickType.isShiftClick() ? -0.0625 : -1, 0); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); // Pos Z inventory.setItem(17, new SWItem(SWItem.getDye(10), "§e+1", Arrays.asList("§7Shift§8: §e+0.0625"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; tnt.move(0, 0, clickType.isShiftClick() ? 0.0625 : 1); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.INCREMENT_OR_DISABLED)); @@ -181,6 +189,7 @@ public class SimulatorTNTSettingsGui extends SimulatorBaseGui { }, this).open(); })); inventory.setItem(35, new SWItem(SWItem.getDye(1), "§e-1", Arrays.asList("§7Shift§8: §e-0.0625"), false, clickType -> { + if (clickType == ClickType.DOUBLE_CLICK) return; tnt.move(0, 0, clickType.isShiftClick() ? -0.0625 : -1); SimulatorWatcher.update(simulator); }).setCustomModelData(CMDs.Simulator.DECREMENT_OR_DISABLED)); From 76ecaccc410bef86e30384fa40c59724d6d228a6 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sat, 21 Mar 2026 17:45:26 +0100 Subject: [PATCH 20/62] Hotfix AutoChecker15 for now --- .../de/steamwar/schematicsystem/autocheck/AutoChecker15.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SchematicSystem/SchematicSystem_15/src/de/steamwar/schematicsystem/autocheck/AutoChecker15.java b/SchematicSystem/SchematicSystem_15/src/de/steamwar/schematicsystem/autocheck/AutoChecker15.java index d6189931..8ed1bd4c 100644 --- a/SchematicSystem/SchematicSystem_15/src/de/steamwar/schematicsystem/autocheck/AutoChecker15.java +++ b/SchematicSystem/SchematicSystem_15/src/de/steamwar/schematicsystem/autocheck/AutoChecker15.java @@ -53,7 +53,7 @@ public class AutoChecker15 implements AutoChecker.IAutoChecker { checkInventory(result, block, material, new BlockPos(x, y, z)); } - if(x == 0 || x == max.getBlockX() - 1 || y == max.getBlockY() - 1 || z == 0 || z == max.getBlockZ() - 1) { + if(x == min.getBlockX() || x == max.getBlockX() || y == max.getBlockY() || z == min.getBlockZ() || z == max.getBlockZ()) { result.getDesignBlocks().computeIfAbsent(material, m -> new ArrayList<>()).add(new BlockPos(x, y, z)); } } From 72d62dfbe582b7dde9b90ea42f40da8435ba9b5f Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sun, 22 Mar 2026 15:23:46 +0100 Subject: [PATCH 21/62] Fix AutoCheckerResult ignoring Water and Lava correctly --- .../schematicsystem/autocheck/AutoCheckerResult.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/SchematicSystem/SchematicSystem_Core/src/de/steamwar/schematicsystem/autocheck/AutoCheckerResult.java b/SchematicSystem/SchematicSystem_Core/src/de/steamwar/schematicsystem/autocheck/AutoCheckerResult.java index 60ab9070..e6ba4728 100644 --- a/SchematicSystem/SchematicSystem_Core/src/de/steamwar/schematicsystem/autocheck/AutoCheckerResult.java +++ b/SchematicSystem/SchematicSystem_Core/src/de/steamwar/schematicsystem/autocheck/AutoCheckerResult.java @@ -20,9 +20,8 @@ package de.steamwar.schematicsystem.autocheck; import de.steamwar.core.Core; -import de.steamwar.sql.GameModeConfig; import de.steamwar.schematicsystem.SchematicSystem; -import de.steamwar.sql.SchematicType; +import de.steamwar.sql.GameModeConfig; import lombok.Builder; import lombok.Getter; import lombok.ToString; @@ -102,7 +101,9 @@ public class AutoCheckerResult { } public boolean isDesignBlastResistanceOK() { - return blockScanResult.getDesignBlocks().keySet().stream().map(Material::getBlastResistance).noneMatch(i -> i > type.Schematic.MaxDesignBlastResistance); + return blockScanResult.getDesignBlocks().keySet().stream() + .filter(material -> material != Material.WATER && material != Material.LAVA) + .map(Material::getBlastResistance).noneMatch(i -> i > type.Schematic.MaxDesignBlastResistance); } public void sendErrorMessage(Player p, String schemName) { @@ -148,6 +149,7 @@ public class AutoCheckerResult { }); if(Core.getVersion() > 12) { blockScanResult.getDesignBlocks().forEach((material, poss) -> { + if (material == Material.WATER || material == Material.LAVA) return; if(material.getBlastResistance() > type.Schematic.MaxDesignBlastResistance) { poss.forEach(pos -> { SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_DESIGN_BLOCK", p, SchematicSystem.MESSAGE.parse("AUTO_CHECKER_RESULT_TELEPORT_HERE", p), tpCommandTo(pos), material.name(), pos.getBlockX(), pos.getBlockY(), pos.getBlockZ()); From 6c062216a105fec775577408d72040d31010e9e4 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Tue, 24 Mar 2026 20:07:17 +0100 Subject: [PATCH 22/62] Remove usage of EffectiveSchematicNode Signed-off-by: Chaoscaot --- .../SQL/src/de/steamwar/sql/SchematicNode.kt | 86 ++++++++++++++++++- 1 file changed, 85 insertions(+), 1 deletion(-) diff --git a/CommonCore/SQL/src/de/steamwar/sql/SchematicNode.kt b/CommonCore/SQL/src/de/steamwar/sql/SchematicNode.kt index d27c2890..aed85b1e 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/SchematicNode.kt +++ b/CommonCore/SQL/src/de/steamwar/sql/SchematicNode.kt @@ -146,7 +146,91 @@ class SchematicNode(id: EntityID) : IntEntity(id) { @JvmStatic fun parentsOfNode(user: SteamwarUser, id: Int) = fromSql( - "WITH RECURSIVE R AS (SELECT NodeId, ParentNode FROM EffectiveSchematicNode WHERE NodeId = ? UNION SELECT E.NodeId, E.ParentNode FROM R, EffectiveSchematicNode E WHERE R.ParentNode = E.NodeId AND E.EffectiveOwner = ?) SELECT SN.NodeId, SN.NodeOwner, SN.NodeName, R.ParentNode, SN.LastUpdate, SN.NodeItem, SN.NodeType, SN.NodeRank, SN.Config FROM R INNER JOIN SchematicNode SN ON SN.NodeId = R.NodeId", + """ + WITH RECURSIVE + ESN_R AS ( + SELECT SchematicNode.NodeId AS NodeId, + NM.UserId AS EffectiveOwner, + NM.ParentId AS ParentNode + FROM SchematicNode + INNER JOIN NodeMember NM ON NM.NodeId = SchematicNode.NodeId + UNION ALL + SELECT S.NodeId AS NodeId, + ESN_R.EffectiveOwner AS EffectiveOwner, + S.ParentNode AS ParentNode + FROM SchematicNode S + INNER JOIN ESN_R ON S.ParentNode = ESN_R.NodeId + ), + ESN_R2 AS ( + SELECT SchematicNode.NodeId AS NodeId, + NM.UserId AS UserId, + SchematicNode.NodeOwner AS EffectiveOwner, + SchematicNode.ParentNode AS ParentNode + FROM SchematicNode + INNER JOIN NodeMember NM ON NM.NodeId = SchematicNode.NodeId + UNION ALL + SELECT S.NodeId AS NodeId, + ESN_R2.EffectiveOwner AS EffectiveOwner, + ESN_R2.UserId AS UserId, + S.ParentNode AS ParentNode + FROM SchematicNode S + INNER JOIN ESN_R2 ON S.ParentNode = ESN_R2.NodeId + WHERE S.NodeOwner <> ESN_R2.EffectiveOwner + ), + ESN_R3 AS ( + SELECT SchematicNode.NodeId AS NodeId, + SchematicNode.NodeOwner AS NodeOwner, + SchematicNode.NodeOwner AS EffectiveOwner, + SchematicNode.ParentNode AS ParentNode + FROM SchematicNode + UNION ALL + SELECT S.NodeId AS NodeId, + S.NodeOwner AS NodeOwner, + ESN_R3.EffectiveOwner AS EffectiveOwner, + S.ParentNode AS ParentNode + FROM SchematicNode S + INNER JOIN ESN_R3 ON S.ParentNode = ESN_R3.NodeId + WHERE ESN_R3.NodeOwner <> S.NodeOwner + ), + ResolvedNodes AS ( + SELECT ESN_R.NodeId AS NodeId, + ESN_R.EffectiveOwner AS EffectiveOwner, + ESN_R.ParentNode AS ParentNode + FROM ESN_R + UNION + SELECT ESN_R2.NodeId AS NodeId, + ESN_R2.UserId AS EffectiveOwner, + ESN_R2.ParentNode AS ParentNode + FROM ESN_R2 + INNER JOIN SchematicNode SN2 ON ESN_R2.NodeId = SN2.NodeId + WHERE ESN_R2.ParentNode IS NOT NULL + AND SN2.NodeOwner <> ESN_R2.EffectiveOwner + UNION + SELECT ESN_R3.NodeId AS NodeId, + ESN_R3.EffectiveOwner AS EffectiveOwner, + ESN_R3.ParentNode AS ParentNode + FROM ESN_R3 + WHERE ESN_R3.NodeOwner <> ESN_R3.EffectiveOwner + UNION + SELECT SchematicNode.NodeId AS NodeId, + SchematicNode.NodeOwner AS EffectiveOwner, + SchematicNode.ParentNode AS ParentNode + FROM SchematicNode + ), + R AS ( + SELECT NodeId, ParentNode + FROM ResolvedNodes + WHERE NodeId = ? + UNION + SELECT E.NodeId, E.ParentNode + FROM R + INNER JOIN ResolvedNodes E ON R.ParentNode = E.NodeId + WHERE E.EffectiveOwner = ? + ) + SELECT SN.NodeId, SN.NodeOwner, SN.NodeName, R.ParentNode, SN.LastUpdate, SN.NodeItem, SN.NodeType, SN.NodeRank, SN.Config + FROM R + INNER JOIN SchematicNode SN ON SN.NodeId = R.NodeId + """.trimIndent(), listOf( IntegerColumnType() to id, IntegerColumnType() to user.getId() From 59a927c33c9f69da988ae196205360453792f66e Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Tue, 24 Mar 2026 22:11:19 +0100 Subject: [PATCH 23/62] Remove Team.address and Team.port Remove PollAnswer and UserElo from GDPRQuery --- CommonCore/SQL/src/de/steamwar/sql/Team.kt | 2 -- .../src/de/steamwar/velocitycore/commands/GDPRQuery.java | 4 ---- 2 files changed, 6 deletions(-) diff --git a/CommonCore/SQL/src/de/steamwar/sql/Team.kt b/CommonCore/SQL/src/de/steamwar/sql/Team.kt index 8000fbb0..66614ad2 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/Team.kt +++ b/CommonCore/SQL/src/de/steamwar/sql/Team.kt @@ -32,8 +32,6 @@ object TeamTable : IntIdTable("Team", "TeamID") { val color = char("TeamColor", 1).default("8") val name = varchar("TeamName", 16) val deleted = bool("TeamDeleted").default(false) - val address = text("Address").nullable() - val port = ushort("Port").default(25565u) } class Team(id: EntityID) : IntEntity(id) { diff --git a/VelocityCore/src/de/steamwar/velocitycore/commands/GDPRQuery.java b/VelocityCore/src/de/steamwar/velocitycore/commands/GDPRQuery.java index d5756890..c07e0a29 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/commands/GDPRQuery.java +++ b/VelocityCore/src/de/steamwar/velocitycore/commands/GDPRQuery.java @@ -76,13 +76,11 @@ public class GDPRQuery extends SWCommand { sqlCSV(user, out, bauweltMember, "BuildMember.csv"); sqlCSV(user, out, bauweltMembers, "BuildMembers.csv"); sqlCSV(user, out, checkedSchems, "SchematicChecksessions.csv"); - sqlCSV(user, out, userElo, "UserElo.csv"); sqlCSV(user, out, fights, "Fights.csv"); sqlCSV(user, out, ignoredPlayers, "IgnoredPlayers.csv"); sqlCSV(user, out, ignoringPlayers, "IgnoringPlayers.csv"); sqlCSV(user, out, schematicMember, "SchematicMember.csv"); sqlCSV(user, out, schematicMembers, "SchematicMembers.csv"); - sqlCSV(user, out, pollAnswers, "PollAnswers.csv"); sqlCSV(user, out, punishments, "Punishments.csv"); sqlCSV(user, out, sessions, "Sessions.csv"); sqlCSV(user, out, userData, "UserData.csv"); @@ -104,13 +102,11 @@ public class GDPRQuery extends SWCommand { private static final Statement bauweltMember = new Statement("SELECT BauweltID AS Bauwelt, WorldEdit, World FROM BauweltMember WHERE MemberID = ?"); private static final Statement bauweltMembers = new Statement("SELECT u.UserName AS 'User', m.WorldEdit AS WorldEdit, m.World AS World FROM BauweltMember m INNER JOIN UserData u ON m.MemberID = u.id WHERE m.BauweltID = ?"); private static final Statement checkedSchems = new Statement("SELECT NodeName AS Schematic, StartTime, EndTime, DeclineReason AS Result FROM CheckedSchematic WHERE NodeOwner = ? ORDER BY StartTime ASC"); - private static final Statement userElo = new Statement("SELECT GameMode, Elo, Season FROM Elo WHERE UserID = ?"); private static final Statement fights = new Statement("SELECT p.Team AS Team, p.Kit AS Kit, p.Kills AS Kills, p.IsOut AS Died, f.GameMode AS GameMode, f.Server AS Server, f.StartTime AS StartTime, f.Duration AS Duration, (f.BlueLeader = p.UserID) AS IsBlueLeader, (f.RedLeader = p.UserID) AS IsRedLeader, f.Win AS Winner, f.WinCondition AS WinCondition FROM Fight f INNER JOIN FightPlayer p ON f.FightID = p.FightID WHERE p.UserID = ? ORDER BY StartTime ASC"); private static final Statement ignoredPlayers = new Statement("SELECT u.UserName AS IgnoredPlayer FROM IgnoredPlayers i INNER JOIN UserData u ON i.Ignored = u.id WHERE Ignorer = ?"); private static final Statement ignoringPlayers = new Statement("SELECT Ignorer AS IgnoringPlayers FROM IgnoredPlayers WHERE Ignored = ?"); private static final Statement schematicMember = new Statement("SELECT s.NodeName AS SchematicName, u.UserName AS SchematicOwner FROM NodeMember m INNER JOIN SchematicNode s ON m.NodeId = s.NodeId INNER JOIN UserData u ON s.NodeOwner = u.id WHERE m.UserId = ?"); private static final Statement schematicMembers = new Statement("SELECT s.NodeName AS SchematicName, u.UserName AS Member FROM NodeMember m INNER JOIN SchematicNode s ON m.NodeId = s.NodeId INNER JOIN UserData u ON m.UserId = u.id WHERE s.NodeOwner = ?"); - private static final Statement pollAnswers = new Statement("SELECT Question, Answer FROM PollAnswer WHERE UserID = ?"); private static final Statement punishments = new Statement("SELECT Type, StartTime, EndTime, Perma, Reason FROM Punishments WHERE UserId = ?"); private static final Statement sessions = new Statement("SELECT StartTime, EndTime FROM Session WHERE UserID = ?"); private static final Statement userData = new Statement("SELECT * FROM UserData WHERE id = ?"); From 404ab2abfb0b6423cf9820774c7c68aa28bd5c01 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Wed, 25 Mar 2026 07:46:38 +0100 Subject: [PATCH 24/62] Update GDPRQuery --- .../src/de/steamwar/velocitycore/commands/GDPRQuery.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VelocityCore/src/de/steamwar/velocitycore/commands/GDPRQuery.java b/VelocityCore/src/de/steamwar/velocitycore/commands/GDPRQuery.java index c07e0a29..4cdbfc69 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/commands/GDPRQuery.java +++ b/VelocityCore/src/de/steamwar/velocitycore/commands/GDPRQuery.java @@ -19,14 +19,14 @@ package de.steamwar.velocitycore.commands; -import de.steamwar.linkage.Linked; -import de.steamwar.velocitycore.VelocityCore; import de.steamwar.command.SWCommand; +import de.steamwar.linkage.Linked; import de.steamwar.messages.Chatter; import de.steamwar.messages.PlayerChatter; import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.UserPerm; import de.steamwar.sql.internal.Statement; +import de.steamwar.velocitycore.VelocityCore; import java.io.*; import java.util.zip.ZipEntry; From f2ee9dbeb3262ccaf2635664aeff0f28eec79277 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Sat, 28 Mar 2026 22:24:07 +0100 Subject: [PATCH 25/62] Fix Schematic Tabcomplete Signed-off-by: Chaoscaot --- CommonCore/SQL/src/de/steamwar/sql/SchematicNode.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CommonCore/SQL/src/de/steamwar/sql/SchematicNode.kt b/CommonCore/SQL/src/de/steamwar/sql/SchematicNode.kt index aed85b1e..12dce565 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/SchematicNode.kt +++ b/CommonCore/SQL/src/de/steamwar/sql/SchematicNode.kt @@ -368,7 +368,7 @@ class SchematicNode(id: EntityID) : IntEntity(id) { val list = mutableListOf() if (s.contains("/")) { val preTab = s.take(s.lastIndexOf("/") + 1) - val pa = getNodeFromPath(user, preTab) ?: return emptyList() + val pa = getNodeFromPath(user, preTab) ?: return mutableListOf() val nodes: List = list(user, pa.getId()) val br = pa.generateBreadcrumbs(user) nodes.forEach(Consumer { node: SchematicNode? -> list.add((if (sws) "/" else "") + br + node!!.name + (if (node.isDir()) "/" else "")) }) From 1dbcb122c2fea8be5a821e764a14e14988b9aeaf Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Sat, 28 Mar 2026 22:30:01 +0100 Subject: [PATCH 26/62] Change Loader to use FastSchematicReaderV3 Signed-off-by: Chaoscaot --- .../SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java b/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java index 15256d90..b8cdba8c 100644 --- a/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java +++ b/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java @@ -19,6 +19,7 @@ package de.steamwar.core; +import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicReaderV3; import com.sk89q.jnbt.NBTInputStream; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extent.clipboard.Clipboard; @@ -78,7 +79,7 @@ public class WorldEditWrapper21 implements WorldEditWrapper { Clipboard clipboard = switch (schemFormat) { case MCEDIT -> new MCEditSchematicReader(new NBTInputStream(ris)).read(); case SPONGE_V2 -> new SpongeSchematicV2Reader(LinBinaryIO.read(new DataInputStream(ris))).read(); - case SPONGE_V3 -> new SpongeSchematicV3Reader(LinBinaryIO.read(new DataInputStream(ris))).read(); + case SPONGE_V3 -> new FastSchematicReaderV3(ris).read(); }; ris.close(); return clipboard; From 612254296c9e8a39a33c0c36297ab0b31a48a708 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sun, 29 Mar 2026 11:55:16 +0200 Subject: [PATCH 27/62] Fix WorldEditWrapper21 --- .../de/steamwar/core/WorldEditWrapper21.java | 43 +++++++++++++------ 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java b/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java index b8cdba8c..35fda421 100644 --- a/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java +++ b/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java @@ -20,6 +20,7 @@ package de.steamwar.core; import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicReaderV3; +import com.fastasyncworldedit.core.jnbt.NBTException; import com.sk89q.jnbt.NBTInputStream; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extent.clipboard.Clipboard; @@ -71,26 +72,40 @@ public class WorldEditWrapper21 implements WorldEditWrapper { } @Override - @SuppressWarnings("removal") - public Clipboard getClipboard(InputStream is, NodeData.SchematicFormat ignored) throws IOException { + public Clipboard getClipboard(InputStream is, NodeData.SchematicFormat directFormat) throws IOException { ResetableInputStream ris = new ResetableInputStream(is); - for (NodeData.SchematicFormat schemFormat : NodeData.SchematicFormat.values()) { - try { - Clipboard clipboard = switch (schemFormat) { - case MCEDIT -> new MCEditSchematicReader(new NBTInputStream(ris)).read(); - case SPONGE_V2 -> new SpongeSchematicV2Reader(LinBinaryIO.read(new DataInputStream(ris))).read(); - case SPONGE_V3 -> new FastSchematicReaderV3(ris).read(); - }; - ris.close(); - return clipboard; - } catch (Exception e) { - // Ignore - } + try { + return loadSchematic(ris, directFormat); + } catch (Exception e) { ris.reset(); } + for (NodeData.SchematicFormat schemFormat : NodeData.SchematicFormat.values()) { + if (schemFormat == directFormat) continue; + try { + return loadSchematic(ris, schemFormat); + } catch (Exception e) { + ris.reset(); + } + } + try { + return new SpongeSchematicV3Reader(LinBinaryIO.read(new DataInputStream(ris))).read(); + } catch (Exception e) { + ris.close(); + } throw new IOException("No clipboard found"); } + @SuppressWarnings("removal") + private Clipboard loadSchematic(ResetableInputStream ris, NodeData.SchematicFormat format) throws IOException { + Clipboard clipboard = switch (format) { + case MCEDIT -> new MCEditSchematicReader(new NBTInputStream(ris)).read(); + case SPONGE_V2 -> new SpongeSchematicV2Reader(LinBinaryIO.read(new DataInputStream(ris))).read(); + case SPONGE_V3 -> new FastSchematicReaderV3(ris).read(); + }; + ris.close(); + return clipboard; + } + private class ResetableInputStream extends InputStream { private InputStream inputStream; From c0b192e2bf8d410cc7c74e7f921aa624945d7f64 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sun, 29 Mar 2026 12:53:55 +0200 Subject: [PATCH 28/62] Fix WorldEditWrapper not loading schematics in 1.21 --- .../SQL/src/de/steamwar/sql/NodeData.kt | 2 - .../fightsystem/record/PacketProcessor.java | 5 +- .../steamwar/fightsystem/record/Recorder.java | 2 +- .../de/steamwar/core/WorldEditWrapper14.java | 43 +++++----- .../de/steamwar/core/WorldEditWrapper21.java | 82 ++++++++----------- .../de/steamwar/core/WorldEditWrapper8.java | 28 ++++--- .../de/steamwar/core/WorldEditWrapper.java | 10 ++- .../src/de/steamwar/sql/SchematicData.java | 12 +-- 8 files changed, 82 insertions(+), 102 deletions(-) diff --git a/CommonCore/SQL/src/de/steamwar/sql/NodeData.kt b/CommonCore/SQL/src/de/steamwar/sql/NodeData.kt index 69552ac0..386966a8 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/NodeData.kt +++ b/CommonCore/SQL/src/de/steamwar/sql/NodeData.kt @@ -88,8 +88,6 @@ class NodeData(id: EntityID): CompositeEntity(id) { schemData.inputStream.let { if(decompress) GZIPInputStream(it) else it } } - fun schemData() = schemData(true) - override fun delete() = useDb { super.delete() } enum class SchematicFormat(val fileEnding: String) { diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java index cbb79a5e..2e2aa21c 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java @@ -36,7 +36,6 @@ import de.steamwar.fightsystem.fight.FreezeWorld; import de.steamwar.fightsystem.listener.FightScoreboard; import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.utils.*; -import de.steamwar.sql.SchematicData; import de.steamwar.sql.SchematicNode; import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.Team; @@ -520,12 +519,12 @@ public class PacketProcessor implements Listener { private void pasteEmbeddedSchem(FightTeam team) throws IOException { int schemId = source.readInt(); - Clipboard clipboard = SchematicData.clipboardFromStream(new FilterInputStream(source) { + Clipboard clipboard = WorldEditWrapper.impl.getClipboard(new FilterInputStream(source) { @Override public void close() { // FAWE 1.12 calls close... } - }, WorldEditWrapper.impl.getNativeFormat()); + }); execSync(() -> team.pasteSchem(schemId, clipboard)); } diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java index f4267b49..25f67457 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java @@ -283,7 +283,7 @@ public interface Recorder { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); try{ - copy(NodeData.getLatest(SchematicNode.getSchematicNode(schemId)).schemData(), buffer); + copy(NodeData.getLatest(SchematicNode.getSchematicNode(schemId)).schemData(true), buffer); }catch (EOFException e) { Bukkit.getLogger().log(Level.INFO, "EOFException ignored"); } catch (IOException e) { diff --git a/SpigotCore/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java b/SpigotCore/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java index 60e4758d..b0f0238e 100644 --- a/SpigotCore/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java +++ b/SpigotCore/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java @@ -67,36 +67,31 @@ public class WorldEditWrapper14 implements WorldEditWrapper { } @Override - public void setPlayerClipboard(Player player, InputStream is, NodeData.SchematicFormat schemFormat) { - Clipboard clipboard = null; - try { - clipboard = getClipboard(is, schemFormat); - } catch (IOException e) { - throw new RuntimeException(e.getMessage(), e); - } - - if (clipboard == null) - throw new NoClipboardException(); - + public void setPlayerClipboard(Player player, Clipboard clipboard) { Actor actor = WorldEditWrapper.getWorldEditPlugin().wrapCommandSender(player); WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getSessionManager().get(actor).setClipboard(new ClipboardHolder(clipboard)); } @Override - public Clipboard getClipboard(InputStream is, NodeData.SchematicFormat schemFormat) throws IOException { - try { + public Clipboard getClipboard(NodeData data) throws IOException { + InputStream is = data.schemData(true); + return readClipboard(is, data.getNodeFormat()); + } - switch (schemFormat) { - case SPONGE_V2: - case SPONGE_V3: - return new SpongeSchematicReader(new NBTInputStream(is), this).read(); - case MCEDIT: - return new MCEditSchematicReader(new NBTInputStream(is)).read(); - default: - throw new IOException("This schematic format is currently not supported"); - } - } catch (NullPointerException e) { - throw new NoClipboardException(); + @Override + public Clipboard getClipboard(InputStream inputStream) throws IOException { + return readClipboard(inputStream, getNativeFormat()); + } + + private Clipboard readClipboard(InputStream is, NodeData.SchematicFormat format) throws IOException { + switch (format) { + case SPONGE_V2: + case SPONGE_V3: + return new SpongeSchematicReader(new NBTInputStream(is), this).read(); + case MCEDIT: + return new MCEditSchematicReader(new NBTInputStream(is)).read(); + default: + throw new IOException("This schematic format is currently not supported"); } } diff --git a/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java b/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java index 35fda421..d823ef80 100644 --- a/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java +++ b/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java @@ -20,15 +20,12 @@ package de.steamwar.core; import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicReaderV3; -import com.fastasyncworldedit.core.jnbt.NBTException; -import com.sk89q.jnbt.NBTInputStream; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats; import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter; -import com.sk89q.worldedit.extent.clipboard.io.MCEditSchematicReader; -import com.sk89q.worldedit.extent.clipboard.io.sponge.SpongeSchematicV2Reader; -import com.sk89q.worldedit.extent.clipboard.io.sponge.SpongeSchematicV3Reader; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.regions.Region; @@ -36,13 +33,13 @@ import com.sk89q.worldedit.session.ClipboardHolder; import de.steamwar.sql.NodeData; import org.bukkit.entity.Player; import org.bukkit.util.Vector; -import org.enginehub.linbus.stream.LinBinaryIO; -import java.io.DataInputStream; +import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import java.util.zip.GZIPInputStream; public class WorldEditWrapper21 implements WorldEditWrapper { @@ -56,57 +53,48 @@ public class WorldEditWrapper21 implements WorldEditWrapper { } @Override - public void setPlayerClipboard(Player player, InputStream is, NodeData.SchematicFormat schemFormat) { - Clipboard clipboard = null; - try { - clipboard = getClipboard(is, schemFormat); - } catch (IOException e) { - throw new RuntimeException(e.getMessage(), e); - } - - if (clipboard == null) - throw new SecurityException("Clipboard is null"); - + public void setPlayerClipboard(Player player, Clipboard clipboard) { Actor actor = WorldEditWrapper.getWorldEditPlugin().wrapCommandSender(player); WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getSessionManager().get(actor).setClipboard(new ClipboardHolder(clipboard)); } @Override - public Clipboard getClipboard(InputStream is, NodeData.SchematicFormat directFormat) throws IOException { - ResetableInputStream ris = new ResetableInputStream(is); - try { - return loadSchematic(ris, directFormat); - } catch (Exception e) { - ris.reset(); - } - for (NodeData.SchematicFormat schemFormat : NodeData.SchematicFormat.values()) { - if (schemFormat == directFormat) continue; - try { - return loadSchematic(ris, schemFormat); - } catch (Exception e) { - ris.reset(); - } - } - try { - return new SpongeSchematicV3Reader(LinBinaryIO.read(new DataInputStream(ris))).read(); - } catch (Exception e) { - ris.close(); + public Clipboard getClipboard(NodeData data) throws IOException { + ResetableInputStream is = new ResetableInputStream(data.schemData(false)); + for (ClipboardFormat clipboardFormat : ClipboardFormats.getAll()) { + FilterInputStream fis = new FilterInputStream(is) { + @Override + public void close() throws IOException { + // Ignore close call! + } + }; + boolean canBeRead = clipboardFormat.isFormat(fis); + is.reset(); + if (!canBeRead) continue; + return clipboardFormat.load(is); } throw new IOException("No clipboard found"); } - @SuppressWarnings("removal") - private Clipboard loadSchematic(ResetableInputStream ris, NodeData.SchematicFormat format) throws IOException { - Clipboard clipboard = switch (format) { - case MCEDIT -> new MCEditSchematicReader(new NBTInputStream(ris)).read(); - case SPONGE_V2 -> new SpongeSchematicV2Reader(LinBinaryIO.read(new DataInputStream(ris))).read(); - case SPONGE_V3 -> new FastSchematicReaderV3(ris).read(); - }; - ris.close(); - return clipboard; + @Override + public Clipboard getClipboard(InputStream inputStream) throws IOException { + // Only supports getNativeFormat() both with GZIP as well as without! + ResetableInputStream is = new ResetableInputStream(inputStream); + try { + return new FastSchematicReaderV3(inputStream).read(); + } catch (Exception e) { + is.reset(); + } + try { + return new FastSchematicReaderV3(new GZIPInputStream(is)).read(); + } catch (Exception e) { + is.reset(); + } + is.close(); + throw new IOException("No clipboard found"); } - private class ResetableInputStream extends InputStream { + private static class ResetableInputStream extends InputStream { private InputStream inputStream; private int pointer = 0; diff --git a/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java b/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java index cc021f19..4f45729d 100644 --- a/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java +++ b/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java @@ -22,7 +22,10 @@ package de.steamwar.core; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import com.sk89q.jnbt.*; -import com.sk89q.worldedit.*; +import com.sk89q.worldedit.BlockVector; +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.bukkit.BukkitWorld; import com.sk89q.worldedit.extension.input.ParserContext; @@ -57,22 +60,25 @@ public class WorldEditWrapper8 implements WorldEditWrapper { } @Override - public void setPlayerClipboard(Player player, InputStream is, NodeData.SchematicFormat schemFormat) { + public void setPlayerClipboard(Player player, Clipboard clipboard) { WorldData world = new BukkitWorld(player.getWorld()).getWorldData(); - Clipboard clipboard; - try { - clipboard = getClipboard(is, schemFormat); - } catch (IOException e) { - throw new RuntimeException(e); - } - Actor actor = WorldEditWrapper.getWorldEditPlugin().wrapCommandSender(player); WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getSessionManager().get(actor).setClipboard(new ClipboardHolder(clipboard, world)); } @Override - public Clipboard getClipboard(InputStream is, NodeData.SchematicFormat schemFormat) throws IOException { - switch (schemFormat) { + public Clipboard getClipboard(NodeData data) throws IOException { + InputStream is = data.schemData(true); + return readClipboard(is, data.getNodeFormat()); + } + + @Override + public Clipboard getClipboard(InputStream inputStream) throws IOException { + return readClipboard(inputStream, getNativeFormat()); + } + + private Clipboard readClipboard(InputStream is, NodeData.SchematicFormat format) throws IOException { + switch (format) { case MCEDIT: return new SchematicReader(new NBTInputStream(is)).read(WorldEdit.getInstance().getServer().getWorlds().get(0).getWorldData()); case SPONGE_V2: diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java index f3b0accc..724f8184 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java @@ -22,10 +22,10 @@ package de.steamwar.core; import com.sk89q.worldedit.EmptyClipboardException; import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.extent.clipboard.Clipboard; -import com.sk89q.worldedit.session.ClipboardHolder; -import de.steamwar.sql.NoClipboardException; import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.regions.Region; +import com.sk89q.worldedit.session.ClipboardHolder; +import de.steamwar.sql.NoClipboardException; import de.steamwar.sql.NodeData; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -38,8 +38,10 @@ public interface WorldEditWrapper { WorldEditWrapper impl = VersionDependent.getVersionImpl(Core.getInstance()); InputStream getPlayerClipboard(Player player); - void setPlayerClipboard(Player player, InputStream is, NodeData.SchematicFormat schemFormat); - Clipboard getClipboard(InputStream is, NodeData.SchematicFormat schemFormat) throws IOException; + + void setPlayerClipboard(Player player, Clipboard clipboard); + Clipboard getClipboard(NodeData data) throws IOException; + Clipboard getClipboard(InputStream inputStream) throws IOException; Vector getOrigin(Clipboard clipboard); Vector getMinimum(Region region); diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/sql/SchematicData.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/sql/SchematicData.java index 72fd070f..f83e5a78 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/sql/SchematicData.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/sql/SchematicData.java @@ -29,14 +29,6 @@ import java.io.InputStream; public class SchematicData { - public static Clipboard clipboardFromStream(InputStream is, NodeData.SchematicFormat schemFormat) { - try { - return WorldEditWrapper.impl.getClipboard(is, schemFormat); - } catch (IOException e) { - throw new SecurityException("Could not read schem", e); - } - } - private final NodeData data; public SchematicData(SchematicNode node) { @@ -60,11 +52,11 @@ public class SchematicData { } public Clipboard load() throws IOException, NoClipboardException { - return WorldEditWrapper.impl.getClipboard(data.schemData(), data.getNodeFormat()); + return WorldEditWrapper.impl.getClipboard(data); } public void loadToPlayer(Player player) throws IOException, NoClipboardException { - WorldEditWrapper.impl.setPlayerClipboard(player, data.schemData(), data.getNodeFormat()); + WorldEditWrapper.impl.setPlayerClipboard(player, WorldEditWrapper.impl.getClipboard(data)); } public static void saveFromPlayer(Player player, SchematicNode node) throws IOException, NoClipboardException { From e110033315f470566ff0762240e0cd97878940ea Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sun, 29 Mar 2026 13:05:41 +0200 Subject: [PATCH 29/62] Fix Replays for 1.21 --- .../de/steamwar/core/WorldEditWrapper21.java | 52 +++++++++++++------ 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java b/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java index d823ef80..326bcd95 100644 --- a/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java +++ b/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java @@ -19,13 +19,15 @@ package de.steamwar.core; +import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicReaderV2; import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicReaderV3; +import com.sk89q.jnbt.NBTInputStream; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extent.clipboard.Clipboard; -import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat; -import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat; -import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats; -import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter; +import com.sk89q.worldedit.extent.clipboard.io.*; +import com.sk89q.worldedit.extent.clipboard.io.sponge.SpongeSchematicV1Reader; +import com.sk89q.worldedit.extent.clipboard.io.sponge.SpongeSchematicV2Reader; +import com.sk89q.worldedit.extent.clipboard.io.sponge.SpongeSchematicV3Reader; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.regions.Region; @@ -33,13 +35,15 @@ import com.sk89q.worldedit.session.ClipboardHolder; import de.steamwar.sql.NodeData; import org.bukkit.entity.Player; import org.bukkit.util.Vector; +import org.enginehub.linbus.stream.LinBinaryIO; +import java.io.DataInputStream; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; -import java.util.zip.GZIPInputStream; +import java.util.function.Function; public class WorldEditWrapper21 implements WorldEditWrapper { @@ -76,19 +80,37 @@ public class WorldEditWrapper21 implements WorldEditWrapper { throw new IOException("No clipboard found"); } + private static final Function FastV3 = FastSchematicReaderV3::new; + private static final Function FastV2 = inputStream -> new FastSchematicReaderV2(new NBTInputStream(inputStream)); + private static final Function McEdit = inputStream -> new MCEditSchematicReader(new NBTInputStream(inputStream)); + private static final Function SpongeV3 = inputStream -> new SpongeSchematicV3Reader(LinBinaryIO.read(new DataInputStream(inputStream))); + private static final Function SpongeV2 = inputStream -> new SpongeSchematicV2Reader(LinBinaryIO.read(new DataInputStream(inputStream))); + private static final Function SpongeV1 = inputStream -> new SpongeSchematicV1Reader(LinBinaryIO.read(new DataInputStream(inputStream))); + + private static final Function[] READERS = new Function[]{ + FastV3, + FastV2, + SpongeV3, + SpongeV2, + SpongeV1, + McEdit + }; + @Override public Clipboard getClipboard(InputStream inputStream) throws IOException { - // Only supports getNativeFormat() both with GZIP as well as without! ResetableInputStream is = new ResetableInputStream(inputStream); - try { - return new FastSchematicReaderV3(inputStream).read(); - } catch (Exception e) { - is.reset(); - } - try { - return new FastSchematicReaderV3(new GZIPInputStream(is)).read(); - } catch (Exception e) { - is.reset(); + for (Function reader : READERS) { + FilterInputStream fis = new FilterInputStream(is) { + @Override + public void close() throws IOException { + // Ignore close call! + } + }; + try { + return reader.apply(fis).read(); + } catch (Exception e) { + is.reset(); + } } is.close(); throw new IOException("No clipboard found"); From 487a15849a322e719211e62ba402c93880c7276a Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sun, 29 Mar 2026 13:12:09 +0200 Subject: [PATCH 30/62] Add supress warnings --- .../SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java b/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java index 326bcd95..b1e97156 100644 --- a/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java +++ b/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java @@ -81,7 +81,9 @@ public class WorldEditWrapper21 implements WorldEditWrapper { } private static final Function FastV3 = FastSchematicReaderV3::new; + @SuppressWarnings("removal") private static final Function FastV2 = inputStream -> new FastSchematicReaderV2(new NBTInputStream(inputStream)); + @SuppressWarnings("removal") private static final Function McEdit = inputStream -> new MCEditSchematicReader(new NBTInputStream(inputStream)); private static final Function SpongeV3 = inputStream -> new SpongeSchematicV3Reader(LinBinaryIO.read(new DataInputStream(inputStream))); private static final Function SpongeV2 = inputStream -> new SpongeSchematicV2Reader(LinBinaryIO.read(new DataInputStream(inputStream))); From 569d91a0d384d8f69653a139a6dd568127cd3904 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sun, 29 Mar 2026 14:15:01 +0200 Subject: [PATCH 31/62] Remove SelectAdjacent as it annoys most players --- .../features/worldedit/SelectAdjacent.java | 189 ------------------ .../teamserver/listener/SelectAdjacent.java | 181 ----------------- 2 files changed, 370 deletions(-) delete mode 100644 BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/worldedit/SelectAdjacent.java delete mode 100644 Teamserver/src/de/steamwar/teamserver/listener/SelectAdjacent.java diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/worldedit/SelectAdjacent.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/worldedit/SelectAdjacent.java deleted file mode 100644 index 3f6ca8f2..00000000 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/worldedit/SelectAdjacent.java +++ /dev/null @@ -1,189 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2025 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.worldedit; - -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.region.Point; -import de.steamwar.bausystem.region.Region; -import de.steamwar.bausystem.utils.FlatteningWrapper; -import de.steamwar.core.SWPlayer; -import de.steamwar.core.WorldEditRenderer; -import de.steamwar.linkage.Linked; -import de.steamwar.linkage.MinVersion; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.scheduler.BukkitTask; -import org.bukkit.util.Vector; - -import java.util.HashSet; -import java.util.Set; -import java.util.function.Predicate; - -@Linked -@MinVersion(20) -public class SelectAdjacent implements Listener { - - private Vector[] FACES = { - new Vector(1, 0, 0), - new Vector(-1, 0, 0), - new Vector(0, 1, 0), - new Vector(0, -1, 0), - new Vector(0, 0, 1), - new Vector(0, 0, -1), - - new Vector(1, 1, 0), - new Vector(1, -1, 0), - new Vector(1, 0, 1), - new Vector(1, 0, -1), - new Vector(-1, 1, 0), - new Vector(-1, -1, 0), - new Vector(-1, 0, 1), - new Vector(-1, 0, -1), - new Vector(0, 1, 1), - new Vector(0, 1, -1), - new Vector(0, -1, 1), - new Vector(0, -1, -1), - }; - - @EventHandler - public void onPlayerInteract(PlayerInteractEvent event) { - if (!event.hasItem()) return; - if (event.getItem().getType() != Material.WOODEN_AXE) return; - if (!event.getPlayer().isSneaking()) return; - if (event.getAction() != Action.LEFT_CLICK_BLOCK) return; - Material material = event.getPlayer().getInventory().getItemInOffHand().getType(); - Selector selector; - if (material.isAir()) { - selector = new Selector(event.getClickedBlock(), event.getPlayer(), __ -> true); - } else { - selector = new Selector(event.getClickedBlock(), event.getPlayer(), type -> type == material); - } - SWPlayer.of(event.getPlayer()).setComponent(selector); - } - - private class Selector implements SWPlayer.Component { - - private static final int MAX_BLOCKS = 500_000; - - private int minX; - private int minY; - private int minZ; - private int maxX; - private int maxY; - private int maxZ; - - private BukkitTask bukkitTask; - private Predicate predicate; - private Set seen = new HashSet<>(); - private Set toCalc = new HashSet<>(); - - private Region.Area area; - - public Selector(Block block, Player player, Predicate predicate) { - this.predicate = predicate; - toCalc.add(block.getLocation()); - minX = block.getX(); - minY = block.getY(); - minZ = block.getZ(); - maxX = block.getX(); - maxY = block.getY(); - maxZ = block.getZ(); - - Region region = Region.getRegion(block.getLocation()); - area = Region.Area.EMPTY; - if (region.getBuildArea().inRegion(block.getLocation(), true)) { - area = region.getBuildArea(); - } else if (region.getTestblockArea().inRegion(block.getLocation(), true)) { - area = region.getTestblockArea(); - } else if (region.getArea().inRegion(block.getLocation(), true)) { - area = region.getArea(); - } - - bukkitTask = Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), () -> { - run(); - - long volume = (long)(maxX - minX + 1) * (long)(maxY - minY + 1) * (long)(maxZ - minZ + 1); - player.sendTitle("", "§e" + volume + " §7Blocks", 0, 5, 0); - - Point minPoint = new Point(minX, minY, minZ); - Point maxPoint = new Point(maxX, maxY, maxZ); - - FlatteningWrapper.impl.setSelection(player, minPoint, maxPoint); - WorldEditRenderer.renderPlayer(player); - - // boolean finished = toCalc.stream().allMatch(location -> { - // return location.getBlockX() >= minX && location.getBlockY() >= minY && location.getBlockZ() >= minZ && - // location.getBlockX() <= maxX && location.getBlockY() <= maxY && location.getBlockZ() <= maxZ; - // }); - - if (toCalc.isEmpty() || seen.size() > MAX_BLOCKS) { - bukkitTask.cancel(); - player.sendTitle("§aDone", "§e" + volume + " §7Blocks", 0, 20, 5); - SWPlayer.of(player).removeComponent(Selector.class); - } - }, 1, 1); - } - - private void cancel() { - bukkitTask.cancel(); - } - - private void run() { - Set current = toCalc; - toCalc = new HashSet<>(); - - for (Location location : current) { - Block block = location.getBlock(); - if (block.isEmpty() || block.isLiquid()) continue; - if (!predicate.test(block.getType())) continue; - seen.add(location); - if (!area.inRegion(block.getLocation(), true)) continue; - - minX = Math.min(minX, location.getBlockX()); - maxX = Math.max(maxX, location.getBlockX()); - minY = Math.min(minY, location.getBlockY()); - maxY = Math.max(maxY, location.getBlockY()); - minZ = Math.min(minZ, location.getBlockZ()); - maxZ = Math.max(maxZ, location.getBlockZ()); - - for (Vector face : FACES) { - Block next = block.getRelative(face.getBlockX(), face.getBlockY(), face.getBlockZ()); - if (next.isEmpty() || next.isLiquid()) continue; - if (!predicate.test(next.getType())) continue; - Location loc = next.getLocation(); - if (seen.contains(loc)) continue; - toCalc.add(loc); - } - } - } - - @Override - public void onUnmount(SWPlayer player) { - cancel(); - } - } -} diff --git a/Teamserver/src/de/steamwar/teamserver/listener/SelectAdjacent.java b/Teamserver/src/de/steamwar/teamserver/listener/SelectAdjacent.java deleted file mode 100644 index 4a9f4d0d..00000000 --- a/Teamserver/src/de/steamwar/teamserver/listener/SelectAdjacent.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2025 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.teamserver.listener; - -import com.sk89q.worldedit.bukkit.BukkitWorld; -import com.sk89q.worldedit.bukkit.WorldEditPlugin; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.regions.selector.CuboidRegionSelector; -import com.sk89q.worldedit.world.World; -import de.steamwar.core.WorldEditRenderer; -import de.steamwar.linkage.Linked; -import de.steamwar.linkage.MinVersion; -import de.steamwar.teamserver.Builder; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.scheduler.BukkitTask; -import org.bukkit.util.Vector; - -import java.util.*; -import java.util.function.Predicate; - -@Linked -@MinVersion(20) -public class SelectAdjacent implements Listener { - - private Vector[] FACES = { - new Vector(1, 0, 0), - new Vector(-1, 0, 0), - new Vector(0, 1, 0), - new Vector(0, -1, 0), - new Vector(0, 0, 1), - new Vector(0, 0, -1), - - new Vector(1, 1, 0), - new Vector(1, -1, 0), - new Vector(1, 0, 1), - new Vector(1, 0, -1), - new Vector(-1, 1, 0), - new Vector(-1, -1, 0), - new Vector(-1, 0, 1), - new Vector(-1, 0, -1), - new Vector(0, 1, 1), - new Vector(0, 1, -1), - new Vector(0, -1, 1), - new Vector(0, -1, -1), - }; - - private Map selectors = new HashMap<>(); - - @EventHandler - public void onPlayerInteract(PlayerInteractEvent event) { - if (!event.hasItem()) return; - if (event.getItem().getType() != Material.WOODEN_AXE) return; - if (!event.getPlayer().isSneaking()) return; - if (event.getAction() != Action.LEFT_CLICK_BLOCK) return; - Selector selector = selectors.get(event.getPlayer()); - if (selector != null) selector.cancel(); - Material material = event.getPlayer().getInventory().getItemInOffHand().getType(); - if (material.isAir()) { - selector = new Selector(event.getClickedBlock(), event.getPlayer(), __ -> true); - } else { - selector = new Selector(event.getClickedBlock(), event.getPlayer(), type -> type == material); - } - selectors.put(event.getPlayer(), selector); - } - - @EventHandler - public void onPlayerQuit(PlayerQuitEvent event) { - Selector selector = selectors.remove(event.getPlayer()); - if (selector != null) selector.cancel(); - } - - private static final WorldEditPlugin WORLDEDIT_PLUGIN = Objects.requireNonNull((WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit")); - private static final World BUKKITWORLD = new BukkitWorld(Bukkit.getWorlds().get(0)); - - private class Selector { - - private static final int MAX_BLOCKS = 1_000_000; - - private int minX; - private int minY; - private int minZ; - private int maxX; - private int maxY; - private int maxZ; - - private BukkitTask bukkitTask; - private Predicate predicate; - private Set seen = new HashSet<>(); - private Set toCalc = new HashSet<>(); - - public Selector(Block block, Player player, Predicate predicate) { - this.predicate = predicate; - toCalc.add(block.getLocation()); - minX = block.getX(); - minY = block.getY(); - minZ = block.getZ(); - maxX = block.getX(); - maxY = block.getY(); - maxZ = block.getZ(); - - bukkitTask = Bukkit.getScheduler().runTaskTimer(Builder.getInstance(), () -> { - run(); - - long volume = (long)(maxX - minX + 1) * (long)(maxY - minY + 1) * (long)(maxZ - minZ + 1); - player.sendTitle("", "§e" + volume + " §7Blocks", 0, 5, 0); - - WORLDEDIT_PLUGIN.getSession(player).setRegionSelector(BUKKITWORLD, new CuboidRegionSelector(BUKKITWORLD, BlockVector3.at(minX, minY, minZ), BlockVector3.at(maxX, maxY, maxZ))); - WorldEditRenderer.renderPlayer(player); - - // boolean finished = toCalc.stream().allMatch(location -> { - // return location.getBlockX() >= minX && location.getBlockY() >= minY && location.getBlockZ() >= minZ && - // location.getBlockX() <= maxX && location.getBlockY() <= maxY && location.getBlockZ() <= maxZ; - // }); - - if (toCalc.isEmpty() || seen.size() > MAX_BLOCKS) { - bukkitTask.cancel(); - player.sendTitle("§aDone", "§e" + volume + " §7Blocks", 0, 20, 5); - } - }, 1, 1); - } - - private void cancel() { - bukkitTask.cancel(); - } - - private void run() { - Set current = toCalc; - toCalc = new HashSet<>(); - - for (Location location : current) { - Block block = location.getBlock(); - if (block.isEmpty() || block.isLiquid()) continue; - if (!predicate.test(block.getType())) continue; - seen.add(location); - - minX = Math.min(minX, location.getBlockX()); - maxX = Math.max(maxX, location.getBlockX()); - minY = Math.min(minY, location.getBlockY()); - maxY = Math.max(maxY, location.getBlockY()); - minZ = Math.min(minZ, location.getBlockZ()); - maxZ = Math.max(maxZ, location.getBlockZ()); - - for (Vector face : FACES) { - Block next = block.getRelative(face.getBlockX(), face.getBlockY(), face.getBlockZ()); - if (next.isEmpty() || next.isLiquid()) continue; - if (!predicate.test(next.getType())) continue; - Location loc = next.getLocation(); - if (seen.contains(loc)) continue; - toCalc.add(loc); - } - } - } - } -} From e190fe08589096bc8cb662481203a3bed65d9d85 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Wed, 1 Apr 2026 19:43:31 +0200 Subject: [PATCH 32/62] Fix FreezeListener --- .../bausystem/features/region/FreezeListener.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/FreezeListener.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/FreezeListener.java index 7222acab..91a9d650 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/FreezeListener.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/FreezeListener.java @@ -46,6 +46,16 @@ import org.bukkit.event.player.PlayerInteractEvent; @Linked public class FreezeListener implements Listener, ScoreboardElement { + @EventHandler + public void onBlockExplode(BlockExplodeEvent e) { + if (Region.getRegion(e.getBlock().getLocation()).getRegionData().get(Flag.FREEZE).isWithDefault(FreezeMode.INACTIVE)) return; + e.setCancelled(true); + BlockState state = e.getBlock().getState(); + Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> { + state.update(true, false); + }, 1L); + } + @EventHandler public void onEntitySpawn(EntitySpawnEvent e) { if (Region.getRegion(e.getLocation()).getRegionData().get(Flag.FREEZE).isWithDefault(FreezeMode.INACTIVE)) return; From 634465fbf1417ead5a9468cdcc5a19b7cd5edb29 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sat, 4 Apr 2026 12:08:17 +0200 Subject: [PATCH 33/62] Fix BanListener inserting bedrock ips --- .../src/de/steamwar/velocitycore/listeners/BanListener.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/VelocityCore/src/de/steamwar/velocitycore/listeners/BanListener.java b/VelocityCore/src/de/steamwar/velocitycore/listeners/BanListener.java index 53e4639e..08e3ef57 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/listeners/BanListener.java +++ b/VelocityCore/src/de/steamwar/velocitycore/listeners/BanListener.java @@ -46,7 +46,9 @@ public class BanListener extends BasicListener { SteamwarUser user = SteamwarUser.get(player.getUniqueId()); String ip = IPSanitizer.getTrueAddress(player).getHostAddress(); if (user.isPunished(Punishment.PunishmentType.Ban)) { - BannedUserIPs.banIP(user.getId(), ip); + if (!player.getUsername().startsWith(".")) { + BannedUserIPs.banIP(user.getId(), ip); + } Chatter.of(event).system(PunishmentCommand.punishmentMessage(user, Punishment.PunishmentType.Ban)); return; } From 97071165cdbb514134aa96e0ab597eab3bcc7b79 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sun, 5 Apr 2026 12:08:29 +0200 Subject: [PATCH 34/62] Fix IngameListener, OutsideWincondition, TowerGenerator --- .../de/steamwar/towerrun/generator/TowerGenerator.java | 4 ++-- .../src/de/steamwar/towerrun/listener/IngameListener.java | 8 ++++++-- .../towerrun/winconditions/OutsideWincondition.java | 4 ++++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/TowerRun/src/de/steamwar/towerrun/generator/TowerGenerator.java b/TowerRun/src/de/steamwar/towerrun/generator/TowerGenerator.java index ce0a33b7..0e1c8781 100644 --- a/TowerRun/src/de/steamwar/towerrun/generator/TowerGenerator.java +++ b/TowerRun/src/de/steamwar/towerrun/generator/TowerGenerator.java @@ -159,8 +159,8 @@ public class TowerGenerator { noKeyFloors--; if (!chestBlocks.isEmpty() && noKeyFloors < 0 && random.nextDouble() < config.keyChance) { noKeyFloors = random.nextInt(config.maxNoKeyFloors - config.minNoKeyFloors) + config.minNoKeyFloors; - for (int i = 0; i < 2; i++) { - Container container = chestBlocks.get(random.nextInt(chestBlocks.size())); + for (int i = 0; i < 2 && !chestBlocks.isEmpty(); i++) { + Container container = chestBlocks.remove(random.nextInt(chestBlocks.size())); keys.add(container.getLocation()); } diff --git a/TowerRun/src/de/steamwar/towerrun/listener/IngameListener.java b/TowerRun/src/de/steamwar/towerrun/listener/IngameListener.java index d85eafdf..c5550f72 100644 --- a/TowerRun/src/de/steamwar/towerrun/listener/IngameListener.java +++ b/TowerRun/src/de/steamwar/towerrun/listener/IngameListener.java @@ -161,7 +161,7 @@ public class IngameListener extends GameStateBukkitListener { event.setCancelled(true); if (!event.hasBlock()) return; if (event.getClickedBlock().getType() != Material.IRON_DOOR) return; - event.getPlayer().getInventory().setItemInMainHand(null); + event.getPlayer().getInventory().remove(event.getItem()); event.getClickedBlock().breakNaturally(); } @@ -223,6 +223,8 @@ public class IngameListener extends GameStateBukkitListener { shouldMelt(block.getRelative(0, 0, -1)); } + private static final Random RANDOM = new Random(); + private void shouldMelt(Block block) { if (block.getType().isBurnable()) return; if (block.getType().isAir()) return; @@ -269,7 +271,9 @@ public class IngameListener extends GameStateBukkitListener { break; } Pos pos = new Pos(block.getLocation().getBlockX(), block.getLocation().getBlockY(), block.getLocation().getBlockZ()); - blocksToMelt.putIfAbsent(pos, time + meltingTime + 1); + int delay = meltingTime + 1 + RANDOM.nextInt(30*20)-30*10; + if (delay < 0) delay = meltingTime + 1; + blocksToMelt.putIfAbsent(pos, time + delay); } @EventHandler diff --git a/TowerRun/src/de/steamwar/towerrun/winconditions/OutsideWincondition.java b/TowerRun/src/de/steamwar/towerrun/winconditions/OutsideWincondition.java index 8b241da5..fe7dc64a 100644 --- a/TowerRun/src/de/steamwar/towerrun/winconditions/OutsideWincondition.java +++ b/TowerRun/src/de/steamwar/towerrun/winconditions/OutsideWincondition.java @@ -42,6 +42,10 @@ public abstract class OutsideWincondition extends WinCondition { @EventHandler public void onPlayerMove(PlayerMoveEvent event) { if (event.getTo().getY() > WorldConfig.ESCAPE_HEIGHT) { + if (Arrays.stream(WorldConfig.REGIONS).noneMatch(region -> region.contains(event.getTo().toVector()))) { + TowerRunPlayer tPlayer = TowerRunPlayer.get(event.getPlayer()); + tPlayer.player().damage(Integer.MAX_VALUE); + } return; } From 34da59714e36c80bd1c0d830881d4fbf63eab849 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sun, 5 Apr 2026 12:30:55 +0200 Subject: [PATCH 35/62] Fix IngameListener and StartCommand --- .../de/steamwar/towerrun/commands/StartCommand.java | 3 +++ .../de/steamwar/towerrun/listener/IngameListener.java | 11 +++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/TowerRun/src/de/steamwar/towerrun/commands/StartCommand.java b/TowerRun/src/de/steamwar/towerrun/commands/StartCommand.java index 77884b37..44d285d5 100644 --- a/TowerRun/src/de/steamwar/towerrun/commands/StartCommand.java +++ b/TowerRun/src/de/steamwar/towerrun/commands/StartCommand.java @@ -22,6 +22,7 @@ package de.steamwar.towerrun.commands; import de.steamwar.command.SWCommand; import de.steamwar.command.TypeValidator; import de.steamwar.linkage.Linked; +import de.steamwar.linkage.LinkedInstance; import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.UserPerm; import de.steamwar.towerrun.TowerRun; @@ -30,6 +31,8 @@ import org.bukkit.entity.Player; @Linked public class StartCommand extends SWCommand { + + @LinkedInstance private LobbyCountdown countdown; public StartCommand() { diff --git a/TowerRun/src/de/steamwar/towerrun/listener/IngameListener.java b/TowerRun/src/de/steamwar/towerrun/listener/IngameListener.java index c5550f72..e928e66e 100644 --- a/TowerRun/src/de/steamwar/towerrun/listener/IngameListener.java +++ b/TowerRun/src/de/steamwar/towerrun/listener/IngameListener.java @@ -42,6 +42,7 @@ import org.bukkit.event.entity.EntityRegainHealthEvent; import org.bukkit.event.entity.ItemSpawnEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; import java.util.*; @@ -158,10 +159,16 @@ public class IngameListener extends GameStateBukkitListener { public void onKeyUse(PlayerInteractEvent event) { if (!event.hasItem()) return; if (event.getItem().getType() != Material.LEVER) return; - event.setCancelled(true); if (!event.hasBlock()) return; if (event.getClickedBlock().getType() != Material.IRON_DOOR) return; - event.getPlayer().getInventory().remove(event.getItem()); + if (event.getHand() == null) return; + event.setCancelled(true); + ItemStack itemStack = event.getItem(); + itemStack.setAmount(event.getItem().getAmount() - 1); + switch (event.getHand()) { + case OFF_HAND -> event.getPlayer().getInventory().setItemInOffHand(itemStack); + case HAND -> event.getPlayer().getInventory().setItemInMainHand(itemStack); + } event.getClickedBlock().breakNaturally(); } From 82abe7e20f961ac955995dc66aaa3ba46bbf7f5f Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sun, 5 Apr 2026 12:34:11 +0200 Subject: [PATCH 36/62] Fix OutsideWincondition --- .../de/steamwar/towerrun/winconditions/OutsideWincondition.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TowerRun/src/de/steamwar/towerrun/winconditions/OutsideWincondition.java b/TowerRun/src/de/steamwar/towerrun/winconditions/OutsideWincondition.java index fe7dc64a..3ea07fe7 100644 --- a/TowerRun/src/de/steamwar/towerrun/winconditions/OutsideWincondition.java +++ b/TowerRun/src/de/steamwar/towerrun/winconditions/OutsideWincondition.java @@ -42,7 +42,7 @@ public abstract class OutsideWincondition extends WinCondition { @EventHandler public void onPlayerMove(PlayerMoveEvent event) { if (event.getTo().getY() > WorldConfig.ESCAPE_HEIGHT) { - if (Arrays.stream(WorldConfig.REGIONS).noneMatch(region -> region.contains(event.getTo().toVector()))) { + if (event.getTo().getY() > WorldConfig.ESCAPE_HEIGHT + 10 && Arrays.stream(WorldConfig.REGIONS).noneMatch(region -> region.contains(event.getTo().toVector()))) { TowerRunPlayer tPlayer = TowerRunPlayer.get(event.getPlayer()); tPlayer.player().damage(Integer.MAX_VALUE); } From 573b0c14aed743a924d4759c50071b28fbb57c66 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Mon, 13 Apr 2026 20:03:41 +0200 Subject: [PATCH 37/62] Improve FightSystem REDUCED_DEBUG_INFO on Test Arena --- .../src/de/steamwar/fightsystem/FightSystem.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java index 15e2aeea..8fb49dfd 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java @@ -33,9 +33,6 @@ import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.OneShotStateDependent; import de.steamwar.fightsystem.states.StateDependentListener; import de.steamwar.fightsystem.utils.*; -import de.steamwar.fightsystem.winconditions.Wincondition; -import de.steamwar.fightsystem.winconditions.WinconditionComparisonTimeout; -import de.steamwar.fightsystem.winconditions.Winconditions; import de.steamwar.linkage.AbstractLinker; import de.steamwar.linkage.SpigotLinker; import de.steamwar.message.Message; @@ -43,6 +40,7 @@ import de.steamwar.sql.NodeData; import de.steamwar.sql.SchematicNode; import lombok.Getter; import org.bukkit.Bukkit; +import org.bukkit.GameRule; import org.bukkit.plugin.java.JavaPlugin; public class FightSystem extends JavaPlugin { @@ -100,6 +98,13 @@ public class FightSystem extends JavaPlugin { new StateDependentListener(ArenaMode.All, FightState.All, BountifulWrapper.impl.newDenyArrowPickupListener()); new OneShotStateDependent(ArenaMode.All, FightState.PreSchemSetup, () -> Fight.playSound(SWSound.BLOCK_NOTE_PLING.getSound(), 100.0f, 2.0f)); new OneShotStateDependent(ArenaMode.Test, FightState.All, WorldEditRendererCUIEditor::new); + if (Config.mode == ArenaMode.TEST) { + try { + Bukkit.getWorlds().get(0).setGameRule(GameRule.REDUCED_DEBUG_INFO, false); + } catch (Exception e) { + // Ignore if failed! + } + } techHider = new TechHiderWrapper(); hullHider = new HullHider(); From 60a82a685d138690cfa0b8678dae436cb1d6a983 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Mon, 13 Apr 2026 20:18:43 +0200 Subject: [PATCH 38/62] Improve FightSystem REDUCED_DEBUG_INFO on Test Arena --- .../src/de/steamwar/fightsystem/FightSystem.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java index 8fb49dfd..a88c752d 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java @@ -98,12 +98,10 @@ public class FightSystem extends JavaPlugin { new StateDependentListener(ArenaMode.All, FightState.All, BountifulWrapper.impl.newDenyArrowPickupListener()); new OneShotStateDependent(ArenaMode.All, FightState.PreSchemSetup, () -> Fight.playSound(SWSound.BLOCK_NOTE_PLING.getSound(), 100.0f, 2.0f)); new OneShotStateDependent(ArenaMode.Test, FightState.All, WorldEditRendererCUIEditor::new); - if (Config.mode == ArenaMode.TEST) { - try { - Bukkit.getWorlds().get(0).setGameRule(GameRule.REDUCED_DEBUG_INFO, false); - } catch (Exception e) { - // Ignore if failed! - } + try { + Bukkit.getWorlds().get(0).setGameRule(GameRule.REDUCED_DEBUG_INFO, ArenaMode.AntiTest.contains(Config.mode)); + } catch (Exception e) { + // Ignore if failed! } techHider = new TechHiderWrapper(); From 5a862b251bae47d8f248d40603e19fbef706256c Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Mon, 13 Apr 2026 20:29:47 +0200 Subject: [PATCH 39/62] Add BlockFormListener --- .../src/de/steamwar/sql/GameModeConfig.java | 8 ++++ .../listener/BlockFormListener.java | 44 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/BlockFormListener.java diff --git a/CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java b/CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java index 48989139..686470ff 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java +++ b/CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java @@ -440,6 +440,13 @@ public final class GameModeConfig { */ public final boolean DisableSnowMelt; + /** + * Disable ice forming + * + * @implSpec {@code false} by default + */ + public final boolean DisableIceForm; + /** * Allow leaving the arena area as spectator * @@ -470,6 +477,7 @@ public final class GameModeConfig { BorderFromSchematic = loader.getInt("BorderFromSchematic", 21); GroundWalkable = loader.getBoolean("GroundWalkable", true); DisableSnowMelt = loader.getBoolean("DisableSnowMelt", false); + DisableIceForm = loader.getBoolean("DisableIceForm", false); Leaveable = loader.getBoolean("Leaveable", false); AllowMissiles = loader.getBoolean("AllowMissiles", !EnterStages.isEmpty()); NoFloor = loader.getBoolean("NoFloor", false); diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/BlockFormListener.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/BlockFormListener.java new file mode 100644 index 00000000..f24124c0 --- /dev/null +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/BlockFormListener.java @@ -0,0 +1,44 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2026 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.fightsystem.listener; + +import de.steamwar.fightsystem.Config; +import de.steamwar.fightsystem.states.FightState; +import de.steamwar.fightsystem.states.StateDependentListener; +import de.steamwar.linkage.Linked; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockFormEvent; + +@Linked +public class BlockFormListener implements Listener { + + public BlockFormListener() { + new StateDependentListener(Config.GameModeConfig.Arena.DisableIceForm, FightState.All, this); + } + + @EventHandler + public void onBlockForm(BlockFormEvent event) { + if (Config.ArenaRegion.inRegion(event.getBlock()) && event.getBlock().getType() == Material.ICE) { + event.setCancelled(true); + } + } +} From b466216b3a6bc715d363d7a3d3e88ad075631f7f Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Mon, 13 Apr 2026 20:33:11 +0200 Subject: [PATCH 40/62] Fix BlockFormListener --- .../src/de/steamwar/fightsystem/listener/BlockFormListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/BlockFormListener.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/BlockFormListener.java index f24124c0..29c6be82 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/BlockFormListener.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/BlockFormListener.java @@ -37,7 +37,7 @@ public class BlockFormListener implements Listener { @EventHandler public void onBlockForm(BlockFormEvent event) { - if (Config.ArenaRegion.inRegion(event.getBlock()) && event.getBlock().getType() == Material.ICE) { + if (Config.ArenaRegion.inRegion(event.getBlock()) && event.getNewState().getType() == Material.ICE) { event.setCancelled(true); } } From 2208dcc0fbae5b956a33607e888cc3da3322b830 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Wed, 15 Apr 2026 18:20:07 +0200 Subject: [PATCH 41/62] Fix Set Parent Signed-off-by: Chaoscaot --- CommonCore/SQL/src/de/steamwar/sql/NodeMember.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CommonCore/SQL/src/de/steamwar/sql/NodeMember.kt b/CommonCore/SQL/src/de/steamwar/sql/NodeMember.kt index cf6d951e..febe5808 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/NodeMember.kt +++ b/CommonCore/SQL/src/de/steamwar/sql/NodeMember.kt @@ -94,7 +94,7 @@ class NodeMember(id: EntityID) : CompositeEntity(id) { { Optional.ofNullable(it?.value) }) private set - fun setParentId(id: Int?) { + fun setParentId(id: Int?) = useDb { parent = Optional.ofNullable(id) } From f69ae3e77b9b2ec7c2cff4371da0f6a82e16a531 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Mon, 20 Apr 2026 13:31:39 +0200 Subject: [PATCH 42/62] Fix BauLock --- VelocityCore/src/de/steamwar/velocitycore/util/BauLock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VelocityCore/src/de/steamwar/velocitycore/util/BauLock.java b/VelocityCore/src/de/steamwar/velocitycore/util/BauLock.java index ee8d7e71..e36fc904 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/util/BauLock.java +++ b/VelocityCore/src/de/steamwar/velocitycore/util/BauLock.java @@ -55,7 +55,7 @@ public class BauLock { break; case SUPERVISOR: BauweltMember member = BauweltMember.getBauMember(owner.getId(), target.getId()); - locked = !member.isSupervisor(); + locked = member == null || !member.isSupervisor(); break; case SERVERTEAM: locked = !target.hasPerm(UserPerm.TEAM); From 67e9a3544e70f0cda0bd1476399285e4c0611d56 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Mon, 20 Apr 2026 13:45:16 +0200 Subject: [PATCH 43/62] Fix Tablist.disable removing gm knowledge --- VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java | 1 - 1 file changed, 1 deletion(-) diff --git a/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java b/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java index 125e0388..f80b57cf 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java +++ b/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java @@ -158,7 +158,6 @@ public class Tablist extends ChannelInboundHandlerAdapter { public void disable() { sendTabPacket(new ArrayList<>(directTabItems.values()), null); - directTabItems.clear(); sendTabPacket(current, null); current.clear(); From 41ea6c94073c4b57515ead699578ed947418307f Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Thu, 23 Apr 2026 08:27:43 +0200 Subject: [PATCH 44/62] Fix ViewFlag.ADVANCED --- .../steamwar/bausystem/features/tracer/rendering/ViewFlag.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java index 3e1dff3e..3029fe63 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java @@ -135,7 +135,7 @@ public abstract class ViewFlag { } Location secoundLocation; - if (previousVelocity.getX() >= previousVelocity.getZ()) { + if (Math.abs(previousVelocity.getX()) >= Math.abs(previousVelocity.getZ())) { secoundLocation = previous.getLocation().clone().add(delta.getX(), delta.getY(), 0); } else { secoundLocation = previous.getLocation().clone().add(0, delta.getY(), delta.getZ()); From 9ac3bf6a6c6475fde173b83f61ee778f07b138d9 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Thu, 23 Apr 2026 11:54:50 +0200 Subject: [PATCH 45/62] Redesign GameModeConfig and SchematicType --- .../src/de/steamwar/sql/GameModeConfig.java | 26 +++++- .../SQL/src/de/steamwar/sql/SchematicType.kt | 93 ++++++++++--------- .../de/steamwar/velocitycore/ArenaMode.java | 13 ++- 3 files changed, 79 insertions(+), 53 deletions(-) diff --git a/CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java b/CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java index 686470ff..906a9c87 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java +++ b/CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java @@ -52,6 +52,10 @@ public final class GameModeConfig { private static final Map> byGameName; private static final Map> bySchematicType; + public static Collection> getAll() { + return (Collection) byFileName.values(); + } + public static GameModeConfig getByFileName(File file) { return (GameModeConfig) byFileName.get(file.getName()); } @@ -87,8 +91,24 @@ public final class GameModeConfig { byFileName = new HashMap<>(); byGameName = new HashMap<>(); bySchematicType = new HashMap<>(); - SchematicType.values(); DEFAULTS = SQLWrapper.impl.loadGameModeConfig(null); + init(); + } + + public static void init() { + byFileName.clear(); + byGameName.clear(); + bySchematicType.clear(); + + File folder = SQLWrapper.impl.getSchemTypesFolder(); + if (!folder.exists()) return; + if (!folder.isDirectory()) return; + + for (File file : Objects.requireNonNull(folder.listFiles())) { + if (!file.getName().endsWith(".yml")) continue; + if (file.getName().endsWith(".kits.yml")) continue; + SQLWrapper.impl.loadGameModeConfig(file); + } byFileName.values().forEach(gameModeConfig -> { List subTypes = Collections.unmodifiableList(gameModeConfig.Schematic.SubTypesStrings.stream() @@ -671,9 +691,9 @@ public final class GameModeConfig { loaded = loader.canLoad(); Size = new SizeConfig(loader.with("Size")); Inset = new InsetConfig(loader.with("Inset")); - Type = loader.getSchematicType("Type", "Normal"); + Type = null; SubTypesStrings = loader.getStringList("SubTypes"); - SubTypes = loader.getSchematicTypeList("SubTypes"); + SubTypes = new ArrayList<>(); Shortcut = loader.getString("Shortcut", ""); Material = loader.getMaterial("Material", "STONE_BUTTON"); ManualCheck = loader.getBoolean("ManualCheck", true); diff --git a/CommonCore/SQL/src/de/steamwar/sql/SchematicType.kt b/CommonCore/SQL/src/de/steamwar/sql/SchematicType.kt index b7f7d5be..d4abc36c 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/SchematicType.kt +++ b/CommonCore/SQL/src/de/steamwar/sql/SchematicType.kt @@ -19,11 +19,7 @@ package de.steamwar.sql -import java.io.File import java.util.* -import java.util.Locale -import java.util.Locale.getDefault -import java.util.stream.Collectors data class SchematicType( val name: String, @@ -47,58 +43,65 @@ data class SchematicType( @JvmField val Normal = SchematicType("Normal", "", Type.NORMAL, null, "STONE_BUTTON", false) - private val types: List - private val fromDB: Map? + private val types: MutableList = mutableListOf() + private val fromDB: MutableMap = mutableMapOf() init { - val tmpTypes = mutableListOf() - val tmpFromDB = mutableMapOf() - - tmpTypes.add(Normal) - tmpFromDB[Normal.toDB()] = Normal - - val folder = SQLWrapper.impl.schemTypesFolder - if (folder.exists()) { - for (configFile in Arrays.stream(folder.listFiles { _, name -> - name.endsWith( - ".yml" - ) && !name.endsWith(".kits.yml") - }).sorted().collect(Collectors.toList())) { - val gameModeConfig = SQLWrapper.impl.loadGameModeConfig(configFile) - if (gameModeConfig.Schematic.Type == null) continue - if (tmpFromDB.containsKey(gameModeConfig.Schematic.Type.toDB())) continue - val current = gameModeConfig.Schematic.Type - if (gameModeConfig.CheckQuestions.isNotEmpty()) { - val checkType = current.checkType - tmpTypes.add(checkType!!) - tmpFromDB[checkType.toDB()] = checkType - } - tmpTypes.add(current) - tmpFromDB[current.toDB()] = current - SQLWrapper.impl.processSchematicType(gameModeConfig) - } - } - - types = tmpTypes.toList() - fromDB = tmpFromDB.toMap() + GameModeConfig.init() + init() } @JvmStatic - fun values() = types + fun init() { + types.clear() + fromDB.clear() + + types.add(Normal) + fromDB[Normal.toDB()] = Normal + + for (gameModeConfig in GameModeConfig.getAll()) { + val type = gameModeConfig.Schematic.Type + ?: continue + if (fromDB.containsKey(type.toDB())) continue + + types.add(type) + fromDB[type.toDB()] = type + if (gameModeConfig.CheckQuestions.isNotEmpty() && type.checkType != null) { + types.add(type.checkType) + fromDB[type.checkType.toDB()] = type.checkType + } + } + } @JvmStatic - fun fromDB(value: String) = fromDB?.let { it[value.lowercase()] } + fun values() = + types + + @JvmStatic + fun fromDB(value: String) = + fromDB[value.lowercase()] } - fun name() = name - fun toDB() = name.lowercase() + fun name() = + name - fun check() = type == Type.CHECK_TYPE - fun fightType() = type == Type.FIGHT_TYPE - fun writeable() = type == Type.NORMAL + fun toDB() = + name.lowercase() - fun checkType() = if (manualCheck) checkType else this - fun isAssignable() = type == Type.NORMAL || (type == Type.FIGHT_TYPE && checkType != null) || !manualCheck + fun check() = + type == Type.CHECK_TYPE + + fun fightType() = + type == Type.FIGHT_TYPE + + fun writeable() = + type == Type.NORMAL + + fun checkType() = + if (manualCheck) checkType else this + + fun isAssignable() = + type == Type.NORMAL || (type == Type.FIGHT_TYPE && checkType != null) || !manualCheck enum class Type { NORMAL, diff --git a/VelocityCore/src/de/steamwar/velocitycore/ArenaMode.java b/VelocityCore/src/de/steamwar/velocitycore/ArenaMode.java index 9657e30c..1d66ec3a 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/ArenaMode.java +++ b/VelocityCore/src/de/steamwar/velocitycore/ArenaMode.java @@ -25,7 +25,10 @@ import lombok.Getter; import lombok.experimental.UtilityClass; import java.io.File; -import java.util.*; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; @UtilityClass public class ArenaMode { @@ -50,12 +53,12 @@ public class ArenaMode { if(!folder.exists()) return; - for(File file : Arrays.stream(folder.listFiles((file, name) -> name.endsWith(".yml") && !name.endsWith(".kits.yml") && !name.equals("config.yml"))).sorted().toList()) { - GameModeConfig gameModeConfig = new GameModeConfig<>(file, GameModeConfig.ToString, GameModeConfig.ToString, GameModeConfig.ToInternalName, false); + GameModeConfig.init(); + SchematicType.init(); + for (GameModeConfig gameModeConfig : GameModeConfig.getAll()) { if (!gameModeConfig.Server.loaded) continue; - allModes.add(gameModeConfig); - byInternal.put(file.getName().replace(".yml", ""), gameModeConfig); + byInternal.put(gameModeConfig.configFile.getName().replace(".yml", ""), gameModeConfig); for (String name : gameModeConfig.Server.ChatNames) { byChat.put(name.toLowerCase(), gameModeConfig); } From 703639537dc4d1c1e95f2cbdb9352c7344555c5e Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Thu, 23 Apr 2026 11:59:28 +0200 Subject: [PATCH 46/62] Fix CreateKitCommand --- .../steamwar/bausystem/features/dev/CreateKitCommand.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/dev/CreateKitCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/dev/CreateKitCommand.java index 2f0fc185..8008dc25 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/dev/CreateKitCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/dev/CreateKitCommand.java @@ -19,6 +19,7 @@ package de.steamwar.bausystem.features.dev; +import de.steamwar.bausystem.BauSystem; import de.steamwar.command.SWCommand; import de.steamwar.linkage.Linked; import org.bukkit.configuration.file.YamlConfiguration; @@ -29,11 +30,10 @@ import java.io.IOException; @Linked public class CreateKitCommand extends SWCommand { + public CreateKitCommand() { super("createkit"); - if (System.getProperty("user.name").equals("minecraft")) { - unregister(); - } + if (!BauSystem.DEV_SERVER) unregister(); } @Register From 4a646e6be0b63ffe952b066106727c28f8c50c0c Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Thu, 23 Apr 2026 12:09:17 +0200 Subject: [PATCH 47/62] Improve WindchargeStopper --- .../steamwar/fightsystem/listener/WindchargeStopper21.java | 4 ++-- .../steamwar/fightsystem/listener/WindchargeStopper8.java | 4 ---- .../de/steamwar/fightsystem/listener/WindchargeStopper.java | 6 ++---- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/listener/WindchargeStopper21.java b/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/listener/WindchargeStopper21.java index 90ae8a54..892312f6 100644 --- a/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/listener/WindchargeStopper21.java +++ b/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/listener/WindchargeStopper21.java @@ -26,8 +26,8 @@ import net.minecraft.world.entity.projectile.windcharge.WindCharge; import org.bukkit.Location; public class WindchargeStopper21 implements WindchargeStopper.IWindchargeStopper { - @Override - public void init() { + + public WindchargeStopper21() { new StateDependentTask(true, FightState.Running, this::run, 1, 1); } diff --git a/FightSystem/FightSystem_8/src/de/steamwar/fightsystem/listener/WindchargeStopper8.java b/FightSystem/FightSystem_8/src/de/steamwar/fightsystem/listener/WindchargeStopper8.java index c8863680..74f769c5 100644 --- a/FightSystem/FightSystem_8/src/de/steamwar/fightsystem/listener/WindchargeStopper8.java +++ b/FightSystem/FightSystem_8/src/de/steamwar/fightsystem/listener/WindchargeStopper8.java @@ -20,8 +20,4 @@ package de.steamwar.fightsystem.listener; public class WindchargeStopper8 implements WindchargeStopper.IWindchargeStopper { - @Override - public void init() { - - } } diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/WindchargeStopper.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/WindchargeStopper.java index d0301006..0218f58d 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/WindchargeStopper.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/WindchargeStopper.java @@ -25,13 +25,11 @@ import de.steamwar.linkage.Linked; @Linked public class WindchargeStopper { - private static final IWindchargeStopper impl = VersionDependent.getVersionImpl(FightSystem.getPlugin()); - public WindchargeStopper() { - impl.init(); + static { + VersionDependent.getVersionImpl(FightSystem.getPlugin()); } public interface IWindchargeStopper { - void init(); } } From 86e212fe4243aaa121d0f005d4dcb42aadb2520b Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Thu, 23 Apr 2026 18:23:13 +0200 Subject: [PATCH 48/62] Fix Kits Signed-off-by: Chaoscaot --- FightSystem/FightSystem_21/build.gradle.kts | 1 + .../utils/FlatteningWrapper21.java | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/FlatteningWrapper21.java diff --git a/FightSystem/FightSystem_21/build.gradle.kts b/FightSystem/FightSystem_21/build.gradle.kts index a8c67f6f..6de2b25a 100644 --- a/FightSystem/FightSystem_21/build.gradle.kts +++ b/FightSystem/FightSystem_21/build.gradle.kts @@ -42,4 +42,5 @@ dependencies { compileOnly(libs.fastutil) compileOnly(libs.authlib) + compileOnly(project(":FightSystem:FightSystem_14")) } diff --git a/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/FlatteningWrapper21.java b/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/FlatteningWrapper21.java new file mode 100644 index 00000000..70dad919 --- /dev/null +++ b/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/FlatteningWrapper21.java @@ -0,0 +1,33 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2025 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.fightsystem.utils; + +import org.bukkit.inventory.ItemStack; + +public class FlatteningWrapper21 extends FlatteningWrapper14 { + @Override + public boolean hasAttributeModifier(ItemStack stack) { + if (!stack.getDataTypes().isEmpty()) { + return true; + } + + return super.hasAttributeModifier(stack); + } +} From 30a499be1ddef061133b7f38c6690356fe6b9899 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Thu, 23 Apr 2026 23:32:57 +0200 Subject: [PATCH 49/62] Hotfix CheckCommand Remove uneeded stuff in SQLWrapper --- .../SQL/src/de/steamwar/sql/SQLWrapper.java | 3 --- .../src/de/steamwar/sql/SQLWrapperImpl.java | 10 ---------- .../velocitycore/commands/CheckCommand.java | 17 +++-------------- 3 files changed, 3 insertions(+), 27 deletions(-) diff --git a/CommonCore/SQL/src/de/steamwar/sql/SQLWrapper.java b/CommonCore/SQL/src/de/steamwar/sql/SQLWrapper.java index 47331406..f049f680 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/SQLWrapper.java +++ b/CommonCore/SQL/src/de/steamwar/sql/SQLWrapper.java @@ -36,8 +36,5 @@ public interface SQLWrapper { return Collections.emptyList(); } - default void processSchematicType(GameModeConfig gameModeConfig) { - } - void additionalExceptionMetadata(StringBuilder builder); } diff --git a/VelocityCore/src/de/steamwar/sql/SQLWrapperImpl.java b/VelocityCore/src/de/steamwar/sql/SQLWrapperImpl.java index 8e469d20..ce6e06d7 100644 --- a/VelocityCore/src/de/steamwar/sql/SQLWrapperImpl.java +++ b/VelocityCore/src/de/steamwar/sql/SQLWrapperImpl.java @@ -22,7 +22,6 @@ package de.steamwar.sql; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.server.RegisteredServer; import de.steamwar.velocitycore.VelocityCore; -import de.steamwar.velocitycore.commands.CheckCommand; import java.io.File; @@ -38,15 +37,6 @@ public class SQLWrapperImpl implements SQLWrapper { return new GameModeConfig<>(file, GameModeConfig.ToString, GameModeConfig.ToString, GameModeConfig.ToInternalName, true); } - @Override - public void processSchematicType(GameModeConfig gameModeConfig) { - SchematicType type = gameModeConfig.Schematic.Type; - if (type.checkType() != null) { - CheckCommand.setCheckQuestions(type.checkType(), gameModeConfig.CheckQuestions); - CheckCommand.addFightType(type.checkType(), type); - } - } - @Override public void additionalExceptionMetadata(StringBuilder builder) { builder.append("\nServers: "); diff --git a/VelocityCore/src/de/steamwar/velocitycore/commands/CheckCommand.java b/VelocityCore/src/de/steamwar/velocitycore/commands/CheckCommand.java index fe78a018..c3957503 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/commands/CheckCommand.java +++ b/VelocityCore/src/de/steamwar/velocitycore/commands/CheckCommand.java @@ -48,20 +48,9 @@ import java.util.logging.Level; @Linked public class CheckCommand extends SWCommand { - private static final Map fightTypes = new HashMap<>(); - private static final Map> checkQuestions = new HashMap<>(); - private static final Map currentCheckers = new HashMap<>(); private static final Map currentSchems = new HashMap<>(); - public static void setCheckQuestions(SchematicType checkType, List checkQuestions) { - CheckCommand.checkQuestions.put(checkType, checkQuestions); - } - - public static void addFightType(SchematicType checkType, SchematicType fightType) { - fightTypes.put(checkType, fightType); - } - public static boolean isChecking(Player player){ return currentCheckers.containsKey(player.getUniqueId()); } @@ -248,9 +237,9 @@ public class CheckCommand extends SWCommand { this.checker = checker; this.schematic = schematic; this.startTime = Timestamp.from(Instant.now()); - this.checkList = checkQuestions.get(schematic.getSchemtype()).listIterator(); + this.checkList = GameModeConfig.getBySchematicType(schematic.getSchemtype()).CheckQuestions.listIterator(); - GameModeConfig mode = ArenaMode.getBySchemType(fightTypes.get(schematic.getSchemtype())); + GameModeConfig mode = GameModeConfig.getBySchematicType(schematic.getSchemtype()); new ServerStarter().test(mode, mode.getRandomMap(), checker.getPlayer()).check(schematic.getId()).callback(subserver -> { currentCheckers.put(checker.user().getUUID(), this); currentSchems.put(schematic.getId(), this); @@ -304,7 +293,7 @@ public class CheckCommand extends SWCommand { } private void accept(){ - concludeCheckSession("freigegeben", fightTypes.get(schematic.getSchemtype()), () -> { + concludeCheckSession("freigegeben", GameModeConfig.getBySchematicType(schematic.getSchemtype()).Schematic.Type, () -> { Chatter owner = Chatter.of(SteamwarUser.byId(schematic.getOwner()).getUUID()); owner.withPlayerOrOffline( player -> owner.system("CHECK_ACCEPTED", schematic.getSchemtype().name(), schematic.getName()), From fbe70e7eaded319cfb24a348aba10fc00e446482 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Fri, 24 Apr 2026 10:09:56 +0200 Subject: [PATCH 50/62] Improve CheckCommand for WGS --- .../velocitycore/commands/CheckCommand.java | 46 ++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/VelocityCore/src/de/steamwar/velocitycore/commands/CheckCommand.java b/VelocityCore/src/de/steamwar/velocitycore/commands/CheckCommand.java index c3957503..3b95a338 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/commands/CheckCommand.java +++ b/VelocityCore/src/de/steamwar/velocitycore/commands/CheckCommand.java @@ -40,6 +40,7 @@ import net.kyori.adventure.text.format.NamedTextColor; import java.awt.*; import java.sql.Timestamp; import java.time.Instant; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.List; import java.util.concurrent.TimeUnit; @@ -136,7 +137,7 @@ public class CheckCommand extends SWCommand { if(!schem.getSchemtype().check()){ VelocityCore.getLogger().log(Level.SEVERE, () -> sender.user().getUserName() + " tried to check an uncheckable schematic!"); return; - }else if(schem.getOwner() == sender.user().getId()) { + }else if(schem.getOwner() == sender.user().getId() && !sender.user().hasPerm(UserPerm.ADMINISTRATION)) { sender.system("CHECK_SCHEMATIC_OWN"); return; } @@ -293,6 +294,49 @@ public class CheckCommand extends SWCommand { } private void accept(){ + // TODO: This Code is only for the WGS and because YoyoNow is not available this can be removed or changed after the WGS! + if (schematic.getSchemtype().toDB().equals("cwargearseason26")) { + int userId = schematic.getOwner(); + SteamwarUser user = SteamwarUser.byId(userId); + int teamId = user.getTeam(); + + SchematicNode teamFolder = SchematicNode.getSchematicNodeInNode(172325) + .stream() + .filter(schematicNode -> schematicNode.getName().startsWith(teamId + "_")) + .findFirst() + .orElse(null); + if (teamFolder == null) { + internalAccept(); + return; + } + + // Copy Schem into team folder of -1 user + String name = DateTimeFormatter.ofPattern("yyyy.MM.dd_HH:mm:ss").format(schematic.getLastUpdate().toLocalDateTime()); + NodeData data = NodeData.getLatest(schematic); + SchematicNode node = SchematicNode.createSchematic(-1, name, teamFolder.getNodeId()); + NodeData.saveFromStream(node, data.schemData(false), data.getNodeFormat()); + + // Accept the team folder schematic and set other to Normal + node.setSchemtype(GameModeConfig.getBySchematicType(schematic.getSchemtype()).Schematic.Type); + + // Conclude by setting send in schematic to normal and broadcast + concludeCheckSession("freigegeben", SchematicType.Normal, () -> { + Chatter owner = Chatter.of(SteamwarUser.byId(schematic.getOwner()).getUUID()); + owner.withPlayerOrOffline( + player -> owner.system("CHECK_ACCEPTED", schematic.getSchemtype().name(), schematic.getName()), + () -> DiscordAlert.send(owner, Color.GREEN, new Message("DC_TITLE_SCHEMINFO"), new Message("DC_SCHEM_ACCEPT", schematic.getName()), true) + ); + notifyTeam(new Message("CHECK_ACCEPTED_TEAM", schematic.getName(), owner.user().getUserName())); + + return owner.getPlayer() != null; + }); + return; + } + + internalAccept(); + } + + private void internalAccept() { concludeCheckSession("freigegeben", GameModeConfig.getBySchematicType(schematic.getSchemtype()).Schematic.Type, () -> { Chatter owner = Chatter.of(SteamwarUser.byId(schematic.getOwner()).getUUID()); owner.withPlayerOrOffline( From ba7bd1f1dd0c346779a3d7381e65f43e0952852d Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Thu, 30 Apr 2026 12:52:46 +0200 Subject: [PATCH 51/62] Configure V21 impl --- .../SchematicSystem_21/build.gradle.kts | 32 +++++ .../autocheck/AutoChecker21.java | 133 ++++++++++++++++++ .../autocheck/AutoCheckerItems21.java | 49 +++++++ SchematicSystem/build.gradle.kts | 1 + settings.gradle.kts | 3 +- 5 files changed, 217 insertions(+), 1 deletion(-) create mode 100644 SchematicSystem/SchematicSystem_21/build.gradle.kts create mode 100644 SchematicSystem/SchematicSystem_21/src/de/steamwar/schematicsystem/autocheck/AutoChecker21.java create mode 100644 SchematicSystem/SchematicSystem_21/src/de/steamwar/schematicsystem/autocheck/AutoCheckerItems21.java diff --git a/SchematicSystem/SchematicSystem_21/build.gradle.kts b/SchematicSystem/SchematicSystem_21/build.gradle.kts new file mode 100644 index 00000000..ea8298e7 --- /dev/null +++ b/SchematicSystem/SchematicSystem_21/build.gradle.kts @@ -0,0 +1,32 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2025 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 . + */ + +plugins { + steamwar.java +} + +dependencies { + compileOnly(project(":SpigotCore", "default")) + compileOnly(project(":SchematicSystem:SchematicSystem_Core", "default")) + + compileOnly(libs.spigotapi) + + compileOnly(libs.nms21) + compileOnly(libs.fawe21) +} diff --git a/SchematicSystem/SchematicSystem_21/src/de/steamwar/schematicsystem/autocheck/AutoChecker21.java b/SchematicSystem/SchematicSystem_21/src/de/steamwar/schematicsystem/autocheck/AutoChecker21.java new file mode 100644 index 00000000..831f7cbc --- /dev/null +++ b/SchematicSystem/SchematicSystem_21/src/de/steamwar/schematicsystem/autocheck/AutoChecker21.java @@ -0,0 +1,133 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2026 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.schematicsystem.autocheck; + +import com.sk89q.jnbt.CompoundTag; +import com.sk89q.worldedit.entity.Entity; +import com.sk89q.worldedit.extent.clipboard.Clipboard; +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.world.block.BaseBlock; +import de.steamwar.core.Core; +import de.steamwar.sql.GameModeConfig; +import org.bukkit.Material; + +import java.util.*; +import java.util.stream.Collectors; + +public class AutoChecker21 implements AutoChecker.IAutoChecker { + + public AutoChecker.BlockScanResult scan(Clipboard clipboard) { + AutoChecker.BlockScanResult result = new AutoChecker.BlockScanResult(); + BlockVector3 min = clipboard.getMinimumPoint(); + BlockVector3 max = clipboard.getMaximumPoint(); + for (int x = min.getBlockX(); x <= max.getBlockX(); x++) { + for (int y = min.getBlockY(); y <= max.getBlockY(); y++) { + for (int z = min.getBlockZ(); z <= max.getBlockZ(); z++) { + final BaseBlock block = clipboard.getFullBlock(BlockVector3.at(x, y, z)); + final Material material = Material.matchMaterial(block.getBlockType().getId()); + if (material == null) { + continue; + } + + result.getBlockCounts().merge(material, 1, Integer::sum); + + if (AutoCheckerItems.impl.getInventoryMaterials().contains(material)) { + checkInventory(result, block, material, new BlockPos(x, y, z)); + } + + if (x == min.getBlockX() || x == max.getBlockX() || y == max.getBlockY() || z == min.getBlockZ() || z == max.getBlockZ()) { + result.getDesignBlocks().computeIfAbsent(material, m -> new ArrayList<>()).add(new BlockPos(x, y, z)); + } + } + } + } + return result; + } + + private static final Map> itemsInInv = new EnumMap<>(Material.class); + + static { + itemsInInv.put(Material.BUCKET, EnumSet.of(Material.DISPENSER)); + itemsInInv.put(Material.TNT, EnumSet.of(Material.CHEST, Material.BARREL, Material.SHULKER_BOX, Material.BLACK_SHULKER_BOX, Material.BLUE_SHULKER_BOX, + Material.BROWN_SHULKER_BOX, Material.CYAN_SHULKER_BOX, Material.GRAY_SHULKER_BOX, Material.GREEN_SHULKER_BOX, Material.LIGHT_BLUE_SHULKER_BOX, + Material.LIGHT_GRAY_SHULKER_BOX, Material.LIME_SHULKER_BOX, Material.MAGENTA_SHULKER_BOX, Material.ORANGE_SHULKER_BOX, + Material.PINK_SHULKER_BOX, Material.PURPLE_SHULKER_BOX, Material.RED_SHULKER_BOX, Material.WHITE_SHULKER_BOX, Material.YELLOW_SHULKER_BOX)); + itemsInInv.put(Material.FIRE_CHARGE, EnumSet.of(Material.DISPENSER)); + itemsInInv.put(Material.ARROW, EnumSet.of(Material.DISPENSER)); + itemsInInv.put(Material.WIND_CHARGE, EnumSet.of(Material.DISPENSER)); + AutoCheckerItems.impl.getAllowedMaterialsInInventory().forEach(material -> itemsInInv.put(material, AutoCheckerItems.impl.getInventoryMaterials())); + } + + private void checkInventory(AutoChecker.BlockScanResult result, BaseBlock block, Material material, BlockPos pos) { + CompoundTag nbt = block.getNbtData(); + if (nbt == null) { + result.getDefunctNbt().add(pos); + return; + } + + + if (material == Material.JUKEBOX && nbt.getValue().containsKey("RecordItem")) { + result.getRecords().add(pos); + return; + } + + List items = nbt.getList("Items", CompoundTag.class); + if (items.isEmpty()) + return; // Leeres Inventar + + int counter = 0; + for (CompoundTag item : items) { + if (!item.containsKey("id")) { + result.getDefunctNbt().add(pos); + continue; + } + + Material itemType = Material.matchMaterial(item.getString("id")); + if (itemType == null) // Leere Slots + continue; + + if (!itemsInInv.getOrDefault(itemType, EnumSet.noneOf(Material.class)).contains(material)) { + result.getForbiddenItems().computeIfAbsent(pos, blockVector3 -> new HashSet<>()).add(itemType); + } else if (material == Material.DISPENSER && (itemType == Material.ARROW || itemType == Material.FIRE_CHARGE)) { + counter += Core.getVersion() >= 21 ? item.getInt("count") : item.getByte("Count"); + } + if (item.containsKey("tag")) { + result.getForbiddenNbt().computeIfAbsent(pos, blockVector3 -> new HashSet<>()).add(itemType); + } + } + result.getDispenserItems().put(pos, counter); + } + + @Override + public AutoCheckerResult check(Clipboard clipboard, GameModeConfig type) { + return AutoCheckerResult.builder().type(type).height(clipboard.getDimensions().getBlockY()).width(clipboard.getDimensions().getBlockX()) + .depth(clipboard.getDimensions().getBlockZ()).blockScanResult(scan(clipboard)) + .entities(clipboard.getEntities().stream().map(Entity::getLocation) + .map(blockVector3 -> new BlockPos(blockVector3.getBlockX(), blockVector3.getBlockY(), blockVector3.getBlockZ())) + .collect(Collectors.toList())) + .build(); + } + + @Override + public AutoCheckerResult sizeCheck(Clipboard clipboard, GameModeConfig type) { + return AutoCheckerResult.builder().type(type).height(clipboard.getDimensions().getBlockY()).width(clipboard.getDimensions().getBlockX()) + .depth(clipboard.getDimensions().getBlockZ()).build(); + } +} diff --git a/SchematicSystem/SchematicSystem_21/src/de/steamwar/schematicsystem/autocheck/AutoCheckerItems21.java b/SchematicSystem/SchematicSystem_21/src/de/steamwar/schematicsystem/autocheck/AutoCheckerItems21.java new file mode 100644 index 00000000..af50a3fa --- /dev/null +++ b/SchematicSystem/SchematicSystem_21/src/de/steamwar/schematicsystem/autocheck/AutoCheckerItems21.java @@ -0,0 +1,49 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2025 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.schematicsystem.autocheck; + +import org.bukkit.Material; + +import java.util.EnumSet; +import java.util.Set; + +public class AutoCheckerItems21 implements AutoCheckerItems { + + private static final Set INVENTORY = EnumSet.of(Material.BARREL, Material.BLAST_FURNACE, Material.BREWING_STAND, Material.CAMPFIRE, + Material.CHEST, Material.DISPENSER, Material.DROPPER, Material.FURNACE, Material.HOPPER, Material.JUKEBOX, Material.SHULKER_BOX, + Material.WHITE_SHULKER_BOX, Material.ORANGE_SHULKER_BOX, Material.MAGENTA_SHULKER_BOX, Material.LIGHT_BLUE_SHULKER_BOX, Material.YELLOW_SHULKER_BOX, + Material.LIME_SHULKER_BOX, Material.PINK_SHULKER_BOX, Material.GRAY_SHULKER_BOX, Material.LIGHT_GRAY_SHULKER_BOX, Material.CYAN_SHULKER_BOX, + Material.PURPLE_SHULKER_BOX, Material.BLUE_SHULKER_BOX, Material.BROWN_SHULKER_BOX, Material.GREEN_SHULKER_BOX, Material.RED_SHULKER_BOX, + Material.BLACK_SHULKER_BOX, Material.SMOKER, Material.TRAPPED_CHEST); + + private static final Set FLOWERS = EnumSet.of(Material.CORNFLOWER, Material.POPPY, Material.FERN, Material.DANDELION, Material.BLUE_ORCHID, + Material.ALLIUM, Material.AZURE_BLUET, Material.RED_TULIP, Material.ORANGE_TULIP, Material.WHITE_TULIP, Material.PINK_TULIP, Material.OXEYE_DAISY, + Material.LILY_OF_THE_VALLEY, Material.WITHER_ROSE, Material.SUNFLOWER, Material.DIAMOND_HORSE_ARMOR, Material.IRON_HORSE_ARMOR, + Material.GOLDEN_HORSE_ARMOR, Material.LEATHER_HORSE_ARMOR, Material.HONEY_BOTTLE, Material.LILAC, Material.ROSE_BUSH, Material.PEONY, + Material.TALL_GRASS, Material.LARGE_FERN); + + @Override + public Set getInventoryMaterials() { + return INVENTORY; + } + + @Override + public Set getAllowedMaterialsInInventory() { + return FLOWERS; + } +} diff --git a/SchematicSystem/build.gradle.kts b/SchematicSystem/build.gradle.kts index 65613802..947812e3 100644 --- a/SchematicSystem/build.gradle.kts +++ b/SchematicSystem/build.gradle.kts @@ -32,4 +32,5 @@ dependencies { implementation(project(":SchematicSystem:SchematicSystem_15")) implementation(project(":SchematicSystem:SchematicSystem_19")) implementation(project(":SchematicSystem:SchematicSystem_20")) + implementation(project(":SchematicSystem:SchematicSystem_21")) } diff --git a/settings.gradle.kts b/settings.gradle.kts index 5f364d5b..0862fdce 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -101,7 +101,7 @@ dependencyResolutionManagement { library("hamcrest", "org.hamcrest:hamcrest:2.2") library("classindex", "org.atteo.classindex:classindex:3.13") - library("spigotapi", "org.spigotmc:spigot-api:1.20-R0.1-SNAPSHOT") + library("spigotapi", "org.spigotmc:spigot-api:1.21-R0.1-SNAPSHOT") library("spigotannotations", "org.spigotmc:plugin-annotations:1.2.3-SNAPSHOT") library("paperapi", "io.papermc.paper:paper-api:1.19.2-R0.1-SNAPSHOT") library("paperapi21", "io.papermc.paper:paper-api:1.21.6-R0.1-SNAPSHOT") @@ -222,6 +222,7 @@ include( "SchematicSystem:SchematicSystem_15", "SchematicSystem:SchematicSystem_19", "SchematicSystem:SchematicSystem_20", + "SchematicSystem:SchematicSystem_21", "SchematicSystem:SchematicSystem_Core" ) From 4f2732054826c500f82a588f8f9fed6ecc6a69e8 Mon Sep 17 00:00:00 2001 From: Manuel Frohn Date: Thu, 30 Apr 2026 14:44:54 +0200 Subject: [PATCH 52/62] Implement hardcoded windcharge check --- .../SchematicSystem_21/build.gradle.kts | 2 +- .../autocheck/AutoChecker21.java | 16 ++++++----- .../src/SchematicSystem.properties | 2 ++ .../src/SchematicSystem_de.properties | 2 ++ .../autocheck/AutoChecker.java | 1 + .../autocheck/AutoCheckerResult.java | 27 ++++++++++++++++++- settings.gradle.kts | 4 ++- 7 files changed, 45 insertions(+), 9 deletions(-) diff --git a/SchematicSystem/SchematicSystem_21/build.gradle.kts b/SchematicSystem/SchematicSystem_21/build.gradle.kts index ea8298e7..b9bfe6c9 100644 --- a/SchematicSystem/SchematicSystem_21/build.gradle.kts +++ b/SchematicSystem/SchematicSystem_21/build.gradle.kts @@ -25,7 +25,7 @@ dependencies { compileOnly(project(":SpigotCore", "default")) compileOnly(project(":SchematicSystem:SchematicSystem_Core", "default")) - compileOnly(libs.spigotapi) + compileOnly(libs.spigotapi21) compileOnly(libs.nms21) compileOnly(libs.fawe21) diff --git a/SchematicSystem/SchematicSystem_21/src/de/steamwar/schematicsystem/autocheck/AutoChecker21.java b/SchematicSystem/SchematicSystem_21/src/de/steamwar/schematicsystem/autocheck/AutoChecker21.java index 831f7cbc..e2b43bce 100644 --- a/SchematicSystem/SchematicSystem_21/src/de/steamwar/schematicsystem/autocheck/AutoChecker21.java +++ b/SchematicSystem/SchematicSystem_21/src/de/steamwar/schematicsystem/autocheck/AutoChecker21.java @@ -33,7 +33,7 @@ import java.util.stream.Collectors; public class AutoChecker21 implements AutoChecker.IAutoChecker { - public AutoChecker.BlockScanResult scan(Clipboard clipboard) { + public AutoChecker.BlockScanResult scan(Clipboard clipboard, GameModeConfig type) { AutoChecker.BlockScanResult result = new AutoChecker.BlockScanResult(); BlockVector3 min = clipboard.getMinimumPoint(); BlockVector3 max = clipboard.getMaximumPoint(); @@ -49,7 +49,7 @@ public class AutoChecker21 implements AutoChecker.IAutoChecker { result.getBlockCounts().merge(material, 1, Integer::sum); if (AutoCheckerItems.impl.getInventoryMaterials().contains(material)) { - checkInventory(result, block, material, new BlockPos(x, y, z)); + checkInventory(result, block, material, new BlockPos(x, y, z), type); } if (x == min.getBlockX() || x == max.getBlockX() || y == max.getBlockY() || z == min.getBlockZ() || z == max.getBlockZ()) { @@ -71,11 +71,10 @@ public class AutoChecker21 implements AutoChecker.IAutoChecker { Material.PINK_SHULKER_BOX, Material.PURPLE_SHULKER_BOX, Material.RED_SHULKER_BOX, Material.WHITE_SHULKER_BOX, Material.YELLOW_SHULKER_BOX)); itemsInInv.put(Material.FIRE_CHARGE, EnumSet.of(Material.DISPENSER)); itemsInInv.put(Material.ARROW, EnumSet.of(Material.DISPENSER)); - itemsInInv.put(Material.WIND_CHARGE, EnumSet.of(Material.DISPENSER)); AutoCheckerItems.impl.getAllowedMaterialsInInventory().forEach(material -> itemsInInv.put(material, AutoCheckerItems.impl.getInventoryMaterials())); } - private void checkInventory(AutoChecker.BlockScanResult result, BaseBlock block, Material material, BlockPos pos) { + private void checkInventory(AutoChecker.BlockScanResult result, BaseBlock block, Material material, BlockPos pos, GameModeConfig type) { CompoundTag nbt = block.getNbtData(); if (nbt == null) { result.getDefunctNbt().add(pos); @@ -93,6 +92,7 @@ public class AutoChecker21 implements AutoChecker.IAutoChecker { return; // Leeres Inventar int counter = 0; + int windChargeCount = 0; for (CompoundTag item : items) { if (!item.containsKey("id")) { result.getDefunctNbt().add(pos); @@ -103,7 +103,10 @@ public class AutoChecker21 implements AutoChecker.IAutoChecker { if (itemType == null) // Leere Slots continue; - if (!itemsInInv.getOrDefault(itemType, EnumSet.noneOf(Material.class)).contains(material)) { + if(type.Schematic.Type.equals("wargearseason26") && material == Material.DISPENSER && itemType == Material.WIND_CHARGE) { + windChargeCount += item.getInt("count"); + } + else if (!itemsInInv.getOrDefault(itemType, EnumSet.noneOf(Material.class)).contains(material)) { result.getForbiddenItems().computeIfAbsent(pos, blockVector3 -> new HashSet<>()).add(itemType); } else if (material == Material.DISPENSER && (itemType == Material.ARROW || itemType == Material.FIRE_CHARGE)) { counter += Core.getVersion() >= 21 ? item.getInt("count") : item.getByte("Count"); @@ -113,12 +116,13 @@ public class AutoChecker21 implements AutoChecker.IAutoChecker { } } result.getDispenserItems().put(pos, counter); + result.getWindChargeCount().put(pos, windChargeCount); } @Override public AutoCheckerResult check(Clipboard clipboard, GameModeConfig type) { return AutoCheckerResult.builder().type(type).height(clipboard.getDimensions().getBlockY()).width(clipboard.getDimensions().getBlockX()) - .depth(clipboard.getDimensions().getBlockZ()).blockScanResult(scan(clipboard)) + .depth(clipboard.getDimensions().getBlockZ()).blockScanResult(scan(clipboard, type)) .entities(clipboard.getEntities().stream().map(Entity::getLocation) .map(blockVector3 -> new BlockPos(blockVector3.getBlockX(), blockVector3.getBlockY(), blockVector3.getBlockZ())) .collect(Collectors.toList())) diff --git a/SchematicSystem/SchematicSystem_Core/src/SchematicSystem.properties b/SchematicSystem/SchematicSystem_Core/src/SchematicSystem.properties index 0ff05daa..da86e45c 100644 --- a/SchematicSystem/SchematicSystem_Core/src/SchematicSystem.properties +++ b/SchematicSystem/SchematicSystem_Core/src/SchematicSystem.properties @@ -262,6 +262,8 @@ AUTO_CHECKER_RESULT_BLOCKS=§7Blocks: §c{0}§7, Max: §e{1} AUTO_CHECKER_RESULT_UNKNOWN_MATERIAL=§7Unknown block: §c{0} AUTO_CHECKER_RESULT_TOO_MANY_BLOCK=§7{0}: §c{1}§7, Max: §e{2} AUTO_CHECKER_RESULT_FORBIDDEN_BLOCK=§7Forbidden block: §c{0} +AUTO_CHECKER_RESULT_WIND_CHARGES=§7Windcharges: §c{0}§7, Max: §e2048 +AUTO_CHECKER_RESULT_WIND_CHARGES_DISPENSER=§7Dispenser: §c[{0}, {1}, {2}]§7, Windcharges: §c{3}§7 AUTO_CHECKER_RESULT_FORBIDDEN_ITEM=§7Forbidden Item: [{0}, {1}, {2}] -> §c{3} AUTO_CHECKER_RESULT_DEFUNCT_NBT=§7Defunct NBT: §7[{0}, {1}, {2}] AUTO_CHECKER_RESULT_DESIGN_BLOCK=§7{0} in Design: [{1}, {2}, {3}] diff --git a/SchematicSystem/SchematicSystem_Core/src/SchematicSystem_de.properties b/SchematicSystem/SchematicSystem_Core/src/SchematicSystem_de.properties index 12030a2f..aa72936e 100644 --- a/SchematicSystem/SchematicSystem_Core/src/SchematicSystem_de.properties +++ b/SchematicSystem/SchematicSystem_Core/src/SchematicSystem_de.properties @@ -242,6 +242,8 @@ AUTO_CHECKER_RESULT_BLOCKS=§7Blöcke: §c{0}§7, Max: §e{1} AUTO_CHECKER_RESULT_UNKNOWN_MATERIAL=§7Unbekannter Block: §c{0} AUTO_CHECKER_RESULT_TOO_MANY_BLOCK=§7{0}: §c{1}§7, Max: §e{2} AUTO_CHECKER_RESULT_FORBIDDEN_BLOCK=§7Verbotener Block: §c{0} +AUTO_CHECKER_RESULT_WIND_CHARGES=§7Windcharges: §c{0}§7, Max: §e2048 +AUTO_CHECKER_RESULT_WIND_CHARGES_DISPENSER=§7Werfer: §c[{0}, {1}, {2}]§7, Windcharges: §c{3}§7 AUTO_CHECKER_RESULT_FORBIDDEN_ITEM=§7Verbotener gegenstand: [{0}, {1}, {2}] -> §c{3} AUTO_CHECKER_RESULT_DEFUNCT_NBT=§7Keine NBT-Daten: §c[{0}, {1}, {2}] AUTO_CHECKER_RESULT_DESIGN_BLOCK=§7{0} im Design: [{1}, {2}, {3}] diff --git a/SchematicSystem/SchematicSystem_Core/src/de/steamwar/schematicsystem/autocheck/AutoChecker.java b/SchematicSystem/SchematicSystem_Core/src/de/steamwar/schematicsystem/autocheck/AutoChecker.java index eb464553..7d17e8f9 100644 --- a/SchematicSystem/SchematicSystem_Core/src/de/steamwar/schematicsystem/autocheck/AutoChecker.java +++ b/SchematicSystem/SchematicSystem_Core/src/de/steamwar/schematicsystem/autocheck/AutoChecker.java @@ -55,6 +55,7 @@ public class AutoChecker { private final List records = new ArrayList<>(); private final Map> designBlocks = new EnumMap<>(Material.class); private final Map dispenserItems = new HashMap<>(); + private final Map windChargeCount = new HashMap<>(); private final Map> forbiddenItems = new HashMap<>(); private final Map> forbiddenNbt = new HashMap<>(); } diff --git a/SchematicSystem/SchematicSystem_Core/src/de/steamwar/schematicsystem/autocheck/AutoCheckerResult.java b/SchematicSystem/SchematicSystem_Core/src/de/steamwar/schematicsystem/autocheck/AutoCheckerResult.java index e6ba4728..d96a9557 100644 --- a/SchematicSystem/SchematicSystem_Core/src/de/steamwar/schematicsystem/autocheck/AutoCheckerResult.java +++ b/SchematicSystem/SchematicSystem_Core/src/de/steamwar/schematicsystem/autocheck/AutoCheckerResult.java @@ -52,6 +52,7 @@ public class AutoCheckerResult { isBlockCountOk() && isLimitedBlocksOK() && isDispenserItemsOK() && + isWindchargeCountOK() && !type.isAfterDeadline() && entities.isEmpty() && isDesignBlastResistanceOK(); @@ -62,8 +63,18 @@ public class AutoCheckerResult { !type.isAfterDeadline(); } + public boolean isWindchargeCountOK() { + if(type.Schematic.Type.equals("wargearseason26")) { + int windChargesCount = blockScanResult.getWindChargeCount().values().stream().reduce(Integer::sum).orElse(0); + return windChargesCount <= 2048; + } + else { + return true; + } + } + public boolean isDispenserItemsOK() { - return blockScanResult.getDispenserItems().values().stream().allMatch(i -> i <= type.Schematic.MaxDispenserItems); + return blockScanResult.getDispenserItems().values().stream().allMatch(i -> i <= type.Schematic.MaxDispenserItems); } public boolean hasWarnings() { @@ -127,6 +138,19 @@ public class AutoCheckerResult { } }); } + + if(!isWindchargeCountOK()) { + int windChargesCount = blockScanResult.getWindChargeCount().values().stream().reduce(Integer::sum).orElse(0); + SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_WIND_CHARGES", p, windChargesCount, 2048); + blockScanResult.getWindChargeCount().entrySet().stream().filter(blockVector3IntegerEntry -> blockVector3IntegerEntry.getValue() > 0).forEach(blockVector3IntegerEntry -> { + SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_WIND_CHARGES_DISPENSER", p, SchematicSystem.MESSAGE.parse("AUTO_CHECKER_RESULT_TELEPORT_HERE", p), tpCommandTo(blockVector3IntegerEntry.getKey()), + blockVector3IntegerEntry.getKey().getBlockX(), + blockVector3IntegerEntry.getKey().getBlockY(), + blockVector3IntegerEntry.getKey().getBlockZ(), + blockVector3IntegerEntry.getValue()); + }); + } + blockScanResult.getDispenserItems().entrySet().stream().filter(blockVector3IntegerEntry -> blockVector3IntegerEntry.getValue() > type.Schematic.MaxDispenserItems).forEach(blockVector3IntegerEntry -> { SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_TOO_MANY_DISPENSER_ITEMS", p, SchematicSystem.MESSAGE.parse("AUTO_CHECKER_RESULT_TELEPORT_HERE", p), tpCommandTo(blockVector3IntegerEntry.getKey()), blockVector3IntegerEntry.getKey().getBlockX(), @@ -135,6 +159,7 @@ public class AutoCheckerResult { blockVector3IntegerEntry.getValue(), type.Schematic.MaxDispenserItems); }); + blockScanResult.getRecords().forEach(blockVector3 -> { SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_RECORD", p, SchematicSystem.MESSAGE.parse("AUTO_CHECKER_RESULT_TELEPORT_HERE", p), tpCommandTo(blockVector3), blockVector3.getBlockX(), blockVector3.getBlockY(), blockVector3.getBlockZ()); }); diff --git a/settings.gradle.kts b/settings.gradle.kts index 0862fdce..9b228792 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -101,7 +101,9 @@ dependencyResolutionManagement { library("hamcrest", "org.hamcrest:hamcrest:2.2") library("classindex", "org.atteo.classindex:classindex:3.13") - library("spigotapi", "org.spigotmc:spigot-api:1.21-R0.1-SNAPSHOT") + + library("spigotapi", "org.spigotmc:spigot-api:1.20-R0.1-SNAPSHOT") + library("spigotapi21", "org.spigotmc:spigot-api:1.21-R0.1-SNAPSHOT") library("spigotannotations", "org.spigotmc:plugin-annotations:1.2.3-SNAPSHOT") library("paperapi", "io.papermc.paper:paper-api:1.19.2-R0.1-SNAPSHOT") library("paperapi21", "io.papermc.paper:paper-api:1.21.6-R0.1-SNAPSHOT") From 5f3847480902aafd6bef379716dadac2ed5571e5 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Fri, 1 May 2026 10:54:53 +0200 Subject: [PATCH 53/62] swap out used api --- SchematicSystem/SchematicSystem_21/build.gradle.kts | 2 +- settings.gradle.kts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/SchematicSystem/SchematicSystem_21/build.gradle.kts b/SchematicSystem/SchematicSystem_21/build.gradle.kts index b9bfe6c9..156919d8 100644 --- a/SchematicSystem/SchematicSystem_21/build.gradle.kts +++ b/SchematicSystem/SchematicSystem_21/build.gradle.kts @@ -25,7 +25,7 @@ dependencies { compileOnly(project(":SpigotCore", "default")) compileOnly(project(":SchematicSystem:SchematicSystem_Core", "default")) - compileOnly(libs.spigotapi21) + compileOnly(libs.paperapi21) compileOnly(libs.nms21) compileOnly(libs.fawe21) diff --git a/settings.gradle.kts b/settings.gradle.kts index 9b228792..ea47eac1 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -103,7 +103,6 @@ dependencyResolutionManagement { library("spigotapi", "org.spigotmc:spigot-api:1.20-R0.1-SNAPSHOT") - library("spigotapi21", "org.spigotmc:spigot-api:1.21-R0.1-SNAPSHOT") library("spigotannotations", "org.spigotmc:plugin-annotations:1.2.3-SNAPSHOT") library("paperapi", "io.papermc.paper:paper-api:1.19.2-R0.1-SNAPSHOT") library("paperapi21", "io.papermc.paper:paper-api:1.21.6-R0.1-SNAPSHOT") From b186228f4e7c50eae6b90cbf72f957df2ebb739a Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Fri, 1 May 2026 10:59:23 +0200 Subject: [PATCH 54/62] Revert "swap out used api" This reverts commit 5f3847480902aafd6bef379716dadac2ed5571e5. --- SchematicSystem/SchematicSystem_21/build.gradle.kts | 2 +- settings.gradle.kts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/SchematicSystem/SchematicSystem_21/build.gradle.kts b/SchematicSystem/SchematicSystem_21/build.gradle.kts index 156919d8..b9bfe6c9 100644 --- a/SchematicSystem/SchematicSystem_21/build.gradle.kts +++ b/SchematicSystem/SchematicSystem_21/build.gradle.kts @@ -25,7 +25,7 @@ dependencies { compileOnly(project(":SpigotCore", "default")) compileOnly(project(":SchematicSystem:SchematicSystem_Core", "default")) - compileOnly(libs.paperapi21) + compileOnly(libs.spigotapi21) compileOnly(libs.nms21) compileOnly(libs.fawe21) diff --git a/settings.gradle.kts b/settings.gradle.kts index ea47eac1..9b228792 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -103,6 +103,7 @@ dependencyResolutionManagement { library("spigotapi", "org.spigotmc:spigot-api:1.20-R0.1-SNAPSHOT") + library("spigotapi21", "org.spigotmc:spigot-api:1.21-R0.1-SNAPSHOT") library("spigotannotations", "org.spigotmc:plugin-annotations:1.2.3-SNAPSHOT") library("paperapi", "io.papermc.paper:paper-api:1.19.2-R0.1-SNAPSHOT") library("paperapi21", "io.papermc.paper:paper-api:1.21.6-R0.1-SNAPSHOT") From c90a977ab2142367d75d4b966511c26b4e1fca2d Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Fri, 1 May 2026 11:02:33 +0200 Subject: [PATCH 55/62] use same hacky impl as in fight system --- SchematicSystem/SchematicSystem_21/build.gradle.kts | 7 ++++++- settings.gradle.kts | 1 - 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/SchematicSystem/SchematicSystem_21/build.gradle.kts b/SchematicSystem/SchematicSystem_21/build.gradle.kts index b9bfe6c9..2654c5b7 100644 --- a/SchematicSystem/SchematicSystem_21/build.gradle.kts +++ b/SchematicSystem/SchematicSystem_21/build.gradle.kts @@ -25,7 +25,12 @@ dependencies { compileOnly(project(":SpigotCore", "default")) compileOnly(project(":SchematicSystem:SchematicSystem_Core", "default")) - compileOnly(libs.spigotapi21) + compileOnly(libs.paperapi21) { + attributes { + // Very Hacky, but it works + attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 21) + } + } compileOnly(libs.nms21) compileOnly(libs.fawe21) diff --git a/settings.gradle.kts b/settings.gradle.kts index 9b228792..ea47eac1 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -103,7 +103,6 @@ dependencyResolutionManagement { library("spigotapi", "org.spigotmc:spigot-api:1.20-R0.1-SNAPSHOT") - library("spigotapi21", "org.spigotmc:spigot-api:1.21-R0.1-SNAPSHOT") library("spigotannotations", "org.spigotmc:plugin-annotations:1.2.3-SNAPSHOT") library("paperapi", "io.papermc.paper:paper-api:1.19.2-R0.1-SNAPSHOT") library("paperapi21", "io.papermc.paper:paper-api:1.21.6-R0.1-SNAPSHOT") From 42feadcd2d477848d728abebea0e6cb48013b312 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Fri, 1 May 2026 11:53:57 +0200 Subject: [PATCH 56/62] Add left out name get --- .../de/steamwar/schematicsystem/autocheck/AutoChecker21.java | 2 +- .../steamwar/schematicsystem/autocheck/AutoCheckerResult.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SchematicSystem/SchematicSystem_21/src/de/steamwar/schematicsystem/autocheck/AutoChecker21.java b/SchematicSystem/SchematicSystem_21/src/de/steamwar/schematicsystem/autocheck/AutoChecker21.java index e2b43bce..ad8acd39 100644 --- a/SchematicSystem/SchematicSystem_21/src/de/steamwar/schematicsystem/autocheck/AutoChecker21.java +++ b/SchematicSystem/SchematicSystem_21/src/de/steamwar/schematicsystem/autocheck/AutoChecker21.java @@ -103,7 +103,7 @@ public class AutoChecker21 implements AutoChecker.IAutoChecker { if (itemType == null) // Leere Slots continue; - if(type.Schematic.Type.equals("wargearseason26") && material == Material.DISPENSER && itemType == Material.WIND_CHARGE) { + if(type.Schematic.Type.getName().equals("wargearseason26") && material == Material.DISPENSER && itemType == Material.WIND_CHARGE) { windChargeCount += item.getInt("count"); } else if (!itemsInInv.getOrDefault(itemType, EnumSet.noneOf(Material.class)).contains(material)) { diff --git a/SchematicSystem/SchematicSystem_Core/src/de/steamwar/schematicsystem/autocheck/AutoCheckerResult.java b/SchematicSystem/SchematicSystem_Core/src/de/steamwar/schematicsystem/autocheck/AutoCheckerResult.java index d96a9557..0cb6e386 100644 --- a/SchematicSystem/SchematicSystem_Core/src/de/steamwar/schematicsystem/autocheck/AutoCheckerResult.java +++ b/SchematicSystem/SchematicSystem_Core/src/de/steamwar/schematicsystem/autocheck/AutoCheckerResult.java @@ -64,7 +64,7 @@ public class AutoCheckerResult { } public boolean isWindchargeCountOK() { - if(type.Schematic.Type.equals("wargearseason26")) { + if( type.Schematic.Type.getName().equals("wargearseason26")) { int windChargesCount = blockScanResult.getWindChargeCount().values().stream().reduce(Integer::sum).orElse(0); return windChargesCount <= 2048; } From a41787d89d6f4d8232263ba214ccb4daf087a8bb Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Sat, 2 May 2026 13:36:32 +0200 Subject: [PATCH 57/62] Add flag --- .../bausystem/features/tracer/rendering/ViewFlag.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java index 3029fe63..05fdcda0 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java @@ -198,6 +198,16 @@ public abstract class ViewFlag { } }; + public static ViewFlag HIGHLIGHT = new ViewFlag(true, false, "highlight", "h") { + @Override + public void modify(REntityServer server, List entities) { + for (TraceEntity entity : entities) { + entity.setGlowing(true); + } + } + + }; + /** * Name of the flag */ From 5b1ed644d1de81475c35485c418ad8ccc67b5561 Mon Sep 17 00:00:00 2001 From: zOnlyKroks Date: Sun, 3 May 2026 12:52:23 +0200 Subject: [PATCH 58/62] [fightsystem]: Fix broken kit system --- .../utils/FlatteningWrapper21.java | 6 +--- .../listener/PersonalKitCreator.java | 36 +++++++------------ 2 files changed, 13 insertions(+), 29 deletions(-) diff --git a/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/FlatteningWrapper21.java b/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/FlatteningWrapper21.java index 70dad919..ad535a6c 100644 --- a/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/FlatteningWrapper21.java +++ b/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/FlatteningWrapper21.java @@ -24,10 +24,6 @@ import org.bukkit.inventory.ItemStack; public class FlatteningWrapper21 extends FlatteningWrapper14 { @Override public boolean hasAttributeModifier(ItemStack stack) { - if (!stack.getDataTypes().isEmpty()) { - return true; - } - - return super.hasAttributeModifier(stack); + return stack.hasItemMeta() && stack.getItemMeta() != null && stack.getItemMeta().hasAttributeModifiers(); } } diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/PersonalKitCreator.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/PersonalKitCreator.java index 422e2a94..54adf273 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/PersonalKitCreator.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/PersonalKitCreator.java @@ -35,10 +35,7 @@ import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryAction; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryCloseEvent; -import org.bukkit.event.inventory.InventoryOpenEvent; +import org.bukkit.event.inventory.*; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; @@ -81,25 +78,8 @@ public class PersonalKitCreator implements Listener { if(!openKitCreators.containsKey(e.getWhoClicked())) return; - Player player = (Player) e.getWhoClicked(); - //Deny bad items if(Kit.isBadItem(e.getCursor())) e.setCancelled(true); - - /* Should the inventory reset? */ - if(e.getAction() != InventoryAction.PLACE_ALL) - return; - - ItemStack[] items = e.getWhoClicked().getInventory().getContents(); - for(int i = 0; i < items.length; i++){ - ItemStack stack = items[i]; - if(stack != null && i != e.getSlot()) - return; - } - - FightPlayer fightPlayer = Fight.getFightPlayer(player); - assert fightPlayer != null; - Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), () -> fightPlayer.getKit().loadToPlayer(player), 1); } @EventHandler @@ -117,7 +97,13 @@ public class PersonalKitCreator implements Listener { if(backup == null) return; - backup.close(); + InventoryType type = e.getInventory().getType(); + if(type == InventoryType.CHEST || type == InventoryType.DISPENSER || + type == InventoryType.FURNACE || type == InventoryType.HOPPER || + type == InventoryType.DROPPER || type == InventoryType.BARREL || + type == InventoryType.BREWING || type == InventoryType.ENCHANTING) { + backup.close(); + } } @EventHandler @@ -126,7 +112,7 @@ public class PersonalKitCreator implements Listener { if(backup == null) return; - backup.close(); + Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), backup::close, 1); } @EventHandler @@ -151,9 +137,11 @@ public class PersonalKitCreator implements Listener { } private void close(){ - openKitCreators.remove(player); Kit kit1 = new Kit(kit.getName(), player); kit1.removeBadItems(); + + + openKitCreators.remove(player); kit1.toPersonalKit(kit); backup.loadToPlayer(player); player.setGameMode(GameMode.SURVIVAL); From 32de0077dea4264afd65006ed6b00264e8205c62 Mon Sep 17 00:00:00 2001 From: zOnlyKroks Date: Sun, 3 May 2026 14:15:59 +0200 Subject: [PATCH 59/62] [fightsystem]: Rework blacklist to whitelist --- .../de/steamwar/fightsystem/listener/PersonalKitCreator.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/PersonalKitCreator.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/PersonalKitCreator.java index 54adf273..e0b446d5 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/PersonalKitCreator.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/PersonalKitCreator.java @@ -98,10 +98,7 @@ public class PersonalKitCreator implements Listener { return; InventoryType type = e.getInventory().getType(); - if(type == InventoryType.CHEST || type == InventoryType.DISPENSER || - type == InventoryType.FURNACE || type == InventoryType.HOPPER || - type == InventoryType.DROPPER || type == InventoryType.BARREL || - type == InventoryType.BREWING || type == InventoryType.ENCHANTING) { + if(type != InventoryType.PLAYER && type != InventoryType.CREATIVE) { backup.close(); } } From 4010c2125c1977079f9f6d1dd003f3f2e4f6931c Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Mon, 4 May 2026 13:41:07 +0200 Subject: [PATCH 60/62] Refactor lazy loading of dependents and relations to return lists Signed-off-by: Chaoscaot --- CommonCore/SQL/src/de/steamwar/sql/EventGroup.kt | 2 +- CommonCore/SQL/src/de/steamwar/sql/EventRelation.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CommonCore/SQL/src/de/steamwar/sql/EventGroup.kt b/CommonCore/SQL/src/de/steamwar/sql/EventGroup.kt index 5db01dbf..5fb01f30 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/EventGroup.kt +++ b/CommonCore/SQL/src/de/steamwar/sql/EventGroup.kt @@ -90,7 +90,7 @@ class EventGroup(id: EntityID) : IntEntity(id) { set(value) { groupPointsPerDraw = value } - val dependents by lazy { EventRelation.getGroupRelations(this).toList() } + val dependents by lazy { EventRelation.getGroupRelations(this) } val lastFight by lazy { Optional.ofNullable(fights.maxByOrNull { it.startTime }) } fun getId() = id.value diff --git a/CommonCore/SQL/src/de/steamwar/sql/EventRelation.kt b/CommonCore/SQL/src/de/steamwar/sql/EventRelation.kt index 0ca7be22..82c1d03f 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/EventRelation.kt +++ b/CommonCore/SQL/src/de/steamwar/sql/EventRelation.kt @@ -51,11 +51,11 @@ class EventRelation(id: EntityID) : IntEntity(id) { @JvmStatic fun getFightRelations(fight: EventFight) = - useDb { find { (EventRelationTable.fromId eq fight.id.value) and (EventRelationTable.fromType eq FromType.FIGHT) } } + useDb { find { (EventRelationTable.fromId eq fight.id.value) and (EventRelationTable.fromType eq FromType.FIGHT) }.toList() } @JvmStatic fun getGroupRelations(group: EventGroup) = - useDb { find { (EventRelationTable.fromId eq group.id.value) and (EventRelationTable.fromType eq FromType.GROUP) } } + useDb { find { (EventRelationTable.fromId eq group.id.value) and (EventRelationTable.fromType eq FromType.GROUP) }.toList() } @JvmStatic fun create(fight: EventFight, fightTeam: FightTeam, fromType: FromType, fromId: Int, fromPlace: Int) = useDb { From 79fa09e39b2758032f33408267e626be6f0cf178 Mon Sep 17 00:00:00 2001 From: zOnlyKroks Date: Mon, 4 May 2026 18:27:28 +0200 Subject: [PATCH 61/62] Chaos zufrieden stellen --- .../utils/ReflectionWrapper21.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/ReflectionWrapper21.java b/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/ReflectionWrapper21.java index ea8b2d7f..8e38938e 100644 --- a/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/ReflectionWrapper21.java +++ b/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/ReflectionWrapper21.java @@ -38,6 +38,27 @@ public class ReflectionWrapper21 implements ReflectionWrapper { FORBIDDEN_TYPES.add(DataComponentTypes.BLOCKS_ATTACKS); FORBIDDEN_TYPES.add(DataComponentTypes.BUNDLE_CONTENTS); FORBIDDEN_TYPES.add(DataComponentTypes.CUSTOM_MODEL_DATA); + + FORBIDDEN_TYPES.add(DataComponentTypes.ATTRIBUTE_MODIFIERS); + FORBIDDEN_TYPES.add(DataComponentTypes.TOOL); + FORBIDDEN_TYPES.add(DataComponentTypes.WEAPON); + FORBIDDEN_TYPES.add(DataComponentTypes.FOOD); + FORBIDDEN_TYPES.add(DataComponentTypes.CONSUMABLE); + FORBIDDEN_TYPES.add(DataComponentTypes.POTION_CONTENTS); + FORBIDDEN_TYPES.add(DataComponentTypes.STORED_ENCHANTMENTS); + FORBIDDEN_TYPES.add(DataComponentTypes.CAN_BREAK); + FORBIDDEN_TYPES.add(DataComponentTypes.CAN_PLACE_ON); + FORBIDDEN_TYPES.add(DataComponentTypes.MAX_DAMAGE); + FORBIDDEN_TYPES.add(DataComponentTypes.USE_REMAINDER); + FORBIDDEN_TYPES.add(DataComponentTypes.USE_COOLDOWN); + FORBIDDEN_TYPES.add(DataComponentTypes.SUSPICIOUS_STEW_EFFECTS); + FORBIDDEN_TYPES.add(DataComponentTypes.CHARGED_PROJECTILES); + FORBIDDEN_TYPES.add(DataComponentTypes.INTANGIBLE_PROJECTILE); + FORBIDDEN_TYPES.add(DataComponentTypes.FIREWORKS); + FORBIDDEN_TYPES.add(DataComponentTypes.FIREWORK_EXPLOSION); + FORBIDDEN_TYPES.add(DataComponentTypes.EQUIPPABLE); + FORBIDDEN_TYPES.add(DataComponentTypes.REPAIR_COST); + FORBIDDEN_TYPES.add(DataComponentTypes.ENCHANTABLE); } @Override From 8ade5180cb74d19f6006af154d83caa777c5089a Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Fri, 8 May 2026 20:55:17 +0200 Subject: [PATCH 62/62] Fix FightSystem --- .../src/de/steamwar/fightsystem/FightSystem.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java index a88c752d..011d36f6 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java @@ -98,10 +98,12 @@ public class FightSystem extends JavaPlugin { new StateDependentListener(ArenaMode.All, FightState.All, BountifulWrapper.impl.newDenyArrowPickupListener()); new OneShotStateDependent(ArenaMode.All, FightState.PreSchemSetup, () -> Fight.playSound(SWSound.BLOCK_NOTE_PLING.getSound(), 100.0f, 2.0f)); new OneShotStateDependent(ArenaMode.Test, FightState.All, WorldEditRendererCUIEditor::new); - try { - Bukkit.getWorlds().get(0).setGameRule(GameRule.REDUCED_DEBUG_INFO, ArenaMode.AntiTest.contains(Config.mode)); - } catch (Exception e) { - // Ignore if failed! + if (Core.getVersion() >= 19) { + try { + Bukkit.getWorlds().get(0).setGameRule(GameRule.REDUCED_DEBUG_INFO, ArenaMode.AntiTest.contains(Config.mode)); + } catch (Exception e) { + // Ignore if failed! + } } techHider = new TechHiderWrapper();