java - Bukkit 插件从 config.yml 获取位置

标签 java plugins minecraft bukkit

我正在尝试创建插件,它将在有人打开箱子时检查箱子的位置是否与我的 config.yml 中的任何位置不匹配。所以我想做这样的事情:

ArratList<Location> list = new ArrayList();
foreach(get world, x, y, z from each key in section Locations in my config) {
    list.add(new Location(world, x, y, z));
    foreach(Location l : list) {
    if(l == p.location...
}
}

编辑: 现在我有这个代码:

public class Listeners implements Listener {

    public Core plugin;
    public Listeners(Core core) {
        this.plugin = core;
    }

    @EventHandler
    private void onPlayerInteract(PlayerInteractEvent e) {
        if(e.getAction() == Action.RIGHT_CLICK_BLOCK) {
            if(plugin.createMode) {
                if (e.getClickedBlock().getType() == Material.CHEST) {
                    e.setCancelled(true);
                    Location loc = e.getClickedBlock().getLocation();
                    String name = plugin.name;
                    plugin.getConfig().set(name + ".world", loc.getWorld().getName());
                    plugin.getConfig().set(name + ".x", loc.getBlockX());
                    plugin.getConfig().set(name + ".y", loc.getBlockY());
                    plugin.getConfig().set(name + ".z", loc.getBlockZ());
                    plugin.saveConfig();
                    e.getPlayer().sendMessage(ChatColor.GOLD + "[ChestTreasure] " + ChatColor.RESET + "Treasury chest successfully created!");
                    plugin.createMode = false;
                }
            } else {
                if(e.getClickedBlock().getType() == Material.CHEST) {
                    plugin.chests.clear();
                    for (String key : plugin.getConfig().getKeys(false) ){
                        //We are getting every key from our config.yml file
                        ConfigurationSection location = plugin.getConfig().getConfigurationSection(key);
                        String world = location.getString(key + ".world");
                        int x = location.getInt(key + ".x");
                        int y = location.getInt(key + ".y");
                        int z = location.getInt(key + ".z");
                        e.getPlayer().sendMessage("Hondnota x je " + String.valueOf(x));
                        Location l = new Location(Bukkit.getWorld(world), x, y, z);
                        plugin.chests.add(l);
                    }
                    for(Location l : plugin.chests) {
                        e.getPlayer().sendMessage(String.valueOf(e.getClickedBlock().getLocation().getX()));
                        if(l == e.getClickedBlock().getLocation()) {
                            e.getPlayer().sendMessage("Jeej");
                        }
                    }
                }
            }
        }
    }
}

但是当我右键单击胸部时,消息 jeej 没有出现,出现的所有内容都是消息 Hodnota x je 0。但是我的配置中有几个键,并且 x 在任何地方都不为 0。在控制台中出现此错误:

[12:25:13 ERROR]: Could not pass event PlayerInteractEvent to ChestTreasure v1.0
org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:310) ~[spigot.jar:git-Spigot-5391d73-0ebb9c7]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot.jar:git-Spigot-5391d73-0ebb9c7]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [spigot.jar:git-Spigot-5391d73-0ebb9c7]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) [spigot.jar:git-Spigot-5391d73-0ebb9c7]
        at org.bukkit.craftbukkit.v1_10_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:231) [spigot.jar:git-Spigot-5391d73-0ebb9c7]
        at net.minecraft.server.v1_10_R1.PlayerInteractManager.a(PlayerInteractManager.java:492) [spigot.jar:git-Spigot-5391d73-0ebb9c7]
        at net.minecraft.server.v1_10_R1.PlayerConnection.a(PlayerConnection.java:890) [spigot.jar:git-Spigot-5391d73-0ebb9c7]
        at net.minecraft.server.v1_10_R1.PacketPlayInUseItem.a(SourceFile:55) [spigot.jar:git-Spigot-5391d73-0ebb9c7]
        at net.minecraft.server.v1_10_R1.PacketPlayInUseItem.a(SourceFile:11) [spigot.jar:git-Spigot-5391d73-0ebb9c7]
        at net.minecraft.server.v1_10_R1.PlayerConnectionUtils$1.run(SourceFile:13) [spigot.jar:git-Spigot-5391d73-0ebb9c7]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_91]
        at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_91]
        at net.minecraft.server.v1_10_R1.SystemUtils.a(SourceFile:45) [spigot.jar:git-Spigot-5391d73-0ebb9c7]
        at net.minecraft.server.v1_10_R1.MinecraftServer.D(MinecraftServer.java:733) [spigot.jar:git-Spigot-5391d73-0ebb9c7]
        at net.minecraft.server.v1_10_R1.DedicatedServer.D(DedicatedServer.java:399) [spigot.jar:git-Spigot-5391d73-0ebb9c7]
        at net.minecraft.server.v1_10_R1.MinecraftServer.C(MinecraftServer.java:672) [spigot.jar:git-Spigot-5391d73-0ebb9c7]
        at net.minecraft.server.v1_10_R1.MinecraftServer.run(MinecraftServer.java:571) [spigot.jar:git-Spigot-5391d73-0ebb9c7]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_91]
Caused by: java.lang.IllegalArgumentException: Name cannot be null
        at org.apache.commons.lang.Validate.notNull(Validate.java:192) ~[spigot.jar:git-Spigot-5391d73-0ebb9c7]
        at org.bukkit.craftbukkit.v1_10_R1.CraftServer.getWorld(CraftServer.java:1023) ~[spigot.jar:git-Spigot-5391d73-0ebb9c7]
        at org.bukkit.Bukkit.getWorld(Bukkit.java:500) ~[spigot.jar:git-Spigot-5391d73-0ebb9c7]
        at me.sudoman281.chestTreasure.Listeners.onPlayerInteract(Listeners.java:47) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_91]
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_91]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_91]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_91]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot.jar:git-Spigot-5391d73-0ebb9c7]
        ... 17 more

最佳答案

您可以执行以下操作: 将您的位置保存在配置中,如下所示:

# CONFIG.YML #
location1:
 x: 0
 y: 0
 z: 0
 world: "world"
location2:
 x: ....
 .
 .

然后,为了获取所有配置:

ArrayList<Location> listLocations = new ArrayList<Location>();
for (String key : getConfig().getKeys(false) ){
    //We are getting every key from our config.yml file
    ConfigurationSection location = getConfig().getConfigurationSection(key);
    int x = location.getInt(key + ".x");
    int y = location.getInt(key + ".y");
    int z = location.getInt(key + ".z");
    String world = location.getString(key + ".world");
    Location l = new Location(Bukkit.getWorld(world), x, y, z);
    listLocations.add(l);
}

您现在应该将该配置文件上的所有位置添加到 ArrayList listLocations 中,并且可以从那里进行检查!

关于java - Bukkit 插件从 config.yml 获取位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38797140/

相关文章:

java - 不能将整数转换为字节

java - HTTP-POST 图像到 Ruby on Rails 应用程序

java - 创建一个调用构造函数的模拟

javascript - 找不到插件 'Device' (Cordova)

javascript - 尝试定义函数时,位置 1 出现 JSON 未定义错误

java - 找出立方体的哪一侧位于屏幕中央?

java - 代码来知道文件是否已下载

java - 如何将秒四舍五入到十分位?

javascript - 从 Javascript 重新加载 Chrome 中的 flash 插件

javascript - 使用 Chrome 扩展修改协议(protocol)?