diff --git a/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/NMSWrapper21.java b/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/NMSWrapper21.java index e6308e43..8d59ffa9 100644 --- a/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/NMSWrapper21.java +++ b/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/NMSWrapper21.java @@ -21,41 +21,39 @@ package de.steamwar.bausystem.utils; import de.steamwar.Reflection; import de.steamwar.bausystem.features.util.NoClipCommand; -import net.minecraft.core.component.DataComponents; -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.EntityPlayer; -import net.minecraft.server.level.PlayerInteractManager; -import net.minecraft.world.entity.player.EntityHuman; -import net.minecraft.world.entity.player.PlayerAbilities; -import net.minecraft.world.item.component.CustomData; -import net.minecraft.world.level.EnumGamemode; +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.v1_21_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerGameModeChangeEvent; 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(EntityPlayer.class, null, PlayerInteractManager.class); + private static final Reflection.Field playerInteractManager = Reflection.getField(ServerPlayer.class, null, ServerPlayerGameMode.class); @Override public void setInternalGameMode(Player player, GameMode gameMode) { - playerInteractManager.get(((CraftPlayer) player).getHandle()).a(EnumGamemode.a(gameMode.getValue())); + playerInteractManager.get(((CraftPlayer) player).getHandle()).changeGameModeForPlayer(GameType.byId(gameMode.getValue()), PlayerGameModeChangeEvent.Cause.UNKNOWN, null); } @Override public void setSlotToItemStack(Player player, Object o) { - PacketPlayInSetCreativeSlot packetPlayInSetCreativeSlot = (PacketPlayInSetCreativeSlot) o; - int index = packetPlayInSetCreativeSlot.b(); + ClientboundContainerSetSlotPacket packetPlayInSetCreativeSlot = (ClientboundContainerSetSlotPacket) o; + int index = packetPlayInSetCreativeSlot.getSlot(); if (index >= 36 && index <= 44) { index -= 36; } else if (index > 44) { @@ -63,25 +61,23 @@ public class NMSWrapper21 implements NMSWrapper { } else if (index <= 8) { index = index - 8 + 36; } - player.getInventory().setItem(index, CraftItemStack.asBukkitCopy(packetPlayInSetCreativeSlot.e())); + 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, PacketPlayOutGameStateChange.a.class, 12); + private static final Reflection.Field gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, ClientboundGameEventPacket.Type.class, 12); @Override public void setGameStateChangeReason(Object packet) { - gameStateChangeReason.set(packet, PacketPlayOutGameStateChange.d); + gameStateChangeReason.set(packet, ClientboundGameEventPacket.CHANGE_GAME_MODE); } - private static final Reflection.Field playerAbilities = Reflection.getField(EntityHuman.class, null, PlayerAbilities.class); - @Override public void setPlayerBuildAbilities(Player player) { - PlayerAbilities abilities = playerAbilities.get(((CraftPlayer) player).getHandle()); - abilities.d = true; - abilities.e = true; + Abilities abilities = (((CraftPlayer) player).getHandle()).getAbilities(); + abilities.mayBuild = true; + abilities.mayfly = true; } @Override @@ -93,49 +89,45 @@ public class NMSWrapper21 implements NMSWrapper { @Override public boolean checkItemStack(ItemStack item) { - net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(item); - NBTTagCompound tag = nmsItem.a(DataComponents.b, CustomData.a).c(); - if (tag.e("BlockEntityTag")) { - NBTTagCompound blockTag = tag.p("BlockEntityTag"); - if (blockTag.e("Items")) { - return drillDown(blockTag.c("Items", 10), 0, 0) > threshold; - } + ItemContainerContents data = item.getData(DataComponentTypes.CONTAINER); + if (data == null) { + return false; } - return false; + return drillDown(data.contents(), 0, 0) <= threshold; } - private int drillDown(NBTTagList items, int layer, int start) { + private int drillDown(List items, int layer, int start) { if (layer > 2) return start + threshold; int invalid = start; - for (NBTBase nbtBase : items) { - if (!(nbtBase instanceof NBTTagCompound slot)) + 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; - 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; + + List subItems = data.contents(); + if (subItems.size() > 1) { + invalid = drillDown(subItems, layer + 1, invalid); + } } return invalid; } @Override public Object resetExplosionKnockback(Object packet) { - PacketPlayOutExplosion explosion = (PacketPlayOutExplosion) packet; + ClientboundExplodePacket explosion = (ClientboundExplodePacket) packet; - return new PacketPlayOutExplosion( - explosion.b(), + return new ClientboundExplodePacket( + explosion.center(), Optional.empty(), - explosion.f(), - explosion.g() + explosion.explosionParticle(), + explosion.explosionSound() ); } } 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 9e52bb36..b5c920a7 100644 --- a/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper21.java +++ b/FightSystem/FightSystem_21/src/de/steamwar/fightsystem/utils/CraftbukkitWrapper21.java @@ -25,6 +25,6 @@ public class CraftbukkitWrapper21 extends CraftbukkitWrapper18 { @Override public float headRotation(Entity e) { - return getEntity(e).bS(); + return getEntity(e).getYHeadRot(); } } diff --git a/SpigotCore/SpigotCore_21/src/de/steamwar/core/BountifulWrapper21.java b/SpigotCore/SpigotCore_21/src/de/steamwar/core/BountifulWrapper21.java index e01a06fc..be404e30 100644 --- a/SpigotCore/SpigotCore_21/src/de/steamwar/core/BountifulWrapper21.java +++ b/SpigotCore/SpigotCore_21/src/de/steamwar/core/BountifulWrapper21.java @@ -21,7 +21,7 @@ package de.steamwar.core; import de.steamwar.Reflection; import net.minecraft.world.entity.PositionMoveRotation; -import net.minecraft.world.phys.Vec3D; +import net.minecraft.world.phys.Vec3; public class BountifulWrapper21 extends BountifulWrapper9 { @@ -33,7 +33,7 @@ public class BountifulWrapper21 extends BountifulWrapper9 { return (packet, x, y, z, pitch, yaw) -> { PositionMoveRotation pos = field.get(packet); - field.set(packet, new PositionMoveRotation(new Vec3D(x, y, z), pos.b(), yaw, pitch)); + field.set(packet, new PositionMoveRotation(new Vec3(x, y, z), pos.deltaMovement(), yaw, pitch)); }; } catch (IllegalArgumentException e) { return super.getPositionSetter(packetClass, fieldOffset); diff --git a/SpigotCore/SpigotCore_21/src/de/steamwar/core/ChatWrapper21.java b/SpigotCore/SpigotCore_21/src/de/steamwar/core/ChatWrapper21.java index 760ba393..64757bbe 100644 --- a/SpigotCore/SpigotCore_21/src/de/steamwar/core/ChatWrapper21.java +++ b/SpigotCore/SpigotCore_21/src/de/steamwar/core/ChatWrapper21.java @@ -19,26 +19,26 @@ package de.steamwar.core; -import net.minecraft.network.chat.IChatMutableComponent; -import net.minecraft.network.chat.contents.LiteralContents; -import net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata; -import net.minecraft.network.syncher.DataWatcher; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.contents.PlainTextContents; +import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; +import net.minecraft.network.syncher.SynchedEntityData; import java.util.ArrayList; public class ChatWrapper21 implements ChatWrapper { @Override public Object stringToChatComponent(String text) { - return IChatMutableComponent.a(LiteralContents.a(text)); + return MutableComponent.create(PlainTextContents.create(text)); } @Override public Object getDataWatcherPacket(int entityId, Object... dataWatcherKeyValues) { - ArrayList> nativeWatchers = new ArrayList<>(1); + ArrayList> nativeWatchers = new ArrayList<>(1); for(int i = 0; i < dataWatcherKeyValues.length; i+=2) { - nativeWatchers.add(((DataWatcher.Item) BountifulWrapper.impl.getDataWatcherItem(dataWatcherKeyValues[i], dataWatcherKeyValues[i+1])).e()); + nativeWatchers.add(((SynchedEntityData.DataItem) BountifulWrapper.impl.getDataWatcherItem(dataWatcherKeyValues[i], dataWatcherKeyValues[i+1])).value()); } - return new PacketPlayOutEntityMetadata(entityId, nativeWatchers); + return new ClientboundSetEntityDataPacket(entityId, nativeWatchers); } } diff --git a/SpigotCore/SpigotCore_21/src/de/steamwar/core/CraftbukkitWrapper21.java b/SpigotCore/SpigotCore_21/src/de/steamwar/core/CraftbukkitWrapper21.java index 337ee1db..a774c401 100644 --- a/SpigotCore/SpigotCore_21/src/de/steamwar/core/CraftbukkitWrapper21.java +++ b/SpigotCore/SpigotCore_21/src/de/steamwar/core/CraftbukkitWrapper21.java @@ -22,20 +22,18 @@ package de.steamwar.core; import de.steamwar.Reflection; import com.comphenix.tinyprotocol.TinyProtocol; import net.minecraft.network.protocol.game.ClientboundLevelChunkWithLightPacket; -import net.minecraft.world.level.World; -import net.minecraft.world.level.chunk.Chunk; +import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.status.ChunkStatus; -import net.minecraft.world.level.lighting.LevelLightEngine; +import org.bukkit.craftbukkit.CraftChunk; import org.bukkit.entity.Player; public class CraftbukkitWrapper21 implements CraftbukkitWrapper.ICraftbukkitWrapper { private static final Reflection.Method getHandle = Reflection.getMethod("org.bukkit.craftbukkit.CraftChunk", "getHandle", ChunkStatus.class); - private static final Reflection.Method getLightEngine = Reflection.getTypedMethod(World.class, null, LevelLightEngine.class); @Override public void sendChunk(Player p, int chunkX, int chunkZ) { - Chunk chunk = (Chunk) getHandle.invoke(p.getWorld().getChunkAt(chunkX, chunkZ), ChunkStatus.n); - TinyProtocol.instance.sendPacket(p, new ClientboundLevelChunkWithLightPacket(chunk, (LevelLightEngine) getLightEngine.invoke(chunk.r), null, null, true)); + LevelChunk chunk = (LevelChunk) ((CraftChunk) p.getWorld().getChunkAt(chunkX, chunkZ)).getHandle(ChunkStatus.FULL); + TinyProtocol.instance.sendPacket(p, new ClientboundLevelChunkWithLightPacket(chunk, chunk.level.getLightEngine(), null, null, true)); } } diff --git a/SpigotCore/SpigotCore_9/src/de/steamwar/core/BountifulWrapper9.java b/SpigotCore/SpigotCore_9/src/de/steamwar/core/BountifulWrapper9.java index ce7f6170..156662a8 100644 --- a/SpigotCore/SpigotCore_9/src/de/steamwar/core/BountifulWrapper9.java +++ b/SpigotCore/SpigotCore_9/src/de/steamwar/core/BountifulWrapper9.java @@ -85,11 +85,12 @@ public class BountifulWrapper9 implements BountifulWrapper.IBountifulWrapper { @Override public BountifulWrapper.PositionSetter getRelMoveSetter(Class packetClass) { Class type = Core.getVersion() > 12 ? short.class : int.class; - Reflection.Field moveX = Reflection.getField(packetClass, "b", type); - Reflection.Field moveY = Reflection.getField(packetClass, "c", type); - Reflection.Field moveZ = Reflection.getField(packetClass, "d", type); - Reflection.Field moveYaw = Reflection.getField(packetClass, "e", byte.class); - Reflection.Field movePitch = Reflection.getField(packetClass, "f", byte.class); + int fieldOffset = Core.getVersion() > 12 ? 0 : 1; + Reflection.Field moveX = Reflection.getField(packetClass, type, 0 + fieldOffset); + Reflection.Field moveY = Reflection.getField(packetClass, type, 1 + fieldOffset); + Reflection.Field moveZ = Reflection.getField(packetClass, type, 2 + fieldOffset); + Reflection.Field moveYaw = Reflection.getField(packetClass, byte.class, 0); + Reflection.Field movePitch = Reflection.getField(packetClass, byte.class, 1); return (packet, x, y, z, pitch, yaw) -> { moveX.set(packet, (short)(x*4096)); diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/Reflection.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/Reflection.java index 92e3d3fd..86dca0bf 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/Reflection.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/Reflection.java @@ -94,6 +94,7 @@ public final class Reflection { spigotClassnames.put("net.minecraft.network.protocol.game.ServerboundContainerClickPacket", "net.minecraft.network.protocol.game.PacketPlayInWindowClick"); spigotClassnames.put("net.minecraft.network.protocol.game.ServerboundInteractPacket", "net.minecraft.network.protocol.game.PacketPlayInUseEntity"); spigotClassnames.put("net.minecraft.network.protocol.game.ServerboundInteractPacket$Action", "net.minecraft.network.protocol.game.PacketPlayInUseEntity$EnumEntityUseAction"); + spigotClassnames.put("net.minecraft.network.protocol.game.ServerboundInteractPacket$ActionType", "net.minecraft.network.protocol.game.PacketPlayInUseEntity$b"); spigotClassnames.put("net.minecraft.network.protocol.game.ServerboundMovePlayerPacket$Pos", "net.minecraft.network.protocol.game.PacketPlayInFlying$PacketPlayInPosition"); spigotClassnames.put("net.minecraft.network.protocol.game.ServerboundMovePlayerPacket$PosRot", "net.minecraft.network.protocol.game.PacketPlayInFlying$PacketPlayInPositionLook"); spigotClassnames.put("net.minecraft.network.protocol.game.ServerboundMovePlayerPacket$Rot", "net.minecraft.network.protocol.game.PacketPlayInFlying$PacketPlayInLook"); diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java index 2d19e22c..119507aa 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java @@ -50,11 +50,12 @@ public class REntityServer implements Listener { private static final Class useEntity = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundInteractPacket"); private static final Reflection.Field useEntityTarget = Reflection.getField(useEntity, int.class, 0); private static final Class useEntityEnumAction = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundInteractPacket$Action"); + private static final Class useEntityEnumActionType = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundInteractPacket$ActionType"); private static final Reflection.Field useEntityAction = Reflection.getField(useEntity, useEntityEnumAction, 0); private static final Function getEntityAction; static { if(Core.getVersion() > 15) { - Reflection.Method useEntityGetAction = Reflection.getMethod(useEntityEnumAction, "a"); + Reflection.Method useEntityGetAction = Reflection.getTypedMethod(useEntityEnumAction, null, useEntityEnumActionType); getEntityAction = value -> ((Enum) useEntityGetAction.invoke(value)).ordinal(); } else { getEntityAction = value -> ((Enum) value).ordinal(); diff --git a/VelocityCore/src/de/steamwar/velocitycore/ServerVersion.java b/VelocityCore/src/de/steamwar/velocitycore/ServerVersion.java index d8952118..4b114a8f 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/ServerVersion.java +++ b/VelocityCore/src/de/steamwar/velocitycore/ServerVersion.java @@ -44,8 +44,7 @@ public enum ServerVersion { PAPER_18("paper-1.18.2.jar", 15, ProtocolVersion.MINECRAFT_1_18_2), PAPER_19("paper-1.19.3.jar", 19, ProtocolVersion.MINECRAFT_1_19_3), PAPER_20("paper-1.20.1.jar", 20, ProtocolVersion.MINECRAFT_1_20), - DEVEL_21("paper-1.21.5.jar", 21, ProtocolVersion.MINECRAFT_1_21_5), - PAPER_21("paper-1.21.3.jar", 21, ProtocolVersion.MINECRAFT_1_21_2); + PAPER_21("paper-1.21.5.jar", 21, ProtocolVersion.MINECRAFT_1_21_5); private static final Map chatMap = new HashMap<>(); @@ -95,10 +94,6 @@ public enum ServerVersion { } public static ServerVersion get(int version) { - if (version == 21) { - return DEVEL_21; - } - return versionMap.get(version); } diff --git a/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java b/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java index 6195bd73..26835f8e 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java +++ b/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java @@ -148,6 +148,11 @@ public class Tablist extends ChannelInboundHandlerAdapter { current.clear(); } + if (player.getProtocolVersion().noLessThan(ProtocolVersion.MINECRAFT_1_21_5)) { + // TODO: Misformed Packet? + return; + } + sendPacket(player, createTeamPacket); } } diff --git a/settings.gradle.kts b/settings.gradle.kts index b161a424..9b530499 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -111,11 +111,11 @@ dependencyResolutionManagement { library("spigotapi", "org.spigotmc:spigot-api:1.20-R0.1-SNAPSHOT") library("spigotannotations", "org.spigotmc:plugin-annotations:1.2.3-SNAPSHOT") library("paperapi", "io.papermc.paper:paper-api:1.19.2-R0.1-SNAPSHOT") - library("paperapi21", "io.papermc.paper:paper-api:1.21-R0.1-SNAPSHOT") + library("paperapi21", "io.papermc.paper:paper-api:1.21.6-R0.1-SNAPSHOT") library("authlib", "com.mojang:authlib:1.5.25") library("datafixer", "com.mojang:datafixerupper:4.0.26") library("brigadier", "com.mojang:brigadier:1.0.18") - library("anvilgui", "net.wesjd:anvilgui:1.10.3-SNAPSHOT") + library("anvilgui", "net.wesjd:anvilgui:1.10.6-SNAPSHOT") library("nms8", "de.steamwar:spigot:1.8") library("nms9", "de.steamwar:spigot:1.9") @@ -126,7 +126,7 @@ dependencyResolutionManagement { library("nms18", "de.steamwar:spigot:1.18") library("nms19", "de.steamwar:spigot:1.19") library("nms20", "de.steamwar:spigot:1.20") - library("nms21", "de.steamwar:spigot:1.21") + library("nms21", "de.steamwar:spigot:1.21.5") library("axiom", "de.steamwar:axiompaper:RELEASE") library("worldedit12", "de.steamwar:worldedit:1.12")