Example #1
0
/// 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);
	
	;


}
Example #2
0
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();
	}
}