2016-04-04 94 views
0

嗨,我想知道我怎么可能存储玩家数据?我需要额外的课程吗?我需要某个代码吗?我不知道如何做到这一点,如果有人可以帮助,将不胜感激!我想存储数据,因此如果玩家选择了一个套件,他们就不能选择另一个套件。Bukkit如何存储数据

+0

你的意思是你想写在一个文件例如'playername:kitname'? – Nightfighter001

+0

是的,我可以检测他们是否可以使用其他套件。 – CodeIsCool

回答

1

如果您想存储用户正在使用的临时存储套件,可以使用带有玩家UUID和套件的地图。例如​​假设您的套件有它自己的对象。然后,当他们试图挑选另一个时,只检查他们是否在Map中,如果他们发送了一条消息,如果不添加它们。

如果你想要更多的永久存储,你需要将它存储在一个文件中。

+0

基本上我想这样做,所以玩家可以选择一个套件,只选择一个,如果他们死了,然后他们可以选择另一个,我想我需要一个PlayerDeathEvent的侦听器,但是我需要一个特定类的hashmap /地图? – CodeIsCool

+1

你确实需要听取死亡。一旦他们死亡,将他们从地图上移除。不,你不需要某个班级,它可以上任何班级。只要确保不是静态滥用。 – bwfcwalshy

-3

所以,你只是说当玩家选择一个套件时,他们将不能再次选择套件,除非他们死亡。一个简单的解决方案是将其存储在一个数组中。我个人使用Arraylists,这样我就可以随时为每个玩家存储数据。

举例来说。你想创建一个名为kitTrue的新Arraylist,你需要使用这个方法。

ArrayList<Player> kitTrue = new ArrayList<Player>(); 

然后,只需将播放器存储在数组列表中。这是一个很好的方法,因为你可以在死亡事件中移除玩家并离开事件。当玩家只需选择套件,就可以将它们添加到数组列表中。当他们死亡或注销时,他们将从数组列表中移除。

从ArrayList中删除播放器:

kitTrue.remove(p); 

要增加玩家的ArrayList:

kitTrue.add(p); 

因此,这里是你将如何消除对死亡的玩家和退出事件的例子。

@EventHandler 
public void onPlayerDeath(PlayerDeathEvent e){ 
    Player p = (Player) e.getEntity(); 
    kitTrue.remove(p); 
} 
@EventHandler 
public void onLogout(PlayerQuitEvent e){ 
    Player p = (Player) e.getPlayer(); 
    kitTrue.remove(p); 
} 

所以当玩家选择套件时,这可能是您如何执行它的选项。可能看起来像这样。但你会明白的。这就是你将玩家添加到数组列表的方式。

@Override 
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { 
    Player p = (Player) sender; 
    if(cmd.getLabel().equalsIgnoreCase("kit")){ 
     if(args.length == 0){ 
      p.sendMessage("§7You have chosen the kit."); 
      archer(p); 
      kitTrue.add(p); 
     } else{ 
      p.sendMessage("§7Usage§8: §b/kit"); 
     } 
    } 
    return false; 
    } 

接下来,您要确定玩家是否已经选择了套件。关于如何设置这个系统有很多方法,但我只会告诉你它是如何工作的基础知识。所以希望你明白这个主意。

@Override 
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { 
    Player p = (Player) sender; 
    if(cmd.getLabel().equalsIgnoreCase("kit")){ 
     if(args.length == 0){ 
      if(kitTrue.contains(p)){ 
       p.sendMessage("§7You have already chosen a kit this life."); 
      } 
      p.sendMessage("§7You have chosen the kit."); 
      archer(p); 
      kitTrue.add(p); 
     } 
    } 
    return false; 
    } 

那么,为什么要选择数组列表?好的Arraylists能够存储单个值,例如玩家和字符串等。您可以简单地检查ArrayList是否在列表中包含玩家或字符串,然后您可以运行代码说明玩家在列表中或者确定播放器不在阵列内部。非常容易,并一直使用这个。我希望这是你正在寻找的东西。

Thx Pixl

+0

为什么在使用自己的UUID时使用玩家的对象? – Lightspeed360

+0

你也可以使用,我知道UUID是识别玩家的更好方式,但它确实没有关系。 – Pixlation

+1

其实它的确如此。你根本没有强调**为什么在断开连接时从列表中删除玩家很重要。玩家对象不像UUID的加载块,如果在断开连接时没有移除,这是一个很大的内存泄漏。 现在,就其他代码而言,它并不是很好。首先你滥用转换,它不合逻辑地将玩家转换为玩家。将**发送给**播放器**并不确定它实际上是播放器实例同样是不合逻辑的。不要相信我?通过控制台运行命令/套件并找出自己。 –