그래서 Reflection을 다시 사용하여 모든 버전의 게임에서 버전 종속 클래스 (Net Mincraft Server 일명 NMS)를 사용할 수있었습니다. 메소드에 문제가 생겼습니다. 오류가 무엇인지 알 수 없습니다.NMS : "개체가 선언 된 클래스의 인스턴스가 아닙니다."오류
public NPCReflection(UUID id, String name, World world) {
this.id = id;
this.name = name;
this.entityId = (int) Math.ceil(Math.random() * 1000) + 2000;
try {
Class<?> nmsServerClass = utils.getNMSClass("MinecraftServer");
Class<?> nmsWorldServerClass = utils.getNMSClass("WorldServer");
Class<?> obcCraftServerClass = utils.getOBCClass("CraftServer");
Class<?> obcCraftWorldClass = utils.getOBCClass("CraftWorld");
Class<?> nmsEntityPlayerClass = utils.getNMSClass("EntityPlayer");
Class<?> nmsPlayerInteractManager = utils.getNMSClass("PlayerInteractManager");
Class<?> obcServerClassInstance = obcCraftServerClass.cast(Bukkit.getServer()).getClass();
Object nmsServerInstance = obcServerClassInstance.getMethod("getServer").invoke(obcServerClassInstance);
Class<?> obcWorldClassInstance = obcCraftWorldClass.cast(world).getClass();
Object nmsWorldInstance = obcWorldClassInstance.getMethod("getHandle").invoke(obcWorldClassInstance);
Constructor<?> entityPlayerConstructor = nmsEntityPlayerClass.getConstructor(nmsServerClass, nmsWorldServerClass, GameProfile.class, nmsPlayerInteractManager);
Object entityPlayer = entityPlayerConstructor.newInstance(nmsServerInstance, nmsWorldInstance, new GameProfile(id, name), nmsPlayerInteractManager.getConstructor(nmsWorldServerClass).newInstance(nmsWorldInstance));
utils.setValue(entityPlayer, "a", entityId);
this.entityPlayer = entityPlayer;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
이것은 오류를주는 부분입니다. 더 정확하게이 2 줄.
Class<?> obcServerClassInstance = obcCraftServerClass.cast(Bukkit.getServer()).getClass();
Object nmsServerInstance = obcServerClassInstance.getMethod("getServer").invoke(obcServerClassInstance);
그리고 오류가 "객체가 선언 된 클래스의 인스턴스가 아닌"고 말하고 I는 (은 PC ATM에서하지 않음) 정확히 기억합니다.
하지만 bukkit.getServer는 Server 개체를 올바르게 반환하며 왜 그렇게하는지 알 수 없습니다.
리플렉션이없는 참조입니다.
Bukkit.getServer().getPluginManager().registerEvents(this, this);
MinecraftServer nmsServer = ((CraftServer) Bukkit.getServer()).getServer();
WorldServer nmsWorld = ((CraftWorld) Bukkit.getWorlds().get(0)).getHandle();
npc = new EntityPlayer(nmsServer, nmsWorld, new GameProfile(UUID.fromString("c793afb5-c4b7-4fdb-a100-b761315913c4"), "PogoStick29"), new PlayerInteractManager(nmsWorld));
문제는 게임의 여러 버전에서 작동하도록 할 수 있기를 바랍니다. 이것은 유일한 깨끗한 방법입니다. 또한 리플렉션없이 참조를 보았습니까? 그 수업을 캐스팅해야 해! – Nick