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..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 @@ -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)) @@ -591,6 +591,85 @@ 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_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 = "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_BIN_NAME) + .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(DATA_WATCHER_OBJECT) + .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,14 +832,14 @@ 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)) .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)) 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..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 @@ -1,14 +1,16 @@ 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; +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; @@ -29,7 +31,7 @@ public String getSignature() { } public int getLayerIndex() { - return LAYER_INDEX; + return SkinLayerValues.findLayerByVersion(); } public static NPCSkin forValues(String... values) { @@ -58,6 +60,19 @@ enum SkinLayerValues { } static int findLayerByVersion() { + try{ + if (CacheRegistry.GET_PLAYER_MODEL_PARTS != null){ + //for static field's null is okay + 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 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()) { if (Utils.BUKKIT_VERSION >= skinLayerValue.minVersion) diff --git a/gradlew b/gradlew old mode 100644 new mode 100755