This is what appears to be happening in Trevius' example:
If you call Damage from Perl, when:
Code:
parse->Event(EVENT_HP, GetNPCTypeID(), 0, CastToNPC(), NULL);
is called from void Mob::CreateHPPacket(EQApplicationPacket* app), it gets to this point:
Code:
void PerlembParser::EventCommon(QuestEventID event, int32 objid, const char * data, NPC* npcmob, ItemInst* iteminst, Mob* mob, int32 extradata)
{
if(!perl)
return;
if(event >= _LargestEventID)
return;
if(perl->InUse()) {
and since 'Perl is in use', executing the EVENT_SAY, the EVENT_HP is queued until the EVENT_SAY completes, therefore SetNextHPEvent is also not yet executed which means
lasthpevent == nexthpevent in the test in CreateHPPacket, leading to SetNextHPEvent(-1) being called.
As I say, the EVENT_HP is queued and should execute (along with any other queued EVENTs) once the EVENT_SAY in this example has finished.