2017-10-05 3 views
0

こんにちは、マイケルバケットのプラグインプラグインを数日で済ませることを学び始めたので、問題が解決しない場合は私を責めないでください。 Playerサブクラスになる新しいMyPlayerクラスを作成したいと思います。私はすでにPlayerのルートがorg.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayerであることを理解しているので、このようなsomethinkを作ることができます:public class OticPlayer extends org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer。 MyClassにすべての親メソッドを含めるには、独自のメソッドをいくつか追加します。問題は私が使用する場合です:Bukkit.getPlayerExact(arg3[1]) Player型オブジェクトへの参照を返します。私はメソッドaddPlayer(MyPlayer arg0)を持つLobbyクラスを持っているので、PlayerではなくMyPlayerタイプのオブジェクトへの参照が必要です。 Player型参照をMyPlayerにキャストしようとすると、例外がスローされます:java.lang.ClassCastException: org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer cannot be cast to me.gtddd.my.MyPlayer私はいくつかの種類の統計システム(K/D/A)を作成したいので、MyPlayer型参照をaddPlayer()メソッドに渡す必要があります。これらの統計はそれぞれMyPlayer型オブジェクトによってアクセス可能なプールでなければなりません。 PlayerをMyPlayerにキャストするにはどうしたらいいですか?この問題を発生させる例コード:PlayerをMyPlayerにキャストする際に問題が発生しました

package test; 

import org.bukkit.Bukkit; 
import org.bukkit.craftbukkit.v1_12_R1.CraftServer; 
import org.bukkit.plugin.java.JavaPlugin; 

import me.gtddd.otic.OticPlayer; 
import net.minecraft.server.v1_12_R1.EntityPlayer; 

public class MyPlayer extends org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer { 
    public MyPlayer(CraftServer server, EntityPlayer entity) { 
     super(server, entity); 
    } 

    int kills = 0; 
    int deaths = 0; 
    int assists = 0; 

    public int getKda() { 
     return kills/deaths/assists; 
    } 
} 

public class Lobby { 
    MyPlayer[] players = new MyPlayer[10]; 

    public void addPlayer(MyPlayer arg0) { 
     players[players.length] = arg0; 
    } 

    public MyPlayer getPlayer(int slot) { 
     return players[slot-1]; 
    } 
} 




public class Main extends JavaPlugin { 
    @Override 
    public void onEnable() { 
     Lobby lobby1 = new Lobby(); 
     MyPlayer player = (MyPlayer) Bukkit.getPlayerExact("Notch"); 
     lobby1.addPlayer(player); 
     System.out.println(lobby1.getPlayer(1).getKda()); 
    } 
} 

は、私は答えを見つけるために多くのことを見て、私は私を満足させるだろうかanythinkを見つけることができませんでした。上から:すべてのお返事ありがとう!何かが不明な場合は質問してください。

答えて

1

代わりのextendingPlayerそれは努力があまりなくBukkitのプレーヤーインスタンスを編集することができないとして、あなたは(推奨)、より具体的にプレイヤーのNameUUIDを包む、Bukkitのプレーヤーオブジェクトの周りWrapperを作成する必要があり、実装は非常にわかりにくく、MyPlayerをBukkitのサーバに含めることはできません。


したがって、たとえば、次のようMyPlayerを作成することができます。

class MyPlayer { 
    private String playerName; 

    public MyPlayer(Player player) { 
     playerName = player.getDisplayName(); //Something like this to store the player 
    } 
    //More of your code, for example counting the kills 

    public Player recoverPlayerObject() { 
     return Bukkit.getPlayer(playerName); 
    } 

そして、あなたがプレイヤーにキルを追加した後、彼をテレポートのようなものをしたい場合は、あなたが使用することができますあなたのMyPlayerインスタンスは選手の属性を変更し、recoverPlayerObjectを使用すると、Bukkit Playerオブジェクトと直接対話する必要があります。


はラッパー/デコレータの詳細については、Iluwatarはデコレーターを含むデザインパターン、およそGithub repository非常に素晴らしいがあります。

関連する問題