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); }
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); } }
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!"); } }