2015-08-14 140 views
-5

代码崩溃运行命令时

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

说明

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

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

控制台输出

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

我敢肯定,这三个回路将被无限期地运行:

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作为例子,但它是完全为Y相同和Z

您的环路运行时间长达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在内部循环中得到更新,否则你会破坏外部两个循环。

A(可能更有效)替代方法是用外循环的变量,它定义对于x,y和z方向(-1+1)取代replaceVarX每个(I会打电话给他们dxdydz ),然后用blockSelector.setX(blockSelector.getBlockX() + dx)代替blockSelector.setX(replaceVarX)
这样你可以避免很多冗余检查(从而计算时间)在这些循环内。