AOC_PRC8/_module/nss/cm_onheartbeat.nss
Jaysyn904 5e558169a0 Initial Commit
Initial Commit
2025-04-03 11:24:16 -04:00

132 lines
4.9 KiB
Plaintext

// Module : OnHeartbeat by Brian "spilth" Kelly
// For Neverwinter Nights - Bleeding Tutorial
#include "bleeding_config"
// Dying check inspired by Mitchell M. Evans (gonecamping@cox.net)
void main() {
// See if the module thinks anybody is dying
object oModule = GetModule();
// Integer Debugger
object oPC = GetFirstPC();
// Debugging
//FloatingTextStringOnCreature(IntToString(GetLocalInt(oPC, "team_bet")), oPC);
//FloatingTextStringOnCreature(IntToString(GetLocalInt(oModule, "hwar_on")), oPC);
//FloatingTextStringOnCreature(IntToString(GetLocalInt(oPC, "join_switch")), oPC);
//FloatingTextStringOnCreature(IntToString(GetLocalInt(oModule, "turn_flag")), oPC);
//FloatingTextStringOnCreature(IntToString(GetLocalInt(oModule, "duel_on")), oPC);
int bEverybodyAlive = GetLocalInt(oModule, "EverybodyAlive");
// Only bother looping through players if there are disabled, dying, stable or dead players
if (!bEverybodyAlive) {
object oPC = GetFirstPC();
int iPlayerHealth = PC_HEALTH_ALIVE;
// Assume everybody really is alive
int bEverybodyReallyAlive = TRUE;
// Loop through the players and check their health
while (GetIsObjectValid(oPC)) {
iPlayerHealth = GetLocalInt(oPC, "PlayerHealth");
if (iPlayerHealth != PC_HEALTH_ALIVE && iPlayerHealth != PC_HEALTH_DEAD) {
// Double check their hit points
if (GetCurrentHitPoints(oPC) <= 0) {
// They're really not alive
// See if they've been healed
if (GetCurrentHitPoints(oPC) > GetLocalInt(oPC,"LastHitPoints")) {
SetLocalInt(oPC, "PlayerHealth", PC_HEALTH_STABLE);
iPlayerHealth = PC_HEALTH_STABLE;
}
if (iPlayerHealth == PC_HEALTH_DYING) {
bEverybodyReallyAlive = FALSE;
// Make a stabilization check
if (d100() <= iStabilizationChance) {
// They stabilized
SetLocalInt(oPC, "PlayerHealth", PC_HEALTH_STABLE);
// See if they want to wait for help
PopUpDeathGUIPanel(oPC, bAllowRespawnWhenStable, bAllowRespawnWhenStable, 0, sStableGUIMessage);
} else {
// Make a random groan
switch (d6()) {
case 1:
PlayVoiceChat (VOICE_CHAT_PAIN1, oPC);
break;
case 2:
PlayVoiceChat (VOICE_CHAT_PAIN2, oPC);
break;
case 3:
PlayVoiceChat (VOICE_CHAT_PAIN3, oPC);
break;
case 4:
PlayVoiceChat (VOICE_CHAT_HEALME, oPC);
break;
case 5:
PlayVoiceChat (VOICE_CHAT_NEARDEATH, oPC);
break;
case 6:
PlayVoiceChat (VOICE_CHAT_HELP, oPC);
break;
}
// They bleed!
effect eDamage = EffectDamage(1, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_FIVE);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oPC);
// Save their hit points in case they disconnect
SetLocalInt(oPC, "LastHitPoints", GetCurrentHitPoints(oPC));
} // End Stabilization If
} else if (iPlayerHealth == PC_HEALTH_STABLE) {
bEverybodyReallyAlive = FALSE;
PopUpDeathGUIPanel(oPC, bAllowRespawnWhenStable, bAllowWaitForHelpWhenStable, 0, sStableGUIMessage);
} else if (iPlayerHealth == PC_HEALTH_DISABLED) {
bEverybodyReallyAlive = FALSE;
PopUpDeathGUIPanel(oPC, bAllowRespawnWhenDisabled, bAllowWaitForHelpWhenDisabled, 0, sDisabledGUIMessage);
}
} else {
// Must've been healed or something...
SetLocalInt(oPC, "PlayerHealth", PC_HEALTH_ALIVE);
} // End HitPoints <= 0 If
}
oPC = GetNextPC();
} // End while
if (bEverybodyReallyAlive) {
// We didn't find any dead players, so assume everybody is alive
SetLocalInt(oModule, "EverybodyAlive", TRUE);
}
} // End if
}