Пример #1
0
        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}.");
        }