From 377d12658d0b1640bb800f562cca9fba015e6d82 Mon Sep 17 00:00:00 2001 From: OmerBenGera Date: Fri, 7 Apr 2023 10:30:37 +0300 Subject: [PATCH] Fixed a NoSuchMethodError thrown when using 1.19.4 spigot --- .../superiorskyblock/nms/v1194/NMSChunksImpl.java | 6 +++--- .../superiorskyblock/nms/v1194/NMSUtils.java | 12 ++++++++++++ .../nms/v1194/world/WorldEditSessionImpl.java | 3 ++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/NMS/v1194/src/main/java/com/bgsoftware/superiorskyblock/nms/v1194/NMSChunksImpl.java b/NMS/v1194/src/main/java/com/bgsoftware/superiorskyblock/nms/v1194/NMSChunksImpl.java index 9e8e6d78a..06fd33d96 100644 --- a/NMS/v1194/src/main/java/com/bgsoftware/superiorskyblock/nms/v1194/NMSChunksImpl.java +++ b/NMS/v1194/src/main/java/com/bgsoftware/superiorskyblock/nms/v1194/NMSChunksImpl.java @@ -356,7 +356,7 @@ public void injectChunkSections(org.bukkit.Chunk chunk) { @Override public boolean isChunkEmpty(org.bukkit.Chunk bukkitChunk) { - LevelChunk levelChunk = ((CraftChunk) bukkitChunk).getHandle(); + LevelChunk levelChunk = NMSUtils.getCraftChunkHandle((CraftChunk) bukkitChunk); return Arrays.stream(levelChunk.getSections()).allMatch(chunkSection -> chunkSection == null || chunkSection.hasOnlyAir()); } @@ -373,7 +373,7 @@ public void startTickingChunk(Island island, org.bukkit.Chunk chunk, boolean sto if (plugin.getSettings().getCropsInterval() <= 0) return; - LevelChunk levelChunk = ((CraftChunk) chunk).getHandle(); + LevelChunk levelChunk = NMSUtils.getCraftChunkHandle((CraftChunk) chunk); if (stop) { CropsBlockEntity cropsBlockEntity = CropsBlockEntity.remove(levelChunk.getPos()); @@ -405,7 +405,7 @@ public void shutdown() { @Override public List getBlockEntities(Chunk chunk) { - LevelChunk levelChunk = ((CraftChunk) chunk).getHandle(); + LevelChunk levelChunk = NMSUtils.getCraftChunkHandle((CraftChunk) chunk); List blockEntities = new LinkedList<>(); World bukkitWorld = chunk.getWorld(); diff --git a/NMS/v1194/src/main/java/com/bgsoftware/superiorskyblock/nms/v1194/NMSUtils.java b/NMS/v1194/src/main/java/com/bgsoftware/superiorskyblock/nms/v1194/NMSUtils.java index b107808e1..6790ef8e7 100644 --- a/NMS/v1194/src/main/java/com/bgsoftware/superiorskyblock/nms/v1194/NMSUtils.java +++ b/NMS/v1194/src/main/java/com/bgsoftware/superiorskyblock/nms/v1194/NMSUtils.java @@ -36,6 +36,7 @@ import net.minecraft.world.level.chunk.ProtoChunk; import net.minecraft.world.level.chunk.UpgradeData; import net.minecraft.world.level.levelgen.Heightmap; +import org.bukkit.craftbukkit.v1_19_R3.CraftChunk; import java.io.IOException; import java.lang.reflect.Modifier; @@ -57,6 +58,9 @@ public class NMSUtils { private static final ReflectField> VISIBLE_CHUNKS = new ReflectField<>( ChunkMap.class, Map.class, Modifier.PUBLIC | Modifier.VOLATILE, 1); + private static final ReflectMethod CRAFT_CHUNK_GET_HANDLE = new ReflectMethod<>( + CraftChunk.class, LevelChunk.class, "getHandle"); + private static final List> PENDING_CHUNK_ACTIONS = new LinkedList<>(); private NMSUtils() { @@ -270,6 +274,14 @@ public static boolean isDoubleBlock(Block block, BlockState blockState) { blockState.getValue(SlabBlock.TYPE) == SlabType.DOUBLE; } + public static LevelChunk getCraftChunkHandle(CraftChunk craftChunk) { + if (CRAFT_CHUNK_GET_HANDLE.isValid()) + return CRAFT_CHUNK_GET_HANDLE.invoke(craftChunk); + + ServerLevel serverLevel = craftChunk.getCraftWorld().getHandle(); + return serverLevel.getChunk(craftChunk.getX(), craftChunk.getZ()); + } + public record UnloadedChunkCompound(net.minecraft.nbt.CompoundTag chunkCompound, ChunkPos chunkPos) { public ListTag getSections() { diff --git a/NMS/v1194/src/main/java/com/bgsoftware/superiorskyblock/nms/v1194/world/WorldEditSessionImpl.java b/NMS/v1194/src/main/java/com/bgsoftware/superiorskyblock/nms/v1194/world/WorldEditSessionImpl.java index e443fdb52..48509a017 100644 --- a/NMS/v1194/src/main/java/com/bgsoftware/superiorskyblock/nms/v1194/world/WorldEditSessionImpl.java +++ b/NMS/v1194/src/main/java/com/bgsoftware/superiorskyblock/nms/v1194/world/WorldEditSessionImpl.java @@ -7,6 +7,7 @@ import com.bgsoftware.superiorskyblock.core.SequentialListBuilder; import com.bgsoftware.superiorskyblock.core.Text; import com.bgsoftware.superiorskyblock.island.IslandUtils; +import com.bgsoftware.superiorskyblock.nms.v1194.NMSUtils; import com.bgsoftware.superiorskyblock.nms.world.WorldEditSession; import com.bgsoftware.superiorskyblock.tag.ByteTag; import com.bgsoftware.superiorskyblock.tag.CompoundTag; @@ -161,7 +162,7 @@ public List getAffectedChunks() { @Override public void applyBlocks(Chunk bukkitChunk) { - LevelChunk levelChunk = ((CraftChunk) bukkitChunk).getHandle(); + LevelChunk levelChunk = NMSUtils.getCraftChunkHandle((CraftChunk) bukkitChunk); ChunkPos chunkPos = levelChunk.getPos(); long chunkKey = chunkPos.toLong();