Bukkit:如何永久存储播放器和class信息?

Bukkit: How to permentately store player and class information?

目前,我正在编写一个RPG 插件。我创建了一个 PlayerInfo class 来存储玩家的 UUID、角色 class(如骑士和弓箭手)以及修改玩家属性的技能,例如vitality 会增加玩家的生命值,strength 会增加玩家的物理伤害,等等。

这里是 class 到目前为止:

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 和 Java 脚本程序员。我大约 2 天前收到了 Java,如果我的代码不卫生,我深表歉意。我仍在努力理解这些语言及其实践。如果您愿意,我也将不胜感激。不过,请随意回答我的基本问题,因为我也会 posting 进行代码审查,在未来的某个时候。

前进...

在研究这个插件的基本框架时,我意识到 PlayerInfo class 中的信息很可能在服务器停止时不会保存。我想也许我可以使用 FileOutputStreamObjectOutputStream 将信息写入文件,并将其存储在配置文件夹中,然后使用这些模块的 Input 版本检索它.但是,我 运行 在尝试动态获取 jar 文件的路径时遇到了问题,因为我的服务器告诉我在尝试创建文件夹和文件时我的访问被拒绝。

我的最后一个问题是在尝试使用加载的信息时出现的。我的插件命令以 /static 开头。如果我有一个名为 /static stats 的命令来显示用户统计信息,是否会像将用户的 UUID 与存储在保存文件中的 UUID 进行比较一样简单?例如:

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

或者是否有其他方法可以做到这一点?

将我的 post 压缩一点:
我如何有效地存储玩家和 class 信息,以及我以后如何检索该数据以用于信息并查看当前玩家是否与保存的对象匹配? SQL 之类的东西是干这个用的吗?

好的,你可以在你的 class 上使用序列化,我猜这是因为你只有基元,然后你可以将你创建的序列化文件字节写入 sql 数据库,当您需要它时,您可以再次读回它并将其类型转换为您的 class 对象。然后你可以调用一个迭代器来循环遍历属性并使用 .equals 方法为你的玩家找到匹配项。

当每个玩家连接到服务器时将其加载到内存中(为每个玩家创建一个新的 PlayerInfo 对象,例如使用 HashMap 或 List)。

在播放器断开连接时,您必须将所有信息保存到 file/database(包括 sql)中,该信息将在给定播放器的下一次连接时恢复并再次加载。

服务器停止时信息会丢失,因此您需要将其存储在某个地方并在需要时检索它。

您可以创建一个简单的函数来检索基于 HashMap 的 PlayerInfo

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());   
    }  
 } `