void test_trap_running(void *data) { (void)data; void * SOHandle; void * bartlby_address; struct shm_header * shm_hdr; struct trap * map; int x; int res; int (*AddTrap)(struct trap *, char *); int (*DeleteTrap)(long trap_id, char *); int rtc=-1; long lrtc=-1; long object_id=-1; 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); /// ADD trap LOAD_SYMBOL_TEST(AddTrap,SOHandle, "AddTrap"); LOAD_SYMBOL_TEST(DeleteTrap,SOHandle, "DeleteTrap"); lrtc=AddTrap(&dummy_trap, CONFIG); object_id=lrtc; tt_int_op(lrtc, >, 0); TT_DECLARE("INFO",("... Added Trap id: %ld", object_id)); dummy_trap.trap_id=object_id; //Reload - and detach/reattach to shm shm_hdr=bartlby_SHM_GetHDR(bartlby_address); shm_hdr->do_reload=1; shmdt(bartlby_address); sleep(2); bartlby_address=bartlby_get_shm(CONFIG); shm_hdr=bartlby_SHM_GetHDR(bartlby_address); TT_DECLARE("INFO", ("Reloaded SHM")); tt_int_op(shm_hdr->do_reload, ==, 0); map = bartlby_SHM_TrapMap(bartlby_address); res = -1; for(x=0; x<shm_hdr->trapcount; x++) { if(map[x].trap_id == object_id) { res = 1; break; } } rtc=DeleteTrap(object_id, CONFIG); tt_int_op(rtc, ==, 1); TT_DECLARE("INFO",("... Delete Trap ", object_id)); tt_int_op(res, ==, 1); TT_DECLARE("INFO",("... SHM Trap found ", object_id)); end: if(SOHandle != NULL) dlclose(SOHandle); if(bartlby_address != NULL) shmdt(bartlby_address); ; }
/// 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); ; }
// This creates an aura from a casted spell void Mob::MakeAura(uint16 spell_id) { // TODO: verify room in AuraMgr if (!IsValidSpell(spell_id)) return; AuraRecord record; if (!database.GetAuraEntry(spell_id, record)) { Message(13, "Unable to find data for aura %s", spells[spell_id].name); Log(Logs::General, Logs::Error, "Unable to find data for aura %d, check auras table.", spell_id); return; } if (!IsValidSpell(record.spell_id)) { Message(13, "Casted spell (%d) is not valid for aura %s", record.spell_id, spells[spell_id].name); Log(Logs::General, Logs::Error, "Casted spell (%d) is not valid for aura %d, check auras table.", record.spell_id, spell_id); return; } if (record.aura_type > static_cast<int>(AuraType::Max)) { return; // TODO: log } bool trap = false; switch (static_cast<AuraType>(record.aura_type)) { case AuraType::ExitTrap: case AuraType::EnterTrap: case AuraType::Totem: trap = true; break; default: trap = false; break; } if (!CanSpawnAura(trap)) return; const auto base = database.LoadNPCTypesData(record.npc_type); if (base == nullptr) { Message(13, "Unable to load NPC data for aura %s", spells[spell_id].teleport_zone); Log(Logs::General, Logs::Error, "Unable to load NPC data for aura %s (NPC ID %d), check auras and npc_types tables.", spells[spell_id].teleport_zone, record.npc_type); return; } auto npc_type = new NPCType; memcpy(npc_type, base, sizeof(NPCType)); strn0cpy(npc_type->name, record.name, 64); auto npc = new Aura(npc_type, this, record); npc->SetAuraID(spell_id); if (trap) npc->TryMoveAlong(5.0f, 0.0f, false); // try to place 5 units in front entity_list.AddNPC(npc, false); if (trap) AddTrap(npc, record); else AddAura(npc, record); }