我遇到了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);
如果它们不存在,我就无法执行此操作,但是,我无法重置为任何默认设置,因为每次有人进床时都会将新项目添加到配置中,并且所有数据是用户特定的。
我如何检查玩家是否在配置中有一些数据,如果没有,告诉他们在床上睡觉,当他们确实在配置中有数据时,如何声明它以便他们可以使用命令使用配置中的数据传送。感谢。
答案 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);
卸载其数据。如果每次更新都不保存,请不要忘记先保存它。
如果您有任何疑问,请发表评论。我试图非常彻底。