PRC8/nwn/nwnprc/trunk/scripts/prc_ondeath.nss
Jaysyn904 b7eacd3b48 Fixed Lolth's meat affecting undead & constructs
Fixed Lolth's meat affecting undead & constructs.  Fixed Frightful Prescence triggering on dead creatures.  Fixed shadowdancer weapon feats.  Added missing simple weapon feats.
2024-09-09 20:24:56 -04:00

145 lines
5.7 KiB
Plaintext

//::///////////////////////////////////////////////
//:: OnPlayerDeath eventscript
//:: prc_ondeath
//:://////////////////////////////////////////////
/*
This is also triggered by the NPC OnDeath event.
*/
#include "prc_inc_combat"
#include "psi_inc_psifunc"
#include "inc_ecl"
#include "prc_inc_assoc"
void PreyOnTheWeak(object oDead)
{
float fRange = FeetToMeters(10.0);
int i = 1;
object oPrey = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, oDead, i, CREATURE_TYPE_IS_ALIVE, TRUE);
while(GetIsObjectValid(oPrey) && GetDistanceBetween(oPrey, oDead) < fRange)
{
if(GetHasSpellEffect(MOVE_TC_PREY_ON_THE_WEAK, oPrey))
{
if(!GetLocalInt(oPrey, "PRC_POTW_HAS_ATTACKED"))
{
//GetNearestEnemy
object oAoOTarget = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, oPrey, 1, CREATURE_TYPE_IS_ALIVE, TRUE);
if(GetIsObjectValid(oAoOTarget) && GetDistanceBetween(oPrey, oAoOTarget) < fRange)
{
effect eNone;
object oWeap = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPrey);
//SetLocalInt
SetLocalInt(oPrey, "PRC_POTW_HAS_ATTACKED", 1);
PerformAttack(oAoOTarget, oPrey, eNone, 0.0, 0, 0, GetWeaponDamageType(oWeap), "Prey on the Weak Hit", "Prey on the Weak Miss");
//Set up removal
DelayCommand(RoundsToSeconds(1), DeleteLocalInt(oPrey, "PRC_POTW_HAS_ATTACKED"));
}
}
}
i++;
oPrey = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, oDead, i, CREATURE_TYPE_IS_ALIVE, TRUE);
}
}
void main()
{
object oDead = GetLastBeingDied();
object oKiller = MyGetLastKiller();
// We are not actually dead until -10
// Unless it's a spell death
//int nHP = GetCurrentHitPoints(oDead);
//if ((nHP >= -9) || (GetLocalInt(oTarget, "PRC_PNP_EfectDeathApplied"))
// return;
// Unsummon familiar/animal companions
DelayCommand(0.1f, UnsummonCompanions(oDead));
// Clear a damage tracking variable. Oni's stuff uses this
SetLocalInt(oDead, "PC_Damage", 0);
// Do Lolth's Meat for the killer
if(GetAbilityScore(oDead, ABILITY_INTELLIGENCE) >= 4
&& GetHasFeat(FEAT_LOLTHS_MEAT, oKiller)
&& GetRacialType(oDead) != RACIAL_TYPE_UNDEAD
&& GetRacialType(oDead) != RACIAL_TYPE_CONSTRUCT)
{
/*effect eLink = EffectSavingThrowIncrease(SAVING_THROW_ALL, 1, SAVING_THROW_TYPE_ALL);
eLink = EffectLinkEffects(eLink, EffectAttackIncrease(1, ATTACK_BONUS_MISC));
eLink = EffectLinkEffects(eLink, EffectDamageIncrease(DAMAGE_BONUS_1, DAMAGE_TYPE_DIVINE));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oKiller, RoundsToSeconds(5));
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_EVIL_HELP), oKiller);*/
ExecuteScript("prc_lolthmeat", oKiller);
}
// Do Mind Cleave feat
if(GetHasFeat(FEAT_MIND_CLEAVE, oKiller))
{
SetLocalInt(oKiller, "MindCleave", TRUE);
ExecuteScript("psi_sk_psychsrtk", oKiller);
DelayCommand(0.25, DeleteLocalInt(oKiller, "MindCleave"));
}
// Do Merciless Purity from Shadowbane Inq
if(GetLocalInt(oDead, "MercilessPurity") && GetIsObjectValid(GetLocalObject(oDead, "Shadowbane")))
{
object oShadow = GetLocalObject(oDead, "Shadowbane");
effect eLink = EffectSavingThrowIncrease(SAVING_THROW_FORT, 1, SAVING_THROW_TYPE_ALL);
eLink = EffectLinkEffects(eLink, EffectSavingThrowIncrease(SAVING_THROW_REFLEX, 1, SAVING_THROW_TYPE_ALL));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oShadow, HoursToSeconds(24));
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_GOOD_HELP), oShadow);
if (DEBUG) FloatingTextStringOnCreature("Merciless Purity activated", oShadow, FALSE);
}
if(GetPRCSwitch(PRC_XP_USE_PNP_XP))
{
if(GetObjectType(oKiller) == OBJECT_TYPE_TRIGGER)
oKiller = GetTrapCreator(oKiller);
if(oKiller != oDead
&& GetIsObjectValid(oKiller)
&& !GetIsFriend(oKiller, oDead)
&& (GetIsObjectValid(GetFirstFactionMember(oKiller, TRUE))
|| GetPRCSwitch(PRC_XP_GIVE_XP_TO_NON_PC_FACTIONS)))
{
GiveXPRewardToParty(oKiller, oDead);
/* Not needed as we now disabled the bioware system if this is enabled
*
//bypass bioware XP system
//AssignCommand(oDead, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), oDead));
SetLocalInt(oDead, "PRC_PNP_XP_DEATH", 1);
//AssignCommand(oDead, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10000, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_TWENTY), oDead));
AssignCommand(oDead, ApplyEffectToObject(DURATION_TYPE_INSTANT, SupernaturalEffect(EffectDeath()), oDead));
*/
}
}
// Prey on the Weak
PreyOnTheWeak(oDead);
if(GetPRCSwitch(PRC_PW_DEATH_TRACKING) && GetIsPC(oDead))
SetPersistantLocalInt(oDead, "persist_dead", TRUE);
// Psionic creatures lose all PP on death
if(GetIsPsionicCharacter(oDead))
LoseAllPowerPoints(oDead, TRUE);
DeleteLocalInt(oDead, "PRC_SPELL_CHARGE_COUNT");
DeleteLocalInt(oDead, "PRC_SPELL_HOLD");
// Trigger the death/bleed if the PRC Death system is enabled (ElgarL).
if((GetPRCSwitch(PRC_PNP_DEATH_ENABLE)) && GetIsPC(oDead))
AddEventScript(oDead, EVENT_ONHEARTBEAT, "prc_timer_dying", TRUE, FALSE);
// Execute scripts hooked to this event for the player triggering it
ExecuteAllScriptsHookedToEvent(oDead, EVENT_ONPLAYERDEATH);
}