diff --git a/BauSystem/BauSystem_15/build.gradle.kts b/BauSystem/BauSystem_15/build.gradle.kts
deleted file mode 100644
index 054e4ab9..00000000
--- a/BauSystem/BauSystem_15/build.gradle.kts
+++ /dev/null
@@ -1,35 +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 .
- */
-
-plugins {
- steamwar.java
-}
-
-java {
- sourceCompatibility = JavaVersion.VERSION_17
- targetCompatibility = JavaVersion.VERSION_17
-}
-
-dependencies {
- compileOnly(project(":BauSystem:BauSystem_Main", "default"))
- compileOnly(project(":SpigotCore", "default"))
-
- compileOnly(libs.nms15)
- compileOnly(libs.worldedit15)
-}
diff --git a/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/FlatteningWrapper15.java b/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/FlatteningWrapper15.java
deleted file mode 100644
index 13b3932d..00000000
--- a/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/FlatteningWrapper15.java
+++ /dev/null
@@ -1,239 +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.utils;
-
-import com.sk89q.worldedit.EditSession;
-import com.sk89q.worldedit.WorldEdit;
-import com.sk89q.worldedit.WorldEditException;
-import com.sk89q.worldedit.bukkit.BukkitWorld;
-import com.sk89q.worldedit.bukkit.WorldEditPlugin;
-import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
-import com.sk89q.worldedit.extent.clipboard.Clipboard;
-import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat;
-import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats;
-import com.sk89q.worldedit.extent.clipboard.io.ClipboardReader;
-import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter;
-import com.sk89q.worldedit.function.mask.Mask;
-import com.sk89q.worldedit.function.mask.Mask2D;
-import com.sk89q.worldedit.function.operation.ForwardExtentCopy;
-import com.sk89q.worldedit.function.operation.Operations;
-import com.sk89q.worldedit.math.BlockVector3;
-import com.sk89q.worldedit.math.transform.AffineTransform;
-import com.sk89q.worldedit.regions.CuboidRegion;
-import com.sk89q.worldedit.regions.selector.CuboidRegionSelector;
-import com.sk89q.worldedit.session.ClipboardHolder;
-import com.sk89q.worldedit.world.World;
-import com.sk89q.worldedit.world.block.BaseBlock;
-import com.sk89q.worldedit.world.block.BlockTypes;
-import de.steamwar.bausystem.region.Point;
-import org.bukkit.Bukkit;
-import org.bukkit.Material;
-import org.bukkit.block.Block;
-import org.bukkit.block.data.BlockData;
-import org.bukkit.block.data.Waterlogged;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.util.Vector;
-
-import javax.annotation.Nullable;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Objects;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.BiPredicate;
-import java.util.logging.Level;
-
-public class FlatteningWrapper15 implements FlatteningWrapper {
-
- @Override
- public boolean isNoBook(ItemStack item) {
- return item.getType() != Material.WRITABLE_BOOK && item.getType() != Material.WRITTEN_BOOK;
- }
-
- private static final Set unpushable = new HashSet<>(Arrays.asList(Material.BARRIER, Material.BEACON, Material.COMMAND_BLOCK, Material.CHAIN_COMMAND_BLOCK, Material.REPEATING_COMMAND_BLOCK, Material.ENCHANTING_TABLE, Material.END_GATEWAY, Material.END_PORTAL, Material.ENDER_CHEST, Material.GRINDSTONE, Material.JIGSAW, Material.JUKEBOX, Material.NETHER_PORTAL, Material.OBSIDIAN, Material.STRUCTURE_VOID, Material.BARREL, Material.BEEHIVE, Material.BEE_NEST, Material.BLAST_FURNACE, Material.BREWING_STAND, Material.CHEST, Material.DAYLIGHT_DETECTOR, Material.DISPENSER, Material.DROPPER, Material.FURNACE, Material.HOPPER, Material.LECTERN, Material.SMOKER, Material.TRAPPED_CHEST));
-
- // TODO: FLOWER
- private static final Set breaking = new HashSet<>(Arrays.asList(Material.BAMBOO, Material.CACTUS, Material.CAKE, Material.CARVED_PUMPKIN, Material.CHORUS_FLOWER, Material.CHORUS_PLANT, Material.COBWEB, Material.COCOA, Material.DRAGON_EGG, Material.FIRE, Material.FLOWER_POT, Material.JACK_O_LANTERN, Material.LADDER, Material.LAVA, Material.LAVA, Material.LEVER, Material.LILY_PAD, Material.MELON, Material.NETHER_WART, Material.PUMPKIN, Material.COMPARATOR, Material.REDSTONE_WIRE, Material.REPEATER, Material.TORCH, Material.STRUCTURE_VOID, Material.SCAFFOLDING, Material.SEA_PICKLE, Material.SNOW, Material.SUGAR_CANE, Material.TORCH, Material.TRIPWIRE, Material.TRIPWIRE_HOOK, Material.TURTLE_EGG, Material.VINE, Material.WATER, Material.WHEAT));
-
- @Override
- public boolean isUnpusheable(Material material) {
- if (unpushable.contains(material)) {
- return true;
- }
- String name = material.name();
- return name.contains("BANNER") || name.contains("SIGN");
- }
-
- @Override
- public boolean isBreakingOnPush(Material material) {
- if (breaking.contains(material)) {
- return true;
- }
- String name = material.name();
- return name.contains("BED") || name.contains("BUTTON") || name.contains("CARPET") || (name.contains("DOOR") && !name.contains("TRAPDOOR")) || name.contains("HEAD") || name.contains("LEAVES") || name.contains("MUSHROOM") || name.contains("PRESSURE_PLATE") || name.contains("SHULKER_BOX");
- }
-
- @Override
- public boolean isWorldEditCommand(String command) {
- if (command.startsWith("/")) {
- command = command.replaceFirst("/", "");
- }
- command = command.toLowerCase();
- return WorldEdit.getInstance().getPlatformManager().getPlatformCommandManager().getCommandManager().containsCommand(command);
- }
-
- private static final WorldEditPlugin WORLDEDIT_PLUGIN = Objects.requireNonNull((WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit"));
- private static final World BUKKITWORLD = new BukkitWorld(Bukkit.getWorlds().get(0));
-
- @Override
- public void setSelection(Player p, Point minPoint, Point maxPoint) {
- WORLDEDIT_PLUGIN.getSession(p).setRegionSelector(BUKKITWORLD, new CuboidRegionSelector(BUKKITWORLD, minPoint.toBlockVector3(), maxPoint.toBlockVector3()));
- }
-
- @Override
- public Clipboard loadSchematic(File file) {
- Clipboard clipboard;
- try (ClipboardReader reader = Objects.requireNonNull(ClipboardFormats.findByFile(file)).getReader(new FileInputStream(file))) {
- clipboard = reader.read();
- } catch (NullPointerException | IOException e) {
- throw new SecurityException("Bausystem schematic not found", e);
- }
- return clipboard;
- }
-
- @Override
- public EditSession paste(PasteBuilder pasteBuilder) {
- try (EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(new BukkitWorld(Bukkit.getWorlds().get(0)), -1)) {
- Clipboard clipboard = pasteBuilder.getClipboard();
-
- if (!pasteBuilder.getMappers().isEmpty()) {
- BlockVector3 minimum = clipboard.getRegion().getMinimumPoint();
- for (int x = 0; x < clipboard.getDimensions().getX(); x++) {
- for (int y = 0; y < clipboard.getDimensions().getY(); y++) {
- for (int z = 0; z < clipboard.getDimensions().getZ(); z++) {
- BlockVector3 pos = minimum.add(x, y, z);
- pasteBuilder.getMappers().forEach(mapper -> mapper.accept(clipboard, pos));
- }
- }
- }
- }
-
- AtomicReference pastePoint = new AtomicReference<>();
- if (!pasteBuilder.getPredicates().isEmpty()) {
- e.setMask(new Mask() {
- @Override
- public boolean test(BlockVector3 blockVector3) {
- BaseBlock block = clipboard.getFullBlock(blockVector3.subtract(pastePoint.get()).add(clipboard.getRegion().getMinimumPoint()));
- String blockName = block.getBlockType().toString().toLowerCase();
- for (BiPredicate predicate : pasteBuilder.getPredicates()) {
- if (!predicate.test(block, blockName)) return false;
- }
- return true;
- }
-
- public Mask copy() {
- return this;
- }
-
- @Nullable
- @Override
- public Mask2D toMask2D() {
- return null;
- }
- });
- }
-
- ClipboardHolder ch = new ClipboardHolder(clipboard);
- BlockVector3 dimensions = clipboard.getDimensions();
- BlockVector3 v = BlockVector3.at(pasteBuilder.getPastPoint().getX(), pasteBuilder.getPastPoint().getY(), pasteBuilder.getPastPoint().getZ());
- BlockVector3 offset = clipboard.getRegion().getMinimumPoint().subtract(clipboard.getOrigin());
- if (pasteBuilder.isRotate()) {
- ch.setTransform(new AffineTransform().rotateY(180));
- v = v.add(dimensions.getX() / 2, 0, dimensions.getZ() / 2).subtract(offset.multiply(-1, 1, -1)).subtract(0, 0, 1);
- } else {
- v = v.subtract(dimensions.getX() / 2, 0, dimensions.getZ() / 2).subtract(offset);
- }
- pastePoint.set(v);
-
- if (pasteBuilder.isReset()) {
- e.setBlocks(new CuboidRegion(pasteBuilder.getMinPoint().toBlockVector3(), pasteBuilder.getMaxPoint().toBlockVector3()), Objects.requireNonNull(BlockTypes.AIR).getDefaultState().toBaseBlock());
- if (pasteBuilder.getWaterLevel() != 0) {
- e.setBlocks(new CuboidRegion(pasteBuilder.getMinPoint().toBlockVector3(), pasteBuilder.getMaxPoint().toBlockVector3().withY(pasteBuilder.getWaterLevel())), Objects.requireNonNull(BlockTypes.WATER).getDefaultState().toBaseBlock());
- }
- }
- Operations.completeBlindly(ch.createPaste(e).to(v).ignoreAirBlocks(pasteBuilder.isIgnoreAir()).build());
- return e;
- } catch (WorldEditException e) {
- throw new SecurityException(e.getMessage(), e);
- }
- }
-
- @Override
- public Clipboard copy(Point minPoint, Point maxPoint, Point copyPoint) {
- BukkitWorld bukkitWorld = new BukkitWorld(Bukkit.getWorlds().get(0));
- CuboidRegion region = new CuboidRegion(bukkitWorld, minPoint.toBlockVector3(), maxPoint.toBlockVector3());
- BlockArrayClipboard clipboard = new BlockArrayClipboard(region);
- try (EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(bukkitWorld, -1)) {
- ForwardExtentCopy copy = new ForwardExtentCopy(
- e, region, clipboard, region.getMinimumPoint()
- );
-
- copy.setCopyingEntities(false);
- copy.setCopyingBiomes(false);
-
- Operations.complete(copy);
- clipboard.setOrigin(copyPoint.toBlockVector3());
- return clipboard;
- } catch (WorldEditException e) {
- Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
- return null;
- }
- }
-
- @Override
- public boolean backup(Point minPoint, Point maxPoint, File file) {
- Clipboard clipboard = copy(minPoint, maxPoint, minPoint);
- try (ClipboardWriter writer = BuiltInClipboardFormat.SPONGE_SCHEMATIC.getWriter(new FileOutputStream(file))) {
- writer.write(clipboard);
- return true;
- } catch (IOException e) {
- Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
- return false;
- }
- }
-
- @Override
- public boolean inWater(org.bukkit.World world, Vector tntPosition) {
- Block block = world.getBlockAt(tntPosition.getBlockX(), tntPosition.getBlockY(), tntPosition.getBlockZ());
- if (block.getType() == Material.WATER)
- return true;
-
- BlockData data = block.getBlockData();
- if (!(data instanceof Waterlogged))
- return false;
-
- return ((Waterlogged) data).isWaterlogged();
- }
-}
diff --git a/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/NMSWrapper15.java b/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/NMSWrapper15.java
deleted file mode 100644
index 3faea278..00000000
--- a/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/NMSWrapper15.java
+++ /dev/null
@@ -1,129 +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.utils;
-
-import de.steamwar.Reflection;
-import de.steamwar.bausystem.features.util.NoClipCommand;
-import net.minecraft.server.v1_15_R1.*;
-import org.bukkit.GameMode;
-import org.bukkit.Material;
-import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
-import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-
-import java.util.List;
-
-public class NMSWrapper15 implements NMSWrapper {
-
- private static final Reflection.Field playerGameMode = Reflection.getField(PlayerInteractManager.class, EnumGamemode.class, 0);
-
- @Override
- @SuppressWarnings("deprecation")
- public void setInternalGameMode(Player player, GameMode gameMode) {
- playerGameMode.set(((CraftPlayer) player).getHandle().playerInteractManager, EnumGamemode.getById(gameMode.getValue()));
- }
-
- @Override
- public void setSlotToItemStack(Player player, Object o) {
- PacketPlayInSetCreativeSlot packetPlayInSetCreativeSlot = (PacketPlayInSetCreativeSlot) o;
- int index = packetPlayInSetCreativeSlot.b();
- if (index >= 36 && index <= 44) {
- index -= 36;
- } else if (index > 44) {
- index -= 5;
- } else if (index <= 8) {
- index = index - 8 + 36;
- }
- player.getInventory().setItem(index, CraftItemStack.asBukkitCopy(packetPlayInSetCreativeSlot.getItemStack()));
- if (index < 9) player.getInventory().setHeldItemSlot(index);
- player.updateInventory();
- }
-
- private static final Reflection.Field gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, int.class, 0);
-
- @Override
- public void setGameStateChangeReason(Object packet) {
- gameStateChangeReason.set(packet, 3);
- }
-
- @Override
- public void setPlayerBuildAbilities(Player player) {
- ((CraftPlayer) player).getHandle().abilities.mayBuild = true;
- ((CraftPlayer) player).getHandle().abilities.canInstantlyBuild = true;
- }
-
- @Override
- public Material pathMaterial() {
- return Material.GRASS_PATH;
- }
-
- private static final int threshold = 2048;
-
- @Override
- public boolean checkItemStack(ItemStack item) {
- net.minecraft.server.v1_15_R1.ItemStack nmsItem = CraftItemStack.asNMSCopy(item);
- NBTTagCompound tag = nmsItem.getTag();
- if (tag != null && tag.hasKey("BlockEntityTag")) {
- NBTTagCompound blockTag = tag.getCompound("BlockEntityTag");
- if (blockTag.hasKey("Items")) {
- return drillDown(blockTag.getList("Items", 10), 0, 0) > threshold;
- }
- }
-
- return false;
- }
-
- private int drillDown(NBTTagList items, int layer, int start) {
- if (layer > 2) return start + threshold;
- int invalid = start;
- for (NBTBase nbtBase : items) {
- if (!(nbtBase instanceof NBTTagCompound))
- continue;
- NBTTagCompound slot = (NBTTagCompound) nbtBase;
- if (slot.hasKey("tag")) {
- invalid += slot.getByte("Count");
- NBTTagCompound iTag = slot.getCompound("tag");
- if (iTag.hasKey("BlockEntityTag")) {
- NBTTagCompound blockTag = iTag.getCompound("BlockEntityTag");
- if (blockTag.hasKey("Items")) {
- invalid = drillDown(blockTag.getList("Items", 10), layer + 1, invalid);
- }
- }
- }
- if (invalid > threshold)
- break;
- }
- return invalid;
- }
-
- private final Class> explosionPacket = Reflection.getClass("net.minecraft.network.protocol.game.ClientboundExplodePacket");
- private final Reflection.Field a = Reflection.getField(explosionPacket, double.class, 0);
- private final Reflection.Field b = Reflection.getField(explosionPacket, double.class, 1);
- private final Reflection.Field c = Reflection.getField(explosionPacket, double.class, 2);
- private final Reflection.Field d = Reflection.getField(explosionPacket, float.class, 0);
- private final Reflection.Field e = Reflection.getField(explosionPacket, List.class, 0);
-
- @Override
- public Object resetExplosionKnockback(Object packet) {
- PacketPlayOutExplosion packetPlayOutExplosion = (PacketPlayOutExplosion) packet;
- return new PacketPlayOutExplosion(a.get(packetPlayOutExplosion), b.get(packetPlayOutExplosion), c.get(packetPlayOutExplosion), d.get(packetPlayOutExplosion), e.get(packetPlayOutExplosion), Vec3D.a);
- }
-}
diff --git a/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/PlaceItemWrapper15.java b/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/PlaceItemWrapper15.java
deleted file mode 100644
index 05164673..00000000
--- a/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/PlaceItemWrapper15.java
+++ /dev/null
@@ -1,43 +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.utils;
-
-import org.bukkit.Material;
-
-public class PlaceItemWrapper15 implements PlaceItemWrapper {
-
- public PlaceItemWrapper15() {
- for (Material material : Material.values()) {
- if (!material.isBlock()) continue;
- if (material.isLegacy()) continue;
-
- String nonWall = material.name().replace("_WALL_", "").replace("WALL_", "").replace("_WALL", "");
- try {
- Material nonWallMaterial = Material.valueOf(nonWall);
- if (nonWallMaterial != material && nonWallMaterial.isItem() && !nonWallMaterial.isBlock()) {
- BLOCK_MATERIAL_TO_WALL_BLOCK_MATERIAL.put(nonWallMaterial, material);
- }
- } catch (Exception e) {
- // Ignore
- }
- }
- ITEM_MATERIAL_TO_BLOCK_MATERIAL.put(Material.REDSTONE, Material.REDSTONE_WIRE);
- }
-}
diff --git a/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/PlayerMovementWrapper15.java b/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/PlayerMovementWrapper15.java
deleted file mode 100644
index 17f67550..00000000
--- a/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/PlayerMovementWrapper15.java
+++ /dev/null
@@ -1,51 +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.utils;
-
-import de.steamwar.Reflection;
-import net.minecraft.server.v1_15_R1.EntityPlayer;
-import net.minecraft.server.v1_15_R1.PacketPlayInFlying;
-import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
-import org.bukkit.entity.Player;
-
-public class PlayerMovementWrapper15 implements PlayerMovementWrapper {
-
- @Override
- public void setPosition(Player player, Object object) {
- PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
- EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
- if (Float.isNaN(packetPlayInFlying.a(Float.NaN))) {
- entityPlayer.e(packetPlayInFlying.a(0.0), packetPlayInFlying.b(0.0), packetPlayInFlying.c(0.0));
- } else {
- entityPlayer.setLocation(packetPlayInFlying.a(0.0), packetPlayInFlying.b(0.0), packetPlayInFlying.c(0.0), packetPlayInFlying.a(0F), packetPlayInFlying.b(0F));
- }
- }
-
- @Override
- public Object convertToOut(Player player, Object object) {
- PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
- Object packet = Reflection.newInstance(teleportPacket);
- teleportEntity.set(packet, player.getEntityId());
- teleportPosition.set(packet, packetPlayInFlying.a(0.0), packetPlayInFlying.b(0.0), packetPlayInFlying.c(0.0),
- Float.isNaN(packetPlayInFlying.a(Float.NaN)) ? player.getLocation().getYaw() : packetPlayInFlying.a(0.0F),
- Float.isNaN(packetPlayInFlying.b(Float.NaN)) ? player.getLocation().getPitch() : packetPlayInFlying.b(0.0F));
- return packet;
- }
-}
diff --git a/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/TickListener15.java b/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/TickListener15.java
deleted file mode 100644
index 57b14b19..00000000
--- a/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/TickListener15.java
+++ /dev/null
@@ -1,23 +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.utils;
-
-public class TickListener15 implements TickListener {
-}
diff --git a/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/TickManager15.java b/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/TickManager15.java
deleted file mode 100644
index 808e63cc..00000000
--- a/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/TickManager15.java
+++ /dev/null
@@ -1,140 +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.utils;
-
-import de.steamwar.bausystem.region.Region;
-import de.steamwar.bausystem.utils.bossbar.BossBarService;
-import de.steamwar.bausystem.utils.tps.TPSFreezeUtils;
-import de.steamwar.bausystem.utils.tps.TPSLimitUtils;
-import de.steamwar.core.TPSWarpUtils;
-import org.bukkit.Bukkit;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-
-public class TickManager15 implements TickManager, Listener {
-
- private static float currentTPSLimit = 20;
- private boolean currentlyStepping = false;
- private float currentLimit;
- private int stepsTotal;
- private int stepsLeft;
-
- @Override
- public boolean canFreeze() {
- return TPSFreezeUtils.isCanFreeze();
- }
-
- @Override
- public void setTickRate(float tickRate) {
- if (currentlyStepping) {
- currentlyStepping = false;
- Bukkit.getOnlinePlayers().forEach(player -> {
- BossBarService.instance.remove(player, Region.getGlobalRegion(), "TickStep");
- });
- }
- TPSWarpUtils.warp(tickRate);
- if (currentTPSLimit == 0 && tickRate != 0) {
- TPSFreezeUtils.unfreeze();
- }
- currentTPSLimit = tickRate;
- if (tickRate == 0) {
- TPSLimitUtils.unlimit();
- TPSFreezeUtils.freeze();
- } else if (tickRate < 20.0) {
- TPSLimitUtils.limit(tickRate);
- } else if (tickRate >= 20) {
- TPSLimitUtils.unlimit();
- }
- }
-
- @Override
- public boolean isFrozen() {
- return TPSFreezeUtils.frozen();
- }
-
- @Override
- public void setFreeze(boolean freeze) {
- if (freeze) {
- setTickRate(0);
- }
- }
-
- @Override
- public void stepTicks(int ticks) {
- currentLimit = 0;
- setTickRate(20);
- stepsLeft = ticks;
- stepsTotal = ticks;
- currentlyStepping = true;
- }
-
- @Override
- public void sprintTicks(int ticks) {
- currentLimit = currentTPSLimit;
- setTickRate(4000);
- stepsLeft = ticks;
- stepsTotal = ticks;
- currentlyStepping = true;
- }
-
- @Override
- public boolean isSprinting() {
- return currentlyStepping && currentTPSLimit > 20;
- }
-
- @Override
- public boolean isStepping() {
- return currentlyStepping && currentTPSLimit <= 20;
- }
-
- @Override
- public float getTickRate() {
- return currentTPSLimit;
- }
-
- @Override
- public void setBlockTpsPacket(boolean block) {
-
- }
-
- @Override
- public long getTotalTicks() {
- return stepsTotal;
- }
-
- @Override
- public long getDoneTicks() {
- return stepsTotal - stepsLeft;
- }
-
- @Override
- public long getRemainingTicks() {
- return stepsLeft;
- }
-
- @EventHandler
- public void onTickEnd(TickEndEvent event) {
- if (!currentlyStepping) return;
- stepsLeft--;
- if (stepsLeft <= 0) {
- setTickRate(currentLimit);
- }
- }
-}
diff --git a/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/tps/PacketCache.java b/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/tps/PacketCache.java
deleted file mode 100644
index 7cabdab6..00000000
--- a/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/tps/PacketCache.java
+++ /dev/null
@@ -1,131 +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.utils.tps;
-
-import de.steamwar.Reflection;
-import com.comphenix.tinyprotocol.TinyProtocol;
-import de.steamwar.core.BountifulWrapper;
-import de.steamwar.core.ChatWrapper;
-import de.steamwar.core.Core;
-import lombok.experimental.UtilityClass;
-import org.bukkit.Bukkit;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.Player;
-import org.bukkit.entity.TNTPrimed;
-import org.bukkit.scheduler.BukkitRunnable;
-import org.bukkit.scheduler.BukkitTask;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-@UtilityClass
-class PacketCache {
-
- private static List packets = new ArrayList<>();
- private static Set entities = new HashSet<>();
- private static BukkitTask task = null;
-
- private static Class> vec3dClass = Reflection.getClass("net.minecraft.world.phys.Vec3");
- private static Reflection.Field zeroVec3d = (Reflection.Field) Reflection.getField(vec3dClass, vec3dClass, 0);
- private static Object ZERO_VEC3D = zeroVec3d.get(null);
- private static Class> velocityPacketClass = Reflection.getClass("net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket");
- private static Reflection.Constructor velocityPacketConstructor = Reflection.getConstructor(velocityPacketClass, int.class, vec3dClass);
-
- private static Class> teleportPacketClass = Reflection.getClass("net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket");
- private static Class> entityClass = Reflection.getClass("net.minecraft.world.entity.Entity");
- private static Reflection.Constructor teleportPacketConstructor = Reflection.getConstructor(teleportPacketClass, entityClass);
-
- private static Class> craftEntityClass = Reflection.getClass("org.bukkit.craftbukkit.entity.CraftEntity");
- private static Reflection.Method getHandle = Reflection.getMethod(craftEntityClass, "getHandle");
-
- private static Object noGravityDataWatcher = BountifulWrapper.impl.getDataWatcherObject(5, Boolean.class);
- private static Object fuseDataWatcher = BountifulWrapper.impl.getDataWatcherObject(8, Integer.class);
-
- public void continuousSendCache() {
- if (task != null) {
- return;
- }
-
- createPackets();
- task = new BukkitRunnable() {
- @Override
- public void run() {
- _sendCache();
- }
- }.runTaskTimer(Core.getInstance(), 1, 1);
- }
-
- public void sendCache() {
- if (task != null) {
- task.cancel();
- task = null;
- }
- _sendCache();
- }
-
- private void _sendCache() {
- createPackets();
- for (Player player : Bukkit.getOnlinePlayers()) {
- for (Object packet : packets) {
- TinyProtocol.instance.sendPacket(player, packet);
- }
- }
- }
-
- public void clearCache() {
- packets.clear();
- entities.clear();
-
- if (task != null) {
- task.cancel();
- task = null;
- }
- }
-
- private void createPackets() {
- if (entities.stream().anyMatch(Entity::isDead)) {
- entities.clear();
- packets.clear();
- }
- List entities = Bukkit.getWorlds().get(0).getEntities().stream()
- .filter(e -> !(e instanceof Player))
- .filter(e -> PacketCache.entities.add(e))
- .collect(Collectors.toList());
-
- for (Entity entity : entities) {
- packets.add(teleportPacketConstructor.invoke(getHandle.invoke(entity)));
- }
- for (Entity entity : entities) {
- packets.add(velocityPacketConstructor.invoke(entity.getEntityId(), ZERO_VEC3D));
- }
- for (Entity entity : entities) {
- packets.add(ChatWrapper.impl.getDataWatcherPacket(entity.getEntityId(), noGravityDataWatcher, true));
- }
- for (Entity entity : entities) {
- if (!(entity instanceof TNTPrimed)) continue;
- TNTPrimed tnt = (TNTPrimed) entity;
- int fuse = tnt.getFuseTicks();
- packets.add(ChatWrapper.impl.getDataWatcherPacket(entity.getEntityId(), fuseDataWatcher, fuse - (fuse % 5) + 1));
- }
- }
-}
diff --git a/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/tps/TPSFreezeUtils.java b/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/tps/TPSFreezeUtils.java
deleted file mode 100644
index 3dc04cc7..00000000
--- a/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/tps/TPSFreezeUtils.java
+++ /dev/null
@@ -1,76 +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.utils.tps;
-
-import de.steamwar.Reflection;
-import lombok.Getter;
-import lombok.experimental.UtilityClass;
-import org.bukkit.Bukkit;
-import org.bukkit.World;
-
-@UtilityClass
-public class TPSFreezeUtils {
-
- private static Reflection.Field fieldAccessor;
- @Getter
- private static final boolean canFreeze;
-
- private static final Reflection.Method getWorldHandle = Reflection.getTypedMethod(Reflection.getClass("org.bukkit.craftbukkit.CraftWorld"), "getHandle", null);
-
- @Getter
- private static boolean frozen = false;
-
- private static final World world = Bukkit.getWorlds().get(0);
-
- static {
- Reflection.Field fieldAccessor;
- try {
- fieldAccessor = Reflection.getField(Reflection.getClass("net.minecraft.server.level.ServerLevel"), "freezed", boolean.class);
- } catch (IllegalArgumentException e) {
- fieldAccessor = null;
- }
- canFreeze = fieldAccessor != null;
- TPSFreezeUtils.fieldAccessor = fieldAccessor;
- }
-
- public void freeze() {
- setFreeze(world, true);
- }
-
- public void unfreeze() {
- setFreeze(world, false);
- }
-
- public boolean frozen() {
- return canFreeze && frozen;
- }
-
- private void setFreeze(World world, boolean state) {
- if (canFreeze) {
- fieldAccessor.set(getWorldHandle.invoke(world), state);
- if (state) {
- PacketCache.continuousSendCache();
- } else {
- PacketCache.clearCache();
- }
- frozen = state;
- }
- }
-}
diff --git a/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/tps/TPSLimitUtils.java b/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/tps/TPSLimitUtils.java
deleted file mode 100644
index 31943d87..00000000
--- a/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/tps/TPSLimitUtils.java
+++ /dev/null
@@ -1,124 +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.utils.tps;
-
-import de.steamwar.Reflection;
-import com.comphenix.tinyprotocol.TinyProtocol;
-import de.steamwar.bausystem.utils.PlayerMovementWrapper;
-import de.steamwar.core.Core;
-import lombok.experimental.UtilityClass;
-import org.bukkit.Bukkit;
-import org.bukkit.entity.Player;
-import org.bukkit.scheduler.BukkitTask;
-
-import java.util.Queue;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.function.BiFunction;
-
-@UtilityClass
-public class TPSLimitUtils {
-
- private static long currentTime = System.nanoTime();
- private static BukkitTask tpsLimiter = null;
- private static Queue packetQueue = new ConcurrentLinkedQueue<>();
-
- public void unlimit() {
- if (tpsLimiter != null) tpsLimiter.cancel();
- tpsLimiter = null;
- }
-
- public void limit(double tps) {
- if (tpsLimiter != null) tpsLimiter.cancel();
-
- double delay = 20 / tps;
- int loops = (int) Math.ceil(delay);
- long sleepDelay = (long) (50 * delay) / loops;
-
- tpsLimiter = Bukkit.getScheduler().runTaskTimer(Core.getInstance(), () -> {
- PacketCache.sendCache();
- for (int i = 0; i < loops; i++) {
- sleepUntilNextTick(sleepDelay);
- PacketCache.sendCache();
- while (true) {
- Runnable runnable = packetQueue.poll();
- if (runnable == null) break;
- runnable.run();
- }
- }
- PacketCache.clearCache();
- }, 0, 1);
- }
-
- private void sleepUntilNextTick(long neededDelta) {
- long lastTime = currentTime;
- currentTime = System.nanoTime();
-
- long timeDelta = (currentTime - lastTime) / 1000000;
- if (neededDelta - timeDelta < 0) return;
-
- try {
- Thread.sleep(neededDelta - timeDelta);
- currentTime = System.nanoTime();
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- }
- }
-
- /*
- static {
- long timeInterval = 50;
- final long[] lastTime = {System.currentTimeMillis()};
- final double[] tps = {20.0};
- Bukkit.getScheduler().runTaskTimer(Core.getInstance(), () -> {
- long currentTime = System.currentTimeMillis();
- if (currentTime > lastTime[0]) {
- tps[0] = (double)timeInterval / (double)(currentTime - lastTime[0]) * 20.0;
- }
-
- lastTime[0] = currentTime;
-
- Bukkit.getOnlinePlayers().forEach(player -> {
- SWUtils.sendToActionbar(player, String.valueOf((int) (tps[0] * 10.0) / 10.0));
- });
- }, timeInterval / 50L, timeInterval / 50L);
- }
- */
-
- private static final Class> position = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundMovePlayerPacket$Pos");
- private static final Class> positionLook = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundMovePlayerPacket$PosRot");
- static {
- BiFunction positionSetter = (player, o) -> {
- if (tpsLimiter != null) {
- Object object = PlayerMovementWrapper.impl.convertToOut(player, o);
- packetQueue.add(() -> {
- PlayerMovementWrapper.impl.setPosition(player, o);
- Bukkit.getOnlinePlayers().forEach(p -> {
- if (p == player) return;
- TinyProtocol.instance.sendPacket(p, object);
- });
- });
- return null;
- }
- return o;
- };
- TinyProtocol.instance.addFilter(position, positionSetter);
- TinyProtocol.instance.addFilter(positionLook, positionSetter);
- }
-}
diff --git a/BauSystem/BauSystem_18/build.gradle.kts b/BauSystem/BauSystem_18/build.gradle.kts
deleted file mode 100644
index 8dcf6852..00000000
--- a/BauSystem/BauSystem_18/build.gradle.kts
+++ /dev/null
@@ -1,35 +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 .
- */
-
-plugins {
- steamwar.java
-}
-
-java {
- sourceCompatibility = JavaVersion.VERSION_17
- targetCompatibility = JavaVersion.VERSION_17
-}
-
-dependencies {
- compileOnly(project(":BauSystem:BauSystem_Main", "default"))
- compileOnly(project(":SpigotCore", "default"))
-
- compileOnly(libs.spigotapi)
- compileOnly(libs.nms18)
-}
diff --git a/BauSystem/BauSystem_18/src/de/steamwar/bausystem/utils/NMSWrapper18.java b/BauSystem/BauSystem_18/src/de/steamwar/bausystem/utils/NMSWrapper18.java
deleted file mode 100644
index 5d03b8fe..00000000
--- a/BauSystem/BauSystem_18/src/de/steamwar/bausystem/utils/NMSWrapper18.java
+++ /dev/null
@@ -1,135 +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.utils;
-
-import de.steamwar.Reflection;
-import de.steamwar.bausystem.features.util.NoClipCommand;
-import net.minecraft.nbt.NBTBase;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.nbt.NBTTagList;
-import net.minecraft.network.protocol.game.*;
-import net.minecraft.server.level.PlayerInteractManager;
-import net.minecraft.world.level.EnumGamemode;
-import org.bukkit.GameMode;
-import org.bukkit.Material;
-import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer;
-import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-
-import java.util.List;
-
-public class NMSWrapper18 implements NMSWrapper {
-
- private static final Reflection.Field playerGameMode = Reflection.getField(PlayerInteractManager.class, EnumGamemode.class, 0);
-
- @Override
- @SuppressWarnings("deprecation")
- public void setInternalGameMode(Player player, GameMode gameMode) {
- playerGameMode.set(((CraftPlayer) player).getHandle().d, EnumGamemode.a(gameMode.getValue()));
-
- }
-
- @Override
- public void setSlotToItemStack(Player player, Object o) {
- PacketPlayInSetCreativeSlot packetPlayInSetCreativeSlot = (PacketPlayInSetCreativeSlot) o;
- int index = packetPlayInSetCreativeSlot.b();
- if (index >= 36 && index <= 44) {
- index -= 36;
- } else if (index > 44) {
- index -= 5;
- } else if (index <= 8) {
- index = index - 8 + 36;
- }
- player.getInventory().setItem(index, CraftItemStack.asBukkitCopy(packetPlayInSetCreativeSlot.c()));
- if (index < 9) player.getInventory().setHeldItemSlot(index);
- player.updateInventory();
- }
-
- private static final Reflection.Field gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, PacketPlayOutGameStateChange.a.class, 12);
-
- @Override
- public void setGameStateChangeReason(Object packet) {
- gameStateChangeReason.set(packet, PacketPlayOutGameStateChange.d);
- }
-
- @Override
- public void setPlayerBuildAbilities(Player player) {
- ((CraftPlayer) player).getHandle().fs().d = true;
- ((CraftPlayer) player).getHandle().fs().e = true;
- }
-
- @Override
- public Material pathMaterial() {
- return Material.DIRT_PATH;
- }
-
- private static final int threshold = 2048;
-
- @Override
- public boolean checkItemStack(ItemStack item) {
- net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(item);
- NBTTagCompound tag = nmsItem.t();
- if (tag != null && tag.e("BlockEntityTag")) {
- NBTTagCompound blockTag = tag.p("BlockEntityTag");
- if (blockTag.e("Items")) {
- return drillDown(blockTag.c("Items", 10), 0, 0) > threshold;
- }
- }
-
- return false;
- }
-
- private int drillDown(NBTTagList items, int layer, int start) {
- if (layer > 2) return start + threshold;
- int invalid = start;
- for (NBTBase nbtBase : items) {
- if (!(nbtBase instanceof NBTTagCompound))
- continue;
- NBTTagCompound slot = (NBTTagCompound) nbtBase;
- if (slot.e("tag")) {
- invalid += slot.f("Count");
- NBTTagCompound iTag = slot.p("tag");
- if (iTag.e("BlockEntityTag")) {
- NBTTagCompound blockTag = iTag.p("BlockEntityTag");
- if (blockTag.e("Items")) {
- invalid = drillDown(blockTag.c("Items", 10), layer + 1, invalid);
- }
- }
- }
- if (invalid > threshold)
- break;
- }
- return invalid;
- }
-
- private final Class> explosionPacket = Reflection.getClass("net.minecraft.network.protocol.game.ClientboundExplodePacket");
- private final Reflection.Field a = Reflection.getField(explosionPacket, double.class, 0);
- private final Reflection.Field b = Reflection.getField(explosionPacket, double.class, 1);
- private final Reflection.Field c = Reflection.getField(explosionPacket, double.class, 2);
- private final Reflection.Field d = Reflection.getField(explosionPacket, float.class, 0);
- private final Reflection.Field e = Reflection.getField(explosionPacket, List.class, 0);
-
- @Override
- public Object resetExplosionKnockback(Object packet) {
- PacketPlayOutExplosion packetPlayOutExplosion = (PacketPlayOutExplosion) packet;
- return new PacketPlayOutExplosion(a.get(packetPlayOutExplosion), b.get(packetPlayOutExplosion), c.get(packetPlayOutExplosion), d.get(packetPlayOutExplosion), e.get(packetPlayOutExplosion), null);
- }
-}
diff --git a/BauSystem/BauSystem_18/src/de/steamwar/bausystem/utils/PlayerMovementWrapper18.java b/BauSystem/BauSystem_18/src/de/steamwar/bausystem/utils/PlayerMovementWrapper18.java
deleted file mode 100644
index 512da797..00000000
--- a/BauSystem/BauSystem_18/src/de/steamwar/bausystem/utils/PlayerMovementWrapper18.java
+++ /dev/null
@@ -1,51 +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.utils;
-
-import de.steamwar.Reflection;
-import net.minecraft.network.protocol.game.PacketPlayInFlying;
-import net.minecraft.server.level.EntityPlayer;
-import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer;
-import org.bukkit.entity.Player;
-
-public class PlayerMovementWrapper18 implements PlayerMovementWrapper {
-
- @Override
- public void setPosition(Player player, Object object) {
- PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
- EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
- if (packetPlayInFlying.h) {
- entityPlayer.b(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c, packetPlayInFlying.d, packetPlayInFlying.e);
- } else {
- entityPlayer.e(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c);
- }
- }
-
- @Override
- public Object convertToOut(Player player, Object object) {
- PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
- Object packet = Reflection.newInstance(teleportPacket);
- teleportEntity.set(packet, player.getEntityId());
- teleportPosition.set(packet, packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c,
- packetPlayInFlying.h ? player.getLocation().getYaw() : packetPlayInFlying.d,
- packetPlayInFlying.h ? player.getLocation().getPitch() : packetPlayInFlying.e);
- return packet;
- }
-}
diff --git a/BauSystem/BauSystem_19/build.gradle.kts b/BauSystem/BauSystem_19/build.gradle.kts
deleted file mode 100644
index e6dcaf4f..00000000
--- a/BauSystem/BauSystem_19/build.gradle.kts
+++ /dev/null
@@ -1,37 +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 .
- */
-
-plugins {
- steamwar.java
-}
-
-java {
- sourceCompatibility = JavaVersion.VERSION_17
- targetCompatibility = JavaVersion.VERSION_17
-}
-
-dependencies {
- compileOnly(project(":BauSystem:BauSystem_Main", "default"))
- compileOnly(project(":SpigotCore", "default"))
-
- compileOnly(libs.spigotapi)
- compileOnly(libs.paperapi)
-
- compileOnly(libs.nms19)
-}
diff --git a/BauSystem/BauSystem_19/src/de/steamwar/bausystem/utils/NMSWrapper19.java b/BauSystem/BauSystem_19/src/de/steamwar/bausystem/utils/NMSWrapper19.java
deleted file mode 100644
index cf4c3fc2..00000000
--- a/BauSystem/BauSystem_19/src/de/steamwar/bausystem/utils/NMSWrapper19.java
+++ /dev/null
@@ -1,134 +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.utils;
-
-import de.steamwar.Reflection;
-import de.steamwar.bausystem.features.util.NoClipCommand;
-import net.minecraft.nbt.NBTBase;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.nbt.NBTTagList;
-import net.minecraft.network.protocol.game.*;
-import net.minecraft.server.level.PlayerInteractManager;
-import net.minecraft.world.level.EnumGamemode;
-import org.bukkit.GameMode;
-import org.bukkit.Material;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
-import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-
-import java.util.List;
-
-public class NMSWrapper19 implements NMSWrapper {
-
- private static final Reflection.Field playerGameMode = Reflection.getField(PlayerInteractManager.class, EnumGamemode.class, 0);
-
- @Override
- @SuppressWarnings("deprecation")
- public void setInternalGameMode(Player player, GameMode gameMode) {
- playerGameMode.set(((CraftPlayer) player).getHandle().d, EnumGamemode.a(gameMode.getValue()));
- }
-
- @Override
- public void setSlotToItemStack(Player player, Object o) {
- PacketPlayInSetCreativeSlot packetPlayInSetCreativeSlot = (PacketPlayInSetCreativeSlot) o;
- int index = packetPlayInSetCreativeSlot.b();
- if (index >= 36 && index <= 44) {
- index -= 36;
- } else if (index > 44) {
- index -= 5;
- } else if (index <= 8) {
- index = index - 8 + 36;
- }
- player.getInventory().setItem(index, CraftItemStack.asBukkitCopy(packetPlayInSetCreativeSlot.c()));
- if (index < 9) player.getInventory().setHeldItemSlot(index);
- player.updateInventory();
- }
-
- private static final Reflection.Field gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, PacketPlayOutGameStateChange.a.class, 12);
-
- @Override
- public void setGameStateChangeReason(Object packet) {
- gameStateChangeReason.set(packet, PacketPlayOutGameStateChange.d);
- }
-
- @Override
- public void setPlayerBuildAbilities(Player player) {
- ((CraftPlayer) player).getHandle().fF().d = true;
- ((CraftPlayer) player).getHandle().fF().e = true;
- }
-
- @Override
- public Material pathMaterial() {
- return Material.DIRT_PATH;
- }
-
- private static final int threshold = 2048;
-
- @Override
- public boolean checkItemStack(ItemStack item) {
- net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(item);
- NBTTagCompound tag = nmsItem.v();
- if (tag != null && tag.e("BlockEntityTag")) {
- NBTTagCompound blockTag = tag.p("BlockEntityTag");
- if (blockTag.e("Items")) {
- return drillDown(blockTag.c("Items", 10), 0, 0) > threshold;
- }
- }
-
- return false;
- }
-
- private int drillDown(NBTTagList items, int layer, int start) {
- if (layer > 2) return start + threshold;
- int invalid = start;
- for (NBTBase nbtBase : items) {
- if (!(nbtBase instanceof NBTTagCompound))
- continue;
- NBTTagCompound slot = (NBTTagCompound) nbtBase;
- if (slot.e("tag")) {
- invalid += slot.f("Count");
- NBTTagCompound iTag = slot.p("tag");
- if (iTag.e("BlockEntityTag")) {
- NBTTagCompound blockTag = iTag.p("BlockEntityTag");
- if (blockTag.e("Items")) {
- invalid = drillDown(blockTag.c("Items", 10), layer + 1, invalid);
- }
- }
- }
- if (invalid > threshold)
- break;
- }
- return invalid;
- }
-
- private final Class> explosionPacket = Reflection.getClass("net.minecraft.network.protocol.game.ClientboundExplodePacket");
- private final Reflection.Field a = Reflection.getField(explosionPacket, double.class, 0);
- private final Reflection.Field b = Reflection.getField(explosionPacket, double.class, 1);
- private final Reflection.Field c = Reflection.getField(explosionPacket, double.class, 2);
- private final Reflection.Field d = Reflection.getField(explosionPacket, float.class, 0);
- private final Reflection.Field e = Reflection.getField(explosionPacket, List.class, 0);
-
- @Override
- public Object resetExplosionKnockback(Object packet) {
- PacketPlayOutExplosion packetPlayOutExplosion = (PacketPlayOutExplosion) packet;
- return new PacketPlayOutExplosion(a.get(packetPlayOutExplosion), b.get(packetPlayOutExplosion), c.get(packetPlayOutExplosion), d.get(packetPlayOutExplosion), e.get(packetPlayOutExplosion), null);
- }
-}
diff --git a/BauSystem/BauSystem_19/src/de/steamwar/bausystem/utils/PlayerMovementWrapper19.java b/BauSystem/BauSystem_19/src/de/steamwar/bausystem/utils/PlayerMovementWrapper19.java
deleted file mode 100644
index 89912e3c..00000000
--- a/BauSystem/BauSystem_19/src/de/steamwar/bausystem/utils/PlayerMovementWrapper19.java
+++ /dev/null
@@ -1,51 +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.utils;
-
-import de.steamwar.Reflection;
-import net.minecraft.network.protocol.game.PacketPlayInFlying;
-import net.minecraft.server.level.EntityPlayer;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
-import org.bukkit.entity.Player;
-
-public class PlayerMovementWrapper19 implements PlayerMovementWrapper {
-
- @Override
- public void setPosition(Player player, Object object) {
- PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
- EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
- if (packetPlayInFlying.h) {
- entityPlayer.b(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c, packetPlayInFlying.d, packetPlayInFlying.e);
- } else {
- entityPlayer.e(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c);
- }
- }
-
- @Override
- public Object convertToOut(Player player, Object object) {
- PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
- Object packet = Reflection.newInstance(teleportPacket);
- teleportEntity.set(packet, player.getEntityId());
- teleportPosition.set(packet, packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c,
- packetPlayInFlying.h ? player.getLocation().getYaw() : packetPlayInFlying.d,
- packetPlayInFlying.h ? player.getLocation().getPitch() : packetPlayInFlying.e);
- return packet;
- }
-}
diff --git a/BauSystem/BauSystem_19/src/de/steamwar/bausystem/utils/TickListener19.java b/BauSystem/BauSystem_19/src/de/steamwar/bausystem/utils/TickListener19.java
deleted file mode 100644
index ca3d478c..00000000
--- a/BauSystem/BauSystem_19/src/de/steamwar/bausystem/utils/TickListener19.java
+++ /dev/null
@@ -1,50 +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.utils;
-
-import com.destroystokyo.paper.event.server.ServerTickEndEvent;
-import com.destroystokyo.paper.event.server.ServerTickStartEvent;
-import de.steamwar.bausystem.BauSystem;
-import org.bukkit.Bukkit;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-
-public class TickListener19 implements TickListener, Listener {
-
- private boolean tickStartRan = false;
-
- public TickListener19() {
- Bukkit.getPluginManager().registerEvents(this, BauSystem.getInstance());
- }
-
- @EventHandler
- public void onServerTickStart(ServerTickStartEvent event) {
- if (TickManager.impl.isFrozen()) return;
- Bukkit.getPluginManager().callEvent(new TickStartEvent());
- tickStartRan = true;
- }
-
- @EventHandler
- public void onServerTickEnd(ServerTickEndEvent event) {
- if (!tickStartRan) return;
- Bukkit.getPluginManager().callEvent(new TickEndEvent());
- tickStartRan = false;
- }
-}
diff --git a/BauSystem/BauSystem_20/build.gradle.kts b/BauSystem/BauSystem_20/build.gradle.kts
deleted file mode 100644
index 3032f6ba..00000000
--- a/BauSystem/BauSystem_20/build.gradle.kts
+++ /dev/null
@@ -1,36 +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 .
- */
-
-plugins {
- steamwar.java
-}
-
-java {
- sourceCompatibility = JavaVersion.VERSION_17
- targetCompatibility = JavaVersion.VERSION_17
-}
-
-dependencies {
- compileOnly(project(":BauSystem:BauSystem_Main", "default"))
- compileOnly(project(":SpigotCore", "default"))
-
- compileOnly(libs.spigotapi)
-
- compileOnly(libs.nms20)
-}
diff --git a/BauSystem/BauSystem_20/src/de/steamwar/bausystem/utils/NMSWrapper20.java b/BauSystem/BauSystem_20/src/de/steamwar/bausystem/utils/NMSWrapper20.java
deleted file mode 100644
index c7a1b363..00000000
--- a/BauSystem/BauSystem_20/src/de/steamwar/bausystem/utils/NMSWrapper20.java
+++ /dev/null
@@ -1,136 +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.utils;
-
-import de.steamwar.Reflection;
-import de.steamwar.bausystem.features.util.NoClipCommand;
-import net.minecraft.nbt.NBTBase;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.nbt.NBTTagList;
-import net.minecraft.network.protocol.game.PacketPlayInSetCreativeSlot;
-import net.minecraft.network.protocol.game.PacketPlayOutExplosion;
-import net.minecraft.network.protocol.game.PacketPlayOutGameStateChange;
-import net.minecraft.server.level.PlayerInteractManager;
-import net.minecraft.world.level.EnumGamemode;
-import org.bukkit.GameMode;
-import org.bukkit.Material;
-import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
-import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-
-import java.util.List;
-
-public class NMSWrapper20 implements NMSWrapper {
-
- private static final Reflection.Field playerGameMode = Reflection.getField(PlayerInteractManager.class, EnumGamemode.class, 0);
-
- @Override
- @SuppressWarnings("deprecation")
- public void setInternalGameMode(Player player, GameMode gameMode) {
- playerGameMode.set(((CraftPlayer) player).getHandle().e, EnumGamemode.a(gameMode.getValue()));
- }
-
- @Override
- public void setSlotToItemStack(Player player, Object o) {
- PacketPlayInSetCreativeSlot packetPlayInSetCreativeSlot = (PacketPlayInSetCreativeSlot) o;
- int index = packetPlayInSetCreativeSlot.a();
- if (index >= 36 && index <= 44) {
- index -= 36;
- } else if (index > 44) {
- index -= 5;
- } else if (index <= 8) {
- index = index - 8 + 36;
- }
- player.getInventory().setItem(index, CraftItemStack.asBukkitCopy(packetPlayInSetCreativeSlot.c()));
- if (index < 9) player.getInventory().setHeldItemSlot(index);
- player.updateInventory();
- }
-
- private static final Reflection.Field gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, PacketPlayOutGameStateChange.a.class, 12);
-
- @Override
- public void setGameStateChangeReason(Object packet) {
- gameStateChangeReason.set(packet, PacketPlayOutGameStateChange.d);
- }
-
- @Override
- public void setPlayerBuildAbilities(Player player) {
- ((CraftPlayer) player).getHandle().fO().d = true;
- ((CraftPlayer) player).getHandle().fO().e = true;
- }
-
- @Override
- public Material pathMaterial() {
- return Material.DIRT_PATH;
- }
-
- private static final int threshold = 2048;
-
- @Override
- public boolean checkItemStack(ItemStack item) {
- net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(item);
- NBTTagCompound tag = nmsItem.v();
- if (tag != null && tag.e("BlockEntityTag")) {
- NBTTagCompound blockTag = tag.p("BlockEntityTag");
- if (blockTag.e("Items")) {
- return drillDown(blockTag.c("Items", 10), 0, 0) > threshold;
- }
- }
-
- return false;
- }
-
- private int drillDown(NBTTagList items, int layer, int start) {
- if (layer > 2) return start + threshold;
- int invalid = start;
- for (NBTBase nbtBase : items) {
- if (!(nbtBase instanceof NBTTagCompound))
- continue;
- NBTTagCompound slot = (NBTTagCompound) nbtBase;
- if (slot.e("tag")) {
- invalid += slot.f("Count");
- NBTTagCompound iTag = slot.p("tag");
- if (iTag.e("BlockEntityTag")) {
- NBTTagCompound blockTag = iTag.p("BlockEntityTag");
- if (blockTag.e("Items")) {
- invalid = drillDown(blockTag.c("Items", 10), layer + 1, invalid);
- }
- }
- }
- if (invalid > threshold)
- break;
- }
- return invalid;
- }
-
- private final Class> explosionPacket = Reflection.getClass("net.minecraft.network.protocol.game.ClientboundExplodePacket");
- private final Reflection.Field a = Reflection.getField(explosionPacket, double.class, 0);
- private final Reflection.Field b = Reflection.getField(explosionPacket, double.class, 1);
- private final Reflection.Field c = Reflection.getField(explosionPacket, double.class, 2);
- private final Reflection.Field d = Reflection.getField(explosionPacket, float.class, 0);
- private final Reflection.Field e = Reflection.getField(explosionPacket, List.class, 0);
-
- @Override
- public Object resetExplosionKnockback(Object packet) {
- PacketPlayOutExplosion packetPlayOutExplosion = (PacketPlayOutExplosion) packet;
- return new PacketPlayOutExplosion(a.get(packetPlayOutExplosion), b.get(packetPlayOutExplosion), c.get(packetPlayOutExplosion), d.get(packetPlayOutExplosion), e.get(packetPlayOutExplosion), null);
- }
-}
diff --git a/BauSystem/BauSystem_20/src/de/steamwar/bausystem/utils/PlaceItemWrapper20.java b/BauSystem/BauSystem_20/src/de/steamwar/bausystem/utils/PlaceItemWrapper20.java
deleted file mode 100644
index 407a7207..00000000
--- a/BauSystem/BauSystem_20/src/de/steamwar/bausystem/utils/PlaceItemWrapper20.java
+++ /dev/null
@@ -1,43 +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.utils;
-
-import org.bukkit.Material;
-import org.bukkit.block.data.BlockData;
-
-public class PlaceItemWrapper20 implements PlaceItemWrapper {
-
- public PlaceItemWrapper20() {
- for (Material material : Material.values()) {
- if (!material.isBlock()) continue;
- if (material.isLegacy()) continue;
- BlockData blockData = material.createBlockData();
- Material placementMaterial = blockData.getPlacementMaterial();
- if (material == placementMaterial) continue;
- if (placementMaterial == Material.AIR) continue;
- if (placementMaterial.isItem() && !placementMaterial.isBlock()) {
- ITEM_MATERIAL_TO_BLOCK_MATERIAL.put(placementMaterial, material);
- }
- if (material.name().contains("WALL")) {
- BLOCK_MATERIAL_TO_WALL_BLOCK_MATERIAL.put(placementMaterial, material);
- }
- }
- }
-}
diff --git a/BauSystem/BauSystem_20/src/de/steamwar/bausystem/utils/PlayerMovementWrapper20.java b/BauSystem/BauSystem_20/src/de/steamwar/bausystem/utils/PlayerMovementWrapper20.java
deleted file mode 100644
index feec5e59..00000000
--- a/BauSystem/BauSystem_20/src/de/steamwar/bausystem/utils/PlayerMovementWrapper20.java
+++ /dev/null
@@ -1,51 +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.utils;
-
-import de.steamwar.Reflection;
-import net.minecraft.network.protocol.game.PacketPlayInFlying;
-import net.minecraft.server.level.EntityPlayer;
-import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
-import org.bukkit.entity.Player;
-
-public class PlayerMovementWrapper20 implements PlayerMovementWrapper {
-
- @Override
- public void setPosition(Player player, Object object) {
- PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
- EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
- if (packetPlayInFlying.h) {
- entityPlayer.b(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c, packetPlayInFlying.d, packetPlayInFlying.e);
- } else {
- entityPlayer.e(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c);
- }
- }
-
- @Override
- public Object convertToOut(Player player, Object object) {
- PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
- Object packet = Reflection.newInstance(teleportPacket);
- teleportEntity.set(packet, player.getEntityId());
- teleportPosition.set(packet, packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c,
- packetPlayInFlying.h ? player.getLocation().getYaw() : packetPlayInFlying.d,
- packetPlayInFlying.h ? player.getLocation().getPitch() : packetPlayInFlying.e);
- return packet;
- }
-}
diff --git a/BauSystem/BauSystem_21/build.gradle.kts b/BauSystem/BauSystem_21/build.gradle.kts
deleted file mode 100644
index 8b40ae2d..00000000
--- a/BauSystem/BauSystem_21/build.gradle.kts
+++ /dev/null
@@ -1,36 +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 .
- */
-
-plugins {
- steamwar.java
-}
-
-java {
- sourceCompatibility = JavaVersion.VERSION_21
- targetCompatibility = JavaVersion.VERSION_21
-}
-
-dependencies {
- compileOnly(project(":BauSystem:BauSystem_Main", "default"))
- compileOnly(project(":SpigotCore", "default"))
-
- compileOnly(libs.paperapi21)
-
- compileOnly(libs.nms21)
-}
\ No newline at end of file
diff --git a/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/NMSWrapper21.java b/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/NMSWrapper21.java
deleted file mode 100644
index 54651656..00000000
--- a/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/NMSWrapper21.java
+++ /dev/null
@@ -1,133 +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.utils;
-
-import de.steamwar.Reflection;
-import de.steamwar.bausystem.features.util.NoClipCommand;
-import io.papermc.paper.datacomponent.DataComponentTypes;
-import io.papermc.paper.datacomponent.item.ItemContainerContents;
-import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket;
-import net.minecraft.network.protocol.game.ClientboundExplodePacket;
-import net.minecraft.network.protocol.game.ClientboundGameEventPacket;
-import net.minecraft.server.level.ServerPlayer;
-import net.minecraft.server.level.ServerPlayerGameMode;
-import net.minecraft.world.entity.player.Abilities;
-import net.minecraft.world.level.GameType;
-import org.bukkit.GameMode;
-import org.bukkit.Material;
-import org.bukkit.craftbukkit.entity.CraftPlayer;
-import org.bukkit.craftbukkit.inventory.CraftItemStack;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-
-import java.util.List;
-import java.util.Optional;
-
-public class NMSWrapper21 implements NMSWrapper {
-
- private static final Reflection.Field playerInteractManager = Reflection.getField(ServerPlayer.class, null, ServerPlayerGameMode.class);
- private static final Reflection.Field playerGameMode = Reflection.getField(ServerPlayerGameMode.class, GameType.class, 0);
-
- @Override
- public void setInternalGameMode(Player player, GameMode gameMode) {
- playerGameMode.set(playerInteractManager.get(((CraftPlayer) player).getHandle()), GameType.byId(gameMode.getValue()));
- }
-
- @Override
- public void setSlotToItemStack(Player player, Object o) {
- ClientboundContainerSetSlotPacket packetPlayInSetCreativeSlot = (ClientboundContainerSetSlotPacket) o;
- int index = packetPlayInSetCreativeSlot.getSlot();
- if (index >= 36 && index <= 44) {
- index -= 36;
- } else if (index > 44) {
- index -= 5;
- } else if (index <= 8) {
- index = index - 8 + 36;
- }
- player.getInventory().setItem(index, CraftItemStack.asBukkitCopy(packetPlayInSetCreativeSlot.getItem()));
- if (index < 9) player.getInventory().setHeldItemSlot(index);
- player.updateInventory();
- }
-
- private static final Reflection.Field gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, ClientboundGameEventPacket.Type.class, 14);
-
- @Override
- public void setGameStateChangeReason(Object packet) {
- gameStateChangeReason.set(packet, ClientboundGameEventPacket.CHANGE_GAME_MODE);
- }
-
- @Override
- public void setPlayerBuildAbilities(Player player) {
- Abilities abilities = (((CraftPlayer) player).getHandle()).getAbilities();
- abilities.mayBuild = true;
- abilities.mayfly = true;
- }
-
- @Override
- public Material pathMaterial() {
- return Material.DIRT_PATH;
- }
-
- private static final int threshold = 2048;
-
- @Override
- public boolean checkItemStack(ItemStack item) {
- ItemContainerContents data = item.getData(DataComponentTypes.CONTAINER);
- if (data == null) {
- return false;
- }
-
- return drillDown(data.contents(), 0, 0) > threshold;
- }
-
- private int drillDown(List items, int layer, int start) {
- if (layer > 2) return start + threshold;
- int invalid = start;
- for (int i = start; i < items.size(); i++) {
- ItemStack item = items.get(i);
- if (item.isEmpty()) continue;
-
- invalid += item.getAmount();
-
- ItemContainerContents data = item.getData(DataComponentTypes.CONTAINER);
- if (data == null) {
- continue;
- }
-
- List subItems = data.contents();
- if (subItems.size() > 1) {
- invalid = drillDown(subItems, layer + 1, invalid);
- }
- }
- return invalid;
- }
-
- @Override
- public Object resetExplosionKnockback(Object packet) {
- ClientboundExplodePacket explosion = (ClientboundExplodePacket) packet;
-
- return new ClientboundExplodePacket(
- explosion.center(),
- Optional.empty(),
- explosion.explosionParticle(),
- explosion.explosionSound()
- );
- }
-}
diff --git a/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/PlayerMovementWrapper21.java b/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/PlayerMovementWrapper21.java
deleted file mode 100644
index e62e4591..00000000
--- a/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/PlayerMovementWrapper21.java
+++ /dev/null
@@ -1,46 +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.utils;
-
-import net.minecraft.network.protocol.game.ServerboundMovePlayerPacket;
-import net.minecraft.server.level.ServerPlayer;
-import org.bukkit.craftbukkit.entity.CraftPlayer;
-import org.bukkit.entity.Player;
-
-public class PlayerMovementWrapper21 implements PlayerMovementWrapper {
-
- @Override
- public void setPosition(Player player, Object object) {
- ServerboundMovePlayerPacket packetPlayInFlying = ((ServerboundMovePlayerPacket) object);
- ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle();
- if (packetPlayInFlying.hasPos) {
- serverPlayer.setPosRaw(packetPlayInFlying.x, packetPlayInFlying.y, packetPlayInFlying.z);
- }
- if (packetPlayInFlying.hasRot) {
- serverPlayer.setXRot(packetPlayInFlying.xRot);
- serverPlayer.setYRot(packetPlayInFlying.yRot);
- }
- }
-
- @Override
- public Object convertToOut(Player player, Object object) {
- return object;
- }
-}
diff --git a/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/TickManager21.java b/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/TickManager21.java
deleted file mode 100644
index ad6ca6c2..00000000
--- a/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/TickManager21.java
+++ /dev/null
@@ -1,149 +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.utils;
-
-import com.comphenix.tinyprotocol.TinyProtocol;
-import de.steamwar.Reflection;
-import de.steamwar.bausystem.BauSystem;
-import net.minecraft.network.protocol.game.ClientboundTickingStatePacket;
-import net.minecraft.server.MinecraftServer;
-import net.minecraft.server.ServerTickRateManager;
-import net.minecraft.world.TickRateManager;
-import org.bukkit.Bukkit;
-import org.bukkit.entity.Player;
-
-public class TickManager21 implements TickManager {
- private static final ServerTickRateManager manager = MinecraftServer.getServer().tickRateManager();
- private static final Reflection.Field frozenTicksToRun = Reflection.getField(TickRateManager.class, int.class, 0);
- private static final Reflection.Field remainingSprintTicks = Reflection.getField(ServerTickRateManager.class, long.class, 0);
-
- private boolean blockTpsPacket = true;
- private int totalSteps;
-
- public TickManager21() {
- TinyProtocol.instance.addFilter(ClientboundTickingStatePacket.class, this::blockPacket);
- }
-
- private Object blockPacket(Player player, Object packet) {
- if (blockTpsPacket) {
- return new ClientboundTickingStatePacket(20, manager.isFrozen());
- } else {
- return packet;
- }
- }
-
- @Override
- public boolean canFreeze() {
- return true;
- }
-
- @Override
- public void setBlockTpsPacket(boolean block) {
- blockTpsPacket = block;
- if (blockTpsPacket) {
- ClientboundTickingStatePacket packet = new ClientboundTickingStatePacket(20, manager.isFrozen());
- Bukkit.getOnlinePlayers().forEach(player -> TinyProtocol.instance.sendPacket(player, packet));
- } else {
- ClientboundTickingStatePacket packet = new ClientboundTickingStatePacket(manager.tickrate(), manager.isFrozen());
- Bukkit.getOnlinePlayers().forEach(player -> TinyProtocol.instance.sendPacket(player, packet));
- }
- }
-
- @Override
- public void setTickRate(float tickRate) {
- if (isFrozen()) {
- setFreeze(false);
- }
- manager.setTickRate(tickRate);
- }
-
- @Override
- public boolean isFrozen() {
- return manager.isFrozen();
- }
-
- @Override
- public void setFreeze(boolean freeze) {
- manager.setFrozen(freeze);
- }
-
- @Override
- public void stepTicks(int ticks) {
- if (manager.isSprinting()) {
- manager.stopSprinting();
- } else if (manager.isSteppingForward()) {
- manager.stopStepping();
- }
- this.totalSteps = ticks;
- manager.setFrozen(true);
- manager.stepGameIfPaused(ticks);
- manager.setFrozen(false);
- Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), (bukkitTask) -> {
- if (manager.isSteppingForward()) return;
- manager.setFrozen(true);
- bukkitTask.cancel();
- }, 1, 1);
- }
-
- @Override
- public void sprintTicks(int ticks) {
- if (manager.isSteppingForward()) {
- manager.stopStepping();
- } else if (manager.isSprinting()) {
- manager.stopSprinting();
- }
- this.totalSteps = ticks;
- manager.requestGameToSprint(ticks, true);
- }
-
- @Override
- public boolean isSprinting() {
- return manager.isSprinting();
- }
-
- @Override
- public boolean isStepping() {
- return manager.isSteppingForward();
- }
-
- @Override
- public float getTickRate() {
- return manager.tickrate();
- }
-
- @Override
- public long getRemainingTicks() {
- if (isSprinting()) {
- return remainingSprintTicks.get(manager);
- } else {
- return frozenTicksToRun.get(manager);
- }
- }
-
- @Override
- public long getDoneTicks() {
- return totalSteps - getRemainingTicks();
- }
-
- @Override
- public long getTotalTicks() {
- return totalSteps;
- }
-}
diff --git a/BauSystem/BauSystem_Main/build.gradle.kts b/BauSystem/BauSystem_Main/build.gradle.kts
index 45aff756..cc587314 100644
--- a/BauSystem/BauSystem_Main/build.gradle.kts
+++ b/BauSystem/BauSystem_Main/build.gradle.kts
@@ -26,8 +26,8 @@ tasks.compileJava {
}
java {
- sourceCompatibility = JavaVersion.VERSION_17
- targetCompatibility = JavaVersion.VERSION_17
+ sourceCompatibility = JavaVersion.VERSION_21
+ targetCompatibility = JavaVersion.VERSION_21
}
dependencies {
@@ -35,10 +35,12 @@ dependencies {
annotationProcessor(libs.classindex)
compileOnly(project(":SpigotCore", "default"))
- compileOnly(libs.spigotapi)
compileOnly(libs.axiom)
compileOnly(libs.authlib)
+ compileOnly(libs.paperapi21)
+ compileOnly(libs.nms21)
+
compileOnly(libs.fawe18)
implementation(libs.luaj)
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java
index 39f0a4b7..e1f7b11a 100644
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java
+++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java
@@ -34,7 +34,6 @@ import de.steamwar.bausystem.features.world.BauScoreboard;
import de.steamwar.bausystem.linkage.BauGuiItem;
import de.steamwar.bausystem.region.RegionSystem;
import de.steamwar.bausystem.utils.ScoreboardElement;
-import de.steamwar.bausystem.utils.TickListener;
import de.steamwar.bausystem.utils.TickManager;
import de.steamwar.bausystem.worlddata.WorldData;
import de.steamwar.command.AbstractValidator;
@@ -127,8 +126,6 @@ public class BauSystem extends JavaPlugin implements Listener {
return;
}
- TickListener.impl.init();
-
TraceManager.instance.init();
TraceRecorder.instance.init();
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/observer/ObserverTracer.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/observer/ObserverTracer.java
index 6dad9e00..98a1df65 100644
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/observer/ObserverTracer.java
+++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/observer/ObserverTracer.java
@@ -19,7 +19,6 @@
package de.steamwar.bausystem.features.observer;
-import de.steamwar.Reflection;
import de.steamwar.bausystem.region.Point;
import de.steamwar.core.SWPlayer;
import org.bukkit.Location;
@@ -29,8 +28,9 @@ import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.data.Bisected;
import org.bukkit.block.data.BlockData;
-import org.bukkit.block.data.type.Observer;
import org.bukkit.block.data.type.*;
+import org.bukkit.block.data.type.Observer;
+import org.bukkit.craftbukkit.block.impl.CraftPoweredRail;
import org.bukkit.entity.Player;
import java.util.*;
@@ -171,7 +171,6 @@ public class ObserverTracer implements SWPlayer.Component {
}
}
- private static final Class> craftPoweredRail = Reflection.getClass("org.bukkit.craftbukkit.block.impl.CraftPoweredRail");
private boolean checkAllowed(Block block, BlockData blockData) {
if (checkMaterial(block)) return true;
if (block.getType() == Material.BELL) {
@@ -180,7 +179,7 @@ public class ObserverTracer implements SWPlayer.Component {
return blockData instanceof Door
|| blockData instanceof Gate
- || craftPoweredRail.isInstance(blockData)
+ || blockData instanceof CraftPoweredRail
|| blockData instanceof TrapDoor
|| blockData instanceof GlassPane;
}
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java
index 7a1ba7e6..cb542422 100644
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java
+++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java
@@ -20,7 +20,6 @@
package de.steamwar.bausystem.features.simulator;
import com.comphenix.tinyprotocol.TinyProtocol;
-import de.steamwar.Reflection;
import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.Permission;
import de.steamwar.bausystem.SWUtils;
@@ -48,6 +47,7 @@ import de.steamwar.linkage.Linked;
import de.steamwar.linkage.MinVersion;
import lombok.AllArgsConstructor;
import lombok.Getter;
+import net.minecraft.network.protocol.game.ServerboundMovePlayerPacket;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
@@ -72,9 +72,6 @@ import java.util.stream.Collectors;
public class SimulatorCursor implements Listener {
private static final World WORLD = Bukkit.getWorlds().get(0);
- private Class> position = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundMovePlayerPacket$Pos");
- private Class> look = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundMovePlayerPacket$Rot");
- private Class> positionLook = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundMovePlayerPacket$PosRot");
private static Map cursorType = Collections.synchronizedMap(new HashMap<>());
private static Map cursors = Collections.synchronizedMap(new HashMap<>());
@@ -89,9 +86,9 @@ public class SimulatorCursor implements Listener {
calcCursor(player);
return object;
};
- TinyProtocol.instance.addFilter(position, function);
- TinyProtocol.instance.addFilter(look, function);
- TinyProtocol.instance.addFilter(positionLook, function);
+ TinyProtocol.instance.addFilter(ServerboundMovePlayerPacket.Pos.class, function);
+ TinyProtocol.instance.addFilter(ServerboundMovePlayerPacket.Rot.class, function);
+ TinyProtocol.instance.addFilter(ServerboundMovePlayerPacket.PosRot.class, function);
}
@EventHandler
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/SimulatorExecutor.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/SimulatorExecutor.java
index 108827e3..22535742 100644
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/SimulatorExecutor.java
+++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/SimulatorExecutor.java
@@ -19,14 +19,15 @@
package de.steamwar.bausystem.features.simulator.execute;
+import com.destroystokyo.paper.event.server.ServerTickEndEvent;
+import com.destroystokyo.paper.event.server.ServerTickStartEvent;
import de.steamwar.bausystem.features.simulator.data.Simulator;
import de.steamwar.bausystem.features.simulator.data.SimulatorElement;
import de.steamwar.bausystem.features.simulator.data.SimulatorGroup;
import de.steamwar.bausystem.features.tpslimit.TPSUtils;
import de.steamwar.bausystem.features.tracer.TraceRecorder;
import de.steamwar.bausystem.region.Region;
-import de.steamwar.bausystem.utils.TickEndEvent;
-import de.steamwar.bausystem.utils.TickStartEvent;
+import de.steamwar.bausystem.utils.TickManager;
import de.steamwar.linkage.Linked;
import de.steamwar.linkage.MinVersion;
import org.bukkit.Bukkit;
@@ -109,8 +110,13 @@ public class SimulatorExecutor implements Listener {
return true;
}
+ private boolean tickStartRan = false;
+
@EventHandler
- public void onTickStart(TickStartEvent event) {
+ public void onServerTickStart(ServerTickStartEvent event) {
+ if (TickManager.impl.isFrozen()) return;
+ tickStartRan = true;
+
long currentTick = TPSUtils.currentRealTick.get();
Map> actionsToRun = tickStartActions.remove(currentTick);
if (actionsToRun == null) return;
@@ -123,7 +129,10 @@ public class SimulatorExecutor implements Listener {
}
@EventHandler
- public void onTickEnd(TickEndEvent event) {
+ public void onServerTickEnd(ServerTickEndEvent event) {
+ if (!tickStartRan) return;
+ tickStartRan = false;
+
long currentTick = TPSUtils.currentRealTick.get() - 1;
List actionsToRun = tickEndActions.remove(currentTick);
if (actionsToRun == null) return;
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/smartplace/SmartPlaceListener.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/smartplace/SmartPlaceListener.java
index bc3d2bb0..48c55e3b 100644
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/smartplace/SmartPlaceListener.java
+++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/smartplace/SmartPlaceListener.java
@@ -20,13 +20,13 @@
package de.steamwar.bausystem.features.smartplace;
import com.comphenix.tinyprotocol.TinyProtocol;
-import de.steamwar.Reflection;
import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.Permission;
import de.steamwar.bausystem.configplayer.Config;
import de.steamwar.core.Core;
import de.steamwar.inventory.SWItem;
import de.steamwar.linkage.Linked;
+import net.minecraft.network.protocol.game.ServerboundUseItemOnPacket;
import org.bukkit.*;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
@@ -83,13 +83,11 @@ public class SmartPlaceListener implements Listener {
IGNORED.remove(Material.BARRIER);
}
- private static final Class> useItem = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundUseItemOnPacket");
-
private static final Set SMART_PLACING = new HashSet<>();
private static final Set WAS_EXECUTED = new HashSet<>();
public SmartPlaceListener() {
- TinyProtocol.instance.addFilter(useItem, (player, packet) -> {
+ TinyProtocol.instance.addFilter(ServerboundUseItemOnPacket.class, (player, packet) -> {
if(!Permission.BUILD.hasPermission(player)) return packet;
if (!Config.getInstance().get(player).getPlainValueOrDefault("smartPlace", false)) return packet;
RayTraceResult rayTraceResult = player.rayTraceBlocks(6);
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/MaterialCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/MaterialCommand.java
index 52a588f9..a3392807 100644
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/MaterialCommand.java
+++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/MaterialCommand.java
@@ -39,10 +39,7 @@ import lombok.Setter;
import org.bukkit.Material;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
-import org.bukkit.event.player.PlayerJoinEvent;
-import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.ItemStack;
import java.util.*;
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/NoClipCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/NoClipCommand.java
index 61fdecdc..0c1481e6 100644
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/NoClipCommand.java
+++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/NoClipCommand.java
@@ -21,7 +21,6 @@ package de.steamwar.bausystem.features.util;
import com.comphenix.tinyprotocol.TinyProtocol;
import com.mojang.authlib.GameProfile;
-import de.steamwar.Reflection;
import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.features.tpslimit.TPSUtils;
import de.steamwar.bausystem.utils.BauMemberUpdateEvent;
@@ -30,6 +29,7 @@ import de.steamwar.command.SWCommand;
import de.steamwar.core.ProtocolWrapper;
import de.steamwar.core.SWPlayer;
import de.steamwar.linkage.Linked;
+import net.minecraft.network.protocol.game.*;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.entity.Player;
@@ -45,16 +45,6 @@ import java.util.function.BiFunction;
@Linked
public class NoClipCommand extends SWCommand implements Listener {
- public static final Class> gameStateChange = Reflection.getClass("net.minecraft.network.protocol.game.ClientboundGameEventPacket");
- private static final Reflection.Field floatFieldAccessor = Reflection.getField(gameStateChange, float.class, 0);
-
- private static final Class> position = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundMovePlayerPacket$Pos");
- private static final Class> positionLook = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundMovePlayerPacket$PosRot");
- private static final Class> useItem = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundUseItemOnPacket");
- private static final Class> blockDig = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundPlayerActionPacket");
- private static final Class> windowClick = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundContainerClickPacket");
- private static final Class> setSlotStack = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundSetCreativeModeSlotPacket");
-
public static class NoClipData implements SWPlayer.Component {
private long lastTick = -1;
@@ -75,8 +65,8 @@ public class NoClipCommand extends SWCommand implements Listener {
noClipData.lastTick = TPSUtils.currentTick.get();
return o;
};
- TinyProtocol.instance.addFilter(position, first);
- TinyProtocol.instance.addFilter(positionLook, first);
+ TinyProtocol.instance.addFilter(ServerboundMovePlayerPacket.Pos.class, first);
+ TinyProtocol.instance.addFilter(ServerboundMovePlayerPacket.PosRot.class, first);
BiFunction second = (player, o) -> {
NoClipData noClipData = SWPlayer.of(player).getComponent(NoClipData.class).orElse(null);
@@ -85,9 +75,9 @@ public class NoClipCommand extends SWCommand implements Listener {
noClipData.lastTick = TPSUtils.currentTick.get();
return o;
};
- TinyProtocol.instance.addFilter(useItem, second);
- TinyProtocol.instance.addFilter(blockDig, second);
- TinyProtocol.instance.addFilter(windowClick, second);
+ TinyProtocol.instance.addFilter(ServerboundUseItemOnPacket.class, second);
+ TinyProtocol.instance.addFilter(ServerboundPlayerActionPacket.class, second);
+ TinyProtocol.instance.addFilter(ServerboundContainerClickPacket.class, second);
BiFunction third = (player, o) -> {
if (SWPlayer.of(player).hasComponent(NoClipData.class)) {
@@ -95,7 +85,7 @@ public class NoClipCommand extends SWCommand implements Listener {
}
return o;
};
- TinyProtocol.instance.addFilter(setSlotStack, third);
+ TinyProtocol.instance.addFilter(ServerboundSetCreativeModeSlotPacket.class, third);
}
@Register(help = true)
@@ -107,13 +97,9 @@ public class NoClipCommand extends SWCommand implements Listener {
player.setGameMode(GameMode.SPECTATOR);
NMSWrapper.impl.setPlayerBuildAbilities(player);
- Object gameStateChangeObject = Reflection.newInstance(gameStateChange);
- NMSWrapper.impl.setGameStateChangeReason(gameStateChangeObject);
- floatFieldAccessor.set(gameStateChangeObject, 1F);
-
swPlayer.setComponent(new NoClipData());
BauSystem.MESSAGE.send("OTHER_NOCLIP_SLOT_INFO", player);
- TinyProtocol.instance.sendPacket(player, gameStateChangeObject);
+ TinyProtocol.instance.sendPacket(player, new ClientboundGameEventPacket(ClientboundGameEventPacket.CHANGE_GAME_MODE, 1F));
pseudoGameMode(player, GameMode.SPECTATOR);
}
}
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/items/KillAllBauGuiItem.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/items/KillAllBauGuiItem.java
index 72e72713..50878f31 100644
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/items/KillAllBauGuiItem.java
+++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/items/KillAllBauGuiItem.java
@@ -22,8 +22,8 @@ package de.steamwar.bausystem.features.util.items;
import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.Permission;
import de.steamwar.bausystem.features.util.KillAllCommand;
-import de.steamwar.bausystem.linkage.BauGuiItem;
import de.steamwar.bausystem.features.util.RegionSelectionType;
+import de.steamwar.bausystem.linkage.BauGuiItem;
import de.steamwar.inventory.SWItem;
import de.steamwar.linkage.Linked;
import de.steamwar.linkage.LinkedInstance;
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/AntiCursorReCentering.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/AntiCursorReCentering.java
index c526d089..3d6c1e9f 100644
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/AntiCursorReCentering.java
+++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/AntiCursorReCentering.java
@@ -19,11 +19,11 @@
package de.steamwar.bausystem.features.world;
-import de.steamwar.Reflection;
import com.comphenix.tinyprotocol.TinyProtocol;
import de.steamwar.bausystem.BauSystem;
import de.steamwar.linkage.Linked;
import de.steamwar.linkage.api.Enable;
+import net.minecraft.network.protocol.game.ClientboundContainerClosePacket;
import org.bukkit.Bukkit;
import org.bukkit.event.inventory.InventoryType;
@@ -32,8 +32,7 @@ public class AntiCursorReCentering implements Enable {
@Override
public void enable() {
- Class> closeWindow = Reflection.getClass("net.minecraft.network.protocol.game.ClientboundContainerClosePacket");
- TinyProtocol.instance.addFilter(closeWindow, (player, object) -> {
+ TinyProtocol.instance.addFilter(ClientboundContainerClosePacket.class, (player, object) -> {
if (player.getOpenInventory().getTopInventory().getType() == InventoryType.CRAFTING) {
return object;
}
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/NoCreativeKnockback.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/NoCreativeKnockback.java
index 602903eb..2debf84e 100644
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/NoCreativeKnockback.java
+++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/NoCreativeKnockback.java
@@ -19,17 +19,17 @@
package de.steamwar.bausystem.features.world;
-import de.steamwar.Reflection;
import com.comphenix.tinyprotocol.TinyProtocol;
import de.steamwar.bausystem.utils.NMSWrapper;
import de.steamwar.linkage.Linked;
+import net.minecraft.network.protocol.game.ClientboundExplodePacket;
import org.bukkit.GameMode;
@Linked
public class NoCreativeKnockback {
public NoCreativeKnockback() {
- TinyProtocol.instance.addFilter(Reflection.getClass("net.minecraft.network.protocol.game.ClientboundExplodePacket"), (player, o) -> {
+ TinyProtocol.instance.addFilter(ClientboundExplodePacket.class, (player, o) -> {
if (player.getGameMode() != GameMode.CREATIVE) return o;
return NMSWrapper.impl.resetExplosionKnockback(o);
});
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/SignEditFrom20.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/SignEdit.java
similarity index 66%
rename from BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/SignEditFrom20.java
rename to BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/SignEdit.java
index 6adb98f5..0487a406 100644
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/SignEditFrom20.java
+++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/SignEdit.java
@@ -19,13 +19,14 @@
package de.steamwar.bausystem.features.world;
-import de.steamwar.Reflection;
import com.comphenix.tinyprotocol.TinyProtocol;
import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.Permission;
import de.steamwar.bausystem.utils.PlaceItemUtils;
import de.steamwar.linkage.Linked;
-import de.steamwar.linkage.MinVersion;
+import net.minecraft.network.protocol.game.ClientboundOpenSignEditorPacket;
+import net.minecraft.network.protocol.game.ServerboundSignUpdatePacket;
+import net.minecraft.server.level.ServerLevel;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
@@ -37,6 +38,8 @@ import org.bukkit.block.data.Directional;
import org.bukkit.block.data.Rotatable;
import org.bukkit.block.sign.Side;
import org.bukkit.block.sign.SignSide;
+import org.bukkit.craftbukkit.CraftWorld;
+import org.bukkit.craftbukkit.block.CraftBlock;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@@ -45,24 +48,7 @@ import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.util.Vector;
@Linked
-@MinVersion(20)
-public class SignEditFrom20 implements Listener {
-
- private static final Class> blockPosition = Reflection.getClass("net.minecraft.core.BlockPos");
- private static final Class> craftBlock = Reflection.getClass("org.bukkit.craftbukkit.block.CraftBlock");
- private static final Class> craftWorld = Reflection.getClass("org.bukkit.craftbukkit.CraftWorld");
- private static final Class> generatorAccess = Reflection.getClass("net.minecraft.world.level.LevelAccessor");
- private static final Reflection.Method getPosition = Reflection.getTypedMethod(craftBlock, "getPosition", blockPosition);
- private static final Reflection.Method getWorldHandle = Reflection.getTypedMethod(craftWorld, "getHandle", null);
- private static final Reflection.Method at = Reflection.getTypedMethod(craftBlock, "at", craftBlock, generatorAccess, blockPosition);
-
- private static final Class> openSign = Reflection.getClass("net.minecraft.network.protocol.game.ClientboundOpenSignEditorPacket");
- private static final Reflection.Field> blockPositionFieldAccessor = Reflection.getField(openSign, blockPosition, 0);
- private static final Reflection.Field> sideFieldAccessor = Reflection.getField(openSign, boolean.class, 0);
-
- private static final Class> updateSign = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundSignUpdatePacket");
- private static final Reflection.Field> getBlockPositionFieldAccessor = Reflection.getField(updateSign, blockPosition, 0);
- private static final Reflection.Field stringFieldAccessor = Reflection.getField(updateSign, String[].class, 0);
+public class SignEdit implements Listener {
@EventHandler
public void editSign(PlayerInteractEvent event) {
@@ -93,10 +79,8 @@ public class SignEditFrom20 implements Listener {
sign.update(true);
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
- Object openSignObject = Reflection.newInstance(openSign);
- blockPositionFieldAccessor.set(openSignObject, getPosition.invoke(block));
- sideFieldAccessor.set(openSignObject, side == Side.FRONT);
- TinyProtocol.instance.sendPacket(player, openSignObject);
+ ClientboundOpenSignEditorPacket packet = new ClientboundOpenSignEditorPacket(((CraftBlock) block).getPosition(), side == Side.FRONT);
+ TinyProtocol.instance.sendPacket(player, packet);
}, 1);
}
@@ -117,14 +101,14 @@ public class SignEditFrom20 implements Listener {
}
{
- TinyProtocol.instance.addFilter(updateSign, (player, o) -> {
+ TinyProtocol.instance.addTypedFilter(ServerboundSignUpdatePacket.class, (player, o) -> {
Bukkit.getScheduler().runTask(BauSystem.getInstance(), () -> {
- String[] lines = stringFieldAccessor.get(o);
-
- Block signLoc = (Block) at.invoke(null, getWorldHandle.invoke(player.getWorld()), getBlockPositionFieldAccessor.get(o));
+ ServerLevel serverLevel = ((CraftWorld) player.getWorld()).getHandle();
+ Block signLoc = CraftBlock.at(serverLevel, o.getPos());
if (!signLoc.getType().name().contains("SIGN"))
return;
+ String[] lines = o.getLines();
Sign sign = ((Sign) signLoc.getState());
SignSide signSide = sign.getSide(signSide(player, signLoc));
for (int i = 0; i < lines.length; i++) {
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/SignEditUntil19.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/SignEditUntil19.java
deleted file mode 100644
index 96ca0df8..00000000
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/SignEditUntil19.java
+++ /dev/null
@@ -1,105 +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.world;
-
-import de.steamwar.Reflection;
-import com.comphenix.tinyprotocol.TinyProtocol;
-import de.steamwar.bausystem.BauSystem;
-import de.steamwar.bausystem.Permission;
-import de.steamwar.linkage.Linked;
-import de.steamwar.linkage.MaxVersion;
-import org.bukkit.Bukkit;
-import org.bukkit.ChatColor;
-import org.bukkit.Material;
-import org.bukkit.block.Block;
-import org.bukkit.block.Sign;
-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;
-
-@Linked
-@MaxVersion(19)
-public class SignEditUntil19 implements Listener {
-
- private static final Class> blockPosition = Reflection.getClass("net.minecraft.core.BlockPos");
- private static final Class> craftBlock = Reflection.getClass("org.bukkit.craftbukkit.block.CraftBlock");
- private static final Class> craftWorld = Reflection.getClass("org.bukkit.craftbukkit.CraftWorld");
- private static final Class> generatorAccess = Reflection.getClass("net.minecraft.world.level.LevelAccessor");
- private static final Reflection.Method getPosition = Reflection.getTypedMethod(craftBlock, "getPosition", blockPosition);
- private static final Reflection.Method getWorldHandle = Reflection.getTypedMethod(craftWorld, "getHandle", null);
- private static final Reflection.Method at = Reflection.getTypedMethod(craftBlock, "at", craftBlock, generatorAccess, blockPosition);
-
- private static final Class> openSign = Reflection.getClass("net.minecraft.network.protocol.game.ClientboundOpenSignEditorPacket");
- private static final Reflection.Field> blockPositionFieldAccessor = Reflection.getField(openSign, blockPosition, 0);
-
- private static final Class> updateSign = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundSignUpdatePacket");
- private static final Reflection.Field> getBlockPositionFieldAccessor = Reflection.getField(updateSign, blockPosition, 0);
- private static final Reflection.Field stringFieldAccessor = Reflection.getField(updateSign, String[].class, 0);
-
- @EventHandler
- public void editSign(PlayerInteractEvent event) {
- if (!event.getPlayer().isSneaking()) return;
- if (event.getClickedBlock() == null || !event.getClickedBlock().getType().name().contains("SIGN")) return;
-
- if (event.getAction() == Action.RIGHT_CLICK_BLOCK && (event.getItem() == null || event.getItem().getType() == Material.AIR) || event.getAction() == Action.LEFT_CLICK_BLOCK) {
- event.setCancelled(true);
- Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
- edit(event.getPlayer(), event.getClickedBlock());
- }, 1);
- }
- }
-
- private void edit(Player player, Block block) {
- if (!Permission.BUILD.hasPermission(player)) return;
- Sign sign = (org.bukkit.block.Sign) block.getState();
- String[] lines = sign.getLines();
- for (int i = 0; i < lines.length; i++) {
- sign.setLine(i, lines[i].replace('ยง', '&'));
- }
- sign.update(true);
-
- Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
- Object openSignObject = Reflection.newInstance(openSign);
- blockPositionFieldAccessor.set(openSignObject, getPosition.invoke(block));
- TinyProtocol.instance.sendPacket(player, openSignObject);
- }, 1);
- }
-
- {
- TinyProtocol.instance.addFilter(updateSign, (player, o) -> {
- Bukkit.getScheduler().runTask(BauSystem.getInstance(), () -> {
- String[] lines = stringFieldAccessor.get(o);
-
- Block signLoc = (Block) at.invoke(null, getWorldHandle.invoke(player.getWorld()), getBlockPositionFieldAccessor.get(o));
- if (!signLoc.getType().name().contains("SIGN"))
- return;
-
- org.bukkit.block.Sign sign = ((Sign) signLoc.getState());
- for (int i = 0; i < lines.length; i++) {
- sign.setLine(i, ChatColor.translateAlternateColorCodes('&', lines[i]));
- }
- sign.update();
- });
- return o;
- });
- }
-}
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/xray/XrayCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/xray/XrayCommand.java
index b128e27a..401f6066 100644
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/xray/XrayCommand.java
+++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/xray/XrayCommand.java
@@ -20,7 +20,6 @@
package de.steamwar.bausystem.features.xray;
import com.comphenix.tinyprotocol.TinyProtocol;
-import de.steamwar.Reflection;
import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.features.techhider.TechHiderCommand;
import de.steamwar.bausystem.region.Region;
@@ -32,6 +31,7 @@ import de.steamwar.linkage.Linked;
import de.steamwar.linkage.LinkedInstance;
import de.steamwar.techhider.TechHider;
import net.md_5.bungee.api.ChatMessageType;
+import net.minecraft.network.protocol.game.ServerboundMovePlayerPacket;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
@@ -95,9 +95,6 @@ public class XrayCommand extends SWCommand implements Listener, ScoreboardElemen
});
}
- private static final Class> position = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundMovePlayerPacket$Pos");
- private static final Class> positionLook = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundMovePlayerPacket$PosRot");
-
{
BiFunction positionSetter = (player, o) -> {
Region region = Region.getRegion(player.getLocation());
@@ -110,8 +107,8 @@ public class XrayCommand extends SWCommand implements Listener, ScoreboardElemen
return o;
};
- TinyProtocol.instance.addFilter(position, positionSetter);
- TinyProtocol.instance.addFilter(positionLook, positionSetter);
+ TinyProtocol.instance.addFilter(ServerboundMovePlayerPacket.Pos.class, positionSetter);
+ TinyProtocol.instance.addFilter(ServerboundMovePlayerPacket.PosRot.class, positionSetter);
}
@EventHandler
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/FlatteningWrapper.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/FlatteningWrapper.java
index 412e505c..aae50e3d 100644
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/FlatteningWrapper.java
+++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/FlatteningWrapper.java
@@ -20,34 +20,211 @@
package de.steamwar.bausystem.utils;
import com.sk89q.worldedit.EditSession;
+import com.sk89q.worldedit.WorldEdit;
+import com.sk89q.worldedit.WorldEditException;
+import com.sk89q.worldedit.bukkit.BukkitWorld;
+import com.sk89q.worldedit.bukkit.WorldEditPlugin;
+import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
-import de.steamwar.bausystem.BauSystem;
+import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat;
+import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats;
+import com.sk89q.worldedit.extent.clipboard.io.ClipboardReader;
+import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter;
+import com.sk89q.worldedit.function.mask.Mask;
+import com.sk89q.worldedit.function.mask.Mask2D;
+import com.sk89q.worldedit.function.operation.ForwardExtentCopy;
+import com.sk89q.worldedit.function.operation.Operations;
+import com.sk89q.worldedit.math.BlockVector3;
+import com.sk89q.worldedit.math.transform.AffineTransform;
+import com.sk89q.worldedit.regions.CuboidRegion;
+import com.sk89q.worldedit.regions.Region;
+import com.sk89q.worldedit.regions.selector.CuboidRegionSelector;
+import com.sk89q.worldedit.session.ClipboardHolder;
+import com.sk89q.worldedit.world.block.BaseBlock;
+import com.sk89q.worldedit.world.block.BlockTypes;
import de.steamwar.bausystem.region.Point;
-import de.steamwar.core.VersionDependent;
+import org.bukkit.Bukkit;
import org.bukkit.Material;
-import org.bukkit.World;
+import org.bukkit.block.Block;
+import org.bukkit.block.data.BlockData;
+import org.bukkit.block.data.Waterlogged;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.util.Vector;
+import javax.annotation.Nullable;
import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.BiPredicate;
+import java.util.logging.Level;
-public interface FlatteningWrapper {
- FlatteningWrapper impl = VersionDependent.getVersionImpl(BauSystem.getInstance());
+public class FlatteningWrapper {
+ public static final FlatteningWrapper impl = new FlatteningWrapper();
- boolean isNoBook(ItemStack item);
+ public boolean isNoBook(ItemStack item) {
+ return item.getType() != Material.WRITABLE_BOOK && item.getType() != Material.WRITTEN_BOOK;
+ }
- boolean isUnpusheable(Material material);
- boolean isBreakingOnPush(Material material);
+ private static final Set unpushable = new HashSet<>(Arrays.asList(Material.BARRIER, Material.BEACON, Material.COMMAND_BLOCK, Material.CHAIN_COMMAND_BLOCK, Material.REPEATING_COMMAND_BLOCK, Material.ENCHANTING_TABLE, Material.END_GATEWAY, Material.END_PORTAL, Material.ENDER_CHEST, Material.GRINDSTONE, Material.JIGSAW, Material.JUKEBOX, Material.NETHER_PORTAL, Material.OBSIDIAN, Material.STRUCTURE_VOID, Material.BARREL, Material.BEEHIVE, Material.BEE_NEST, Material.BLAST_FURNACE, Material.BREWING_STAND, Material.CHEST, Material.DAYLIGHT_DETECTOR, Material.DISPENSER, Material.DROPPER, Material.FURNACE, Material.HOPPER, Material.LECTERN, Material.SMOKER, Material.TRAPPED_CHEST));
- boolean isWorldEditCommand(String command);
- void setSelection(Player p, Point minPoint, Point maxPoint);
+ // TODO: FLOWER
+ private static final Set breaking = new HashSet<>(Arrays.asList(Material.BAMBOO, Material.CACTUS, Material.CAKE, Material.CARVED_PUMPKIN, Material.CHORUS_FLOWER, Material.CHORUS_PLANT, Material.COBWEB, Material.COCOA, Material.DRAGON_EGG, Material.FIRE, Material.FLOWER_POT, Material.JACK_O_LANTERN, Material.LADDER, Material.LAVA, Material.LAVA, Material.LEVER, Material.LILY_PAD, Material.MELON, Material.NETHER_WART, Material.PUMPKIN, Material.COMPARATOR, Material.REDSTONE_WIRE, Material.REPEATER, Material.TORCH, Material.STRUCTURE_VOID, Material.SCAFFOLDING, Material.SEA_PICKLE, Material.SNOW, Material.SUGAR_CANE, Material.TORCH, Material.TRIPWIRE, Material.TRIPWIRE_HOOK, Material.TURTLE_EGG, Material.VINE, Material.WATER, Material.WHEAT));
- Clipboard loadSchematic(File file);
- EditSession paste(PasteBuilder pasteBuilder);
+ public boolean isUnpusheable(Material material) {
+ if (unpushable.contains(material)) {
+ return true;
+ }
+ String name = material.name();
+ return name.contains("BANNER") || name.contains("SIGN");
+ }
- Clipboard copy(Point minPoint, Point maxPoint, Point copyPoint);
- boolean backup(Point minPoint, Point maxPoint, File file);
+ public boolean isBreakingOnPush(Material material) {
+ if (breaking.contains(material)) {
+ return true;
+ }
+ String name = material.name();
+ return name.contains("BED") || name.contains("BUTTON") || name.contains("CARPET") || (name.contains("DOOR") && !name.contains("TRAPDOOR")) || name.contains("HEAD") || name.contains("LEAVES") || name.contains("MUSHROOM") || name.contains("PRESSURE_PLATE") || name.contains("SHULKER_BOX");
+ }
- boolean inWater(World world, Vector tntPosition);
+ public boolean isWorldEditCommand(String command) {
+ if (command.startsWith("/")) {
+ command = command.replaceFirst("/", "");
+ }
+ command = command.toLowerCase();
+ return WorldEdit.getInstance().getPlatformManager().getPlatformCommandManager().getCommandManager().containsCommand(command);
+ }
+
+ private static final WorldEditPlugin WORLDEDIT_PLUGIN = Objects.requireNonNull((WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit"));
+ private static final BukkitWorld BUKKITWORLD = new BukkitWorld(Bukkit.getWorlds().get(0));
+
+ public void setSelection(Player p, Point minPoint, Point maxPoint) {
+ WORLDEDIT_PLUGIN.getSession(p).setRegionSelector(BUKKITWORLD, new CuboidRegionSelector(BUKKITWORLD, minPoint.toBlockVector3(), maxPoint.toBlockVector3()));
+ }
+
+ public Clipboard loadSchematic(File file) {
+ Clipboard clipboard;
+ try (ClipboardReader reader = Objects.requireNonNull(ClipboardFormats.findByFile(file)).getReader(new FileInputStream(file))) {
+ clipboard = reader.read();
+ } catch (NullPointerException | IOException e) {
+ throw new SecurityException("Bausystem schematic not found", e);
+ }
+ return clipboard;
+ }
+
+ public EditSession paste(PasteBuilder pasteBuilder) {
+ try (EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(new BukkitWorld(Bukkit.getWorlds().get(0)), -1)) {
+ Clipboard clipboard = pasteBuilder.getClipboard();
+
+ if (!pasteBuilder.getMappers().isEmpty()) {
+ BlockVector3 minimum = clipboard.getRegion().getMinimumPoint();
+ for (int x = 0; x < clipboard.getDimensions().getX(); x++) {
+ for (int y = 0; y < clipboard.getDimensions().getY(); y++) {
+ for (int z = 0; z < clipboard.getDimensions().getZ(); z++) {
+ BlockVector3 pos = minimum.add(x, y, z);
+ pasteBuilder.getMappers().forEach(mapper -> mapper.accept(clipboard, pos));
+ }
+ }
+ }
+ }
+
+ AtomicReference pastePoint = new AtomicReference<>();
+ if (!pasteBuilder.getPredicates().isEmpty()) {
+ e.setMask(new Mask() {
+ @Override
+ public boolean test(BlockVector3 blockVector3) {
+ BaseBlock block = clipboard.getFullBlock(blockVector3.subtract(pastePoint.get()).add(clipboard.getRegion().getMinimumPoint()));
+ String blockName = block.getBlockType().toString().toLowerCase();
+ for (BiPredicate predicate : pasteBuilder.getPredicates()) {
+ if (!predicate.test(block, blockName)) return false;
+ }
+ return true;
+ }
+
+ public Mask copy() {
+ return this;
+ }
+
+ @Nullable
+ @Override
+ public Mask2D toMask2D() {
+ return null;
+ }
+ });
+ }
+
+ ClipboardHolder ch = new ClipboardHolder(clipboard);
+ BlockVector3 dimensions = clipboard.getDimensions();
+ BlockVector3 v = BlockVector3.at(pasteBuilder.getPastPoint().getX(), pasteBuilder.getPastPoint().getY(), pasteBuilder.getPastPoint().getZ());
+ BlockVector3 offset = clipboard.getRegion().getMinimumPoint().subtract(clipboard.getOrigin());
+ if (pasteBuilder.isRotate()) {
+ ch.setTransform(new AffineTransform().rotateY(180));
+ v = v.add(dimensions.getX() / 2, 0, dimensions.getZ() / 2).subtract(offset.multiply(-1, 1, -1)).subtract(0, 0, 1);
+ } else {
+ v = v.subtract(dimensions.getX() / 2, 0, dimensions.getZ() / 2).subtract(offset);
+ }
+ pastePoint.set(v);
+
+ if (pasteBuilder.isReset()) {
+ e.setBlocks((Region) new CuboidRegion(pasteBuilder.getMinPoint().toBlockVector3(), pasteBuilder.getMaxPoint().toBlockVector3()), Objects.requireNonNull(BlockTypes.AIR).getDefaultState().toBaseBlock());
+ if (pasteBuilder.getWaterLevel() != 0) {
+ e.setBlocks((Region) new CuboidRegion(pasteBuilder.getMinPoint().toBlockVector3(), pasteBuilder.getMaxPoint().toBlockVector3().withY(pasteBuilder.getWaterLevel())), Objects.requireNonNull(BlockTypes.WATER).getDefaultState().toBaseBlock());
+ }
+ }
+ Operations.completeBlindly(ch.createPaste(e).to(v).ignoreAirBlocks(pasteBuilder.isIgnoreAir()).build());
+ return e;
+ } catch (WorldEditException e) {
+ throw new SecurityException(e.getMessage(), e);
+ }
+ }
+
+ public Clipboard copy(Point minPoint, Point maxPoint, Point copyPoint) {
+ BukkitWorld bukkitWorld = new BukkitWorld(Bukkit.getWorlds().get(0));
+ CuboidRegion region = new CuboidRegion(bukkitWorld, minPoint.toBlockVector3(), maxPoint.toBlockVector3());
+ BlockArrayClipboard clipboard = new BlockArrayClipboard(region);
+ try (EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(bukkitWorld, -1)) {
+ ForwardExtentCopy copy = new ForwardExtentCopy(
+ e, region, clipboard, region.getMinimumPoint()
+ );
+
+ copy.setCopyingEntities(false);
+ copy.setCopyingBiomes(false);
+
+ Operations.complete(copy);
+ clipboard.setOrigin(copyPoint.toBlockVector3());
+ return clipboard;
+ } catch (WorldEditException e) {
+ Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
+ return null;
+ }
+ }
+
+ public boolean backup(Point minPoint, Point maxPoint, File file) {
+ Clipboard clipboard = copy(minPoint, maxPoint, minPoint);
+ try (ClipboardWriter writer = BuiltInClipboardFormat.SPONGE_SCHEMATIC.getWriter(new FileOutputStream(file))) {
+ writer.write(clipboard);
+ return true;
+ } catch (IOException e) {
+ Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
+ return false;
+ }
+ }
+
+ public boolean inWater(org.bukkit.World world, Vector tntPosition) {
+ Block block = world.getBlockAt(tntPosition.getBlockX(), tntPosition.getBlockY(), tntPosition.getBlockZ());
+ if (block.getType() == Material.WATER)
+ return true;
+
+ BlockData data = block.getBlockData();
+ if (!(data instanceof Waterlogged))
+ return false;
+
+ return ((Waterlogged) data).isWaterlogged();
+ }
}
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/NMSWrapper.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/NMSWrapper.java
index 2e69eb49..7141ff96 100644
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/NMSWrapper.java
+++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/NMSWrapper.java
@@ -19,25 +19,99 @@
package de.steamwar.bausystem.utils;
-import de.steamwar.bausystem.BauSystem;
-import de.steamwar.core.VersionDependent;
+import de.steamwar.Reflection;
+import io.papermc.paper.datacomponent.DataComponentTypes;
+import io.papermc.paper.datacomponent.item.ItemContainerContents;
+import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket;
+import net.minecraft.network.protocol.game.ClientboundExplodePacket;
+import net.minecraft.server.level.ServerPlayerGameMode;
+import net.minecraft.world.entity.player.Abilities;
+import net.minecraft.world.level.GameType;
import org.bukkit.GameMode;
import org.bukkit.Material;
+import org.bukkit.craftbukkit.entity.CraftPlayer;
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
-public interface NMSWrapper {
- NMSWrapper impl = VersionDependent.getVersionImpl(BauSystem.getInstance());
+import java.util.List;
+import java.util.Optional;
- void setInternalGameMode(Player player, GameMode gameMode);
- void setSlotToItemStack(Player player, Object o);
+public class NMSWrapper {
+ public static final NMSWrapper impl = new NMSWrapper();
- void setGameStateChangeReason(Object packet);
- void setPlayerBuildAbilities(Player player);
+ private static final Reflection.Field playerGameMode = Reflection.getField(ServerPlayerGameMode.class, GameType.class, 0);
- Material pathMaterial();
+ public void setInternalGameMode(Player player, GameMode gameMode) {
+ playerGameMode.set(((CraftPlayer) player).getHandle().gameMode, GameType.byId(gameMode.getValue()));
+ }
- boolean checkItemStack(ItemStack item);
+ public void setSlotToItemStack(Player player, Object o) {
+ ClientboundContainerSetSlotPacket packetPlayInSetCreativeSlot = (ClientboundContainerSetSlotPacket) o;
+ int index = packetPlayInSetCreativeSlot.getSlot();
+ if (index >= 36 && index <= 44) {
+ index -= 36;
+ } else if (index > 44) {
+ index -= 5;
+ } else if (index <= 8) {
+ index = index - 8 + 36;
+ }
+ player.getInventory().setItem(index, CraftItemStack.asBukkitCopy(packetPlayInSetCreativeSlot.getItem()));
+ if (index < 9) player.getInventory().setHeldItemSlot(index);
+ player.updateInventory();
+ }
- Object resetExplosionKnockback(Object packet);
+ public void setPlayerBuildAbilities(Player player) {
+ Abilities abilities = (((CraftPlayer) player).getHandle()).getAbilities();
+ abilities.mayBuild = true;
+ abilities.mayfly = true;
+ }
+
+ public Material pathMaterial() {
+ return Material.DIRT_PATH;
+ }
+
+ private static final int threshold = 2048;
+
+ public boolean checkItemStack(ItemStack item) {
+ ItemContainerContents data = item.getData(DataComponentTypes.CONTAINER);
+ if (data == null) {
+ return false;
+ }
+
+ return drillDown(data.contents(), 0, 0) > threshold;
+ }
+
+ private int drillDown(List items, int layer, int start) {
+ if (layer > 2) return start + threshold;
+ int invalid = start;
+ for (int i = start; i < items.size(); i++) {
+ ItemStack item = items.get(i);
+ if (item.isEmpty()) continue;
+
+ invalid += item.getAmount();
+
+ ItemContainerContents data = item.getData(DataComponentTypes.CONTAINER);
+ if (data == null) {
+ continue;
+ }
+
+ List subItems = data.contents();
+ if (subItems.size() > 1) {
+ invalid = drillDown(subItems, layer + 1, invalid);
+ }
+ }
+ return invalid;
+ }
+
+ public Object resetExplosionKnockback(Object packet) {
+ ClientboundExplodePacket explosion = (ClientboundExplodePacket) packet;
+
+ return new ClientboundExplodePacket(
+ explosion.center(),
+ Optional.empty(),
+ explosion.explosionParticle(),
+ explosion.explosionSound()
+ );
+ }
}
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/PlaceItemUtils.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/PlaceItemUtils.java
index 4e7c8f12..c4ab9a54 100644
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/PlaceItemUtils.java
+++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/PlaceItemUtils.java
@@ -23,11 +23,15 @@ import de.steamwar.Reflection;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.experimental.UtilityClass;
+import net.minecraft.core.BlockPos;
import org.bukkit.*;
import org.bukkit.block.*;
+import org.bukkit.block.Skull;
import org.bukkit.block.data.*;
-import org.bukkit.block.data.type.Hopper;
import org.bukkit.block.data.type.*;
+import org.bukkit.block.data.type.Hopper;
+import org.bukkit.craftbukkit.CraftWorld;
+import org.bukkit.craftbukkit.block.CraftBlockState;
import org.bukkit.entity.Player;
import org.bukkit.event.block.BlockCanBuildEvent;
import org.bukkit.event.block.BlockPlaceEvent;
@@ -82,27 +86,23 @@ public class PlaceItemUtils {
.collect(Collectors.toSet());
}
- private static final Class> blockPosition = Reflection.getClass("net.minecraft.core.BlockPos");
- private static final Reflection.Constructor blockPositionConstructor = Reflection.getConstructor(blockPosition, int.class, int.class, int.class);
- private static final Class> craftBlock = Reflection.getClass("org.bukkit.craftbukkit.block.CraftBlockState");
- private static final Class> craftWorld = Reflection.getClass("org.bukkit.craftbukkit.CraftWorld");
- private static final Reflection.Field> positionAccessor = Reflection.getField(craftBlock, blockPosition, 0);
- private static final Reflection.Field> worldAccessor = Reflection.getField(craftBlock, craftWorld, 0);
+ private static final Reflection.Field> positionAccessor = Reflection.getField(CraftBlockState.class, BlockPos.class, 0);
+ private static final Reflection.Field> worldAccessor = Reflection.getField(CraftBlockState.class, CraftWorld.class, 0);
/**
* Attempt to place an {@link ItemStack} the {@link Player} is holding against a {@link Block} inside the World.
* This can be easily used inside the {@link org.bukkit.event.player.PlayerInteractEvent} to mimik placing a
* block without any minecraft related GUI's etc. executing.
*
- * @param player the Player placing the block
- * @param itemStack the ItemStack to be placed
- * @param against the Block at which the player aims (does not need to be in range of the player)
- * @param againstSide the BlockFace the player aims
- * @param hand the Hand the player is using
- * @param force allow illegal states to be created by placing the block
+ * @param player the Player placing the block
+ * @param itemStack the ItemStack to be placed
+ * @param against the Block at which the player aims (does not need to be in range of the player)
+ * @param againstSide the BlockFace the player aims
+ * @param hand the Hand the player is using
+ * @param force allow illegal states to be created by placing the block
* @param applyPhysics apply physics while placing the block
- * @param rotateAway rotate everything in the opposite direction, so a block facing the Player will face away, and the other way round
- * @param playSound enables sound of placing
+ * @param rotateAway rotate everything in the opposite direction, so a block facing the Player will face away, and the other way round
+ * @param playSound enables sound of placing
*/
public PlaceItemResult placeItem(Player player, ItemStack itemStack, Block against, BlockFace againstSide, EquipmentSlot hand, boolean force, boolean applyPhysics, boolean rotateAway, boolean playSound) {
// If the ItemStack is null or air we cannot place it
@@ -288,7 +288,7 @@ public class PlaceItemUtils {
} else {
// If a BlockState is present set the Position and World to the Block you want to place
Location blockLocation = block.getLocation();
- positionAccessor.set(blockState, blockPositionConstructor.invoke(blockLocation.getBlockX(), blockLocation.getBlockY(), blockLocation.getBlockZ()));
+ positionAccessor.set(blockState, new BlockPos(blockLocation.getBlockX(), blockLocation.getBlockY(), blockLocation.getBlockZ()));
worldAccessor.set(blockState, blockLocation.getWorld());
}
@@ -300,7 +300,7 @@ public class PlaceItemUtils {
Location blockmin = block.getLocation();
Location blockmax = block.getLocation().add(1.0, 1.0, 1.0);
if (
- !(max.getX() <= blockmin.getX() || min.getX() >= blockmax.getX() ||
+ !(max.getX() <= blockmin.getX() || min.getX() >= blockmax.getX() ||
max.getY() <= blockmin.getY() || min.getY() >= blockmax.getY() ||
max.getZ() <= blockmin.getZ() || min.getZ() >= blockmax.getZ())
) {
@@ -369,8 +369,8 @@ public class PlaceItemUtils {
return usedForcePlace.get() ? PlaceItemResult.SUCCESS_FORCE : PlaceItemResult.SUCCESS;
}
- public BlockFace[] axis = { BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST };
- public BlockFace[] radial = { BlockFace.NORTH, BlockFace.NORTH_EAST, BlockFace.EAST, BlockFace.SOUTH_EAST, BlockFace.SOUTH, BlockFace.SOUTH_WEST, BlockFace.WEST, BlockFace.NORTH_WEST };
+ public BlockFace[] axis = {BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST};
+ public BlockFace[] radial = {BlockFace.NORTH, BlockFace.NORTH_EAST, BlockFace.EAST, BlockFace.SOUTH_EAST, BlockFace.SOUTH, BlockFace.SOUTH_WEST, BlockFace.WEST, BlockFace.NORTH_WEST};
public BlockFace yawToFace(float yaw) {
return radial[Math.round(yaw / 45f) & 0x7];
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/PlaceItemWrapper.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/PlaceItemWrapper.java
index a913cd15..101c5db1 100644
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/PlaceItemWrapper.java
+++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/PlaceItemWrapper.java
@@ -19,16 +19,32 @@
package de.steamwar.bausystem.utils;
-import de.steamwar.bausystem.BauSystem;
-import de.steamwar.core.VersionDependent;
+import lombok.experimental.UtilityClass;
import org.bukkit.Material;
+import org.bukkit.block.data.BlockData;
import java.util.HashMap;
import java.util.Map;
-public interface PlaceItemWrapper {
- Map ITEM_MATERIAL_TO_BLOCK_MATERIAL = new HashMap<>();
- Map BLOCK_MATERIAL_TO_WALL_BLOCK_MATERIAL = new HashMap<>();
+@UtilityClass
+public class PlaceItemWrapper {
+ public static final Map ITEM_MATERIAL_TO_BLOCK_MATERIAL = new HashMap<>();
+ public static final Map BLOCK_MATERIAL_TO_WALL_BLOCK_MATERIAL = new HashMap<>();
- PlaceItemWrapper impl = VersionDependent.getVersionImpl(BauSystem.getInstance());
+ static {
+ for (Material material : Material.values()) {
+ if (!material.isBlock()) continue;
+ if (material.isLegacy()) continue;
+ BlockData blockData = material.createBlockData();
+ Material placementMaterial = blockData.getPlacementMaterial();
+ if (material == placementMaterial) continue;
+ if (placementMaterial == Material.AIR) continue;
+ if (placementMaterial.isItem() && !placementMaterial.isBlock()) {
+ ITEM_MATERIAL_TO_BLOCK_MATERIAL.put(placementMaterial, material);
+ }
+ if (material.name().contains("WALL")) {
+ BLOCK_MATERIAL_TO_WALL_BLOCK_MATERIAL.put(placementMaterial, material);
+ }
+ }
+ }
}
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/PlayerMovementWrapper.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/PlayerMovementWrapper.java
index 79c52f0c..5922594a 100644
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/PlayerMovementWrapper.java
+++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/PlayerMovementWrapper.java
@@ -20,19 +20,33 @@
package de.steamwar.bausystem.utils;
import de.steamwar.Reflection;
-import de.steamwar.bausystem.BauSystem;
import de.steamwar.core.BountifulWrapper;
-import de.steamwar.core.VersionDependent;
import de.steamwar.entity.REntity;
+import net.minecraft.network.protocol.game.ServerboundMovePlayerPacket;
+import net.minecraft.server.level.ServerPlayer;
+import org.bukkit.craftbukkit.entity.CraftPlayer;
import org.bukkit.entity.Player;
-public interface PlayerMovementWrapper {
+public class PlayerMovementWrapper {
Class> teleportPacket = REntity.teleportPacket;
Reflection.Field teleportEntity = REntity.teleportEntity;
BountifulWrapper.PositionSetter teleportPosition = REntity.teleportPosition;
- PlayerMovementWrapper impl = VersionDependent.getVersionImpl(BauSystem.getInstance());
+ public static final PlayerMovementWrapper impl = new PlayerMovementWrapper();
- void setPosition(Player player, Object object);
- Object convertToOut(Player player, Object object);
+ public void setPosition(Player player, Object object) {
+ ServerboundMovePlayerPacket packetPlayInFlying = ((ServerboundMovePlayerPacket) object);
+ ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle();
+ if (packetPlayInFlying.hasPos) {
+ serverPlayer.setPosRaw(packetPlayInFlying.x, packetPlayInFlying.y, packetPlayInFlying.z);
+ }
+ if (packetPlayInFlying.hasRot) {
+ serverPlayer.setXRot(packetPlayInFlying.xRot);
+ serverPlayer.setYRot(packetPlayInFlying.yRot);
+ }
+ }
+
+ public Object convertToOut(Player player, Object object) {
+ return object;
+ }
}
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/TickListener.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/TickListener.java
deleted file mode 100644
index a300b0ca..00000000
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/TickListener.java
+++ /dev/null
@@ -1,31 +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.utils;
-
-import de.steamwar.bausystem.BauSystem;
-import de.steamwar.core.VersionDependent;
-
-public interface TickListener {
-
- TickListener impl = VersionDependent.getVersionImpl(BauSystem.getInstance());
-
- default void init() {
- }
-}
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/TickManager.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/TickManager.java
index 6570a03f..086999e3 100644
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/TickManager.java
+++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/TickManager.java
@@ -19,28 +19,119 @@
package de.steamwar.bausystem.utils;
+import com.comphenix.tinyprotocol.TinyProtocol;
+import de.steamwar.Reflection;
import de.steamwar.bausystem.BauSystem;
-import de.steamwar.core.VersionDependent;
+import net.minecraft.network.protocol.game.ClientboundTickingStatePacket;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.ServerTickRateManager;
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
-public interface TickManager extends Listener {
- TickManager impl = VersionDependent.getVersionImpl(BauSystem.getInstance());
+public class TickManager implements Listener {
+ public static final TickManager impl = new TickManager();
- void setTickRate(float tickRate);
- float getTickRate();
+ private static final ServerTickRateManager manager = MinecraftServer.getServer().tickRateManager();
+ private static final Reflection.Field remainingSprintTicks = Reflection.getField(ServerTickRateManager.class, long.class, 0);
- boolean canFreeze();
- void setFreeze(boolean freeze);
- boolean isFrozen();
+ private boolean blockTpsPacket = true;
+ private int totalSteps;
- void stepTicks(int ticks);
- boolean isStepping();
+ private TickManager() {
+ TinyProtocol.instance.addFilter(ClientboundTickingStatePacket.class, this::blockPacket);
+ }
- void sprintTicks(int ticks);
- boolean isSprinting();
+ private Object blockPacket(Player player, Object packet) {
+ if (blockTpsPacket) {
+ return new ClientboundTickingStatePacket(20, manager.isFrozen());
+ } else {
+ return packet;
+ }
+ }
- void setBlockTpsPacket(boolean block);
- long getRemainingTicks();
- long getDoneTicks();
- long getTotalTicks();
+ public boolean canFreeze() {
+ return true;
+ }
+
+ public void setBlockTpsPacket(boolean block) {
+ blockTpsPacket = block;
+ if (blockTpsPacket) {
+ ClientboundTickingStatePacket packet = new ClientboundTickingStatePacket(20, manager.isFrozen());
+ Bukkit.getOnlinePlayers().forEach(player -> TinyProtocol.instance.sendPacket(player, packet));
+ } else {
+ ClientboundTickingStatePacket packet = new ClientboundTickingStatePacket(manager.tickrate(), manager.isFrozen());
+ Bukkit.getOnlinePlayers().forEach(player -> TinyProtocol.instance.sendPacket(player, packet));
+ }
+ }
+
+ public void setTickRate(float tickRate) {
+ if (isFrozen()) {
+ setFreeze(false);
+ }
+ manager.setTickRate(tickRate);
+ }
+
+ public boolean isFrozen() {
+ return manager.isFrozen();
+ }
+
+ public void setFreeze(boolean freeze) {
+ manager.setFrozen(freeze);
+ }
+
+ public void stepTicks(int ticks) {
+ if (manager.isSprinting()) {
+ manager.stopSprinting();
+ } else if (manager.isSteppingForward()) {
+ manager.stopStepping();
+ }
+ this.totalSteps = ticks;
+ manager.setFrozen(true);
+ manager.stepGameIfPaused(ticks);
+ manager.setFrozen(false);
+ Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), (bukkitTask) -> {
+ if (manager.isSteppingForward()) return;
+ manager.setFrozen(true);
+ bukkitTask.cancel();
+ }, 1, 1);
+ }
+
+ public void sprintTicks(int ticks) {
+ if (manager.isSteppingForward()) {
+ manager.stopStepping();
+ } else if (manager.isSprinting()) {
+ manager.stopSprinting();
+ }
+ this.totalSteps = ticks;
+ manager.requestGameToSprint(ticks, true);
+ }
+
+ public boolean isSprinting() {
+ return manager.isSprinting();
+ }
+
+ public boolean isStepping() {
+ return manager.isSteppingForward();
+ }
+
+ public float getTickRate() {
+ return manager.tickrate();
+ }
+
+ public long getRemainingTicks() {
+ if (isSprinting()) {
+ return remainingSprintTicks.get(manager);
+ } else {
+ return manager.frozenTicksToRun();
+ }
+ }
+
+ public long getDoneTicks() {
+ return totalSteps - getRemainingTicks();
+ }
+
+ public long getTotalTicks() {
+ return totalSteps;
+ }
}
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/WorldEditUtils.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/WorldEditUtils.java
index 078a32fd..0bab1548 100644
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/WorldEditUtils.java
+++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/WorldEditUtils.java
@@ -19,7 +19,6 @@
package de.steamwar.bausystem.utils;
-import de.steamwar.Reflection;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.IncompleteRegionException;
import com.sk89q.worldedit.LocalSession;
@@ -34,6 +33,7 @@ import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.regions.RegionSelector;
import com.sk89q.worldedit.regions.selector.limit.SelectorLimits;
+import de.steamwar.Reflection;
import de.steamwar.bausystem.shared.Pair;
import lombok.SneakyThrows;
import lombok.experimental.UtilityClass;
diff --git a/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/loader/RegionLoader.java b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/loader/RegionLoader.java
index c01edbdf..3bfe538d 100644
--- a/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/loader/RegionLoader.java
+++ b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/loader/RegionLoader.java
@@ -19,8 +19,8 @@
package de.steamwar.bausystem.region.fixed.loader;
-import de.steamwar.bausystem.region.fixed.FixedGlobalRegionData;
import de.steamwar.bausystem.region.fixed.FixedGlobalRegion;
+import de.steamwar.bausystem.region.fixed.FixedGlobalRegionData;
import de.steamwar.bausystem.region.fixed.Prototype;
import de.steamwar.bausystem.worlddata.WorldData;
import lombok.experimental.UtilityClass;
diff --git a/BauSystem/build.gradle.kts b/BauSystem/build.gradle.kts
index df33b12e..574ee012 100644
--- a/BauSystem/build.gradle.kts
+++ b/BauSystem/build.gradle.kts
@@ -29,11 +29,6 @@ tasks.build {
dependencies {
implementation(project(":BauSystem:BauSystem_RegionFixed"))
implementation(project(":BauSystem:BauSystem_Main"))
- implementation(project(":BauSystem:BauSystem_15"))
- implementation(project(":BauSystem:BauSystem_18"))
- implementation(project(":BauSystem:BauSystem_19"))
- implementation(project(":BauSystem:BauSystem_20"))
- implementation(project(":BauSystem:BauSystem_21"))
}
tasks.register("DevBau20") {
diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Recording.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Recording.java
index 15935410..1f23312b 100644
--- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Recording.java
+++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Recording.java
@@ -19,8 +19,8 @@
package de.steamwar.fightsystem.listener;
-import de.steamwar.Reflection;
import com.comphenix.tinyprotocol.TinyProtocol;
+import de.steamwar.Reflection;
import de.steamwar.core.TrickyTrialsWrapper;
import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.FightSystem;
diff --git a/SpigotCore/SpigotCore_Main/src/com/comphenix/tinyprotocol/TinyProtocol.java b/SpigotCore/SpigotCore_Main/src/com/comphenix/tinyprotocol/TinyProtocol.java
index cb4aca06..8140400c 100644
--- a/SpigotCore/SpigotCore_Main/src/com/comphenix/tinyprotocol/TinyProtocol.java
+++ b/SpigotCore/SpigotCore_Main/src/com/comphenix/tinyprotocol/TinyProtocol.java
@@ -22,7 +22,10 @@ package com.comphenix.tinyprotocol;
import de.steamwar.Reflection;
import de.steamwar.Reflection.Field;
import de.steamwar.core.Core;
-import io.netty.channel.*;
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelDuplexHandler;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelPromise;
import lombok.Getter;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@@ -113,6 +116,10 @@ public class TinyProtocol implements Listener {
}
}
+ public void addTypedFilter(Class packetType, BiFunction filter) {
+ packetFilters.computeIfAbsent(packetType, c -> new CopyOnWriteArrayList<>()).add((BiFunction) filter);
+ }
+
public void addFilter(Class> packetType, BiFunction filter) {
packetFilters.computeIfAbsent(packetType, c -> new CopyOnWriteArrayList<>()).add(filter);
}
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 351c4343..00277c17 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -19,7 +19,7 @@
import org.apache.tools.ant.taskdefs.condition.Os
import java.net.URI
-import java.util.Properties
+import java.util.*
rootProject.name = "SteamWar"
@@ -172,11 +172,6 @@ dependencyResolutionManagement {
include(
"BauSystem",
- "BauSystem:BauSystem_15",
- "BauSystem:BauSystem_18",
- "BauSystem:BauSystem_19",
- "BauSystem:BauSystem_20",
- "BauSystem:BauSystem_21",
"BauSystem:BauSystem_Main",
"BauSystem:BauSystem_RegionFixed"
)