Batch #17237 by ragnarok-clanker: no function's compiled code changes; checked with 105 compiled unit(s), including every includer of Source/Linkage/Source/Client/Mode/LoginMode.cpp.h, Source/Linkage/Source/Client/Session/SessionAchievements.cpp.h, Source/Linkage/Source/Client/Session/SessionPredicates.cpp.h, Source/Linkage/Source/Client/Session/SessionState.cpp.h, Source/Linkage/Source/Contents/Achievement/AchievementMgr.cpp.h, Source/Linkage/Source/Contents/Actors/ActorPickNode.cpp.h, Source/Linkage/Source/Contents/Actors/MercenaryAI.cpp.h, Source/Linkage/Source/Contents/Actors/Resources/RobeResources.cpp.h, Source/Linkage/Source/Contents/CashEmotion/CashEmotionMgr.cpp.h, Source/Linkage/Source/Contents/Effects/EffectResourceSwitcher.cpp.h, Source/Linkage/Source/Contents/Effects/Particles/AnimatedEmitterEffect.cpp.h, Source/Linkage/Source/Contents/Effects/Particles/Particle.cpp.h, Source/Linkage/Source/Contents/Effects/Skills/MonsterSkillEffects.cpp.h, Source/Linkage/Source/Contents/Emblems/EmblemCache.cpp.h, Source/Linkage/Source/Contents/Emblems/EmblemDataDownloadAsyncWork.cpp.h, Source/Linkage/Source/Contents/Emblems/EmblemDataMgr.cpp.h, Source/Linkage/Source/Contents/Emblems/EmblemDataUploadAsyncWork.cpp.h, Source/Linkage/Source/Contents/Emblems/GuildEmblemLookup.cpp.h, Source/Linkage/Source/Contents/Hotkeys/EmotionHotkeys.cpp.h, Source/Linkage/Source/Contents/Items/ItemInfo.cpp.h, Source/Linkage/Source/Contents/Items/ItemNaming.cpp.h, Source/Linkage/Source/Contents/Map/PrivateAirplaneMgr.cpp.h, Source/Linkage/Source/Contents/Map/TownInfoMgr.cpp.h, Source/Linkage/Source/Contents/Messenger/MessengerMember.cpp.h, Source/Linkage/Source/Contents/Messenger/WhisperBlockMgr.cpp.h, Source/Linkage/Source/Contents/Models/ModelLighting.cpp.h, Source/Linkage/Source/Contents/Movies/BinkMovies.cpp.h, Source/Linkage/Source/Contents/Navigation/NavigationDestinations.cpp.h, Source/Linkage/Source/Contents/Navigation/NavigationRequest.cpp.h, Source/Linkage/Source/Contents/Navigation/NavigationRoute.cpp.h, Source/Linkage/Source/Contents/Party/AgencyRequests.cpp.h, Source/Linkage/Source/Contents/Party/LoadPartyInfoAsyncWork.cpp.h, Source/Linkage/Source/Contents/Party/LoadPartyListAsyncWork.cpp.h, Source/Linkage/Source/Contents/Party/RegisterPartyAsyncWork.cpp.h, Source/Linkage/Source/Contents/Repute/ReputeMgr.cpp.h, Source/Linkage/Source/Contents/Sound/SoundMgr.cpp.h, Source/Linkage/Source/Contents/Store/MCStoreInfoBackup.cpp.h, Source/Linkage/Source/Contents/Store/MCStoreInfoBackupAsyncWork.cpp.h, Source/Linkage/Source/Contents/Time/ClientTiming.cpp.h, Source/Linkage/Source/Contents/UserData/AccountLinkedUserDataLoadAsyncWork.cpp.h, Source/Linkage/Source/Contents/UserData/AccountLinkedUserDataMgr.cpp.h, Source/Linkage/Source/Contents/UserData/AccountLinkedUserDataSaveAsyncWork.cpp.h, Source/Linkage/Source/Contents/UserData/CharacterConfigSave.cpp.h, Source/Linkage/Source/Contents/UserData/CharacterLinkedUserDataLoadAsyncWork.cpp.h, Source/Linkage/Source/Contents/UserData/CharacterLinkedUserDataSaveAsyncWork.cpp.h, Source/Linkage/Source/File/DirectoryRemoval.cpp.h, Source/Linkage/Source/Network/NIPAddr.cpp.h, Source/Linkage/Source/Network/Packets/ActorNamePacket.cpp.h, Source/Linkage/Source/Render/Device/RenderBackends.cpp.h, Source/Linkage/Source/Render/Primitives/ScreenLine.cpp.h, Source/Linkage/Source/Render/Text/EmbedFont.cpp.h, Source/Linkage/Source/Resource/Models/RmaResource.cpp.h, Source/Linkage/Source/Resource/ResourceFailures.cpp.h, Source/Linkage/Source/Script/LuaScript.cpp.h, Source/Linkage/Source/Security/NProtectGameGuardMgr.cpp.h, Source/Linkage/Source/UI/Acceptance/UIExchangeAcceptWnd.cpp.h, Source/Linkage/Source/UI/Achievement/UIAchWnd.cpp.h, Source/Linkage/Source/UI/Buttons/UINaviLinkButton.cpp.h, Source/Linkage/Source/UI/CashShop/UICashShopWnd.cpp.h, Source/Linkage/Source/UI/Chat/UIChatRoomTitle.cpp.h, Source/Linkage/Source/UI/Dialogs/UIMessageBox.cpp.h, Source/Linkage/Source/UI/Dialogs/UINoteWnd.cpp.h, Source/Linkage/Source/UI/Edit/UIEditCtrl3.cpp.h, Source/Linkage/Source/UI/Enchant/UIEnchantUI.cpp.h, Source/Linkage/Source/UI/EntryQueue/UIEntryQueueWnd.cpp.h, Source/Linkage/Source/UI/Events/UICheckAttendanceWnd.cpp.h, Source/Linkage/Source/UI/GameSettings/GameSettingsUI.cpp.h, Source/Linkage/Source/UI/GameSettings/UIHotkeyGuideWnd.cpp.h, Source/Linkage/Source/UI/Gauges/UIBarGraph.cpp.h, Source/Linkage/Source/UI/Guild/UIGuildHelperWnd.cpp.h, Source/Linkage/Source/UI/Items/UIEquipmentPropertiesWnd.cpp.h, Source/Linkage/Source/UI/Items/UIItemReformWnd.cpp.h, Source/Linkage/Source/UI/Items/UIItemStoreComboBox.cpp.h, Source/Linkage/Source/UI/Items/UILapineBoxWnd.cpp.h, Source/Linkage/Source/UI/Items/UIMakeTargetProcessWnd.cpp.h, Source/Linkage/Source/UI/Items/UIMerchantItemLogWnd.cpp.h, Source/Linkage/Source/UI/Items/UISwapEquipmentWnd.cpp.h, Source/Linkage/Source/UI/Lists/UIChatHisBox.cpp.h, Source/Linkage/Source/UI/Lists/UIComboBoxDefWnd.cpp.h, Source/Linkage/Source/UI/Login/UIPasswordWnd.cpp.h, Source/Linkage/Source/UI/Macro/UIMacroDetectorWnd.cpp.h, Source/Linkage/Source/UI/Navigation/NavigationLink.cpp.h, Source/Linkage/Source/UI/Party/UIApplyForPartyWnd.cpp.h, Source/Linkage/Source/UI/Party/UIRegisterPartyWnd.cpp.h, Source/Linkage/Source/UI/Party/UISeekPartyMBWnd.cpp.h, Source/Linkage/Source/UI/Quest/UIRecommendedQuestInfo.cpp.h, Source/Linkage/Source/UI/Repute/UIReputeWnd.cpp.h, Source/Linkage/Source/UI/Rodex/UIRodexComposeWnd.cpp.h, Source/Linkage/Source/UI/RuneSystem/UIRuneSystemWnd.cpp.h, Source/Linkage/Source/UI/Shop/UIMerchantShopTitle.cpp.h, Source/Linkage/Source/UI/Shortcuts/UIShortCutWnd.cpp.h, Source/Linkage/Source/UI/Skill/UIGraffiStrboxWnd.cpp.h, Source/Linkage/Source/UI/SkillDelayInfo/UISkillDelayInfo.cpp.h, Source/Linkage/Source/UI/Status/UIBasicInfoWnd.cpp.h, Source/Linkage/Source/UI/Text/ColoredText.cpp.h, Source/Linkage/Source/UI/Text/ItemLinkDisplay.cpp.h, Source/Linkage/Source/UI/Text/TextMarkup.cpp.h, Source/Linkage/Source/UI/Text/UITagTextViewer.cpp.h, Source/Linkage/Source/UI/Text/UITextViewer.cpp.h, Source/Linkage/Source/UI/Window/UIFrameWnd.cpp.h, Source/Linkage/Source/UI/Window/UIWindow.cpp.h, Source/Linkage/Source/UI/Window/UIWindowFactory.cpp.h, Source/Linkage/Source/UI/Window/WindowRegistration.cpp.h, Source/Linkage/Source/UI/Window/WindowRetirement.cpp.h, Source/Linkage/Source/Utility/Threading/NThread.cpp.h.
145 lines
4.3 KiB
C++
145 lines
4.3 KiB
C++
#include "UI/Window/WindowId.h"
|
|
#include "Client/Application/Launcher.h"
|
|
#include "Client/Mode/CGameMode.h"
|
|
#include "Client/Mode/ModeMgr.h"
|
|
#include "Client/Session/Session.h"
|
|
#include "Contents/Emblems/GuildEmblemReqBundle.h"
|
|
#include "Contents/Guild/GuildMgr.h"
|
|
#include "File/FileEnumeration.h"
|
|
#include "UI/Window/UIWindow.h"
|
|
#include "UI/Window/UIWindowMgr.h"
|
|
#include "Utility/Text/FormatString.h"
|
|
|
|
#include <cstdio>
|
|
#include <cstring>
|
|
#include <direct.h>
|
|
#include <io.h>
|
|
#include <list>
|
|
#include <memory>
|
|
#include <sstream>
|
|
#include <sys/stat.h>
|
|
#include <windows.h>
|
|
#include <zlib.h>
|
|
|
|
namespace {
|
|
// INLINED
|
|
__forceinline std::string Basename(const std::string& path) {
|
|
std::string name = path;
|
|
const auto separator = path.rfind('\\');
|
|
if (separator != std::string::npos) {
|
|
name = path.substr(separator + 1, path.size());
|
|
}
|
|
|
|
return name;
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x0065ED00
|
|
// FUNCTION: fn_05178
|
|
std::string CGuildMgr::EmblemFilename(std::uint32_t guild, std::uint32_t revision) const {
|
|
std::stringstream name;
|
|
name << g_session.m_accountName << "_" << guild << "_" << (revision + 0x7FFFFFFFu) << ".ebm";
|
|
return name.str();
|
|
}
|
|
|
|
// OFFSET: 0x0065E6F0
|
|
// FUNCTION: fn_05176
|
|
bool CGuildMgr::IsInvalidEmblem(std::string path) const {
|
|
return this->m_invalidEmblems.find(Basename(path)) != this->m_invalidEmblems.end();
|
|
}
|
|
|
|
// OFFSET: 0x0065DFB0
|
|
// FUNCTION: fn_05171
|
|
void CGuildMgr::MarkInvalidEmblem(std::string path) {
|
|
const std::string name = Basename(path);
|
|
if (this->m_invalidEmblems.find(name) == this->m_invalidEmblems.end()) {
|
|
this->m_invalidEmblems.insert(name);
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x0065E890
|
|
// FUNCTION: fn_05177
|
|
void CGuildMgr::StoreEmblem(const void* bytes, std::uint32_t size, std::uint32_t guild, std::uint32_t revision) {
|
|
const std::string directory = FormatOwnedString("%s\\_tmpEmblem\\", g_applicationDirectory);
|
|
const std::string filename = g_guildMgr->EmblemFilename(guild, revision);
|
|
uLongf compressedSize = compressBound(size);
|
|
Bytef* compressed = new Bytef[compressedSize];
|
|
|
|
if (compress(compressed, &compressedSize, static_cast<const Bytef*>(bytes), size) == Z_OK) {
|
|
if (_access(directory.c_str(), 0) != 0 && _mkdir(directory.c_str()) == -1) {
|
|
return;
|
|
}
|
|
|
|
{
|
|
std::stringstream stream;
|
|
stream << g_session.m_accountName << "_" << guild << "_*.ebm";
|
|
std::string path = stream.str();
|
|
std::list<std::string> names;
|
|
EnumerateFileNames(names, directory.c_str(), path.c_str());
|
|
|
|
for (const std::string& name : names) {
|
|
path = directory + name;
|
|
_chmod(path.c_str(), _S_IWRITE);
|
|
_unlink(path.c_str());
|
|
}
|
|
}
|
|
|
|
const std::string path = directory + filename;
|
|
FILE* file = std::fopen(path.c_str(), "wb");
|
|
|
|
if (file) {
|
|
std::fwrite(compressed, compressedSize, 1, file);
|
|
std::fclose(file);
|
|
}
|
|
} else {
|
|
g_guildMgr->MarkInvalidEmblem(filename);
|
|
}
|
|
|
|
delete compressed;
|
|
}
|
|
|
|
// OFFSET: 0x00D588E0
|
|
// FUNCTION: fn_21954
|
|
void __stdcall CGuildMgr::ReceiveEmblem(std::uint16_t state, std::uint32_t guild, std::uint32_t revision, const unsigned char* bytes, int size) {
|
|
CGuildMgr* manager = g_guildMgr;
|
|
switch (state) {
|
|
case 0:
|
|
manager->m_receiveGuildId = guild;
|
|
manager->m_receiveVersion = revision;
|
|
manager->m_receiveData.clear();
|
|
break;
|
|
case 1:
|
|
if (guild == manager->m_receiveGuildId && revision == manager->m_receiveVersion) {
|
|
manager->m_receiveData.insert(manager->m_receiveData.end(), bytes, bytes + size);
|
|
}
|
|
break;
|
|
case 2:
|
|
if (guild == manager->m_receiveGuildId && revision == manager->m_receiveVersion) {
|
|
StoreEmblem(manager->m_receiveData.data(), static_cast<std::uint32_t>(manager->m_receiveData.size()), guild, revision);
|
|
RefreshEmblem(guild);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x0065EE40
|
|
// FUNCTION: fn_05179
|
|
void CGuildMgr::UpdateEmblemRequests(
|
|
CEmblemDataMgr& emblems, std::uint32_t accountId, const std::string& accountName, const char* token16, CConnection& connection, CAsyncWorkMgr& manager
|
|
) {
|
|
this->m_reqBundle->Update();
|
|
}
|
|
|
|
// OFFSET: 0x0065EE50
|
|
// FUNCTION: fn_05180
|
|
void CGuildMgr::RefreshEmblem(std::uint32_t guild) {
|
|
if (g_modeMgr.GetGameMode()) {
|
|
static_cast<CGameMode*>(g_modeMgr.GetGameMode())->RefreshNotificationWindows(guild);
|
|
}
|
|
|
|
UIWindow* window = g_windowMgr.LookupWindow(WID_GUILDINFOMANAGEWND);
|
|
|
|
if (window) {
|
|
window->Invalidate();
|
|
}
|
|
}
|