/// TEST FUNCTIONS void test_trap_lib(void *data) { (void)data; void * SOHandle; void * bartlby_address; struct trap modified_object; struct trap returned_object; struct trap * srvmap; srvmap=NULL; long (*AddTrap)(struct trap *, char *); int (*UpdateTrap)(struct trap *, char *); int (*DeleteTrap)(long trap_id, char *); int (*GetTrapById)(long, struct trap *, char * ); long (*TrapChangeId)(long, long, char*); int (*GetTrapMap)(struct trap*, char*, int); int rtc=-1; long object_id=-1; long lrtc=-1; long NN=-1; int x; struct shm_header * shm_hdr; bartlby_address=NULL; SOHandle=NULL; SKIP_IF_NOT_RUNNING(CONFIG); SOHandle = bartlby_get_sohandle(CONFIG); bartlby_address=bartlby_get_shm(CONFIG); tt_ptr_op(bartlby_address, !=, NULL); tt_ptr_op(SOHandle, !=, NULL); shm_hdr = bartlby_SHM_GetHDR(bartlby_address); LOAD_SYMBOL_TEST(AddTrap,SOHandle, "AddTrap"); LOAD_SYMBOL_TEST(DeleteTrap,SOHandle, "DeleteTrap"); LOAD_SYMBOL_TEST(UpdateTrap,SOHandle, "UpdateTrap"); LOAD_SYMBOL_TEST(GetTrapById,SOHandle, "GetTrapById"); LOAD_SYMBOL_TEST(TrapChangeId,SOHandle, "TrapChangeId"); LOAD_SYMBOL_TEST(GetTrapMap,SOHandle, "GetTrapMap"); /******* ADD TRAP ****/ lrtc=AddTrap(&dummy_trap, CONFIG); object_id=lrtc; tt_int_op(lrtc, >, 0); TT_DECLARE("INFO",("... Added Trap id: %ld", object_id)); /******* ADD TRAP ****/ /******* MODIFY TRAP ****/ dummy_trap.trap_id=object_id; memcpy(&modified_object,&dummy_trap, sizeof(struct trap)); memcpy(&returned_object,&dummy_trap, sizeof(struct trap)); snprintf(modified_object.trap_catcher,2048, "modified-unit-test"); rtc=UpdateTrap(&modified_object, CONFIG); tt_int_op(rtc, ==, 1); TT_DECLARE("INFO",("... Modified Trap, changed name")); /******* MODIFY TRAP ****/ /******* GETTRAPBYID ****/ rtc=GetTrapById(object_id, &returned_object, CONFIG); tt_int_op(rtc, ==, 0); tt_str_op(returned_object.trap_catcher, ==, modified_object.trap_catcher); TT_DECLARE("INFO",("... get trap by id %ld", object_id)); /******* GETTRAPBYID ****/ /******* TRAPCHANGEID ****/ NN=lrtc+999; object_id=TrapChangeId(lrtc, NN, CONFIG); tt_int_op(object_id, ==, NN); TT_DECLARE("INFO",("... Changed trap id from %ld to %ld ",lrtc, object_id)); /******* TRAPCHANGEID ****/ /*** TRAPMAP **/ srvmap = malloc(sizeof(struct trap)*(shm_hdr->trapcount+2)); rtc=GetTrapMap(srvmap, CONFIG, TEST_ORCH_ID); tt_int_op(rtc, >, 0); lrtc=-1; for(x=0; x<rtc; x++) { if(srvmap[x].trap_id==object_id) { lrtc = 1; } } tt_int_op(lrtc, ==, 1); TT_DECLARE("INFO",("... Created TrapMap and found %ld ", object_id)); /*** TRAPMAP **/ /*** DELETETRAP **/ rtc=DeleteTrap(object_id, CONFIG); tt_int_op(rtc, ==, 1); TT_DECLARE("INFO",("... Delete Trap %ld ", object_id)); /*** DELETETRAP **/ end: if(srvmap != NULL) free(srvmap); if(SOHandle != NULL) dlclose(SOHandle); if(bartlby_address != NULL) shmdt(bartlby_address); ; }
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(); } }