2017-02-04 10 views
1

パケットを作成しようとしています(bukkit API内)。ただし、NoSuchFieldExceptionを取得しました。Reflection、BukkitAPIを使用しているときのJava NoSuchFieldError

public class PacketPlayOutPlayerInfo { 
private static final Class<?> packetClass = Reflections.getCraftClass("PacketPlayOutPlayerInfo"); 
private static final Class<?>[] typesClass = new Class<?>[]{ String.class, boolean.class, int.class }; 
private static int type = 0; 

static { 
    try { 
     if (packetClass.getConstructor(typesClass) == null) { 
      type = 1; 
     } 
    } catch (Exception e) { 
     type = 1; 
    } 
} 

public static Object getPacket(String s, boolean b, int i) { 
    try { 
     if (type == 0) { 
      return packetClass.getConstructor(typesClass).newInstance(s, b, i); 
     } 
     else if (type == 1) { 
      Class<?> clazz = Reflections.getCraftClass("PacketPlayOutPlayerInfo"); 
      Object packet = packetClass.getConstructor().newInstance(); 
      Reflections.getPrivateField(clazz, "username").set(packet, s); 
      Reflections.getPrivateField(clazz, "gamemode").set(packet, 1); 
      Reflections.getPrivateField(clazz, "ping").set(packet, i); 
      Reflections.getPrivateField(clazz, "player").set(packet, new OfflineUser(s).getProfile()); 
      if (!b) { 
       Reflections.getPrivateField(clazz, "action").set(packet, 4); 
      } 
      return packet; 
     } 
    } catch (Exception e) { 
     if (FunnyGuilds.exception(e.getCause())) { 
      e.printStackTrace(); 
     } 
    } 
    return null; 
} 

}

Here`sフルエラー:

 
[20:25:43] [IndependentThread/WARN]: java.lang.NoSuchFieldException: username 
[20:25:43] [IndependentThread/WARN]: at java.lang.Class.getDeclaredField(Unknown Source) 
[20:25:43] [IndependentThread/WARN]: at net.dzikoysk.funnyguilds.util.reflect.Reflections.getPrivateField(Reflections.java:123) 
[20:25:43] [IndependentThread/WARN]: at net.dzikoysk.funnyguilds.util.reflect.transition.PacketPlayOutPlayerInfo.getPacket(PacketPlayOutPlayerInfo.java:31) 
[20:25:43] [IndependentThread/WARN]: at net.dzikoysk.funnyguilds.util.element.PlayerListManager.packets(PlayerListManager.java:88) 
[20:25:43] [IndependentThread/WARN]: at net.dzikoysk.funnyguilds.util.element.PlayerListManager.send(PlayerListManager.java:67) 
[20:25:43] [IndependentThread/WARN]: at net.dzikoysk.funnyguilds.util.element.PlayerList.send(PlayerList.java:160) 
[20:25:43] [IndependentThread/WARN]: at net.dzikoysk.funnyguilds.util.element.PlayerListManager.updatePlayers(PlayerListManager.java:24) 
[20:25:43] [IndependentThread/WARN]: at net.dzikoysk.funnyguilds.util.thread.Action.execute(Action.java:37) 
[20:25:43] [IndependentThread/WARN]: at net.dzikoysk.funnyguilds.util.thread.IndependentThread.execute(IndependentThread.java:43) 
[20:25:43] [IndependentThread/WARN]: at net.dzikoysk.funnyguilds.util.thread.IndependentThread.run(IndependentThread.java:28) 
[20:25:43] [IndependentThread/WARN]: java.lang.NullPointerException 
[20:25:43] [IndependentThread/WARN]: at net.dzikoysk.funnyguilds.util.reflect.transition.PacketPlayOutPlayerInfo.getPacket(PacketPlayOutPlayerInfo.java:31) 
[20:25:43] [IndependentThread/WARN]: at net.dzikoysk.funnyguilds.util.element.PlayerListManager.packets(PlayerListManager.java:88) 
[20:25:43] [IndependentThread/WARN]: at net.dzikoysk.funnyguilds.util.element.PlayerListManager.send(PlayerListManager.java:67) 
[20:25:43] [IndependentThread/WARN]: at net.dzikoysk.funnyguilds.util.element.PlayerList.send(PlayerList.java:160) 
[20:25:43] [IndependentThread/WARN]: at net.dzikoysk.funnyguilds.util.element.PlayerListManager.updatePlayers(PlayerListManager.java:24) 
[20:25:43] [IndependentThread/WARN]: at net.dzikoysk.funnyguilds.util.thread.Action.execute(Action.java:37) 
[20:25:43] [IndependentThread/WARN]: at net.dzikoysk.funnyguilds.util.thread.IndependentThread.execute(IndependentThread.java:43) 
[20:25:43] [IndependentThread/WARN]: at net.dzikoysk.funnyguilds.util.thread.IndependentThread.run(IndependentThread.java:28) 

PS:私の悪い英語のため申し訳ありません。

答えて

0

私はあなたがオブジェクトの変数名を要求していることを確認する必要があります(あなたの変数はラクダの大文字小文字にする必要があります)。 API呼び出しでは、api doc内の名前を正確に要求する必要があります。

1

PacketPlayOutPlayerInfoには、アクセスしようとしているフィールドが定義されていないため、例外は適切なようです。フィールド名を選択すると、PacketPlayOutPlayerInfo.PlayerInfoDataの値を設定しようとしている可能性があります。そうであっても、そのフィールド名は難読化されており、その情報をそのコンストラクターの一部として渡さない限り、そのように指定する必要があります。デコンパイルした独自のコードにアクセスすると、この問題への懸念自体は

、私はこれらの提案を残すだろう:それは管理に来るとき、それはすでに重い物を持ち上げるのほとんどがそうであるように

  • は、ProtocolLibをよく理解しますおよび調整パケット。
  • 手の汚れやDIYを手に入れたい場合は、ProtocolLibのソースをGitHubで調べてください。
  • Minecraftクラスの詳細については、SpigotのBuildToolを使用することをお勧めします。ビルドプロセスの副作用は、Minecraftのクラス(この情報は、あなたが適切に反射がクラスと変更されたフィールドをインスタンス化するために呼び出しを実装するのに役立ちます。work/decompileXXX/net/minecraft/serverディレクトリその下を参照してください。

In older versions of bukkitapi(1.6-1.7) this code works great.

To use ProtocolLib i must edit many of code. Thic exception is caused by this class or other?

PacketPlayOutPlayerInfoを逆コンパイルしている1.8に変更し、し続けました。私は1.8(最も遠くに戻ることができる)と1.11.2バージョンを見て、違いの世界があります。それはAPIの一部ではないクラスで働く問題です。コードがMinecraftの外で壊れると涙が出るでしょう。

ProtocolLibも壊れているかもしれませんが、経験豊富な開発者はすぐに修正します。彼らは、多くのプラグインが新しいMinecraftのリリースで厄介な驚きを避けるためにそれを使用するので、彼らはしなければなりません。 ProtocolLibがあなたのお茶でない場合は、BuildToolsの使用を推奨し、逆コンパイルクラスを調べ、それに従ってコードを調整してください。 Minecraft Modernをクリックすると、良いことになります。

+0

古いバージョンのbukkitapi(1.6-1.7)では、このコードはうまく機能します。 – PrzemoVi

+0

ProtocolLibを使用するには、多くのコードを編集する必要があります。 Thicの例外はこのクラスか他のものによって引き起こされますか? – PrzemoVi

+0

@PrzemoViこれをコメントにするための文字が足りないので、上記の答えに追加します。 – Frelling

関連する問題