From e1ec756af992e40c891b067b3e4a8191e61a2cdb Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Wed, 20 Mar 2024 05:37:43 +0100 Subject: [PATCH 1/5] Fix gradlew script execute permissions --- gradlew | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 gradlew diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 From d5368292293c4a037f9777530ff724bda7a606d3 Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Wed, 20 Mar 2024 13:17:34 +0100 Subject: [PATCH 2/5] Try getting PLAYER_MODEL_PARTS TrackedData id dynamically --- .../gonalez/znpcs/cache/CacheRegistry.java | 71 ++++++++++++++++++- .../io/github/gonalez/znpcs/npc/NPCSkin.java | 8 +++ 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/bukkit/src/main/java/io/github/gonalez/znpcs/cache/CacheRegistry.java b/bukkit/src/main/java/io/github/gonalez/znpcs/cache/CacheRegistry.java index d0847ec..45e431f 100644 --- a/bukkit/src/main/java/io/github/gonalez/znpcs/cache/CacheRegistry.java +++ b/bukkit/src/main/java/io/github/gonalez/znpcs/cache/CacheRegistry.java @@ -351,6 +351,11 @@ public final class CacheRegistry { .withCategory(CacheCategory.SYNCHER) .withClassName("DataWatcherSerializer"))).load(); + + public static final Class TRACKED_DATA = (new TypeCache.BaseCache.ClazzLoader((new TypeCache.CacheBuilder(CachePackage.MINECRAFT_SERVER)) + + .withCategory(CacheCategory.SYNCHER) + .withClassName("TRACKED_DATA"))).load(); public static final Class WORLD_CLASS = (new TypeCache.BaseCache.ClazzLoader((new TypeCache.CacheBuilder(CachePackage.MINECRAFT_SERVER)) @@ -591,6 +596,70 @@ public final class CacheRegistry { .withCategory(CacheCategory.ENTITY) .withClassName(ENTITY_HUMAN_CLASS) .withExpectResult(GameProfile.class)); + + public static final String PLAYER_MODEL_PARTS_BIN_NAME; + static { + switch (Utils.getBukkitPackage()){ + case "v1_15R1": + case "v1_15R2": + case "v1_16R1": + PLAYER_MODEL_PARTS_BIN_NAME = "bq"; + break; + case "v1_16R2": + case "v1_16R3": + case "v1_16R4": + case "v1_16R5": + PLAYER_MODEL_PARTS_BIN_NAME = "bi"; + break; + case "v1_17R1": + PLAYER_MODEL_PARTS_BIN_NAME = "bP"; + break; + case "v1_18R1": + PLAYER_MODEL_PARTS_BIN_NAME = "bQ"; + break; + case "v1_18R2": + //noinspection DuplicateBranchesInSwitch + PLAYER_MODEL_PARTS_BIN_NAME = "bP"; + break; + case "v1_19R1": + case "v1_19R2": + case "v1_19R3": + PLAYER_MODEL_PARTS_BIN_NAME = "bO"; + break; + case "v1_19R4": + PLAYER_MODEL_PARTS_BIN_NAME = "bJ"; + break; + case "v1_20R1": + PLAYER_MODEL_PARTS_BIN_NAME = "bL"; + break; + case "v1_20R2": + case "v1_20R3": + PLAYER_MODEL_PARTS_BIN_NAME = "bM"; + break; + default: + PLAYER_MODEL_PARTS_BIN_NAME = null; + break; + } + if (PLAYER_MODEL_PARTS_BIN_NAME != null){ + GET_PLAYER_MODEL_PARTS = new TypeCache.BaseCache.FieldLoader((new TypeCache.CacheBuilder(CachePackage.MINECRAFT_SERVER)) + + .withCategory(CacheCategory.ENTITY) + .withFieldName("PLAYER_MODEL_PARTS") + .withFieldName(PLAYER_MODEL_PARTS_BIN_NAME) + .withExpectResult(TRACKED_DATA) + .withClassName(ENTITY_HUMAN_CLASS)); + } else { + GET_PLAYER_MODEL_PARTS = null; + } + } + public static final TypeCache.BaseCache GET_PLAYER_MODEL_PARTS; + public static final TypeCache.BaseCache GET_TRACKED_DATA_ID = new TypeCache.BaseCache.MethodLoader((new TypeCache.CacheBuilder(CachePackage.MINECRAFT_SERVER)) + + .withCategory(CacheCategory.SYNCHER) + .withClassName(TRACKED_DATA) + .withMethodName("getId") + .withMethodName("a") + .withExpectResult(int.class)); public static final TypeCache.BaseCache GET_ENTITY_ID = new TypeCache.BaseCache.MethodLoader((new TypeCache.CacheBuilder(CachePackage.MINECRAFT_SERVER)) @@ -753,7 +822,7 @@ public final class CacheRegistry { public static final TypeCache.BaseCache GET_DATAWATCHER_B_LIST = new TypeCache.BaseCache.MethodLoader((new TypeCache.CacheBuilder(CachePackage.MINECRAFT_SERVER)) .withCategory(CacheCategory.PACKET) - .withMethodName("c") + .withMethodName("c") .withClassName(DATA_WATCHER_CLASS)); public static final TypeCache.BaseCache PLAYER_CONNECTION_FIELD = new TypeCache.BaseCache.FieldLoader((new TypeCache.CacheBuilder(CachePackage.MINECRAFT_SERVER)) diff --git a/bukkit/src/main/java/io/github/gonalez/znpcs/npc/NPCSkin.java b/bukkit/src/main/java/io/github/gonalez/znpcs/npc/NPCSkin.java index 9730115..82acad4 100644 --- a/bukkit/src/main/java/io/github/gonalez/znpcs/npc/NPCSkin.java +++ b/bukkit/src/main/java/io/github/gonalez/znpcs/npc/NPCSkin.java @@ -1,5 +1,6 @@ package io.github.gonalez.znpcs.npc; +import io.github.gonalez.znpcs.cache.CacheRegistry; import io.github.gonalez.znpcs.skin.SkinFetcherBuilder; import io.github.gonalez.znpcs.skin.SkinFetcherResult; import io.github.gonalez.znpcs.utility.Utils; @@ -58,6 +59,13 @@ enum SkinLayerValues { } static int findLayerByVersion() { + try{ + if (CacheRegistry.GET_PLAYER_MODEL_PARTS != null){ + //for static field's null is okay + return (int) CacheRegistry.GET_TRACKED_DATA_ID.load().invoke(CacheRegistry.GET_PLAYER_MODEL_PARTS.load().get(null)); + } + }catch (Throwable ignored){} //Some error occurred. maybe the field did not exist? + int value = V8.layerValue; for (SkinLayerValues skinLayerValue : values()) { if (Utils.BUKKIT_VERSION >= skinLayerValue.minVersion) From 362e61e77b5379cce5612959e3d6283688e4e397 Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Wed, 20 Mar 2024 14:01:45 +0100 Subject: [PATCH 3/5] the fields shifted in 1.20 --- .../main/java/io/github/gonalez/znpcs/cache/CacheRegistry.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bukkit/src/main/java/io/github/gonalez/znpcs/cache/CacheRegistry.java b/bukkit/src/main/java/io/github/gonalez/znpcs/cache/CacheRegistry.java index 45e431f..07e2414 100644 --- a/bukkit/src/main/java/io/github/gonalez/znpcs/cache/CacheRegistry.java +++ b/bukkit/src/main/java/io/github/gonalez/znpcs/cache/CacheRegistry.java @@ -829,7 +829,7 @@ public final class CacheRegistry { .withCategory(CacheCategory.SERVER_LEVEL) .withClassName(ENTITY_PLAYER_CLASS) - .withFieldName((Utils.BUKKIT_VERSION > 16) ? "b" : "playerConnection")); + .withFieldName((Utils.BUKKIT_VERSION > 16) ? ((Utils.BUKKIT_VERSION >= 20) ? "c" : "b") : "playerConnection")); public static final TypeCache.BaseCache NETWORK_MANAGER_FIELD = new TypeCache.BaseCache.FieldLoader((new TypeCache.CacheBuilder(CachePackage.MINECRAFT_SERVER)) From 549fce4dc1e49d38b2cdce57479a5356b7e8b546 Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Wed, 20 Mar 2024 17:54:54 +0100 Subject: [PATCH 4/5] The Warden class has always been called Warden At least according to my generated mappings at: https://github.com/kettingpowered/Ketting-1-20-x/tree/mappings/mappings --- .../main/java/io/github/gonalez/znpcs/cache/CacheRegistry.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bukkit/src/main/java/io/github/gonalez/znpcs/cache/CacheRegistry.java b/bukkit/src/main/java/io/github/gonalez/znpcs/cache/CacheRegistry.java index 07e2414..7491f1d 100644 --- a/bukkit/src/main/java/io/github/gonalez/znpcs/cache/CacheRegistry.java +++ b/bukkit/src/main/java/io/github/gonalez/znpcs/cache/CacheRegistry.java @@ -174,7 +174,7 @@ public final class CacheRegistry { .withCategory(CacheCategory.ENTITY) .withAdditionalData("monster.warden") - .withClassName("EntityWarden"))).load(); + .withClassName("Warden"))).load(); public static final Class ENTITY_BEE_CLASS = (new TypeCache.BaseCache.ClazzLoader((new TypeCache.CacheBuilder(CachePackage.MINECRAFT_SERVER)) From 04cefcd5b6285ba4ab9c92d5a66e17d27afad68e Mon Sep 17 00:00:00 2001 From: C0D3 M4513R <28912031+C0D3-M4513R@users.noreply.github.com> Date: Wed, 20 Mar 2024 17:57:29 +0100 Subject: [PATCH 5/5] Fixup dynamic DataWatcherObject id grabbing --- .../gonalez/znpcs/cache/CacheRegistry.java | 28 +++++++++++++------ .../io/github/gonalez/znpcs/npc/NPCSkin.java | 17 +++++++---- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/bukkit/src/main/java/io/github/gonalez/znpcs/cache/CacheRegistry.java b/bukkit/src/main/java/io/github/gonalez/znpcs/cache/CacheRegistry.java index 7491f1d..8e829a3 100644 --- a/bukkit/src/main/java/io/github/gonalez/znpcs/cache/CacheRegistry.java +++ b/bukkit/src/main/java/io/github/gonalez/znpcs/cache/CacheRegistry.java @@ -351,11 +351,6 @@ public final class CacheRegistry { .withCategory(CacheCategory.SYNCHER) .withClassName("DataWatcherSerializer"))).load(); - - public static final Class TRACKED_DATA = (new TypeCache.BaseCache.ClazzLoader((new TypeCache.CacheBuilder(CachePackage.MINECRAFT_SERVER)) - - .withCategory(CacheCategory.SYNCHER) - .withClassName("TRACKED_DATA"))).load(); public static final Class WORLD_CLASS = (new TypeCache.BaseCache.ClazzLoader((new TypeCache.CacheBuilder(CachePackage.MINECRAFT_SERVER)) @@ -601,52 +596,67 @@ public final class CacheRegistry { static { switch (Utils.getBukkitPackage()){ case "v1_15R1": + case "v1_15_R1": case "v1_15R2": + case "v1_15_R2": case "v1_16R1": + case "v1_16_R1": PLAYER_MODEL_PARTS_BIN_NAME = "bq"; break; case "v1_16R2": + case "v1_16_R2": case "v1_16R3": + case "v1_16_R3": case "v1_16R4": + case "v1_16_R4": case "v1_16R5": + case "v1_16_R5": PLAYER_MODEL_PARTS_BIN_NAME = "bi"; break; case "v1_17R1": + case "v1_17_R1": PLAYER_MODEL_PARTS_BIN_NAME = "bP"; break; case "v1_18R1": + case "v1_18_R1": PLAYER_MODEL_PARTS_BIN_NAME = "bQ"; break; case "v1_18R2": + case "v1_18_R2": //noinspection DuplicateBranchesInSwitch PLAYER_MODEL_PARTS_BIN_NAME = "bP"; break; case "v1_19R1": + case "v1_19_R1": case "v1_19R2": + case "v1_19_R2": case "v1_19R3": + case "v1_19_R3": PLAYER_MODEL_PARTS_BIN_NAME = "bO"; break; case "v1_19R4": + case "v1_19_R4": PLAYER_MODEL_PARTS_BIN_NAME = "bJ"; break; case "v1_20R1": + case "v1_20_R1": PLAYER_MODEL_PARTS_BIN_NAME = "bL"; break; case "v1_20R2": + case "v1_20_R2": case "v1_20R3": + case "v1_20_R3": PLAYER_MODEL_PARTS_BIN_NAME = "bM"; break; default: - PLAYER_MODEL_PARTS_BIN_NAME = null; + PLAYER_MODEL_PARTS_BIN_NAME = "PLAYER_MODEL_PARTS"; break; } if (PLAYER_MODEL_PARTS_BIN_NAME != null){ GET_PLAYER_MODEL_PARTS = new TypeCache.BaseCache.FieldLoader((new TypeCache.CacheBuilder(CachePackage.MINECRAFT_SERVER)) .withCategory(CacheCategory.ENTITY) - .withFieldName("PLAYER_MODEL_PARTS") .withFieldName(PLAYER_MODEL_PARTS_BIN_NAME) - .withExpectResult(TRACKED_DATA) .withClassName(ENTITY_HUMAN_CLASS)); } else { GET_PLAYER_MODEL_PARTS = null; @@ -656,7 +666,7 @@ public final class CacheRegistry { public static final TypeCache.BaseCache GET_TRACKED_DATA_ID = new TypeCache.BaseCache.MethodLoader((new TypeCache.CacheBuilder(CachePackage.MINECRAFT_SERVER)) .withCategory(CacheCategory.SYNCHER) - .withClassName(TRACKED_DATA) + .withClassName(DATA_WATCHER_OBJECT) .withMethodName("getId") .withMethodName("a") .withExpectResult(int.class)); diff --git a/bukkit/src/main/java/io/github/gonalez/znpcs/npc/NPCSkin.java b/bukkit/src/main/java/io/github/gonalez/znpcs/npc/NPCSkin.java index 82acad4..c49fab5 100644 --- a/bukkit/src/main/java/io/github/gonalez/znpcs/npc/NPCSkin.java +++ b/bukkit/src/main/java/io/github/gonalez/znpcs/npc/NPCSkin.java @@ -5,11 +5,12 @@ import io.github.gonalez.znpcs.skin.SkinFetcherResult; import io.github.gonalez.znpcs.utility.Utils; +import java.util.Objects; +import java.util.logging.Level; + public class NPCSkin { private static final String[] EMPTY_ARRAY = new String[] { "", "" }; - private static final int LAYER_INDEX = SkinLayerValues.findLayerByVersion(); - private final String texture; private final String signature; @@ -30,7 +31,7 @@ public String getSignature() { } public int getLayerIndex() { - return LAYER_INDEX; + return SkinLayerValues.findLayerByVersion(); } public static NPCSkin forValues(String... values) { @@ -62,9 +63,15 @@ static int findLayerByVersion() { try{ if (CacheRegistry.GET_PLAYER_MODEL_PARTS != null){ //for static field's null is okay - return (int) CacheRegistry.GET_TRACKED_DATA_ID.load().invoke(CacheRegistry.GET_PLAYER_MODEL_PARTS.load().get(null)); + Object playerModelParts = CacheRegistry.GET_PLAYER_MODEL_PARTS.load().get(null); + return (int) CacheRegistry.GET_TRACKED_DATA_ID.load().invoke(Objects.requireNonNull(playerModelParts)); + }else{ + ((java.util.logging.Logger)org.bukkit.Bukkit.getServer().getLogger()).log(Level.INFO, "CacheRegistry.GET_PLAYER_MODEL_PARTS was null. " + Utils.getBukkitPackage()+ ", " +Utils.BUKKIT_VERSION); } - }catch (Throwable ignored){} //Some error occurred. maybe the field did not exist? + }catch (Throwable throwable){ + org.bukkit.Bukkit.getServer().getLogger().log(Level.INFO, "Could not get Dynamic Layer Id of PlayerModel entitydata", new RuntimeException(throwable)); + } //Some error occurred. maybe the field did not exist? + org.bukkit.Bukkit.getServer().getLogger().log(Level.INFO, "Falling back to hardcoded values."); int value = V8.layerValue; for (SkinLayerValues skinLayerValue : values()) {