//////////////////////////////////////////////////////////////////////// // mod_e_dying - This custom script supports bleeding to -10 hit points // By Deva Bryson Winblood. 04/26/2005 // Modified By Deva B. Winblood 10/22/2006 //////////////////////////////////////////////////////////////////////// #include "cai_inc_hos" ///////////////////// // PROTOTYPES ///////////////////// void fnHandleNPCHealing(object oPC); //////////////////////////////////////////////////////////// MAIN void main() { object oPC=GetLastPlayerDying(); object oMod=GetModule(); effect eDeath=EffectDeath(); int nHP=GetCurrentHitPoints(oPC); object oPlayer = GetLastPlayerDying(); object oItem=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPlayer); string sTag; string sOpposite; object oOther; effect eEffect; int nC; int nLevel; oItem=GetItemInSlot(INVENTORY_SLOT_RIGHTRING,oPlayer); nC=FALSE; sTag=GetTag(oItem); if (sTag=="rts_it_sra"||sTag=="rts_it_srb") nC=TRUE; if (!nC) { // check left ring oItem=GetItemInSlot(INVENTORY_SLOT_LEFTRING,oPlayer); sTag=GetTag(oItem); if (sTag=="rts_it_sra"||sTag=="rts_it_srb") nC=TRUE; } // check left ring if (nC) { // wearing a symbiotic ring nC=GetCurrentHitPoints(oPlayer); sOpposite="rts_it_srb"; if (sTag=="rts_it_srb") sOpposite="rts_it_sra"; nLevel=FALSE; oOther=OBJECT_INVALID; oItem=GetObjectByTag(sOpposite); if (GetIsObjectValid(oItem)) { // opposite ring exists oOther=GetItemPossessor(oItem); if (GetIsObjectValid(oOther)) { // someone has the ring if (GetItemInSlot(INVENTORY_SLOT_RIGHTRING,oOther)==oItem||GetItemInSlot(INVENTORY_SLOT_LEFTRING,oOther)==oItem) { // other ring is being worn - symbiosis is in play if (!GetIsDead(oOther)) { // other is not dead nLevel=GetCurrentHitPoints(oOther); SendMessageToPC(oOther,"Dying HitPoints:"+IntToString(nC)+" Living HitPoints:"+IntToString(nLevel)); SendMessageToPC(oPlayer,"Dying HitPoints:"+IntToString(nC)+" Living HitPoints:"+IntToString(nLevel)); SendMessageToPC(oOther,"You feel a surge of sucking your life force into the symbiotic ring that you wear."); if ((nLevel-abs(nC))>0) { // can cure nLevel=1+abs(nC); eEffect=EffectHeal(nLevel); ApplyEffectToObject(DURATION_TYPE_INSTANT,eEffect,oPlayer); SendMessageToPC(oPlayer,"You feel a surge of energy from the symbiotic ring. It is forcing life back into you."); eEffect=EffectDamage(nLevel); ApplyEffectToObject(DURATION_TYPE_INSTANT,eEffect,oOther); return; } // can cure else { // both die ApplyEffectToObject(DURATION_TYPE_INSTANT,eDeath,oOther); } // both die } // other is not dead } // other ring is being worn - symbiosis is in play } // someone has the ring } // opposite ring exists } // wearing a symbiotic ring else if (GetLocalInt(oMod,"bPlayerBleeding")) { // bleeding if (nHP<-9) { // die ApplyEffectToObject(DURATION_TYPE_INSTANT,eDeath,oPC); } // die else { // seek help fnHandleNPCHealing(oPC); } // seek help } // bleeding else { // no-bleeding ApplyEffectToObject(DURATION_TYPE_INSTANT,eDeath,oPC); } // no-bleeding } ///////////////////////////////////////////////////////////// MAIN /////////////////////// // FUNCTIONS /////////////////////// void fnHandleNPCHealing(object oPC) { // PURPOSE: To check for nearby NPC friends capable of healing PC int nN=1; object oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_FRIEND); object oFound; int nNeed=abs(GetCurrentHitPoints(oPC))+1; int nHeal; while(!GetIsObjectValid(oFound)&&GetIsObjectValid(oOb)) { // look for heal capable NPC nHeal=caiGetAvailableHeal(oOb,nNeed,TRUE); if (nHeal>0) { // found oFound=oOb; } // found nN++; oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_FRIEND); } // look for heal capable NPC if (GetIsObjectValid(oFound)) { // Has a healing spell AssignCommand(oFound,ClearAllActions(TRUE)); AssignCommand(oFound,SpeakString("I am coming "+GetName(oPC)+"!")); AssignCommand(oFound,ActionMoveToObject(oPC,TRUE,2.0)); AssignCommand(oFound,ActionCastSpellAtObject(nHeal,oPC)); } // Has a healing spell } // fnHandleNPCHealing()