void Trap::Trigger(Mob* trigger) { int i = 0; const NPCType* tmp = 0; switch (effect) { case trapTypeDebuff: if(message.empty()) { entity_list.MessageClose(trigger,false,100,13,"%s triggers a trap!",trigger->GetName()); } else { entity_list.MessageClose(trigger,false,100,13,"%s",message.c_str()); } if(hiddenTrigger){ hiddenTrigger->SpellFinished(effectvalue, trigger, 10, 0, -1, spells[effectvalue].ResistDiff); } break; case trapTypeAlarm: if (message.empty()) { entity_list.MessageClose(trigger,false,effectvalue,13,"A loud alarm rings out through the air..."); } else { entity_list.MessageClose(trigger,false,effectvalue,13,"%s",message.c_str()); } entity_list.SendAlarm(this,trigger,effectvalue); break; case trapTypeMysticSpawn: if (message.empty()) { entity_list.MessageClose(trigger,false,100,13,"The air shimmers..."); } else { entity_list.MessageClose(trigger,false,100,13,"%s",message.c_str()); } for (i = 0; i < effectvalue2; i++) { if ((tmp = database.GetNPCType(effectvalue))) { NPC* new_npc = new NPC(tmp, 0, x-5+MakeRandomInt(0, 10), y-5+MakeRandomInt(0, 10), z-5+MakeRandomInt(0, 10), MakeRandomInt(0, 249), FlyMode3); new_npc->AddLootTable(); entity_list.AddNPC(new_npc); new_npc->AddToHateList(trigger,1); } } break; case trapTypeBanditSpawn: if (message.empty()) { entity_list.MessageClose(trigger,false,100,13,"A bandit leaps out from behind a tree!"); } else { entity_list.MessageClose(trigger,false,100,13,"%s",message.c_str()); } for (i = 0; i < effectvalue2; i++) { if ((tmp = database.GetNPCType(effectvalue))) { NPC* new_npc = new NPC(tmp, 0, x-2+MakeRandomInt(0, 5), y-2+MakeRandomInt(0, 5), z-2+MakeRandomInt(0, 5), MakeRandomInt(0, 249), FlyMode3); new_npc->AddLootTable(); entity_list.AddNPC(new_npc); new_npc->AddToHateList(trigger,1); } } break; case trapTypeDamage: if (message.empty()) { entity_list.MessageClose(trigger,false,100,13,"%s triggers a trap!",trigger->GetName()); } else { entity_list.MessageClose(trigger,false,100,13,"%s",message.c_str()); } if(trigger->IsClient()) { EQApplicationPacket* outapp = new EQApplicationPacket(OP_Damage, sizeof(CombatDamage_Struct)); CombatDamage_Struct* a = (CombatDamage_Struct*)outapp->pBuffer; int dmg = MakeRandomInt(effectvalue, effectvalue2); trigger->SetHP(trigger->GetHP() - dmg); a->damage = dmg; a->sequence = MakeRandomInt(0, 1234567); a->source = GetHiddenTrigger()!=nullptr ? GetHiddenTrigger()->GetID() : trigger->GetID(); a->spellid = 0; a->target = trigger->GetID(); a->type = 253; trigger->CastToClient()->QueuePacket(outapp); safe_delete(outapp); } } respawn_timer.Start((respawn_time + MakeRandomInt(0, respawn_var)) * 1000); chkarea_timer.Disable(); disarmed = true; }
void Trap::Trigger(Mob* trigger) { Log.Out(Logs::General, Logs::Traps, "Trap %d triggered by %s for the %d time!", trap_id, trigger->GetName(), times_triggered+1); int i = 0; const NPCType* tmp = 0; switch (effect) { case trapTypeDebuff: if(message.empty()) { entity_list.MessageClose(trigger,false,100,CC_Default,"%s triggers a trap!",trigger->GetName()); } else { entity_list.MessageClose(trigger,false,100,CC_Default,"%s",message.c_str()); } if(hiddenTrigger){ hiddenTrigger->SpellFinished(effectvalue, trigger, 10, 0, -1, spells[effectvalue].ResistDiff); } break; case trapTypeAlarm: if (message.empty()) { entity_list.MessageClose(trigger,false,effectvalue,CC_Default,"A loud alarm rings out through the air..."); } else { entity_list.MessageClose(trigger,false,effectvalue,CC_Default,"%s",message.c_str()); } entity_list.SendAlarm(this,trigger,effectvalue2); break; case trapTypeMysticSpawn: if (message.empty()) { entity_list.MessageClose(trigger,false,100,CC_Default,"The air shimmers..."); } else { entity_list.MessageClose(trigger,false,100,CC_Default,"%s",message.c_str()); } for (i = 0; i < effectvalue2; i++) { if ((tmp = database.GetNPCType(effectvalue))) { auto randomOffset = glm::vec4(zone->random.Int(-5, 5),zone->random.Int(-5, 5),zone->random.Int(-5, 5), zone->random.Int(0, 249)); auto spawnPosition = randomOffset + glm::vec4(m_Position, 0.0f); NPC* new_npc = new NPC(tmp, nullptr, spawnPosition, FlyMode3); new_npc->AddLootTable(); entity_list.AddNPC(new_npc); new_npc->AddToHateList(trigger,1); } } break; case trapTypeBanditSpawn: if (message.empty()) { entity_list.MessageClose(trigger,false,100,CC_Default,"A bandit leaps out from behind a tree!"); } else { entity_list.MessageClose(trigger,false,100,CC_Default,"%s",message.c_str()); } for (i = 0; i < effectvalue2; i++) { if ((tmp = database.GetNPCType(effectvalue))) { auto randomOffset = glm::vec4(zone->random.Int(-2, 2), zone->random.Int(-2, 2), zone->random.Int(-2, 2), zone->random.Int(0, 249)); auto spawnPosition = randomOffset + glm::vec4(m_Position, 0.0f); NPC* new_npc = new NPC(tmp, nullptr, spawnPosition, FlyMode3); new_npc->AddLootTable(); entity_list.AddNPC(new_npc); new_npc->AddToHateList(trigger,1); } } break; case trapTypeDamage: if (message.empty()) { entity_list.MessageClose(trigger,false,100,CC_Default,"%s triggers a trap!",trigger->GetName()); } else { entity_list.MessageClose(trigger,false,100,CC_Default,"%s",message.c_str()); } if(trigger->IsClient()) { EQApplicationPacket* outapp = new EQApplicationPacket(OP_Damage, sizeof(CombatDamage_Struct)); CombatDamage_Struct* a = (CombatDamage_Struct*)outapp->pBuffer; int dmg = zone->random.Int(effectvalue, effectvalue2); trigger->SetHP(trigger->GetHP() - dmg); a->damage = dmg; a->sequence = (float)zone->random.Int(0, 511); a->source = GetHiddenTrigger()!=nullptr ? GetHiddenTrigger()->GetID() : trigger->GetID(); a->spellid = 0; a->target = trigger->GetID(); a->type = 253; trigger->CastToClient()->QueuePacket(outapp); safe_delete(outapp); } } if(trigger && trigger->IsClient()) { trigger->CastToClient()->trapid = trap_id; charid = trigger->CastToClient()->CharacterID(); } bool update = false; if(despawn_when_triggered) { Log.Out(Logs::General, Logs::Traps, "Trap %d is despawning after being triggered.", trap_id); update = true; } else { reset_timer.Start(5000); } if(triggered_number > 0) ++times_triggered; if(triggered_number > 0 && triggered_number <= times_triggered) { Log.Out(Logs::General, Logs::Traps, "Triggered number for trap %d reached. %d/%d", trap_id, times_triggered, triggered_number); update = true; } if(update) { UpdateTrap(); } }