#include "Client/Mode/CLoginMode.h" #include "Client/Mode/ModeMessage.h" #include "Network/Packets/NoticeEnums.h" #include "Client/Mode/ModeMgr.h" #include "Client/Session/Session.h" #include "Contents/Configuration/ServiceConfiguration.h" #include "Contents/Tables/MessageTable.h" #include "Network/Connection/Connection.h" #include "UI/Window/UIWindowMgr.h" #include "Utility/Cipher/XorBytes.h" #include "Utility/Cipher/LocalEncryptedName.h" #include "Utility/Cipher/CryptName.h" #include "Utility/Cipher/Obfuscate.h" #include "Resource/MSGSTRINGID.h" #include #include #include #include #include #include #include namespace { #pragma pack(push, 1) struct BillingInfoPacket { /* 0000 */ std::uint16_t id; /* 0002 */ std::uint32_t remainingTime; /* 0006 */ std::uint32_t remainingFreeTime; }; struct NotifyBanPacket { /* 0000 */ std::uint16_t id; /* 0002 */ std::uint8_t errorCode; }; #pragma pack(pop) static_assert(sizeof(BillingInfoPacket) == 10); static_assert(sizeof(NotifyBanPacket) == 3); } // OFFSET: 0x00D9A350 // FUNCTION: fn_22311 void CLoginMode::ReceiveBillingInfo(const unsigned char* data) { const BillingInfoPacket* packet = reinterpret_cast(data); char text[256]; const std::uint32_t remainingTime = packet->remainingTime; std::uint32_t minutesPerHour = 60; std::uint32_t hoursPerDay = 24; if (remainingTime == 0xFFFFFFFE && packet->remainingFreeTime == 0xFFFFFFFE) { const char* message = LookupMessage(MSI_BILLING_FREE_USER); // GLOBAL: gl_25061 const char* format = OBFUSCATE_BYTES_TEXT("%s\x0A", 0x4B755DB19953E311ULL); sprintf(text, format, message); } else if (remainingTime == 0xFFFFFFFD && packet->remainingFreeTime == 0xFFFFFFFD) { const char* message = LookupMessage(MSI_BILLING_PCB); // GLOBAL: gl_25062 const char* format = OBFUSCATE_BYTES_TEXT("%s\x0A", 0xF715514F5961B75BULL); sprintf(text, format, message); } else if (remainingTime == 0xFFFFFFFF && packet->remainingFreeTime == 0xFFFFFFFF) { const char* message = LookupMessage(MSI_BILLING_INTERNET_CAFE); // GLOBAL: gl_25063 const char* format = OBFUSCATE_BYTES_TEXT("%s\x0A", 0x4191BB5531FD3999ULL); sprintf(text, format, message); } else if (remainingTime != 0) { const std::uint32_t freeTime = packet->remainingFreeTime; if (freeTime != 0) { const char* message = LookupMessage(MSI_BILLING_BOTH); sprintf(text, message, remainingTime / (60 * 24), remainingTime / minutesPerHour % hoursPerDay, remainingTime % minutesPerHour, freeTime / minutesPerHour, freeTime % minutesPerHour); } else { const char* message = LookupMessage(MSI_BILLING_100); // GLOBAL: gl_25064 const char* format = OBFUSCATE_BYTES_TEXT("%s\x0A", 0xB19D1FA9116F39D3ULL); sprintf(text, format, message); const std::uint32_t time = packet->remainingTime; const char* dayFormat = LookupMessage(MSI_BILLING_DAY_HOUR_MINUTES); sprintf(text + strlen(text), dayFormat, time / (60 * 24), time / minutesPerHour % hoursPerDay, time % minutesPerHour); } } else { if (packet->remainingFreeTime > 0) { const char* message = LookupMessage(MSI_BILLING_800); // GLOBAL: gl_25065 const char* format = OBFUSCATE_BYTES_TEXT("%s\x0A", 0x9569C9C7E70909AFULL); sprintf(text, format, message); const std::uint32_t freeTime = packet->remainingFreeTime; const char* hourFormat = LookupMessage(MSI_BILLING_HOUR_MINUTES); sprintf(text + strlen(text), hourFormat, freeTime / minutesPerHour, freeTime % minutesPerHour); } else { // GLOBAL: gl_25066 const char* format = OBFUSCATE_BYTES_TEXT("\x0A", 0xD7A749EB27D5BF6DULL); sprintf(text, format); } } this->otpStarted = timeGetTime() + 90000; g_windowMgr.Confirm(text, 0, true, true, 0, "Message", 280, 120, 0); } // OFFSET: 0x00D9A9F0 // FUNCTION: fn_22312 void CLoginMode::ReceiveNotifyBan(const unsigned char* data) { const NotifyBanPacket* packet = reinterpret_cast(data); char text[256]; text[0] = '\0'; const int errorCode = packet->errorCode; GetRagConnection().Close(); switch (errorCode) { case BAN_UNFAIR: strcpy(text, LookupMessage(MSI_BANNED)); break; case BAN_SERVER_SHUTDOWN: strcpy(text, LookupMessage(MSI_SERVER_OFF)); break; case BAN_ANOTHER_LOGIN: strcpy(text, LookupMessage(MSI_DOUBLE_LOGIN_PROHIBITED)); break; case BAN_DETECTED_SPEEDHACK: strcpy(text, LookupMessage(MSI_SPEEDHACK)); break; case BAN_PC_OVERFLOW: strcpy(text, LookupMessage(MSI_PC_OVERFLOW)); break; case BAN_UNDER_AGE: strcpy(text, LookupMessage(MSI_UNDER_AGE)); break; case BAN_NOT_SETTLED: strcpy(text, LookupMessage(MSI_NOT_SETTLED)); if (g_windowMgr.Confirm(text, 2, true, true, 0, "Message", 280, 120, 0) == 187) { g_modeMgr.Quit(); this->OpenAccountRegistration(); } text[0] = '\0'; break; case BAN_ACCOUNT_BUSY: strcpy(text, LookupMessage(MSI_ACCOUNT_BUSY)); break; case BAN_INFORMATION_REMAINED: strcpy(text, LookupMessage(MSI_INFORMATION_REMAINED)); break; case BAN_IP_OVERFLOW: strcpy(text, LookupMessage(MSI_BAN_IP_OVERFLOW)); break; case BAN_PAY_OUT: strcpy(text, LookupMessage(MSI_BAN_PAY_OUT)); break; case BAN_PAY_SUSPEND: strcpy(text, LookupMessage(MSI_BAN_PAY_SUSPEND)); break; case BAN_PAY_CHANGE: strcpy(text, LookupMessage(MSI_BAN_PAY_CHANGE)); break; case BAN_PAY_WRONGIP: strcpy(text, LookupMessage(MSI_BAN_PAY_WRONGIP)); break; case BAN_PAY_PNGAMEROOM: strcpy(text, LookupMessage(MSI_BAN_PAY_PNGAMEROOM)); break; case BAN_JAPAN_REFUSE1: strcpy(text, LookupMessage(MSI_BAN_JAPAN_REFUSE1)); break; case BAN_JAPAN_REFUSE2: strcpy(text, LookupMessage(MSI_BAN_JAPAN_REFUSE2)); break; case BAN_INFORMATION_REMAINED_ANOTHER_ACCOUNT: strcpy(text, LookupMessage(MSI_BAN_INFORMATION_REMAINED_ANOTHER_ACCOUNT)); break; case BAN_PC_IP_UNFAIR: strcpy(text, LookupMessage(MSI_BAN_PC_IP_UNFAIR)); break; case BAN_PC_IP_COUNT_ALL: strcpy(text, LookupMessage(MSI_BAN_PC_IP_COUNT_ALL)); break; case BAN_PC_IP_COUNT: strcpy(text, LookupMessage(MSI_BAN_PC_IP_COUNT)); break; case BAN_GRAVITY_MEM_AGREE: strcpy(text, LookupMessage(MSI_BAN_GRAVITY_MEM_AGREE)); break; case BAN_GAME_MEM_AGREE: strcpy(text, LookupMessage(MSI_BAN_GAME_MEM_AGREE)); break; case BAN_HAN_VALID: strcpy(text, LookupMessage(MSI_BAN_HAN_VALID)); break; case 107: if (g_serviceType == 0) { char buffer[200]; sprintf(buffer, LookupMessage(MSI_BAN_OVER_CHARACTER_LIST), 9); strcpy(text, buffer); } break; case 108: strcpy(text, LookupMessage(MSI_BAN_IP_BLOCK)); break; case 109: strcpy(text, LookupMessage(MSI_BAN_INVALID_PWD_CNT)); break; case 110: strcpy(text, LookupMessage(MSI_BAN_NOT_ALLOWED_JOBCLASS)); break; case 113: strcpy(text, LookupMessage(MSI_BAN_SHUTDOWN_TEENAGER)); break; case 114: strcpy(text, LookupMessage(MSI_PLANNED_TIME_SHUTDOWN)); break; case 116: strcpy(text, LookupMessage(MSI_MCSTORE_BACKUP_TOOLTIP)); break; default: strcpy(text, LookupMessage(MSI_BANNED)); break; } if (strlen(text) != 0) { char message[256]; // GLOBAL: gl_25060 sprintf(message, OBFUSCATE_ARRAY("%s(%d)", 0xBD2BA1C11B01E73BULL, std::uint8_t).Text(), text, packet->errorCode); g_windowMgr.Confirm(message, 0, true, true, 0, "Message", 280, 120, 0); } if (g_session.m_loginModeFlag == true) { this->pendingCursorType = 3; } else { g_modeMgr.gameMode->SendMsg(MM_QUIT, 0, 0, 0, 0); } }