void main() { int nUser = GetUserDefinedEventNumber(); if(nUser == EVENT_HEARTBEAT ) //HEARTBEAT { int iDamageRecieved = GetLocalInt(OBJECT_SELF, "TROLL_DAMAGE_RECIEVED"); int iMax = GetMaxHitPoints(); int iCurrent = GetCurrentHitPoints(); // This fires before the rest of the On Heartbeat file does if(iDamageRecieved < iMax) { // Heal self as long as we have less current hit points then // max damage - recieved. if(iCurrent < (iMax - iDamageRecieved)) { // Regenerate int iRegenamount = iMax - iDamageRecieved; if(iRegenamount > 5) iRegenamount = 5; // Heal effect eRegerate = EffectHeal(iRegenamount); ApplyEffectToObject(DURATION_TYPE_INSTANT, eRegerate, OBJECT_SELF); } } // Never exit. } else if(nUser == EVENT_DAMAGED) // DAMAGED { // Add acid and fire damage to damage recieved int iDamageRecieved = GetLocalInt(OBJECT_SELF, "TROLL_DAMAGE_RECIEVED"); // Acid + fire int iAcid = GetDamageDealtByType(DAMAGE_TYPE_ACID); int iFire = GetDamageDealtByType(DAMAGE_TYPE_FIRE); // Add it to it iDamageRecieved = iDamageRecieved + (iAcid < 0 ? 0 : iAcid) + (iFire < 0 ? 0 : iFire); // Set it SetLocalInt(OBJECT_SELF, "TROLL_DAMAGE_RECIEVED", iDamageRecieved); } else if(nUser == 1007) // DEATH - do not use for critical code, does not fire reliably all the time { int iDamageRecieved = GetLocalInt(OBJECT_SELF, "TROLL_DAMAGE_RECIEVED"); int iAcid = GetDamageDealtByType(DAMAGE_TYPE_ACID); int iFire = GetDamageDealtByType(DAMAGE_TYPE_FIRE); iDamageRecieved = iDamageRecieved + (iAcid < 0 ? 0 : iAcid) + (iFire < 0 ? 0 : iFire); SetLocalInt(OBJECT_SELF, "TROLL_DAMAGE_RECIEVED", iDamageRecieved); int iMax = GetMaxHitPoints(); if(iDamageRecieved < iMax) { effect eRaise = EffectResurrection(); effect eHP = EffectHeal(iMax - iDamageRecieved); DelayCommand(12.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eRaise, OBJECT_SELF)); DelayCommand(12.1, ApplyEffectToObject(DURATION_TYPE_INSTANT, eHP, OBJECT_SELF)); } else SetIsDestroyable(TRUE, FALSE); } }