//:://///////////////////////////////////////////// //:: Dying Script //:: 69_o0_dying.nss //::////////////////////////////////////////////// /* This script handles the default behavior that occurs when a character is dying. Dying is when the character is between 0 and -9 hit points; -10 and below is death. To use, redirect the OnDying event script of the module to this script. */ //::////////////////////////////////////////////// //:: Author : 69MEH69 AUG2003 //::////////////////////////////////////////////// #include "69_inc_henai" void SetHP(string sID, object oPlayer) { SetLocalInt(GetModule(),"LastHP"+sID,GetCurrentHitPoints(oPlayer)); } void bleed(int iBleedAmt) { effect eBleedEff; // HCR Stuff object oPlayer=OBJECT_SELF; string sPlayer = GetName(oPlayer); int iCHP=GetCurrentHitPoints(oPlayer); string sName=GetName(oPlayer); string sCDK=GetPCPublicCDKey(oPlayer); string sID=sName+sCDK; int iLHP=GetLocalInt(GetModule(),"LastHP"+sID); /* keep executing recursively until character is dead or at +1 hit points */ if (GetCurrentHitPoints() <= 0) { /* a positive bleeding amount means damage, otherwise heal the character */ if (iBleedAmt > 0) { eBleedEff = EffectDamage(iBleedAmt); } else { eBleedEff = EffectHeal(-iBleedAmt); /* note the negative sign */ } ApplyEffectToObject(DURATION_TYPE_INSTANT, eBleedEff, OBJECT_SELF); /* -10 hit points is the death threshold, at or beyond it the character dies */ if (GetCurrentHitPoints() <= -10) { PlayVoiceChat(VOICE_CHAT_DEATH); /* scream one last time */ ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DEATH), OBJECT_SELF); /* make death dramatic */ ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), OBJECT_SELF); /* now kill them */ return; } if (iBleedAmt > 0) { /* only check if character has not stablized */ if ((d10(1) == 1) || (iCHP > iLHP))/* 10% chance to stablize */ { iBleedAmt = -iBleedAmt; /* reverse the bleeding process */ FloatingTextStringOnCreature("Your wounds have stabilized!", OBJECT_SELF); PlayVoiceChat(VOICE_CHAT_LAUGH); /* laugh at death -- this time */ } else { //Henchman Cleric Code if(GetCurrentHitPoints() <= -3) { object oHealer = GetHenchman(oPlayer); int nSpeak; string sName; talent tHeal = TalentSkill(SKILL_HEAL); while(oHealer != OBJECT_INVALID) { sName = GetName(oHealer); if(GetClassByPosition(1, oHealer) == CLASS_TYPE_CLERIC || GetClassByPosition(2, oHealer) == CLASS_TYPE_CLERIC || GetClassByPosition(3, oHealer) == CLASS_TYPE_CLERIC || GetClassByPosition(1, oHealer) == CLASS_TYPE_DRUID || GetClassByPosition(2, oHealer) == CLASS_TYPE_DRUID || GetClassByPosition(3, oHealer) == CLASS_TYPE_DRUID || GetClassByPosition(1, oHealer) == CLASS_TYPE_PALADIN || GetClassByPosition(2, oHealer) == CLASS_TYPE_PALADIN || GetClassByPosition(3, oHealer) == CLASS_TYPE_PALADIN) { if(GetIsTalentValid(tHeal)) { AssignCommand(oHealer, ClearAllActions()); tHeal = GetCreatureTalentBest(TALENT_CATEGORY_BENEFICIAL_HEALING_TOUCH, 20, oHealer); SendMessageToPC(oPlayer, sName+ " is casting healing onto " +sPlayer); AssignCommand(oHealer, ActionUseTalentOnObject(tHeal, oPlayer)); //AssignCommand(oHealer, ActionCastSpellAtObject(SPELL_CURE_MODERATE_WOUNDS, oPlayer, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, FALSE)); } else { AssignCommand(oHealer, ActionSpeakString("I'm out of healing spells!", TALKVOLUME_TALK)); DelayCommand(2.5, PlayVoiceChat(VOICE_CHAT_CANTDO, oHealer)); } } oHealer = GetHenchman(oHealer); } } //End Henchman Cleric Code if(GetCurrentHitPoints() <= 0) { switch (d6(1)) { case 1: PlayVoiceChat(VOICE_CHAT_PAIN1); break; case 2: PlayVoiceChat(VOICE_CHAT_PAIN2); break; case 3: PlayVoiceChat(VOICE_CHAT_PAIN3); break; case 4: PlayVoiceChat(VOICE_CHAT_HEALME); break; case 5: PlayVoiceChat(VOICE_CHAT_NEARDEATH); break; case 6: PlayVoiceChat(VOICE_CHAT_HELP); break; } } } } SetHP(sID, oPlayer); DelayCommand(6.0,bleed(iBleedAmt)); /* do this again next round */ } else { // Determines combat round for nearest enemy when PC becomes conscious object oAttacker = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_NOT_PC, oPlayer, 1, CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, CREATURE_TYPE_IS_ALIVE, TRUE); AssignCommand(oAttacker, DetermineCombatRound(oPlayer, 10)); } } void main() { object oDying = GetLastPlayerDying(); int PC_BLEEDING = GetLocalInt(GetModule(), "PC_BLEEDING"); if(PC_BLEEDING == 0) { effect eDeath = EffectDeath(FALSE, FALSE); ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, GetLastPlayerDying()); } else if(PC_BLEEDING == 1) { AssignCommand(oDying, ClearAllActions()); AssignCommand(oDying, bleed(1)); } }