diff --git a/deps/premake/libtomcrypt.lua b/deps/premake/libtomcrypt.lua index 6c6f28d..7ca3570 100644 --- a/deps/premake/libtomcrypt.lua +++ b/deps/premake/libtomcrypt.lua @@ -19,6 +19,8 @@ function libtomcrypt.includes() "LTC_NO_FAST", "LTC_NO_PROTOTYPES", "LTC_NO_RSA_BLINDING", + "LTC_NO_FILE", + "ARGTYPE=4", } end @@ -34,6 +36,7 @@ function libtomcrypt.project() } removefiles { + path.join(libtomcrypt.source, "src/**/*_test.c"), path.join(libtomcrypt.source, "src/**/*tab.c"), path.join(libtomcrypt.source, "src/encauth/ocb3/**.c"), } diff --git a/src/game/game.cpp b/src/game/game.cpp index 43656be..ea5a1b3 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -104,8 +104,6 @@ namespace game gentity_s* g_entities; - level_locals_t* level; - DeferredQueue* deferredQueue; float* com_codeTimeScale; @@ -140,11 +138,8 @@ namespace game SV_GameSendServerCommand_t SV_GameSendServerCommand; client_t* svs_clients; - } - namespace dedi - { - client_t* svs_clients; + level_locals_t* level; } namespace sp @@ -168,8 +163,7 @@ namespace game else if ((value->type & ~1) == SCRIPT_STRING) { static const auto size = is_sp() ? 16 : 12; - const auto ref_count = reinterpret_cast(*scrMemTreePub + size * value - ->u.stringValue); + const auto ref_count = reinterpret_cast(*scrMemTreePub + size * value->u.stringValue); InterlockedIncrement(ref_count); } else if (value->type == SCRIPT_VECTOR) @@ -181,78 +175,19 @@ namespace game } } - __declspec(naked) unsigned int conbuf_append_text_dedicated(const char* message) - { - static DWORD func = 0x53C790; - - __asm - { - mov ecx, message - call func - retn - } - } - void Conbuf_AppendText(const char* message) { - if (is_dedi()) - { - conbuf_append_text_dedicated(message); - } - else - { - reinterpret_cast(SELECT_VALUE(0x4C84E0, 0x5CF610, 0))(message); - } - } - - __declspec(naked) unsigned int find_variable_dedicated(unsigned int parentId, unsigned int name) - { - static DWORD func = 0x4E7ED0; - - __asm - { - mov eax, name - mov ecx, parentId - call func - retn - } + reinterpret_cast(SELECT_VALUE(0x4C84E0, 0x5CF610))(message); } unsigned int FindVariable(const unsigned int parentId, const unsigned int name) { - if (is_dedi()) - { - return find_variable_dedicated(parentId, name); - } - - return reinterpret_cast // - (SELECT_VALUE(0x4C4E70, 0x5651F0, 0x0))(parentId, name); - } - - __declspec(naked) VariableValue get_entity_field_value_dedicated(unsigned int classnum, int entnum, int _offset) - { - static DWORD func = 0x4F1400; - - __asm - { - push _offset - push entnum - mov ecx, classnum - call func - add esp, 8h - retn - } + return reinterpret_cast(SELECT_VALUE(0x4C4E70, 0x5651F0))(parentId, name); } VariableValue GetEntityFieldValue(const unsigned int classnum, const int entnum, const int offset) { - if (is_dedi()) - { - return get_entity_field_value_dedicated(classnum, entnum, offset); - } - - return reinterpret_cast // - (SELECT_VALUE(0x530E30, 0x56AF20, 0x0))(classnum, entnum, offset); + return reinterpret_cast(SELECT_VALUE(0x530E30, 0x56AF20))(classnum, entnum, offset); } void* MT_Alloc(const int numBytes, const int type) @@ -260,104 +195,23 @@ namespace game return scrMemTreeGlob + 12 * size_t(MT_AllocIndex(numBytes, type)); } - __declspec(naked) dvar_t* dvar_find_malleable_var(const char* dvar_name) - { - static DWORD func = 0x531320; - - __asm - { - mov edi, dvar_name - call func - retn - } - } - dvar_t* Dvar_FindVar(const char* dvarName) { - if (is_dedi()) - { - return dvar_find_malleable_var(dvarName); - } - - return reinterpret_cast - (SELECT_VALUE(0x539550, 0x5BDCC0, 0x0))(dvarName); - } - - __declspec(naked) const dvar_t* dvar_register_variant_dedicated(const char* dvar_name, unsigned char type, - unsigned __int16 flags, DvarValue value, DvarLimits domain, const char* description) - { - static DWORD func = 0x531F70; - - __asm - { - push eax - pushad - - mov edi, [esp + 0x24 + 0x28] // description - mov eax, [esp + 0x24 + 0x4] // dvarName - - push [esp + 0x24 + 0x24] // domain - push [esp + 0x24 + 0x24] // domain - - push [esp + 0x24 + 0x24] // value - push [esp + 0x24 + 0x24] // value - push [esp + 0x24 + 0x24] // value - push [esp + 0x24 + 0x24] // value - - push [esp + 0x24 + 0x24] // flags - push [esp + 0x24 + 0x24] // type - - call func - add esp, 0x20 - - mov [esp + 0x20], eax // result - popad - pop eax - - retn - } + return reinterpret_cast(SELECT_VALUE(0x539550, 0x5BDCC0))(dvarName); } const dvar_t* Dvar_RegisterFloat(const char* dvarName, float value, float min, float max, unsigned __int16 flags, const char* description) { - if (!is_dedi()) - { - return reinterpret_cast - (SELECT_VALUE(0x4F9CC0, 0x5BEA80, 0x0))(dvarName, value, min, max, flags, description); - } - - DvarLimits domain; - DvarValue dvar_value; - - domain.value.min = min; - domain.value.max = max; - - dvar_value.value = value; - - return dvar_register_variant_dedicated(dvarName, DVAR_TYPE_FLOAT, - flags, dvar_value, domain, description); + return reinterpret_cast // + (SELECT_VALUE(0x4F9CC0, 0x5BEA80))(dvarName, value, min, max, flags, description); } const dvar_t* Dvar_RegisterInt(const char* dvarName, int value, int min, int max, unsigned __int16 flags, const char* description) { - if (!is_dedi()) - { - return reinterpret_cast - (SELECT_VALUE(0x48CD40, 0x5BEA40, 0x0))(dvarName, value, min, max, flags, description); - } - - DvarLimits domain; - DvarValue dvar_value; - - domain.integer.min = min; - domain.integer.max = max; - - dvar_value.integer = value; - - return dvar_register_variant_dedicated(dvarName, DVAR_TYPE_INT, - flags, dvar_value, domain, description); + return reinterpret_cast // + (SELECT_VALUE(0x48CD40, 0x5BEA40))(dvarName, value, min, max, flags, description); } void IncInParam() @@ -400,18 +254,17 @@ namespace game scr_entref_t Scr_GetEntityIdRef(const unsigned int id) { - static auto class_array = reinterpret_cast(SELECT_VALUE(0x19AFC84, 0x1E72184, 0x1D3C804)); - static auto ent_array = reinterpret_cast(SELECT_VALUE(0x19AFC82, 0x1E72182, 0x1D3C802)); + static auto class_array = reinterpret_cast(SELECT_VALUE(0x19AFC84, 0x1E72184)); + static auto ent_array = reinterpret_cast(SELECT_VALUE(0x19AFC82, 0x1E72182)); - scr_entref_t result{}; + scr_entref_t result; result.raw.classnum = static_cast(class_array[2 * id]) >> 8; result.raw.entnum = ent_array[4 * id]; return result; } - __declspec(naked) void scr_notify_id_multiplayer(unsigned int id, unsigned int string_value, - unsigned int paramcount) + __declspec(naked) void scr_notify_id_multiplayer(unsigned int id, unsigned int string_value, unsigned int paramcount) { static DWORD func = 0x56B5E0; @@ -426,8 +279,7 @@ namespace game } } - __declspec(naked) void scr_notify_id_singleplayer(unsigned int id, unsigned int string_value, - unsigned int paramcount) + __declspec(naked) void scr_notify_id_singleplayer(unsigned int id, unsigned int string_value, unsigned int paramcount) { static DWORD func = 0x610980; @@ -448,66 +300,21 @@ namespace game { scr_notify_id_multiplayer(id, stringValue, paramcount); } - else if (is_sp()) - { - scr_notify_id_singleplayer(id, stringValue, paramcount); - } else { - reinterpret_cast(0x4EFAA0) - (id, stringValue, paramcount); - } - } - - __declspec(naked) int scr_set_object_field_dedicated(unsigned int classnum, int entnum, int _offset) - { - static DWORD func = 0x4B15C0; - - __asm - { - mov ecx, _offset - mov eax, entnum - push classnum - call func - add esp, 4h - retn + scr_notify_id_singleplayer(id, stringValue, paramcount); } } int Scr_SetObjectField(const unsigned int classnum, const int entnum, const int offset) { - if (is_dedi()) - { - return scr_set_object_field_dedicated(classnum, entnum, offset); - } - return reinterpret_cast // - (SELECT_VALUE(0x42CAD0, 0x52BCC0, 0x0))(classnum, entnum, offset); - } - - __declspec(naked) void scr_add_string_dedicated(const char* value) - { - static DWORD func = 0x4F1010; - - __asm - { - mov edi, value - call func - retn - } + (SELECT_VALUE(0x42CAD0, 0x52BCC0))(classnum, entnum, offset); } void Scr_AddString(const char* value) { - if (is_dedi()) - { - scr_add_string_dedicated(value); - } - else - { - reinterpret_cast - (SELECT_VALUE(0x4A5600, 0x56AC00, 0x0))(value); - } + reinterpret_cast (SELECT_VALUE(0x4A5600, 0x56AC00))(value); } void Scr_AddInt(int value) @@ -533,7 +340,7 @@ namespace game unsigned int sl_get_canonical_string(const char* string) { - static DWORD func = SELECT_VALUE(0x610750, 0x56B040, 0x0); + static DWORD func = SELECT_VALUE(0x610750, 0x56B040); unsigned int result{}; __asm @@ -548,31 +355,9 @@ namespace game return result; } - unsigned int sl_get_canonical_dedicated(const char* string) - { - static DWORD func = 0x4F1620; - unsigned int result{}; - - __asm - { - pushad - mov esi, string - call func - mov result, eax - popad - } - - return result; - } - unsigned int SL_GetCanonicalString(const char* str) { - if (!is_dedi()) - { - return sl_get_canonical_string(str); - } - - return sl_get_canonical_dedicated(str); + return sl_get_canonical_string(str); } __declspec(naked) void sv_send_client_game_state_mp(mp::client_t* /*client*/) @@ -601,12 +386,7 @@ namespace game int SV_IsTestClient(int clientNum) { - assert(clientNum < *svs_clientCount); - - if (is_dedi()) - { - return dedi::svs_clients[clientNum].bIsTestClient; - } + assert(clientNum < MAX_CLIENTS); if (is_mp()) { @@ -620,8 +400,7 @@ namespace game { if (is_mp()) { - reinterpret_cast - (0x570980)(drop, reason, tellThem); + reinterpret_cast(0x570980)(drop, reason, tellThem); } } @@ -645,25 +424,9 @@ namespace game } } - __declspec(naked) void client_command_dedicated(int client_num) - { - static DWORD func = 0x47EA40; - - __asm - { - mov edi, client_num - call func - retn - } - } - void ClientCommand(int clientNum) { - if (is_dedi()) - { - client_command_dedicated(clientNum); - } - else if (is_mp()) + if (is_mp()) { reinterpret_cast(0x502CB0)(clientNum); } @@ -679,61 +442,17 @@ namespace game addr->type = type; } - __declspec(naked) void cbuf_add_text_dedicated(LocalClientNum_t local_client_num, const char* text) - { - static DWORD func = 0x4CB5D0; - - __asm - { - mov eax, text - push local_client_num - call func - add esp, 4h - retn - } - } - void Cbuf_AddText(LocalClientNum_t localClientNum, const char* text) { - if (is_dedi()) - { - cbuf_add_text_dedicated(localClientNum, text); - } - else - { - reinterpret_cast - (SELECT_VALUE(0x457C90, 0x545680, 0x0))(localClientNum, text); - } - } - - void teleport_player_dedicated(gentity_s* player, float* origin, float* angles) - { - static DWORD func = 0x48B840; - - __asm - { - pushad - - mov eax, player - mov ecx, origin - push angles - call func - add esp, 4h - - popad - } + reinterpret_cast // + (SELECT_VALUE(0x457C90, 0x545680))(localClientNum, text); } void TeleportPlayer(gentity_s* player, float* origin, float* angles) { - if (is_dedi()) + if (is_mp()) { - teleport_player_dedicated(player, origin, angles); - } - else if (is_mp()) - { - reinterpret_cast - (0x50D840)(player, origin, angles); + reinterpret_cast(0x50D840)(player, origin, angles); } } @@ -744,7 +463,7 @@ namespace game { reinterpret_cast(0x456DC0)(localClientNum, msg); } - else if (is_sp()) + else { reinterpret_cast(0x4228A0)(localClientNum, msg, flags); } @@ -752,7 +471,7 @@ namespace game void Sys_EnterCriticalSection(CriticalSection critSect) { - assert(static_cast(critSect) < + assert(static_cast(critSect) < // static_cast(CRITSECT_COUNT)); EnterCriticalSection(&s_criticalSection[critSect]); @@ -760,7 +479,7 @@ namespace game void Sys_LeaveCriticalSection(CriticalSection critSect) { - assert(static_cast(critSect) < + assert(static_cast(critSect) < // static_cast(CRITSECT_COUNT)); LeaveCriticalSection(&s_criticalSection[critSect]); @@ -768,7 +487,7 @@ namespace game bool Sys_TryEnterCriticalSection(CriticalSection critSect) { - assert(static_cast(critSect) < + assert(static_cast(critSect) < // static_cast(CRITSECT_COUNT)); return TryEnterCriticalSection(&s_criticalSection[critSect]) != FALSE; @@ -809,30 +528,9 @@ namespace game return id == *threadId[THREAD_CONTEXT_SERVER]; } - void fs_fclose_file_dedicated(int h) - { - static DWORD func = 0x524910; - - __asm - { - pushad - mov eax, h - call func - popad - } - } - void FS_FCloseFile(int h) { - if (is_dedi()) - { - fs_fclose_file_dedicated(h); - } - else - { - reinterpret_cast - (SELECT_VALUE(0x415160, 0x5AF170, 0x0))(h); - } + reinterpret_cast(SELECT_VALUE(0x415160, 0x5AF170))(h); } bool FS_Initialized() @@ -840,38 +538,15 @@ namespace game return (*fs_searchpaths != nullptr); } - int fs_handle_for_file_dedicated(FsThread thread) - { - static DWORD func = 0x5245F0; - auto result = 0; - - __asm - { - pushad - mov edi, thread - call func - mov result, eax - popad - } - - return result; - } - int FS_HandleForFile(FsThread thread) { - if (is_dedi()) - { - return fs_handle_for_file_dedicated(thread); - } - - return reinterpret_cast - (SELECT_VALUE(0x46B1C0, 0x5AEE50, 0x0))(thread); + return reinterpret_cast(SELECT_VALUE(0x46B1C0, 0x5AEE50))(thread); } int fs_fopen_file_read_for_thread_singleplayer(const char* filename, int* file, FsThread thread) { static DWORD func = 0x627F20; - auto result = 0; + int result{}; __asm { @@ -893,29 +568,7 @@ namespace game int fs_fopen_file_read_for_thread_multiplayer(const char* filename, int* file, FsThread thread) { static DWORD func = 0x5B1990; - auto result = 0; - - __asm - { - pushad - - mov edx, filename - push thread - push file - call func - add esp, 0x8 - mov result, eax - - popad - } - - return result; - } - - int fs_fopen_file_read_for_thread_dedicated(const char* filename, int* file, FsThread thread) - { - static DWORD func = 0x524E30; - auto result = 0; + int result{}; __asm { @@ -941,40 +594,12 @@ namespace game return fs_fopen_file_read_for_thread_singleplayer(filename, file, thread); } - if (is_mp()) - { - return fs_fopen_file_read_for_thread_multiplayer(filename, file, thread); - } - - return fs_fopen_file_read_for_thread_dedicated(filename, file, thread); - } - - int fs_create_path_directory(char* OSPath) - { - static DWORD func = 0x5247D0; - auto result = 0; - - __asm - { - pushad - mov edi, OSPath - call func - mov result, eax - popad - } - - return result; + return fs_fopen_file_read_for_thread_multiplayer(filename, file, thread); } int FS_CreatePath(char* OSPath) { - if (is_dedi()) - { - return fs_create_path_directory(OSPath); - } - - return reinterpret_cast - (SELECT_VALUE(0x4F5AB0, 0x5AF060, 0x0))(OSPath); + return reinterpret_cast(SELECT_VALUE(0x4F5AB0, 0x5AF060))(OSPath); } void FS_CheckFileSystemStarted() @@ -1005,73 +630,65 @@ namespace game return get_mode() == launcher::mode::singleplayer; } - bool is_dedi() - { - return get_mode() == launcher::mode::server; - } - void initialize(const launcher::mode _mode) { mode = _mode; - native::Cmd_AddCommand = native::Cmd_AddCommand_t(SELECT_VALUE(0x558820, 0x545DF0, 0)); - native::Cmd_RemoveCommand = native::Cmd_RemoveCommand_t(SELECT_VALUE(0x443A30, 0x545E20, 0x4CC060)); + native::Cmd_AddCommand = native::Cmd_AddCommand_t(SELECT_VALUE(0x558820, 0x545DF0)); + native::Cmd_RemoveCommand = native::Cmd_RemoveCommand_t(SELECT_VALUE(0x443A30, 0x545E20)); - native::Com_Error = native::Com_Error_t(SELECT_VALUE(0x425540, 0x555450, 0x4D93F0)); - native::Com_Filter = native::Com_Filter_t(SELECT_VALUE(0x44EFF0, 0x5B7C30, 0x0)); + native::Com_Error = native::Com_Error_t(SELECT_VALUE(0x425540, 0x555450)); + native::Com_Filter = native::Com_Filter_t(SELECT_VALUE(0x44EFF0, 0x5B7C30)); - native::DB_LoadXAssets = native::DB_LoadXAssets_t(SELECT_VALUE(0x48A8E0, 0x4CD020, 0x44F770)); - native::DB_FindXAssetHeader = native::DB_FindXAssetHeader_t(SELECT_VALUE(0x4FF000, 0x4CA620, 0x44E7A0)); + native::DB_LoadXAssets = native::DB_LoadXAssets_t(SELECT_VALUE(0x48A8E0, 0x4CD020)); + native::DB_FindXAssetHeader = native::DB_FindXAssetHeader_t(SELECT_VALUE(0x4FF000, 0x4CA620)); - native::Dvar_RegisterBool = native::Dvar_RegisterBool_t(SELECT_VALUE(0x4914D0, 0x5BE9F0, 0x0)); - native::Dvar_RegisterString = native::Dvar_RegisterString_t(SELECT_VALUE(0x5197F0, 0x5BEC90, 0x0)); + native::Dvar_RegisterBool = native::Dvar_RegisterBool_t(SELECT_VALUE(0x4914D0, 0x5BE9F0)); + native::Dvar_RegisterString = native::Dvar_RegisterString_t(SELECT_VALUE(0x5197F0, 0x5BEC90)); - native::Dvar_SetIntByName = native::Dvar_SetIntByName_t(SELECT_VALUE(0x5396B0, 0x5BF560, 0x0)); - native::Dvar_SetFromStringByName = native::Dvar_SetFromStringByName_t( - SELECT_VALUE(0x4DD090, 0x5BF740, 0x518DF0)); - native::Dvar_SetString = native::Dvar_SetString_t(SELECT_VALUE(0x540570, 0x5BF3E0, 0x0)); + native::Dvar_SetIntByName = native::Dvar_SetIntByName_t(SELECT_VALUE(0x5396B0, 0x5BF560)); + native::Dvar_SetFromStringByName = native::Dvar_SetFromStringByName_t(SELECT_VALUE(0x4DD090, 0x5BF740)); + native::Dvar_SetString = native::Dvar_SetString_t(SELECT_VALUE(0x540570, 0x5BF3E0)); - native::Dvar_ForEach = native::Dvar_ForEach_t(SELECT_VALUE(0x536720, 0x5BFFB0, 0x0)); + native::Dvar_ForEach = native::Dvar_ForEach_t(SELECT_VALUE(0x536720, 0x5BFFB0)); - native::Dvar_DisplayableValue = native::Dvar_DisplayableValue_t(SELECT_VALUE(0x4AB1D0, 0x5BD260, 0x0)); - native::Dvar_DisplayableLatchedValue = native::Dvar_DisplayableLatchedValue_t(SELECT_VALUE(0x464F50, 0x5BD290, 0x0)); + native::Dvar_DisplayableValue = native::Dvar_DisplayableValue_t(SELECT_VALUE(0x4AB1D0, 0x5BD260)); + native::Dvar_DisplayableLatchedValue = native::Dvar_DisplayableLatchedValue_t(SELECT_VALUE(0x464F50, 0x5BD290)); - native::G_RunFrame = native::G_RunFrame_t(SELECT_VALUE(0x52EAA0, 0x50CB70, 0x48AD60)); - native::G_GetWeaponForName = native::G_GetWeaponForName_t(SELECT_VALUE(0x495E40, 0x531070, 0x0)); + native::G_RunFrame = native::G_RunFrame_t(SELECT_VALUE(0x52EAA0, 0x50CB70)); + native::G_GetWeaponForName = native::G_GetWeaponForName_t(SELECT_VALUE(0x495E40, 0x531070)); - native::MSG_ReadData = native::MSG_ReadData_t(SELECT_VALUE(0, 0x5592A0, 0)); + native::MSG_ReadData = native::MSG_ReadData_t(SELECT_VALUE(0, 0x5592A0)); - native::MT_AllocIndex = native::MT_AllocIndex_t(SELECT_VALUE(0x4B9610, 0x562080, 0x4E6C30)); + native::MT_AllocIndex = native::MT_AllocIndex_t(SELECT_VALUE(0x4B9610, 0x562080)); - native::RemoveRefToValue = native::RemoveRefToValue_t(SELECT_VALUE(0x477EA0, 0x565730, 0x4E8A40)); + native::RemoveRefToValue = native::RemoveRefToValue_t(SELECT_VALUE(0x477EA0, 0x565730)); - native::SL_GetStringOfSize = native::SL_GetStringOfSize_t(SELECT_VALUE(0x4E13F0, 0x564650, 0x4E7490)); + native::SL_GetStringOfSize = native::SL_GetStringOfSize_t(SELECT_VALUE(0x4E13F0, 0x564650)); - native::Scr_AddEntityNum = native::Scr_AddEntityNum_t(SELECT_VALUE(0x0, 0x56ABC0, 0x4EA2F0)); + native::Scr_AddEntityNum = native::Scr_AddEntityNum_t(SELECT_VALUE(0x0, 0x56ABC0)); - native::Scr_Notify = native::Scr_Notify_t(SELECT_VALUE(0x4895B0, 0x52B190, 0x0)); - native::Scr_NotifyLevel = native::Scr_NotifyLevel_t(SELECT_VALUE(0x445E10, 0x56B6B0, 0x0)); - native::Scr_GetNumParam = native::Scr_GetNumParam_t(SELECT_VALUE(0x4C6FE0, 0x56AA10, 0x0)); - native::Scr_GetString = native::Scr_GetString_t(SELECT_VALUE(0x497530, 0x56A3D0, 0x0)); + native::Scr_Notify = native::Scr_Notify_t(SELECT_VALUE(0x4895B0, 0x52B190)); + native::Scr_NotifyLevel = native::Scr_NotifyLevel_t(SELECT_VALUE(0x445E10, 0x56B6B0)); + native::Scr_GetNumParam = native::Scr_GetNumParam_t(SELECT_VALUE(0x4C6FE0, 0x56AA10)); + native::Scr_GetString = native::Scr_GetString_t(SELECT_VALUE(0x497530, 0x56A3D0)); - native::Sys_ShowConsole = native::Sys_ShowConsole_t(SELECT_VALUE(0x470AF0, 0x5CF590, 0)); - native::Sys_Error = native::Sys_Error_t(SELECT_VALUE(0x490D90, 0x5CC3B0, 0x539590)); - native::Sys_Milliseconds = native::Sys_Milliseconds_t(SELECT_VALUE(0x4A1610, 0x5CE740, 0x53B900)); + native::Sys_ShowConsole = native::Sys_ShowConsole_t(SELECT_VALUE(0x470AF0, 0x5CF590)); + native::Sys_Error = native::Sys_Error_t(SELECT_VALUE(0x490D90, 0x5CC3B0)); + native::Sys_Milliseconds = native::Sys_Milliseconds_t(SELECT_VALUE(0x4A1610, 0x5CE740)); - native::VM_Notify = native::VM_Notify_t(SELECT_VALUE(0x610200, 0x569720, 0x4EF450)); + native::VM_Notify = native::VM_Notify_t(SELECT_VALUE(0x610200, 0x569720)); - native::BG_NetDataChecksum = native::BG_NetDataChecksum_t(SELECT_VALUE(0x0, 0x41BB20, 0x0)); + native::BG_NetDataChecksum = native::BG_NetDataChecksum_t(SELECT_VALUE(0x0, 0x41BB20)); - native::LiveStorage_GetPersistentDataDefVersion = native::LiveStorage_GetPersistentDataDefVersion_t( - SELECT_VALUE(0x0, 0x548D60, 0x4D0390)); + native::LiveStorage_GetPersistentDataDefVersion = native::LiveStorage_GetPersistentDataDefVersion_t(SELECT_VALUE(0x0, 0x548D60)); - native::LiveStorage_GetPersistentDataDefFormatChecksum = native::LiveStorage_GetPersistentDataDefFormatChecksum_t( - SELECT_VALUE(0x0, 0x548D80, 0x4D03D0)); + native::LiveStorage_GetPersistentDataDefFormatChecksum = native::LiveStorage_GetPersistentDataDefFormatChecksum_t(SELECT_VALUE(0x0, 0x548D80)); - native::SV_DirectConnect = native::SV_DirectConnect_t(SELECT_VALUE(0x0, 0x572750, 0x4F74C0)); - native::SV_ClientEnterWorld = native::SV_ClientEnterWorld_t(SELECT_VALUE(0x0, 0x571100, 0x0)); - native::SV_Cmd_TokenizeString = native::SV_Cmd_TokenizeString_t(SELECT_VALUE(0x0, 0x545D40, 0x0)); - native::SV_Cmd_EndTokenizedString = native::SV_Cmd_EndTokenizedString_t(SELECT_VALUE(0x0, 0x545D70, 0x0)); + native::SV_DirectConnect = native::SV_DirectConnect_t(SELECT_VALUE(0x0, 0x572750)); + native::SV_ClientEnterWorld = native::SV_ClientEnterWorld_t(SELECT_VALUE(0x0, 0x571100)); + native::SV_Cmd_TokenizeString = native::SV_Cmd_TokenizeString_t(SELECT_VALUE(0x0, 0x545D40)); + native::SV_Cmd_EndTokenizedString = native::SV_Cmd_EndTokenizedString_t(SELECT_VALUE(0x0, 0x545D70)); native::mp::SV_GameSendServerCommand = native::mp::SV_GameSendServerCommand_t(0x573220); native::mp::SV_GetGuid = native::mp::SV_GetGuid_t(0x573990); @@ -1080,82 +697,78 @@ namespace game native::sp::TeleportPlayer = native::sp::TeleportPlayer_t(0x4CCEE0); - native::XUIDToString = native::XUIDToString_t(SELECT_VALUE(0x4FAA30, 0x55CC20, 0x0)); + native::XUIDToString = native::XUIDToString_t(SELECT_VALUE(0x4FAA30, 0x55CC20)); - native::SEH_LocalizeTextMessage = native::SEH_LocalizeTextMessage_t( - SELECT_VALUE(0x41EA20, 0x57E240, 0x0)); + native::SEH_LocalizeTextMessage = native::SEH_LocalizeTextMessage_t(SELECT_VALUE(0x41EA20, 0x57E240)); - native::CM_TransformedCapsuleTrace = native::CM_TransformedCapsuleTrace_t( - SELECT_VALUE(0x4F9B80, 0x541340, 0x0)); + native::CM_TransformedCapsuleTrace = native::CM_TransformedCapsuleTrace_t(SELECT_VALUE(0x4F9B80, 0x541340)); - native::PM_WeaponUseAmmo = native::PM_WeaponUseAmmo_t(SELECT_VALUE(0x463F80, 0x42E930, 0x0)); - native::PM_playerTrace = native::PM_playerTrace_t(SELECT_VALUE(0x4CE600, 0x421F00, 0x0)); - native::PM_trace = native::PM_trace_t(SELECT_VALUE(0x544BF0, 0x41CEB0, 0x0)); + native::PM_WeaponUseAmmo = native::PM_WeaponUseAmmo_t(SELECT_VALUE(0x463F80, 0x42E930)); + native::PM_playerTrace = native::PM_playerTrace_t(SELECT_VALUE(0x4CE600, 0x421F00)); + native::PM_trace = native::PM_trace_t(SELECT_VALUE(0x544BF0, 0x41CEB0)); - native::Jump_ClearState = native::Jump_ClearState_t(SELECT_VALUE(0x514CE0, 0x4160F0, 0x0)); + native::Jump_ClearState = native::Jump_ClearState_t(SELECT_VALUE(0x514CE0, 0x4160F0)); - native::Vec3Normalize = native::Vec3Normalize_t(SELECT_VALUE(0x536A20, 0x415EE0, 0x0)); + native::Vec3Normalize = native::Vec3Normalize_t(SELECT_VALUE(0x536A20, 0x415EE0)); - native::Cmd_ExecuteSingleCommand = native::Cmd_ExecuteSingleCommand_t( - SELECT_VALUE(0x4D6960, 0x5462B0, 0x4CC360)); + native::Cmd_ExecuteSingleCommand = native::Cmd_ExecuteSingleCommand_t(SELECT_VALUE(0x4D6960, 0x5462B0)); - native::Com_Quit_f = native::Com_Quit_f_t(SELECT_VALUE(0x4F48B0, 0x5556B0, 0x4D95B0)); + native::Com_Quit_f = native::Com_Quit_f_t(SELECT_VALUE(0x4F48B0, 0x5556B0)); - native::FS_Printf = native::FS_Printf_t(SELECT_VALUE(0x421E90, 0x5AF7C0, 0x5255A0)); + native::FS_Printf = native::FS_Printf_t(SELECT_VALUE(0x421E90, 0x5AF7C0)); - native::player_die = native::player_die_t(SELECT_VALUE(0x0, 0x503460, 0x47F4D0)); + native::player_die = native::player_die_t(SELECT_VALUE(0x0, 0x503460)); - native::_longjmp = reinterpret_cast(SELECT_VALUE(0x73AC20, 0x7363BC, 0x655558)); + native::_longjmp = reinterpret_cast(SELECT_VALUE(0x73AC20, 0x7363BC)); - native::sv_cmd_args = reinterpret_cast(SELECT_VALUE(0x1757218, 0x1CAA998, 0x1B5E7D8)); - native::cmd_args = reinterpret_cast(SELECT_VALUE(0x1750750, 0x1C978D0, 0x1B455F8)); + native::sv_cmd_args = reinterpret_cast(SELECT_VALUE(0x1757218, 0x1CAA998)); + native::cmd_args = reinterpret_cast(SELECT_VALUE(0x1750750, 0x1C978D0)); - native::scrVarGlob = reinterpret_cast(SELECT_VALUE(0x19AFC80, 0x1E72180, 0x1D3C800)); - native::scrMemTreePub = reinterpret_cast(SELECT_VALUE(0x196FB00, 0x1E32000, 0x1C152A4)); - native::scrMemTreeGlob = reinterpret_cast(SELECT_VALUE(0x186DA00, 0x1D6FF00, 0x1C16600)); + native::scrVarGlob = reinterpret_cast(SELECT_VALUE(0x19AFC80, 0x1E72180)); + native::scrMemTreePub = reinterpret_cast(SELECT_VALUE(0x196FB00, 0x1E32000)); + native::scrMemTreeGlob = reinterpret_cast(SELECT_VALUE(0x186DA00, 0x1D6FF00)); - native::scr_VarPub = reinterpret_cast(SELECT_VALUE(0x0, 0x208E188, 0x1CD8720)); - native::scr_VmPub = reinterpret_cast(SELECT_VALUE(0x1BF2580, 0x20B4A80, 0x1F5B080)); + native::scr_VarPub = reinterpret_cast(SELECT_VALUE(0x0, 0x208E188)); + native::scr_VmPub = reinterpret_cast(SELECT_VALUE(0x1BF2580, 0x20B4A80)); - native::g_script_error_level = reinterpret_cast(SELECT_VALUE(0x1BEFCFC, 0x20B21FC, 0x1F5B058)); - native::g_script_error = reinterpret_cast(SELECT_VALUE(0x1BF1D18, 0x20B4218, 0x1F5A818)); + native::g_script_error_level = reinterpret_cast(SELECT_VALUE(0x1BEFCFC, 0x20B21FC)); + native::g_script_error = reinterpret_cast(SELECT_VALUE(0x1BF1D18, 0x20B4218)); - native::g_classMap = reinterpret_cast(SELECT_VALUE(0x92D140, 0x8B4300, 0x7C0408)); + native::g_classMap = reinterpret_cast(SELECT_VALUE(0x92D140, 0x8B4300)); - native::svs_clientCount = reinterpret_cast(SELECT_VALUE(0x0, 0x4B5CF8C, 0x4A12E8C)); + native::svs_clientCount = reinterpret_cast(SELECT_VALUE(0x0, 0x4B5CF8C)); - native::levelEntityId = reinterpret_cast(SELECT_VALUE(0x1BCBCA4, 0x208E1A4, 0x1CD873C)); + native::levelEntityId = reinterpret_cast(SELECT_VALUE(0x1BCBCA4, 0x208E1A4)); native::mp::svs_clients = reinterpret_cast(0x4B5CF90); - native::dedi::svs_clients = reinterpret_cast(0x4A12E90); - native::g_entities = reinterpret_cast(SELECT_VALUE(0, 0x1A66E28, 0x191B900)); + native::g_entities = reinterpret_cast(0x1A66E28); native::sp::g_entities = reinterpret_cast(0x1197AD8); native::sp::g_clients = reinterpret_cast(0x1381D48); - native::level = reinterpret_cast(SELECT_VALUE(0x0, 0x1C6D4D8, 0x1B21A20)); + native::mp::level = reinterpret_cast(0x1C6D4D8); - native::deferredQueue = reinterpret_cast(SELECT_VALUE(0x0, 0x1D55438, 0x0)); + native::deferredQueue = reinterpret_cast(SELECT_VALUE(0x0, 0x1D55438)); - native::com_codeTimeScale = reinterpret_cast(SELECT_VALUE(0x1769F1C, 0x1CEF554, 0x1B9CEC0)); + native::com_codeTimeScale = reinterpret_cast(SELECT_VALUE(0x1769F1C, 0x1CEF554)); - native::s_criticalSection = reinterpret_cast(SELECT_VALUE(0x1CD5638, 0x5A91048, 0x593FF98)); + native::s_criticalSection = reinterpret_cast(SELECT_VALUE(0x1CD5638, 0x5A91048)); - native::logfile = reinterpret_cast(SELECT_VALUE(0x176B534, 0x1CF0B78, 0x1B9E4C8)); + native::logfile = reinterpret_cast(SELECT_VALUE(0x176B534, 0x1CF0B78)); - native::fs_searchpaths = reinterpret_cast(SELECT_VALUE(0x1C2FE78, 0x59BA858, 0x62F4F60)); - native::fs_gamedir = reinterpret_cast(SELECT_VALUE(0x1C2B220, 0x59A98F8, 0x585A4D8)); - native::fsh = reinterpret_cast(SELECT_VALUE(0x1C2B540, 0x59B5F20, 0x5866AF8)); - native::com_fileAccessed = reinterpret_cast(SELECT_VALUE(0x1C2B328, 0x59A9A04, 0x585A5E0)); + native::fs_searchpaths = reinterpret_cast(SELECT_VALUE(0x1C2FE78, 0x59BA858)); + native::fs_gamedir = reinterpret_cast(SELECT_VALUE(0x1C2B220, 0x59A98F8)); + native::fsh = reinterpret_cast(SELECT_VALUE(0x1C2B540, 0x59B5F20)); + native::com_fileAccessed = reinterpret_cast(SELECT_VALUE(0x1C2B328, 0x59A9A04)); - native::threadId = reinterpret_cast(SELECT_VALUE(0x18576C8, 0x1D6E448, 0x1C14BDC)); + native::threadId = reinterpret_cast(SELECT_VALUE(0x18576C8, 0x1D6E448)); - native::initialized_0 = reinterpret_cast(SELECT_VALUE(0x1CE1CA0, 0x5AA3058, 0x62F4F9C)); - native::sys_timeBase = reinterpret_cast(SELECT_VALUE(0x1CE1C98, 0x5AA3050, 0x5950CE4)); - native::sys_counterBase = reinterpret_cast(SELECT_VALUE(0x1CE1C90, 0x5AA3048, 0x5950CE8)); + native::initialized_0 = reinterpret_cast(SELECT_VALUE(0x1CE1CA0, 0x5AA3058)); + native::sys_timeBase = reinterpret_cast(SELECT_VALUE(0x1CE1C98, 0x5AA3050)); + native::sys_counterBase = reinterpret_cast(SELECT_VALUE(0x1CE1C90, 0x5AA3048)); - native::dvarCount = reinterpret_cast(SELECT_VALUE(0x1C42398, 0x59CCDD8, 0x5879644)); - native::sortedDvars = reinterpret_cast(SELECT_VALUE(0x1C423C0, 0x59CCE00, 0x587C5D8)); + native::dvarCount = reinterpret_cast(SELECT_VALUE(0x1C42398, 0x59CCDD8)); + native::sortedDvars = reinterpret_cast(SELECT_VALUE(0x1C423C0, 0x59CCE00)); } } diff --git a/src/game/game.hpp b/src/game/game.hpp index e028e45..a7054eb 100644 --- a/src/game/game.hpp +++ b/src/game/game.hpp @@ -3,7 +3,7 @@ #include "structs.hpp" #include "launcher/launcher.hpp" -#define SELECT_VALUE(sp, mp, dedi) (game::is_sp() ? (sp) : (game::is_mp() ? (mp) : (dedi))) +#define SELECT_VALUE(sp, mp) (game::is_sp() ? (sp) : (mp)) #define SERVER_CD_KEY "Open-IW5-CD-Key" @@ -181,14 +181,13 @@ namespace game extern scr_classStruct_t* g_classMap; + constexpr auto MAX_CLIENTS = 18; extern int* svs_clientCount; constexpr auto MAX_GENTITIES = 2048u; constexpr auto ENTITYNUM_NONE = MAX_GENTITIES - 1u; extern gentity_s* g_entities; - extern level_locals_t* level; - extern DeferredQueue* deferredQueue; extern float* com_codeTimeScale; @@ -232,11 +231,8 @@ namespace game extern SV_GameSendServerCommand_t SV_GameSendServerCommand; extern client_t* svs_clients; - } - namespace dedi - { - extern client_t* svs_clients; + extern level_locals_t* level; } namespace sp @@ -317,7 +313,6 @@ namespace game bool is_mp(); bool is_sp(); - bool is_dedi(); void initialize(launcher::mode mode); } diff --git a/src/game/structs.hpp b/src/game/structs.hpp index ca4d9b9..17af678 100644 --- a/src/game/structs.hpp +++ b/src/game/structs.hpp @@ -1354,23 +1354,6 @@ namespace game static_assert(sizeof(client_t) == 0x78698); } - namespace dedi - { - struct client_t - { - clientHeader_t header; - const char* dropReason; - char userinfo[1024]; - unsigned char __pad0[0x4123E]; - unsigned __int16 scriptId; - int bIsTestClient; // 0x41CB0 - int serverId; - unsigned char __pad1[0x369D8]; - }; - - static_assert(sizeof(dedi::client_t) == 0x78690); - } - namespace sp { struct usercmd_s diff --git a/src/launcher/launcher.hpp b/src/launcher/launcher.hpp index 1db7482..ee0500d 100644 --- a/src/launcher/launcher.hpp +++ b/src/launcher/launcher.hpp @@ -9,7 +9,6 @@ public: none, singleplayer, multiplayer, - server, }; launcher(); diff --git a/src/loader/binary_loader.cpp b/src/loader/binary_loader.cpp index d67ec87..22ae41f 100644 --- a/src/loader/binary_loader.cpp +++ b/src/loader/binary_loader.cpp @@ -132,7 +132,7 @@ namespace binary_loader long)); std::string binary; - binary.resize(size_t(*size)); + binary.resize(static_cast(*size)); const auto new_data = reinterpret_cast(binary.data()); const auto old_data = reinterpret_cast(base.data()); @@ -149,12 +149,7 @@ namespace binary_loader std::string load(const launcher::mode mode) { - auto base = load_base(); - if (mode == launcher::mode::server) - { - return base; - } - + const auto base = load_base(); auto delta = load_delta(mode); delta = utils::compression::zstd::decompress(delta); return build_binary(base, delta); diff --git a/src/main.cpp b/src/main.cpp index 3d2731e..1d2acf6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -38,11 +38,6 @@ void verify_tls() launcher::mode detect_mode_from_arguments() { - if (utils::flags::has_flag("dedicated")) - { - return launcher::mode::server; - } - if (utils::flags::has_flag("multiplayer")) { return launcher::mode::multiplayer; diff --git a/src/module/branding.cpp b/src/module/branding.cpp index 2a7a823..2ff3c04 100644 --- a/src/module/branding.cpp +++ b/src/module/branding.cpp @@ -9,38 +9,27 @@ static char* com_get_build_version_stub() { static char buf[128]; - const auto version_number = SELECT_VALUE(0x1CD, 0x5EC0E, 0x5EC0E); + const auto version_number = SELECT_VALUE(0x1CD, 0x5EC0E); _snprintf_s(buf, _TRUNCATE, "%d %s", version_number, __DATE__); return buf; } -static int com_get_build_version_dedi_stub(char* buf, const char* fmt, int version_number, const char* /*date*/) -{ - return _snprintf_s(buf, 0x80, _TRUNCATE, fmt, version_number, __DATE__); -} - class branding final : public module { public: void post_load() override { - if (game::is_dedi()) this->patch_dedi(); - else this->add_branding(); + add_branding(); // gamedate dvar - utils::hook::set(SELECT_VALUE(0x5C223B, 0x50B0F4, 0x48844F), __DATE__); - } - - static void patch_dedi() - { - utils::hook(0x4DAB99, com_get_build_version_dedi_stub, HOOK_CALL).install()->quick(); + utils::hook::set(SELECT_VALUE(0x5C223B, 0x50B0F4), __DATE__); } static void add_branding() { - utils::hook(SELECT_VALUE(0x50BBD0, 0x53B4B0, 0x0), com_get_build_version_stub, HOOK_JUMP).install()->quick(); + utils::hook(SELECT_VALUE(0x50BBD0, 0x53B4B0), com_get_build_version_stub, HOOK_JUMP).install()->quick(); } }; diff --git a/src/module/bullet.cpp b/src/module/bullet.cpp index 3d27a76..417892e 100644 --- a/src/module/bullet.cpp +++ b/src/module/bullet.cpp @@ -47,10 +47,10 @@ void bullet::post_load() 0.0f, std::numeric_limits::max(), game::native::DVAR_CODINFO, "Set to a value greater than 0 to override the surface penetration depth"); - bullet_fire_addr = SELECT_VALUE(0x5B6442, 0x4F6C5C, 0x46CFFA); - utils::hook(SELECT_VALUE(0x5B643C, 0x4F6C56, 0x46CFF4), &bullet_fire_stub, HOOK_JUMP).install()->quick(); + bullet_fire_addr = SELECT_VALUE(0x5B6442, 0x4F6C5C); + utils::hook(SELECT_VALUE(0x5B643C, 0x4F6C56), &bullet_fire_stub, HOOK_JUMP).install()->quick(); - bg_get_surface_penetration_depth_hook.create(SELECT_VALUE(0x43BDE0, 0x42F4D0, 0x421610), &bg_get_surface_penetration_depth_stub); + bg_get_surface_penetration_depth_hook.create(SELECT_VALUE(0x43BDE0, 0x42F4D0), &bg_get_surface_penetration_depth_stub); } REGISTER_MODULE(bullet) diff --git a/src/module/chat.cpp b/src/module/chat.cpp index 89edd63..dd838ec 100644 --- a/src/module/chat.cpp +++ b/src/module/chat.cpp @@ -1,12 +1,11 @@ #include #include - #include "game/game.hpp" -#include - #include "game_log.hpp" +#include + static void notify_on_say(game::native::gentity_s* ent, int mode, const char* message) { const auto ent_num = ent->s.number; diff --git a/src/module/client_command.cpp b/src/module/client_command.cpp index 459b689..40e42f6 100644 --- a/src/module/client_command.cpp +++ b/src/module/client_command.cpp @@ -1,11 +1,12 @@ #include #include -#include - #include "game/game.hpp" + #include "command.hpp" #include "scheduler.hpp" +#include + static const game::native::dvar_t* g_cheats; class client_command final : public module diff --git a/src/module/command.cpp b/src/module/command.cpp index 1493813..7e139d9 100644 --- a/src/module/command.cpp +++ b/src/module/command.cpp @@ -4,12 +4,12 @@ #include #include -#include #include "command.hpp" -utils::memory::allocator command::allocator_; +static utils::memory::allocator allocator; + std::unordered_map> command::handlers; std::unordered_map> command::handlers_sv; std::unordered_map> command::handlers_sp_sv; @@ -84,7 +84,7 @@ std::string command::params_sv::join(const int index) const void command::add_raw(const char* name, void (*callback)()) { - game::native::Cmd_AddCommand(name, callback, command::allocator_.allocate()); + game::native::Cmd_AddCommand(name, callback, allocator.allocate()); } void command::add(const char* name, const std::function& callback) @@ -148,7 +148,7 @@ void command::main_handler() const auto command = utils::string::to_lower(params[0]); - if (const auto itr = command::handlers.find(command); itr != handlers.end()) + if (const auto itr = handlers.find(command); itr != handlers.end()) { itr->second(params); } @@ -158,7 +158,7 @@ void command::client_command_stub(int client_num) { const auto entity = &game::native::g_entities[client_num]; - if (entity->client == nullptr) + if (!entity->client) { return; } @@ -167,7 +167,7 @@ void command::client_command_stub(int client_num) const auto command = utils::string::to_lower(params[0]); - if (const auto itr = command::handlers_sv.find(command); itr != handlers_sv.end()) + if (const auto itr = handlers_sv.find(command); itr != handlers_sv.end()) { itr->second(entity, params); return; @@ -186,7 +186,7 @@ void command::client_command_sp(int client_num, const char* s) const auto command = utils::string::to_lower(params[0]); - if (const auto itr = command::handlers_sp_sv.find(command); itr != handlers_sp_sv.end()) + if (const auto itr = handlers_sp_sv.find(command); itr != handlers_sp_sv.end()) { itr->second(entity, params); } @@ -200,7 +200,7 @@ __declspec(naked) void command::client_command_sp_stub() push [esp + 0x20 + 0x8] push [esp + 0x20 + 0x8] - call command::client_command_sp + call client_command_sp add esp, 0x8 popad @@ -214,21 +214,6 @@ __declspec(naked) void command::client_command_sp_stub() } } -__declspec(naked) void command::client_command_dedi_stub() -{ - __asm - { - pushad - - push edi - call client_command_stub - add esp, 4h - - popad - retn - } -} - // Between ufo/noclip functions and their mp counterpart is that I reversed the 'CG' type void command::add_sp_commands() { @@ -358,21 +343,15 @@ void command::add_sp_commands() void command::post_load() { - if (game::is_dedi()) - { - utils::hook(0x4F96B5, &command::client_command_dedi_stub, HOOK_CALL).install()->quick(); // SV_ExecuteClientCommand - return; - } - add("quit", game::native::Com_Quit_f); if (game::is_mp()) { - utils::hook(0x57192A, &command::client_command_stub, HOOK_CALL).install()->quick(); // SV_ExecuteClientCommand + utils::hook(0x57192A, &client_command_stub, HOOK_CALL).install()->quick(); // SV_ExecuteClientCommand } else { - utils::hook(0x44BB50, &command::client_command_sp_stub, HOOK_JUMP).install()->quick(); + utils::hook(0x44BB50, &client_command_sp_stub, HOOK_JUMP).install()->quick(); utils::hook::nop(0x44BB55, 5); // Nop skipped instructions add_sp_commands(); } diff --git a/src/module/command.hpp b/src/module/command.hpp index f274609..fbb6fc0 100644 --- a/src/module/command.hpp +++ b/src/module/command.hpp @@ -1,5 +1,4 @@ #pragma once -#include class command final : public module { @@ -51,8 +50,6 @@ public: void post_load() override; private: - static utils::memory::allocator allocator_; - static std::unordered_map> handlers; static std::unordered_map> handlers_sv; static std::unordered_map> handlers_sp_sv; diff --git a/src/module/console.cpp b/src/module/console.cpp index 16acbff..4235f05 100644 --- a/src/module/console.cpp +++ b/src/module/console.cpp @@ -1,6 +1,5 @@ #include #include - #include "game/game.hpp" #include "scheduler.hpp" @@ -46,10 +45,7 @@ public: void post_load() override { - if (!game::is_dedi()) - { - game::native::Sys_ShowConsole(); - } + game::native::Sys_ShowConsole(); std::lock_guard _(this->mutex_); this->console_initialized_ = true; diff --git a/src/module/discord.cpp b/src/module/discord.cpp index 1cbdf68..0f1ec51 100644 --- a/src/module/discord.cpp +++ b/src/module/discord.cpp @@ -1,18 +1,17 @@ #include #include +#include "game/game.hpp" + +#include "scheduler.hpp" +#include "log_file.hpp" #include -#include "game/game.hpp" -#include "scheduler.hpp" - class discord final : public module { public: void post_load() override { - if (game::is_dedi()) return; - DiscordEventHandlers handlers; ZeroMemory(&handlers, sizeof(handlers)); handlers.ready = ready; @@ -45,7 +44,7 @@ private: static void errored(const int error_code, const char* message) { - printf("Discord: (%i) %s", error_code, message); + log_file::info("Discord: (%i) %s", error_code, message); } }; diff --git a/src/module/dvar.cpp b/src/module/dvar.cpp index ade16da..cc8c7f0 100644 --- a/src/module/dvar.cpp +++ b/src/module/dvar.cpp @@ -193,11 +193,6 @@ void dvar::list_f(const command::params& params) void dvar::post_load() { - if (game::is_dedi()) - { - return; - } - command::add("dvardump", dump_f); command::add("dvarlist", list_f); } diff --git a/src/module/dw.cpp b/src/module/dw.cpp index 83752ff..76cc5ed 100644 --- a/src/module/dw.cpp +++ b/src/module/dw.cpp @@ -1,4 +1,6 @@ #include +#include "game/game.hpp" + #include #include #include @@ -11,15 +13,13 @@ #include "game/demonware/services/bdDediRSAAuth.hpp" // 26 #include "game/demonware/services/bdSteamAuth.hpp" // 28 -#include "game/game.hpp" #include "dw.hpp" namespace demonware { namespace io { - int __stdcall send_to(const SOCKET s, const char* buf, const int len, const int flags, const sockaddr* to, - const int tolen) + int WINAPI send_to(const SOCKET s, const char* buf, const int len, const int flags, const sockaddr* to, const int tolen) { if (tolen == sizeof(sockaddr_in)) { @@ -31,7 +31,7 @@ namespace demonware return sendto(s, buf, len, flags, to, tolen); } - int __stdcall recv_from(const SOCKET s, char* buf, const int len, const int flags, sockaddr* from, int* fromlen) + int WINAPI recv_from(const SOCKET s, char* buf, const int len, const int flags, sockaddr* from, int* fromlen) { auto res = dw::recv_datagam_packet(s, buf, len, from, fromlen); if (res != 0) return res; @@ -41,7 +41,7 @@ namespace demonware return res; } - int __stdcall send(const SOCKET s, const char* buf, const int len, const int flags) + int WINAPI send(const SOCKET s, const char* buf, const int len, const int flags) { auto server = dw::find_server_by_socket(s); if (server) return server->send(buf, len); @@ -49,7 +49,7 @@ namespace demonware return ::send(s, buf, len, flags); } - int __stdcall recv(const SOCKET s, char* buf, const int len, const int flags) + int WINAPI recv(const SOCKET s, char* buf, const int len, const int flags) { auto server = dw::find_server_by_socket(s); if (server) @@ -75,7 +75,7 @@ namespace demonware return ::recv(s, buf, len, flags); } - int __stdcall connect(const SOCKET s, const sockaddr* addr, const int len) + int WINAPI connect(const SOCKET s, const sockaddr* addr, const int len) { if (len == sizeof(sockaddr_in)) { @@ -86,14 +86,14 @@ namespace demonware return ::connect(s, addr, len); } - int __stdcall close_socket(const SOCKET s) + int WINAPI close_socket(const SOCKET s) { dw::remove_blocking_socket(s); dw::unlink_socket(s); return closesocket(s); } - int __stdcall ioctl_socket(const SOCKET s, const long cmd, u_long* argp) + int WINAPI ioctl_socket(const SOCKET s, const long cmd, u_long* argp) { if (static_cast(cmd) == (FIONBIO)) { @@ -103,7 +103,7 @@ namespace demonware return ioctlsocket(s, cmd, argp); } - hostent* __stdcall get_host_by_name(char* name) + hostent* WINAPI get_host_by_name(char* name) { static std::mutex mutex; std::lock_guard _(mutex); @@ -185,7 +185,7 @@ namespace demonware return server->second; } - return std::shared_ptr(); + return {}; } std::shared_ptr dw::find_stun_server_by_name(const std::string& name) @@ -204,7 +204,7 @@ namespace demonware return server->second; } - return std::shared_ptr(); + return {}; } std::shared_ptr dw::find_server_by_socket(const SOCKET s) @@ -217,7 +217,7 @@ namespace demonware return server->second; } - return std::shared_ptr(); + return {}; } bool dw::link_socket(const SOCKET s, const unsigned long address) @@ -406,7 +406,7 @@ namespace demonware io::register_hook("ioctlsocket", io::ioctl_socket); io::register_hook("gethostbyname", io::get_host_by_name); - utils::hook(SELECT_VALUE(0x6F40A0, 0x6EE1C0, 0x611310), bd_logger_stub, HOOK_JUMP).install()->quick(); + utils::hook(SELECT_VALUE(0x6F40A0, 0x6EE1C0), bd_logger_stub, HOOK_JUMP).install()->quick(); } void dw::bd_logger_stub(int /*type*/, const char* const /*channelName*/, const char*, const char* const /*file*/, @@ -417,11 +417,11 @@ namespace demonware va_list ap; va_start(ap, msg); - _vsnprintf_s(buffer, _TRUNCATE, msg, ap); + vsnprintf_s(buffer, _TRUNCATE, msg, ap); printf("%s: %s\n", function, buffer); va_end(ap); } - - REGISTER_MODULE(dw) } + +REGISTER_MODULE(demonware::dw) diff --git a/src/module/fastfiles.cpp b/src/module/fastfiles.cpp index 7907b4e..2b17bc7 100644 --- a/src/module/fastfiles.cpp +++ b/src/module/fastfiles.cpp @@ -1,9 +1,9 @@ #include #include -#include - #include "game/game.hpp" +#include + static __declspec(naked) void db_load_stub_client(game::native::XZoneInfo*, unsigned int, int) { __asm @@ -18,20 +18,6 @@ static __declspec(naked) void db_load_stub_client(game::native::XZoneInfo*, unsi } } -static __declspec(naked) void db_load_stub_server(game::native::XZoneInfo*, unsigned int, int) -{ - __asm - { - sub esp, 10h - mov eax, [esp + 1Ch] - - mov ecx, game::native::DB_LoadXAssets - add ecx, 7h - push ecx - retn - } -} - class fastfiles final : public module { public: @@ -47,13 +33,11 @@ private: { if (zone_info[i].name) { - printf("Loading FastFile: %s (0x%X | 0x%X)\n", zone_info[i].name, zone_info[i].allocFlags, - zone_info[i].freeFlags); + printf("Loading FastFile: %s (0x%X | 0x%X)\n", zone_info[i].name, zone_info[i].allocFlags, zone_info[i].freeFlags); } } - if (game::is_dedi()) return db_load_stub_server(zone_info, zone_count, sync); - else return db_load_stub_client(zone_info, zone_count, sync); + return db_load_stub_client(zone_info, zone_count, sync); } }; diff --git a/src/module/file_system.cpp b/src/module/file_system.cpp index 7bf6262..7b50dff 100644 --- a/src/module/file_system.cpp +++ b/src/module/file_system.cpp @@ -1,11 +1,13 @@ #include #include +#include "game/game.hpp" #include -#include "game/game.hpp" - #include "file_system.hpp" +#include "log_file.hpp" + +#define _CRT_SECURE_NO_WARNINGS static utils::hook::detour sys_default_install_path_hook; @@ -34,7 +36,7 @@ static FILE* file_open_append_text(const char* filename) return file; } - printf("Couldn't open file: %s %s\n", filename, std::strerror(errno)); + log_file::info("Couldn't open file: %s %s\n", filename, std::strerror(errno)); return nullptr; } @@ -47,7 +49,7 @@ static FILE* file_open_write_binary(const char* filename) return file; } - printf("Couldn't open file: %s %s\n", filename, std::strerror(errno)); + log_file::info("Couldn't open file: %s %s\n", filename, std::strerror(errno)); return nullptr; } @@ -154,7 +156,7 @@ static int open_file_append(const char* filename) build_os_path_for_thread(basepath, game::native::fs_gamedir, filename, ospath, game::native::FS_THREAD_MAIN); if ((*fs_debug)->current.integer) { - printf("FS_FOpenFileAppend: %s\n", ospath); + log_file::info("FS_FOpenFileAppend: %s\n", ospath); } if (game::native::FS_CreatePath(ospath)) @@ -212,7 +214,7 @@ static int open_file_write_to_dir_for_thread(const char* filename, const char* d if ((*fs_debug)->current.integer) { - printf("FS_FOpenFileWriteToDirForThread: %s\n", ospath); + log_file::info("FS_FOpenFileWriteToDirForThread: %s\n", ospath); } if (game::native::FS_CreatePath(ospath)) @@ -297,8 +299,8 @@ int file_system::write(const char* buffer, int len, int h) auto tries = 0; while (remaining) { - auto block = remaining; - auto written = static_cast(file_write(buf, block, f)); + const auto block = remaining; + const auto written = static_cast(file_write(buf, block, f)); if (!written) { if (tries) @@ -327,16 +329,14 @@ int file_system::write(const char* buffer, int len, int h) void file_system::post_load() { - fs_homepath = reinterpret_cast( - SELECT_VALUE(0x1C2B538, 0x59ADD18, 0x585E8F0)); - fs_debug = reinterpret_cast( - SELECT_VALUE(0x1C2B32C, 0x59A9A08, 0x585A5E4)); + fs_homepath = reinterpret_cast(SELECT_VALUE(0x1C2B538, 0x59ADD18)); + fs_debug = reinterpret_cast(SELECT_VALUE(0x1C2B32C, 0x59A9A08)); // Make open-iw5 work outside of the game directory - sys_default_install_path_hook.create(SELECT_VALUE(0x487E50, 0x5C4A80, 0x535F80), &sys_default_install_path_stub); + sys_default_install_path_hook.create(SELECT_VALUE(0x487E50, 0x5C4A80), &sys_default_install_path_stub); // fs_basegame - utils::hook::set(SELECT_VALUE(0x629031, 0x5B0FD1, 0x526F5C), "userraw"); + utils::hook::set(SELECT_VALUE(0x629031, 0x5B0FD1), "userraw"); } REGISTER_MODULE(file_system) diff --git a/src/module/file_system.hpp b/src/module/file_system.hpp index 2cc5f0a..b54791d 100644 --- a/src/module/file_system.hpp +++ b/src/module/file_system.hpp @@ -3,6 +3,8 @@ class file_system final : public module { public: + static_assert(sizeof(game::native::fileHandleData_t) == 0x11C); + void post_load() override; static int open_file_by_mode(const char* qpath, int* f, game::native::fsMode_t mode); diff --git a/src/module/fov.cpp b/src/module/fov.cpp index 95e5693..6881894 100644 --- a/src/module/fov.cpp +++ b/src/module/fov.cpp @@ -1,18 +1,18 @@ #include #include -#include - #include "game/game.hpp" +#include "log_file.hpp" + +#include + class fov final : public module { public: void post_load() override { - if (game::is_dedi()) return; - // Set dvar flag - utils::hook::set(SELECT_VALUE(0x4302C5, 0x455155, 0), game::native::DVAR_ARCHIVE | (game::is_mp() ? game::native::DVAR_SAVED : 0)); + utils::hook::set(SELECT_VALUE(0x4302C5, 0x455155), game::native::DVAR_ARCHIVE | (game::is_mp() ? game::native::DVAR_SAVED : 0)); if (game::is_mp()) { @@ -31,7 +31,7 @@ private: const auto* dvar = game::native::Dvar_FindVar(dvar_name); if (dvar != nullptr && ((dvar->flags & game::native::DVAR_ARCHIVE) != 0)) { - printf("Not allowing server to override archive dvar '%s'\n", dvar_name); + log_file::info("Not allowing server to override archive dvar '%s'\n", dvar_name); return; } diff --git a/src/module/game_launcher.cpp b/src/module/game_launcher.cpp index 85f7993..fcceebb 100644 --- a/src/module/game_launcher.cpp +++ b/src/module/game_launcher.cpp @@ -17,7 +17,7 @@ public: } private: - static HINSTANCE __stdcall shell_execute_a(const HWND hwnd, const LPCSTR lp_operation, const LPCSTR lp_file, + static HINSTANCE WINAPI shell_execute_a(const HWND hwnd, const LPCSTR lp_operation, const LPCSTR lp_file, const LPCSTR lp_parameters, const LPCSTR lp_directory, const INT n_show_cmd) { diff --git a/src/module/game_log.cpp b/src/module/game_log.cpp index 2034531..b758ee4 100644 --- a/src/module/game_log.cpp +++ b/src/module/game_log.cpp @@ -29,7 +29,7 @@ void game_log::g_log_printf(const char* fmt, ...) return; } - const auto time = game::native::level->time / 1000; + const auto time = game::native::mp::level->time / 1000; const auto len = sprintf_s(out, "%3i:%i%i %s", time / 60, time % 60 / 10, time % 60 % 10, buf); file_system::write(out, len, log_file); diff --git a/src/module/gameplay.cpp b/src/module/gameplay.cpp index fe4e587..82227e6 100644 --- a/src/module/gameplay.cpp +++ b/src/module/gameplay.cpp @@ -1,9 +1,9 @@ #include #include -#include - #include "game/game.hpp" +#include + static const game::native::dvar_t** com_fixedtime = nullptr; static const game::native::dvar_t* com_timescale = nullptr; @@ -42,7 +42,7 @@ static float com_get_timescale_for_snd() static float com_get_timescale_for_sv() { - assert(com_timescale != nullptr); + assert(com_timescale); if (dev_timescale->current.value == 1.0f && com_timescale->current.value == 1.0f && *game::native::com_codeTimeScale == 1.0f) diff --git a/src/module/gsc/script_error.cpp b/src/module/gsc/script_error.cpp index 4639437..7b4fa61 100644 --- a/src/module/gsc/script_error.cpp +++ b/src/module/gsc/script_error.cpp @@ -73,7 +73,7 @@ namespace gsc unsigned int find_variable_stub(unsigned int parent_id, unsigned int thread_name) { - const auto res = utils::hook::invoke(SELECT_VALUE(0x4C4E70, 0x5651F0, 0x0), parent_id, thread_name); + const auto res = utils::hook::invoke(SELECT_VALUE(0x4C4E70, 0x5651F0), parent_id, thread_name); if (!res) { get_unknown_function_error(thread_name); @@ -106,16 +106,11 @@ namespace gsc public: void post_load() override { - if (game::is_dedi()) - { - return; - } + scr_emit_function_hook.create(SELECT_VALUE(0x40DCB0, 0x561400), &scr_emit_function_stub); - scr_emit_function_hook.create(SELECT_VALUE(0x40DCB0, 0x561400, 0x0), &scr_emit_function_stub); - - utils::hook(SELECT_VALUE(0x60DABA, 0x5615FA, 0x0), &compile_error_stub, HOOK_CALL).install()->quick(); - utils::hook(SELECT_VALUE(0x60DAD1, 0x561611, 0x0), &compile_error_stub, HOOK_CALL).install()->quick(); - utils::hook(SELECT_VALUE(0x40DCFA, 0x56144A, 0x0), &find_variable_stub, HOOK_CALL).install()->quick(); + utils::hook(SELECT_VALUE(0x60DABA, 0x5615FA), &compile_error_stub, HOOK_CALL).install()->quick(); + utils::hook(SELECT_VALUE(0x60DAD1, 0x561611), &compile_error_stub, HOOK_CALL).install()->quick(); + utils::hook(SELECT_VALUE(0x40DCFA, 0x56144A), &find_variable_stub, HOOK_CALL).install()->quick(); } void pre_destroy() override diff --git a/src/module/log_file.cpp b/src/module/log_file.cpp index 741bdf0..fa821a2 100644 --- a/src/module/log_file.cpp +++ b/src/module/log_file.cpp @@ -88,7 +88,7 @@ void log_file::post_load() com_logfile = game::native::Dvar_RegisterInt("logfile", 1, 0, 2, 0, "Write to log file - 0 = disabled, 1 = async file write, 2 = Sync every write"); - log_file_name = SELECT_VALUE("console_sp.log", "console_mp.log", "console_mp_dedicated.log"); + log_file_name = SELECT_VALUE("console_sp.log", "console_mp.log"); } REGISTER_MODULE(log_file) diff --git a/src/module/patches.cpp b/src/module/patches.cpp index ca0b94d..3ffd927 100644 --- a/src/module/patches.cpp +++ b/src/module/patches.cpp @@ -1,19 +1,18 @@ #include #include -#include - #include "game/game.hpp" +#include + class patches final : public module { public: void post_load() override { - if (!game::is_dedi()) this->patch_clients(); + this->patch_clients(); if (game::is_sp()) this->patch_sp(); else if (game::is_mp()) this->patch_mp(); - else if (game::is_dedi()) this->patch_dedi(); utils::hook(game::native::_longjmp, long_jump_stub, HOOK_JUMP).install()->quick(); } @@ -22,10 +21,10 @@ private: void patch_clients() const { // Remove improper quit check - utils::hook::nop(SELECT_VALUE(0x53444A, 0x5CCDC0, 0), 9); + utils::hook::nop(SELECT_VALUE(0x53444A, 0x5CCDC0), 9); // Ignore sdm files - utils::hook::nop(SELECT_VALUE(0x4438BA, 0x6371EA, 0), 2); + utils::hook::nop(SELECT_VALUE(0x4438BA, 0x6371EA), 2); } void patch_sp() const @@ -35,8 +34,8 @@ private: WSAStartup(MAKEWORD(2, 2), &wsa_data); // Disable remote storage - utils::hook::set(0x663B5A, 0xEB); - utils::hook::set(0x663C54, 0xEB); + utils::hook::set(0x663B5A, 0xEB); + utils::hook::set(0x663C54, 0xEB); utils::hook(0x44C640, &live_get_local_client_name_stub, HOOK_JUMP).install()->quick(); } diff --git a/src/module/player_movement.cpp b/src/module/player_movement.cpp index 33ffc63..833489f 100644 --- a/src/module/player_movement.cpp +++ b/src/module/player_movement.cpp @@ -26,6 +26,7 @@ const game::native::dvar_t* player_movement::g_speed; DWORD player_movement::bounce_addr; DWORD player_movement::dont_bounce_addr; +DWORD player_movement::pm_project_velocity_addr; DWORD player_movement::push_off_ladder_addr; DWORD player_movement::jump_start_addr; DWORD player_movement::jump_get_step_height_addr; @@ -310,28 +311,24 @@ __declspec(naked) void player_movement::jump_start_stub() } } -void player_movement::pm_project_velocity_stub(const float* vel_in, const float* normal, float* vel_out) +__declspec(naked) void player_movement::pm_project_velocity_stub() { - const auto length_squared_2d = vel_in[0] * vel_in[0] + vel_in[1] * vel_in[1]; - - if (std::fabsf(normal[2]) < 0.001f || length_squared_2d == 0.0f) + __asm { - std::memcpy(vel_out, vel_in, sizeof(std::float_t[3])); - return; - } + push eax + mov eax, pm_bouncesAllAngles + cmp byte ptr [eax + 0xC], 1 + pop eax - auto new_z = vel_in[0] * normal[0] + vel_in[1] * normal[1]; - new_z = -new_z / normal[2]; + je bounce - const auto length_scale = std::sqrtf((vel_in[2] * vel_in[2] + length_squared_2d) / - (new_z * new_z + length_squared_2d)); + fstp ST(0) + pop esi + add esp, 0x10 + retn - if (pm_bouncesAllAngles->current.enabled == true - || (length_scale < 1.f || new_z < 0.f || vel_in[2] > 0.f)) - { - vel_out[0] = vel_in[0] * length_scale; - vel_out[1] = vel_in[1] * length_scale; - vel_out[2] = new_z * length_scale; + bounce: + jmp dont_bounce_addr } } @@ -525,7 +522,7 @@ void player_movement::patch_mp() utils::hook(0x4166F0, jump_start_stub, HOOK_JUMP).install()->quick(); utils::hook::nop(0x4166F5, 1); // Nop skipped opcode - utils::hook(0x424E0A, pm_project_velocity_stub, HOOK_CALL).install()->quick(); // PM_StepSlideMove + utils::hook(0x41D196, pm_project_velocity_stub, HOOK_JUMP).install()->quick(); // PM_StepSlideMove utils::hook(0x4F9BB3, bg_gravity_stub, HOOK_JUMP).install()->quick(); // ClientEndFrame utils::hook::nop(0x4F9BB8, 2); // Nop skipped opcode @@ -579,7 +576,7 @@ void player_movement::patch_sp() utils::hook(0x63E90A, jump_start_stub, HOOK_JUMP).install()->quick(); utils::hook::nop(0x63E90F, 1); // Nop skipped opcode - utils::hook(0x43D9D1, pm_project_velocity_stub, HOOK_CALL).install()->quick(); // PM_StepSlideMove + utils::hook(0x4A57E6, pm_project_velocity_stub, HOOK_JUMP).install()->quick(); // PM_StepSlideMove utils::hook(0x64384F, pm_cmd_scale_crawl_speed_stub, HOOK_JUMP).install()->quick(); // PM_CmdScaleForStance utils::hook(0x643859, pm_cmd_scale_ducked_speed_stub, HOOK_JUMP).install()->quick(); // PM_CmdScaleForStance @@ -616,18 +613,14 @@ void player_movement::register_common_dvars() void player_movement::post_load() { // Un-cheat missileMacross. It seems it retained its functionality - utils::hook::set(SELECT_VALUE(0x44DFED, 0x50DDDD, 0x48C16F), 0x0); + utils::hook::set(SELECT_VALUE(0x44DFED, 0x50DDDD), 0x0); - if (game::is_dedi()) - { - return; - } - - bounce_addr = SELECT_VALUE(0x43D91F, 0x424D58, 0x0); - dont_bounce_addr = SELECT_VALUE(0x43D933, 0x424D6C, 0x0); - push_off_ladder_addr = SELECT_VALUE(0x63EA4C, 0x41686C, 0x0); - jump_start_addr = SELECT_VALUE(0x63E910, 0x4166F6, 0x0); - jump_get_step_height_addr = SELECT_VALUE(0x48C1E2, 0x416145, 0x0); + bounce_addr = SELECT_VALUE(0x43D91F, 0x424D58); + dont_bounce_addr = SELECT_VALUE(0x43D933, 0x424D6C); + pm_project_velocity_addr = SELECT_VALUE(0x4A57Ef, 0x41D19F); + push_off_ladder_addr = SELECT_VALUE(0x63EA4C, 0x41686C); + jump_start_addr = SELECT_VALUE(0x63E910, 0x4166F6); + jump_get_step_height_addr = SELECT_VALUE(0x48C1E2, 0x416145); this->register_common_dvars(); diff --git a/src/module/player_movement.hpp b/src/module/player_movement.hpp index 1ec33ce..be986d9 100644 --- a/src/module/player_movement.hpp +++ b/src/module/player_movement.hpp @@ -31,6 +31,7 @@ private: static DWORD bounce_addr; static DWORD dont_bounce_addr; + static DWORD pm_project_velocity_addr; static DWORD push_off_ladder_addr; static DWORD jump_start_addr; static DWORD jump_get_step_height_addr; @@ -59,11 +60,11 @@ private: int contents, const float* origin, const float* angles); static game::native::gentity_s* weapon_rocket_launcher_fire_mp_stub(game::native::gentity_s* ent, - const game::native::Weapon weapon, float spread, game::native::weaponParms* wp, + game::native::Weapon weapon, float spread, game::native::weaponParms* wp, const float* gun_vel, game::native::missileFireParms* fire_parms, game::native::missileFireParms* magic_bullet); static game::native::sp::gentity_s* weapon_rocket_launcher_fire_sp_stub(game::native::sp::gentity_s* ent, - const game::native::Weapon weapon, float spread, game::native::weaponParms* wp, + game::native::Weapon weapon, float spread, game::native::weaponParms* wp, const float* gun_vel, game::native::missileFireParms* fire_parms, game::native::missileFireParms* magic_bullet); static void pm_player_trace_stub(game::native::pmove_t* pm, game::native::trace_t* results, @@ -88,7 +89,7 @@ private: static void jump_start_stub(); - static void pm_project_velocity_stub(const float* vel_in, const float* normal, float* vel_out); + static void pm_project_velocity_stub(); // On SP these are already implemented static void bg_gravity_stub(); diff --git a/src/module/scheduler.cpp b/src/module/scheduler.cpp index c9256bb..67ecd72 100644 --- a/src/module/scheduler.cpp +++ b/src/module/scheduler.cpp @@ -1,11 +1,11 @@ #include #include +#include "game/game.hpp" #include #include #include -#include "game/game.hpp" #include "scheduler.hpp" namespace @@ -95,19 +95,19 @@ void scheduler::execute(const pipeline type) void scheduler::r_end_frame_stub() { - utils::hook::invoke(SELECT_VALUE(0x4193D0, 0x67F840, 0x0)); + utils::hook::invoke(SELECT_VALUE(0x4193D0, 0x67F840)); execute(pipeline::renderer); } void scheduler::g_glass_update_stub() { - utils::hook::invoke(SELECT_VALUE(0x4E3730, 0x505BB0, 0x481EA0)); + utils::hook::invoke(SELECT_VALUE(0x4E3730, 0x505BB0)); execute(pipeline::server); } void scheduler::main_frame_stub() { - utils::hook::invoke(SELECT_VALUE(0x458600, 0x556470, 0x4DB070)); + utils::hook::invoke(SELECT_VALUE(0x458600, 0x556470)); execute(pipeline::main); } @@ -137,7 +137,7 @@ void scheduler::loop(const std::function& callback, const pipeline type, void scheduler::once(const std::function& callback, const pipeline type, const std::chrono::milliseconds delay) { - schedule([callback]() + schedule([callback] { callback(); return cond_end; @@ -158,15 +158,12 @@ void scheduler::post_start() void scheduler::post_load() { - utils::hook(SELECT_VALUE(0x44C7DB, 0x55688E, 0x4DB324), main_frame_stub, HOOK_CALL).install()->quick(); + utils::hook(SELECT_VALUE(0x44C7DB, 0x55688E), main_frame_stub, HOOK_CALL).install()->quick(); - if (!game::is_dedi()) - { - utils::hook(SELECT_VALUE(0x57F7F8, 0x4978E2, 0x0), r_end_frame_stub, HOOK_CALL).install()->quick(); - } + utils::hook(SELECT_VALUE(0x57F7F8, 0x4978E2), r_end_frame_stub, HOOK_CALL).install()->quick(); // Hook a function inside G_RunFrame. Fixes TLS issues - utils::hook(SELECT_VALUE(0x52EFBC, 0x50CEC6, 0x48B277), g_glass_update_stub, HOOK_CALL).install()->quick(); + utils::hook(SELECT_VALUE(0x52EFBC, 0x50CEC6), g_glass_update_stub, HOOK_CALL).install()->quick(); } void scheduler::pre_destroy() diff --git a/src/module/scripting.cpp b/src/module/scripting.cpp index d390965..b2d86be 100644 --- a/src/module/scripting.cpp +++ b/src/module/scripting.cpp @@ -105,20 +105,20 @@ namespace scripting public: void post_load() override { - start_hook_.initialize(SELECT_VALUE(0x50C575, 0x50D4F2, 0x48A026), &start_execution_stub, HOOK_CALL) // + start_hook_.initialize(SELECT_VALUE(0x50C575, 0x50D4F2), &start_execution_stub, HOOK_CALL) // ->install() // ->quick(); - stop_hook_.initialize(SELECT_VALUE(0x528B04, 0x569E46, 0x4F03FA), &stop_execution_stub, HOOK_CALL) // + stop_hook_.initialize(SELECT_VALUE(0x528B04, 0x569E46), &stop_execution_stub, HOOK_CALL) // ->install() // ->quick(); - utils::hook(SELECT_VALUE(0x4F9706, 0x5772A0, 0x4FAB88), &frame_stub, HOOK_CALL).install()->quick(); - utils::hook(SELECT_VALUE(0x4FFA48, 0x5774AB, 0x4FEFD7), &frame_stub, HOOK_CALL).install()->quick(); + utils::hook(SELECT_VALUE(0x4F9706, 0x5772A0), &frame_stub, HOOK_CALL).install()->quick(); + utils::hook(SELECT_VALUE(0x4FFA48, 0x5774AB), &frame_stub, HOOK_CALL).install()->quick(); // Only relevant one? - utils::hook(SELECT_VALUE(0x6109F3, 0x56B637, 0x4EDFF7), &vm_notify_stub, HOOK_CALL).install()->quick(); - utils::hook(SELECT_VALUE(0x6128BE, 0x56D541, 0x4EFAF9), &vm_notify_stub, HOOK_CALL).install()->quick(); + utils::hook(SELECT_VALUE(0x6109F3, 0x56B637), &vm_notify_stub, HOOK_CALL).install()->quick(); + utils::hook(SELECT_VALUE(0x6128BE, 0x56D541), &vm_notify_stub, HOOK_CALL).install()->quick(); if (game::is_sp()) { @@ -129,10 +129,8 @@ namespace scripting utils::hook(0x610970, &vm_notify_stub, HOOK_JUMP).install()->quick(); } - if (game::is_dedi()) return; - - utils::hook(SELECT_VALUE(0x44690A, 0x56B1EA, 0x0), &scr_set_thread_position, HOOK_CALL).install()->quick(); - utils::hook(SELECT_VALUE(0x4232A8, 0x561748, 0x0), &process_script, HOOK_CALL).install()->quick(); + utils::hook(SELECT_VALUE(0x44690A, 0x56B1EA), &scr_set_thread_position, HOOK_CALL).install()->quick(); + utils::hook(SELECT_VALUE(0x4232A8, 0x561748), &process_script, HOOK_CALL).install()->quick(); } void pre_destroy() override @@ -145,7 +143,7 @@ namespace scripting void load_scripts() { - const auto script_dir = "open-iw5/scripts/"s; + const auto script_dir = "userraw/scripts/"s; if (!utils::io::directory_exists(script_dir)) { diff --git a/src/module/security.cpp b/src/module/security.cpp index f19a6c0..830589a 100644 --- a/src/module/security.cpp +++ b/src/module/security.cpp @@ -1,9 +1,9 @@ #include #include -#include - #include "game/game.hpp" +#include + class security final : public module { public: @@ -15,7 +15,7 @@ public: utils::hook(0x57680C, net_defer_packet_to_client, HOOK_CALL).install()->quick(); // SV_ConnectionlessPacket } - else if (game::is_sp()) + else { // Disable CL_ShellExecute_URL_f utils::hook::nop(0x4298F6, 5); @@ -38,8 +38,7 @@ private: return; } - auto* msg = &game::native::deferredQueue->msgs[game::native::deferredQueue->send - % std::extent_v]; + auto* msg = &game::native::deferredQueue->msgs[game::native::deferredQueue->send % std::extent_v]; std::memcpy(msg->data, net_message->data, net_message->cursize); msg->datalen = net_message->cursize; diff --git a/src/module/steam_proxy.cpp b/src/module/steam_proxy.cpp index 2747055..ead1cf8 100644 --- a/src/module/steam_proxy.cpp +++ b/src/module/steam_proxy.cpp @@ -19,8 +19,6 @@ public: void post_load() override { - if (game::is_dedi()) return; - this->load_client(); this->clean_up_on_error(); diff --git a/src/module/test_clients.cpp b/src/module/test_clients.cpp index 5a499b5..65ed8c1 100644 --- a/src/module/test_clients.cpp +++ b/src/module/test_clients.cpp @@ -1,19 +1,21 @@ #include #include +#include "game/game.hpp" + #include #include -#include "game/game.hpp" #include "test_clients.hpp" #include "command.hpp" #include "scheduler.hpp" +#include "log_file.hpp" bool test_clients::can_add() { auto i = 0; while (i < *game::native::svs_clientCount) { - if (game::native::mp::svs_clients[i].header.state == game::native::clientState_t::CS_FREE) + if (game::native::mp::svs_clients[i].header.state == game::native::CS_FREE) { // Free slot was found break; @@ -27,7 +29,7 @@ bool test_clients::can_add() game::native::gentity_s* test_clients::sv_add_test_client() { - if (!test_clients::can_add()) + if (!can_add()) { return nullptr; } @@ -54,7 +56,7 @@ game::native::gentity_s* test_clients::sv_add_test_client() game::native::SV_Cmd_TokenizeString(user_info); adr.port = static_cast(bot_port++); - game::native::NetAdr_SetType(&adr, game::native::netadrtype_t::NA_BOT); + game::native::NetAdr_SetType(&adr, game::native::NA_BOT); game::native::SV_DirectConnect(adr); @@ -64,7 +66,7 @@ game::native::gentity_s* test_clients::sv_add_test_client() int idx; for (idx = 0; idx < *game::native::svs_clientCount; idx++) { - if (game::native::mp::svs_clients[idx].header.state == game::native::clientState_t::CS_FREE) + if (game::native::mp::svs_clients[idx].header.state == game::native::CS_FREE) continue; if (game::native::mp::svs_clients[idx].header.netchan.remoteAddress.type == adr.type @@ -84,7 +86,7 @@ game::native::gentity_s* test_clients::sv_add_test_client() game::native::SV_SendClientGameState(client); game::native::usercmd_s cmd; - std::memset(&cmd, 0, sizeof(game::native::usercmd_s)); + ZeroMemory(&cmd, sizeof(game::native::usercmd_s)); game::native::SV_ClientEnterWorld(client, &cmd); @@ -95,7 +97,7 @@ game::native::gentity_s* test_clients::sv_add_test_client() void test_clients::gscr_add_test_client() { - const auto* ent = test_clients::sv_add_test_client(); + const auto* ent = sv_add_test_client(); if (ent != nullptr) { @@ -107,19 +109,19 @@ void test_clients::spawn(const int count) { for (int i = 0; i < count; ++i) { - scheduler::once([]() + scheduler::once([] { auto* ent = sv_add_test_client(); if (ent == nullptr) return; game::native::Scr_AddEntityNum(ent->s.number, 0); - scheduler::once([ent]() + scheduler::once([ent] { game::native::Scr_AddString("autoassign"); game::native::Scr_AddString("team_marinesopfor"); game::native::Scr_Notify(ent, static_cast(game::native::SL_GetString("menuresponse", 0)), 2); - scheduler::once([ent]() + scheduler::once([ent] { game::native::Scr_AddString(utils::string::va("class%i", std::rand() % 5)); game::native::Scr_AddString("changeclass"); @@ -157,8 +159,8 @@ __declspec(naked) void test_clients::reset_reliable_mp() bool test_clients::check_timeouts(const game::native::mp::client_t* client) { - return (!client->bIsTestClient || client->header.state == game::native::clientState_t::CS_ZOMBIE) - && client->header.netchan.remoteAddress.type != game::native::netadrtype_t::NA_LOOPBACK; + return (!client->bIsTestClient || client->header.state == game::native::clientState_t::CS_ZOMBIE) && + client->header.netchan.remoteAddress.type != game::native::netadrtype_t::NA_LOOPBACK; } __declspec(naked) void test_clients::check_timeouts_stub_mp() @@ -170,7 +172,7 @@ __declspec(naked) void test_clients::check_timeouts_stub_mp() lea esi, [ebx - 0x2146C] push esi - call test_clients::check_timeouts + call check_timeouts add esp, 4 mov [esp + 0x20], eax @@ -187,17 +189,26 @@ __declspec(naked) void test_clients::check_timeouts_stub_mp() void test_clients::post_load() { if (game::is_mp()) this->patch_mp(); - else return; // No sp/dedi bots for now :( + else return; // No sp bots for now :( command::add("spawnBot", [](const command::params& params) { + char* end; + if (params.size() < 2) { return; } - const auto count = std::atoi(params.get(1)); - test_clients::spawn(count); + const auto* input = params.get(1); + const auto count = std::strtol(input, &end, 10); + if (input == end) + { + log_file::info("%s is not a valid input\nUsage: %s \n", input, params.get(0)); + return; + } + + spawn(count); }); } @@ -206,16 +217,16 @@ void test_clients::patch_mp() utils::hook::nop(0x639803, 5); // LiveSteamServer_RunFrame utils::hook::nop(0x5CD65A, 5); // Do not crash for silly fatal error - utils::hook::set(0x572879, 0xEB); // Skip checks in SV_DirectConnect - utils::hook::set(0x5728D4, 0xEB); - utils::hook::set(0x57293D, 0xEB); + utils::hook::set(0x572879, 0xEB); // Skip checks in SV_DirectConnect + utils::hook::set(0x5728D4, 0xEB); + utils::hook::set(0x57293D, 0xEB); - utils::hook(0x50C147, &test_clients::scr_shutdown_system_mp_stub, HOOK_CALL).install()->quick(); // G_ShutdownGame - utils::hook(0x57BBF9, &test_clients::reset_reliable_mp, HOOK_CALL).install()->quick(); // SV_SendMessageToClient - utils::hook(0x576DCC, &test_clients::check_timeouts_stub_mp, HOOK_JUMP).install()->quick(); // SV_CheckTimeouts + utils::hook(0x50C147, &scr_shutdown_system_mp_stub, HOOK_CALL).install()->quick(); // G_ShutdownGame + utils::hook(0x57BBF9, &reset_reliable_mp, HOOK_CALL).install()->quick(); // SV_SendMessageToClient + utils::hook(0x576DCC, &check_timeouts_stub_mp, HOOK_JUMP).install()->quick(); // SV_CheckTimeouts // Replace nullsubbed gsc func "GScr_AddTestClient" with our spawn - utils::hook::set(0x8AC8DC, test_clients::gscr_add_test_client); + utils::hook::set(0x8AC8DC, gscr_add_test_client); } REGISTER_MODULE(test_clients); diff --git a/src/std_include.hpp b/src/std_include.hpp index 14bf1fb..6da3ae9 100644 --- a/src/std_include.hpp +++ b/src/std_include.hpp @@ -17,7 +17,6 @@ #pragma warning(disable: 28020) #define WIN32_LEAN_AND_MEAN -#define _CRT_SECURE_NO_WARNINGS #include #include @@ -39,17 +38,17 @@ #undef min #endif -#include #include -#include +#include +#include +#include +#include #include #include #include -#include #include -#include #include -#include +#include #include #include diff --git a/src/utils/cryptography.cpp b/src/utils/cryptography.cpp index 79ed280..d5ba157 100644 --- a/src/utils/cryptography.cpp +++ b/src/utils/cryptography.cpp @@ -206,7 +206,7 @@ namespace utils::cryptography cbc_start(des3, reinterpret_cast(iv.data()), reinterpret_cast(key.data()), key.size(), 0, &cbc); cbc_decrypt(reinterpret_cast(data.data()), - reinterpret_cast(const_cast(dec_data.data())), data.size(), &cbc); + reinterpret_cast(dec_data.data()), data.size(), &cbc); cbc_done(&cbc); return dec_data;