public static GameObject Import(string workingFile) { using var stream = File.OpenRead(workingFile); using var reader = new BitReader(stream); var terrain = new TerrainFile(); terrain.Deserialize(reader); return(Import(terrain)); }
public static async Task <TerrainEditor> OpenAsync(string path) { await using var stream = File.OpenRead(path); using var reader = new BitReader(stream); var file = new TerrainFile(); file.Deserialize(reader); return(new TerrainEditor(file)); }
public async Task LoadZoneDataAsync(int seek) { Zones.Clear(); Logger.Information("Parsing zone info..."); var zone = await ClientCache.FindAsync <ZoneTable>(seek); if (zone == default) { Logger.Error($"Cannot find zone {seek}"); return; } ; var luzFile = Path.Combine("maps", zone.ZoneName.ToLower()); if (!luzFile.EndsWith(".luz")) { return; } Logger.Information($"Parsing: {luzFile}"); try { var luz = new LuzFile(); await using var stream = _resources.GetStream(luzFile); var reader = new BitReader(stream); luz.Deserialize(reader); var path = Path.GetDirectoryName(luzFile); var lvlFiles = new List <LvlFile>(); foreach (var scene in luz.Scenes) { await using var sceneStream = _resources.GetStream(Path.Combine(path, scene.FileName)); using var sceneReader = new BitReader(sceneStream); Logger.Information($"Parsing: {scene.FileName}"); var lvl = new LvlFile(); lvl.Deserialize(sceneReader); lvlFiles.Add(lvl); if (lvl.LevelObjects?.Templates == default) { continue; } foreach (var template in lvl.LevelObjects.Templates) { template.ObjectId |= 70368744177664; } } var terrainStream = _resources.GetStream(Path.Combine(path, luz.TerrainFileName)); using var terrainReader = new BitReader(terrainStream); var terrain = new TerrainFile(); terrain.Deserialize(terrainReader); var triggers = await TriggerDictionary.FromDirectoryAsync(Path.Combine(_resources.RootPath, path)); Logger.Information($"Parsed: {seek}"); Zones[seek] = new ZoneInfo { LuzFile = luz, LvlFiles = lvlFiles, TriggerDictionary = triggers, TerrainFile = terrain }; } catch (Exception e) { Logger.Error($"Failed to parse {luzFile}: {e.Message}\n{e.StackTrace}"); } }
public static async Task ExportToWavefrontAsync(this LuzFile @this, AccessDatabase database, string source, string resources, string result) { TerrainFile terrain; await using (var stream = File.OpenRead(Path.Combine(source, @this.TerrainFileName))) { using var reader = new BitReader(stream); terrain = new TerrainFile(); terrain.Deserialize(reader); } var levels = new LvlFile[@this.Scenes.Length]; for (var i = 0; i < @this.Scenes.Length; i++) { var scene = @this.Scenes[i]; await using var stream = File.OpenRead(Path.Combine(source, scene.FileName)); using var reader = new BitReader(stream); var level = new LvlFile(); level.Deserialize(reader); levels[i] = level; } var objects = new List <LevelObjectTemplate>(); foreach (var level in levels) { if (level.LevelObjects?.Templates == default) { continue; } foreach (var template in level.LevelObjects.Templates) { if (!template.LegoInfo.TryGetValue("add_to_navmesh", out var add)) { continue; } if (!(bool)add) { continue; } objects.Add(template); } } foreach (var template in objects) { var instance = database.LoadObject(template.Lot); var renderer = instance.GetComponent <RenderComponentTable>(); if (renderer == default) { continue; } Console.WriteLine(renderer.render_asset); } }
public async Task LoadZoneDataAsync(int seek) { Zones.Clear(); Logger.Information("Parsing zone info..."); var luzFiles = _resources.GetAllFilesWithExtension("luz"); foreach (var luzFile in luzFiles) { Logger.Information($"Parsing: {luzFile}"); try { var luz = new LuzFile(); await using var stream = _resources.GetStream(luzFile); var reader = new BitReader(stream); luz.Deserialize(reader); if (luz.WorldId != seek) { continue; } var path = Path.GetDirectoryName(luzFile); var lvlFiles = new List <LvlFile>(); foreach (var scene in luz.Scenes) { await using var sceneStream = _resources.GetStream(Path.Combine(path, scene.FileName)); using var sceneReader = new BitReader(sceneStream); Logger.Information($"Parsing: {scene.FileName}"); var lvl = new LvlFile(); lvl.Deserialize(sceneReader); lvlFiles.Add(lvl); if (lvl.LevelObjects?.Templates == default) { continue; } foreach (var template in lvl.LevelObjects.Templates) { template.ObjectId |= 70368744177664; } } var terrainStream = _resources.GetStream(Path.Combine(path, luz.TerrainFileName)); using var terrainReader = new BitReader(terrainStream); var terrain = new TerrainFile(); terrain.Deserialize(terrainReader); var triggers = await TriggerDictionary.FromDirectoryAsync(Path.Combine(_resources.RootPath, path)); Logger.Information($"Parsed: {(ZoneId) luz.WorldId}"); Zones[(int)luz.WorldId] = new ZoneInfo { LuzFile = luz, LvlFiles = lvlFiles, TriggerDictionary = triggers, TerrainFile = terrain }; break; } catch (Exception e) { Logger.Error($"Failed to parse {luzFile}: {e.Message}\n{e.StackTrace}"); } } }