2017-10-05 116 views
0

您好,我开始学习编写minecraft bukkit插件,只需几天,所以请不要责怪我,如果我的问题很蠢。我想创建一个新的MyPlayer类,它将是Player子类。我已经发现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?示例代码生成此问题:我在将播放器播放到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

代替extending一个Player,您应该创建一个围绕Bukkit的选手对象Wrapper,更具体包裹玩家的NameUUID(推荐),因为它是无法编辑Bukkit的Player实例没有很多的努力,它的实现是非常模糊的,你将无法将你的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 Player对象交互,则使用recoverPlayerObject


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