Beispiel #1
0
//Yeahlight: Returns the second highest entity on the hate list
Mob *HateList::GetSecondFromTop(Mob* sender)
{
	Mob* secondFromTop = NULL;
	Mob* top = NULL;
	sint32 topHate = -1;
	sint32 hate = -1;

	LinkedListIterator<tHateEntry*> iterator(list);
    iterator.Reset();
	//Yeahlight: Iterate through the hate list and find the highest level of hate
	while(iterator.MoreElements())
    {
		//Yeahlight: Entity's hate is larger than the current top hate level
		if(iterator.GetData()->ent != NULL && iterator.GetData()->hate > topHate)
		{
			bool permit = true;
			//Yeahlight: Skip this entity if their owner is the sender
			if(sender && sender->GetPet() == iterator.GetData()->ent)
				permit = false;
			else if(sender == iterator.GetData()->ent)
				permit = false;
			if(permit)
			{
				top = iterator.GetData()->ent;
				topHate = iterator.GetData()->hate;
			}
		}
        iterator.Advance();
		//Yeahlight: Zone freeze debug
		if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
			EQC_FREEZE_DEBUG(__LINE__, __FILE__);
	}

	iterator.Reset();
	//Yeahlight: Iterate through the hate list again to find the second highest hate level
	while(iterator.MoreElements())
    {
		//Yeahlight: Entity's hate is larger than the current top hate level, is less than or equal to the 
		//           max hate level and is not the entity from which the max hate is pulled
		if(iterator.GetData()->ent != NULL && iterator.GetData()->hate > hate && iterator.GetData()->ent != top)
		{
			bool permit = true;
			//Yeahlight: Skip this entity if their owner is the sender
			if(sender && sender->GetID() == iterator.GetData()->ent->GetOwnerID())
				permit = false;
			if(permit)
			{
				secondFromTop = iterator.GetData()->ent;
				hate = iterator.GetData()->hate;
			}
		}
        iterator.Advance();
		//Yeahlight: Zone freeze debug
		if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
			EQC_FREEZE_DEBUG(__LINE__, __FILE__);
	}
	return secondFromTop;
}
Beispiel #2
0
		void ClientList::ZoneBootup(ZoneServer* zs)
		{
			LinkedListIterator<Client*> iterator(list);

			iterator.Reset();

			while(iterator.MoreElements())
			{
				if (iterator.GetData()->WaitingForBootup())
				{
					if (strcasecmp(iterator.GetData()->GetZoneName(), zs->GetZoneName()) == 0) 
					{
						iterator.GetData()->EnterWorld(false);
					}
					else if (iterator.GetData()->WaitingForBootup() == (bool)zs->GetID())
					{
						iterator.GetData()->SendZoneUnavail();
					}
				}
				iterator.Advance();
				//Yeahlight: Zone freeze debug
				if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
					EQC_FREEZE_DEBUG(__LINE__, __FILE__);
			}
		}
Beispiel #3
0
		void LoginServer::CheckStale()
		{
			LinkedListIterator<LSAuth_Struct*> iterator(auth_list);

			LockMutex lock(&MAuthListLock);
			iterator.Reset();
			while(iterator.MoreElements())
			{
				if (!iterator.GetData()->inuse)
				{
					if (iterator.GetData()->stale) 
					{
						iterator.RemoveCurrent();
					}
					else 
					{
						iterator.GetData()->stale = true;
						iterator.Advance();
					}
				}
				else
				{
					iterator.Advance();
				}
				//Yeahlight: Zone freeze debug
				if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
					EQC_FREEZE_DEBUG(__LINE__, __FILE__);
			}
		}
