您好我开始学习编写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());
}
}
我看了很多找到答案,但我无法找到任何能让我满意的东西。从顶部:感谢所有答案!如果有些想法不清楚,请问。
答案 0 :(得分:1)
而不是extending
和Player
,您应该围绕Bukkit的播放器对象创建Wrapper
,更具体地说,包装播放器' s Name
或UUID
(推荐),因为无法轻松编辑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关于设计模式,包括装饰器。