diff --git a/src/client/ClientServices.cpp b/src/client/ClientServices.cpp index 257670c..9c073fa 100644 --- a/src/client/ClientServices.cpp +++ b/src/client/ClientServices.cpp @@ -58,6 +58,14 @@ ClientServices* ClientServices::GetInstance() { return ClientServices::s_instance; } +REALM_INFO* ClientServices::GetRealmInfoByIndex(int32_t index) { + if (index >= ClientServices::GetInstance()->m_realmList.Count()) { + return nullptr; + } + + return &ClientServices::GetInstance()->m_realmList[index]; +} + const char* ClientServices::GetSelectedRealmName() { if (!ClientServices::s_realmNameVar) { ClientServices::s_realmNameVar = CVar::Register( diff --git a/src/client/ClientServices.hpp b/src/client/ClientServices.hpp index 83182ce..0d96965 100644 --- a/src/client/ClientServices.hpp +++ b/src/client/ClientServices.hpp @@ -25,6 +25,7 @@ class ClientServices : public LoginResponse { static void ConnectToSelectedServer(); static ClientConnection* Connection(); static ClientServices* GetInstance(); + static REALM_INFO* GetRealmInfoByIndex(int32_t index); static const char* GetSelectedRealmName(); static void Initialize(); static Login* LoginConnection(); diff --git a/src/glue/CRealmList.cpp b/src/glue/CRealmList.cpp index fd5ac25..3509ee7 100644 --- a/src/glue/CRealmList.cpp +++ b/src/glue/CRealmList.cpp @@ -1,8 +1,15 @@ #include "glue/CRealmList.hpp" +#include "client/ClientServices.hpp" #include "db/Db.hpp" +#include "ui/FrameScript.hpp" +#include #include +#include +float CRealmList::s_avgLoad; TSFixedArray CRealmList::s_categories; +int32_t CRealmList::s_preferredCategory = -1; +int32_t CRealmList::s_selectedCategory = -1; void CRealmList::Initialize() { CRealmList::s_categories.SetCount(g_cfg_CategoriesDB.m_numRecords); @@ -20,5 +27,73 @@ void CRealmList::Initialize() { } void CRealmList::UpdateList() { - // TODO + CRealmList::s_avgLoad = 0.0f; + int32_t category = -1; + auto realmCount = ClientServices::GetInstance()->m_realmList.Count(); + + for (int32_t realmIndex = 0; realmIndex < realmCount; realmIndex++) { + auto realmInfo = ClientServices::GetRealmInfoByIndex(realmIndex); + if (!realmInfo) { + continue; + } + + auto selectedRealmName = ClientServices::GetSelectedRealmName(); + + if (!SStrCmpI(selectedRealmName, realmInfo->name, STORM_MAX_STR) /* TODO SStrCmpUTF8I */) { + if (CRealmList::s_preferredCategory < 0) { + CRealmList::s_preferredCategory = realmInfo->category; + } + + category = realmInfo->category; + } + + CRealmList::s_avgLoad += realmInfo->population; + + for (int32_t categoryIndex = 0; categoryIndex < CRealmList::s_categories.Count(); categoryIndex++) { + auto realmCategory = CRealmList::s_categories[categoryIndex]; + + if (realmInfo->category != realmCategory->m_category->m_ID) { + continue; + } + + if (realmCategory->m_realms.Count() == realmCategory->uint14) { + realmCategory->m_realms.SetCount(realmCategory->uint14 + 1); + } + + realmCategory->m_realms[realmCategory->uint14] = realmIndex; + realmCategory->uint14++; + } + } + + if (realmCount <= 1) { + CRealmList::s_avgLoad = 1.0f; + } else { + // TODO + } + + // TODO CRealmList::m_stdDevLoad + + // TODO sort realm list + + for (int32_t i = 0; i < CRealmList::s_categories.Count(); i++) { + if (CRealmList::s_categories[i]->m_category->m_ID == category) { + CRealmList::s_selectedCategory = i; + } + } + + if (CRealmList::s_preferredCategory != -1 /* TODO || ClientServices::Connection()->uint2F10 */) { + FrameScript_SignalEvent(9, nullptr); + } else { + uint32_t nonEmptyCategories = 0; + + for (uint32_t i = 0; i < CRealmList::s_categories.Count(); i++) { + auto realmCategory = CRealmList::s_categories[i]; + + if (realmCategory && realmCategory->uint14 != 0) { + nonEmptyCategories++; + } + } + + FrameScript_SignalEvent(10, "%d", nonEmptyCategories); + } } diff --git a/src/glue/CRealmList.hpp b/src/glue/CRealmList.hpp index fe2a992..35ad34d 100644 --- a/src/glue/CRealmList.hpp +++ b/src/glue/CRealmList.hpp @@ -15,7 +15,10 @@ struct RealmCategory { class CRealmList { public: // Static variables + static float s_avgLoad; static TSFixedArray s_categories; + static int32_t s_preferredCategory; + static int32_t s_selectedCategory; // Static functions static void Initialize();