运行命令

时间:2015-08-14 16:58:40

标签: java bukkit

代码

MainClass:http://pastebin.com/U99LAQ6z
ListenerClass:http://pastebin.com/ZF5i8mw1

解释

我正在处理我的插件,目前我正致力于创建Lobbies的部分。基本上我所做的就是当玩家左键点击位置魔杖他们设置点1时,当他们右击他们设置点2.我有一个块选择器,选择第一个块然后它选择所有块上Y和Z上的所有块然后在X上直到它们等于point2。它将每个块记录到HashMap中,以便稍后在需要时调用块。我的问题是我认为我有一个无限循环或类似的东西,因为控制台给我一个错误。有时它也会给我一个更长的堆栈跟踪,我只是对此感到困惑。

所以我要做的是创建一个简单的基础,我将用于所有未来需要定义区域的插件。这假设要做的是当玩家运行命令位置时它会给他们一个工具,让他们选择点。左键单击选择point1,右键单击选择point2。我使用getPoint1和getPoint2来获取它们,因为我将点存储在HashMap中。一旦玩家选择了他们运行命令/ lobbycreate(lobbyname)的点,并且当他们运行命令时,假设获得并存储给定点内的所有块。为此,我使用了一系列for循环。首先,我有变量blockSelector。我希望blockSelector从getPoint1开始,然后到getPoint2选择2点之间的所有块。然后我们转到我的第一个循环,而blockSelector.getBlockX()!= getPoint2X,getPoint2X是我用来获取getPoint2的X坐标的变量。所有这一切都是如此,这个循环中的所有循环都将继续,直到blockSelector和getPoint2X都具有相同的值。在这个循环中,我有另一个循环来执行同样的事情,除了使用Z坐标,因此它选择Z坐标上的所有块,但只有在它执行其中的循环之后才选择Y坐标上的所有块。经过所有这一切后,我根据replaceVar添加或减去1并重复循环,直到blockSelector的所有3个坐标都等于getPoint2,从而保存过程中的所有块。我拥有所有if语句和replaceVar的原因是因为当选择坐标时,玩家可以选择负坐标和正坐标,并且getPoint1可以大于或小于getPoint2,因此我必须根据2个值进行加或减。

控制台输出

jobisingh issued server command: /lobbycreate gulp
[09:46:50 ERROR]: The server has stopped responding!
[09:46:50 ERROR]: Please report this to http://www.spigotmc.org/
[09:46:50 ERROR]: Be sure to include ALL relevant console errors and Minecraft crash reports
[09:46:50 ERROR]: Spigot version: git-Spigot-b2c2c63-a3cb1bc (MC: 1.8.7)
[09:46:50 ERROR]: ------------------------------
[09:46:50 ERROR]: Server thread dump (Look for plugins here before reporting to Spigot!):
[09:46:50 ERROR]: ------------------------------
[09:46:50 ERROR]: Current Thread: Server thread
[09:46:50 ERROR]:       PID: 17 | Suspended: false | Native: false | State: RUNNABLE
[09:46:50 ERROR]:       Stack:
[09:46:50 ERROR]:               java.util.HashMap.put(Unknown Source)
[09:46:50 ERROR]:                   me.jobisingh.MainClass.onCommand(MainClass.java:223)
[09:46:50 ERROR]:               org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
[09:46:50 ERROR]:               org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141)
[09:46:50 ERROR]:               org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchCommand(CraftServer.java:640)
[09:46:50 ERROR]:               net.minecraft.server.v1_8_R3.PlayerConnection.handleCommand(PlayerConnection.java:1149)
[09:46:50 ERROR]:               net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:984)
[09:46:50 ERROR]:               net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:45)
[09:46:50 ERROR]:               net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:1)
[09:46:50 ERROR]:               net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13)
[09:46:50 ERROR]:               java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
[09:46:50 ERROR]:               java.util.concurrent.FutureTask.run(Unknown Source)
[09:46:50 ERROR]:               net.minecraft.server.v1_8_R3.SystemUtils.a(SystemUtils.java:19)
[09:46:50 ERROR]:               net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:714)
[09:46:50 ERROR]:                 net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374)
[09:46:50 ERROR]:               net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:653)
[09:46:50 ERROR]:               net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:556)
[09:46:50 ERROR]:               java.lang.Thread.run(Unknown Source)
[09:46:50 ERROR]: ------------------------------
[09:46:50 ERROR]: Entire Thread Dump:
[09:46:50 ERROR]: ------------------------------
[09:46:50 ERROR]: Current Thread: Chunk I/O Executor Thread-1
[09:46:50 ERROR]:       PID: 38 | Suspended: false | Native: false | State: WAITING
[09:46:50 ERROR]:       Stack:
> Press any key to continue . . .

1 个答案:

答案 0 :(得分:1)

我很确定这三个循环无限期地运行:

for(; blockSelector.getBlockX() != getPoint2X; blockSelector.setX(replaceVarX))
{
    for(; blockSelector.getBlockZ() != getPoint2Z; blockSelector.setZ(replaceVarZ) )
    {
        for(; blockSelector.getBlockY() != getPoint2Y; blockSelector.setY(replaceVarY))
        {
            lobbies.put(blockSelector.getBlockY(), blockSelector);
        }
        lobbies.put(blockSelector.getBlockZ(), blockSelector);
    }
    lobbies.put(blockSelector.getBlockZ(), blockSelector);
}

我以X为例,但YZ完全相同。

你的循环运行的时间与replaceVarX != getPoint2X一样长 但是,replaceVarX永远不会在循环内部发生变化,因此有两种可能性:

  • replaceVarX == getPoint2X
    循环运行一次。
  • replaceVarX != getPoint2X
    循环无限期地运行。

但是,你要确保第一个从来不是这样:

if(getPoint1X > 0 && getPoint2X > 0 && getPoint1X < getPoint2X)
{
    replaceVarX = blockSelector.getBlockX() + 1;
}
else if(getPoint1X > 0 && getPoint2X > 0 && getPoint1X > getPoint2X)
{
    replaceVarX = blockSelector.getBlockX() - 1;
}
else if (getPoint1X < 0 && getPoint2X < 0 && getPoint1X < getPoint2X)
{
    replaceVarX = blockSelector.getBlockX() + 1;
}
else if (getPoint1X < 0 && getPoint2X < 0 && getPoint1X > getPoint2X)
{
    replaceVarX = blockSelector.getBlockX() - 1;
}
else if (getPoint1X > 0 && getPoint2X < 0)
{
    replaceVarX = blockSelector.getBlockX() - 1;
}
else if (getPoint1X < 0 && getPoint2X > 0)
{
    replaceVarX = blockSelector.getBlockX() + 1;
}
else if (getPoint1Z < 0 && getPoint2Z < 0 && getPoint1Z < getPoint2Z)
{
    replaceVarX = blockSelector.getBlockX() + 1;
}

要解决此问题,您必须将所有if / else移动到循环内,以便相应地更新变量。
您必须将它们分散在循环上,以便replaceVarX在外部循环中更新,replaceVarZ在中间循环中更新,replaceVarY在内部循环中更新,否则你就会打破外面的两个循环。

一个(可能更有效)替代方案是用循环外的变量替换replaceVarX,它定义x,y和z各自的方向(-1+1) (我将称他们为dxdydz),然后将blockSelector.setX(replaceVarX)替换为blockSelector.setX(blockSelector.getBlockX() + dx)
通过这种方式,您可以避免在这些循环中进行大量冗余检查(以及计算时间)。

相关问题