PRC8/nwn/nwnprc/trunk/scripts/prc_onhb_indiv.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
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.
2024-02-11 14:01:05 -05:00

139 lines
4.8 KiB
Plaintext

/** @file prc_onhb_indiv
Invidual Heartbeat event
This script is run every heartbeat for every PC via the prc_onheartbeat event
This script is run every heartbeat for every NPC via the prc_npc_hb event
Its main purposes is to provide a unified individual hb script interface
Slighly less efficient because things like switches are checked for each individual.
*/
#include "prc_alterations"
#include "prc_inc_nat_hb"
#include "inc_ecl"
void main()
{
object oPC = OBJECT_SELF;
// HB code removed from the Module OnHeartbeat (ElgarL)
// This is now executed as a delayed timer when the player logs in.
if(!GetIsObjectValid(oPC))
return;
// no running stuff for DMs or NPC's
if((!GetIsDM(oPC)) && (GetIsPC(oPC)))
{
int bPWPCAutoexport = GetPRCSwitch(PRC_PW_PC_AUTOEXPORT);
// Persistent World time tracking
if(GetPRCSwitch(PRC_PW_TIME))
{
//store it on all PCs separately
SetPersistantLocalTime(oPC, "persist_Time", GetTimeAndDate());
}
// Automatic character export every 6n seconds
// Check the counter to see if it is time to export
if(bPWPCAutoexport)
{
int nCount = GetLocalInt(oPC, "AutoexportCount");
if(nCount == bPWPCAutoexport)
DeleteLocalInt(oPC, "AutoexportCount");
else
{
nCount++;
SetLocalInt(oPC, "AutoexportCount", nCount);
bPWPCAutoexport = FALSE;
}
}
// Export if the counter has run down
if(bPWPCAutoexport)
{
if(!GetIsPolyMorphedOrShifted(oPC))
ExportSingleCharacter(oPC);
}
// Persistant hit point tracking
if(GetPRCSwitch(PRC_PW_HP_TRACKING))
{
//Flag that we have saved the HP as testing for Zero is faulty logic
//
SetPersistantLocalInt(oPC, "persist_HP_stored", -1);
// Now store the current HP.
SetPersistantLocalInt(oPC, "persist_HP", GetCurrentHitPoints(oPC));
}
// Persistant location tracking
if(GetPRCSwitch(PRC_PW_LOCATION_TRACKING) && GetStartingLocation() != GetLocation(oPC))
SetPersistantLocalMetalocation(oPC, "persist_loc", LocationToMetalocation(GetLocation(oPC)));
// Persistant map pin tracking
if(GetPRCSwitch(PRC_PW_MAPPIN_TRACKING))
{
int i;
int nMapPinCount = GetNumberOfMapPins(oPC);
struct metalocation mLoc;
for(i = 1; i <= nMapPinCount; i++)
{
mLoc = CreateMetalocationFromMapPin(oPC, i);
SetPersistantLocalMetalocation(oPC, "MapPin_" + IntToString(i), mLoc);
}
SetPersistantLocalInt(oPC, "MapPinCount", nMapPinCount);
}
// Death - Bleed - ElgarL
if(GetPRCSwitch(PRC_PNP_DEATH_ENABLE))
{
// PC doing anything that requires attention while disabled take damage
if(GetPersistantLocalInt(oPC, "STATUS") == 3)
{
int nAction = GetCurrentAction(oPC);
if(nAction == ACTION_DISABLETRAP || nAction == ACTION_TAUNT
|| nAction == ACTION_PICKPOCKET || nAction == ACTION_ATTACKOBJECT
|| nAction == ACTION_COUNTERSPELL || nAction == ACTION_FLAGTRAP
|| nAction == ACTION_CASTSPELL || nAction == ACTION_ITEMCASTSPELL)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(1), oPC);
}
}
}
// Continue the HeartBeat Timer.
DelayCommand(6.0, ExecuteScript("prc_onhb_indiv", oPC));
}
/* PC_damage code to support oni's scripts
* If HP is over 1 apply the damage and let
* the OnDying deal with the consequences
*/
int nDamage = GetLocalInt(oPC, "PC_Damage");
if(nDamage && GetCurrentHitPoints(oPC) > 1)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nDamage), oPC);
SetLocalInt(oPC, "PC_Damage", 0);
}
// ECL
if(GetIsPC(oPC) || (!GetIsPC(oPC) && GetPRCSwitch(PRC_XP_GIVE_XP_TO_NPCS)))
ApplyECLToXP(oPC);
// Check if the character has lost a level since last HB
if(GetHitDice(oPC) != GetLocalInt(oPC, "PRC_HitDiceTracking"))
{
if(GetHitDice(oPC) < GetLocalInt(oPC, "PRC_HitDiceTracking"))
{
SetLocalInt(oPC, "PRC_OnLevelDown_OldLevel", GetLocalInt(oPC, "PRC_HitDiceTracking"));
DelayCommand(0.0f, ExecuteScript("prc_onleveldown", oPC));
}
SetLocalInt(oPC, "PRC_HitDiceTracking", GetHitDice(oPC));
}
// Race Pack Code
ExecuteScript("race_hb", oPC);
//natural weapons
//SpawnScriptDebugger();
DoNaturalWeaponHB(oPC);
// Eventhook
ExecuteAllScriptsHookedToEvent(oPC, EVENT_ONHEARTBEAT);
}