Updated AMS marker feats. Removed arcane & divine marker feats. Updated Dread Necromancer for epic progression. Updated weapon baseitem models. Updated new weapons for crafting & npc equip. Updated prefix. Updated release archive.
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);
|
|
|
|
|
|
}
|
|
|
|
|