2017-01-11 59 views
2

目前,我正在寫一個RPG插件。我創建了一個PlayerInfo類,用於存儲玩家的UUID,角色類(如騎士和弓箭手)以及修改玩家屬性的技能。 vitality會增加玩家的健康,strength會增加玩家的物理傷害,等等。Bukkit:如何存儲玩家和課程信息?

這裏的類迄今:

public class PlayerInfo { 
    public String suuid; 
    public String charClass; 
    public int vitality; 
    public int strength; 
    public int defense; 
    public int dexterity; 
    public int intelligence; 
    public int faith; 

    public PlayerInfo() { 

    } 

    public PlayerInfo(String UUID, String characterClass, int VIT, int STR, int DEF, int DEX, int INT, int FAI) { 
     suuid = UUID; 
     charClass = characterClass; 
     vitality = VIT; 
     strength = STR; 
     defense = DEF; 
     dexterity = DEX; 
     intelligence = INT; 
     faith = FAI; 
    } 

我想說的清楚,我主要是一個Python和JavaScript程序員。大約兩天前我拿起了Java,所以如果我的代碼不衛生,我很抱歉。我仍然試圖理解語言及其實踐。如果你願意,我會很感激任何意見。雖然,隨時回答我的基本問題,因爲我將在未來的某個時間發佈到Code Review。

展望未來......

雖然關於這個插件的基本框架的工作,我已經意識到PlayerInfo類內的信息是最有可能在服務器停止不保存。我想可能是我可以編寫信息,使用FileOutputStreamObjectOutputStream,到一個文件,並存儲在一個config文件夾,後來與Input版本的這些模塊的檢索。然而,當我試圖動態地選擇jar文件的路徑時遇到了一個問題,因爲我的服務器告訴我,在嘗試創建文件夾和文件時,我的Access被拒絕。

我試圖使用加載的信息時,我的最後一個問題。我的插件的命令以/static開頭。如果我有一個名爲/static stats的命令來顯示用戶的統計信息,那麼它與將用戶的UUID與存儲在保存文件中的UUID進行比較一樣簡單嗎?例如:

Player player = (Player) sender; 
String suuid = player.getUniqueId().toString(); 
if (character.suuid == suuid) { 
// Load stats here... 
} 

還是有不同的方式去做呢?

爲了簡化我的文章:
如何有效存儲播放器和類信息,以及如何稍後檢索該數據以用於信息並查看當前播放器是否與保存的對象相匹配?這是什麼東西像SQL被用於?

回答

2

加載每個當他們連接到服務器到存儲播放器(作出新的PlayerInfo對象爲他們每個人,例如使用一個HashMap或List)。

您所保存的所有信息到文件/數據庫播放器斷開其正在恢復並加載再次(包括SQL)未來連接指定的球員。

服務器停止時,該信息被丟失,因此需要存儲在某個地方,當你需要它檢索。

您可以創建一個簡單的函數來獲取基於一個HashMap

HashMap<String, PlayerInfo> allplayers = new HashMap<String, PlayerInfo>(); 


public PlayerInfo getPlayer(Player player){ 
    if(allplayers.containsKey(player.getName())){ 
    return allplayers.get(player.getName()); 
    }else{ 
    return null; 
    } 
} 

而且把玩家帶入一個HashMap

public void addPlayer(Player player){ 
    if(!allplayers.containsKey(player.getName())){ 
    //Load playerInfo 
    PlayerInfo p = new PlayerInfo(....); 
    //put into hashmap 
    allplayers.put(player.getName(), p); 
    } 
} 

//saving PlayerInfo can be called on PlayerDisonnect/Server shutdown 
public void savePlayer(Player player){ 
    if(allplayers.containsKey(player.getName())){ 
     PlayerInfo p = allplayers.get(player.getName()); 
    //Save information 
     ..... 
    //remove player from HashMap 
    allplayers.remove(player.getName()); 
    } 
} ` 
+0

我將如何對應此HashMap到SQL數據庫PlayerInfo?如果這是一個複雜的答案,不要擔心沒有長時間的回答。我將開始一個新的問題線程。 – staticCoffee

+0

@staticCoffee你的意思是如何將信息從HashMap傳輸到SQL數據庫? – elving

+0

是的,如果不明確,我很抱歉。這是一個複雜的過程嗎? – staticCoffee

-1

好的,你可以在你的類上使用序列化,我想它的方式導致你只有原語,然後你可以字節寫你創建的序列化文件到SQL數據庫,當你需要它,你可以再讀回來,並將其類型轉換爲您的類對象。然後你可以調用一個迭代器來遍歷這些房產,並用.equals方法爲你的玩家找到匹配。