洪水填充方法导致stackoverflow错误(Bukkit API)

问题描述 投票:1回答:1

我的代码

    public Set<Chunk> floodSearch(int x, int z, FactionData colour) {

        Set<Chunk> toClaim = new HashSet<>();

        if ((instance.getChunkManager().getFactionDataByChunk(Bukkit.getServer().getWorld(Config.FACTION_WORLD.getData().toString()).getChunkAt(x, z)) == null) && (toClaim.size() <= (int) Config.MAX_FILL_SIZE.getData())) {

            //FIRST LOOK IF THE CENTER CHUNK IS EVEN CLAIMED OR NOT, IF IT
            toClaim.add(Bukkit.getWorld(Config.FACTION_WORLD.getData().toString()).getChunkAt(x, z));

            // NOW SEARCH FOR THE NEIGHBOURS
            floodSearch(x, z + 1, colour); // north
            floodSearch(x, z - 1, colour); // south
            floodSearch(x - 1, z, colour); // west
            floodSearch(x + 1, z, colour); // east
        }
        return toClaim;
    }

错误:

[23:09:04] [Server thread/ERROR]: null
org.bukkit.command.CommandException: Unhandled exception executing command 'f' in plugin PixliesFactionSystem v1.0.1
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:47) ~[patched_1.15.1.jar:git-Paper-23]
    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:159) ~[patched_1.15.1.jar:git-Paper-23]
    at org.bukkit.craftbukkit.v1_15_R1.CraftServer.dispatchCommand(CraftServer.java:740) ~[patched_1.15.1.jar:git-Paper-23]
    at net.minecraft.server.v1_15_R1.PlayerConnection.handleCommand(PlayerConnection.java:1820) ~[patched_1.15.1.jar:git-Paper-23]
    at net.minecraft.server.v1_15_R1.PlayerConnection.a(PlayerConnection.java:1628) ~[patched_1.15.1.jar:git-Paper-23]
    at net.minecraft.server.v1_15_R1.PacketPlayInChat.a(PacketPlayInChat.java:47) ~[patched_1.15.1.jar:git-Paper-23]
    at net.minecraft.server.v1_15_R1.PacketPlayInChat.a(PacketPlayInChat.java:5) ~[patched_1.15.1.jar:git-Paper-23]
    at net.minecraft.server.v1_15_R1.PlayerConnectionUtils.lambda$ensureMainThread$0(PlayerConnectionUtils.java:23) ~[patched_1.15.1.jar:git-Paper-23]
    at net.minecraft.server.v1_15_R1.TickTask.run(SourceFile:18) ~[patched_1.15.1.jar:git-Paper-23]
    at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.executeTask(IAsyncTaskHandler.java:136) ~[patched_1.15.1.jar:git-Paper-23]
    at net.minecraft.server.v1_15_R1.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) ~[patched_1.15.1.jar:git-Paper-23]
    at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.executeNext(IAsyncTaskHandler.java:109) ~[patched_1.15.1.jar:git-Paper-23]
    at net.minecraft.server.v1_15_R1.MinecraftServer.aZ(MinecraftServer.java:1037) ~[patched_1.15.1.jar:git-Paper-23]
    at net.minecraft.server.v1_15_R1.MinecraftServer.executeNext(MinecraftServer.java:1030) ~[patched_1.15.1.jar:git-Paper-23]
    at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.awaitTasks(IAsyncTaskHandler.java:119) ~[patched_1.15.1.jar:git-Paper-23]
    at net.minecraft.server.v1_15_R1.MinecraftServer.sleepForTick(MinecraftServer.java:1014) ~[patched_1.15.1.jar:git-Paper-23]
    at net.minecraft.server.v1_15_R1.MinecraftServer.run(MinecraftServer.java:937) ~[patched_1.15.1.jar:git-Paper-23]
    at java.lang.Thread.run(Thread.java:834) [?:?]
Caused by: java.lang.StackOverflowError
    at java.util.HashMap.hash(HashMap.java:339) ~[?:?]
    at java.util.LinkedHashMap.get(LinkedHashMap.java:440) ~[?:?]
    at org.bukkit.craftbukkit.v1_15_R1.CraftServer.getWorld(CraftServer.java:1082) ~[patched_1.15.1.jar:git-Paper-23]
    at org.bukkit.Bukkit.getWorld(Bukkit.java:525) ~[patched_1.15.1.jar:git-Paper-23]
    at me.mickmmars.factions.factions.FactionManager.floodSearch(FactionManager.java:775) ~[?:?]
    at me.mickmmars.factions.factions.FactionManager.floodSearch(FactionManager.java:781) ~[?:?]
    at me.mickmmars.factions.factions.FactionManager.floodSearch(FactionManager.java:781) ~[?:?]
    at me.mickmmars.factions.factions.FactionManager.floodSearch(FactionManager.java:782) ~[?:?]
    at me.mickmmars.factions.factions.FactionManager.floodSearch(FactionManager.java:781) ~[?:?]
    at me.mickmmars.factions.factions.FactionManager.floodSearch(FactionManager.java:782) ~[?:?]
    at me.mickmmars.factions.factions.FactionManager.floodSearch(FactionManager.java:781) ~[?:?]
    at me.mickmmars.factions.factions.FactionManager.floodSearch(FactionManager.java:782) ~[?:?]
    at me.mickmmars.factions.factions.FactionManager.floodSearch(FactionManager.java:781) ~[?:?]

它一直都在向at me.mickmmars...错误发送垃圾邮件。

说明我尝试做的是/f claim fill。在我的派系系统中,当您声明空心形状(例如圆形)时,我想发出填充该形状的命令。我的灵感来自其开源的Massivecraft派系。https://github.com/MassiveCraft/Factions/blob/master/src/com/massivecraft/factions/cmd/CmdFactionsSetFill.java如果你们能帮助我,我将非常感激。谢谢!

minecraft bukkit flood-fill
1个回答
0
投票

虽然如果您实际上阻止递归函数访问已访问的单元格,从代码中还不清楚,但我认为总堆栈限制可能小于访问所有单元格所需的实际递归深度。

我的建议是使用fifo队列,并执行一个循环,在队列的一端添加新的单元格,并从另一端开始对要退出工作的单元格进行排队。这和递归一样好,但是没有人为的递归级别限制。

© www.soinside.com 2019 - 2024. All rights reserved.