void DatabaseThread::AddRequest(Packet * pkt) { _lock.Acquire(); _queue.push(pkt); _lock.Release(); s_hEvent.Signal(); }
uint32 THREADCALL DatabaseThread::ThreadProc(void * lpParam) { while (true) { Packet *p = nullptr; // Pull the next packet from the shared queue _lock.Acquire(); if (_queue.size()) { p = _queue.front(); _queue.pop(); } _lock.Release(); // If there's no more packets to handle, wait until there are. if (p == nullptr) { // If we're shutting down, don't bother waiting for more (there are no more). if (!_running) break; s_hEvent.Wait(); continue; } // References are fun =p Packet & pkt = *p; // First 2 bytes are always going to be the socket ID // or -1 for no user. int16 uid = pkt.read<int16>(); // Attempt to lookup the user if necessary CUser *pUser = nullptr; if (uid >= 0) { pUser = g_pMain->GetUserPtr(uid); // Check to make sure they're still connected. if (pUser == nullptr) continue; } uint8 subOpcode; switch (pkt.GetOpcode()) { case WIZ_LOGIN: if (pUser) pUser->ReqAccountLogIn(pkt); break; case WIZ_SEL_NATION: if (pUser) pUser->ReqSelectNation(pkt); break; case WIZ_ALLCHAR_INFO_REQ: if (pUser) pUser->ReqAllCharInfo(pkt); break; case WIZ_CHANGE_HAIR: if (pUser) pUser->ReqChangeHair(pkt); break; case WIZ_NEW_CHAR: if (pUser) pUser->ReqCreateNewChar(pkt); break; case WIZ_DEL_CHAR: if (pUser) pUser->ReqDeleteChar(pkt); break; case WIZ_SEL_CHAR: if (pUser) pUser->ReqSelectCharacter(pkt); break; case WIZ_CHAT: pkt >> subOpcode; if (subOpcode == CLAN_NOTICE) CKnightsManager::ReqUpdateClanNotice(pkt); break; case WIZ_DATASAVE: if (pUser) pUser->ReqSaveCharacter(); break; case WIZ_KNIGHTS_PROCESS: CKnightsManager::ReqKnightsPacket(pUser, pkt); break; case WIZ_LOGIN_INFO: if (pUser) pUser->ReqSetLogInInfo(pkt); break; case WIZ_BATTLE_EVENT: // g_pMain->BattleEventResult(pkt); break; case WIZ_SHOPPING_MALL: if (pUser) pUser->ReqShoppingMall(pkt); break; case WIZ_SKILLDATA: if (pUser) pUser->ReqSkillDataProcess(pkt); break; case WIZ_FRIEND_PROCESS: if (pUser) pUser->ReqFriendProcess(pkt); break; case WIZ_NAME_CHANGE: if (pUser) pUser->ReqChangeName(pkt); break; case WIZ_CAPE: if (pUser) pUser->ReqChangeCape(pkt); break; case WIZ_LOGOUT: if (pUser) pUser->ReqUserLogOut(); break; case WIZ_KING: CKingSystem::HandleDatabaseRequest(pUser, pkt); break; case WIZ_ITEM_UPGRADE: if (pUser) pUser->ReqSealItem(pkt); break; case WIZ_ZONE_CONCURRENT: { uint32 serverNo, count; pkt >> serverNo >> count; g_DBAgent.UpdateConCurrentUserCount(serverNo, 1, count); } break; } // Free the packet. delete p; } TRACE("[Thread %d] Exiting...\n", lpParam); return 0; }