protected override DataStructures.MapObjects.Map GetFromStream(Stream stream) { var map = new DataStructures.MapObjects.Map(); var br = new BinaryReader(stream); // Only RMF version 2.2 is supported for the moment. var version = Math.Round(br.ReadSingle(), 1); if (Math.Abs(version - 2.2) > 0.01) { throw new ProviderException("Incorrect RMF version number. Expected 2.2, got " + version + "."); } map.Version = (decimal) version; // RMF header test var header = br.ReadFixedLengthString(Encoding.UTF8, 3); if (header != "RMF") { throw new ProviderException("Incorrect RMF header. Expected 'RMF', got '" + header + "'."); } // Visgroups var visgroups = ReadVisgroups(br); map.Visgroups.AddRange(visgroups); // Map Objects map.IDGenerator.Reset(); // So the world will be ID = 1 var worldspawn = ReadWorldSpawn(br, map.Visgroups, map.IDGenerator); map.WorldSpawn = worldspawn; // DOCINFO string check var docinfo = br.ReadFixedLengthString(Encoding.UTF8, 8); if (docinfo != "DOCINFO") { throw new ProviderException("Incorrect RMF format. Expected 'DOCINFO', got '" + docinfo + "'."); } // Cameras br.ReadSingle(); // Appears to be a version number for camera data. Unused. var activeCamera = br.ReadInt32(); var cameras = ReadCameras(br); map.Cameras.AddRange(cameras); if (activeCamera >= 0 && activeCamera < map.Cameras.Count) { map.ActiveCamera = map.Cameras[activeCamera]; } return map; }
/// <summary> /// Reads a map from a stream in MAP format. /// </summary> /// <param name="stream">The stream to read from</param> /// <returns>The parsed map</returns> protected override DataStructures.MapObjects.Map GetFromStream(Stream stream) { using (var reader = new StreamReader(stream)) { var map = new DataStructures.MapObjects.Map(); var allentities = ReadAllEntities(reader, map.IDGenerator); var worldspawn = allentities.FirstOrDefault(x => x.EntityData.Name == "worldspawn") ?? new Entity(0) {EntityData = {Name = "worldspawn"}}; allentities.Remove(worldspawn); map.WorldSpawn.EntityData = worldspawn.EntityData; allentities.ForEach(x => x.SetParent(map.WorldSpawn, false)); foreach (var obj in worldspawn.GetChildren().ToArray()) { obj.SetParent(map.WorldSpawn, false); } map.WorldSpawn.UpdateBoundingBox(false); return map; } }
protected override DataStructures.MapObjects.Map GetFromStream(Stream stream) { using (var reader = new StreamReader(stream)) { var parent = new GenericStructure("Root"); parent.Children.AddRange(GenericStructure.Parse(reader)); // Sections from a Hammer map: // - world // - entity // - visgroups // - cordon // Not done yet // - versioninfo // - viewsettings // - cameras var map = new DataStructures.MapObjects.Map(); var world = parent.GetChildren("world").FirstOrDefault(); var entities = parent.GetChildren("entity"); var visgroups = parent.GetChildren("visgroups").SelectMany(x => x.GetChildren("visgroup")); var cameras = parent.GetChildren("cameras").FirstOrDefault(); var cordon = parent.GetChildren("cordon").FirstOrDefault(); var viewsettings = parent.GetChildren("viewsettings").FirstOrDefault(); foreach (var visgroup in visgroups) { var vg = ReadVisgroup(visgroup); if (vg.ID < 0 && vg.Name == "Auto") continue; map.Visgroups.Add(vg); } if (world != null) map.WorldSpawn = ReadWorld(world, map.IDGenerator); foreach (var entity in entities) { var ent = ReadEntity(entity, map.IDGenerator); var groupid = entity.Children.Where(x => x.Name == "editor").Select(x => x.PropertyInteger("groupid")).FirstOrDefault(); var entParent = groupid > 0 ? map.WorldSpawn.Find(x => x.ID == groupid && x is Group).FirstOrDefault() ?? map.WorldSpawn : map.WorldSpawn; ent.SetParent(entParent); } var activeCamera = 0; if (cameras != null) { activeCamera = cameras.PropertyInteger("activecamera"); foreach (var cam in cameras.GetChildren("camera")) { var pos = cam.PropertyCoordinate("position"); var look = cam.PropertyCoordinate("look"); if (pos != null && look != null) { map.Cameras.Add(new Camera {EyePosition = pos, LookPosition = look}); } } } if (!map.Cameras.Any()) { map.Cameras.Add(new Camera { EyePosition = Coordinate.Zero, LookPosition = Coordinate.UnitY }); } if (activeCamera < 0 || activeCamera >= map.Cameras.Count) { activeCamera = 0; } map.ActiveCamera = map.Cameras[activeCamera]; if (cordon != null) { var start = cordon.PropertyCoordinate("mins", map.CordonBounds.Start); var end = cordon.PropertyCoordinate("maxs", map.CordonBounds.End); map.CordonBounds = new Box(start, end); map.Cordon = cordon.PropertyBoolean("active", map.Cordon); } if (viewsettings != null) { map.SnapToGrid = viewsettings.PropertyBoolean("bSnapToGrid", map.SnapToGrid); map.Show2DGrid = viewsettings.PropertyBoolean("bShowGrid", map.Show2DGrid); map.Show3DGrid = viewsettings.PropertyBoolean("bShow3DGrid", map.Show3DGrid); map.GridSpacing = viewsettings.PropertyDecimal("nGridSpacing", map.GridSpacing); map.IgnoreGrouping = viewsettings.PropertyBoolean("bIgnoreGrouping", map.IgnoreGrouping); map.HideFaceMask = viewsettings.PropertyBoolean("bHideFaceMask", map.HideFaceMask); map.HideNullTextures = viewsettings.PropertyBoolean("bHideNullTextures", map.HideNullTextures); map.TextureLock = viewsettings.PropertyBoolean("bTextureLock", map.TextureLock); map.TextureScalingLock = viewsettings.PropertyBoolean("bTextureScalingLock", map.TextureScalingLock); } return map; } }