private void ParseTowns(OtFileReader reader, OtFileNode otbNode) { OtFileNode nodeTown = otbNode.Child; while (nodeTown != null) { OtPropertyReader props = reader.GetPropertyReader(nodeTown); uint townid = props.ReadUInt32(); string townName = props.GetString(); var templeLocation = props.ReadLocation(); var town = new OtTown { Id = townid, Name = townName, TempleLocation = templeLocation }; towns[townid] = town; nodeTown = nodeTown.Next; } }
public void Load(string fileName, bool replaceTiles) { if (!File.Exists(fileName)) { throw new Exception(string.Format("File not found {0}.", fileName)); } string spawnFile = null; string houseFile = null; var tileLocations = new HashSet <ulong>(); using (var reader = new OtFileReader(fileName)) { OtFileNode node = reader.GetRootNode(); OtPropertyReader props = reader.GetPropertyReader(node); props.ReadByte(); // junk? var version = props.ReadUInt32(); props.ReadUInt16(); props.ReadUInt16(); var majorVersionItems = props.ReadUInt32(); var minorVersionItems = props.ReadUInt32(); if (version <= 0) { //In otbm version 1 the count variable after splashes/fluidcontainers and stackables //are saved as attributes instead, this solves alot of problems with items //that is changed (stackable/charges/fluidcontainer/splash) during an update. throw new Exception( "This map needs to be upgraded by using the latest map editor version to be able to load correctly."); } if (version > 3) { throw new Exception("Unknown OTBM version detected."); } if (majorVersionItems < 3) { throw new Exception( "This map needs to be upgraded by using the latest map editor version to be able to load correctly."); } if (majorVersionItems > Items.MajorVersion) { throw new Exception("The map was saved with a different items.otb version, an upgraded items.otb is required."); } if (minorVersionItems > Items.MinorVersion) { Trace.WriteLine("This map needs an updated items.otb."); } node = node.Child; if ((OtMapNodeTypes)node.Type != OtMapNodeTypes.MAP_DATA) { throw new Exception("Could not read data node."); } props = reader.GetPropertyReader(node); while (props.PeekChar() != -1) { byte attribute = props.ReadByte(); switch ((OtMapAttribute)attribute) { case OtMapAttribute.DESCRIPTION: var description = props.GetString(); //Descriptions.Add(description); break; case OtMapAttribute.EXT_SPAWN_FILE: spawnFile = props.GetString(); break; case OtMapAttribute.EXT_HOUSE_FILE: houseFile = props.GetString(); break; default: throw new Exception("Unknown header node."); } } OtFileNode nodeMapData = node.Child; while (nodeMapData != null) { switch ((OtMapNodeTypes)nodeMapData.Type) { case OtMapNodeTypes.TILE_AREA: ParseTileArea(reader, nodeMapData, replaceTiles, tileLocations); break; case OtMapNodeTypes.TOWNS: ParseTowns(reader, nodeMapData); break; } nodeMapData = nodeMapData.Next; } } }