// contingency monitor void main() { object oPC=OBJECT_SELF; int nSpell=GetLocalInt(oPC,"nContingencySpell"); int nN; object oOb; object oTarget; int bDone=FALSE; int nType=GetLocalInt(oPC,"nContingencyType"); if (nType==1) { // when I am wounded if (GetCurrentHitPoints(oPC)<GetMaxHitPoints(oPC)) { // wounded bDone=TRUE; AssignCommand(oPC,ClearAllActions()); AssignCommand(oPC,ActionCastSpellAtObject(nSpell,oPC,METAMAGIC_ANY,TRUE,0,PROJECTILE_PATH_TYPE_DEFAULT,TRUE)); } // wounded } // when I am wounded else if (nType==2) { // when a nearby friend is wounded nN=1; oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_FRIEND); while(GetIsObjectValid(oOb)&&!GetIsObjectValid(oTarget)&&GetDistanceBetween(oOb,oPC)<30.0) { // find target if (GetObjectSeen(oOb,oPC)||GetObjectSeen(oPC,oOb)) { // target can be seen if (GetCurrentHitPoints(oOb)<GetMaxHitPoints(oOb)) oTarget=oOb; } // target can be seen nN++; oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_FRIEND); } // find target if (GetIsObjectValid(oTarget)) { // target found bDone=TRUE; AssignCommand(oPC,ClearAllActions()); AssignCommand(oPC,ActionCastSpellAtObject(nSpell,oTarget,METAMAGIC_ANY,TRUE,0,PROJECTILE_PATH_TYPE_DEFAULT,TRUE)); } // target found } // when a nearby friend is wounded else if (nType==3) { // when an enemy is nearby nN=1; oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY); while(GetIsObjectValid(oOb)&&!GetIsObjectValid(oTarget)&&GetDistanceBetween(oOb,oPC)<30.0) { // find target if (GetObjectSeen(oOb,oPC)||GetObjectSeen(oPC,oOb)) { // target can be seen oTarget=oOb; } // target can be seen nN++; oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY); } // find target if (GetIsObjectValid(oTarget)) { // target found bDone=TRUE; AssignCommand(oPC,ClearAllActions()); AssignCommand(oPC,ActionCastSpellAtObject(nSpell,oTarget,METAMAGIC_ANY,TRUE,0,PROJECTILE_PATH_TYPE_DEFAULT,TRUE)); } // target found } // when an enemy is nearby else if (nType==4) { // when an invisible enemy is nearby nN=1; oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY); while(GetIsObjectValid(oOb)&&!GetIsObjectValid(oTarget)&&GetDistanceBetween(oOb,oPC)<30.0) { // find target if (GetHasSpellEffect(SPELL_INVISIBILITY,oOb)||GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oOb)||GetHasSpellEffect(SPELL_INVISIBILITY_SPHERE,oOb)) oTarget=oOb; nN++; oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY); } // find target if (GetIsObjectValid(oTarget)) { // target found bDone=TRUE; AssignCommand(oPC,ClearAllActions()); AssignCommand(oPC,ActionCastSpellAtObject(nSpell,oPC,METAMAGIC_ANY,TRUE,0,PROJECTILE_PATH_TYPE_DEFAULT,TRUE)); } // target found } // when an invisible enemy is nearby else if (nType==5) { // when I am in combat if (GetIsInCombat(oPC)) { // combat bDone=TRUE; AssignCommand(oPC,ClearAllActions()); AssignCommand(oPC,ActionCastSpellAtObject(nSpell,oPC,METAMAGIC_ANY,TRUE,0,PROJECTILE_PATH_TYPE_DEFAULT,TRUE)); } // combat } // when I am in combat else if (nType==6) { // when a trap is nearby nN=1; oOb=GetNearestObject(OBJECT_TYPE_TRIGGER,oPC,nN); while(GetIsObjectValid(oOb)&&!GetIsObjectValid(oTarget)&&GetDistanceBetween(oOb,oPC)<15.0) { // check for nearby traps if (GetTrapBaseType(oOb)>0) oTarget=oOb; nN++; oOb=GetNearestObject(OBJECT_TYPE_TRIGGER,oPC,nN); } // check for nearby traps if (GetIsObjectValid(oTarget)) { // target found bDone=TRUE; AssignCommand(oPC,ClearAllActions()); AssignCommand(oPC,ActionCastSpellAtObject(nSpell,oPC,METAMAGIC_ANY,TRUE,0,PROJECTILE_PATH_TYPE_DEFAULT,TRUE)); } // target found } // when a trap is nearby else if (nType==7) { // when a dangerous enemy is nearby nN=1; oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY); while(GetIsObjectValid(oOb)&&!GetIsObjectValid(oTarget)&&GetDistanceBetween(oOb,oPC)<30.0) { // find target if (GetObjectSeen(oOb,oPC)||GetObjectSeen(oPC,oOb)) { // target can be seen if ((GetLevelByPosition(1,oOb)+GetLevelByPosition(2,oOb)+GetLevelByPosition(3,oOb))>=(GetLevelByPosition(1,oPC)+GetLevelByPosition(2,oPC)+GetLevelByPosition(3,oPC))) oTarget=oOb; } // target can be seen nN++; oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY); } // find target if (GetIsObjectValid(oTarget)) { // target found bDone=TRUE; AssignCommand(oPC,ClearAllActions()); AssignCommand(oPC,ActionCastSpellAtObject(nSpell,oTarget,METAMAGIC_ANY,TRUE,0,PROJECTILE_PATH_TYPE_DEFAULT,TRUE)); } // target found } // when a dangerous enemy is nearby if (!bDone) DelayCommand(2.0,ExecuteScript("wazoo_ex_conmon",oPC)); else { // done SendMessageToPC(oPC,"Your contingency stored spell has been used."); DeleteLocalInt(oPC,"nContingencySpell"); DeleteLocalInt(oPC,"nContingencyType"); } // done }