Java Bukkit插件-检查文件中的特定数据是否存在,并声明它
我更新的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
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
}