2016-04-04 91 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的加載塊,如果在斷開連接時沒有移除,這是一個很大的內存泄漏。 現在,就其他代碼而言,它並不是很好。首先你濫用轉換,它不合邏輯地將玩家轉換爲玩家。將**發送給**播放器**並不確定它實際上是播放器實例同樣是不合邏輯的。不要相信我?通過控制檯運行命令/套件並找出自己。 –