Beispiel #4
0
Mob* HateList::GetClosest(Mob* hater)
{
	if(!hater)
		return 0;

	Mob* close = NULL;
	float closedist = 99999.9f;
	float thisdist;
	
    LinkedListIterator<tHateEntry*> iterator(list);
    iterator.Reset();
	while(iterator.MoreElements())
	{
		if(iterator.GetData()->ent)
		{
			thisdist = iterator.GetData()->ent->DistNoRootNoZ(hater);
			if(thisdist <= closedist)
			{
				closedist = thisdist;
				close = iterator.GetData()->ent;
			}
		}
        iterator.Advance();
		//Yeahlight: Zone freeze debug
		if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
			EQC_FREEZE_DEBUG(__LINE__, __FILE__);
	}
	if (!close && hater->IsNPC())
		close = hater->CastToNPC()->GetHateTop();

	return close;
}
Beispiel #5
0
//Yeahlight: Searches for the most-hated PC in melee range when a pet would normally be the target
Mob* HateList::GetTopInRangeNoPet(Mob* sender)
{
	Mob* top = NULL;
	sint32 hate = -1;
	
    LinkedListIterator<tHateEntry*> iterator(list);
    iterator.Reset();
	while(iterator.MoreElements())
    {
		//Yeahlight: Entity exists, has more hate than the highest hated entity, is not a pet and is in melee range
		if(iterator.GetData()->ent != NULL && iterator.GetData()->hate > hate && iterator.GetData()->ent->GetOwner() == NULL && iterator.GetData()->ent->DistNoZ(sender) <= sender->GetMeleeReach())
		{
			bool permit = true;
			//Yeahlight: Skip this entity if their owner is the sender
			if(sender && sender->GetPet() == iterator.GetData()->ent)
				permit = false;
			else if(sender == iterator.GetData()->ent)
				permit = false;
			if(permit)
			{
				top = iterator.GetData()->ent;
				hate = iterator.GetData()->hate;
			}
		}
        iterator.Advance();
		//Yeahlight: Zone freeze debug
		if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
			EQC_FREEZE_DEBUG(__LINE__, __FILE__);
	}
    return top;
}
Beispiel #6
0
size_t S3D_GetFile(s3d_object *obj, char *filename, uchar **out) {
	struct_directory s3d_dir;
	struct_data_block s3d_data;
	uchar *buf;
	char *temp2;
	long inf;
	int i;

	for(i = 0; i < obj->count; ++i) {
		if(!strcmp(obj->filenames[i], filename)) {
			fseek(obj->fp, obj->files[i], SEEK_SET);
			fread(&s3d_dir, sizeof(struct_directory), 1, obj->fp);
			fseek(obj->fp, s3d_dir.offset, SEEK_SET);
			buf = (uchar *) malloc(s3d_dir.size);

			inf = 0;
			while(inf < s3d_dir.size) {
				fread(&s3d_data, sizeof(struct_data_block), 1, obj->fp);
				temp2 = (char *) malloc(s3d_data.deflen);
				fread(temp2, s3d_data.deflen, 1, obj->fp);
				decompress(temp2, (char *) buf + inf, s3d_data.deflen, s3d_data.inflen);
				free(temp2);
				inf += s3d_data.inflen;
				//Yeahlight: Zone freeze debug
				if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
					EQC_FREEZE_DEBUG(__LINE__, __FILE__);
			}

			*out = buf;
			return inf;
		}
	}
	return -1;
}
Beispiel #7
0
//Yeahlight: Searches for the single entity that will be rewarded with exp and first loot rights
Mob* HateList::GetRewardingEntity(sint32 highestGroupDamage)
{
	sint32 highestDamage = 0;
	sint32 entityDamage = 0;
	Mob* entityToReward = NULL;

	LinkedListIterator<tHateEntry*> iterator(list);
    iterator.Reset();
	while(iterator.MoreElements())
    {
		if(iterator.GetData())
			entityDamage = iterator.GetData()->damage;
		//Yeahlight: This entity's damage is the highest so far from the list and is greater than
		//           any single group's combined damage
		if(entityDamage > highestDamage && entityDamage > highestGroupDamage)
		{
			entityToReward = iterator.GetData()->ent;
			highestDamage = entityDamage;
		}
        iterator.Advance();
		//Yeahlight: Zone freeze debug
		if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
			EQC_FREEZE_DEBUG(__LINE__, __FILE__);
    }

	return entityToReward;
};
Beispiel #8
0
void HateList::Whipe()
{
    LinkedListIterator<tHateEntry*> iterator(list);
    iterator.Reset();
	while(iterator.MoreElements())
	{
        iterator.RemoveCurrent();
		//Yeahlight: Zone freeze debug
		if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
			EQC_FREEZE_DEBUG(__LINE__, __FILE__);
	}
}
Beispiel #9
0
// neotokyo: added for frenzy support
// checks if target still is in frenzy mode
void HateList::CheckFrenzyHate()
{
    LinkedListIterator<tHateEntry*> iterator(list);
    iterator.Reset();
	while(iterator.MoreElements())
    {
        if (iterator.GetData()->ent->GetHPRatio() >= 20)
            iterator.GetData()->bFrenzy = false;
        iterator.Advance();
		//Yeahlight: Zone freeze debug
		if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
			EQC_FREEZE_DEBUG(__LINE__, __FILE__);
    }
}
Beispiel #10
0
		EQC::World::Network::Console* ConsoleList::FindByAccountName(char* accname) {
			LinkedListIterator<EQC::World::Network::Console*> iterator(list);
			iterator.Reset();

			while(iterator.MoreElements()) {
				if (strcasecmp(iterator.GetData()->AccountName(), accname) == 0)
					return iterator.GetData();

				iterator.Advance();
				//Yeahlight: Zone freeze debug
				if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
					EQC_FREEZE_DEBUG(__LINE__, __FILE__);
			}
			return 0;
		}
