// 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 }