Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }