Java Bukkit插件-检查文件中的特定数据是否存在,并声明它

Java Bukkit插件-检查文件中的特定数据是否存在,并声明它,java,yaml,minecraft,bukkit,Java,Yaml,Minecraft,Bukkit,我更新的bukkit插件有问题。在我所做的工作中,当玩家使用一张床时,它会将以下数据保存到名为beds.yml的文件中: ThePlayersUsername: X: (double) Y: (double) Z: (double) world: worldName 当插件初始化时,我需要声明几个变量,因为它们稍后会在代码中使用 Player p = (Player)sender; String dn = p.getDisplayName(); dn = Cha

我更新的bukkit插件有问题。在我所做的工作中,当玩家使用一张床时,它会将以下数据保存到名为
beds.yml
的文件中:

ThePlayersUsername:
    X: (double)
    Y: (double)
    Z: (double)
    world: worldName
当插件初始化时,我需要声明几个变量,因为它们稍后会在代码中使用

Player p = (Player)sender;
String dn = p.getDisplayName();
dn = ChatColor.stripColor(dn);
double x = (Double) yml.get(dn + ".x");
double y = (Double) yml.get(dn + ".y");
double z = (Double) yml.get(dn + ".z");
World bw = Bukkit.getWorld((yml.get(dn + ".world").toString()));
Location l = new Location(bw, x, y, z);
如果它们不存在,我不能这样做,但是,我不能重置为任何默认值,因为每次有人进入床时,新项目都会添加到配置中,并且所有数据都是用户特定的


我将如何检查玩家是否在配置中有一些数据,如果没有,告诉他们睡在床上,当他们在配置中有数据时,如何声明它,以便他们可以使用命令使用配置中的数据进行远程传输。谢谢。

创建2个列表或数组:

-在线玩家

-配置中的玩家

一个简单的字符串列表是做魔术只是存储名称。然后比较它们。诸如此类:

List<String> online_players = new List<String>();
//fill list code here

List<String players_in_config = new List<String>();
//fill list code here

List<String> output = new List<String>();

for(String s : online_players){
    for(String a : players_in_config){
        if(s.equals(a)){
            output.add(s);
        break;
        }
    }
}

//and now output contains the names of the players that online and have a bed in the config
List online_players=newlist();
//填写清单代码在这里

在此处列出您将要使用的
映射。映射是为数据创建键值对的数据结构。您可以向
Map
查询与给定键相关联的数据,您将得到输入其中的值,如果找不到键,则返回null

您的地图将如下所示:

private Map<Player, Location> bedLocations = new HashMap<Player, Location>();
如果您想知道,
HashMap
是一种使用
int hashCode()
方法加快键值访问的映射类型,但这是一个与当前问题无关的更高层次的主题

该地图应存储当前在线且具有相关床位的所有玩家的键值对。因为你不需要别人的信息直到他们上线,所以你不应该从配置中加载,但是你仍然应该像这样打开配置,以防止每次都读取文件。这应该用统一的方法来完成

//Near your map and other class variables
private FileConfiguration bedConfiguration;

//Inside your onEnable
bedConfiguration = YamlConfiguration.loadConfiguration(new File(PLUGIN_VARIABLE.getDataFolder(), "beds.yml"));
别忘了将该配置存储在类变量中。还要为它创建一个访问器方法。我将它命名为
getBedConfiguration()

现在您有了一个已加载的配置和一个存储数据的位置,接下来呢?当玩家加入时,您需要用玩家数据填充
地图

在侦听器内部,您应该编写一个方法来侦听
PlayerJoinEvent
。在这里,你将加载你的球员数据

首先,我们需要从JavaPlugin类中获取YML文件

FileConfiguration bedConfig = plugin.getBedConfiguration();
这将获得先前打开的文件配置。现在我们检查玩家的数据是否在配置中

if (bedConfig.isSet(event.getPlayer().getName()) {
    //Next section here
}
如果isSet方法返回true,那么那里存在一些东西。现在我们加载数据

String playerName = event.getPlayer.getName(); //You can do this above the if statement if you wish.
double x = (Double) bedConfig.get(playerName + ".x");
double y = (Double) bedConfig.get(playerName + ".y");
double z = (Double) bedConfig.get(playerName + ".z");
World bw = Bukkit.getWorld((bedConfig.get(dn + ".world").toString()));
Location loc = new Location(bw, x, y, z);
您的数据已加载!杰出的现在我们将其存储在地图中,以供以后访问。首先,从
JavaPlugin
类中获取
Map
。然后我们将数据放入
地图

Map<Player, Location> map = plugin.getBedLocations();
map.put(event.getPlayer(), loc);
这将遍历地图中的所有玩家,并允许您使用
map.get(player)
方法访问他们的位置

要从地图中删除玩家,请收听
playerquiteevent
并使用
map.remove(player)
以卸载其数据。如果不是每次更新都保存,请不要忘记先保存


如果您有任何问题,请留下评论。我尽量做到彻底。

您尝试过哪些方法,为什么不奏效?
Map<Player, Location> map = plugin.getBedLocations();
map.put(event.getPlayer(), loc);
for(Player player : map.keySet()) {
    Location loc = map.get(player);
    //save here
}