public static bool FindPtxEffectRule(PgDictionary *ptxRulesDict, string fxName, out IntPtr result)
        {
            if (bInitialized == false)
            {
                result = IntPtr.Zero;
                return(false);
            }

            for (var i = 0; i < ptxRulesDict->ItemsCount; i++)
            {
                var itAddress = Marshal.ReadIntPtr(ptxRulesDict->Items + i * 8);

                if (itAddress == IntPtr.Zero)
                {
                    continue;
                }

                var szName = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(itAddress + 0x20));

                if (szName != fxName)
                {
                    continue;
                }

                result = itAddress;

                return(true);
            }

            result = IntPtr.Zero;

            return(false);
        }
Beispiel #2
0
        public static bool FindPtxEffectRule(PgDictionary *ptxRulesDict, string fxName, out IntPtr result)
        {
            IntPtr itAddress;

            for (int i = 0; i < ptxRulesDict->ItemsCount; i++)
            {
                itAddress = Marshal.ReadIntPtr(ptxRulesDict->Items + i * 8);

                if (itAddress != null)
                {
                    string szName = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(itAddress + 0x20));

                    if (szName == fxName)
                    {
                        //Logger.Log(string.Format("GetPTFXAssetRule() - Returning asset at 0x{0:X}.", itAddress));

                        result = itAddress;

                        return(true);
                    }
                }
            }
            result = IntPtr.Zero;
            return(false);
        }
        /*private static void DumpPtxEffectRule(PgDictionary* ptxRulesDict)
         * {
         *  using (var writer = XmlWriter.Create("scripts\\ptfx_dump.xml",
         *      new XmlWriterSettings { Indent = true }))
         *  {
         *      writer.WriteStartDocument();
         *
         *      writer.WriteStartElement("ptxEffectRules");
         *
         *      for (var i = 0; i < ptxRulesDict->ItemsCount; i++)
         *      {
         *          var itAddress = Marshal.ReadIntPtr(ptxRulesDict->Items + i * 8);
         *
         *          if (itAddress == IntPtr.Zero) continue;
         *
         *          var szName = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(itAddress + 0x20));
         *
         *          if (string.IsNullOrEmpty(szName)) continue;
         *
         *          var emitters = Marshal.ReadIntPtr(itAddress + 0x38);
         *
         *          var emitterCount = Marshal.ReadInt16(itAddress + 0x40);
         *
         *          writer.WriteStartElement("ptxEffectRule");
         *
         *          writer.WriteAttributeString("name", szName);
         *
         *          writer.WriteStartElement("ptxEventEmitters");
         *
         *          for (int e = 0; e < emitterCount; e++)
         *          {
         *              writer.WriteStartElement("item");
         *
         *              var itEmitter = Marshal.ReadIntPtr(emitters + 0x8 * e);
         *
         *              string emitterName = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(itEmitter + 0x30));
         *
         *              //string secondaryName = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(itEmitter + 0x38));
         *
         *              writer.WriteAttributeString("name", emitterName);
         *
         *              writer.WriteEndElement();
         *          }
         *
         *          writer.WriteEndElement();
         *
         *          var parameters = Marshal.ReadIntPtr(itAddress + 0x48);
         *
         *          if (parameters != IntPtr.Zero)
         *          {
         *              writer.WriteStartElement("ptxEvolutionArgs");
         *
         *              var parametersList = Marshal.ReadIntPtr(parameters);
         *
         *              var numParams = Marshal.ReadInt16(parameters + 0x8);
         *
         *              for (int p = 0; p < numParams; p++)
         *              {
         *                  var itParam = parametersList + p * 0x18;
         *
         *                  writer.WriteStartElement("item");
         *
         *                  writer.WriteAttributeString("name", Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(itParam)));
         *
         *                  writer.WriteEndElement();
         *              }
         *
         *              writer.WriteEndElement();
         *          }
         *
         *          writer.WriteEndElement();
         *      }
         *
         *      writer.WriteEndElement();
         *
         *      writer.WriteEndDocument();
         *  }
         * }*/

        private static void DumpPtxEffectRule(PgDictionary *ptxRulesDict, string dict)
        {
            string path = @"scripts\Particle Asset Dump\" + dict + ".txt";

            File.Delete(path);

            using (StreamWriter sw = File.CreateText(path))
            {
                for (var i = 0; i < ptxRulesDict->ItemsCount; i++)
                {
                    var itAddress = Marshal.ReadIntPtr(ptxRulesDict->Items + i * 8);

                    if (itAddress == IntPtr.Zero)
                    {
                        continue;
                    }

                    var szName = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(itAddress + 0x20));

                    if (string.IsNullOrEmpty(szName))
                    {
                        continue;
                    }

                    sw.Write("\"" + szName + "\"");

                    var parameters = Marshal.ReadIntPtr(itAddress + 0x48);

                    if (parameters != IntPtr.Zero)
                    {
                        string argsString = "-> ";

                        var parametersList = Marshal.ReadIntPtr(parameters);

                        var numParams = Marshal.ReadInt16(parameters + 0x8);

                        for (int p = 0; p < numParams; p++)
                        {
                            var itParam = parametersList + p * 0x18;

                            argsString += Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(itParam));

                            if (p < numParams - 1)
                            {
                                argsString += ", ";
                            }
                        }

                        sw.Write(argsString);
                    }

                    sw.WriteLine();
                }
            }
        }
        private static void PtxEffectRuleToXML(PgDictionary *ptxRulesDict, FxAsset fxAsset)
        {
            for (var i = 0; i < ptxRulesDict->ItemsCount; i++)
            {
                var itAddress = Marshal.ReadIntPtr(ptxRulesDict->Items + i * 8);

                if (itAddress == IntPtr.Zero)
                {
                    continue;
                }

                var ptfxName = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(itAddress + 0x20));

                if (string.IsNullOrEmpty(ptfxName))
                {
                    continue;
                }

                FxName fx = new FxName(ptfxName, new List <FxEvolution>());

                var parameters = Marshal.ReadIntPtr(itAddress + 0x48);

                if (parameters != IntPtr.Zero)
                {
                    var parametersList = Marshal.ReadIntPtr(parameters);

                    var numParams = Marshal.ReadInt16(parameters + 0x8);

                    for (int p = 0; p < numParams; p++)
                    {
                        var itParam = parametersList + p * 0x18;

                        string evolutionParam = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(itParam));
                        fx.EvolutionList.Add(new FxEvolution(evolutionParam, 1.0f));
                    }
                }

                fxAsset.FxNames.Add(fx);
            }
        }
Beispiel #5
0
        public static void PatchPtfx()
        {
            //Logger.Log("PatchPTFX() - Patching PTFX...");

            PgDictionary *ptxRulesDict = GetPtfxRuleDictionary("core");

            IntPtr result;

            if (FindPtxEffectRule(ptxRulesDict, "ent_amb_smoke_foundry", out result))
            {
                //Logger.Log("PatchPTFX() - Found particle asset rule...");

                Color color = Color.FromArgb(230, 47, 46, 51);

                //  SetPtxParticleEmitterColour(result, "ent_amb_smoke_foundry_end", Color.Black);

                //  SetPtxParticleEmitterColour(result, "ent_amb_smoke_foundry_core", Color.Black);

                SetPtxParticleEmitterColour(result, "ent_amb_smoke_foundry_core2", Color.Black);

                //Logger.Log("PatchPTFX() - Success!");
            }
        }