不允许远程传送的玩家家庭的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;
}