forked from Jaysyn/PRC8
Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
137 lines
4.8 KiB
Plaintext
137 lines
4.8 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: OnPlayerDying eventscript
|
|
//:: prc_ondying
|
|
//:://////////////////////////////////////////////
|
|
|
|
#include "inc_utility"
|
|
#include "x0_i0_position"
|
|
#include "moi_inc_moifunc"
|
|
|
|
//////////////////////////////////////////
|
|
// Private Functions //
|
|
//////////////////////////////////////////
|
|
|
|
void Kill_PC(object oPC)
|
|
{
|
|
effect eDeath = EffectDeath(FALSE, FALSE);
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oPC);
|
|
}
|
|
|
|
void feat_save(object oDying)
|
|
{
|
|
//////////////////////////////////////////
|
|
// FEAT_SHADOWDISCOPOR
|
|
//////////////////////////////////////////
|
|
|
|
// Telflammar Shadowlord Shadow Discorporation. If successfull, prevents the rest of the script from executing
|
|
/// @todo TLK the feedback strings
|
|
if(GetHasFeat(FEAT_SHADOWDISCOPOR, oDying) &&
|
|
(GetIsAreaAboveGround(GetArea(oDying)) == AREA_UNDERGROUND ||
|
|
GetIsNight() ||
|
|
PRCGetHasEffect(EFFECT_TYPE_DARKNESS, oDying)
|
|
))
|
|
{
|
|
int nRoll = d20();
|
|
int nDC = 5 + GetLocalInt(oDying, "PRC_LastDamageTaken");
|
|
int bSuccess = nRoll + GetReflexSavingThrow(oDying) >= nDC;
|
|
|
|
// Some informational spam
|
|
string sFeedback = "*Reflex Save vs Death : "
|
|
+ (bSuccess ? "*success*" : "*failure*")
|
|
+ " :(" + IntToString(nRoll) + " + " + IntToString(GetReflexSavingThrow(oDying)) + " = " + IntToString(nRoll + GetReflexSavingThrow(oDying)) + " vs. DC:" + IntToString(nDC) + ")";
|
|
FloatingTextStringOnCreature(sFeedback, oDying);
|
|
|
|
// Handle keeping the character alive
|
|
if(bSuccess)
|
|
{// Resurrect the character. Necessary because the game considers them already dead at this point
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), oDying);
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(1 - (GetCurrentHitPoints(oDying))), oDying);
|
|
SignalEvent(oDying, EventSpellCastAt(OBJECT_SELF, SPELL_RESTORATION, FALSE));
|
|
|
|
// Move the character to a random nearby location
|
|
location locJump = GetRandomLocation(GetArea(oDying), oDying, 30.0f);
|
|
AssignCommand(oDying, ClearAllActions(TRUE));
|
|
AssignCommand(oDying, ActionJumpToLocation(locJump));
|
|
|
|
// The character is not dying after all, so skip the rest of the script to avoid complications
|
|
// Though, the module's own OnDying script may very well supply complications anyway
|
|
return;
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////
|
|
// FEAT_REMAIN_CONSCIOUS
|
|
//////////////////////////////////////////
|
|
|
|
// Code added by Oni5115 for Remain Concious
|
|
if(GetHasFeat(FEAT_REMAIN_CONSCIOUS, oDying) && GetCurrentHitPoints(oDying) > -10)
|
|
{
|
|
int pc_Damage = (GetCurrentHitPoints(oDying) * -1) + 1;
|
|
int prev_Damage = GetLocalInt(oDying, "PC_Damage");
|
|
|
|
// Store damage taken in a local variable
|
|
pc_Damage = pc_Damage + prev_Damage;
|
|
SetLocalInt(oDying, "PC_Damage", pc_Damage);
|
|
|
|
if(pc_Damage < 10)
|
|
{
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), oDying);
|
|
}
|
|
|
|
|
|
string sFeedback = GetName(oDying) + " : Current HP = " + IntToString(pc_Damage * -1);
|
|
SendMessageToPC(oDying, sFeedback);
|
|
}
|
|
|
|
//////////////////////////////////////////
|
|
// FEAT_DIEHARD
|
|
//////////////////////////////////////////
|
|
|
|
// When your hit points are reduced to 0 or below, you automatically become stable.
|
|
// You heal to 1 HP, but behave as if disabled.
|
|
|
|
int nHP = GetCurrentHitPoints(oDying);
|
|
if ((GetHasFeat(FEAT_DIEHARD, oDying)) && (nHP > -10) && (nHP <= 0))
|
|
{
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), oDying);
|
|
SetPersistantLocalInt(oDying, "STATUS", DISABLED);
|
|
}
|
|
|
|
//////////////////////////////////////////
|
|
// Rageclaws Meld
|
|
//////////////////////////////////////////
|
|
nHP = GetCurrentHitPoints(oDying);
|
|
int nLimit = (10 + GetEssentiaInvested(oDying, MELD_RAGECLAWS)) * -1;
|
|
if ((GetHasSpellEffect(MELD_RAGECLAWS, oDying)) && (nHP > nLimit) && (nHP <= 0))
|
|
{
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), oDying);
|
|
}
|
|
|
|
//////////////////////////////////////////
|
|
// End of Feat/abilities
|
|
//////////////////////////////////////////
|
|
}
|
|
|
|
//////////////////////////////////////////
|
|
// End of private Functions //
|
|
//////////////////////////////////////////
|
|
|
|
void main()
|
|
{
|
|
object oDying = GetLastPlayerDying();
|
|
|
|
// Fire code for ANY Feats or abilities which can prevent death here.
|
|
feat_save(oDying);
|
|
|
|
// Execute scripts hooked to this event for the player triggering it
|
|
ExecuteAllScriptsHookedToEvent(oDying, EVENT_ONPLAYERDYING);
|
|
|
|
// Trigger the death/bleed if the PRC Death system is enabled (ElgarL).
|
|
if(GetPRCSwitch(PRC_PNP_DEATH_ENABLE))
|
|
AddEventScript(oDying, EVENT_ONHEARTBEAT, "prc_timer_dying", TRUE, FALSE);
|
|
|
|
|
|
}
|
|
|
|
|