2017-01-11 60 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方法为你的玩家找到匹配。