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

时间:2014-07-15 16:17:31

标签: 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 = 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 个答案:

答案 0 :(得分:0)

创建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

答案 1 :(得分:0)

您将要在此处使用Map。地图是一种为您的数据创建键值对的数据结构。您可以向Map询问与给定密钥关联的数据,您将获得放入其中的值,如果找不到密钥则为null。

你的地图看起来像这样:

private Map<Player, Location> bedLocations = new HashMap<Player, Location>();

我们将把这些数据存储在JavaPlugin类中,因为它需要在侦听器和命令处理程序中进行访问。您还需要一种从侦听器中获取此Map的方法。访问器方法将在这里完成工作。有关如何执行此操作,请参阅以下方法。你也需要稍后再做。

public Map<Player, Location> getBedLocations() {
    return bedLocations;
}

如果您想知道,HashMap是一种使用int hashCode()方法加快键值访问的地图,但这是一个更高级别的主题,与手头的问题无关。

该地图应存储当前在线的所有玩家的键值对,这些玩家的床位与他们相关联。由于您在上线之前不需要某人的信息,因此您不应该加载配置,但是仍然应该打开配置,以防止每次都读取文件。这应该在onEnable方法中完成。

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

//Inside your onEnable
bedConfiguration = YamlConfiguration.loadConfiguration(new File(PLUGIN_VARIABLE.getDataFolder(), "beds.yml"));

不要忘记将bedConfiguration存储在类变量中。还为它创建一个访问器方法。我将它命名为getBedConfiguration()

现在你有一个加载的配置和一个存储数据的地方,下一步是什么?您需要在加入时使用播放器数据填充Map

在你的监听器中,你应该编写一个方法来监听PlayerJoinEvent。在这里,您将加载您的播放器数据。

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

FileConfiguration bedConfig = plugin.getBedConfiguration();

这将为您提供之前打开的FileConfiguration。现在我们检查播放器的数据是否在配置中。

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);

您的数据已加载!优秀。现在我们将它存储在地图中以供以后访问。首先,从Map课程中获取JavaPlugin。然后我们将数据放入Map

Map<Player, Location> map = plugin.getBedLocations();
map.put(event.getPlayer(), loc);

数据在地图中!要访问它,请确保先获取地图,然后调用map.get(PLAYER);

其他需要做的事情是......当玩家离开/服务器关闭时保存数据并在玩家离开时从地图中移除玩家(将玩家留在地图中是非常糟糕的做法,你可以如果您希望阻止该问题,请使用他们的名字或UUID作为密钥。)

要将Map保存到配置中,您可以在床位置发生变化时更改配置,也可以等待并循环遍历所有Map条目并将其全部保存在最后。要遍历这些,您可以使用高级for循环。

for(Player player : map.keySet()) {
    Location loc = map.get(player);
    //save here
}

这将循环播放地图中的所有玩家,并让您使用map.get(player)方法访问其位置。

要从地图中移除播放器,请收听PlayerQuitEvent并使用map.remove(player);卸载其数据。如果每次更新都不保存,请不要忘记先保存它。

如果您有任何疑问,请发表评论。我试图非常彻底。