Beispiel #11
0
int16 HateList::GetHateListSize()
{
	int count = 0;
    LinkedListIterator<tHateEntry*> iterator(list);
    iterator.Reset();
	while(iterator.MoreElements())
    {
        iterator.Advance();
        count++;
		//Yeahlight: Zone freeze debug
		if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
			EQC_FREEZE_DEBUG(__LINE__, __FILE__);
    }
	return count;
}
Beispiel #12
0
SpawnGroup* SpawnGroupList::GetSpawnGroup(int in_id)
{
	vector<SGMember>::iterator it;

	for ( it = sglist.begin(); it < sglist.end(); it++ )
	{
		if (it->id == in_id)
			return it->Ptr;

		//Yeahlight: Zone freeze debug
		if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
			EQC_FREEZE_DEBUG(__LINE__, __FILE__);
	}
    return 0;  // shouldn't happen, but need to handle it anyway
}
Beispiel #13
0
tHateEntry *HateList::Find(Mob *ent)
{
    LinkedListIterator<tHateEntry*> iterator(list);
    iterator.Reset();
	while(iterator.MoreElements())
    {
        if (iterator.GetData()->ent == ent)
            return iterator.GetData();
        iterator.Advance();
		//Yeahlight: Zone freeze debug
		if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
			EQC_FREEZE_DEBUG(__LINE__, __FILE__);
    }
	return NULL;
}
Beispiel #14
0
		void ClientList::Process()
		{
			LinkedListIterator<Client*> iterator(list);

			iterator.Reset();
			while(iterator.MoreElements())
			{
				bool Res = false;
				try {
					Res = iterator.GetData()->Process();

				}
				catch (EQC::Common::EQCException Exception) { //Cofruben: Let's try to catch our exceptions.
					struct in_addr  in;
					in.s_addr = iterator.GetData()->GetIP();
					cout << "-EQC EXCEPTION caught from user " << inet_ntoa(in) << endl;
					Exception.FileDumpException("World_Exceptions.txt");
					iterator.RemoveCurrent();
				}
				catch (...) {
					struct in_addr  in;
					in.s_addr = iterator.GetData()->GetIP();
					cout << "-EXCEPTION caught from user  " << inet_ntoa(in) << endl;
					iterator.RemoveCurrent();
				}
				if (!Res)
				{
					struct in_addr in;
					in.s_addr = iterator.GetData()->GetIP();
					cout << "Removing client from ip:" << inet_ntoa(in) << " port:" << ntohs((int16)(iterator.GetData()->GetPort())) << endl;
					//Yeahlight: Log the account out of the database if they are not entering the world
					if(!iterator.GetData()->GetIgnoreLogOut())
					{
						Database::Instance()->LogAccountOut(iterator.GetData()->GetClientID());
					}
					iterator.GetData()->SetIgnoreLogOut(false);
					iterator.RemoveCurrent();
				}
				else
				{
					iterator.Advance();
				}
				//Yeahlight: Zone freeze debug
				if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
					EQC_FREEZE_DEBUG(__LINE__, __FILE__);
			}
		}
Beispiel #15
0
		void ConsoleList::ReceiveData() {
			LinkedListIterator<Console*> iterator(list);

			iterator.Reset();
			while(iterator.MoreElements())
			{
				if (!iterator.GetData()->ReceiveData()) {
					iterator.GetData()->Die();
					iterator.RemoveCurrent();
				}
				else {
					iterator.Advance();
				}
				//Yeahlight: Zone freeze debug
				if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
					EQC_FREEZE_DEBUG(__LINE__, __FILE__);
			}
		}
Beispiel #16
0
		void ConsoleList::SendConsoleWho(char* to, int8 admin, EQC::World::Network::TCPConnection* connection)
		{
			LinkedListIterator<EQC::World::Network::Console*> iterator(list);
			iterator.Reset();
			struct in_addr  in;
			int x = 0;

			while(iterator.MoreElements())
			{
				in.s_addr = iterator.GetData()->GetIP();
				connection->SendEmoteMessage(to, 0, 10, "  Console: %s:%i AccID: %i AccName: %s", inet_ntoa(in), iterator.GetData()->GetPort(), iterator.GetData()->AccountID(), iterator.GetData()->AccountName());
				x++;
				iterator.Advance();
				//Yeahlight: Zone freeze debug
				if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
					EQC_FREEZE_DEBUG(__LINE__, __FILE__);
			}
				connection->SendEmoteMessage(to, 0, 10, "%i consoles connected", x);
		}
