private static void SaveTileEntities(string prefabName, Vector3i pos1, Vector3i pos2) { Dictionary <Vector3i, TileEntity> tileEntities = CollectTileEntities(pos1, pos2); var filePath = Path.Combine(Constants.PrefabsFolder, prefabName + TileEntityFileExtension); // Save all tile entities using (var writer = new BinaryWriter(new FileStream(filePath, FileMode.Create))) { writer.Write(TileEntityFileMarker); // [string] constant "7DTD-TE" writer.Write(TileEntityFileVersion); // [Int32] file version number NetworkUtils.Write(writer, pos1); // [Vector3i] original area worldPos1 NetworkUtils.Write(writer, pos2); // [Vector3i] original area worldPos2 // see Assembly-CSharp::Chunk.write() -> search "tileentity.write" writer.Write(tileEntities.Count); // [Int32] number of tile entities foreach (var keyValue in tileEntities) { var posInWorld = keyValue.Key; var tileEntity = keyValue.Value; var posInPrefab = posInWorld - pos1; NetworkUtils.Write(writer, posInPrefab); // [3xInt32] position relative to prefab writer.Write((byte)tileEntity.GetTileEntityType()); // [byte] TileEntityType enum tileEntity.write(writer, TileEntity.StreamModeWrite.Persistency); // [dynamic] tile entity data depending on type Log.Debug($"Wrote tile entity {tileEntity}."); var tileEntityPowered = tileEntity as TileEntityPowered; if (tileEntityPowered != null) { if (!RepairEngine.IsValidTileEntityPowered(tileEntityPowered)) { throw new FriendlyMessageException("The area contains a corrupt power block. Please fix it first with the \"dj-repair\" command."); } var powerItem = tileEntityPowered.GetPowerItem() ?? PowerItem.CreateItem(tileEntityPowered.PowerItemType); SavePowerItem(writer, powerItem); // [dynamic] PowerItem data } } } Log.Out($"Exported {tileEntities.Count} tile entities for prefab {prefabName} from area {pos1} to {pos2}."); }