Java 玩家家园的 bukkit 配置文件不允许传送
Java bukkit config file for player homes not allowing teleportation
我有一个配置文件 Homes.yml
用于服务器上用户的商店主页,以便能够在重新加载之间传送到。目前 /ksethome
命令正在运行,配置文件已更新为正确的坐标。
但是,在执行 /khome
命令时会抛出错误。
这是Homes.yml
的副本
Homes:
Kalenpw:
==: org.bukkit.Location
yaw: 174.53154
pitch: 18.115198
z: 89.15419690166142
y: 100.0
world: Khalidor
x: 99.43791494211929
这是插件的副本
//@kalenpw
package com.Khalidor.testplugin;
import java.util.HashMap;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.inventory.PlayerInventory;
public final class TestPlugin extends JavaPlugin implements Listener {
MyConfigManager manager;
MyConfig homesConfig;
HashMap<String, Location> playerHomes = new HashMap<String, Location>();
@Override
public void onEnable() {
getLogger().info("onEable has been invoked!");
getServer().getPluginManager().registerEvents(this, this);
manager = new MyConfigManager(this);
homesConfig = manager.getNewConfig("Homes.yml");
// TODO add stuff to hashmap onEnable()
}
@Override
public void onDisable() {
// when plugin is disabled
getLogger().info("onDisable has been invoked");
}
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if (sender instanceof Player) {
Player user = (Player) sender;
// Sethome
if (label.equalsIgnoreCase("KSetHome")) {
playerHomes.put(user.getName(), user.getLocation());
homesConfig.set("Homes." + user.getName(), user.getLocation());
homesConfig.saveConfig();
user.sendMessage(ChatColor.GOLD + "Set home!");
}
// TP home
if (label.equalsIgnoreCase("KHome")) {
// Location homeLocation = playerHomes.get(user.getName());
/*
* Location homeLocation = homesConfig.get("Homes." +
* user.getName(), );
*/
String worldName = homesConfig.getString("Homes." + user.getName() + ".world");
World homeWorld = Bukkit.getServer().getWorld(worldName);
double homeX = homesConfig.getDouble("Homes." + user.getName() + ".x");
double homeY = homesConfig.getDouble("Homes." + user.getName() + ".y");
double homeZ = homesConfig.getDouble("Homes." + user.getName() + ".z");
Location homeLocation = new Location(homeWorld, homeX, homeY, homeZ);
user.teleport(homeLocation);
user.sendMessage(ChatColor.GOLD + "Teleported home!");
}
return true;
}
// Not executed by player
return false;
}
}
最后复制错误:
[21:25:01 INFO]: Kalenpw issued server command: /ksethome
[21:25:04 INFO]: Kalenpw issued server command: /khome
[21:25:04 ERROR]: null
org.bukkit.command.CommandException: Unhandled exception executing command 'khome' in plugin TestPlugin v1.0
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) ~[spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at org.bukkit.craftbukkit.v1_9_R1.CraftServer.dispatchCommand(CraftServer.java:645) ~[spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at net.minecraft.server.v1_9_R1.PlayerConnection.handleCommand(PlayerConnection.java:1350) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at net.minecraft.server.v1_9_R1.PlayerConnection.a(PlayerConnection.java:1185) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at net.minecraft.server.v1_9_R1.PacketPlayInChat.a(PacketPlayInChat.java:45) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at net.minecraft.server.v1_9_R1.PacketPlayInChat.a(PacketPlayInChat.java:1) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at net.minecraft.server.v1_9_R1.PlayerConnectionUtils.run(SourceFile:13) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [?:1.7.0_85]
at java.util.concurrent.FutureTask.run(FutureTask.java:262) [?:1.7.0_85]
at net.minecraft.server.v1_9_R1.SystemUtils.a(SourceFile:45) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at net.minecraft.server.v1_9_R1.MinecraftServer.D(MinecraftServer.java:721) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at net.minecraft.server.v1_9_R1.DedicatedServer.D(DedicatedServer.java:400) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at net.minecraft.server.v1_9_R1.MinecraftServer.C(MinecraftServer.java:660) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at net.minecraft.server.v1_9_R1.MinecraftServer.run(MinecraftServer.java:559) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at java.lang.Thread.run(Thread.java:745) [?:1.7.0_85]
Caused by: java.lang.IllegalArgumentException: Name cannot be null
at org.apache.commons.lang.Validate.notNull(Validate.java:192) ~[spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at org.bukkit.craftbukkit.v1_9_R1.CraftServer.getWorld(CraftServer.java:1022) ~[spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at com.Khalidor.testplugin.TestPlugin.onCommand(TestPlugin.java:152) ~[?:?]
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
... 15 more
我用谷歌搜索了一下,似乎无法弄清楚我做错了什么。据我所知,我从 Homes.yml 创建位置 object 是错误的,因为我可以将代码切换为仅使用哈希图,并且它工作正常,这也消除了 plugin.yml 作为问题。感谢您的帮助!
编辑:
第 152 行来自 TestPlugin.java
World homeWorld = Bukkit.getServer().getWorld(worldName);
编辑:
显然,问题是我为实现我的世界而采取的每一种方式都返回 null。我使用 Bukkit.broadcastMessage(Bukkit.getWorlds().toString());
检查以确保我使用正确的字符串从中获取世界并广播 [CraftWorld{name=Khalidor}, CraftWorld{name=Khalidor_nether}, CraftWorld{name=Khalidor_the_end}]
我不在下界或末地 所以在我看来它应该是挑选那个世界。
当我运行这些String worldName = homesConfig.getString("Homes." + user.getName() + ".world");
Bukkit.broadcastMessage(worldName);
我得到一个空指针异常,所以无论出于何种原因,我得到的是 null 而不是我的世界的名称。仍在弄清楚为什么会这样。
编辑:
所以我发现问题出在我的 YML 文件上,而不是使用来自 Homes.yml 的字符串 我刚刚输入了我的世界的字符串,现在它读取的 X Y Z 位置全部为 0 所以对于某些读错的原因。
编辑:已解决原来问题不在 YML 文件中,但我在早期测试中留下了一行代码导致 YML 出现问题,因为我保存了 x y z 然后用一个位置覆盖.
(未测试)
第 152 行:
String worldName = homesConfig.getString("Homes." + user.getName() + ".world");
应该是
World homeWorld = ((Location) getConfig().get("Homes." + user.getName())).getWorld();
为什么?
您将位置存储在行
homesConfig.set("Homes." + user.getName(), user.getLocation());
因此您必须检索位置。然后您可以获得该位置的世界。
此外,你不应该使用玩家的名字,因为你可以在 mojangs 网站上更改你的名字。请改用播放器的 UID。
在尝试使用它之前,您可能需要检查是否有 "homesConfig.contains("Homes." + user.getName() + )"。我认为获取配置文件不包含的内容只会 return null。
您可以通过以下方式查看它
if (!homesConfig.contains("Homes." + user.getName() + ".world") || <just copy the first condition but for the different elements, like x, y, z, ect>) {
user.sendMessage(ChatColor.RED + "No home set");
return true;
}
我还没有测试过这段代码,但它可以工作。 pogostick29dev 也有很多 bukkit 教程,其中一个涉及设置管理器,如果你想看看他。
我有一个配置文件 Homes.yml
用于服务器上用户的商店主页,以便能够在重新加载之间传送到。目前 /ksethome
命令正在运行,配置文件已更新为正确的坐标。
但是,在执行 /khome
命令时会抛出错误。
这是Homes.yml
Homes:
Kalenpw:
==: org.bukkit.Location
yaw: 174.53154
pitch: 18.115198
z: 89.15419690166142
y: 100.0
world: Khalidor
x: 99.43791494211929
这是插件的副本
//@kalenpw
package com.Khalidor.testplugin;
import java.util.HashMap;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.inventory.PlayerInventory;
public final class TestPlugin extends JavaPlugin implements Listener {
MyConfigManager manager;
MyConfig homesConfig;
HashMap<String, Location> playerHomes = new HashMap<String, Location>();
@Override
public void onEnable() {
getLogger().info("onEable has been invoked!");
getServer().getPluginManager().registerEvents(this, this);
manager = new MyConfigManager(this);
homesConfig = manager.getNewConfig("Homes.yml");
// TODO add stuff to hashmap onEnable()
}
@Override
public void onDisable() {
// when plugin is disabled
getLogger().info("onDisable has been invoked");
}
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if (sender instanceof Player) {
Player user = (Player) sender;
// Sethome
if (label.equalsIgnoreCase("KSetHome")) {
playerHomes.put(user.getName(), user.getLocation());
homesConfig.set("Homes." + user.getName(), user.getLocation());
homesConfig.saveConfig();
user.sendMessage(ChatColor.GOLD + "Set home!");
}
// TP home
if (label.equalsIgnoreCase("KHome")) {
// Location homeLocation = playerHomes.get(user.getName());
/*
* Location homeLocation = homesConfig.get("Homes." +
* user.getName(), );
*/
String worldName = homesConfig.getString("Homes." + user.getName() + ".world");
World homeWorld = Bukkit.getServer().getWorld(worldName);
double homeX = homesConfig.getDouble("Homes." + user.getName() + ".x");
double homeY = homesConfig.getDouble("Homes." + user.getName() + ".y");
double homeZ = homesConfig.getDouble("Homes." + user.getName() + ".z");
Location homeLocation = new Location(homeWorld, homeX, homeY, homeZ);
user.teleport(homeLocation);
user.sendMessage(ChatColor.GOLD + "Teleported home!");
}
return true;
}
// Not executed by player
return false;
}
}
最后复制错误:
[21:25:01 INFO]: Kalenpw issued server command: /ksethome
[21:25:04 INFO]: Kalenpw issued server command: /khome
[21:25:04 ERROR]: null
org.bukkit.command.CommandException: Unhandled exception executing command 'khome' in plugin TestPlugin v1.0
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) ~[spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at org.bukkit.craftbukkit.v1_9_R1.CraftServer.dispatchCommand(CraftServer.java:645) ~[spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at net.minecraft.server.v1_9_R1.PlayerConnection.handleCommand(PlayerConnection.java:1350) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at net.minecraft.server.v1_9_R1.PlayerConnection.a(PlayerConnection.java:1185) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at net.minecraft.server.v1_9_R1.PacketPlayInChat.a(PacketPlayInChat.java:45) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at net.minecraft.server.v1_9_R1.PacketPlayInChat.a(PacketPlayInChat.java:1) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at net.minecraft.server.v1_9_R1.PlayerConnectionUtils.run(SourceFile:13) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [?:1.7.0_85]
at java.util.concurrent.FutureTask.run(FutureTask.java:262) [?:1.7.0_85]
at net.minecraft.server.v1_9_R1.SystemUtils.a(SourceFile:45) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at net.minecraft.server.v1_9_R1.MinecraftServer.D(MinecraftServer.java:721) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at net.minecraft.server.v1_9_R1.DedicatedServer.D(DedicatedServer.java:400) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at net.minecraft.server.v1_9_R1.MinecraftServer.C(MinecraftServer.java:660) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at net.minecraft.server.v1_9_R1.MinecraftServer.run(MinecraftServer.java:559) [spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at java.lang.Thread.run(Thread.java:745) [?:1.7.0_85]
Caused by: java.lang.IllegalArgumentException: Name cannot be null
at org.apache.commons.lang.Validate.notNull(Validate.java:192) ~[spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at org.bukkit.craftbukkit.v1_9_R1.CraftServer.getWorld(CraftServer.java:1022) ~[spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
at com.Khalidor.testplugin.TestPlugin.onCommand(TestPlugin.java:152) ~[?:?]
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[spigot-1.9.2.jar:git-Spigot-5a40365-b70058a]
... 15 more
我用谷歌搜索了一下,似乎无法弄清楚我做错了什么。据我所知,我从 Homes.yml 创建位置 object 是错误的,因为我可以将代码切换为仅使用哈希图,并且它工作正常,这也消除了 plugin.yml 作为问题。感谢您的帮助!
编辑:
第 152 行来自 TestPlugin.java
World homeWorld = Bukkit.getServer().getWorld(worldName);
编辑:
显然,问题是我为实现我的世界而采取的每一种方式都返回 null。我使用 Bukkit.broadcastMessage(Bukkit.getWorlds().toString());
检查以确保我使用正确的字符串从中获取世界并广播 [CraftWorld{name=Khalidor}, CraftWorld{name=Khalidor_nether}, CraftWorld{name=Khalidor_the_end}]
我不在下界或末地 所以在我看来它应该是挑选那个世界。
当我运行这些String worldName = homesConfig.getString("Homes." + user.getName() + ".world");
Bukkit.broadcastMessage(worldName);
我得到一个空指针异常,所以无论出于何种原因,我得到的是 null 而不是我的世界的名称。仍在弄清楚为什么会这样。
编辑:
所以我发现问题出在我的 YML 文件上,而不是使用来自 Homes.yml 的字符串 我刚刚输入了我的世界的字符串,现在它读取的 X Y Z 位置全部为 0 所以对于某些读错的原因。
编辑:已解决原来问题不在 YML 文件中,但我在早期测试中留下了一行代码导致 YML 出现问题,因为我保存了 x y z 然后用一个位置覆盖.
(未测试)
第 152 行:
String worldName = homesConfig.getString("Homes." + user.getName() + ".world");
应该是
World homeWorld = ((Location) getConfig().get("Homes." + user.getName())).getWorld();
为什么?
您将位置存储在行
homesConfig.set("Homes." + user.getName(), user.getLocation());
因此您必须检索位置。然后您可以获得该位置的世界。
此外,你不应该使用玩家的名字,因为你可以在 mojangs 网站上更改你的名字。请改用播放器的 UID。
在尝试使用它之前,您可能需要检查是否有 "homesConfig.contains("Homes." + user.getName() + )"。我认为获取配置文件不包含的内容只会 return null。
您可以通过以下方式查看它
if (!homesConfig.contains("Homes." + user.getName() + ".world") || <just copy the first condition but for the different elements, like x, y, z, ect>) {
user.sendMessage(ChatColor.RED + "No home set");
return true;
}
我还没有测试过这段代码,但它可以工作。 pogostick29dev 也有很多 bukkit 教程,其中一个涉及设置管理器,如果你想看看他。