//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; }
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__); } }
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__); } }
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; }
//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; }
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; }
//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; };
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__); } }
// 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__); } }
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; }
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; }
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 }
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; }
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__); } }
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__); } }
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); }
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; }
//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; }
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; }
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; }
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; }
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; }
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; }
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__); } }
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; } }
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; }
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; }
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; }
//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; }