将Player播放到MyPlayer时遇到问题

时间:2017-10-05 16:55:40

标签: minecraft bukkit

您好我开始学习编写Minecraft bukkit插件只需几天,所以如果我的问题很糟糕,请不要责怪我。我想创建一个新的MyPlayer类,它将是Player子类。我已经发现玩家的根是org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer所以我可以这样思考:public class OticPlayer extends org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer。我希望MyClass包含他所有的父方法,但添加一些它自己的方法。问题是当我使用:Bukkit.getPlayerExact(arg3[1])时它返回对Player类型对象的引用。我有一个方法addPlayer(MyPlayer arg0)的Lobby类,所以我需要一个对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类型对象访问的池。那么如何将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());
    }
}

我看了很多找到答案,但我无法找到任何能让我满意的东西。从顶部:感谢所有答案!如果有些想法不清楚,请问。

1 个答案:

答案 0 :(得分:1)

而不是extendingPlayer ,您应该围绕Bukkit的播放器对象创建Wrapper,更具体地说,包装播放器' s NameUUID(推荐),因为无法轻松编辑Bukkit的播放器实例,它是' s实施非常模糊,您无法将您的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实例修改你的玩家'属性,如果需要直接与Bukkit recoverPlayerObject对象进行交互,则使用Player

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