Beispiel #17
0
bool HateList::RemoveEnt(Mob *ent)
{
    LinkedListIterator<tHateEntry*> iterator(list);
    iterator.Reset();
	while(iterator.MoreElements())
    {
        if (iterator.GetData()->ent == ent)
        {
            iterator.RemoveCurrent();
            return true;
        }
        else
            iterator.Advance();
		//Yeahlight: Zone freeze debug
		if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
			EQC_FREEZE_DEBUG(__LINE__, __FILE__);
    }
    return false;
}
Beispiel #18
0
//Yeahlight: Builds a list of PC entities that were involved with the NPC's death
queue<char*> HateList::BuildHitList()
{
	queue<char*> ret;
	LinkedListIterator<tHateEntry*> iterator(list);
    iterator.Reset();
	while(iterator.MoreElements())
    {
		//Yeahlight: Entity exists and is a PC
		if(iterator.GetData()->ent && iterator.GetData()->ent->IsClient())
		{
			ret.push(iterator.GetData()->ent->GetName());
		}
        iterator.Advance();
		//Yeahlight: Zone freeze debug
		if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
			EQC_FREEZE_DEBUG(__LINE__, __FILE__);
	}
	return ret;
}
Beispiel #19
0
		Client* ClientList::Get(int32 ip, int16 port)
		{
			LinkedListIterator<Client*> iterator(list);

			iterator.Reset();
			while(iterator.MoreElements())
			{
				if (iterator.GetData()->GetIP() == ip && iterator.GetData()->GetPort() == port)
				{
					Client* tmp = iterator.GetData();
					return tmp;
				}
				iterator.Advance();
				//Yeahlight: Zone freeze debug
				if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
					EQC_FREEZE_DEBUG(__LINE__, __FILE__);
			}
			return 0;
		}
Beispiel #20
0
Mob *HateList::GetTop(Mob* sender)
{
	Mob* top = NULL;
	sint32 hate = -1;

	//Yeahlight: NPC was not supplied; abort
	if(sender == NULL)
		return top;
	
    LinkedListIterator<tHateEntry*> iterator(list);
    iterator.Reset();
	while(iterator.MoreElements())
    {
		if(iterator.GetData()->ent)
		{
			bool permit = true;
			sint32 tempHate = iterator.GetData()->hate;
			Mob* entity = iterator.GetData()->ent;
			//Yeahlight: Sitting entities generate extra hate
			if(entity->GetAppearance() == SittingAppearance)
				tempHate = tempHate * SITTING_HATE_MODIFIER;
			//Yeahlight: Skip this entity if their owner is the sender
			if(sender->GetPet() == entity)
				permit = false;
			else if(sender == entity)
				permit = false;
			else if(tempHate <= hate)
				permit = false;
			//Yeahlight: This entity is currently the highest hated entity
			if(permit)
			{
				top = entity;
				hate = tempHate;
			}
		}
        iterator.Advance();
		//Yeahlight: Zone freeze debug
		if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
			EQC_FREEZE_DEBUG(__LINE__, __FILE__);
	}
    return top;
}
Beispiel #21
0
		bool LoginServer::RemoveAuth(int32 in_lsaccount_id) 
		{
			LinkedListIterator<LSAuth_Struct*> iterator(auth_list);

			LockMutex lock(&MAuthListLock);
			iterator.Reset();
			while(iterator.MoreElements())
			{
				if (iterator.GetData()->lsaccount_id == in_lsaccount_id)
				{
					iterator.RemoveCurrent();
					return true;
				}
				iterator.Advance();
				//Yeahlight: Zone freeze debug
				if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
					EQC_FREEZE_DEBUG(__LINE__, __FILE__);
			}
			return false;
		}
Beispiel #22
0
		LSAuth_Struct* LoginServer::CheckAuth(int32 in_lsaccount_id, char* key)
		{
			LinkedListIterator<LSAuth_Struct*> iterator(auth_list);

			LockMutex lock(&MAuthListLock);
			iterator.Reset();

			while(iterator.MoreElements())
			{
				if (iterator.GetData()->lsaccount_id == in_lsaccount_id && strcmp(iterator.GetData()->key, key) == 0)
				{
					LSAuth_Struct* tmp = iterator.GetData();
					return tmp;
				}
				iterator.Advance();
				//Yeahlight: Zone freeze debug
				if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
					EQC_FREEZE_DEBUG(__LINE__, __FILE__);
			}
			return 0;
		}
