Skip to content

Commit

Permalink
fix save corruption
Browse files Browse the repository at this point in the history
  • Loading branch information
FalsePattern committed Feb 3, 2024
1 parent d5faa4c commit a88178f
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 1 deletion.
6 changes: 6 additions & 0 deletions src/main/scala/codechicken/multipart/BlockMultipart.scala
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import net.minecraft.util.Vec3
import net.minecraft.util.MovingObjectPosition
import codechicken.lib.raytracer.RayTracer
import net.minecraft.entity.player.EntityPlayer

import java.util.Random
import java.util.ArrayList
import net.minecraft.item.ItemStack
Expand All @@ -21,6 +22,9 @@ import net.minecraft.client.renderer.texture.IIconRegister
import codechicken.lib.render.TextureUtils
import net.minecraft.world.IBlockAccess
import codechicken.lib.raytracer.ExtendedMOP
import codechicken.multipart.handler.MultipartSaveLoad.TileNBTContainer
import net.minecraft.tileentity.TileEntity

import scala.collection.JavaConversions._

object BlockMultipart {
Expand Down Expand Up @@ -73,6 +77,8 @@ class BlockMultipart extends Block(Material.rock) {

override def hasTileEntity(meta: Int = 0) = true

override def createTileEntity(world: World, metadata: Int) = if (!world.isRemote) new TileNBTContainer else null

override def isBlockSolid(
world: IBlockAccess,
x: Int,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,18 @@ package codechicken.multipart.handler

import net.minecraft.tileentity.TileEntity
import net.minecraft.nbt.NBTTagCompound
import java.util.Map

import java.util.{Collections, Map}
import net.minecraft.world.chunk.Chunk
import net.minecraft.world.ChunkPosition
import codechicken.multipart.{MultipartHelper, TileMultipart}
import codechicken.lib.asm.ObfMapping
import codechicken.multipart
import net.minecraft.world.World

import scala.collection.mutable
import codechicken.multipart.MultipartHelper.IPartTileConverter

import scala.collection.JavaConversions._

/** Hack due to lack of TileEntityLoadEvent in forge
Expand All @@ -19,12 +23,48 @@ object MultipartSaveLoad {
var loadingWorld: World = _

class TileNBTContainer extends TileEntity {
var ticks = 0
var failed = false
var loaded = false
var tag: NBTTagCompound = _

override def readFromNBT(t: NBTTagCompound) {
super.readFromNBT(t)
tag = t
}

override def updateEntity(): Unit = {
if (failed || loaded) {
return
}

if (tag == null) {
if (ticks >= 600) {
failed = true
multipart.logger.warn(s"SavedMultipart at ($xCoord, $yCoord, $zCoord) still exists after $ticks!")
worldObj.removeTileEntity(xCoord, yCoord, zCoord)
}
ticks += 1
return
}

if (worldObj.isRemote)
return

val newTile = TileMultipart.createFromNBT(tag)
if (newTile == null) {
worldObj.removeTileEntity(xCoord, yCoord, zCoord)
return
}

newTile.validate()
worldObj.setTileEntity(xCoord, yCoord, zCoord, newTile)
newTile.notifyTileChange()
val chunk = worldObj.getChunkFromBlockCoords(xCoord, zCoord)
val packet = MultipartSPH.getDescPacket(chunk, Collections.singleton[TileEntity](newTile).iterator)
packet.sendToChunk(worldObj, chunk.xPosition, chunk.zPosition)
loaded = true
}
}

def hookLoader() {
Expand Down

0 comments on commit a88178f

Please sign in to comment.