From 9b5eda60b3f50eee9f4aae66f7353f81a6da602d Mon Sep 17 00:00:00 2001 From: Christian Koop Date: Mon, 13 Dec 2021 18:00:36 +0100 Subject: [PATCH] Updates BlockUtils to use `MethodMapping` and `ClassMapping` --- .../core/compatibility/ClassMapping.java | 4 +- .../core/compatibility/MethodMapping.java | 47 +++++++++++++++---- .../com/songoda/core/utils/BlockUtils.java | 18 +++---- 3 files changed, 48 insertions(+), 21 deletions(-) diff --git a/Compatibility/src/main/java/com/songoda/core/compatibility/ClassMapping.java b/Compatibility/src/main/java/com/songoda/core/compatibility/ClassMapping.java index 16ff59aa..9687064a 100644 --- a/Compatibility/src/main/java/com/songoda/core/compatibility/ClassMapping.java +++ b/Compatibility/src/main/java/com/songoda/core/compatibility/ClassMapping.java @@ -44,7 +44,9 @@ public enum ClassMapping { CRAFT_ITEM_STACK("inventory", "CraftItemStack"), CRAFT_MAGIC_NUMBERS("util", "CraftMagicNumbers"), CRAFT_PLAYER("entity", "CraftPlayer"), - CRAFT_WORLD("CraftWorld"); + CRAFT_WORLD("CraftWorld"), + + MOJANGSON_PARSER("nbt", "MojangsonParser"); private final String packageName; private final String className; diff --git a/Compatibility/src/main/java/com/songoda/core/compatibility/MethodMapping.java b/Compatibility/src/main/java/com/songoda/core/compatibility/MethodMapping.java index a13af1b6..84d4334f 100644 --- a/Compatibility/src/main/java/com/songoda/core/compatibility/MethodMapping.java +++ b/Compatibility/src/main/java/com/songoda/core/compatibility/MethodMapping.java @@ -5,7 +5,6 @@ import org.bukkit.inventory.ItemStack; import java.lang.reflect.Method; public enum MethodMapping { - MC_ITEM_STACK__GET_TAG("getTag", "getTag", "s"), MC_ITEM_STACK__SET_TAG("setTag", "setTag", "c", ClassMapping.NBT_TAG_COMPOUND.getClazz()), @@ -14,17 +13,32 @@ public enum MethodMapping { MC_NBT_TAG_COMPOUND__SET_STRING("setString", "setString", "a", String.class, String.class), MC_NBT_TAG_COMPOUND__REMOVE("remove", "remove", "r", String.class), - CB_ITEM_STACK__AS_NMS_COPY("asNMSCopy", "asNMSCopy", ItemStack.class), - CB_ITEM_STACK__AS_CRAFT_MIRROR("asCraftMirror", "asCraftMirror", ClassMapping.ITEM_STACK.getClazz()), + CB_ITEM_STACK__AS_NMS_COPY("asNMSCopy", ItemStack.class), + CB_ITEM_STACK__AS_CRAFT_MIRROR("asCraftMirror", ClassMapping.ITEM_STACK.getClazz()), - MC_NBT_TAG_LIST__ADD("add", "a", "add", "add", ClassMapping.NBT_BASE.getClazz()), + MC_CHUNK__GET_WORLD("getWorld", "D"), + + MC_NBT_TAG_LIST__ADD("add", "a", "add", "c", ClassMapping.NBT_BASE.getClazz()), + + BLOCK__GET_BLOCK_DATA("getBlockData", "n"), + + CHUNK__SET_BLOCK_STATE("setType", "setBlockState", ClassMapping.BLOCK_POSITION.getClazz(), ClassMapping.I_BLOCK_DATA.getClazz(), boolean.class, boolean.class), + + ITEM_STACK__SAVE("save", "b", ClassMapping.NBT_TAG_COMPOUND.getClazz()), + ITEM_STACK__GET_ITEM("getItem","c"), + ITEM_STACK__GET_MAX_STACK_SIZE("getMaxStackSize","l"), + + WORLD__UPDATE_ADJACENT_COMPARATORS("updateAdjacentComparators", "c", ClassMapping.BLOCK_POSITION.getClazz(), ClassMapping.BLOCK.getClazz()), + WORLD__GET_CHUNK_AT("getChunkAt", "d", int.class, int.class), WORLD_BOARDER__SET_CENTER("setCenter", "setCenter", "setCenter", "c", double.class, double.class), WORLD_BOARDER__SET_SIZE("setSize", "setSize", "setSize", "a", double.class), WORLD_BOARDER__SET_WARNING_TIME("setWarningTime", "setWarningTime", "setWarningTime", "b", int.class), WORLD_BOARDER__SET_WARNING_DISTANCE("setWarningDistance", "setWarningDistance", "setWarningDistance", "c", int.class), - WORLD_BOARDER__TRANSITION_SIZE_BETWEEN("transitionSizeBetween", "transitionSizeBetween", "transitionSizeBetween", "a", double.class, double.class, long.class); + WORLD_BOARDER__TRANSITION_SIZE_BETWEEN("transitionSizeBetween", "transitionSizeBetween", "transitionSizeBetween", "a", double.class, double.class, long.class), + + MOJANGSON_PARSER__PARSE("parse", "a", String.class); private final String saneFallback; private final String _1_14; @@ -59,17 +73,30 @@ public enum MethodMapping { this.paramaters = paramaters; } + MethodMapping(String saneFallback, Class... paramaters) { + this.saneFallback = saneFallback; + + this._1_14 = null; + this._1_17 = null; + this._1_18 = null; + this.paramaters = paramaters; + } + public Method getMethod(Class clazz) { try { String methodName = _1_18; switch (ServerVersion.getServerVersion()) { case V1_14: - if (_1_14 != null) + if (_1_14 != null) { methodName = _1_14; + } + break; case V1_17: - if (_1_17 != null) + if (_1_17 != null) { methodName = _1_17; + } + break; } @@ -78,8 +105,8 @@ public enum MethodMapping { method.setAccessible(true); return method; - } catch (NoSuchMethodException ex) { - if (saneFallback != null) { + } catch (NullPointerException | NoSuchMethodException ex) { + if (saneFallback != null && !saneFallback.equals(methodName)) { try { Method method = clazz.getDeclaredMethod(saneFallback, paramaters); method.setAccessible(true); @@ -89,6 +116,8 @@ public enum MethodMapping { ex.printStackTrace(); innerEx.printStackTrace(); } + } else { + ex.printStackTrace(); } } } catch (Exception ex) { diff --git a/Core/src/main/java/com/songoda/core/utils/BlockUtils.java b/Core/src/main/java/com/songoda/core/utils/BlockUtils.java index 3f02d7d4..8e2c9264 100644 --- a/Core/src/main/java/com/songoda/core/utils/BlockUtils.java +++ b/Core/src/main/java/com/songoda/core/utils/BlockUtils.java @@ -2,6 +2,7 @@ package com.songoda.core.utils; import com.songoda.core.compatibility.ClassMapping; import com.songoda.core.compatibility.CompatibleMaterial; +import com.songoda.core.compatibility.MethodMapping; import com.songoda.core.compatibility.ServerVersion; import org.bukkit.Effect; import org.bukkit.Location; @@ -347,20 +348,15 @@ public class BlockUtils { try { if (chunkToNmsChunk == null) { chunkToNmsChunk = loc.getChunk().getClass().getMethod("getHandle"); - nmsChunkGetWorld = chunkToNmsChunk.getReturnType().getMethod("getWorld"); + nmsChunkGetWorld = MethodMapping.MC_CHUNK__GET_WORLD.getMethod(chunkToNmsChunk.getReturnType()); - Class blockPositionClass; try { craftBlockGetPosition = craftBlock.getClass().getMethod("getPosition"); - - blockPositionClass = craftBlockGetPosition.getReturnType(); } catch (NoSuchMethodException ignore) { - blockPositionClass = ClassMapping.BLOCK_POSITION.getClazz(); - - blockPositionConstructor = blockPositionClass.getConstructor(double.class, double.class, double.class); + blockPositionConstructor = ClassMapping.BLOCK_POSITION.getClazz().getConstructor(double.class, double.class, double.class); } - nmsWorldUpdateAdjacentComparators = nmsChunkGetWorld.getReturnType().getMethod("updateAdjacentComparators", blockPositionClass, ClassMapping.BLOCK.getClazz()); + nmsWorldUpdateAdjacentComparators = MethodMapping.WORLD__UPDATE_ADJACENT_COMPARATORS.getMethod(ClassMapping.WORLD.getClazz()); try { craftBlockBlockDataGetter = craftBlock.getClass().getMethod("getNMS"); @@ -419,11 +415,11 @@ public class BlockUtils { Class clazzChunk = ClassMapping.CHUNK.getClazz(); getHandle = clazzCraftWorld.getMethod("getHandle"); - getChunkAt = clazzWorld.getMethod("getChunkAt", int.class, int.class); + getChunkAt = MethodMapping.WORLD__GET_CHUNK_AT.getMethod(clazzWorld); if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_13)) { - getBlockData = clazzBlock.getMethod("getBlockData"); - setType = clazzChunk.getMethod("setType", clazzBlockPosition, clazzIBlockData, boolean.class); + getBlockData = MethodMapping.BLOCK__GET_BLOCK_DATA.getMethod(ClassMapping.BLOCK.getClazz()); + setType = MethodMapping.CHUNK__SET_BLOCK_STATE.getMethod(ClassMapping.CHUNK.getClazz()); } else { getByCombinedId = clazzBlock.getMethod("getByCombinedId", int.class); setType = clazzChunk.getMethod("a", clazzBlockPosition, clazzIBlockData);