private static Array_uint TraverseHashArray(XmlNode node, MetaBuilder mb) { var items = new List <MetaHash>(); foreach (XmlNode cnode in node.ChildNodes) { var val = GetHash(cnode.InnerText); items.Add(val); } return(mb.AddHashArrayPtr(items.ToArray())); }
public byte[] Save() { //direct save to a raw, compressed ymap file (openIV-compatible format) //since Ymap object contents have been modified, need to recreate the arrays which are what is saved. BuildCEntityDefs(); BuildCCarGens(); //TODO: //BuildInstances(); //BuildLodLights(); //BuildDistantLodLights(); //BuildTimecycleModifiers(); //already being saved - update them.. //BuildBoxOccluders(); //BuildOccludeModels(); //BuildContainerLods(); MetaBuilder mb = new MetaBuilder(); var mdb = mb.EnsureBlock(MetaName.CMapData); CMapData mapdata = CMapData; if (CEntityDefs != null) { for (int i = 0; i < CEntityDefs.Length; i++) { var yent = AllEntities[i]; //save the extensions.. CEntityDefs[i].extensions = mb.AddWrapperArrayPtr(yent.Extensions); } } mapdata.entities = mb.AddItemPointerArrayPtr(MetaName.CEntityDef, CEntityDefs); mapdata.timeCycleModifiers = mb.AddItemArrayPtr(MetaName.CTimeCycleModifier, CTimeCycleModifiers); mapdata.physicsDictionaries = mb.AddHashArrayPtr(physicsDictionaries); mapdata.carGenerators = mb.AddItemArrayPtr(MetaName.CCarGen, CCarGens); if (CMloInstanceDefs != null) { LogSaveWarning("CMloInstanceDefs were present, may not save properly. (TODO!)"); } //clear everything out for now - TODO: fix if (mapdata.containerLods.Count1 != 0) { LogSaveWarning("containerLods were not saved. (TODO!)"); } if (mapdata.occludeModels.Count1 != 0) { LogSaveWarning("occludeModels were not saved. (TODO!)"); } if (mapdata.boxOccluders.Count1 != 0) { LogSaveWarning("boxOccluders were not saved. (TODO!)"); } if (mapdata.instancedData.GrassInstanceList.Count1 != 0) { LogSaveWarning("instancedData.GrassInstanceList was not saved. (TODO!)"); } if (mapdata.instancedData.PropInstanceList.Count1 != 0) { LogSaveWarning("instancedData.PropInstanceList was not saved. (TODO!)"); } if (mapdata.LODLightsSOA.direction.Count1 != 0) { LogSaveWarning("LODLightsSOA was not saved. (TODO!)"); } if (mapdata.DistantLODLightsSOA.position.Count1 != 0) { LogSaveWarning("DistantLODLightsSOA was not saved. (TODO!)"); } mapdata.containerLods = new Array_Structure(); mapdata.occludeModels = new Array_Structure(); mapdata.boxOccluders = new Array_Structure(); mapdata.instancedData = new rage__fwInstancedMapData(); mapdata.LODLightsSOA = new CLODLight(); mapdata.DistantLODLightsSOA = new CDistantLODLight(); var block = new CBlockDesc(); block.name = mb.AddStringPtr(Path.GetFileNameWithoutExtension(Name)); block.exportedBy = mb.AddStringPtr("CodeWalker"); block.time = mb.AddStringPtr(DateTime.UtcNow.ToString("dd MMMM yyyy HH:mm")); mapdata.block = block; string name = Path.GetFileNameWithoutExtension(Name); uint nameHash = JenkHash.GenHash(name); mapdata.name = new MetaHash(nameHash);//make sure name is upto date... mb.AddItem(MetaName.CMapData, mapdata); //make sure all the relevant structure and enum infos are present. mb.AddStructureInfo(MetaName.rage__fwInstancedMapData); mb.AddStructureInfo(MetaName.CLODLight); mb.AddStructureInfo(MetaName.CDistantLODLight); mb.AddStructureInfo(MetaName.CBlockDesc); mb.AddStructureInfo(MetaName.CMapData); mb.AddStructureInfo(MetaName.CEntityDef); mb.AddStructureInfo(MetaName.CTimeCycleModifier); if ((CCarGens != null) && (CCarGens.Length > 0)) { mb.AddStructureInfo(MetaName.CCarGen); } mb.AddEnumInfo((MetaName)1264241711); //LODTYPES_ mb.AddEnumInfo((MetaName)648413703); //PRI_ Meta meta = mb.GetMeta(); byte[] data = ResourceBuilder.Build(meta, 2); //ymap is version 2... return(data); }