Eigencraft crashing when Redstone placed in certain configuration
Nobody has claimed this yet.
- Dominant language
- Java
- Stars
- 12.7k
- Forks
- 3.5k
- Avg merge
- 3d 13h
- Merged PRs (30d)
- 11
Description
Stack trace
[15:54:07 ERROR]: Command exception: /fill -38 71 -43 -32 71 -36 minecraft:redstone_wire[power=14, east=up]
java.lang.NullPointerException: Cannot read field "currentState" because "center_up" is null
at com.destroystokyo.paper.util.RedstoneWireTurbo.calculateCurrentChanges(RedstoneWireTurbo.java:861) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at com.destroystokyo.paper.util.RedstoneWireTurbo.updateNode(RedstoneWireTurbo.java:444) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at com.destroystokyo.paper.util.RedstoneWireTurbo.breadthFirstWalk(RedstoneWireTurbo.java:638) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at com.destroystokyo.paper.util.RedstoneWireTurbo.updateSurroundingRedstone(RedstoneWireTurbo.java:807) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.world.level.block.RedStoneWireBlock.updateSurroundingRedstone(RedStoneWireBlock.java:272) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.world.level.block.RedStoneWireBlock.onPlace(RedStoneWireBlock.java:467) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.world.level.block.state.BlockBehaviour.onPlace(BlockBehaviour.java:164) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.world.level.block.state.BlockBehaviour$BlockStateBase.onPlace(BlockBehaviour.java:1209) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.world.level.block.state.BlockBehaviour$BlockStateBase.onPlace(BlockBehaviour.java:1205) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.world.level.chunk.LevelChunk.setBlockState(LevelChunk.java:406) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.world.level.Level.setBlock(Level.java:1051) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.world.level.Level.setBlock(Level.java:1012) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.commands.arguments.blocks.BlockInput.place(BlockInput.java:67) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.commands.FillCommand.fillBlocks(FillCommand.java:172) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.commands.FillCommand.lambda$register$2(FillCommand.java:49) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at com.mojang.brigadier.context.ContextChain.runExecutable(ContextChain.java:73) ~[brigadier-1.3.10.jar:?]
at net.minecraft.commands.execution.tasks.ExecuteCommand.execute(ExecuteCommand.java:31) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.commands.execution.tasks.ExecuteCommand.execute(ExecuteCommand.java:19) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.commands.execution.UnboundEntryAction.lambda$bind$0(UnboundEntryAction.java:8) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.commands.execution.CommandQueueEntry.execute(CommandQueueEntry.java:5) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.commands.execution.ExecutionContext.runCommandQueue(ExecutionContext.java:103) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.commands.Commands.executeCommandInContext(Commands.java:443) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.commands.Commands.performCommand(Commands.java:350) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.commands.Commands.performCommand(Commands.java:337) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.commands.Commands.performCommand(Commands.java:332) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.network.ServerGamePacketListenerImpl.performUnsignedChatCommand(ServerGamePacketListenerImpl.java:2218) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.network.ServerGamePacketListenerImpl.lambda$handleChatCommand$11(ServerGamePacketListenerImpl.java:2192) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.TickTask.run(TickTask.java:18) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.util.thread.BlockableEventLoop.doRunTask(BlockableEventLoop.java:151) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.util.thread.ReentrantBlockableEventLoop.doRunTask(ReentrantBlockableEventLoop.java:24) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.MinecraftServer.doRunTask(MinecraftServer.java:1537) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.MinecraftServer.doRunTask(MinecraftServer.java:201) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.util.thread.BlockableEventLoop.pollTask(BlockableEventLoop.java:125) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.MinecraftServer.pollTaskInternal(MinecraftServer.java:1514) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.MinecraftServer.pollTask(MinecraftServer.java:1507) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.util.thread.BlockableEventLoop.managedBlock(BlockableEventLoop.java:135) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.MinecraftServer.managedBlock(MinecraftServer.java:1466) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.MinecraftServer.waitUntilNextTick(MinecraftServer.java:1473) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1318) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:330) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at java.base/java.lang.Thread.run(Thread.java:1583) ~[?:?]
Plugin and Datapack List
None
Actions to reproduce (if known)
The bug seems to occur with multiple different Redstone configurations. So far, I've only been able to identify one reproducible method. The issue can occur when using world edit with Redstone, but I was able to replicate the issue using the vanilla /fill command without any additional plugins installed.
- Build a flat grid of Redstone dust. Ensure that the Redstone is powered on, such as with a lever on any part of the grid.
- Using the /fill command, fill the area above the Redstone grid with more Redstone. It seems to help if you purposefully set the Redstone to have some different alignment. For example, using
/fill -38 71 -43 -32 71 -36 minecraft:redstone_wire[power=14, east=up]seemed to produce the error, while just usingminecraft:redstone_wireeither never caused the error, or was much less likely to. I want to stress that it's possible to still cause the crash without doing this, just much less likely. - The error will be thrown to the console, and while the server will not crash, any Redstone contraptions will stop working, as Redstone signals won't be able to travel more than one block.
A diagram to try and demonstrate this visually:
In the above diagram, the orange layer represents the layer of Redstone being placed using //fill above the original grid. The pasted layer will usually completely destroy itself after undergoing block updates.
Paper version
This server is running Paper version 1.21.1-77-master@4ff58c4 (2024-09-12T18:05:09Z) (Implementing API version 1.21.1-R0.1-SNAPSHOT)
Other
The issue seems to be location dependant. Using a grid of size 10 x 10, the chances of encountering this issue seem to be almost 100%. However, working with smaller grids, the location of the Redstone being //filled seems to have an effect on whether the error will get thrown.
This is only an issue with Eigencraft. Both the vanilla implementation and Alternate Current did not have this issue when testing.
In testing, it's important that either the grid being pasted, or the grid already in-place, is powered on. It may be possible to replicate this crash without the Redstone dust being powered on, but I wasn't able to.
I haven't been able to find a way to replicate the issue without using world edit's //fill command, or the vanilla /fill command. The issue does occur for other commands, such as /setblock, or /clone. It may be possible to create the required "invalid" Redstone configuration using pistons, or another Redstone contraption, but I've not been able to identify any potential candidates.
The issue does not crash the entire server, but rather it only crashes Redstone. After the error gets thrown, all Redstone on the server will cease to function until the server is restarted.
A grid is not required to reproduce this error. In testing, I was able to "crash" Redstone even when pasting regular contraptions. However, due to the issue being location-dependant, using a grid seems to be the best way to reproduce this issue. The error thrown to the console was more or less the same when pasting contraptions instead.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with com.destroystokyo.paper.util.RedstoneWireTurbo.calculateCurrentChanges at line 861 and follow the update path from RedStoneWireBlock.onPlace. Reproduce the issue with a powered redstone grid and the provided /fill command, then verify that the invalid configuration no longer raises the NullPointerException and redstone continues propagating signals.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- backend, game-dev
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100