代码之家  ›  专栏  ›  技术社区  ›  jinpachi23

我有一个问题,我的球员铸造一个我的球员

  •  0
  • jinpachi23  · 技术社区  · 7 年前

    你好,我刚开始学习编写minecraft bukkit插件,所以如果我的问题是stiupid,请不要责怪我。我想创建一个新的MyPlayer类,它将是Player子类。我已经知道玩家的根是组织。布基特。克拉夫布基特。v1\u 12\u R1。实体所以我可以这样想: public class OticPlayer extends org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer . 我希望我的类包含他所有的父方法,但添加一些它自己的方法。问题是当我使用: Bukkit.getPlayerExact(arg3[1]) 它返回对播放器类型对象的引用。我有一堂带方法的大堂课 addPlayer(MyPlayer arg0) ,所以我需要一个对MyPlayer类型对象的引用,而不是Player。当我尝试将玩家类型引用转换为MyPlayer时,会抛出一个异常: java.lang.ClassCastException: org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer cannot be cast to me.gtddd.my.MyPlayer . 我需要将MyPlayer类型引用传递给addPlayer()方法,因为我想建立某种统计系统(K/D/A),这些统计数据中的每一个都必须是一个可以被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());
        }
    }
    

    我费了很大劲才找到答案,但我想不出什么能让我满意。从顶部:感谢所有的答案!如果有人认为不清楚,请询问。

    1 回复  |  直到 7 年前
        1
  •  1
  •   LeoColman    7 年前

    而不是 extending Player ,您应该创建一个 Wrapper 围绕Bukkit的玩家对象,更具体地说是围绕玩家的 Name UUID (推荐)按原样 不费吹灰之力就无法编辑Bukkit的玩家实例 ,它的实现非常模糊,您将无法包括您的 MyPlayer 在Bukkit的服务器中。


    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);
       }
    

    如果你想为玩家添加杀戮,然后传送他,你可以使用你的 实例来修改玩家的属性,并使用 recoverPlayerObject 如果你需要直接与Bukkit互动 对象


    有关包装器/装饰器的更多信息,Iluwatar有一个非常好的 Github repository 关于设计模式,包括装饰器。