Batch #16644 by ragnarok-clanker: no function's compiled code changes; checked with 593 compiled unit(s), including every includer of Source/Client/Application/Registry.h, Source/Client/Application/RegistryKey.h, Source/Client/Application/Timer.h, Source/Client/Mode/ModeFade.h, Source/Client/Mode/ModeFadeOut.h, Source/Client/Mode/ModeScreenshot.h, Source/Client/Replay/Replay.h, Source/Client/Replay/ReplayRecordOption.h, Source/Client/Session/Session.h, Source/Contents/Actors/ActorPickNode.h, Source/Contents/Effects/Core/RagEffectState.h, Source/Contents/Effects/Particles/Particle.h, Source/Contents/Movies/BinkMovie.h, Source/Contents/Sprites/SpriteLayerDrawing.h, Source/File/NFileLog.h, Source/Network/NIPAddr.h, Source/Network/Packets/ActorNamePacket.h, Source/Network/Packets/ClientKeepalive.h, Source/Network/Packets/ClientOptionPacket.h, Source/Network/Packets/ExecutableDigestPacket.h, Source/Network/Packets/GameTickPacket.h, Source/Render/DX7/QueuedDrawingDX7.h, Source/Render/DX7/RendererDX7.h, Source/Render/DX9/RenderSystemDX9.h, Source/Render/Device/DeviceSelection.h, Source/Render/Device/Direct3DErrors.h, Source/Render/Device/DisplayMode.h, Source/Render/Device/RenderAdapter.h, Source/Render/Device/RenderBackends.h, Source/Render/Drawing/ActionSpriteDrawing.h, Source/Render/Drawing/BitmapDrawing.h, Source/Render/Drawing/BlendColor.h, Source/Render/Drawing/SpriteGeometry.h, Source/Render/Drawing/TextureStageModes.h, Source/Render/Primitives/AuxiliarySubmission.h, Source/Render/Primitives/SpriteQuad.h, Source/Render/Primitives/TextureQuad.h, Source/Render/Projection/ScreenGeometry.h, Source/Render/Projection/ScreenRectangle.h, Source/Resource/Audio/BinkRuntime.h, Source/Resource/Bitmap/EmblemResource.h, Source/Resource/Bitmap/GifLzw.h, Source/Resource/Bitmap/GifResource.h, Source/Resource/Bitmap/PaletteResource.h, Source/Resource/Bitmap/SkinPalette.h, Source/Resource/Bitmap/TextureNames.h, Source/Resource/Effects/EZeffectResource.h, Source/Resource/Json/JsonCppLoader.h, Source/Resource/Models/RmaResource.h, Source/Resource/Sprites/ImfResource.h, Source/Resource/Xml/XmlNode.h, Source/Security/FileSignatureVerifier.h, Source/Security/ProcessSecurity.h, Source/UI/Achievement/UIAchWnd.h, Source/UI/AdventureGuide/UIAdventureGuide.h, Source/UI/Buttons/UIBalloonOpenBtn.h, Source/UI/Buttons/UIMiniBtnWnd.h, Source/UI/Buttons/UISlotBitmap.h, Source/UI/Buttons/UIStaticBitmap.h, Source/UI/Buttons/UIStaticItem.h, Source/UI/Buttons/UIWindowCallBtnWnd.h, Source/UI/CashEmotion/UICashEmotionSprBtn.h, Source/UI/CashShop/UIMileageWnd.h, Source/UI/CashShop/UIPayConfirmWnd.h, Source/UI/Chat/UIChatRoomWnd.h, Source/UI/Dialogs/UIAccountLimitedToolWnd.h, Source/UI/Dialogs/UICntWnd.h, Source/UI/Dialogs/UILoadingWnd.h, Source/UI/Dialogs/UIMessageBox.h, Source/UI/Dialogs/UIMessageBoxAutoreturn.h, Source/UI/Dialogs/UINormalMB.h, Source/UI/Dialogs/UINoteWnd.h, Source/UI/Dialogs/UINoticeWnd.h, Source/UI/Dialogs/UIRPImageWnd.h, Source/UI/Dialogs/UIRPImageWnd2.h, Source/UI/Dialogs/UITalkboxTrapInputWnd.h, Source/UI/Dialogs/UITransMenuWnd.h, Source/UI/Dialogs/UIVideoWnd.h, Source/UI/Dialogs/UIWordDisplayWnd.h, Source/UI/Edit/UIItemTagCtrl.h, Source/UI/Enchant/EnchantUI.h, Source/UI/Events/UICheckAttendanceWnd.h, Source/UI/Events/UIOpenRoulletteWnd.h, Source/UI/Events/UIRoulletteWnd.h, Source/UI/Exchange/UIExchangeUI.h, Source/UI/GameSettings/GameSettingsUI.h, Source/UI/GameSettings/UIBattleMsgOptionWnd.h, Source/UI/GameSettings/UIEscOptionWnd.h, Source/UI/GameSettings/UIHotKeyWnd.h, Source/UI/GameSettings/UIHotkeyGuideWnd.h, Source/UI/GameSettings/UIViewCameraInfoWnd.h, Source/UI/Gauges/UIBarGraph.h, Source/UI/Guild/UIEmblemWnd.h, Source/UI/Guild/UIGuildWnd.h, Source/UI/Items/UIChangeMaterialWnd.h, Source/UI/Items/UICollectionSystemWnd.h, Source/UI/Items/UIEquipmentPropertiesWnd.h, Source/UI/Items/UIGradeEnchantWnd.h, Source/UI/Items/UIIngredientInfoWnd.h, Source/UI/Items/UIItemBaseWnd.h, Source/UI/Items/UIItemCollectionWnd.h, Source/UI/Items/UIItemMoveInfo.h, Source/UI/Items/UIItemPurchaseWnd.h, Source/UI/Items/UIItemReformWnd.h, Source/UI/Items/UIItemSellWnd.h, Source/UI/Items/UIItemSellWnd2.h, Source/UI/Items/UIItemShopWnd.h, Source/UI/Items/UIItemShopWnd2.h, Source/UI/Items/UIItemStoreComboBox.h, Source/UI/Items/UIItemStoreFindWnd.h, Source/UI/Items/UIItemStoreSubWnd.h, Source/UI/Items/UIItemStoreWnd.h, Source/UI/Items/UIItemWnd.h, Source/UI/Items/UILapineScrollBar.h, Source/UI/Items/UILapineUpgradeBoxWnd.h, Source/UI/Items/UIMerchantItemLogWnd.h, Source/UI/Items/UIParaItemShopWnd.h, Source/UI/Items/UIPreviewEquipWnd.h, Source/UI/Items/UIRefiningWnd.h, Source/UI/Items/UISecondCostumeWnd.h, Source/UI/Items/UISelectCartWnd.h, Source/UI/Lists/UIComboBoxEx.h, Source/UI/Lists/UIScrollBarVariants.h, Source/UI/Lists/UIScrollWnd.h, Source/UI/Lists/UITagListBox.h, Source/UI/Login/FuncDrawWNDChar.h, Source/UI/Login/UIChangeNameWnd.h, Source/UI/Login/UIDescriptRace.h, Source/UI/Login/UIEmailAddressWnd.h, Source/UI/Login/UILoginOTPWnd.h, Source/UI/Login/UILoginWnd.h, Source/UI/Login/UIMakeCharWnd.h, Source/UI/Login/UINewMakeCharWnd.h, Source/UI/Login/UINewSelectCharWnd.h, Source/UI/Login/UIPasswordWnd.h, Source/UI/Login/UISecondPasswordEditWnd.h, Source/UI/Login/UISelCharForUServerWnd.h, Source/UI/Login/UISelectServerWnd.h, Source/UI/Login/UIWaitDBSaveWnd.h, Source/UI/Macro/UICaptchaPreviewWnd.h, Source/UI/Macro/UICaptchaRegisterWnd.h, Source/UI/Macro/UIMacroBlackListCheckWnd.h, Source/UI/Macro/UIMacroDetectorWnd.h, Source/UI/Macro/UIMacroReport.h, Source/UI/Macro/UIMacroUserInfoWnd.h, Source/UI/Monster/UIMonsterDisplayWnd.h, Source/UI/Monster/UIMonsterInfoWnd.h, Source/UI/Navigation/NavigationLink.h, Source/UI/Navigation/UIChooseWarpWnd.h, Source/UI/Navigation/UIListBoxNavi.h, Source/UI/Navigation/UIListBoxNaviSearch.h, Source/UI/Navigation/UIMemorialDunWnd.h, Source/UI/Navigation/UIMiniMapWnd.h, Source/UI/Navigation/UIMinimapZoomWnd.h, Source/UI/Navigation/UINavigationHelpWnd.h, Source/UI/Navigation/UINavigationWnd.h, Source/UI/Navigation/UIRoMapWnd.h, Source/UI/Navigation/UIScrollBarNavi.h, Source/UI/Navigation/UIShowWarpWnd.h, Source/UI/Party/MiniPartyGrid.h, Source/UI/Party/MiniPartyPlacement.h, Source/UI/Party/MiniPartyWndAreaMgr.h, Source/UI/Party/UIJobSlotButton.h, Source/UI/Party/UIPartyBookingHelpWnd.h, Source/UI/Party/UISeekPartyListWnd.h, Source/UI/Party/UISeekPartyMBWnd.h, Source/UI/Party/UISeekPartyWnd.h, Source/UI/ProbabilityTable/UIProbabilityTable.h, Source/UI/Quest/UINotifyQuestWnd.h, Source/UI/Quest/UIOngoingQuestInfo.h, Source/UI/Quest/UIRecommendedQuestInfo.h, Source/UI/Quest/UIRenewQuestUI.h, Source/UI/Quest/UIRenewQuestWnd.h, Source/UI/Replay/UIReplayButton.h, Source/UI/Replay/UIReplayControlWnd.h, Source/UI/Replay/UIReplayListBox.h, Source/UI/Replay/UIReplayRECControlWnd.h, Source/UI/Replay/UISelectReplayDataWnd.h, Source/UI/Repute/UIReputeWnd.h, Source/UI/Rodex/UIOpenMailBoxWnd.h, Source/UI/Rodex/UIRodexContentsWnd.h, Source/UI/Rodex/UIRodexInboxWnd.h, Source/UI/RuneSystem/UIRuneSystemWindows.h, Source/UI/RuneSystem/UIRuneSystemWnd.h, Source/UI/SelectPackageItemBox/SelectPackageItemBox.h, Source/UI/SelectPackageItemBox/UIPackageBoxNameList.h, Source/UI/Shop/PriceCommission.h, Source/UI/Shop/UIBank_NewWnd.h, Source/UI/Shop/UIBartermarketWnd.h, Source/UI/Shop/UIMerchantItemMyShopWnd.h, Source/UI/Shop/UIMerchantItemPurchaseWnd.h, Source/UI/Shop/UIMerchantItemShopWnd.h, Source/UI/Shop/UIMerchantItemWnd.h, Source/UI/Shop/UIMerchantMirrorItemWnd.h, Source/UI/Shop/UISerachStoreInfoWnd.h, Source/UI/Shop/UInCash_CallWnd.h, Source/UI/Skill/UIDebuffRemoveWnd.h, Source/UI/Skill/UIGraffiStrboxWnd.h, Source/UI/Skill/UINewSkillListWnd.h, Source/UI/SkillDelayInfo/SkillDelayInfo.h, Source/UI/Status/UIBasicInfoWnd.h, Source/UI/Status/UIHomunInfoWnd.h, Source/UI/Status/UIJobListWnd.h, Source/UI/Status/UIMerInfoWnd.h, Source/UI/Status/UIPetEvolutionWnd.h, Source/UI/Status/UIPetInfoWnd.h, Source/UI/Status/UIPetTamingDeceiveWnd.h, Source/UI/Status/UIRebirthWnd.h, Source/UI/StylingShop/UIStylingShopWnd.h, Source/UI/Text/TextTags.h, Source/UI/Text/UIBroadcastBalloon.h, Source/UI/Text/UIRoundBoxTooltipWnd.h, Source/UI/Window/FrameSkin.h, Source/UI/Window/UIBasicCtrl.h, Source/UI/Window/UIControl.h, Source/UI/Window/UIWindowMgr.inl, Source/Utility/Cipher/EncryptedName.h, Source/Utility/Hash/CRC32.h, Source/Utility/Hash/GGHash.h, Source/Utility/Hash/GGHashMgr.h, Source/Utility/Hash/Md5State.h, Source/Utility/Hash/SHA3.h, Source/Utility/Hash/XxHash3.h, Source/Utility/Text/GuidParse.h, Source/Utility/Text/Tokenizer.h, Source/Utility/Zlib.h, Source/ActorPickNode.h, Source/Client/ModeFade.h, Source/Client/ModeFadeOut.h, Source/Client/ModeScreenshot.h, Source/Client/Registry.h, Source/Client/Replay.h, Source/Client/ReplayRecordOption.h, Source/Client/Session.h, Source/Client/Timer.h, Source/Network/ActorNamePacket.h, Source/Network/ClientKeepalive.h, Source/Network/ClientOptionPacket.h, Source/Network/ExecutableDigestPacket.h, Source/Network/GameTickPacket.h, Source/Render/ActionSpriteDrawing.h, Source/Render/AuxiliarySubmission.h, Source/Render/BitmapDrawing.h, Source/Render/BlendColor.h, Source/Render/DeviceSelection.h, Source/Render/Direct3DErrors.h, Source/Render/DisplayMode.h, Source/Render/RenderAdapter.h, Source/Render/RenderBackends.h, Source/Render/RendererDX7.h, Source/Render/ScreenGeometry.h, Source/Render/ScreenRectangle.h, Source/Render/SpriteGeometry.h, Source/Render/SpriteQuad.h, Source/Render/TextureQuad.h, Source/Render/TextureStageModes.h, Source/Resource/BinkRuntime.h, Source/Resource/EZeffectResource.h, Source/Resource/EmblemResource.h, Source/Resource/GifLzw.h, Source/Resource/GifResource.h, Source/Resource/ImfResource.h, Source/Resource/PaletteResource.h, Source/Resource/RmaResource.h, Source/Resource/SkinPalette.h, Source/Resource/TextureNames.h, Source/Resource/XmlNode.h, Source/UI/Buttons/UICashEmotionSprBtn.h, Source/UI/Buttons/UIDescriptRace.h, Source/UI/Buttons/UIItemMoveInfo.h, Source/UI/Buttons/UIJobSlotButton.h, Source/UI/Buttons/UIReplayButton.h, Source/UI/Dialogs/UIChooseWarpWnd.h, Source/UI/Dialogs/UIEmailAddressWnd.h, Source/UI/Dialogs/UIGraffiStrboxWnd.h, Source/UI/Dialogs/UIMemorialDunWnd.h, Source/UI/Dialogs/UIMiniMapWnd.h, Source/UI/Dialogs/UIMinimapZoomWnd.h, Source/UI/Dialogs/UINotifyQuestWnd.h, Source/UI/Dialogs/UIPasswordWnd.h, Source/UI/Dialogs/UIPetTamingDeceiveWnd.h, Source/UI/Dialogs/UISecondPasswordEditWnd.h, Source/UI/Dialogs/UISelectCartWnd.h, Source/UI/Dialogs/UIWaitDBSaveWnd.h, Source/UI/FrameSkin.h, Source/UI/Item/UIEquipmentPropertiesWnd.h, Source/UI/Item/UIItemBaseWnd.h, Source/UI/Item/UIItemPurchaseWnd.h, Source/UI/Item/UIItemSellWnd.h, Source/UI/Item/UIItemSellWnd2.h, Source/UI/Item/UIItemShopWnd.h, Source/UI/Item/UIItemShopWnd2.h, Source/UI/Item/UIItemStoreFindWnd.h, Source/UI/Item/UIItemStoreSubWnd.h, Source/UI/Item/UIItemStoreWnd.h, Source/UI/Item/UIItemWnd.h, Source/UI/Item/UIMerchantItemLogWnd.h, Source/UI/Item/UIParaItemShopWnd.h, Source/UI/Lists/UIItemStoreComboBox.h, Source/UI/Lists/UIListBoxNavi.h, Source/UI/Lists/UIListBoxNaviSearch.h, Source/UI/Lists/UIPackageBoxNameList.h, Source/UI/Lists/UIReplayListBox.h, Source/UI/Lists/UIScrollBarNavi.h, Source/UI/MiniPartyGrid.h, Source/UI/MiniPartyPlacement.h, Source/UI/PriceCommission.h, Source/UI/Text/NavigationLink.h, Source/UI/Text/UIAchWnd.h, Source/UI/TextTags.h, Source/UI/UIBarGraph.h, Source/UI/UIBartermarketWnd.h, Source/UI/UIBasicCtrl.h, Source/UI/UIBroadcastBalloon.h, Source/UI/UICaptchaPreviewWnd.h, Source/UI/UICaptchaRegisterWnd.h, Source/UI/UIChangeMaterialWnd.h, Source/UI/UICheckAttendanceWnd.h, Source/UI/UIGradeEnchantWnd.h, Source/UI/UIHotkeyGuideWnd.h, Source/UI/UIIngredientInfoWnd.h, Source/UI/UIItemReformWnd.h, Source/UI/UILapineScrollBar.h, Source/UI/UILapineUpgradeBoxWnd.h, Source/UI/UIMacroBlackListCheckWnd.h, Source/UI/UIMacroDetectorWnd.h, Source/UI/UIMacroReport.h, Source/UI/UIMacroUserInfoWnd.h, Source/UI/UIPreviewEquipWnd.h, Source/UI/UIRefiningWnd.h, Source/UI/UIReputeWnd.h, Source/UI/UIRoundBoxTooltipWnd.h, Source/UI/UIScrollWnd.h, Source/UI/UISlotBitmap.h, Source/UI/UIStaticBitmap.h, Source/UI/UIStaticItem.h, Source/UI/Window/FuncDrawWNDChar.h, Source/UI/Window/MiniPartyWndAreaMgr.h, Source/UI/Window/UIAccountLimitedToolWnd.h, Source/UI/Window/UIBalloonOpenBtn.h, Source/UI/Window/UIBank_NewWnd.h, Source/UI/Window/UIBasicInfoWnd.h, Source/UI/Window/UIBattleMsgOptionWnd.h, Source/UI/Window/UIChangeNameWnd.h, Source/UI/Window/UIChatRoomWnd.h, Source/UI/Window/UICntWnd.h, Source/UI/Window/UICollectionSystemWnd.h, Source/UI/Window/UIDebuffRemoveWnd.h, Source/UI/Window/UIEmblemWnd.h, Source/UI/Window/UIEscOptionWnd.h, Source/UI/Window/UIHomunInfoWnd.h, Source/UI/Window/UIHotKeyWnd.h, Source/UI/Window/UIJobListWnd.h, Source/UI/Window/UILoginOTPWnd.h, Source/UI/Window/UILoginWnd.h, Source/UI/Window/UIMakeCharWnd.h, Source/UI/Window/UIMerInfoWnd.h, Source/UI/Window/UIMessageBox.h, Source/UI/Window/UIMessageBoxAutoreturn.h, Source/UI/Window/UIMileageWnd.h, Source/UI/Window/UIMiniBtnWnd.h, Source/UI/Window/UIMonsterDisplayWnd.h, Source/UI/Window/UIMonsterInfoWnd.h, Source/UI/Window/UINavigationHelpWnd.h, Source/UI/Window/UINavigationWnd.h, Source/UI/Window/UINewMakeCharWnd.h, Source/UI/Window/UINewSelectCharWnd.h, Source/UI/Window/UINewSkillListWnd.h, Source/UI/Window/UINormalMB.h, Source/UI/Window/UINoteWnd.h, Source/UI/Window/UINoticeWnd.h, Source/UI/Window/UIOpenMailBoxWnd.h, Source/UI/Window/UIOpenRoulletteWnd.h, Source/UI/Window/UIPartyBookingHelpWnd.h, Source/UI/Window/UIPayConfirmWnd.h, Source/UI/Window/UIPetEvolutionWnd.h, Source/UI/Window/UIPetInfoWnd.h, Source/UI/Window/UIRPImageWnd.h, Source/UI/Window/UIRPImageWnd2.h, Source/UI/Window/UIRebirthWnd.h, Source/UI/Window/UIReplayControlWnd.h, Source/UI/Window/UIReplayRECControlWnd.h, Source/UI/Window/UIRoMapWnd.h, Source/UI/Window/UIRodexContentsWnd.h, Source/UI/Window/UIRoulletteWnd.h, Source/UI/Window/UISecondCostumeWnd.h, Source/UI/Window/UISeekPartyListWnd.h, Source/UI/Window/UISeekPartyMBWnd.h, Source/UI/Window/UISeekPartyWnd.h, Source/UI/Window/UISelCharForUServerWnd.h, Source/UI/Window/UISelectReplayDataWnd.h, Source/UI/Window/UISelectServerWnd.h, Source/UI/Window/UISerachStoreInfoWnd.h, Source/UI/Window/UIShowWarpWnd.h, Source/UI/Window/UITalkboxTrapInputWnd.h, Source/UI/Window/UITransMenuWnd.h, Source/UI/Window/UIVideoWnd.h, Source/UI/Window/UIViewCameraInfoWnd.h, Source/UI/Window/UIWindowCallBtnWnd.h, Source/UI/Window/UIWordDisplayWnd.h, Source/Utility/CRC32.h, Source/Utility/Compression/Zlib.h, Source/Utility/EncryptedName.h, Source/Utility/FileSignatureVerifier.h, Source/Utility/GGHash.h, Source/Utility/GGHashMgr.h, Source/Utility/GuidParse.h, Source/Utility/JsonCppLoader.h, Source/Utility/Md5State.h, Source/Utility/NFileLog.h, Source/Utility/NIPAddr.h, Source/Utility/ProcessSecurity.h, Source/Utility/RegistryKey.h, Source/Utility/SHA3.h, Source/Utility/Tokenizer.h, Source/Utility/XxHash3.h. Adds to the build: Source/Client/Application/ClientOptions.cpp, Source/Client/Application/Registry.cpp, Source/Client/Application/RegistryKey.cpp, Source/Client/Application/Timer.cpp, Source/Client/Mode/EntityInit.cpp, Source/Client/Mode/ModeBaseEvents.cpp, Source/Client/Mode/ModeCursorDrawing.cpp, Source/Client/Mode/ModeFade.cpp, Source/Client/Mode/ModeFadeOut.cpp, Source/Client/Mode/ModeScreenshot.cpp, Source/Client/Mode/ModeTransitions.cpp, Source/Client/Replay/Replay.cpp, Source/Client/Replay/ReplayControl.cpp, Source/Client/Replay/ReplayPacketRecorder.cpp, Source/Client/Session/Session.cpp, Source/Client/Session/SessionAchievements.cpp, Source/Client/Session/SessionParty.cpp, Source/Client/Session/SessionPredicates.cpp, Source/Client/Session/SessionState.cpp, Source/Contents/Actors/ActorPickNode.cpp, Source/File/NFileLog.cpp, Source/Network/NIPAddr.cpp, Source/Network/Packets/ActorNamePacket.cpp, Source/Network/Packets/ClientKeepalive.cpp, Source/Network/Packets/ClientOptionPacket.cpp, Source/Network/Packets/ExecutableDigestPacket.cpp, Source/Network/Packets/GameTickPacket.cpp, Source/Render/DX7/AlphaQueuesDX7.cpp, Source/Render/DX7/AuxiliaryQueuesDX7.cpp, Source/Render/DX7/OpaqueQueuesDX7.cpp, Source/Render/DX7/RendererDX7.cpp, Source/Render/DX9/DeviceCapabilitiesDX9.cpp, Source/Render/Device/DeviceSelection.cpp, Source/Render/Device/Direct3DErrors.cpp, Source/Render/Device/DisplayMode.cpp, Source/Render/Device/RenderAdapter.cpp, Source/Render/Device/RenderBackends.cpp, Source/Render/Drawing/ActionSpriteDrawing.cpp, Source/Render/Drawing/BitmapDrawing.cpp, Source/Render/Drawing/BlendColor.cpp, Source/Render/Drawing/SpriteGeometry.cpp, Source/Render/Primitives/AlphaRectangle.cpp, Source/Render/Primitives/AuxiliarySubmission.cpp, Source/Render/Primitives/SpriteQuad.cpp, Source/Render/Primitives/TextureQuad.cpp, Source/Render/Primitives/UIRPDataDrawing.cpp, Source/Render/Projection/ScreenGeometry.cpp, Source/Render/Projection/ScreenRectangle.cpp, Source/Render/Projection/ViewportProjection.cpp, Source/Resource/Bitmap/EmblemResource.cpp, Source/Resource/Bitmap/GifLzw.cpp, Source/Resource/Bitmap/GifResource.cpp, Source/Resource/Bitmap/PaletteResource.cpp, Source/Resource/Bitmap/SkinPalette.cpp, Source/Resource/Bitmap/TextureNames.cpp, Source/Resource/Effects/EZeffectResource.cpp, Source/Resource/Json/JsonCppLoader.cpp, Source/Resource/Models/RmaResource.cpp, Source/Resource/Sprites/ImfLayerIndex.cpp, Source/Resource/Sprites/ImfResource.cpp, Source/Resource/Xml/XmlNode.cpp, Source/Resource/Xml/XmlParsing.cpp, Source/Security/FileSignatureVerifier.cpp, Source/Security/ProcessSecurity.cpp, Source/Security/UnknownA68.cpp, Source/UI/Achievement/UIAchWnd.cpp, Source/UI/Buttons/UIBalloonOpenBtn.cpp, Source/UI/Buttons/UIMiniBtnWnd.cpp, Source/UI/Buttons/UISlotBitmap.cpp, Source/UI/Buttons/UIStaticBitmap.cpp, Source/UI/Buttons/UIStaticItem.cpp, Source/UI/CashShop/UIMileageWnd.cpp, Source/UI/Chat/UIZeroChatWnd.cpp, Source/UI/Dialogs/UIAccountLimitedToolWnd.cpp, Source/UI/Dialogs/UILocaleTextWnd.cpp, Source/UI/Dialogs/UIMessageBox.cpp, Source/UI/Dialogs/UINormalMB.cpp, Source/UI/Dialogs/UINoteWnd.cpp, Source/UI/Dialogs/UINoticeWnd.cpp, Source/UI/Dialogs/UIRPImageWnd.cpp, Source/UI/Dialogs/UIRPImageWnd2.cpp, Source/UI/Dialogs/UITransMenuWnd.cpp, Source/UI/Dialogs/UIVideoWnd.cpp, Source/UI/Dialogs/UIWordDisplayWnd.cpp, Source/UI/Events/UICheckAttendanceWnd.cpp, Source/UI/Events/UIOpenRoulletteWnd.cpp, Source/UI/Events/UIRoulletteWnd.cpp, Source/UI/GameSettings/UIBattleMsgOptionWnd.cpp, Source/UI/GameSettings/UIEscOptionWnd.cpp, Source/UI/GameSettings/UIHotKeyWnd.cpp, Source/UI/GameSettings/UIHotkeyGuideWnd.cpp, Source/UI/GameSettings/UIViewCameraInfoWnd.cpp, Source/UI/Gauges/UIBarGraph.cpp, Source/UI/Guild/UIEmblemWnd.cpp, Source/UI/Items/UIChangeMaterialWnd.cpp, Source/UI/Items/UICollectionSystemWnd.cpp, Source/UI/Items/UIEquipmentPropertiesWnd.cpp, Source/UI/Items/UIGradeEnchantWnd.cpp, Source/UI/Items/UIItemMoveInfo.cpp, Source/UI/Items/UIItemReformWnd.cpp, Source/UI/Items/UIItemStoreComboBox.cpp, Source/UI/Items/UIItemStoreWnd.cpp, Source/UI/Items/UILapineBoxWnd.cpp, Source/UI/Items/UILapineScrollBar.cpp, Source/UI/Items/UILapineUpgradeBoxWnd.cpp, Source/UI/Items/UIMerchantItemLogWnd.cpp, Source/UI/Items/UIParaItemShopWnd.cpp, Source/UI/Items/UIPreviewEquipWnd.cpp, Source/UI/Items/UIRefiningWnd.cpp, Source/UI/Items/UISecondCostumeWnd.cpp, Source/UI/Lists/UIScrollWnd.cpp, Source/UI/Login/FuncDrawWNDChar.cpp, Source/UI/Login/UIChangeNameWnd.cpp, Source/UI/Login/UIDescriptRace.cpp, Source/UI/Login/UIEmailAddressWnd.cpp, Source/UI/Login/UILoginWnd.cpp, Source/UI/Login/UINewMakeCharWnd.cpp, Source/UI/Login/UINewSelectCharWnd.cpp, Source/UI/Login/UIPasswordWnd.cpp, Source/UI/Login/UISelCharForUServerWnd.cpp, Source/UI/Login/UIWaitDBSaveWnd.cpp, Source/UI/Macro/UICaptchaPreviewWnd.cpp, Source/UI/Macro/UICaptchaRegisterWnd.cpp, Source/UI/Macro/UIMacroBlackListCheckWnd.cpp, Source/UI/Macro/UIMacroDetectorWnd.cpp, Source/UI/Macro/UIMacroReport.cpp, Source/UI/Macro/UIMacroUserInfoWnd.cpp, Source/UI/Navigation/NavigationLink.cpp, Source/UI/Navigation/UIListBoxNavi.cpp, Source/UI/Navigation/UIMinimapZoomWnd.cpp, Source/UI/Navigation/UINavigationHelpWnd.cpp, Source/UI/Navigation/UINavigationWnd.cpp, Source/UI/Navigation/UIRoMapWnd.cpp, Source/UI/Navigation/UIScrollBarNavi.cpp, Source/UI/Navigation/UIShowWarpWnd.cpp, Source/UI/Party/MiniPartyGrid.cpp, Source/UI/Party/MiniPartyManager.cpp, Source/UI/Party/MiniPartyPlacement.cpp, Source/UI/Party/MiniPartyUsableArea.cpp, Source/UI/Party/UIJobSlotButton.cpp, Source/UI/Party/UIPartyBookingHelpWnd.cpp, Source/UI/Party/UISeekPartyListWnd.cpp, Source/UI/Party/UISeekPartyMBWnd.cpp, Source/UI/Party/UISeekPartyWnd.cpp, Source/UI/Repute/UIReputeWnd.cpp, Source/UI/Rodex/UIOpenMailBoxWnd.cpp, Source/UI/Rodex/UIRodexContentsWnd.cpp, Source/UI/SelectPackageItemBox/UIPackageBoxNameList.cpp, Source/UI/Shop/PriceCommission.cpp, Source/UI/Shop/UIBartermarketWnd.cpp, Source/UI/Shop/UISerachStoreInfoWnd.cpp, Source/UI/Skill/UIDebuffRemoveWnd.cpp, Source/UI/Skill/UIGraffiStrboxWnd.cpp, Source/UI/Skill/UINewSkillListWnd.cpp, Source/UI/Skill/UINewSkillListWndHitTest.cpp, Source/UI/Status/UIBasicInfoWnd.cpp, Source/UI/Status/UIJobListWnd.cpp, Source/UI/Status/UIPetEvolutionWnd.cpp, Source/UI/Status/UIRebirthWnd.cpp, Source/UI/Text/TextTagExtraction.cpp, Source/UI/Text/TextTagRegistry.cpp, Source/UI/Text/UIBroadcastBalloon.cpp, Source/UI/Text/UIRoundBoxTooltipWnd.cpp, Source/UI/Window/FrameSkin.cpp, Source/UI/Window/UIBasicCtrl.cpp, Source/UI/Window/WindowBackground.cpp, Source/UI/Window/WindowLowerBorder.cpp, Source/UI/Window/WindowOverlay.cpp, Source/UI/Window/WindowSprite.cpp, Source/UI/Window/WindowTitlebar.cpp, Source/Utility/BoolStubs.cpp, Source/Utility/Hash/CRC32.cpp, Source/Utility/Hash/GGHash.cpp, Source/Utility/Hash/GGHashMgr.cpp, Source/Utility/Hash/Md5State.cpp, Source/Utility/Hash/SHA3.cpp, Source/Utility/Hash/XxHash3.cpp, Source/Utility/Lexicon/LexiconTrie.cpp, Source/Utility/Text/GuidParse.cpp, Source/Utility/Text/Tokenizer.cpp Deletes: Source/ActorPickNode.cpp, Source/ActorPickNode.h, Source/Archive/UnknownA68.cpp, Source/Client/ClientOptions.cpp, Source/Client/ModeBaseEvents.cpp, Source/Client/ModeCursorDrawing.cpp, Source/Client/ModeFade.cpp, Source/Client/ModeFade.h, Source/Client/ModeFadeOut.cpp, Source/Client/ModeFadeOut.h, Source/Client/ModeScreenshot.cpp, Source/Client/ModeScreenshot.h, Source/Client/ModeTransitions.cpp, Source/Client/Registry.cpp, Source/Client/Registry.h, Source/Client/Replay.cpp, Source/Client/Replay.h, Source/Client/ReplayControl.cpp, Source/Client/ReplayPacketRecorder.cpp, Source/Client/ReplayRecordOption.h, Source/Client/Session.cpp, Source/Client/Session.h, Source/Client/SessionAchievements.cpp, Source/Client/SessionParty.cpp, Source/Client/SessionPredicates.cpp, Source/Client/SessionState.cpp, Source/Client/Timer.cpp, Source/Client/Timer.h, Source/EntityInit.cpp, Source/Interface/BoolStubs.cpp, Source/LexiconTrie.cpp, Source/Network/ActorNamePacket.cpp, Source/Network/ActorNamePacket.h, Source/Network/ClientKeepalive.cpp, Source/Network/ClientKeepalive.h, Source/Network/ClientOptionPacket.cpp, Source/Network/ClientOptionPacket.h, Source/Network/ExecutableDigestPacket.cpp, Source/Network/ExecutableDigestPacket.h, Source/Network/GameTickPacket.cpp, Source/Network/GameTickPacket.h, Source/Render/ActionSpriteDrawing.cpp, Source/Render/ActionSpriteDrawing.h, Source/Render/AlphaQueuesDX7.cpp, Source/Render/AlphaRectangle.cpp, Source/Render/AuxiliaryQueuesDX7.cpp, Source/Render/AuxiliarySubmission.cpp, Source/Render/AuxiliarySubmission.h, Source/Render/BitmapDrawing.cpp, Source/Render/BitmapDrawing.h, Source/Render/BlendColor.cpp, Source/Render/BlendColor.h, Source/Render/DeviceCapabilitiesDX9.cpp, Source/Render/DeviceSelection.cpp, Source/Render/DeviceSelection.h, Source/Render/Direct3DErrors.cpp, Source/Render/Direct3DErrors.h, Source/Render/DisplayMode.cpp, Source/Render/DisplayMode.h, Source/Render/OpaqueQueuesDX7.cpp, Source/Render/RenderAdapter.cpp, Source/Render/RenderAdapter.h, Source/Render/RenderBackends.cpp, Source/Render/RenderBackends.h, Source/Render/RendererDX7.cpp, Source/Render/RendererDX7.h, Source/Render/ScreenGeometry.cpp, Source/Render/ScreenGeometry.h, Source/Render/ScreenRectangle.cpp, Source/Render/ScreenRectangle.h, Source/Render/SpriteGeometry.cpp, Source/Render/SpriteGeometry.h, Source/Render/SpriteQuad.cpp, Source/Render/SpriteQuad.h, Source/Render/TextureQuad.cpp, Source/Render/TextureQuad.h, Source/Render/TextureStageModes.h, Source/Render/UIRPDataDrawing.cpp, Source/Render/ViewportProjection.cpp, Source/Resource/BinkRuntime.h, Source/Resource/EZeffectResource.cpp, Source/Resource/EZeffectResource.h, Source/Resource/EmblemResource.cpp, Source/Resource/EmblemResource.h, Source/Resource/GifLzw.cpp, Source/Resource/GifLzw.h, Source/Resource/GifResource.cpp, Source/Resource/GifResource.h, Source/Resource/ImfLayerIndex.cpp, Source/Resource/ImfResource.cpp, Source/Resource/ImfResource.h, Source/Resource/PaletteResource.cpp, Source/Resource/PaletteResource.h, Source/Resource/RmaResource.cpp, Source/Resource/RmaResource.h, Source/Resource/SkinPalette.cpp, Source/Resource/SkinPalette.h, Source/Resource/TextureNames.cpp, Source/Resource/TextureNames.h, Source/Resource/XmlNode.cpp, Source/Resource/XmlNode.h, Source/Resource/XmlParsing.cpp, Source/UI/Buttons/UICashEmotionSprBtn.h, Source/UI/Buttons/UIDescriptRace.cpp, Source/UI/Buttons/UIDescriptRace.h, Source/UI/Buttons/UIItemMoveInfo.cpp, Source/UI/Buttons/UIItemMoveInfo.h, Source/UI/Buttons/UIJobSlotButton.cpp, Source/UI/Buttons/UIJobSlotButton.h, Source/UI/Buttons/UIReplayButton.h, Source/UI/Dialogs/UIChooseWarpWnd.h, Source/UI/Dialogs/UIEmailAddressWnd.cpp, Source/UI/Dialogs/UIEmailAddressWnd.h, Source/UI/Dialogs/UIGraffiStrboxWnd.cpp, Source/UI/Dialogs/UIGraffiStrboxWnd.h, Source/UI/Dialogs/UIMemorialDunWnd.h, Source/UI/Dialogs/UIMiniMapWnd.h, Source/UI/Dialogs/UIMinimapZoomWnd.cpp, Source/UI/Dialogs/UIMinimapZoomWnd.h, Source/UI/Dialogs/UINotifyQuestWnd.h, Source/UI/Dialogs/UIPasswordWnd.cpp, Source/UI/Dialogs/UIPasswordWnd.h, Source/UI/Dialogs/UIPetTamingDeceiveWnd.h, Source/UI/Dialogs/UISecondPasswordEditWnd.h, Source/UI/Dialogs/UISelectCartWnd.h, Source/UI/Dialogs/UIWaitDBSaveWnd.cpp, Source/UI/Dialogs/UIWaitDBSaveWnd.h, Source/UI/FrameSkin.cpp, Source/UI/FrameSkin.h, Source/UI/Item/UIEquipmentPropertiesWnd.cpp, Source/UI/Item/UIEquipmentPropertiesWnd.h, Source/UI/Item/UIItemBaseWnd.h, Source/UI/Item/UIItemPurchaseWnd.h, Source/UI/Item/UIItemSellWnd.h, Source/UI/Item/UIItemSellWnd2.h, Source/UI/Item/UIItemShopWnd.h, Source/UI/Item/UIItemShopWnd2.h, Source/UI/Item/UIItemStoreFindWnd.h, Source/UI/Item/UIItemStoreSubWnd.h, Source/UI/Item/UIItemStoreWnd.cpp, Source/UI/Item/UIItemStoreWnd.h, Source/UI/Item/UIItemWnd.h, Source/UI/Item/UIMerchantItemLogWnd.cpp, Source/UI/Item/UIMerchantItemLogWnd.h, Source/UI/Item/UIParaItemShopWnd.cpp, Source/UI/Item/UIParaItemShopWnd.h, Source/UI/Lists/UIItemStoreComboBox.cpp, Source/UI/Lists/UIItemStoreComboBox.h, Source/UI/Lists/UIListBoxNavi.cpp, Source/UI/Lists/UIListBoxNavi.h, Source/UI/Lists/UIListBoxNaviSearch.h, Source/UI/Lists/UIPackageBoxNameList.cpp, Source/UI/Lists/UIPackageBoxNameList.h, Source/UI/Lists/UIReplayListBox.h, Source/UI/Lists/UIScrollBarNavi.cpp, Source/UI/Lists/UIScrollBarNavi.h, Source/UI/MiniPartyGrid.cpp, Source/UI/MiniPartyGrid.h, Source/UI/MiniPartyManager.cpp, Source/UI/MiniPartyPlacement.cpp, Source/UI/MiniPartyPlacement.h, Source/UI/MiniPartyUsableArea.cpp, Source/UI/PriceCommission.cpp, Source/UI/PriceCommission.h, Source/UI/Text/NavigationLink.cpp, Source/UI/Text/NavigationLink.h, Source/UI/Text/UIAchWnd.cpp, Source/UI/Text/UIAchWnd.h, Source/UI/TextTagExtraction.cpp, Source/UI/TextTagRegistry.cpp, Source/UI/TextTags.h, Source/UI/UIBarGraph.cpp, Source/UI/UIBarGraph.h, Source/UI/UIBartermarketWnd.cpp, Source/UI/UIBartermarketWnd.h, Source/UI/UIBasicCtrl.cpp, Source/UI/UIBasicCtrl.h, Source/UI/UIBroadcastBalloon.cpp, Source/UI/UIBroadcastBalloon.h, Source/UI/UICaptchaPreviewWnd.cpp, Source/UI/UICaptchaPreviewWnd.h, Source/UI/UICaptchaRegisterWnd.cpp, Source/UI/UICaptchaRegisterWnd.h, Source/UI/UIChangeMaterialWnd.cpp, Source/UI/UIChangeMaterialWnd.h, Source/UI/UICheckAttendanceWnd.cpp, Source/UI/UICheckAttendanceWnd.h, Source/UI/UIGradeEnchantWnd.cpp, Source/UI/UIGradeEnchantWnd.h, Source/UI/UIHotkeyGuideWnd.cpp, Source/UI/UIHotkeyGuideWnd.h, Source/UI/UIIngredientInfoWnd.h, Source/UI/UIItemReformWnd.cpp, Source/UI/UIItemReformWnd.h, Source/UI/UILapineBoxWnd.cpp, Source/UI/UILapineScrollBar.cpp, Source/UI/UILapineScrollBar.h, Source/UI/UILapineUpgradeBoxWnd.cpp, Source/UI/UILapineUpgradeBoxWnd.h, Source/UI/UIMacroBlackListCheckWnd.cpp, Source/UI/UIMacroBlackListCheckWnd.h, Source/UI/UIMacroDetectorWnd.cpp, Source/UI/UIMacroDetectorWnd.h, Source/UI/UIMacroReport.cpp, Source/UI/UIMacroReport.h, Source/UI/UIMacroUserInfoWnd.cpp, Source/UI/UIMacroUserInfoWnd.h, Source/UI/UIPreviewEquipWnd.cpp, Source/UI/UIPreviewEquipWnd.h, Source/UI/UIRefiningWnd.cpp, Source/UI/UIRefiningWnd.h, Source/UI/UIReputeWnd.cpp, Source/UI/UIReputeWnd.h, Source/UI/UIRoundBoxTooltipWnd.cpp, Source/UI/UIRoundBoxTooltipWnd.h, Source/UI/UIScrollWnd.cpp, Source/UI/UIScrollWnd.h, Source/UI/UISlotBitmap.cpp, Source/UI/UISlotBitmap.h, Source/UI/UIStaticBitmap.cpp, Source/UI/UIStaticBitmap.h, Source/UI/UIStaticItem.cpp, Source/UI/UIStaticItem.h, Source/UI/Window/FuncDrawWNDChar.cpp, Source/UI/Window/FuncDrawWNDChar.h, Source/UI/Window/MiniPartyWndAreaMgr.h, Source/UI/Window/UIAccountLimitedToolWnd.cpp, Source/UI/Window/UIAccountLimitedToolWnd.h, Source/UI/Window/UIBalloonOpenBtn.cpp, Source/UI/Window/UIBalloonOpenBtn.h, Source/UI/Window/UIBank_NewWnd.h, Source/UI/Window/UIBasicInfoWnd.cpp, Source/UI/Window/UIBasicInfoWnd.h, Source/UI/Window/UIBattleMsgOptionWnd.cpp, Source/UI/Window/UIBattleMsgOptionWnd.h, Source/UI/Window/UIChangeNameWnd.cpp, Source/UI/Window/UIChangeNameWnd.h, Source/UI/Window/UIChatRoomWnd.h, Source/UI/Window/UICntWnd.h, Source/UI/Window/UICollectionSystemWnd.cpp, Source/UI/Window/UICollectionSystemWnd.h, Source/UI/Window/UIDebuffRemoveWnd.cpp, Source/UI/Window/UIDebuffRemoveWnd.h, Source/UI/Window/UIEmblemWnd.cpp, Source/UI/Window/UIEmblemWnd.h, Source/UI/Window/UIEscOptionWnd.cpp, Source/UI/Window/UIEscOptionWnd.h, Source/UI/Window/UIHomunInfoWnd.h, Source/UI/Window/UIHotKeyWnd.cpp, Source/UI/Window/UIHotKeyWnd.h, Source/UI/Window/UIJobListWnd.cpp, Source/UI/Window/UIJobListWnd.h, Source/UI/Window/UILocaleTextWnd.cpp, Source/UI/Window/UILoginOTPWnd.h, Source/UI/Window/UILoginWnd.cpp, Source/UI/Window/UILoginWnd.h, Source/UI/Window/UIMakeCharWnd.h, Source/UI/Window/UIMerInfoWnd.h, Source/UI/Window/UIMessageBox.cpp, Source/UI/Window/UIMessageBox.h, Source/UI/Window/UIMessageBoxAutoreturn.h, Source/UI/Window/UIMileageWnd.cpp, Source/UI/Window/UIMileageWnd.h, Source/UI/Window/UIMiniBtnWnd.cpp, Source/UI/Window/UIMiniBtnWnd.h, Source/UI/Window/UIMonsterDisplayWnd.h, Source/UI/Window/UIMonsterInfoWnd.h, Source/UI/Window/UINavigationHelpWnd.cpp, Source/UI/Window/UINavigationHelpWnd.h, Source/UI/Window/UINavigationWnd.cpp, Source/UI/Window/UINavigationWnd.h, Source/UI/Window/UINewMakeCharWnd.cpp, Source/UI/Window/UINewMakeCharWnd.h, Source/UI/Window/UINewSelectCharWnd.cpp, Source/UI/Window/UINewSelectCharWnd.h, Source/UI/Window/UINewSkillListWnd.cpp, Source/UI/Window/UINewSkillListWnd.h, Source/UI/Window/UINewSkillListWndHitTest.cpp, Source/UI/Window/UINormalMB.cpp, Source/UI/Window/UINormalMB.h, Source/UI/Window/UINoteWnd.cpp, Source/UI/Window/UINoteWnd.h, Source/UI/Window/UINoticeWnd.cpp, Source/UI/Window/UINoticeWnd.h, Source/UI/Window/UIOpenMailBoxWnd.cpp, Source/UI/Window/UIOpenMailBoxWnd.h, Source/UI/Window/UIOpenRoulletteWnd.cpp, Source/UI/Window/UIOpenRoulletteWnd.h, Source/UI/Window/UIPartyBookingHelpWnd.cpp, Source/UI/Window/UIPartyBookingHelpWnd.h, Source/UI/Window/UIPayConfirmWnd.h, Source/UI/Window/UIPetEvolutionWnd.cpp, Source/UI/Window/UIPetEvolutionWnd.h, Source/UI/Window/UIPetInfoWnd.h, Source/UI/Window/UIRPImageWnd.cpp, Source/UI/Window/UIRPImageWnd.h, Source/UI/Window/UIRPImageWnd2.cpp, Source/UI/Window/UIRPImageWnd2.h, Source/UI/Window/UIRebirthWnd.cpp, Source/UI/Window/UIRebirthWnd.h, Source/UI/Window/UIReplayControlWnd.h, Source/UI/Window/UIReplayRECControlWnd.h, Source/UI/Window/UIRoMapWnd.cpp, Source/UI/Window/UIRoMapWnd.h, Source/UI/Window/UIRodexContentsWnd.cpp, Source/UI/Window/UIRodexContentsWnd.h, Source/UI/Window/UIRoulletteWnd.cpp, Source/UI/Window/UIRoulletteWnd.h, Source/UI/Window/UISecondCostumeWnd.cpp, Source/UI/Window/UISecondCostumeWnd.h, Source/UI/Window/UISeekPartyListWnd.cpp, Source/UI/Window/UISeekPartyListWnd.h, Source/UI/Window/UISeekPartyMBWnd.cpp, Source/UI/Window/UISeekPartyMBWnd.h, Source/UI/Window/UISeekPartyWnd.cpp, Source/UI/Window/UISeekPartyWnd.h, Source/UI/Window/UISelCharForUServerWnd.cpp, Source/UI/Window/UISelCharForUServerWnd.h, Source/UI/Window/UISelectReplayDataWnd.h, Source/UI/Window/UISelectServerWnd.h, Source/UI/Window/UISerachStoreInfoWnd.cpp, Source/UI/Window/UISerachStoreInfoWnd.h, Source/UI/Window/UIShowWarpWnd.cpp, Source/UI/Window/UIShowWarpWnd.h, Source/UI/Window/UITalkboxTrapInputWnd.h, Source/UI/Window/UITransMenuWnd.cpp, Source/UI/Window/UITransMenuWnd.h, Source/UI/Window/UIVideoWnd.cpp, Source/UI/Window/UIVideoWnd.h, Source/UI/Window/UIViewCameraInfoWnd.cpp, Source/UI/Window/UIViewCameraInfoWnd.h, Source/UI/Window/UIWindowCallBtnWnd.h, Source/UI/Window/UIWordDisplayWnd.cpp, Source/UI/Window/UIWordDisplayWnd.h, Source/UI/Window/UIZeroChatWnd.cpp, Source/UI/WindowBackground.cpp, Source/UI/WindowLowerBorder.cpp, Source/UI/WindowOverlay.cpp, Source/UI/WindowSprite.cpp, Source/UI/WindowTitlebar.cpp, Source/Utility/CRC32.cpp, Source/Utility/CRC32.h, Source/Utility/Compression/Zlib.h, Source/Utility/EncryptedName.h, Source/Utility/FileSignatureVerifier.cpp, Source/Utility/FileSignatureVerifier.h, Source/Utility/GGHash.cpp, Source/Utility/GGHash.h, Source/Utility/GGHashMgr.cpp, Source/Utility/GGHashMgr.h, Source/Utility/GuidParse.cpp, Source/Utility/GuidParse.h, Source/Utility/JsonCppLoader.cpp, Source/Utility/JsonCppLoader.h, Source/Utility/Md5State.cpp, Source/Utility/Md5State.h, Source/Utility/NFileLog.cpp, Source/Utility/NFileLog.h, Source/Utility/NIPAddr.cpp, Source/Utility/NIPAddr.h, Source/Utility/ProcessSecurity.cpp, Source/Utility/ProcessSecurity.h, Source/Utility/RegistryKey.cpp, Source/Utility/RegistryKey.h, Source/Utility/SHA3.cpp, Source/Utility/SHA3.h, Source/Utility/Tokenizer.cpp, Source/Utility/Tokenizer.h, Source/Utility/XxHash3.cpp, Source/Utility/XxHash3.h
945 lines
29 KiB
C++
945 lines
29 KiB
C++
#include "UI/Window/UIEnums.h"
|
|
#include "UI/Window/WindowId.h"
|
|
#include "Client/Application/ApplicationWindow.h"
|
|
#include "Client/Session/Session.h"
|
|
#include "Contents/Achievement/AchievementMgr.h"
|
|
#include "Contents/Configuration/ServiceConfiguration.h"
|
|
#include "Contents/Map/MapInfoMgr.h"
|
|
#include "Contents/Navigation/NavigationManager.h"
|
|
#include "File/CommonObject.h"
|
|
#include "File/File.h"
|
|
#include "Resource/Bitmap/BitmapResource.h"
|
|
#include "Script/LuaScript.h"
|
|
#include "UI/Window/UIWindow.h"
|
|
#include "UI/Window/UIWindowMgr.h"
|
|
#include "Utility/Cipher/XorBytes.h"
|
|
#include "Utility/Text/FormatString.h"
|
|
|
|
#include <algorithm>
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
#include <cstdio>
|
|
#include <cstring>
|
|
#include <timeapi.h>
|
|
#include <windows.h>
|
|
#include "Utility/StdStringCompare.h"
|
|
|
|
extern template bool std::_Traits_equal<std::char_traits<char>>(const char*, std::size_t, const char*, std::size_t) noexcept;
|
|
|
|
// GLOBAL: gl_24705
|
|
int g_serviceMode;
|
|
|
|
namespace {
|
|
|
|
template <std::size_t Length, std::uint64_t Key>
|
|
class EncryptedName {
|
|
public:
|
|
// INLINED
|
|
explicit EncryptedName(const char (&source)[Length]) : m_encrypted(true) {
|
|
for (std::uint64_t index = 0; index < Length; ++index) {
|
|
this->m_text[index] = source[index];
|
|
}
|
|
}
|
|
|
|
~EncryptedName() {
|
|
for (std::uint64_t index = 0; index < Length; ++index) {
|
|
this->m_text[index] = 0;
|
|
}
|
|
}
|
|
|
|
const char* Text() {
|
|
if (this->m_encrypted) {
|
|
utility::XorBytes(this->m_text, Length, Key);
|
|
this->m_encrypted = false;
|
|
}
|
|
|
|
return reinterpret_cast<const char*>(this->m_text);
|
|
}
|
|
|
|
private:
|
|
std::uint8_t m_text[Length];
|
|
bool m_encrypted;
|
|
};
|
|
|
|
// INLINED
|
|
template <std::uint64_t Key, std::size_t Length>
|
|
const char* DecryptName(const char (&source)[Length]) {
|
|
thread_local EncryptedName<Length, Key> name(source);
|
|
return name.Text();
|
|
}
|
|
|
|
}
|
|
|
|
struct NaviUnknownBlock {
|
|
/* 0000 */ int padding_0000;
|
|
/* 0004 */ int padding_0004;
|
|
/* 0008 */ int padding_0008;
|
|
/* 000C */ int padding_000C;
|
|
/* 0010 */ int padding_0010;
|
|
/* 0014 */ int padding_0014;
|
|
/* 0018 */ int padding_0018;
|
|
/* 001C */ int padding_001C;
|
|
/* 0020 */ int padding_0020;
|
|
|
|
NaviUnknownBlock();
|
|
};
|
|
|
|
// OFFSET: 0x00B8C870
|
|
// FUNCTION: fn_19426
|
|
CNavi_Object::CNavi_Object()
|
|
: cellX(0), cellY(0), job(0), sex(0), bodyPalette(0), head(0), headPalette(0),
|
|
accessory0(0), accessory1(0), accessory2(0), robe(0) {
|
|
this->id = -1;
|
|
this->type = 101;
|
|
this->index = 0;
|
|
this->cellX = 0;
|
|
this->cellY = 0;
|
|
this->info = nullptr;
|
|
}
|
|
|
|
// OFFSET: 0x00B8C990
|
|
// FUNCTION: fn_19427
|
|
NaviUnknownBlock::NaviUnknownBlock()
|
|
: padding_0000(0), padding_0004(0), padding_0008(0), padding_000C(0), padding_0010(0), padding_0014(0), padding_0018(0), padding_001C(0),
|
|
padding_0020(0) {
|
|
}
|
|
|
|
// OFFSET: 0x00B8C710
|
|
// FUNCTION: fn_19425
|
|
CNavi_Object::CNavi_Object(int type, int index, const char* name, const char* title, int cellX, int cellY, CNaviInfo* info)
|
|
: cellX(0), cellY(0), job(0), sex(0), bodyPalette(0), head(0), headPalette(0), accessory0(0),
|
|
accessory1(0), accessory2(0), robe(0) {
|
|
this->type = type;
|
|
this->id = -1;
|
|
this->index = index;
|
|
if (name) {
|
|
this->name = name;
|
|
}
|
|
if (title) {
|
|
this->title = title;
|
|
}
|
|
this->cellX = cellX;
|
|
this->cellY = cellY;
|
|
this->info = info;
|
|
}
|
|
|
|
// OFFSET: 0x00B8C520
|
|
// FUNCTION: fn_19423
|
|
CNavi_Link::CNavi_Link() : linkedCellX(0), linkedCellY(0) {
|
|
this->type = 200;
|
|
this->linkedInfo = nullptr;
|
|
this->linkedCellX = 0;
|
|
this->linkedCellY = 0;
|
|
this->depth = -1;
|
|
}
|
|
|
|
// OFFSET: 0x00B8C2B0
|
|
// FUNCTION: fn_19422
|
|
CNavi_Link::CNavi_Link(
|
|
int type, int index, const char* name, const char* title, int cellX, int cellY, CNaviInfo* info, CNaviInfo* linkedInfo, int linkedCellX, int linkedCellY
|
|
)
|
|
: linkedCellX(0), linkedCellY(0) {
|
|
this->type = type;
|
|
this->index = index;
|
|
if (name) {
|
|
this->name = name;
|
|
}
|
|
if (title) {
|
|
this->title = title;
|
|
}
|
|
this->cellX = cellX;
|
|
this->cellY = cellY;
|
|
this->info = info;
|
|
this->linkedInfo = linkedInfo;
|
|
this->linkedCellX = linkedCellX;
|
|
this->linkedCellY = linkedCellY;
|
|
this->depth = 0;
|
|
}
|
|
|
|
// OFFSET: 0x00B8C5E0
|
|
// FUNCTION: fn_19424
|
|
CNaviInfo::CNaviInfo(int index, const char* name, const char* title, int cellX, int cellY, int type) {
|
|
this->index = index;
|
|
this->type = type;
|
|
this->name = name;
|
|
this->title = title;
|
|
this->cellX = cellX;
|
|
this->cellY = cellY;
|
|
this->visited = false;
|
|
}
|
|
|
|
// OFFSET: 0x00B886A0
|
|
// FUNCTION: fn_19372
|
|
bool CNaviData::AddDestination(CNaviInfo* info) {
|
|
CNaviInfo* entry = info;
|
|
if (!entry) {
|
|
return false;
|
|
}
|
|
this->destinations.push_back(entry);
|
|
return true;
|
|
}
|
|
|
|
// OFFSET: 0x00B886E0
|
|
// FUNCTION: fn_19373
|
|
bool CNaviData::AddObject(CNavi_Link* link) {
|
|
std::vector<CNavi_Link*>& objects = this->objects;
|
|
CNavi_Link* entry = link;
|
|
if (!entry) {
|
|
return false;
|
|
}
|
|
objects.push_back(entry);
|
|
return true;
|
|
}
|
|
|
|
// OFFSET: 0x00B9E580
|
|
// FUNCTION: fn_19629
|
|
bool CNavigationManager::LoadScript(LuaScript* script) {
|
|
char message[260];
|
|
std::memset(message, 0, sizeof(message));
|
|
this->data.ClearAll();
|
|
|
|
int type;
|
|
int cellX = 0;
|
|
int cellY = 0;
|
|
int linkedX = 0;
|
|
int linkedY = 0;
|
|
int targetId = -1;
|
|
int cost = 0;
|
|
for (int index = 1; index < 9999; ++index) {
|
|
const char* name = nullptr;
|
|
const char* title = nullptr;
|
|
if (!script->Call("queryNavi_MapInfo", "d>ssddd", index, &name, &title, &type, &cellX, &cellY)) {
|
|
std::sprintf(message, "Map 루아 읽기 실패 %d", index);
|
|
MessageBoxA(hWnd, message, "Error", 0);
|
|
break;
|
|
}
|
|
if (!name) {
|
|
break;
|
|
}
|
|
CNaviInfo* info = new CNaviInfo(static_cast<int>(this->data.destinations.size()), name, title, cellX, cellY, type);
|
|
if (info) {
|
|
this->data.AddDestination(info);
|
|
}
|
|
}
|
|
|
|
for (int index = 1; index < 99999; ++index) {
|
|
int objectType = 100;
|
|
const char* title = nullptr;
|
|
const char* name = nullptr;
|
|
const char* mapName = nullptr;
|
|
int objectX = 0;
|
|
int objectY = 0;
|
|
int objectIndex = 0;
|
|
int id;
|
|
if (!script->Call("queryNavi_NpcInfo", "d>sdddssdd", index, &mapName, &id, &objectType, &objectIndex, &name, &title, &objectX, &objectY)) {
|
|
std::sprintf(message, "Npc 루아 읽기 실패 %d", index);
|
|
MessageBoxA(hWnd, message, "Error", 0);
|
|
break;
|
|
}
|
|
if (!mapName) {
|
|
break;
|
|
}
|
|
CNaviInfo* info = this->FindObject(mapName);
|
|
if (info) {
|
|
CNavi_Object* npc = new CNavi_Object(objectType, objectIndex, name, title, objectX, objectY, info);
|
|
npc->SetId(id);
|
|
info->AddNpc(npc);
|
|
}
|
|
}
|
|
|
|
for (int index = 1; index < 99999; ++index) {
|
|
int objectType = 100;
|
|
const char* title = nullptr;
|
|
const char* name = nullptr;
|
|
const char* mapName = nullptr;
|
|
int objectX = 0;
|
|
int objectY = 0;
|
|
int objectIndex = 0;
|
|
int id;
|
|
if (!script->Call("queryNavi_MobInfo", "d>sdddssdd", index, &mapName, &id, &objectType, &objectIndex, &name, &title, &objectX, &objectY)) {
|
|
std::sprintf(message, "몬스터 루아 읽기 실패 %d", index);
|
|
MessageBoxA(hWnd, message, "Error", 0);
|
|
break;
|
|
}
|
|
if (!mapName) {
|
|
break;
|
|
}
|
|
CNaviInfo* info = this->FindObject(mapName);
|
|
if (info) {
|
|
CNavi_Object* mob = new CNavi_Object(objectType, objectIndex, name, title, objectX, objectY, info);
|
|
mob->SetId(id);
|
|
info->AddMob(mob);
|
|
}
|
|
}
|
|
|
|
for (int index = 1; index < 99999; ++index) {
|
|
int objectType = 100;
|
|
const char* linkedMap = nullptr;
|
|
const char* title = nullptr;
|
|
const char* name = nullptr;
|
|
const char* mapName = nullptr;
|
|
linkedX = 0;
|
|
linkedY = 0;
|
|
int objectX = 0;
|
|
int objectY = 0;
|
|
int objectIndex = 0;
|
|
int id;
|
|
if (!script->Call(
|
|
"queryNavi_LinkInfo", "d>sdddssddsdd", index, &mapName, &id, &objectType, &objectIndex, &name, &title, &objectX, &objectY, &linkedMap, &linkedX,
|
|
&linkedY
|
|
)) {
|
|
std::sprintf(message, "Link 루아 읽기 실패 %d", index);
|
|
MessageBoxA(hWnd, message, "Error", 0);
|
|
break;
|
|
}
|
|
if (!mapName) {
|
|
break;
|
|
}
|
|
CNaviInfo* info = this->FindObject(mapName);
|
|
CNaviInfo* linked = this->FindObject(linkedMap);
|
|
if (info && linked) {
|
|
CNavi_Link* link = new CNavi_Link(objectType, objectIndex, name, title, objectX, objectY, info, linked, linkedX, linkedY);
|
|
link->SetId(id);
|
|
info->AddLink(link);
|
|
}
|
|
}
|
|
|
|
int job = 0;
|
|
int sex = 0;
|
|
int bodyPalette = 0;
|
|
int head = 0;
|
|
int headPalette = 0;
|
|
int accessory0 = 0;
|
|
int accessory1 = 0;
|
|
int accessory2 = 0;
|
|
int robe = 0;
|
|
for (int index = 1; index < 9999; ++index) {
|
|
const char* mapName = nullptr;
|
|
int pickX = 0;
|
|
int pickY = 0;
|
|
if (!script->Call(
|
|
"queryNavi_PickNpc", "d>sddddddddddd", index, &mapName, &pickX, &pickY, &job, &sex, &bodyPalette, &head, &headPalette, &accessory0, &accessory1,
|
|
&accessory2, &robe
|
|
)) {
|
|
StringFormat(message, sizeof(message), static_cast<std::size_t>(-1), "Failed to read Link lua %d", index);
|
|
MessageBoxA(hWnd, message, "Error queryNavi_PickNpc ", 0);
|
|
break;
|
|
}
|
|
if (!mapName) {
|
|
break;
|
|
}
|
|
CNaviInfo* info = this->FindObject(mapName);
|
|
if (info) {
|
|
CNavi_Object* npc = info->FindNpcAt(pickX, pickY);
|
|
if (npc) {
|
|
npc->job = job;
|
|
npc->sex = sex;
|
|
npc->bodyPalette = bodyPalette;
|
|
npc->head = head;
|
|
npc->headPalette = headPalette;
|
|
npc->accessory0 = accessory0;
|
|
npc->accessory1 = accessory1;
|
|
npc->accessory2 = accessory2;
|
|
npc->robe = robe;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (int map = 1; map < 999999; map += 3) {
|
|
const char* mapName = nullptr;
|
|
int count = 0;
|
|
if (!script->Call("queryNavi_Distance_Map", "d>sd", map, &mapName, &count)) {
|
|
std::sprintf(message, "워프 길 정보 읽기 실패 %d", map);
|
|
MessageBoxA(hWnd, message, "Error", 0);
|
|
break;
|
|
}
|
|
if (!mapName) {
|
|
break;
|
|
}
|
|
CNaviInfo* info = this->FindObject(mapName);
|
|
if (!info) {
|
|
continue;
|
|
}
|
|
for (int entry = 1; entry < count + 1; ++entry) {
|
|
int linkId = -1;
|
|
if (!script->Call("queryNavi_Distance_Link", "dd>d", map, entry, &linkId)) {
|
|
continue;
|
|
}
|
|
CNavi_Link* link = info->FindLink(linkId, true);
|
|
if (!link) {
|
|
continue;
|
|
}
|
|
for (int pass = 1;; ++pass) {
|
|
const char* kind = nullptr;
|
|
targetId = -1;
|
|
cost = 0;
|
|
if (!script->Call("queryNavi_Distance_Pass", "ddd>sdd", map, entry, pass, &kind, &targetId, &cost)) {
|
|
continue;
|
|
}
|
|
if (std::strcmp("NULL", kind) == 0) {
|
|
break;
|
|
}
|
|
if (std::strcmp(kind, "P") == 0) {
|
|
CNavi_Link* target = info->FindLink(targetId, true);
|
|
if (target) {
|
|
link->AddLink(NaviLink{target, cost});
|
|
}
|
|
} else if (std::strcmp(kind, "E") == 0) {
|
|
CNavi_Link* target = link->GetLinkedInfo()->FindLink(targetId, true);
|
|
if (target) {
|
|
link->AddLinkedLink(NaviLink{target, cost});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for (int map = 1; map < 999999; map += 3) {
|
|
const char* mapName = nullptr;
|
|
int count = 0;
|
|
if (!script->Call("queryNavi_NpcDistance_Map", "d>sd", map, &mapName, &count)) {
|
|
std::sprintf(message, "Npc 워프 길 정보 읽기 실패 %d", map);
|
|
MessageBoxA(hWnd, message, "Error", 0);
|
|
break;
|
|
}
|
|
if (!mapName) {
|
|
break;
|
|
}
|
|
CNaviInfo* info = this->FindObject(mapName);
|
|
if (!info) {
|
|
continue;
|
|
}
|
|
for (int entry = 1; entry < count + 1; ++entry) {
|
|
int npcId = -1;
|
|
if (!script->Call("queryNavi_NpcDistance_Link", "dd>d", map, entry, &npcId)) {
|
|
continue;
|
|
}
|
|
CNavi_Object* npc = info->FindNpc(npcId, true);
|
|
if (!npc) {
|
|
continue;
|
|
}
|
|
for (int pass = 1;; ++pass) {
|
|
const char* targetMap = nullptr;
|
|
targetId = -1;
|
|
cost = 0;
|
|
if (!script->Call("queryNavi_NpcDistance_Pass", "ddd>sdd", map, entry, pass, &targetMap, &targetId, &cost)) {
|
|
continue;
|
|
}
|
|
if (targetId == 0 && cost == 0) {
|
|
break;
|
|
}
|
|
CNaviInfo* targetInfo = this->FindObject(targetMap);
|
|
CNavi_Link* target = targetInfo == nullptr ? this->data.FindLink(targetId, true) : targetInfo->FindLink(targetId, true);
|
|
if (target) {
|
|
npc->AddLink(NaviLink{target, cost});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for (int index = 1; index < 200; ++index) {
|
|
const char* name = nullptr;
|
|
const char* mapName = nullptr;
|
|
int id = 0;
|
|
int objectIndex = 0;
|
|
linkedX = 0;
|
|
linkedY = 0;
|
|
if (!script->Call("queryNavi_Scroll", "d>sddsdd", index, &name, &id, &objectIndex, &mapName, &linkedX, &linkedY)) {
|
|
char text[260];
|
|
std::memset(text, 0, sizeof(text));
|
|
std::sprintf(text, "Scroll 정보 읽기 실패 %d", index);
|
|
MessageBoxA(hWnd, text, "Error", 0);
|
|
break;
|
|
}
|
|
if (std::strcmp("NULL", name) == 0 && std::strcmp("NULL", mapName) == 0) {
|
|
break;
|
|
}
|
|
CNaviInfo* info = this->FindObject(mapName);
|
|
if (!info) {
|
|
continue;
|
|
}
|
|
CNavi_Link* link = new CNavi_Link(400, objectIndex, name, nullptr, 0, 0, nullptr, info, linkedX, linkedY);
|
|
if (link) {
|
|
link->SetId(id);
|
|
this->data.AddObject(link);
|
|
link->ClearLinkedLinks();
|
|
for (int pass = 1;; ++pass) {
|
|
targetId = -1;
|
|
cost = 0;
|
|
if (!script->Call("queryNavi_Scroll_Pass", "dd>dd", index, pass, &targetId, &cost)) {
|
|
continue;
|
|
}
|
|
if (targetId == 0 && cost == 0) {
|
|
break;
|
|
}
|
|
CNavi_Link* target = info->FindLink(targetId, true);
|
|
if (target) {
|
|
link->AddLinkedLink(NaviLink{target, cost});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
this->playerMapInfo = this->FindObject("prontera");
|
|
this->data.ResetLinkDepths();
|
|
return true;
|
|
}
|
|
|
|
// OFFSET: 0x00DDE770
|
|
// FUNCTION: fn_23399
|
|
const char* CSession::GetMapDisplayName(const char* mapName) {
|
|
CMapInfoMgr* mapInfoMgr = g_mapInfoMgr;
|
|
return mapInfoMgr->GetDisplayName(mapName);
|
|
}
|
|
|
|
// OFFSET: 0x00DDE800
|
|
// FUNCTION: fn_23400
|
|
std::uint32_t CSession::GetPartyMemberAid(const char* name) {
|
|
for (const MessengerMember& member : this->m_partyMembers) {
|
|
if (member.name == name) {
|
|
return member.accountId;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
// OFFSET: 0x00DE0A50
|
|
// FUNCTION: fn_23466
|
|
std::uint32_t CSession::GetServerTime() {
|
|
return timeGetTime() - this->m_serverTimeOffset - 72;
|
|
}
|
|
|
|
// OFFSET: 0x00DFEF40
|
|
// FUNCTION: fn_23605
|
|
std::uint32_t CSession::AddPingSample(std::uint32_t sample) {
|
|
this->m_pingSamples.push_back(sample);
|
|
|
|
while (this->m_pingSamples.size() > 3) {
|
|
this->m_pingSamples.pop_front();
|
|
}
|
|
|
|
std::uint32_t sum = 0;
|
|
for (std::uint32_t value : this->m_pingSamples) {
|
|
sum += value;
|
|
}
|
|
|
|
this->m_averagePing = sum / this->m_pingSamples.size();
|
|
return this->m_averagePing;
|
|
}
|
|
|
|
// OFFSET: 0x00E00130
|
|
// FUNCTION: fn_23637
|
|
std::uint32_t CSession::SetServerTime(std::uint32_t serverTime) {
|
|
const std::uint32_t offset = timeGetTime() - serverTime;
|
|
this->m_serverTimeOffset = offset;
|
|
this->m_serverTimeAdjustCount = 0;
|
|
return offset;
|
|
}
|
|
|
|
// OFFSET: 0x00E00160
|
|
// FUNCTION: fn_23638
|
|
void CSession::SetHotkeyDescription(const char* description, int index) {
|
|
for (int slot = 9 * this->m_hotkeyPage; slot < 9 * (this->m_hotkeyPage + 1); ++slot) {
|
|
if (this->m_hotkeyDescriptions[slot] == description) {
|
|
this->m_hotkeyDescriptions[slot] = "nothing";
|
|
}
|
|
}
|
|
|
|
if (std::strlen(description) == 0) {
|
|
this->m_hotkeyDescriptions[index] = "nothing";
|
|
} else {
|
|
this->m_hotkeyDescriptions[index] = description;
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00E26430
|
|
// FUNCTION: fn_23914
|
|
void CSession::SetHotkeyDescription(const char* description, std::uint32_t skillLevel, int index) {
|
|
for (int slot = 9 * this->m_hotkeyPage; slot < 9 * (this->m_hotkeyPage + 1); ++slot) {
|
|
if (this->m_hotkeyDescriptions[slot] == description && this->hotkeySkillLevels[slot] == skillLevel) {
|
|
this->m_hotkeyDescriptions[slot] = "nothing";
|
|
this->hotkeySkillLevels[slot] = 0;
|
|
}
|
|
}
|
|
|
|
if (std::strlen(description) == 0) {
|
|
this->m_hotkeyDescriptions[index] = "nothing";
|
|
this->hotkeySkillLevels[index] = 0;
|
|
} else {
|
|
this->m_hotkeyDescriptions[index] = description;
|
|
this->hotkeySkillLevels[index] = skillLevel;
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00E26540
|
|
// FUNCTION: fn_23915
|
|
void CSession::SetHotkeySkillLevel(std::uint32_t skillLevel, int index) {
|
|
this->hotkeySkillLevels[index] = skillLevel;
|
|
}
|
|
|
|
// OFFSET: 0x00E265C0
|
|
// FUNCTION: fn_23916
|
|
void CSession::RefreshTrackedAchievement(int id) {
|
|
std::vector<SessionRecord6178>& tracked = this->trackedAchievements;
|
|
auto found = std::find_if(tracked.begin(), tracked.end(), [id](SessionRecord6178 record) { return id == record.id; });
|
|
if (found == tracked.end()) {
|
|
return;
|
|
}
|
|
|
|
SessionRecord6144 progress = g_session.FindAchievementRecord(id);
|
|
|
|
AchievementInfo info;
|
|
g_achievementMgr->GetAchievement(info, id);
|
|
found->completed = reinterpret_cast<const unsigned char*>(&progress.completionFlags)[1];
|
|
|
|
for (unsigned int i = 0; i < info.rewards.size(); ++i) {
|
|
if (info.progressMode == 0) {
|
|
if (info.rewards[i].text.size() > 40) {
|
|
found->objectives[i].text = static_cast<const std::string&>(FormatOwnedString("- %s...", info.rewards[i].text.substr(0, 40).c_str()));
|
|
} else {
|
|
found->objectives[i].text = static_cast<const std::string&>(FormatOwnedString("- %s", info.rewards[i].text.c_str()));
|
|
}
|
|
|
|
found->objectives[i].completed = static_cast<int>(progress.objectives[i]) > 0;
|
|
} else if (info.progressMode == 1) {
|
|
int value = progress.objectives[i];
|
|
std::string count = FormatOwnedString("(%d/%d)", value, info.rewards[i].targetCount);
|
|
if (info.rewards[i].text.size() + count.size() > 40) {
|
|
found->objectives[i].text = static_cast<const std::string&>(FormatOwnedString("- %s...%s", info.rewards[i].text.substr(0, 40 - count.size()).c_str(), count.c_str()));
|
|
} else {
|
|
found->objectives[i].text = static_cast<const std::string&>(FormatOwnedString("- %s %s", info.rewards[i].text.c_str(), count.c_str()));
|
|
}
|
|
|
|
found->objectives[i].completed = value == info.rewards[i].targetCount;
|
|
}
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00E00320
|
|
// FUNCTION: fn_23639
|
|
void CSession::AddItemSlot(ITEM_INFO item) {
|
|
for (int slot = 0; slot < 10; ++slot) {
|
|
if (this->m_itemSlots[slot].quantity == 0) {
|
|
this->m_itemSlots[slot] = item;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (UIWindow* window = g_windowMgr.LookupWindow(WID_EXCHANGEUI)) {
|
|
window->SendMsg(nullptr, UM_REFRESHITEM, 0, 0, 0, 0);
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00E003D0
|
|
// FUNCTION: fn_23640
|
|
SessionShop* CSession::GetShop(int shopId) {
|
|
const auto found = this->m_shops.find(shopId);
|
|
if (found != this->m_shops.end()) {
|
|
return &found->second;
|
|
}
|
|
|
|
this->m_shops[shopId] = SessionShop{};
|
|
return &this->m_shops[shopId];
|
|
}
|
|
|
|
// OFFSET: 0x00E004D0
|
|
// FUNCTION: fn_23641
|
|
void CSession::SetShopFlag(int shopId, char flag) {
|
|
if (SessionShop* shop = this->GetShop(shopId)) {
|
|
shop->flag = static_cast<unsigned char>(flag);
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00E004F0
|
|
// FUNCTION: fn_23642
|
|
void CSession::SetShopItem(int shopId, unsigned int index, int itemId, int first, int second) {
|
|
SessionShop* shop = this->GetShop(shopId);
|
|
if (shop == nullptr) {
|
|
return;
|
|
}
|
|
|
|
if (shop->items.size() <= index) {
|
|
shop->items.resize(index + 1);
|
|
}
|
|
|
|
std::map<int, std::pair<int, int>>& items = shop->items[index];
|
|
if (items.find(itemId) == items.end()) {
|
|
items[itemId] = index == 0 ? std::make_pair(1, second) : std::make_pair(first, second);
|
|
}
|
|
}
|
|
|
|
// INLINED
|
|
static __forceinline int LookupShopId(CSession& session, std::string name) {
|
|
std::string key = name;
|
|
if (key.empty()) {
|
|
key = session.m_navigationPlayerMap;
|
|
}
|
|
|
|
const auto found = session.m_nameToId.find(key);
|
|
if (found == session.m_nameToId.end()) {
|
|
return -1;
|
|
}
|
|
return found->second;
|
|
}
|
|
|
|
// OFFSET: 0x00E006E0
|
|
// FUNCTION: fn_23643
|
|
bool CSession::AddShopName(std::string name, int shopId) {
|
|
if (LookupShopId(*this, name) != -1) {
|
|
return true;
|
|
}
|
|
|
|
this->m_nameToId[name] = shopId;
|
|
return false;
|
|
}
|
|
|
|
// OFFSET: 0x00E00910
|
|
// FUNCTION: fn_23644
|
|
void CSession::LoadNavigationScripts() {
|
|
if (g_serviceMode == 0) {
|
|
if (!this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_f_krpri", true, false)) {
|
|
return;
|
|
}
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_Map_krpri", true, false);
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_Npc_krpri", true, false);
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_Mob_krpri", true, false);
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_Link_krpri", true, false);
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_LinkDistance_krpri", true, false);
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_NpcDistance_krpri", true, false);
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_Scroll_krpri", true, false);
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\navi_picknpc_krpri", true, false);
|
|
} else if (g_serviceMode == 1) {
|
|
if (!this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_f_krSak", true, false)) {
|
|
return;
|
|
}
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_Map_krSak", true, false);
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_Npc_krSak", true, false);
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_Mob_krSak", true, false);
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_Link_krSak", true, false);
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_LinkDistance_krSak", true, false);
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_NpcDistance_krSak", true, false);
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_Scroll_krSak", true, false);
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\navi_picknpc_krSak", true, false);
|
|
} else {
|
|
if (!this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_f_krLoc", true, false)) {
|
|
return;
|
|
}
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_Map_krLoc", true, false);
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_Npc_krLoc", true, false);
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_Mob_krLoc", true, false);
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_Link_krLoc", true, false);
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_LinkDistance_krLoc", true, false);
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_npcDistance_krLoc", true, false);
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\Navi_Scroll_krLoc", true, false);
|
|
this->m_hotkeyScript->Load("Lua Files\\Navigation\\navi_picknpc_krLoc", true, false);
|
|
}
|
|
|
|
g_navigationManager.LoadScript(this->m_hotkeyScript);
|
|
}
|
|
|
|
// OFFSET: 0x00E00B30
|
|
// FUNCTION: fn_23645
|
|
void CSession::LoadRobeAlpha() {
|
|
for (int index = 1; index < 1000; ++index) {
|
|
int robeId = 0;
|
|
int from = 0;
|
|
int to = 0;
|
|
int period = 0;
|
|
LuaScript* script = this->m_hotkeyScript;
|
|
|
|
const char signatureSource[] = {'\x15', '\x45', '\xC9', '\x0F', '\x21', '\x81', '\x73'};
|
|
const char functionSource[] = {'\x36', '\x32', '\xDC', '\x11', '\x9E', '\x27', '\x6B', '\xB4', '\x29', '\x34', '\xC9', '\x02', '\x95', '\x36', '\x77', '\xA1', '\x2E', '\x33', '\xDC', '\x0E', '\x8E', '\x3D', '\x7F', '\xBA', '\x47'};
|
|
|
|
if (!script->Call(DecryptName<0xD51953E763B94747ULL>(functionSource), DecryptName<0x6373E5456BAD7B71ULL>(signatureSource), index, &robeId, &from, &to, &period)) {
|
|
char message[260];
|
|
std::memset(message, 0, sizeof(message));
|
|
const char formatSource[] = {'\xAA', '\x72', '\x76', '\xA1', '\x8C', '\x37', '\x93', '\x0A', '\xB5', '\x74', '\x63', '\xB2', '\x87', '\x26', '\x8F', '\x1F', '\xB2', '\x73', '\x76', '\xBE', '\x9C', '\x2D', '\x87', '\x04', '\xFB', '\x28', '\x3C', '\xF3', '\xD0', '\x27', '\xC1', '\xAB', '\x0B', '\xB6', '\xF1', '\xF3', '\x48', '\x84', '\x27', '\xBB', '\xDB'};
|
|
std::sprintf(message, DecryptName<0x6BE143F5D31307DBULL>(formatSource), index);
|
|
const char titleSource[] = {'\xC8', '\x0D', '\x8B', '\xC0', '\xA5', '\x91'};
|
|
MessageBoxA(hWnd, message, DecryptName<0xAB5791D7AFF97F8DULL>(titleSource), 0);
|
|
return;
|
|
}
|
|
|
|
if (!robeId) {
|
|
return;
|
|
}
|
|
this->m_robeAlpha.insert({robeId, RobeAlpha{from, to, period}});
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00E010B0
|
|
// FUNCTION: fn_23646
|
|
int CSession::SetPlayerSkillMode(int value) {
|
|
this->playerSkillMode = value;
|
|
return value;
|
|
}
|
|
|
|
// OFFSET: 0x00DDBB50
|
|
// FUNCTION: fn_23359
|
|
int CSession::GetPlayerSkillMode() const {
|
|
return this->playerSkillMode;
|
|
}
|
|
|
|
// OFFSET: 0x00E01670
|
|
// FUNCTION: fn_23647
|
|
void CSession::UnflagInventoryItem(int id) {
|
|
for (ITEM_INFO& entry : this->m_inventoryItems) {
|
|
if (entry.identity[1] == static_cast<std::uint32_t>(id)) {
|
|
entry.flags[2] = 0;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00E016A0
|
|
// FUNCTION: fn_23648
|
|
void CSession::UnflagMerchantShopItem(int id) {
|
|
for (ITEM_INFO& entry : this->merchantShopItems) {
|
|
if (entry.identity[1] == static_cast<std::uint32_t>(id)) {
|
|
entry.flags[2] = 0;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00E016D0
|
|
// FUNCTION: fn_23649
|
|
void CSession::UnflagCartItem(int id) {
|
|
for (ITEM_INFO& entry : this->cartItems) {
|
|
if (entry.identity[1] == static_cast<std::uint32_t>(id)) {
|
|
entry.flags[2] = 0;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00E01700
|
|
// FUNCTION: fn_23650
|
|
std::uint32_t CSession::SyncServerTime(std::uint32_t serverTime) {
|
|
const std::uint32_t current = timeGetTime() - this->m_serverTimeOffset - 72;
|
|
if (current + 72 < serverTime) {
|
|
this->m_serverTimeOffset = timeGetTime() - serverTime;
|
|
this->m_serverTimeAdjustCount = 0;
|
|
return this->m_serverTimeOffset;
|
|
}
|
|
|
|
if (current + 72 > serverTime + 144) {
|
|
if (++this->m_serverTimeAdjustCount < 4) {
|
|
return serverTime + 144;
|
|
}
|
|
|
|
this->m_serverTimeOffset = timeGetTime() + 72 - current;
|
|
this->m_serverTimeAdjustCount = 0;
|
|
return this->m_serverTimeOffset;
|
|
}
|
|
|
|
this->m_serverTimeAdjustCount = 0;
|
|
return serverTime + 144;
|
|
}
|
|
|
|
// OFFSET: 0x00DE4D80
|
|
// FUNCTION: fn_23490
|
|
void CSession::LoadDamageSkinSettings() {
|
|
g_session.m_hotkeyScript->Call("GetDamageSkinSize", ">d", &this->damageSkinCount);
|
|
if (this->m_damageSkinIndex < 0 || this->m_damageSkinIndex >= this->damageSkinCount) {
|
|
this->m_damageSkinIndex = 0;
|
|
}
|
|
if (this->m_damageSkinMode < 0 || this->m_damageSkinMode >= 4) {
|
|
this->m_damageSkinMode = 0;
|
|
}
|
|
|
|
const char* resourceName = nullptr;
|
|
const char* damageSpriteName = nullptr;
|
|
const char* damageSkinAuxiliaryName = nullptr;
|
|
g_session.m_hotkeyScript->Call("GetDamageResourceName", "d>sss", this->m_damageSkinIndex, &resourceName, &damageSpriteName, &damageSkinAuxiliaryName);
|
|
if (resourceName) {
|
|
this->m_damageResourceName = resourceName;
|
|
}
|
|
if (damageSpriteName) {
|
|
this->damageSpriteName = damageSpriteName;
|
|
}
|
|
if (damageSkinAuxiliaryName) {
|
|
this->damageSkinAuxiliaryName = damageSkinAuxiliaryName;
|
|
}
|
|
g_session.m_hotkeyScript->Call("GetDamageMillionUnit", "d>d", this->m_damageSkinIndex, &this->m_damageMillionUnit);
|
|
}
|
|
|
|
// OFFSET: 0x00DE53C0
|
|
// FUNCTION: fn_23491
|
|
bool CSession::LoadExceptionMinimapNameTable() {
|
|
std::vector<char*> tokens;
|
|
this->m_navigationForbiddenMaps.clear();
|
|
this->m_navigationForbiddenMaps.reserve(512);
|
|
|
|
CCommonObject& storage = reinterpret_cast<CCommonObject&>(this->minimapTokenStorage[0x30]);
|
|
const bool loaded = storage.LoadTokens(tokens, "ExceptionMinimapNameTable.txt", 0);
|
|
|
|
for (char* token : tokens) {
|
|
this->m_navigationForbiddenMaps.push_back(std::string(token));
|
|
}
|
|
|
|
std::sort(this->m_navigationForbiddenMaps.begin(), this->m_navigationForbiddenMaps.end(), std::less<std::string>());
|
|
return loaded;
|
|
}
|
|
|
|
// OFFSET: 0x00DE5620
|
|
// FUNCTION: fn_23492
|
|
bool CSession::LoadFogParameters() {
|
|
this->m_fogParameters.clear();
|
|
|
|
CFile file;
|
|
if (!file.Open("fogParameterTable.txt", 0, true, false)) {
|
|
return false;
|
|
}
|
|
|
|
const char* cursor = static_cast<const char*>(file.GetData());
|
|
const char* end = cursor + file.GetSize();
|
|
std::string name;
|
|
std::vector<std::string> values;
|
|
|
|
for (const char* start = cursor; cursor < end; ++cursor) {
|
|
const char value = *cursor;
|
|
if (value == '\n' || value == '\r') {
|
|
start = cursor + 1;
|
|
continue;
|
|
}
|
|
|
|
if (value != '#') {
|
|
continue;
|
|
}
|
|
|
|
if (name.empty()) {
|
|
name.assign(start, cursor - start);
|
|
} else if (values.size() < 3) {
|
|
values.push_back(std::string(start, cursor));
|
|
} else {
|
|
std::string last(start, cursor);
|
|
values.push_back(std::move(last));
|
|
this->m_fogParameters.push_back(std::make_pair(name, values));
|
|
name.clear();
|
|
values.clear();
|
|
}
|
|
|
|
start = cursor + 1;
|
|
}
|
|
|
|
std::sort(this->m_fogParameters.begin(), this->m_fogParameters.end(),
|
|
[](const std::pair<std::string, std::vector<std::string>>& left,
|
|
const std::pair<std::string, std::vector<std::string>>& right) {
|
|
return std::strcmp(left.first.c_str(), right.first.c_str()) < 0;
|
|
});
|
|
file.Close();
|
|
return true;
|
|
}
|
|
|
|
// OFFSET: 0x00DE5B40
|
|
// FUNCTION: fn_23493
|
|
void CSession::ClearHomunStatus() {
|
|
this->moveHomunEnemy = 0;
|
|
this->selectHomunEnemy = 0;
|
|
this->attackHomunEnemy = 0;
|
|
this->homunEnemyGid = 0;
|
|
this->homunEnemyX = 0;
|
|
this->homunEnemyY = 0;
|
|
}
|