Bukkit:如何妥善存储播放器和课堂信息?

时间:2017-01-11 23:23:04

标签: java bukkit

目前,我正在编写RPG插件。我创建了一个PlayerInfo类,用于存储玩家的UUID,角色类,如骑士和射手,以及修改玩家属性的技能,例如: vitality会增加玩家的健康,strength会增加玩家的物理伤害,依此类推。

到目前为止,这是班级:

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程序员。我在2天前拿起了Java,所以如果我的代码不卫生,我会道歉。我还在尝试理解语言及其实践。如果您愿意,我也会对此提出任何建议表示感谢。尽管如此,我可以随时回答我的基本问题,因为我将在未来的某个时候发布到Code Review。

前进......

在处理这个插件的基本框架时,我已经意识到当服务器停止时,PlayerInfo类中的信息很可能不会被保存。我想可能我可以使用FileOutputStreamObjectOutputStream将信息写入文件,并将其存储在配置文件夹中,然后使用这些模块的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 个答案:

答案 0 :(得分:2)

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

在播放器断开连接时,您必须将所有信息保存到文件/数据库(包含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());   
    }  
 } `

答案 1 :(得分:-1)

好的,你可以在你的类上使用序列化,我猜它的方式因为你只有原语,然后你可以将你创建的序列化文件字节写入sql数据库,当你需要它时,你可以再次读回来并输入它给你的类对象。然后你可以调用迭代器来遍历属性,并使用.equals方法为你的玩家找到匹配。