当前位置: 首页 > 知识库问答 >
问题:

Bukkit:如何永久存储玩家和职业信息?

狄高畅
2023-03-14

目前,我正在编写一个RPG插件。我创建了一个PlayerInfo类,用于存储玩家的UUID、角色类(如骑士和弓箭手)以及修改玩家属性的技能,例如活力会增加玩家的生命值,强度会增加玩家身体伤害,等等。

这是到目前为止的课程:

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 类中的信息很可能不会保存。我想也许我可以使用 FileOutputStream 和 ObjectOutputStream 将信息写入文件,并将其存储在html" target="_blank">配置文件夹中,然后使用这些模块的输入版本检索它。但是,我在尝试动态选取 jar 文件的路径时遇到了问题,因为我的服务器告诉我,在尝试创建文件夹和文件时,我的访问被拒绝。

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

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

或者有不同的方法去做这件事吗?

把我的帖子浓缩一点:
我如何有效地存储播放器和类信息,以及我以后如何检索这些数据以用于信息,并查看当前播放器是否与保存的对象匹配?这是像SQL这样的东西的用途吗?

共有2个答案

衡修洁
2023-03-14

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

澹台星光
2023-03-14

当每个玩家连接到服务器时,将他们加载到内存中(为每个玩家创建一个新的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;
  }
}

并将玩家放入哈希地图中

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());   
    }  
 } `
 类似资料:
  • 我正在尝试查看玩家的库存中是否有以下物品,如果有,我想移除这些物品并向他们发送消息,说该物品已被移除,但我不知道如何做到这一点,这就是我目前拥有的: 我在.contains(bannedItems,1))行上收到一个错误。 谢谢你的帮助!

  • 我知道你可以得到损坏的原因 在实体损坏事件中,但是我还没有找到返回造成损坏的实体的方法。我需要找出这一点,这样我就可以检查玩家的库存中是否有某个物品。

  • 我正在为《我的世界》编写一个bukkit插件,它会对低食物水平做出反应,然后自动将食物从库存中移动到现成的地方,然后吃掉它。我管理了第一部分,但我在bukkit API(,,其他地方)中找不到让玩家使用物品的方法。 这可能吗?如果可能,怎么做?

  • 问题内容: 我对Java堆内存有一个问题。我用Java开发了一个客户端服务器应用程序,该应用程序作为Windows服务运行,需要超过512MB的内存。我有2GB的RAM,但是运行应用程序时会引发异常 内存不足错误:java堆空间 但是我已经在Java控制面板中设置了堆大小(最大512MB),但仍然收到相同的错误。我无法通过命令行设置堆大小,因为我的应用程序作为Windows服务运行,因此如何增加默

  • 我在java堆内存方面有一个问题。我用java开发了一个客户机服务器应用程序,作为windows服务运行,它需要超过512MB的内存。我有2GB的RAM,但当我运行我的应用程序时,它抛出一个异常 内存不足错误:Java堆空间 但是我已经在java控制面板中设置了堆大小(最大值为512MB),我仍然得到相同的错误。我不能通过命令行设置堆大小,因为我的应用程序是作为windows服务运行的,所以如何增