Batch #1665 by ragnarok-clanker: 0 byte-identical, 70 confirmed by peer review. - fn_10904 UIEditCtrl::UpdateLinks: logic confirmed by peer review - fn_10905 EditViewport::Synchronize: logic confirmed by peer review - fn_10950 UIBalloonText::SetText: logic confirmed by peer review - fn_11216 ItemLinkDisplay::Convert: logic confirmed by peer review - fn_11326 UIListBox::Slot15: logic confirmed by peer review (already on main) - fn_11327 UIListBoxEx::Slot15: logic confirmed by peer review (already on main) - fn_11366 UIListBox::Paint: logic confirmed by peer review - fn_11367 UIListBoxEx::Paint: logic confirmed by peer review - fn_11392 UITextButton::Paint: logic confirmed by peer review - fn_11394 UITextViewer::Paint: logic confirmed by peer review - fn_11445 UITextButton::Slot31: logic confirmed by peer review (already on main) - fn_11471 UITextButton::Slot27: logic confirmed by peer review (already on main) - fn_11494 UITextButton::Slot33: logic confirmed by peer review (already on main) - fn_11562 UITextViewer::SendMsg: logic confirmed by peer review (already on main) - fn_11721 UICntWnd::DrawBorder: logic confirmed by peer review (already on main) - fn_11760 UIBank_NewWnd::Paint: logic confirmed by peer review (already on main) - fn_11761 UIChatRoomWnd::Paint: logic confirmed by peer review (already on main) - fn_11767 UIMerInfoWnd::Paint: logic confirmed by peer review (already on main) - fn_12680 ShortcutPainting::Paint: logic confirmed by peer review - fn_13829 WrapPlainText: logic confirmed by peer review - fn_13833 WrapRichText: logic confirmed by peer review - fn_16941 UIWindow::DrawAmount: logic confirmed by peer review - fn_16971 UIWindow::TextHeight: logic confirmed by peer review - fn_16972 UIWindow::VerticalTextHeight: logic confirmed by peer review - fn_16973 UIWindow::TextSize: logic confirmed by peer review - fn_16974 UIWindow::VerticalTextSize: logic confirmed by peer review - fn_16975 UIWindow::TextWidth: logic confirmed by peer review - fn_16993 WrapPixelText: logic confirmed by peer review - fn_17007 FitText: logic confirmed by peer review - fn_17009 UIWindow::DrawTextAt: logic confirmed by peer review - fn_17013 DrawOutlinedColoredText: logic confirmed by peer review - fn_17014 DrawStyledColoredText: logic confirmed by peer review - fn_17015 DrawColoredText: logic confirmed by peer review - fn_17016 DrawOutlinedText: logic confirmed by peer review - fn_17136 BrowserFactory::Create: logic confirmed by peer review - fn_18376 LookupMessage: logic confirmed by peer review - fn_01934 TextContext::TextContext: logic confirmed by peer review - fn_01957 TextContext::Marker: logic confirmed by peer review - fn_01961 TextContext::Measure: logic confirmed by peer review - fn_01966 TextContext::SetFont: logic confirmed by peer review - fn_01970 TextContext::DrawPair: logic confirmed by peer review - fn_01971 TextContext::Draw: logic confirmed by peer review - fn_01983 TextContext::MeasurePart: logic confirmed by peer review - fn_01984 TextContext::DrawPart: logic confirmed by peer review - fn_21788 ReceivePartyJoinResult: logic confirmed by peer review - fn_24191 EmotionHotkeys::LoadDefaults: logic confirmed by peer review - fn_03664 CAdventurerAgencyMgr::CompletePartyInfo: logic confirmed by peer review - fn_03666 CAdventurerAgencyMgr::CompleteRegistration: logic confirmed by peer review - fn_03668 CAdventurerAgencyMgr::CompleteStopRecruiting: logic confirmed by peer review - fn_03976 CEmblemDataMgr::CompleteUpload: logic confirmed by peer review - fn_04239 CMCStoreInfoBackup::CompleteSave: logic confirmed by peer review - fn_04262 CPlayerNameDictionary::Lookup: logic confirmed by peer review - fn_06581 ItemNaming::DisplayName: logic confirmed by peer review (already on main) - fn_06583 ItemNamingContext::Element: logic confirmed by peer review (already on main) - fn_06584 ItemNamingContext::Star: logic confirmed by peer review (already on main) - fn_06585 ItemNaming::Creator: logic confirmed by peer review (already on main) - fn_06586 ItemNamingContext::Apprentice: logic confirmed by peer review (already on main) - fn_06587 ItemNaming::Suffixes: logic confirmed by peer review (already on main) - fn_06588 ItemNaming::Prefixes: logic confirmed by peer review (already on main) - fn_09299 UIApplyForPartyWnd::Slot15: logic confirmed by peer review - fn_09300 UIRegisterPartyWnd::Slot15: logic confirmed by peer review - fn_09301 UIRequestJoinPartyWnd::Slot15: logic confirmed by peer review - fn_09303 UIApplyForPartyWnd::Paint: logic confirmed by peer review - fn_09304 UIPartyInfoWnd::Paint: logic confirmed by peer review - fn_10748 UIEditCtrl::RemoveInvalidLink: logic confirmed by peer review - fn_10758 UIEditCtrl::DrawSelectionAt: logic confirmed by peer review (already on main) - fn_10759 UIEditCtrl::DrawSelection: logic confirmed by peer review (already on main) - fn_10794 UIBasicButton::Paint: logic confirmed by peer review - fn_10799 UIBmpTextButton::Paint: logic confirmed by peer review - fn_10823 UITransBalloonText::Paint: logic confirmed by peer review Reviewed-by: ragnarok-clanker
129 lines
3.4 KiB
C++
129 lines
3.4 KiB
C++
#include "Contents/MessageTable.h"
|
|
#include "Contents/PlayerNameDictionary.h"
|
|
#include "Network/Connection/Connection.h"
|
|
|
|
#include <algorithm>
|
|
#include <cstring>
|
|
#include <windows.h>
|
|
#include <timeapi.h>
|
|
|
|
// INLINED
|
|
CPlayerNameDictionary::CPlayerNameDictionary(PlayerNameContext& context) : m_enabled(true), m_context(&context) {
|
|
}
|
|
|
|
// INLINED
|
|
CPlayerNameDictionary::CPlayerNameDictionary() : m_enabled(true), m_context(nullptr) {
|
|
}
|
|
|
|
// OFFSET: 0x0060A9D0
|
|
// OFFSET: 0x0060AAE0
|
|
// FUNCTION: fn_04256
|
|
CPlayerNameDictionary::~CPlayerNameDictionary() = default;
|
|
|
|
// OFFSET: 0x0060AFB0
|
|
// OFFSET: 0x0060B010
|
|
// FUNCTION: fn_04262
|
|
std::string CPlayerNameDictionary::Lookup(std::uint32_t id) {
|
|
const auto entry = this->m_names.find(id);
|
|
if (entry != this->m_names.end()) {
|
|
return entry->second.name;
|
|
}
|
|
|
|
if (std::find(this->m_pending.begin(), this->m_pending.end(), id) == this->m_pending.end()) {
|
|
this->m_pending.push_back(id);
|
|
}
|
|
|
|
return LookupMessage(581);
|
|
}
|
|
|
|
// OFFSET: 0x0060ABB0
|
|
// FUNCTION: fn_04258
|
|
void CPlayerNameDictionary::Set(std::uint32_t id, std::string name) {
|
|
this->m_names.insert_or_assign(id, Entry{std::move(name), timeGetTime()});
|
|
const auto request = std::find_if(this->m_requests.begin(), this->m_requests.end(), [&](const Request& value) { return value.id == id; });
|
|
if (request != this->m_requests.end()) {
|
|
this->m_requests.erase(request);
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x0060B2E0
|
|
// FUNCTION: fn_04263
|
|
void CPlayerNameDictionary::Clear() {
|
|
this->m_names.clear();
|
|
this->m_pending.clear();
|
|
this->m_requests.clear();
|
|
}
|
|
|
|
// OFFSET: 0x0060B420
|
|
// FUNCTION: fn_04264
|
|
bool CPlayerNameDictionary::Contains(std::uint32_t id) const {
|
|
return this->m_names.contains(id);
|
|
}
|
|
|
|
// OFFSET: 0x0060B470
|
|
// FUNCTION: fn_04265
|
|
void CPlayerNameDictionary::Update() {
|
|
while (!this->m_requests.empty()) {
|
|
if (timeGetTime() < this->m_requests.front().tick + 10000u) {
|
|
break;
|
|
}
|
|
|
|
this->m_requests.pop_front();
|
|
}
|
|
|
|
while (!this->m_pending.empty()) {
|
|
const std::uint32_t id = this->m_pending.front();
|
|
const auto cached = this->m_names.find(id);
|
|
const bool fresh = cached != this->m_names.end() && !(cached->second.tick + 600000u < timeGetTime());
|
|
const auto outstanding = std::find_if(this->m_requests.begin(), this->m_requests.end(), [&](const Request& request) { return request.id == id; });
|
|
this->m_pending.pop_front();
|
|
|
|
if (fresh || outstanding != this->m_requests.end()) {
|
|
continue;
|
|
}
|
|
|
|
if (id != 0) {
|
|
unsigned char packet[6];
|
|
const std::uint16_t header = 873;
|
|
std::memcpy(packet, &header, sizeof(header));
|
|
std::memcpy(packet + 2, &id, sizeof(id));
|
|
this->m_context->connection.Send(sizeof(packet), packet);
|
|
this->m_requests.push_back({id, timeGetTime()});
|
|
}
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
// GLOBAL: gl_24677
|
|
CPlayerNameDictionary* g_playerNameDictionary = nullptr;
|
|
|
|
// OFFSET: 0x0060AE30
|
|
// FUNCTION: fn_04259
|
|
bool CreatePlayerNameDictionary() {
|
|
if (g_playerNameDictionary) {
|
|
return false;
|
|
}
|
|
|
|
g_playerNameDictionary = new (std::nothrow) CPlayerNameDictionary();
|
|
if (!g_playerNameDictionary) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// OFFSET: 0x0060AF90
|
|
// FUNCTION: fn_04260
|
|
void DestroyPlayerNameDictionary() {
|
|
if (g_playerNameDictionary) {
|
|
delete g_playerNameDictionary;
|
|
g_playerNameDictionary = nullptr;
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x0060AFB0
|
|
// FUNCTION: fn_04261
|
|
std::string LookupPlayerName(std::uint32_t id) {
|
|
return g_playerNameDictionary->Lookup(id);
|
|
}
|