public async Task SaveAsync(string path) { var scene = LuzScene; var file = new LvlFile { LvlVersion = 0x26 }; if (Objects?.Count > 0) { file.LevelObjects = new LevelObjects(file.LvlVersion) { Templates = Objects.Select(o => o.Template).ToArray() }; } if (!string.IsNullOrWhiteSpace(SkyBox)) { var skyConfig = new LevelSkyConfig { Skybox = { [0] = SkyBox } }; file.LevelSkyConfig = skyConfig; } file.LevelInfo = new LevelInfo { RevisionNumber = Revision }; await using var stream = File.Create(Path.Combine(path, scene.FileName)); using var writer = new BitWriter(stream); file.Serialize(writer); }
public static async Task UpgradeZone(string path) { var origin = path; var id = Interface.Database["ZoneTable"].ClaimKey(100); path = Path.Combine(Interface.Configuration.Output, "maps", path); LuzFile luz; var root = Path.GetDirectoryName(path); await using (var stream = File.OpenRead(path)) { using var reader = new BitReader(stream); luz = new LuzFile(); luz.Deserialize(reader); } foreach (var scene in luz.Scenes) { LvlFile lvl; var scenePath = Path.Combine(root, scene.FileName); await using (var stream = File.OpenRead(scenePath)) { using var reader = new BitReader(stream); lvl = new LvlFile(); lvl.Deserialize(reader); } if (lvl.IsOld) { Console.WriteLine($"Converting {scene.SceneName} to new."); lvl.ConvertToNew(); await using (var stream = File.Create(scenePath)) { using var writer = new BitWriter(stream); lvl.Serialize(writer); } } var spawnPoint = lvl.LevelObjects?.Templates?.FirstOrDefault(l => l.Lot == 4945); if (spawnPoint == null) { continue; } luz.SpawnPoint = spawnPoint.Position; luz.SpawnRotation = spawnPoint.Rotation; } if (luz.Version < 0x26) { Console.WriteLine($"Converting {Path.GetFileName(path)} to new."); luz.Version = 0x26; luz.WorldId = (uint)id; await using (var stream = File.Create(path)) { using var writer = new BitWriter(stream); luz.Serialize(writer); } } Console.WriteLine("Updating terrain."); var terrainPath = Path.Combine(root, luz.TerrainFileName); var terrain = await TerrainEditor.OpenAsync(terrainPath); foreach (var chunk in terrain.Source.Chunks) { for (var i = 0; i < chunk.ColorRelatedArray.Length; i++) { chunk.ColorRelatedArray[i] = 1; } } await terrain.SaveAsync(terrainPath); Console.WriteLine($"Adding [{id}] {Path.GetFileName(path)} to database."); var zones = Interface.Database["ZoneTable"]; var row = zones.Create(id); var _ = new ZoneTableTable(row) { zoneName = origin, zoneID = (int)luz.WorldId, ghostdistance = 500, scriptID = -1, locStatus = 0 }; }