Archiviert
13
0

Fix villager data breaking versions below 1.14

Dieser Commit ist enthalten in:
Dan Mulloy 2019-10-30 12:02:15 -04:00
Ursprung 59c8c8c9db
Commit 84e31d032b
2 geänderte Dateien mit 23 neuen und 10 gelöschten Zeilen

Datei anzeigen

@ -2025,7 +2025,7 @@ public class MinecraftReflection {
.orElseThrow(() -> new RuntimeException("Failed to find NMS class: " + className)); .orElseThrow(() -> new RuntimeException("Failed to find NMS class: " + className));
} }
static Class<?> getNullableNMS(String className) { public static Class<?> getNullableNMS(String className) {
if (minecraftPackage == null) if (minecraftPackage == null)
minecraftPackage = new CachedPackage(getMinecraftPackage(), getClassSource()); minecraftPackage = new CachedPackage(getMinecraftPackage(), getClassSource());
return minecraftPackage.getPackageClass(className).orElse(null); return minecraftPackage.getPackageClass(className).orElse(null);

Datei anzeigen

@ -3,24 +3,32 @@ package com.comphenix.protocol.wrappers;
import com.comphenix.protocol.reflect.EquivalentConverter; import com.comphenix.protocol.reflect.EquivalentConverter;
import com.comphenix.protocol.reflect.StructureModifier; import com.comphenix.protocol.reflect.StructureModifier;
import com.comphenix.protocol.reflect.accessors.Accessors; import com.comphenix.protocol.reflect.accessors.Accessors;
import com.comphenix.protocol.reflect.accessors.ConstructorAccessor;
import com.comphenix.protocol.utility.MinecraftReflection; import com.comphenix.protocol.utility.MinecraftReflection;
public class WrappedVillagerData extends AbstractWrapper implements ClonableWrapper { public class WrappedVillagerData extends AbstractWrapper implements ClonableWrapper {
private static final Class<?> NMS_CLASS = MinecraftReflection.getMinecraftClass("VillagerData"); private static final Class<?> NMS_CLASS = MinecraftReflection.getNullableNMS("VillagerData");
private static final Class<?> TYPE_CLASS = MinecraftReflection.getMinecraftClass("VillagerType"); private static final Class<?> TYPE_CLASS = MinecraftReflection.getNullableNMS("VillagerType");
private static final Class<?> PROF_CLASS = MinecraftReflection.getMinecraftClass("VillagerProfession"); private static final Class<?> PROF_CLASS = MinecraftReflection.getNullableNMS("VillagerProfession");
private static final EquivalentConverter<Type> TYPE_CONVERTER = new EnumWrappers.FauxEnumConverter<>(Type.class, TYPE_CLASS); private static EquivalentConverter<Type> TYPE_CONVERTER;
private static final EquivalentConverter<Profession> PROF_CONVERTER = new EnumWrappers.FauxEnumConverter<>(Profession.class, PROF_CLASS); private static EquivalentConverter<Profession> PROF_CONVERTER;
static {
if (NMS_CLASS != null) {
TYPE_CONVERTER = new EnumWrappers.FauxEnumConverter<>(Type.class, TYPE_CLASS);
PROF_CONVERTER = new EnumWrappers.FauxEnumConverter<>(Profession.class, PROF_CLASS);
}
}
public enum Type { public enum Type {
DESERT, JUNGLE, PLAINS, SAVANNA, SNOW, SWAMP, TAIGA; DESERT, JUNGLE, PLAINS, SAVANNA, SNOW, SWAMP, TAIGA
} }
public enum Profession { public enum Profession {
NONE, ARMORER, BUTCHER, CARTOGRAPHER, CLERIC, FARMER, FISHERMAN, NONE, ARMORER, BUTCHER, CARTOGRAPHER, CLERIC, FARMER, FISHERMAN,
FLETCHER, LEATHERWORKER, LIBRARIAN, MASON, NITWIT, SHEPHERD, FLETCHER, LEATHERWORKER, LIBRARIAN, MASON, NITWIT, SHEPHERD,
TOOLSMITH, WEAPONSMITH; TOOLSMITH, WEAPONSMITH
} }
private StructureModifier<Object> modifier; private StructureModifier<Object> modifier;
@ -36,12 +44,17 @@ public class WrappedVillagerData extends AbstractWrapper implements ClonableWrap
return new WrappedVillagerData(handle); return new WrappedVillagerData(handle);
} }
private static ConstructorAccessor CONSTRUCTOR;
public static WrappedVillagerData fromValues(Type type, Profession profession, int level) { public static WrappedVillagerData fromValues(Type type, Profession profession, int level) {
Object genericType = TYPE_CONVERTER.getGeneric(type); Object genericType = TYPE_CONVERTER.getGeneric(type);
Object genericProf = PROF_CONVERTER.getGeneric(profession); Object genericProf = PROF_CONVERTER.getGeneric(profession);
Object handle = Accessors.getConstructorAccessor(NMS_CLASS, TYPE_CLASS, PROF_CLASS, int.class) if (CONSTRUCTOR == null) {
.invoke(genericType, genericProf, level); CONSTRUCTOR = Accessors.getConstructorAccessor(NMS_CLASS, TYPE_CLASS, PROF_CLASS, int.class);
}
Object handle = CONSTRUCTOR.invoke(genericType, genericProf, level);
return fromHandle(handle); return fromHandle(handle);
} }