Beispiel #23
0
Mob *HateList::GetRandom()
{
    int count = 0;
    LinkedListIterator<tHateEntry*> iterator(list);
    iterator.Reset();
	while(iterator.MoreElements())
    {
        iterator.Advance();
        count++;
		//Yeahlight: Zone freeze debug
		if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
			EQC_FREEZE_DEBUG(__LINE__, __FILE__);
    }
	if(count == 0)
		return 0;
    int random = rand()%count;
    iterator.Reset();
    for (int i = 0; i < random-1; i++)
        iterator.Advance();
    return iterator.GetData()->ent;
}
Beispiel #24
0
void HateList::DoFactionHits(sint32 nfl_id) {
	if (nfl_id <= 0)
		return;
    LinkedListIterator<tHateEntry*> iterator(list);
    iterator.Reset();
	while(iterator.MoreElements())
    {
        Client *p;

        if (iterator.GetData()->ent && iterator.GetData()->ent->IsClient())
            p = iterator.GetData()->ent->CastToClient();
        else
            p = NULL;

        if (p)
			p->SetFactionLevel(p->CharacterID(), nfl_id, p->GetClass(), p->GetRace(), p->GetDeity());
        iterator.Advance();
		//Yeahlight: Zone freeze debug
		if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
			EQC_FREEZE_DEBUG(__LINE__, __FILE__);
    }
}
Beispiel #25
0
Spawn2::Spawn2(int32 in_spawn2_id, int32 spawngroup_id, float in_x, float in_y, float in_z, float in_heading, int32 respawn, int32 variance, int32 timeleft, int in_roamRange, int16 in_pathgrid)
{
	spawn2_id = in_spawn2_id;
	spawngroup_id_ = spawngroup_id;
	roamRange = in_roamRange;
	//Yeahlight: Table grid_entries has grids for our roamers, we only want to use grids for patrollers (spawn2s with NO roam range)
	if(roamRange == 0)
		myPathGrid = in_pathgrid;
	else
		myPathGrid = 0;
	x = in_x;
	y = in_y;
	if(roamRange == 0)
		z = mob->FindGroundZWithZ(x, y, in_z, 2);
	else
		z = mob->FindGroundZWithZ(x, y, in_z, 200);
	myRoamBox = 999;
	//Yeahlight: roamRange is not zero, meaning the mob is not static (does not stand still; moves around)
	if(roamRange != 0)
	{
		int tempRange = roamRange;
		//Yeahlight: If tempRange is -1, then the roam range is infinite
		if(tempRange == -1)
			tempRange = ZONE_WIDE_ROAM;
		int abortCounter = 0;
		bool permit = false;
		float tempX, tempY, tempZ;
		//Yeahlight: Try values until we find one within one zone roam box
		do
		{
			//Yeahlight: Calculate new x & y values
			tempX = x + ((rand() % (tempRange * 2)) - tempRange);
			tempY = y + ((rand() % (tempRange * 2)) - tempRange);
			tempZ = mob->FindGroundZWithZ(tempX, tempY, z, 250);
			//Yeahlight: See if our values lie within a roam box
			for(int i = 0; i < zone->numberOfRoamBoxes; i++)
			{
				//Yeahlight: Temp values are within a roam box
				if(tempX < zone->roamBoxes[i].max_x && tempX > zone->roamBoxes[i].min_x && tempY < zone->roamBoxes[i].max_y && tempY > zone->roamBoxes[i].min_y)
				{
					//Yeahlight: Old location has elevated LoS to new location 
					if(entity->CheckCoordLos(tempX, tempY, tempZ + 5, GetX(), GetY(), GetZ() + 75))
					{
						permit = true;
						myRoamBox = i;
					}
				}
			}
			abortCounter++;
			//Yeahlight: Zone freeze debug
			if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
				EQC_FREEZE_DEBUG(__LINE__, __FILE__);
		} 
		while(!permit && abortCounter < 100);
		
		//Yeahlight: abortCounter is less than 100, save values
		if(permit)
		{
			//Yeahlight: Assign our new, approved values
			x = tempX;
			y = tempY;
			z = tempZ;
		}
		//Yeahlight: abortCounter is greater than 100, use old values
		else
		{
			//Yeahlight: TODO: Handle this better (log the NPC)
		}
	}
	heading = in_heading;
    respawn_ = respawn;
	variance_ = variance;
	if (spawn2_id == 1720) {
		int i = 0;
	}

	timer = new Timer( resetTimer() );
	if (timeleft == 0xFFFFFFFF) {
		timer->Disable();
	}
	else if (timeleft == 0) {
		timer->Trigger();
	}
	else {
		timer->Start(timeleft);
	}
	
	//Yeahlight: NPC is a patroller and the zone has a path resolved for this gridID
	if(myPathGrid > 0 && zone->gridsLoaded && zone->zoneGrids[myPathGrid].startID != NULL_NODE && zone->zoneGrids[myPathGrid].endID != NULL_NODE)
	{
		int16 randomNodeID;
		if(rand()%10 < 5)
			randomNodeID = zone->zoneGrids[myPathGrid].startID;
		else
			randomNodeID = zone->zoneGrids[myPathGrid].endID;
		x = zone->thisZonesNodes[randomNodeID]->x;
		y = zone->thisZonesNodes[randomNodeID]->y;
		z = zone->thisZonesNodes[randomNodeID]->z;
		myPathGridStart = randomNodeID;
	}
	else
	{
		myPathGridStart = 0;
	}
}
Beispiel #26
0
		bool LoginServer::Process()
		{
#ifdef WIN32
			SOCKADDR_IN to;
#else
			struct sockaddr_in to;
#endif

			memset((char *) &to, 0, sizeof(to));
			to.sin_family = AF_INET;
			to.sin_port = port;
			to.sin_addr.s_addr = ip;

			if (statusupdate_timer->Check())
			{
				this->SendStatus();
			}

			if (staleauth_timer->Check())
			{
				staleauth_timer->Start();
				loginserver->CheckStale();
			}
		    
			/************ Get all packets from packet manager out queue and process them ************/
			ServerPacket *pack = 0;

			while(pack = ServerOutQueue.pop())
			{
				switch(pack->opcode) 
				{
					case 0:
					break;
					case ServerOP_KeepAlive: 
					{
						// ignore this -- froglok23 -- WHY?
					}
					break;
					case ServerOP_LSClientAuth:
					{
						this->ProcessServerOP_LSClientAuth(pack);
					}
					break;
				case ServerOP_LSFatalError: 
					{
						this->ProcessServerOP_LSFatalError(pack);          
					}
					break;
				case ServerOP_SystemwideMessage:
					{
						this->ProcessServerOP_SystemwideMessage(pack);
						break;
					}
				case ServerOP_UsertoWorldReq:
					{
						this->ProcessServerOP_UsertoWorldReq(pack);
						break;
					}
				case 0x0109:
				case 0x010a:
				case 0x0106:
				case 0x0107:
					{
						//Yeahlight: These opcodes occasionally appear with a packet size of 18 when a player attempts to enter a zone. Leave these packets unresolved is freezing the client
						this->ProcessServerOP_Unknown(pack);
						this->SendPacket(pack);
						break;
					}
				default:
					{
						this->ProcessServerOP_Unknown(pack);
						break;
					}
				}

				safe_delete(pack);//delete pack;
				//Yeahlight: Zone freeze debug
				if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
					EQC_FREEZE_DEBUG(__LINE__, __FILE__);
			}

			/************ Get first send packet on queue and send it! ************/
			SPackSendQueue* p = 0;    
			int status = 0;
			while(p = ServerSendQueuePop())
			{

#ifdef WIN32
				status = send(send_socket, (const char *) p->buffer, p->size, 0);
#else
				status = send(send_socket, p->buffer, p->size, 0);
#endif
				safe_delete(p);//delete p;
				if (status == SOCKET_ERROR)
				{
					cout << "Loginserver send(): status=" << status  << ", Errorcode: " << EQC::Common::GetLastSocketError() << endl;	
					return false;
				}
				//Yeahlight: Zone freeze debug
				if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
					EQC_FREEZE_DEBUG(__LINE__, __FILE__);
			}
			/************ Processing finished ************/
			if (timeout_timer->Check())
			{
				this->SendKeepAlive();
			}

			return true;
		}
