From e7803dcf822a070734cffc0f134019c7e18326e8 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Thu, 31 Jul 2025 11:34:56 +0200 Subject: [PATCH] Enhance compatibility and feature support for Minecraft 1.21: Add ProtocolWrapper21, update gamerule management, streamline entity tracking, and refine chunk hider logic. --- .../features/techhider/TechHiderCommand.java | 4 +- .../utils/CraftbukkitWrapper10.java | 3 + .../utils/CraftbukkitWrapper12.java | 3 + .../utils/CraftbukkitWrapper14.java | 3 + .../utils/CraftbukkitWrapper15.java | 3 + .../utils/CraftbukkitWrapper18.java | 3 + FightSystem/FightSystem_21/build.gradle.kts | 1 + .../fightsystem/utils/BlockIdWrapper21.java | 36 ++++------ .../utils/CraftbukkitWrapper21.java | 7 ++ .../utils/CraftbukkitWrapper8.java | 3 + .../utils/CraftbukkitWrapper9.java | 3 + .../de/steamwar/fightsystem/FightSystem.java | 2 + .../fightsystem/utils/CraftbukkitWrapper.java | 2 + .../fightsystem/utils/TechHiderWrapper.java | 4 +- .../de/steamwar/core/ProtocolWrapper21.java | 66 +++++++++++++++++++ .../de/steamwar/techhider/ChunkHider21.java | 4 +- .../src/de/steamwar/Reflection.java | 11 +++- .../src/de/steamwar/techhider/ChunkHider.java | 12 ++-- 18 files changed, 135 insertions(+), 35 deletions(-) create mode 100644 SpigotCore/SpigotCore_21/src/de/steamwar/core/ProtocolWrapper21.java diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/techhider/TechHiderCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/techhider/TechHiderCommand.java index 17d3563c..0c1d8af5 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/techhider/TechHiderCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/techhider/TechHiderCommand.java @@ -87,8 +87,8 @@ public class TechHiderCommand extends SWCommand implements Listener, ScoreboardE Set hiddenBlockEntities = Collections.unmodifiableSet(new HashSet<>(config.getStringList("Techhider.HiddenBlockEntities"))); TechHider current = new TechHider((TechHider.LocationEvaluator) (p, cX, cY) -> { - Chunk playerChunk = p.getLocation().getChunk(); - return playerChunk.getX() == cX && playerChunk.getZ() == cY; + if (rg.buildChunkOutside(cX, cY)) return true; + return !hidden.get(rg).contains(p); }, Material.valueOf(obfuscateWith.toUpperCase()), hiddenBlocks.stream().map(String::toUpperCase).map(Material::valueOf).collect(Collectors.toSet()), hiddenBlockEntities); current.enable(); diff --git a/FightSystem/FightSystem_10/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper10.java b/FightSystem/FightSystem_10/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper10.java index 78dd79a5..d5f654ae 100644 --- a/FightSystem/FightSystem_10/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper10.java +++ b/FightSystem/FightSystem_10/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper10.java @@ -55,4 +55,7 @@ public class CraftbukkitWrapper10 implements CraftbukkitWrapper { public Stream entityIterator() { return ((CraftWorld) Config.world).getHandle().entityList.stream(); } + + @Override + public void setupGamerule() { } } diff --git a/FightSystem/FightSystem_12/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper12.java b/FightSystem/FightSystem_12/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper12.java index f8e843bc..a134b9fe 100644 --- a/FightSystem/FightSystem_12/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper12.java +++ b/FightSystem/FightSystem_12/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper12.java @@ -55,4 +55,7 @@ public class CraftbukkitWrapper12 implements CraftbukkitWrapper { public Stream entityIterator() { return ((CraftWorld) Config.world).getHandle().entityList.stream(); } + + @Override + public void setupGamerule() { } } diff --git a/FightSystem/FightSystem_14/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper14.java b/FightSystem/FightSystem_14/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper14.java index 07c525d4..8e2f96ab 100644 --- a/FightSystem/FightSystem_14/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper14.java +++ b/FightSystem/FightSystem_14/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper14.java @@ -56,4 +56,7 @@ public class CraftbukkitWrapper14 implements CraftbukkitWrapper { public Stream entityIterator() { return ((CraftWorld) Config.world).getHandle().entitiesById.values().stream(); } + + @Override + public void setupGamerule() { } } diff --git a/FightSystem/FightSystem_15/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper15.java b/FightSystem/FightSystem_15/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper15.java index 70d9e8c5..64a0f9e1 100644 --- a/FightSystem/FightSystem_15/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper15.java +++ b/FightSystem/FightSystem_15/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper15.java @@ -56,4 +56,7 @@ public class CraftbukkitWrapper15 implements CraftbukkitWrapper { public Stream entityIterator() { return ((CraftWorld) Config.world).getHandle().entitiesById.values().stream(); } + + @Override + public void setupGamerule() { } } diff --git a/FightSystem/FightSystem_18/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper18.java b/FightSystem/FightSystem_18/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper18.java index 8fa8e7de..aafd5c08 100644 --- a/FightSystem/FightSystem_18/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper18.java +++ b/FightSystem/FightSystem_18/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper18.java @@ -62,4 +62,7 @@ public class CraftbukkitWrapper18 implements CraftbukkitWrapper { public Stream entityIterator() { return StreamSupport.stream(((Iterable) getIterable.invoke(getWorldEntities.invoke(getWorld.invoke(Config.world)))).spliterator(), false); } + + @Override + public void setupGamerule() { } } diff --git a/FightSystem/FightSystem_21/build.gradle.kts b/FightSystem/FightSystem_21/build.gradle.kts index 3309134f..2da59fce 100644 --- a/FightSystem/FightSystem_21/build.gradle.kts +++ b/FightSystem/FightSystem_21/build.gradle.kts @@ -41,4 +41,5 @@ dependencies { } compileOnly(libs.fastutil) + compileOnly(libs.authlib) } diff --git a/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/BlockIdWrapper21.java b/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/BlockIdWrapper21.java index 32e2e6e4..105bbe36 100644 --- a/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/BlockIdWrapper21.java +++ b/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/BlockIdWrapper21.java @@ -19,34 +19,24 @@ package de.steamwar.fightsystem.utils; -import de.steamwar.Reflection; -import de.steamwar.fightsystem.Config; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import com.comphenix.tinyprotocol.TinyProtocol; +import com.mojang.authlib.GameProfile; +import de.steamwar.core.ProtocolWrapper; +import de.steamwar.fightsystem.FightSystem; import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ChunkMap; -import net.minecraft.server.level.ServerChunkCache; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.block.state.BlockState; +import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.block.CraftBlockState; -import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; public class BlockIdWrapper21 implements BlockIdWrapper { - static Int2ObjectMap tracker; - - static Reflection.Field chunkMap = Reflection.getField(ServerChunkCache.class, "chunkMap", Object.class); - static { - ServerChunkCache chunkCache = ((CraftWorld) Config.world).getHandle().getChunkSource(); - Object map = chunkMap.get(chunkCache); - Reflection.Field eMapField = Reflection.getField(map.getClass(), "entityMap", Int2ObjectMap.class); - tracker = eMapField.get(map); - } @Override public Material idToMaterial(int blockState) { @@ -71,17 +61,17 @@ public class BlockIdWrapper21 implements BlockIdWrapper { @Override public void trackEntity(Player player, Entity entity) { - ChunkMap.TrackedEntity trackedEntity = tracker.get(entity.getEntityId()); - if (trackedEntity != null) { - trackedEntity.updatePlayer(((CraftPlayer) player).getHandle()); - } + if(entity instanceof Player) + TinyProtocol.instance.sendPacket(player, ProtocolWrapper.impl.playerInfoPacketConstructor(ProtocolWrapper.PlayerInfoAction.REMOVE, new GameProfile(entity.getUniqueId(), entity.getName()), GameMode.CREATIVE)); + + player.showEntity(FightSystem.getPlugin(), entity); } @Override public void untrackEntity(Player player, Entity entity) { - ChunkMap.TrackedEntity trackedEntity = tracker.get(entity.getEntityId()); - if (trackedEntity != null) { - trackedEntity.removePlayer(((CraftPlayer) player).getHandle()); - } + player.hideEntity(FightSystem.getPlugin(), entity); + + if(entity instanceof Player) + TinyProtocol.instance.sendPacket(player, ProtocolWrapper.impl.playerInfoPacketConstructor(ProtocolWrapper.PlayerInfoAction.ADD, new GameProfile(entity.getUniqueId(), entity.getName()), GameMode.CREATIVE)); } } diff --git a/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper21.java b/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper21.java index b5c920a7..68f35171 100644 --- a/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper21.java +++ b/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper21.java @@ -19,6 +19,8 @@ package de.steamwar.fightsystem.utils; +import de.steamwar.fightsystem.Config; +import org.bukkit.GameRule; import org.bukkit.entity.Entity; public class CraftbukkitWrapper21 extends CraftbukkitWrapper18 { @@ -27,4 +29,9 @@ public class CraftbukkitWrapper21 extends CraftbukkitWrapper18 { public float headRotation(Entity e) { return getEntity(e).getYHeadRot(); } + + @Override + public void setupGamerule() { + Config.world.setGameRule(GameRule.LOCATOR_BAR, false); + } } diff --git a/FightSystem/FightSystem_8/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper8.java b/FightSystem/FightSystem_8/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper8.java index 8d743ae7..e7597dd7 100644 --- a/FightSystem/FightSystem_8/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper8.java +++ b/FightSystem/FightSystem_8/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper8.java @@ -52,4 +52,7 @@ public class CraftbukkitWrapper8 implements CraftbukkitWrapper { public Stream entityIterator() { return ((CraftWorld) Config.world).getHandle().entityList.stream(); } + + @Override + public void setupGamerule() { } } diff --git a/FightSystem/FightSystem_9/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper9.java b/FightSystem/FightSystem_9/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper9.java index 54281ed3..c7f393b3 100644 --- a/FightSystem/FightSystem_9/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper9.java +++ b/FightSystem/FightSystem_9/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper9.java @@ -55,4 +55,7 @@ public class CraftbukkitWrapper9 implements CraftbukkitWrapper { public Stream entityIterator() { return ((CraftWorld) Config.world).getHandle().entityList.stream(); } + + @Override + public void setupGamerule() { } } diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java index 1ff85e23..a95670a0 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java @@ -188,6 +188,8 @@ public class FightSystem extends JavaPlugin { }else if(Config.mode == ArenaMode.PREPARE) { Fight.getUnrotated().setSchem(SchematicNode.getSchematicNode(Config.PrepareSchemID)); } + + CraftbukkitWrapper.impl.setupGamerule(); } @Override diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper.java index 242119f5..e008a3bd 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper.java @@ -33,4 +33,6 @@ public interface CraftbukkitWrapper { float headRotation(Entity e); Stream entityIterator(); + + void setupGamerule(); } diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/utils/TechHiderWrapper.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/utils/TechHiderWrapper.java index fde87959..bf890168 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/utils/TechHiderWrapper.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/utils/TechHiderWrapper.java @@ -59,7 +59,7 @@ public class TechHiderWrapper extends StateDependent implements TechHider.Locati private final SecretKey key; public TechHiderWrapper() { - super(ENABLED, FightState.All); + super(ENABLED, FightState.Schem); techHider = new TechHider(this, Config.ObfuscateWith, Config.HiddenBlocks, Config.HiddenBlockEntities); try { @@ -68,7 +68,7 @@ public class TechHiderWrapper extends StateDependent implements TechHider.Locati throw new SecurityException(e); } - new StateDependentListener(ENABLED, FightState.All, this); + new StateDependentListener(ENABLED, FightState.Schem, this); register(); } diff --git a/SpigotCore/SpigotCore_21/src/de/steamwar/core/ProtocolWrapper21.java b/SpigotCore/SpigotCore_21/src/de/steamwar/core/ProtocolWrapper21.java new file mode 100644 index 00000000..7018aa64 --- /dev/null +++ b/SpigotCore/SpigotCore_21/src/de/steamwar/core/ProtocolWrapper21.java @@ -0,0 +1,66 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.core; + +import com.mojang.authlib.GameProfile; +import com.mojang.datafixers.util.Pair; +import de.steamwar.Reflection; +import net.minecraft.Util; +import net.minecraft.network.protocol.game.ClientboundPlayerInfoRemovePacket; +import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket; +import net.minecraft.world.level.GameType; +import org.bukkit.GameMode; + +import java.util.Collections; +import java.util.EnumSet; +import java.util.List; +import java.util.function.LongSupplier; + +public class ProtocolWrapper21 implements ProtocolWrapper { + + private static final Reflection.Field equipmentStack = Reflection.getField(equipmentPacket, List.class, 0); + @Override + public void setEquipmentPacketStack(Object packet, Object slot, Object stack) { + equipmentStack.set(packet, Collections.singletonList(new Pair<>(slot, stack))); + } + + private static final Reflection.Constructor removePacketConstructor = Reflection.getConstructor(ClientboundPlayerInfoRemovePacket.class, List.class); + + @Override + @SuppressWarnings("deprecation") + public Object playerInfoPacketConstructor(PlayerInfoAction action, GameProfile profile, GameMode mode) { + if(action == PlayerInfoAction.REMOVE) + return removePacketConstructor.invoke(Collections.singletonList(profile.getId())); + return switch (action) { + case ADD -> new ClientboundPlayerInfoUpdatePacket(EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER, ClientboundPlayerInfoUpdatePacket.Action.UPDATE_GAME_MODE), new ClientboundPlayerInfoUpdatePacket.Entry( + profile.getId(), profile, true, 0, GameType.byId(mode.getValue()), null, true, 0, null + )); + case GAMEMODE -> new ClientboundPlayerInfoUpdatePacket(EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_GAME_MODE), new ClientboundPlayerInfoUpdatePacket.Entry( + profile.getId(), profile, true, 0, GameType.byId(mode.getValue()), null, true, 0, null + )); + default -> null; + }; + } + + @Override + public void initTPSWarp(LongSupplier longSupplier) { + Util.timeSource = () -> System.nanoTime() + longSupplier.getAsLong(); + } +} diff --git a/SpigotCore/SpigotCore_21/src/de/steamwar/techhider/ChunkHider21.java b/SpigotCore/SpigotCore_21/src/de/steamwar/techhider/ChunkHider21.java index c31e5f8f..0d0cb782 100644 --- a/SpigotCore/SpigotCore_21/src/de/steamwar/techhider/ChunkHider21.java +++ b/SpigotCore/SpigotCore_21/src/de/steamwar/techhider/ChunkHider21.java @@ -123,7 +123,9 @@ public class ChunkHider21 implements ChunkHider { for (int x = 0; x < 16; x++) { int pos = (((y * 16) + z) * 16) + x; - switch (section.test(x, y, z)) { + TechHider.State test = section.test(x, y, z); + + switch (test) { case SKIP: break; case CHECK: diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/Reflection.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/Reflection.java index 7c34fca9..ff298c1a 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/Reflection.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/Reflection.java @@ -157,14 +157,21 @@ public final class Reflection { } else if(MAJOR_VERSION < 21 || MINOR_VERSION < 4) { return Class.forName(spigotClassnames.getOrDefault(name, name)); } else { - Class clazz = Class.forName(name); - if (clazz.getName().equals(name)) { + Class clazz = null; + try { + clazz = Class.forName(name); + } catch (ClassNotFoundException e) {} + if (clazz != null && clazz.getName().equals(name)) { return clazz; } try { return Core.class.getClassLoader().getParent().loadClass(name); } catch (ClassNotFoundException e) { + if (clazz == null) { + throw e; + } + return clazz; } } diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/techhider/ChunkHider.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/techhider/ChunkHider.java index fbd6e364..e1d2b5e9 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/techhider/ChunkHider.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/techhider/ChunkHider.java @@ -147,8 +147,9 @@ public interface ChunkHider { return; } - int longs = (int) (((long) entries * bitsPerBlock + 63) >> 6); - out.writeBytes(in, longs * Long.BYTES); + char valuesPerLong = (char)(64 / bitsPerBlock); + int i1 = (entries + valuesPerLong - 1) / valuesPerLong; + out.writeBytes(in, i1 * Long.BYTES); } public long[] readDataArray() { @@ -164,9 +165,10 @@ public interface ChunkHider { return new long[entries]; } - int longs = (int) (((long) entries * bitsPerBlock + 63) >> 6); - long[] array = new long[longs]; - for(int i = 0; i < longs; i++) + char valuesPerLong = (char) (64 / bitsPerBlock); + int i1 = (entries + valuesPerLong - 1) / valuesPerLong; + long[] array = new long[i1]; + for(int i = 0; i < i1; i++) array[i] = in.readLong(); return array;