したがって、バージョン依存クラス(Net Mincraft Server、別名NMS)を作成するためにReflectionを再度使用しようとしました。私は方法の問題に遭遇し、私はエラーが何であるか把握できません。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);
とエラーが、私は(ない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