//:://///////////////////////////////////////////// //:: Name ds_ai_ondeath //:: Copyright (c) 2022 Project RATDOG //::////////////////////////////////////////////// /* NPC OnDeath event script caller to run CODI AI & PRC events. */ //::////////////////////////////////////////////// //:: Created By: Jaysyn //:: Created On: 20221201 //::////////////////////////////////////////////// // Necromancy 101 ///////// #include "_inc_livingdead_" #include "_inc_battlecry_" //////////////////////////// #include "nw_i0_spells" #include "nw_i0_plot" #include "prc_inc_spells" #include "prc_inc_racial" void DropArmor(object oNPC) { object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oNPC); object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oNPC); //:: Give a 3% chance to drop armor &/or equipped weapon int bDroppableA = d100() > 97; int bDroppableW = d100() > 97; SetDroppableFlag(oArmor, bDroppableA); SetDroppableFlag(oWeapon, bDroppableW); } void main() { //:: Declare major variables object oNPC = OBJECT_SELF; object oPC = GetLastKiller(); int nKillFlag = GetLocalInt(GetLastKiller(), "KILL_TASK_FLAG"); string sTagSelf = GetTag(oNPC); string sTagTarget = GetLocalString(oPC, "KILL_TASK_TARGET"); string sResRef = GetResRef(oNPC); if (GetLocalInt(GetModule(),"X3_ENABLE_MOUNT_DB")&&GetIsObjectValid(GetMaster(OBJECT_SELF))) SetLocalInt(GetMaster(OBJECT_SELF),"bX3_STORE_MOUNT_INFO",TRUE); // Makes sure armor's droppable flag is set to 0 /* SetDroppableFlag(GetItemInSlot(INVENTORY_SLOT_CHEST, OBJECT_SELF), 0); if ((GetResRef(oNPC) == "ra_bandit001") || (GetResRef(oNPC) == "ra_brigand001") || (GetResRef(oNPC) == "ra_brigand002")) { object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oNPC); object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oNPC); object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oNPC); // Give a 3% chance to drop armor &/or equipped weapon int bDroppableA = d100() > 97; int bDroppableW = d100() > 97; int bDroppableS = d100() > 97; SetDroppableFlag(oArmor, bDroppableA); SetDroppableFlag(oWeapon, bDroppableW); SetDroppableFlag(oWeapon, bDroppableS); }*/ //:: Small chance to drop certain NPC armor if ((GetResRef(oNPC) == "NPC_KLEDGUARD") || (GetResRef(oNPC) == "NPC_IANTO_GUARD1") || (GetResRef(oNPC) == "NPC_IANTO_GUARD2") || (GetResRef(oNPC) == "ds_vorlon_guard1") || (GetResRef(oNPC) == "silt_pirate001") || (GetResRef(oNPC) == "ds_vorlon_guard2")) { DropArmor(oNPC); } //:: Check for correct Kill Task quest target and complete if(sTagSelf == sTagTarget && nKillFlag == 1) { SetLocalInt(oPC, "KILL_TASK_FLAG", 2); AddJournalQuestEntry("kt_journal_01", 99, oPC); } int nInsanity = GetLocalInt(OBJECT_SELF,"INSANITY"); if(nInsanity) { object oCaster = OBJECT_SELF; object oTarget = GetLastKiller(); effect eConfuse = EffectConfused(); effect eImpact = EffectVisualEffect(VFX_FNF_LOS_NORMAL_20); effect eVis = EffectVisualEffect(VFX_IMP_CONFUSION_S); effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DISABLED); effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); effect eLink = EffectLinkEffects(eMind, eConfuse); eLink = EffectLinkEffects(eLink, eDur); eLink = SupernaturalEffect(eLink); // Get oCaster's DC int nCreCHAMod = GetAbilityModifier(ABILITY_CHARISMA, oCaster); int nCreHD = GetHitDice (oCaster); int nDC = (10 + (nCreHD/2) + nCreCHAMod); ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, GetSpellTargetLocation()); if ( !PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_MIND_SPELLS, oCaster)) { ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget); // Apply Viz ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget); AssignCommand(oTarget,SpeakString("*The "+GetName(oCaster)+" has driven you insane!*")); } } int nVFX = GetLocalInt(OBJECT_SELF,"SpawnVFX"); if(nVFX) { ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(EffectVisualEffect(nVFX)),OBJECT_SELF); } int nFirey = GetLocalInt(OBJECT_SELF,"FIREY"); if (nFirey) { effect eVis = EffectVisualEffect(VFX_DUR_INFERNO_NO_SOUND); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } int nShadowy = GetLocalInt(OBJECT_SELF,"SHADOWY"); if (nShadowy) { effect eVis = EffectVisualEffect(VFX_DUR_PROT_SHADOW_ARMOR); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } int nStony = GetLocalInt(OBJECT_SELF,"STONY"); if (nStony) { effect eVis = EffectVisualEffect(VFX_DUR_PROT_STONESKIN); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } int nWoody = GetLocalInt(OBJECT_SELF,"WOODY"); if (nWoody) { effect eVis = EffectVisualEffect(VFX_DUR_PROT_BARKSKIN); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } int nIcy = GetLocalInt(OBJECT_SELF,"ICY"); if (nIcy) { effect eVis = EffectVisualEffect(VFX_DUR_ICESKIN); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } int nConcealed20 = GetLocalInt(OBJECT_SELF,"CONCEALED20"); if (nConcealed20) { effect eVis = EffectVisualEffect(VFX_DUR_BLUR ); effect eConceal = EffectConcealment(20, 0); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } int nConcealed50 = GetLocalInt(OBJECT_SELF,"CONCEALED50"); if (nConcealed50) { effect eVis = EffectVisualEffect(VFX_DUR_BLUR ); effect eConceal = EffectConcealment(50, 0); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } int nGlow = GetLocalInt (OBJECT_SELF,"GLOW_COLOR"); if (nGlow == 1) { effect eVis = EffectVisualEffect(VFX_DUR_GLOW_BLUE); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } else if (nGlow == 2) { effect eVis = EffectVisualEffect(VFX_DUR_GLOW_BROWN); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } else if (nGlow == 3) { effect eVis = EffectVisualEffect(VFX_DUR_GLOW_GREEN); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } else if (nGlow == 4) { effect eVis = EffectVisualEffect(VFX_DUR_GLOW_GREY); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } else if (nGlow == 5) { effect eVis = EffectVisualEffect(VFX_DUR_GLOW_LIGHT_BLUE); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } else if (nGlow == 6) { effect eVis = EffectVisualEffect(VFX_DUR_GLOW_LIGHT_BROWN); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } else if (nGlow == 7) { effect eVis = EffectVisualEffect(VFX_DUR_GLOW_LIGHT_GREEN); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } else if (nGlow == 8) { effect eVis = EffectVisualEffect(VFX_DUR_GLOW_LIGHT_ORANGE); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } else if (nGlow == 9) { effect eVis = EffectVisualEffect(VFX_DUR_GLOW_LIGHT_PURPLE); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } else if (nGlow == 10) { effect eVis = EffectVisualEffect(VFX_DUR_GLOW_LIGHT_RED); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } else if (nGlow == 11) { effect eVis = EffectVisualEffect(VFX_DUR_GLOW_LIGHT_YELLOW); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } else if (nGlow == 12) { effect eVis = EffectVisualEffect(VFX_DUR_GLOW_ORANGE); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } else if (nGlow == 13) { effect eVis = EffectVisualEffect(VFX_DUR_GLOW_PURPLE); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } else if (nGlow == 14) { effect eVis = EffectVisualEffect(VFX_DUR_GLOW_RED); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } else if (nGlow == 15) { effect eVis = EffectVisualEffect(VFX_DUR_GLOW_WHITE); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } else if (nGlow == 16) { effect eVis = EffectVisualEffect(VFX_DUR_GLOW_YELLOW); eVis = SupernaturalEffect(eVis); eVis = ExtraordinaryEffect(eVis); DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF)); } //:: Vampire's Gaseous Form onDeath if(sResRef == "ra_vampspawn01" || sResRef == "ra_vampspawn02") { effect eVFX; object oSpawn; location lSelf = GetLocation(OBJECT_SELF); //:: Apply some visual effects & unload the model. eVFX = EffectVisualEffect(VFX_COM_UNLOAD_MODEL); ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oNPC); eVFX = EffectVisualEffect(VFX_COM_BLOOD_CRT_RED); ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oNPC); eVFX = EffectVisualEffect(491); ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oNPC); eVFX = EffectVisualEffect(VFX_COM_CHUNK_RED_SMALL); ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oNPC); eVFX = EffectVisualEffect(VFX_FNF_SMOKE_PUFF); ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oNPC); //:: Spawn Gaseous Form. eVFX = EffectVisualEffect(133); oSpawn = CreateObject(OBJECT_TYPE_CREATURE, "ra_vamp_gas_form", GetLocation(oNPC)); DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oSpawn));; } //:: Small chance to drop certain NPC armor if ((GetResRef(oNPC) == "NPC_KLEDGUARD") || (GetResRef(oNPC) == "NPC_IANTO_GUARD1") || (GetResRef(oNPC) == "NPC_IANTO_GUARD2") || (GetResRef(oNPC) == "ds_vorlon_guard1") || (GetResRef(oNPC) == "silt_pirate001") || (GetResRef(oNPC) == "silt_pirate002") || (GetResRef(oNPC) == "DS_THRAX001") || (GetResRef(oNPC) == "ds_vorlon_guard2")) { DropArmor(oNPC); } // Necromancy 101 /////////////////////// DoDeathCry(); if (UndeadCheck(GetLastKiller())) return; ///////////////////////////////////////// //:: Execute CODI AI NPC OnDeath script DelayCommand(0.0f, ExecuteScript("no_ai_dth", OBJECT_SELF)); //:: Execute Jasperre's NPC OnDeath script //ExecuteScript("nw_c2_default7", OBJECT_SELF); //:: Execute PRC NPC OnDeath script DelayCommand(0.0f, ExecuteScript("prc_npc_death", OBJECT_SELF)); //:: Execute PRC PW OnDeath scripts DelayCommand(0.0f, ExecuteScript("prc_pwondeath", OBJECT_SELF)); }