From 028448be8dcebe63c5625301176686da529f61e9 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Fri, 15 Sep 2023 16:37:03 +0200 Subject: [PATCH] Fix Version construction --- .../java/com/moulberry/axiom/AxiomPaper.java | 2 ++ .../java/com/moulberry/axiom/Reflection.java | 22 +++++++++++++++++++ .../moulberry/axiom/version/Version19R2.java | 8 ++++++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/moulberry/axiom/AxiomPaper.java b/src/main/java/com/moulberry/axiom/AxiomPaper.java index 619958b..3fb5f02 100644 --- a/src/main/java/com/moulberry/axiom/AxiomPaper.java +++ b/src/main/java/com/moulberry/axiom/AxiomPaper.java @@ -4,6 +4,7 @@ import com.moulberry.axiom.integration.PaperFailMoveListener; import com.moulberry.axiom.packet.*; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; +import io.papermc.paper.event.player.PlayerFailMoveEvent; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; @@ -90,6 +91,7 @@ public class AxiomPaper extends JavaPlugin implements Listener { instance = this; try { + PlayerFailMoveEvent.class.getName(); //Try load class Bukkit.getPluginManager().registerEvents(new PaperFailMoveListener(), this); } catch (NoClassDefFoundError e) { getLogger().log(java.util.logging.Level.WARNING, "Axiom players may move too quickly according to the server. Use a current Paper version or increase the 'moved-too-quickly-multiplier' in spigot.yml."); diff --git a/src/main/java/com/moulberry/axiom/Reflection.java b/src/main/java/com/moulberry/axiom/Reflection.java index 066f792..21c177b 100644 --- a/src/main/java/com/moulberry/axiom/Reflection.java +++ b/src/main/java/com/moulberry/axiom/Reflection.java @@ -126,6 +126,28 @@ public class Reflection { } + public interface Constructor { + T newInstance(Object... arguments); + } + + public static Constructor getConstructor(Class clazz, Class... params) { + try { + java.lang.reflect.Constructor constructor = clazz.getDeclaredConstructor(params); + constructor.setAccessible(true); + + return arguments -> { + try { + return constructor.newInstance(arguments); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { + throw new IllegalArgumentException("Cannot invoke constructor " + constructor, e); + } + }; + } catch (NoSuchMethodException e) { + throw new IllegalStateException("Cannot find matching constructor"); + } + } + + private static final String ORG_BUKKIT_CRAFTBUKKIT = Bukkit.getServer().getClass().getPackage().getName(); public static final int VERSION; // Format: 2 digit minor version, 2 digit CraftBukkit revision: eg. 2001 for v1_20_R1 static { diff --git a/src/main/java/com/moulberry/axiom/version/Version19R2.java b/src/main/java/com/moulberry/axiom/version/Version19R2.java index b4bf8b7..5b38b27 100644 --- a/src/main/java/com/moulberry/axiom/version/Version19R2.java +++ b/src/main/java/com/moulberry/axiom/version/Version19R2.java @@ -13,6 +13,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.LevelChunk; import org.bukkit.Chunk; +import java.util.BitSet; import java.util.Set; public class Version19R2 implements VersionWrapper { @@ -25,6 +26,11 @@ public class Version19R2 implements VersionWrapper { return getLightBlock.invoke(old, chunk, pos) != getLightBlock.invoke(state, chunk, pos) || lightEmission.get(old) != lightEmission.get(state) || useShapeForLightOcclusion.get(old) || useShapeForLightOcclusion.get(state); } + private static final Class LevelLightEngine = Reflection.getClass("net.minecraft.world.level.lighting.LightEngine"); + private static final Reflection.Constructor newClientboundLevelChunkWithLightPacket = Reflection.getConstructor( + ClientboundLevelChunkWithLightPacket.class, + LevelChunk.class, LevelLightEngine, BitSet.class, BitSet.class, boolean.class + ); @Override public void publishBiomeChange(ServerLevel level, Set chunks) { ThreadedLevelLightEngine lightEngine = AxiomPaper.getLightEngine(AxiomPaper.getChunkSource(level)); @@ -32,7 +38,7 @@ public class Version19R2 implements VersionWrapper { for (Chunk chunk : chunks) { ChunkPos chunkPos = new ChunkPos(chunk.getX(), chunk.getZ()); LevelChunk nativeChunk = AxiomPaper.getChunk(level, chunk.getX(), chunk.getZ()); - ClientboundLevelChunkWithLightPacket packet = new ClientboundLevelChunkWithLightPacket(nativeChunk, lightEngine, null, null, true); + ClientboundLevelChunkWithLightPacket packet = newClientboundLevelChunkWithLightPacket.newInstance(nativeChunk, lightEngine, null, null, true); for (ServerPlayer player : AxiomPaper.getPlayersSeeingChunk(level, chunkPos)) { AxiomPaper.sendPacket(player, packet); }