public override object Execute(List <string> args) { bool iscluster = false; if (args.Count > 0 && args[0] == "cluster") { iscluster = true; } using (var stream = CacheContext.OpenCacheReadWrite()) { for (var sbspindex = 0; sbspindex < Scnr.StructureBsps.Count; sbspindex++) { var sbsp = (ScenarioStructureBsp)CacheContext.Deserialize(stream, Scnr.StructureBsps[sbspindex].StructureBsp); var converter = new GeometryToObjectConverter((GameCacheHaloOnlineBase)CacheContext, stream, CacheContext, stream, Scnr, sbspindex); var converted = new HashSet <short>(); var loopcounter = iscluster ? sbsp.Clusters.Count : sbsp.InstancedGeometryInstances.Count; for (int geometryIndex = 0; geometryIndex < loopcounter; geometryIndex++) { var meshindex = iscluster ? sbsp.Clusters[geometryIndex].MeshIndex : sbsp.InstancedGeometryInstances[geometryIndex].MeshIndex; if (converted.Contains(meshindex)) { continue; } converted.Add(meshindex); //strip digits from the end of the instancedgeometry name //string instancedgeoname = CacheContext.StringTable.GetString(InstancedGeometryBlock.Name); //var digits = new[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; //var instancedgeoname = tempname.TrimEnd(digits); //string NewName = $"objects\\reforge\\instanced_geometry\\{currentmeshindex}"; var objectTag = converter.ConvertGeometry(geometryIndex, null, iscluster); //if sbsp resource is null this tag will return null, and we skip to the next bsp if (objectTag == null) { break; } var instanceName = $"geometry_{geometryIndex:000}"; Console.WriteLine($"Converting geometry '{instanceName}'..."); //add new object to forge globals CachedTag forgeglobal = CacheContext.GetTag <ForgeGlobalsDefinition>(@"multiplayer\forge_globals"); var tmpforg = (ForgeGlobalsDefinition)CacheContext.Deserialize(stream, forgeglobal); tmpforg.Palette.Add(new ForgeGlobalsDefinition.PaletteItem { Name = Path.GetFileName(objectTag.Name), Type = ForgeGlobalsDefinition.PaletteItemType.Structure, CategoryIndex = 64, DescriptionIndex = -1, MaxAllowed = 0, Object = objectTag }); CacheContext.Serialize(stream, forgeglobal, tmpforg); CacheContext.SaveStrings(); } } if (CacheContext is GameCacheHaloOnlineBase hoCache) { hoCache.SaveTagNames(); } } Console.WriteLine("Done!"); return(true); }
public override object Execute(List <string> args) { var argStack = new Stack <string>(args.AsEnumerable().Reverse()); var portingFlags = ParsePortingFlags(argStack); if (argStack.Count < 1) { Console.WriteLine("ERROR: Expected bsp index!"); return(false); } var sbspIndex = int.Parse(argStack.Pop()); using (var blamCacheStream = BlamCache.OpenCacheRead()) using (var hoCacheStream = HoCache.OpenCacheReadWrite()) { var blamScnr = BlamCache.Deserialize <Scenario>(blamCacheStream, BlamCache.TagCache.FindFirstInGroup("scnr")); var blamSbsp = BlamCache.Deserialize <ScenarioStructureBsp>(blamCacheStream, blamScnr.StructureBsps[sbspIndex].StructureBsp); var desiredInstances = new Dictionary <int, string>(); if (argStack.Count > 0) { var identifier = argStack.Pop(); string desiredName = null; if (argStack.Count > 0) { desiredName = argStack.Pop(); } var index = FindBlockIndex(blamSbsp.Clusters, identifier); desiredInstances.Add(index, desiredName); } else { Console.WriteLine("------------------------------------------------------------------"); Console.WriteLine("Enter each cluster with the format <Index> [New tagname]"); Console.WriteLine("Enter a blank line to finish."); Console.WriteLine("------------------------------------------------------------------"); for (string line; !String.IsNullOrWhiteSpace(line = Console.ReadLine());) { var parts = line.Split(' '); var identifier = parts[0]; var name = parts.Length > 1 ? string.Join(" ", parts.Skip(1)) : null; var index = FindBlockIndex(blamSbsp.Clusters, identifier); if (index == -1) { Console.WriteLine($"ERROR: Instance not found by identifier {identifier}!"); return(false); } desiredInstances.Add(index, name); } } if (desiredInstances.Count < 1) { return(true); } var converter = new GeometryToObjectConverter(HoCache, hoCacheStream, BlamCache, blamCacheStream, blamScnr, sbspIndex); converter.PortTag.SetFlags(portingFlags); var forgTag = HoCache.TagCache.FindFirstInGroup("forg"); var forg = HoCache.Deserialize <ForgeGlobalsDefinition>(hoCacheStream, forgTag); var newTags = new List <CachedTag>(); foreach (var kv in desiredInstances) { try { var tag = converter.ConvertGeometry(kv.Key, kv.Value, true); forg.Palette.Add(new ForgeGlobalsDefinition.PaletteItem() { CategoryIndex = (short)1, DescriptionIndex = -1, Name = tag.Name, Object = tag, Type = ForgeGlobalsDefinition.PaletteItemType.Prop, Setters = new List <ForgeGlobalsDefinition.PaletteItem.Setter>() { new ForgeGlobalsDefinition.PaletteItem.Setter() { Target = ForgeGlobalsDefinition.PaletteItem.SetterTarget.General_Physics, IntegerValue = 1 // phased } } }); } finally { HoCache.SaveStrings(); HoCache.SaveTagNames(); } } HoCache.Serialize(hoCacheStream, forgTag, forg); } return(true); }
public override object Execute(List <string> args) { var argStack = new Stack <string>(args.AsEnumerable().Reverse()); var portingFlags = ParsePortingFlags(argStack); if (argStack.Count < 1) { Console.WriteLine("ERROR: Expected bsp index!"); return(false); } var sbspIndex = int.Parse(argStack.Pop()); using (var blamCacheStream = BlamCache.OpenCacheRead()) using (var hoCacheStream = HoCache.OpenCacheReadWrite()) { var blamScnr = BlamCache.Deserialize <Scenario>(blamCacheStream, BlamCache.TagCache.FindFirstInGroup("scnr")); var blamSbsp = BlamCache.Deserialize <ScenarioStructureBsp>(blamCacheStream, blamScnr.StructureBsps[sbspIndex].StructureBsp); var desiredInstances = new Dictionary <int, string>(); if (argStack.Count > 0) { var identifier = argStack.Pop(); string desiredName = null; if (argStack.Count > 0) { desiredName = argStack.Pop(); } var index = FindBlockIndex(blamSbsp.InstancedGeometryInstances, identifier); desiredInstances.Add(index, desiredName); } else { Console.WriteLine("------------------------------------------------------------------"); Console.WriteLine("Enter each instance with the format <Name or Index> [New tagname]"); Console.WriteLine("Enter a blank line to finish."); Console.WriteLine("------------------------------------------------------------------"); for (string line; !String.IsNullOrWhiteSpace(line = Console.ReadLine());) { var parts = line.Split(' '); var identifier = parts[0]; var name = parts.Length > 1 ? string.Join(" ", parts.Skip(1)) : null; var index = FindBlockIndex(blamSbsp.InstancedGeometryInstances, identifier); if (index == -1) { Console.WriteLine($"ERROR: Instance not found by identifier {identifier}!"); return(false); } desiredInstances.Add(index, name); } } if (desiredInstances.Count < 1) { return(true); } var converter = new GeometryToObjectConverter(HoCache, hoCacheStream, BlamCache, blamCacheStream, blamScnr, sbspIndex); converter.PortTag.SetFlags(portingFlags); foreach (var kv in desiredInstances) { try { var instance = blamSbsp.InstancedGeometryInstances[kv.Key]; var tag = converter.ConvertGeometry(kv.Key, kv.Value); } finally { HoCache.SaveStrings(); HoCache.SaveTagNames(); } } } return(true); }