Beispiel #27
0
int SpawnGroup::GetNPCType(SPAWN_TIME_OF_DAY *tmp_time_of_day)
{
	if ( !zone ) return -1;

	int npcTypeid = -1;
	int totalchance = 0;

	vector<SEMember>::iterator it;

	SpawnEntry* se;

	for ( it = selist.begin(); it < selist.end(); it++ )
	{
		se = it->Ptr;
		if (!se)
		{
			it->UseSpawn = false;
			continue;
		}
		if(se->chance <= 0)
		{
			EQC::Common::PrintF(CP_ZONESERVER, "SpawnEntry NPCType '%i' has 0 percent change of spawning!\n", se->NPCTypeID);
			it->UseSpawn = false;
			continue;
		}
		if ( !CheckSpawnLimit(se->NPCTypeID))
		{
			EQC::Common::PrintF(CP_ZONESERVER, "SpawnEntry NPCType '%i' has reached spawn limit! Skipping new spawn.\n", se->NPCTypeID);
			it->UseSpawn = false;
			continue;
		}
		if ( se->time_of_day != Any_Time )
		{
			// Time of Day check
			if ( ( zone->IsDaytime() && ( se->time_of_day == Night_Time || se->time_of_day == Night_Time_Only ) )
				|| ( !zone->IsDaytime() && ( se->time_of_day == Day_Time || se->time_of_day == Day_Time_Only ) ) )
			{ 
				// EQC::Common::PrintF(CP_ZONESERVER, "SpawnEntry Time of Day check has prevented SpawnEntry from spawning.\n" );
				it->UseSpawn = false;
				continue;
			}
		}
		it->UseSpawn = true;
		totalchance += se->chance;

		//Yeahlight: Zone freeze debug
		if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
			EQC_FREEZE_DEBUG(__LINE__, __FILE__);
	}

	int roll = 0;
	if(totalchance > 0)
	{
		roll = (rand()%totalchance);
	}

	for (it = selist.begin(); it < selist.end(); it++)
	{
		if ( !it->UseSpawn )
			continue; // Skip it!!
		if (roll < it->Ptr->chance)
		{
			*tmp_time_of_day = it->Ptr->time_of_day;
			npcTypeid = it->Ptr->NPCTypeID;
			break;
		}
		else
		{
			roll = roll - it->Ptr->chance;
		}
		//Yeahlight: Zone freeze debug
		if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
			EQC_FREEZE_DEBUG(__LINE__, __FILE__);
	}

	//CODER  implement random table
	return npcTypeid;
}
Beispiel #28
0
int S3D_Init(s3d_object *s3dobj, FILE *fp)
{
	struct_header s3d_header;
	struct_directory_header s3d_dir_header;
	struct_directory s3d_dir;
	struct_data_block s3d_data;
	struct_fn_header *s3d_fn_header;
	struct_fn_entry *s3d_fn_entry;
	uint32 *offsets;
	char *temp, *temp2;
	int i, j, pos, inf, tmp, running = 0;
	s3dobj->fp = fp;

	fread(&s3d_header, sizeof(struct_header), 1, fp);
	if(s3d_header.magicCookie[0] != 'P' || s3d_header.magicCookie[1] != 'F' || s3d_header.magicCookie[2] != 'S' || s3d_header.magicCookie[3] != ' ')
	{
		return -1;
	}

	fseek(fp, s3d_header.offset, SEEK_SET);
	fread(&s3d_dir_header, sizeof(struct_directory_header), 1, fp);

	s3dobj->count = s3d_dir_header.count;
	s3dobj->filenames = (char **) malloc(s3d_dir_header.count * sizeof(char *));
	s3dobj->files = (uint32 *) malloc((s3d_dir_header.count - 1) * sizeof(uint32));
	offsets = (uint32 *) malloc((s3d_dir_header.count - 1) * sizeof(uint32));

	for(i = 0; i < s3d_dir_header.count; ++i)
	{
		fread(&s3d_dir, sizeof(struct_directory), 1, fp);

		if(s3d_dir.crc == 0x61580AC9)
		{
			pos = ftell(fp);
			fseek(fp, s3d_dir.offset, SEEK_SET);
			temp = (char *) malloc(s3d_dir.size);
			memset(temp, 0, s3d_dir.size);
			inf = 0;

			while(inf < s3d_dir.size)
			{
				fread(&s3d_data, sizeof(struct_data_block), 1, fp);
				temp2 = (char *) malloc(s3d_data.deflen);
				fread(temp2, s3d_data.deflen, 1, fp);
				decompress(temp2, temp + inf, s3d_data.deflen, s3d_data.inflen);
				free(temp2);
				inf += s3d_data.inflen;
				//Yeahlight: Zone freeze debug
				if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
					EQC_FREEZE_DEBUG(__LINE__, __FILE__);
			}

			fseek(fp, pos, SEEK_SET);
			s3d_fn_header = (struct_fn_header *) temp;
			pos = sizeof(struct_fn_header);

			for(j = 0; j < s3d_fn_header->fncount; ++j) //TODO: using arena.s3d, s3d_fn_header->fncount is 10, however it crashes after 8, possible the s3d_fn_header->fncount is wrong due to this being older s3d files
			{
				s3d_fn_entry = (struct_fn_entry *) &temp[pos];

				s3d_fn_entry->fnlen = strlen(&temp[pos + sizeof(struct_fn_entry)]) +1; // Dark-Prince - Added this to update the length

				s3dobj->filenames[j] = (char *) malloc(s3d_fn_entry->fnlen + 1);
				s3dobj->filenames[j][s3d_fn_entry->fnlen] = 0;
				memcpy(s3dobj->filenames[j], &temp[pos + sizeof(struct_fn_entry)], s3d_fn_entry->fnlen);
				pos += sizeof(struct_fn_entry) + s3d_fn_entry->fnlen;
			}
		}

		else
		{
			s3dobj->files[running] = ftell(fp) - 12;
			offsets[running] = s3d_dir.offset;
			++running;
		}

	}

	for(i = s3d_dir_header.count - 2; i > 0; i--) {
		for(j = 0; j < i; j++) {
			if(offsets[j] > offsets[j+1]) {
				tmp = offsets[j];
				offsets[j] = offsets[j + 1];
				offsets[j + 1] = tmp;
				tmp = s3dobj->files[j];
				s3dobj->files[j] = s3dobj->files[j + 1];
				s3dobj->files[j + 1] = tmp;
			}
		}
	}

	return 0;
}
Beispiel #29
0
//Yeahlight: Searches for the group that will be rewarded with exp and first loot rights
returnGroup HateList::GetRewardingGroup()
{
	groupDamage groupsToConsider[255] = {0};
	int16 groupCounter = 0;
	int16 groupID = 0;
	int16 leadingGroupID = 0;
	sint32 highestGroupDamage = 0;
	sint32 entityDamage = 0;
	Mob* entity = NULL;
	returnGroup groupToReward;
	Group* group = NULL;
	bool groupFound = false;

	for(int i = 0; i < 255; i++)
	{
		groupsToConsider[i].groupID = -1;
		groupsToConsider[i].groupDamageTotal = -1;
	}
	groupToReward.damage = 0;
	groupToReward.group = NULL;

	LinkedListIterator<tHateEntry*> iterator(list);
    iterator.Reset();
	while(iterator.MoreElements())
    {
		entityDamage = 0;
		if(iterator.GetData())
			entityDamage = iterator.GetData()->damage;
		if(entityDamage > 0)
		{
			entity = iterator.GetData()->ent;
			//Yeahlight: Entity exists in the zone
			if(entity)
			{
				//Yeahlight: Entity is a client
				if(entity->IsClient())
				{
					//Yeahlight: PC is grouped
					if(entity->CastToClient()->IsGrouped())
					{
						group = entity_list.GetGroupByClient(entity->CastToClient());
						//Yeahlight: Group exists
						if(group)
						{
							groupID = group->GetID();
							//Yeahlight: We do not have a group list started yet, so start it off with this group
							if(groupCounter == 0)
							{
								groupsToConsider[0].groupID = groupID;
								groupsToConsider[0].groupDamageTotal = iterator.GetData()->damage;
								groupsToConsider[0].group = group;
								groupCounter++;
							}
							//Yeahlight: A group list has been created already
							else
							{
								//Yeahlight: Iterate through the group list
								for(int i = 0; i < groupCounter; i++)
								{
									//Yeahlight: Found the group for which this PC resides
									if(groupID == groupsToConsider[i].groupID)
									{
										//Yeahlight: Add the client's damage to the group's total
										groupsToConsider[i].groupDamageTotal += iterator.GetData()->damage;
										//Yeahlight: Flag the PC as found
										groupFound = true;
										//Yeahlight: "Break out" of the loop
										i = groupCounter;
									}
								}
								//Yeahlight: This grouped PC did not find their group in the list, so we need to add their group
								if(!groupFound)
								{
									groupsToConsider[groupCounter].groupID = groupID;
									groupsToConsider[groupCounter].groupDamageTotal = iterator.GetData()->damage;
									groupsToConsider[groupCounter].group = group;
									groupCounter++;
								}
							}
						}
						//Yeahlight: Group does not exist
						else
						{
							
						}
					}
					//Yeahlight: PC is not grouped
					else
					{

					}
				}
				//Yeahlight: Entity is the pet of a client
				else if(entity->IsNPC() && entity->GetOwner() && entity->GetOwner()->IsClient())
				{
					//Yeahlight: Owner of the pet is grouped
					if(entity->GetOwner()->CastToClient()->IsGrouped())
					{
						group = entity_list.GetGroupByClient(entity->GetOwner()->CastToClient());
						//Yeahlight: Group exists
						if(group)
						{
							groupID = group->GetID();
							//Yeahlight: We do not have a group list started yet, so start it off with this group
							if(groupCounter == 0)
							{
								groupsToConsider[0].groupID = groupID;
								groupsToConsider[0].groupDamageTotal = iterator.GetData()->damage;
								groupsToConsider[0].group = group;
								groupCounter++;
							}
							//Yeahlight: A group list has been created already
							else
							{
								//Yeahlight: Iterate through the group list
								for(int i = 0; i < groupCounter; i++)
								{
									//Yeahlight: Found the group for which this pet resides
									if(groupID == groupsToConsider[i].groupID)
									{
										//Yeahlight: Add the pet's damage to the group's total
										groupsToConsider[i].groupDamageTotal += iterator.GetData()->damage;
										//Yeahlight: Flag the pet as found
										groupFound = true;
										//Yeahlight: "Break out" of the loop
										i = groupCounter;
									}
								}
								//Yeahlight: This grouped pet did not find their group in the list, so we need to add their group
								if(!groupFound)
								{
									groupsToConsider[groupCounter].groupID = groupID;
									groupsToConsider[groupCounter].groupDamageTotal = iterator.GetData()->damage;
									groupsToConsider[groupCounter].group = group;
									groupCounter++;
								}
							}
						}
						//Yeahlight: Group does not exist
						else
						{
							
						}
					}
					//Yeahlight: Pet's owner is not grouped
					else
					{

					}
				}
			}
			//Yeahlight: Entity does not exist in the zone
			else
			{

			}
		}
        iterator.Advance();
		//Yeahlight: Zone freeze debug
		if(ZONE_FREEZE_DEBUG && rand()%ZONE_FREEZE_DEBUG == 1)
			EQC_FREEZE_DEBUG(__LINE__, __FILE__);
    }

	//Yeahlight: Iterate through the group list and record for the highest damaging group
	for(int i = 0; i < groupCounter; i++)
	{
		//Yeahlight: Found a group with more total damage than our current leader
		if(groupsToConsider[i].groupDamageTotal > highestGroupDamage)
		{
			highestGroupDamage = groupsToConsider[i].groupDamageTotal;
			groupToReward.damage = groupsToConsider[i].groupDamageTotal;
			groupToReward.group = groupsToConsider[i].group;
		}
	}

	return groupToReward;
}