Fixed Lolth's meat affecting undead & constructs. Fixed Frightful Prescence triggering on dead creatures. Fixed shadowdancer weapon feats. Added missing simple weapon feats.
145 lines
5.7 KiB
Plaintext
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);
|
|
}
|
|
|