不允许远程传送的玩家家庭的Java bukkit配置文件
我有一个配置文件不允许远程传送的玩家家庭的Java bukkit配置文件,java,minecraft,bukkit,Java,Minecraft,Bukkit,我有一个配置文件Homes.yml,用于在服务器上存储用户的主页,以便在重新加载之间进行远程传输。当前,/ksetome命令正在工作,配置文件将使用正确的坐标进行更新 但是,当执行/khome命令时,会抛出一个错误 这是一份Homes.yml Homes: Kalenpw: ==: org.bukkit.Location yaw: 174.53154 pitch: 18.115198 z: 89.15419690166142 y: 100.0
Homes.yml
,用于在服务器上存储用户的主页,以便在重新加载之间进行远程传输。当前,/ksetome
命令正在工作,配置文件将使用正确的坐标进行更新
但是,当执行/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;
}
}
我在谷歌上搜索了一下,似乎不知道自己做错了什么。据我所知,我在Homes.yml中创建的Location对象是错误的,因为我可以将代码切换为只使用hashmap,它工作正常,这也消除了plugin.yml的问题。谢谢你的帮助
编辑:
TestPlugin.java中的第152行
World homeWorld = Bukkit.getServer().getWorld(worldName);
编辑:
显然,问题是我所做的每一件事都让我的世界返回了零。我使用了Bukkit.broadcastMessage(Bukkit.getWorlds().toString())
检查以确保我使用了正确的字符串来获取世界,并且广播了[CraftWorld{name=Khalidor},CraftWorld{name=Khalidor\u nether},CraftWorld{name=Khalidor\u the_end}]
我不在nether或end,所以在我看来,它应该选择那个世界
当我运行这些stringworldname=homesConfig.getString(“Homes.”+user.getName()+“.world”);
Bukkit.broadcastMessage(世界名称)代码>
我得到了一个空指针异常,所以无论出于什么原因,我得到的是空指针,而不是我的世界名称。还在弄清楚为什么会这样
编辑:
所以我发现问题出在我的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())
因此,您必须检索位置。然后你就可以得到这个位置的世界了
此外,你不应该使用球员的名字,因为你可以在莫强的网站上更改你的名字。请改用Player的UID。在尝试使用它之前,您可能需要检查“homesConfig.contains”(“Homes.”+user.getName()+)”。我认为获取配置文件不包含的内容只会返回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;
}
if(!homesConfig.contains(“Homes.”+user.getName()+“.world”)|{
user.sendMessage(ChatColor.RED+“无主设置”);
返回true;
}
我还没有测试过这段代码,但它可以工作。另外,pogostick29dev有很多bukkit教程,其中一个包括设置管理器,如果你想查看他的话。TestPlugin.java第152行。。。这是什么?@cricket_007 World homeWorld=Bukkit.getServer().getWorld(worldName);“IllegalArgumentException:Name cannot be null”对你有什么意义吗?@cricket_007不完全确定这意味着什么不,但我猜它没有找到世界它会出现homesConfig.getString(“Homes.”+user.getName()+“.world”)代码>已返回null。可能是因为在配置中找不到该字符串。您可以在下一行打印出worldName
,以检查UUID上我没有想到的良好点。然而,在更改了第152行之后,我仍然得到一个空指针异常,原因是:com.Khalidor.testplugin.testplugin.onCommand(testplugin.java:151)~[?:?]注意:我对一行进行了深入研究,因此151仍然是这里讨论的行。这是一个好主意,我将实现它。如果没有任何东西,他们会返回null,这就是发生的事情,它不允许我去tp玩家世界返回null,x y z都返回0。知道怎么解决吗?根据我一直在看的AppleJuze教程,我的语法似乎是正确的X y和z可能返回0,因为它们是整数而不是对象,所以它们不能为null,只是将它们设置为最接近null的值。是的,我明白了,但我不明白为什么在文件中找不到它们。当我刚刚将位置保存到Homes.yml时,我得到了一些旧的代码行,在删除tp后,它会弄乱它。我将接受您的回答,因为在执行检查时,如果在我注意到错误的时候设置了家庭,我将接受您的回答。谢谢
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;
}