@@ -66,12 +66,15 @@ internal object MultiblockCache : Listener {
6666 override fun run () {
6767 for (multiblockPosition in dirtyMultiblocks) {
6868 // For a multiblock to be formed, it must be fully loaded
69+ val multiblock = BlockStorage .getAs<PylonMultiblock >(multiblockPosition)
6970 if (multiblockPosition !in fullyLoadedMultiblocks) {
70- formedMultiblocks.remove(multiblockPosition)
71+ if (formedMultiblocks.remove(multiblockPosition) && multiblock != null ) {
72+ multiblock.onMultiblockUnformed(true )
73+ PylonMultiblockUnformEvent (multiblockPosition.block, multiblock as PylonBlock ).callEvent()
74+ }
7175 continue
7276 }
7377
74- val multiblock = BlockStorage .getAs<PylonMultiblock >(multiblockPosition)
7578 if (multiblock != null && multiblock.checkFormed()) {
7679 if (formedMultiblocks.add(multiblockPosition)) {
7780 multiblock.onMultiblockFormed()
@@ -82,7 +85,7 @@ internal object MultiblockCache : Listener {
8285 }
8386 } else {
8487 if (formedMultiblocks.remove(multiblockPosition) && multiblock != null ) {
85- multiblock.onMultiblockUnformed()
88+ multiblock.onMultiblockUnformed(false )
8689 PylonMultiblockUnformEvent (multiblockPosition.block, multiblock as PylonBlock ).callEvent()
8790 }
8891 }
@@ -99,13 +102,17 @@ internal object MultiblockCache : Listener {
99102 = dirtyMultiblocks.add(multiblock.block.position)
100103
101104 private fun refreshFullyLoaded (multiblock : PylonMultiblock ) {
105+ val multiblockPosition = multiblock.block.position
102106 if (multiblock.chunksOccupied.all { it.isLoaded }) {
103- fullyLoadedMultiblocks.add(multiblock.block.position )
107+ fullyLoadedMultiblocks.add(multiblockPosition )
104108 markDirty(multiblock)
105109 } else {
106- formedMultiblocks.remove(multiblock.block.position)
107- fullyLoadedMultiblocks.remove(multiblock.block.position)
108- dirtyMultiblocks.remove(multiblock.block.position)
110+ if (formedMultiblocks.remove(multiblockPosition)) {
111+ multiblock.onMultiblockUnformed(true )
112+ PylonMultiblockUnformEvent (multiblock.block, multiblock as PylonBlock ).callEvent()
113+ }
114+ fullyLoadedMultiblocks.remove(multiblockPosition)
115+ dirtyMultiblocks.remove(multiblockPosition)
109116 }
110117 }
111118
@@ -127,8 +134,8 @@ internal object MultiblockCache : Listener {
127134 }
128135 }
129136
130- fullyLoadedMultiblocks.remove(multiblockPosition)
131137 formedMultiblocks.remove(multiblockPosition)
138+ fullyLoadedMultiblocks.remove(multiblockPosition)
132139 dirtyMultiblocks.remove(multiblockPosition)
133140 }
134141
@@ -162,19 +169,23 @@ internal object MultiblockCache : Listener {
162169
163170 @EventHandler
164171 private fun handle (event : PylonChunkBlocksUnloadEvent ) {
165- // Mark existing multiblocks with components as not formed and not fully loaded
166- for (multiblockPosition in loadedMultiblocksWithComponentsInChunk(event.chunk.position)) {
167- formedMultiblocks.remove(multiblockPosition)
168- fullyLoadedMultiblocks.remove(multiblockPosition)
169- dirtyMultiblocks.remove(multiblockPosition)
170- }
171-
172172 // Remove multiblocks that were just unloaded
173173 for (pylonBlock in event.pylonBlocks) {
174174 if (pylonBlock is PylonMultiblock ) {
175175 onMultiblockRemoved(pylonBlock)
176176 }
177177 }
178+
179+ // Mark existing multiblocks with components as not formed and not fully loaded
180+ for (multiblockPosition in loadedMultiblocksWithComponentsInChunk(event.chunk.position)) {
181+ val multiblock = BlockStorage .getAs<PylonMultiblock >(multiblockPosition)
182+ if (formedMultiblocks.remove(multiblockPosition) && multiblock != null ) {
183+ multiblock.onMultiblockUnformed(true )
184+ PylonMultiblockUnformEvent (multiblockPosition.block, multiblock as PylonBlock ).callEvent()
185+ }
186+ fullyLoadedMultiblocks.remove(multiblockPosition)
187+ dirtyMultiblocks.remove(multiblockPosition)
188+ }
178189 }
179190
180191 @EventHandler
0 commit comments