/// <summary> /// Obtain a CGameEffect wrapper for an NWEffect instance. /// </summary> /// <param name="EffectInstance">Supplies the instance to wrap.</param> public GameEffect(NWEffect EffectInstance) { this.EffectInstance = EffectInstance; this.CGameEffectInstance = GetGameEffectInstance(EffectInstance); ReadGameEffectFields(); }
/// <summary> /// Obtain a function that can be used to read the m_EngineStructure /// field out of a NWScriptEngineStructure. A dynamically emitted /// method is required as the necessary operations cannot be expressed /// in C# but must be implemented instead in raw MSIL. /// </summary> /// <param name="Effect">Supplies a template NWEffect object to obtain /// type information from.</param> /// <returns>The method delegate to invoke.</returns> private static GetEngineStructurePtrDelegate ObtainGetEngineStructurePtr(NWEffect Effect) { if (GetEngineStructurePtr != null) { return(GetEngineStructurePtr); } // // Traverse the NWNScriptJITIntrinsics wrapper and obtain the // internal mixed mode NWScriptEngineStructure type. This type // contains a pointer to the native C++ object chain that may be // traversed to obtain the underlying CGameEffect. // // N.B. Accessing a native pointer type located on a type in a // non-directly-referenceable assembly cannot be performed // via conventional language-accessible methods or via // reflection. Instead, MSIL code must be generated to // perform the requisite field access and cast to IntPtr. // Type NWEngineStructureType = Effect.m_EngineStructure.GetType(); FieldInfo EngineStructurePtrField = NWEngineStructureType.GetField("m_EngineStructure", BindingFlags.Public | BindingFlags.Instance); DynamicMethod Method = new DynamicMethod("GetEngineStructurePtr", typeof(IntPtr), new Type[] { typeof(object) }, NWEngineStructureType, true); ILGenerator ILGen = Method.GetILGenerator(); ILGen.Emit(OpCodes.Ldarg_0); ILGen.Emit(OpCodes.Castclass, NWEngineStructureType); ILGen.Emit(OpCodes.Ldfld, EngineStructurePtrField); ILGen.Emit(OpCodes.Ret); GetEngineStructurePtr = (GetEngineStructurePtrDelegate)Method.CreateDelegate(typeof(GetEngineStructurePtrDelegate)); return(GetEngineStructurePtr); }
/// <summary> /// Obtain the internal CGameEffect object for this NWEffect instance. /// </summary> /// <param name="Effect">Supplies the effect instance to obtain the /// internal instance pointer for.</param> /// <returns></returns> private static IntPtr GetGameEffectInstance(NWEffect Effect) { // // Obtain the SharedPtr<EngineStructure> pointer from the NWEffect // wrapper (and underlying NWScriptEngineStructure). // IntPtr EngineStructurePtr = (IntPtr)ObtainGetEngineStructurePtr(Effect)(Effect.m_EngineStructure); // // Read SharedPtr<EngineStructure>.T, obtaining the // NWScript Accelerator's EngineStructureBridge pointer. // IntPtr EngineStructureBridgePtr = (IntPtr)Marshal.ReadIntPtr(EngineStructurePtr, Marshal.SizeOf(typeof(IntPtr))); // // Read EngineStructureBridge.m_Representation, obtaining the // CGameEffect instance. // // void * __VFN_table; // int m_EngineStructureType; // CNWVirtualMachineCmdImplementer * m_CmdImplementer; // void * m_Representation; // IntPtr GameEffectInstance = (IntPtr)Marshal.ReadIntPtr(EngineStructureBridgePtr, Marshal.SizeOf(typeof(IntPtr)) + sizeof(int) + Marshal.SizeOf(typeof(IntPtr))); return(GameEffectInstance); }
/// <summary> /// Obtain the internal CGameEffect object for this NWEffect instance. /// </summary> /// <param name="Effect">Supplies the effect instance to obtain the /// internal instance pointer for.</param> /// <returns></returns> private static IntPtr GetGameEffectInstance(NWEffect Effect) { // // Obtain the SharedPtr<EngineStructure> pointer from the NWEffect // wrapper (and underlying NWScriptEngineStructure). // IntPtr EngineStructurePtr = (IntPtr)ObtainGetEngineStructurePtr(Effect)(Effect.m_EngineStructure); // // Read SharedPtr<EngineStructure>.T, obtaining the // NWScript Accelerator's EngineStructureBridge pointer. // IntPtr EngineStructureBridgePtr = (IntPtr)Marshal.ReadIntPtr(EngineStructurePtr, Marshal.SizeOf(typeof(IntPtr))); // // Read EngineStructureBridge.m_Representation, obtaining the // CGameEffect instance. // // void * __VFN_table; // int m_EngineStructureType; // CNWVirtualMachineCmdImplementer * m_CmdImplementer; // void * m_Representation; // IntPtr GameEffectInstance = (IntPtr)Marshal.ReadIntPtr(EngineStructureBridgePtr, Marshal.SizeOf(typeof(IntPtr)) + sizeof(int) + Marshal.SizeOf(typeof(IntPtr))); return GameEffectInstance; }
private static void HandleTrapDetected(CLRScriptBase s, ALFA.Shared.ActiveTrap trap, uint detector) { trap.Detected = true; NWEffect vfx = s.SupernaturalEffect(s.EffectNWN2SpecialEffectFile(trap.TrapTriggerVFX, OBJECT_INVALID, s.Vector(0.0f, 0.0f, 0.0f))); s.ApplyEffectToObject(DURATION_TYPE_PERMANENT, vfx, s.GetObjectByTag(trap.Tag, 0), 0.0f); uint detectWidget = s.CreateObject(OBJECT_TYPE_PLACEABLE, "acr_trap_disarm", s.GetLocation(detector), TRUE, trap.Tag + "_"); if (!String.IsNullOrEmpty(trap.Description)) { s.SetDescription(detectWidget, trap.Description); } s.SetFirstName(detectWidget, String.Format("Disarm the {0} trap", trap.SpellTrap ? "Spell" : "Mechanical")); // If they clicked to walk, let's stop them from walking into the hazard they just found. if (s.GetCurrentAction(detector) == ACTION_MOVETOPOINT) { s.AssignCommand(detector, delegate { s.ClearAllActions(0); }); } s.PlaySound("alert", FALSE); s.ApplyEffectToObject(DURATION_TYPE_TEMPORARY, s.SupernaturalEffect(s.EffectNWN2SpecialEffectFile("fx_bang", detector, s.Vector(0.0f, 0.0f, 0.0f))), detector, 6.0f); s.SendMessageToPC(detector, "You spot a trap!"); }
public Int32 ScriptMain([In] object[] ScriptParameters, [In] Int32 DefaultReturnCode) { string ServerDescription; string Message; NWEffect e = EffectNWN2SpecialEffectFile("TESTFILE", OBJECT_SELF, GetPosition(OBJECT_SELF)); SendMessageToPC(OBJECT_SELF, "Effect type was: " + new ALFA.GameEffect(e).EffectType); Database.ACR_SQLQuery(String.Format("SELECT Name FROM servers WHERE ID = {0}", Database.ACR_GetServerID())); if (Database.ACR_SQLFetch()) { ServerDescription = Database.ACR_SQLGetData(); } else { ServerDescription = "<Database error>"; } Message = String.Format("This server (id {0}) is at {1} and is named {2}", Database.ACR_GetServerID(), Database.ACR_GetServerAddressFromDatabase(), ServerDescription); foreach (uint PCObject in GetPlayers(true)) { SendMessageToPC(PCObject, Message); SendMessageToPC(PCObject, "Install directory: " + SystemInfo.GetGameInstallationDirectory()); SendMessageToPC(PCObject, "Home directory: " + SystemInfo.GetHomeDirectory()); SendMessageToPC(PCObject, "NWNX4 directory: " + SystemInfo.GetNWNX4InstallationDirectory()); if (SystemInfo.GetModuleResourceName() != null) { SendMessageToPC(PCObject, "Module resource name: " + SystemInfo.GetModuleResourceName()); } } string ModName = SystemInfo.GetModuleResourceName(); if (ModName == null) { ModName = "alfa"; } /* * ResourceManager ResMan = new ResourceManager(ModName); * * foreach (OEIShared.IO.IResourceEntry ResEntry in ResMan.GetResourcesByType(ResourceManager.ResUTI)) * { * foreach (uint PCObject in GetPlayers(true)) * { * SendMessageToPC(PCObject, String.Format("Found resource {0} in repository {1}", ResEntry.FullName, ResEntry.Repository.Name)); * } * } */ return(DefaultReturnCode); }
public Int32 GetEffectInteger(NWEffect eTest, Int32 nIdx) { return ScriptHost.ExecuteActionService_892_2_GetEffectInteger(eTest, nIdx); }
public NWEffect VersusRacialTypeEffect(NWEffect eEffect, Int32 nRacialType) { return ScriptHost.ExecuteActionService_356_2_VersusRacialTypeEffect(eEffect, nRacialType); }
public NWEffect VersusTrapEffect(NWEffect eEffect) { return ScriptHost.ExecuteActionService_357_1_VersusTrapEffect(eEffect); }
public Int32 GetEffectType(NWEffect eEffect) { return ScriptHost.ExecuteActionService_170_1_GetEffectType(eEffect); }
/// <summary> /// Obtain a function that can be used to read the m_EngineStructure /// field out of a NWScriptEngineStructure. A dynamically emitted /// method is required as the necessary operations cannot be expressed /// in C# but must be implemented instead in raw MSIL. /// </summary> /// <param name="Effect">Supplies a template NWEffect object to obtain /// type information from.</param> /// <returns>The method delegate to invoke.</returns> private static GetEngineStructurePtrDelegate ObtainGetEngineStructurePtr(NWEffect Effect) { if (GetEngineStructurePtr != null) return GetEngineStructurePtr; // // Traverse the NWNScriptJITIntrinsics wrapper and obtain the // internal mixed mode NWScriptEngineStructure type. This type // contains a pointer to the native C++ object chain that may be // traversed to obtain the underlying CGameEffect. // // N.B. Accessing a native pointer type located on a type in a // non-directly-referenceable assembly cannot be performed // via conventional language-accessible methods or via // reflection. Instead, MSIL code must be generated to // perform the requisite field access and cast to IntPtr. // Type NWEngineStructureType = Effect.m_EngineStructure.GetType(); FieldInfo EngineStructurePtrField = NWEngineStructureType.GetField("m_EngineStructure", BindingFlags.Public | BindingFlags.Instance); DynamicMethod Method = new DynamicMethod("GetEngineStructurePtr", typeof(IntPtr), new Type[] { typeof(object) }, NWEngineStructureType, true); ILGenerator ILGen = Method.GetILGenerator(); ILGen.Emit(OpCodes.Ldarg_0); ILGen.Emit(OpCodes.Castclass, NWEngineStructureType); ILGen.Emit(OpCodes.Ldfld, EngineStructurePtrField); ILGen.Emit(OpCodes.Ret); GetEngineStructurePtr = (GetEngineStructurePtrDelegate)Method.CreateDelegate(typeof(GetEngineStructurePtrDelegate)); return GetEngineStructurePtr; }
public NWEffect SupernaturalEffect(NWEffect eEffect) { return ScriptHost.ExecuteActionService_113_1_SupernaturalEffect(eEffect); }
public UInt32 GetEffectCreator(NWEffect eEffect) { return ScriptHost.ExecuteActionService_91_1_GetEffectCreator(eEffect); }
public Int32 GetIsEffectValid(NWEffect eEffect) { return ScriptHost.ExecuteActionService_88_1_GetIsEffectValid(eEffect); }
public NWEffect SetEffectSpellId(NWEffect eTest, Int32 nSpellId) { return ScriptHost.ExecuteActionService_894_2_SetEffectSpellId(eTest, nSpellId); }
private static NWEffect GetTrapEffect(CLRScriptBase s, ALFA.Shared.ActiveTrap trap, uint target) { int damage = 0; for (int count = 0; count < trap.DiceNumber; count++) { damage += s.Random(trap.DiceType) + 1; } if (trap.SaveDC > -1) { if (s.ReflexSave(target, trap.SaveDC, SAVING_THROW_TYPE_TRAP, s.GetObjectByTag(trap.Tag, 0)) != TRUE) { if (s.GetHasFeat(FEAT_IMPROVED_EVASION, target, TRUE) == TRUE) { damage /= 2; } } else { if (s.GetHasFeat(FEAT_EVASION, target, TRUE) == TRUE) { damage = 0; } else { damage /= 2; } } } else { int roll = new Random().Next(20) + 1; int final = roll + trap.AttackBonus; string hitormiss = " *hit* "; if (final < s.GetAC(target, FALSE) && roll != 20) { hitormiss = " *miss* "; damage = 0; } s.SendMessageToPC(target, "<C=DarkViolet>Trap</C><C=DarkOrange> attacks " + s.GetName(target) + ":" + hitormiss + ": " + roll + " + " + trap.AttackBonus + " = " + final); } NWEffect eVis = s.EffectVisualEffect(VFX_COM_HIT_DIVINE, FALSE); List <int> damageTypes = new List <int>(); if ((trap.DamageType & DAMAGE_TYPE_ACID) == DAMAGE_TYPE_ACID) { damageTypes.Add(DAMAGE_TYPE_ACID); eVis = s.EffectVisualEffect(VFX_COM_HIT_ACID, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_BLUDGEONING) == DAMAGE_TYPE_BLUDGEONING) { damageTypes.Add(DAMAGE_TYPE_BLUDGEONING); eVis = s.EffectVisualEffect(VFX_COM_BLOOD_CRT_RED, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_COLD) == DAMAGE_TYPE_COLD) { damageTypes.Add(DAMAGE_TYPE_COLD); eVis = s.EffectVisualEffect(VFX_COM_HIT_FROST, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_DIVINE) == DAMAGE_TYPE_DIVINE) { damageTypes.Add(DAMAGE_TYPE_DIVINE); eVis = s.EffectVisualEffect(VFX_COM_HIT_DIVINE, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_ELECTRICAL) == DAMAGE_TYPE_ELECTRICAL) { damageTypes.Add(DAMAGE_TYPE_ELECTRICAL); eVis = s.EffectVisualEffect(VFX_COM_HIT_ELECTRICAL, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_FIRE) == DAMAGE_TYPE_FIRE) { damageTypes.Add(DAMAGE_TYPE_FIRE); eVis = s.EffectVisualEffect(VFX_COM_HIT_FIRE, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_MAGICAL) == DAMAGE_TYPE_MAGICAL) { damageTypes.Add(DAMAGE_TYPE_MAGICAL); eVis = s.EffectVisualEffect(VFX_COM_HIT_DIVINE, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_NEGATIVE) == DAMAGE_TYPE_NEGATIVE) { damageTypes.Add(DAMAGE_TYPE_NEGATIVE); eVis = s.EffectVisualEffect(VFX_COM_HIT_NEGATIVE, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_PIERCING) == DAMAGE_TYPE_PIERCING) { damageTypes.Add(DAMAGE_TYPE_PIERCING); eVis = s.EffectVisualEffect(VFX_COM_BLOOD_CRT_RED, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_POSITIVE) == DAMAGE_TYPE_POSITIVE) { damageTypes.Add(DAMAGE_TYPE_POSITIVE); eVis = s.EffectVisualEffect(VFX_COM_HIT_DIVINE, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_SLASHING) == DAMAGE_TYPE_SLASHING) { damageTypes.Add(DAMAGE_TYPE_SLASHING); eVis = s.EffectVisualEffect(VFX_COM_BLOOD_CRT_RED, FALSE); } if ((trap.DamageType & DAMAGE_TYPE_SONIC) == DAMAGE_TYPE_SONIC) { damageTypes.Add(DAMAGE_TYPE_SONIC); eVis = s.EffectVisualEffect(VFX_COM_HIT_SONIC, FALSE); } if (damage == 0) { return(eVis); } NWEffect eDam = eVis; damage /= damageTypes.Count; if (damage < 1) { damage = 1; } foreach (int dmgType in damageTypes) { eDam = s.EffectLinkEffects(eDam, s.EffectDamage(damage, dmgType, DAMAGE_POWER_NORMAL, FALSE)); } return(eDam); }
public void RemoveEffect(UInt32 oCreature, NWEffect eEffect) { ScriptHost.ExecuteActionService_87_2_RemoveEffect(oCreature, eEffect); }
public NWEffect EffectLinkEffects(NWEffect eChildEffect, NWEffect eParentEffect) { return ScriptHost.ExecuteActionService_199_2_EffectLinkEffects(eChildEffect, eParentEffect); }
public Int32 GetEffectDurationType(NWEffect eEffect) { return ScriptHost.ExecuteActionService_89_1_GetEffectDurationType(eEffect); }
public void ApplyEffectAtLocation(Int32 nDurationType, NWEffect eEffect, NWLocation lLocation, float fDuration) { ScriptHost.ExecuteActionService_216_4_ApplyEffectAtLocation(nDurationType, eEffect, lLocation, (Single)fDuration); }
public NWEffect MagicalEffect(NWEffect eEffect) { return ScriptHost.ExecuteActionService_112_1_MagicalEffect(eEffect); }
public void ApplyEffectToObject(Int32 nDurationType, NWEffect eEffect, UInt32 oTarget, float fDuration) { ScriptHost.ExecuteActionService_220_4_ApplyEffectToObject(nDurationType, eEffect, oTarget, (Single)fDuration); }
public NWEffect ExtraordinaryEffect(NWEffect eEffect) { return ScriptHost.ExecuteActionService_114_1_ExtraordinaryEffect(eEffect); }
public Int32 GetEffectSpellId(NWEffect eSpellEffect) { return ScriptHost.ExecuteActionService_305_1_GetEffectSpellId(eSpellEffect); }
public NWEffect VersusAlignmentEffect(NWEffect eEffect, Int32 nLawChaos, Int32 nGoodEvil) { return ScriptHost.ExecuteActionService_355_3_VersusAlignmentEffect(eEffect, nLawChaos, nGoodEvil); }
private void PopulateArea(CLRScriptBase script) { List <Vector3> trapsToSpawn = new List <Vector3>(); if (!DungeonStore.DungeonSpawns.ContainsKey(SpawnType)) { return; } foreach (uint wp in script.GetObjectsInArea(AreaId)) { if (script.GetTag(wp) == "MONSTER_LOW") { if (DungeonStore.DungeonSpawns[SpawnType].ContainsKey(CR / 3)) { script.CreateObject(CLRScriptBase.OBJECT_TYPE_CREATURE, DungeonStore.DungeonSpawns[SpawnType][CR / 3][rand.Next(DungeonStore.DungeonSpawns[SpawnType][CR / 3].Count)], script.GetLocation(wp), CLRScriptBase.TRUE, ""); } } else if (script.GetTag(wp) == "MONSTER_MED") { if (DungeonStore.DungeonSpawns[SpawnType].ContainsKey(CR / 2)) { script.CreateObject(CLRScriptBase.OBJECT_TYPE_CREATURE, DungeonStore.DungeonSpawns[SpawnType][CR / 2][rand.Next(DungeonStore.DungeonSpawns[SpawnType][CR / 2].Count)], script.GetLocation(wp), CLRScriptBase.TRUE, ""); } } else if (script.GetTag(wp) == "MONSTER_HIGH") { if (DungeonStore.DungeonSpawns[SpawnType].ContainsKey(CR)) { script.CreateObject(CLRScriptBase.OBJECT_TYPE_CREATURE, DungeonStore.DungeonSpawns[SpawnType][CR][rand.Next(DungeonStore.DungeonSpawns[SpawnType][CR].Count)], script.GetLocation(wp), CLRScriptBase.TRUE, ""); } if (!questSpawned) { questSpawned = true; NWEffect AoE = script.EffectAreaOfEffect(86, "acf_trg_onenter", "acf_trg_onheartbeat", "acf_trg_onexit", "AOE" + Quest); script.ApplyEffectAtLocation(CLRScriptBase.DURATION_TYPE_PERMANENT, script.SupernaturalEffect(AoE), script.GetLocation(wp), 0.0f); uint spawnedAoE = script.GetObjectByTag("AOE" + Quest, 0); script.SetLocalString(spawnedAoE, "ACR_QST_NAME", Quest); script.SetLocalInt(spawnedAoE, "ACR_QST_LOWER_STATE", 1); script.SetLocalInt(spawnedAoE, "ACR_QST_UPPER_STATE", 2); script.SetLocalString(spawnedAoE, "ACR_QST_MESSAGE", "This appears to be the end of the dungeon, and your path here is scouted."); } } else if (script.GetTag(wp) == "TRAP") { if (DungeonStore.DungeonTraps[TrapType].ContainsKey(CR)) { trapsToSpawn.Add(script.GetPosition(wp)); } } } foreach (Vector3 trap in trapsToSpawn) { script.ClearScriptParams(); script.AddScriptParameterInt(1); script.AddScriptParameterFloat(trap.x); script.AddScriptParameterFloat(trap.y); script.AddScriptParameterFloat(trap.z); script.AddScriptParameterObject(AreaId); script.AddScriptParameterInt(-1); script.AddScriptParameterInt(-1); script.AddScriptParameterFloat(-1.0f); script.AddScriptParameterInt(-1); script.AddScriptParameterInt(-1); script.AddScriptParameterInt(-1); script.AddScriptParameterInt(-1); script.AddScriptParameterInt(-1); script.AddScriptParameterInt(-1); script.AddScriptParameterObject(CLRScriptBase.OBJECT_INVALID); script.AddScriptParameterInt(-1); script.AddScriptParameterInt(-1); script.AddScriptParameterInt(-1); script.AddScriptParameterInt(-1); script.AddScriptParameterInt(-1); script.AddScriptParameterString(DungeonStore.DungeonTraps[TrapType][CR][rand.Next(DungeonStore.DungeonTraps[TrapType][CR].Count)]); script.ExecuteScriptEnhanced("ACR_Traps", script.GetModule(), CLRScriptBase.FALSE); } }