maint: remove is_dedi since nothing dedi related works
This commit is contained in:
parent
902c15aeef
commit
3620facbdf
3
deps/premake/libtomcrypt.lua
vendored
3
deps/premake/libtomcrypt.lua
vendored
@ -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"),
|
||||
}
|
||||
|
@ -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<unsigned volatile *>(*scrMemTreePub + size * value
|
||||
->u.stringValue);
|
||||
const auto ref_count = reinterpret_cast<unsigned volatile *>(*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<void(*)(const char*)>(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<void(*)(const char*)>(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<unsigned int(*)(unsigned int, unsigned int)> //
|
||||
(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<unsigned int(*)(unsigned int, unsigned int)>(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<VariableValue(*)(unsigned int, int, int)> //
|
||||
(SELECT_VALUE(0x530E30, 0x56AF20, 0x0))(classnum, entnum, offset);
|
||||
return reinterpret_cast<VariableValue(*)(unsigned int, int, int)>(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<dvar_t*(*)(const char*)>
|
||||
(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<dvar_t*(*)(const char*)>(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<const dvar_t*(*)(const char*, float, float, float, unsigned __int16, const char*)>
|
||||
(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<const dvar_t*(*)(const char*, float, float, float, unsigned __int16, const char*)> //
|
||||
(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<const dvar_t*(*)(const char*, int, int, int, unsigned __int16, const char*)>
|
||||
(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<const dvar_t*(*)(const char*, int, int, int, unsigned __int16, const char*)> //
|
||||
(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<DWORD*>(SELECT_VALUE(0x19AFC84, 0x1E72184, 0x1D3C804));
|
||||
static auto ent_array = reinterpret_cast<WORD*>(SELECT_VALUE(0x19AFC82, 0x1E72182, 0x1D3C802));
|
||||
static auto class_array = reinterpret_cast<DWORD*>(SELECT_VALUE(0x19AFC84, 0x1E72184));
|
||||
static auto ent_array = reinterpret_cast<WORD*>(SELECT_VALUE(0x19AFC82, 0x1E72182));
|
||||
|
||||
scr_entref_t result{};
|
||||
scr_entref_t result;
|
||||
result.raw.classnum = static_cast<unsigned short>(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<void(*)(unsigned int, unsigned int, unsigned int)>(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<int(*)(unsigned int, int, int)> //
|
||||
(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<void(*)(const char*)>
|
||||
(SELECT_VALUE(0x4A5600, 0x56AC00, 0x0))(value);
|
||||
}
|
||||
reinterpret_cast<void(*)(const char*)> (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,33 +355,11 @@ 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);
|
||||
}
|
||||
|
||||
__declspec(naked) void sv_send_client_game_state_mp(mp::client_t* /*client*/)
|
||||
{
|
||||
static DWORD func = 0x570FC0;
|
||||
@ -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<void(*)(mp::client_t*, const char*, bool)>
|
||||
(0x570980)(drop, reason, tellThem);
|
||||
reinterpret_cast<void(*)(mp::client_t*, const char*, bool)>(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<void(*)(int)>(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<void(*)(LocalClientNum_t, const char*)>
|
||||
(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<void(*)(LocalClientNum_t, const char*)> //
|
||||
(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<void(*)(gentity_s*, float*, float*)>
|
||||
(0x50D840)(player, origin, angles);
|
||||
reinterpret_cast<void(*)(gentity_s*, float*, float*)>(0x50D840)(player, origin, angles);
|
||||
}
|
||||
}
|
||||
|
||||
@ -744,7 +463,7 @@ namespace game
|
||||
{
|
||||
reinterpret_cast<void(*)(LocalClientNum_t, const char*)>(0x456DC0)(localClientNum, msg);
|
||||
}
|
||||
else if (is_sp())
|
||||
else
|
||||
{
|
||||
reinterpret_cast<void(*)(LocalClientNum_t, const char*, int)>(0x4228A0)(localClientNum, msg, flags);
|
||||
}
|
||||
@ -752,7 +471,7 @@ namespace game
|
||||
|
||||
void Sys_EnterCriticalSection(CriticalSection critSect)
|
||||
{
|
||||
assert(static_cast<unsigned int>(critSect) <
|
||||
assert(static_cast<unsigned int>(critSect) < //
|
||||
static_cast<unsigned int>(CRITSECT_COUNT));
|
||||
|
||||
EnterCriticalSection(&s_criticalSection[critSect]);
|
||||
@ -760,7 +479,7 @@ namespace game
|
||||
|
||||
void Sys_LeaveCriticalSection(CriticalSection critSect)
|
||||
{
|
||||
assert(static_cast<unsigned int>(critSect) <
|
||||
assert(static_cast<unsigned int>(critSect) < //
|
||||
static_cast<unsigned int>(CRITSECT_COUNT));
|
||||
|
||||
LeaveCriticalSection(&s_criticalSection[critSect]);
|
||||
@ -768,7 +487,7 @@ namespace game
|
||||
|
||||
bool Sys_TryEnterCriticalSection(CriticalSection critSect)
|
||||
{
|
||||
assert(static_cast<unsigned int>(critSect) <
|
||||
assert(static_cast<unsigned int>(critSect) < //
|
||||
static_cast<unsigned int>(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<void(*)(int)>
|
||||
(SELECT_VALUE(0x415160, 0x5AF170, 0x0))(h);
|
||||
}
|
||||
reinterpret_cast<void(*)(int)>(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<int(*)(FsThread)>
|
||||
(SELECT_VALUE(0x46B1C0, 0x5AEE50, 0x0))(thread);
|
||||
return reinterpret_cast<int(*)(FsThread)>(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;
|
||||
}
|
||||
|
||||
int FS_CreatePath(char* OSPath)
|
||||
{
|
||||
if (is_dedi())
|
||||
{
|
||||
return fs_create_path_directory(OSPath);
|
||||
}
|
||||
|
||||
return reinterpret_cast<int(*)(char*)>
|
||||
(SELECT_VALUE(0x4F5AB0, 0x5AF060, 0x0))(OSPath);
|
||||
return reinterpret_cast<int(*)(char*)>(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<decltype(longjmp)*>(SELECT_VALUE(0x73AC20, 0x7363BC, 0x655558));
|
||||
native::_longjmp = reinterpret_cast<decltype(longjmp)*>(SELECT_VALUE(0x73AC20, 0x7363BC));
|
||||
|
||||
native::sv_cmd_args = reinterpret_cast<native::CmdArgs*>(SELECT_VALUE(0x1757218, 0x1CAA998, 0x1B5E7D8));
|
||||
native::cmd_args = reinterpret_cast<native::CmdArgs*>(SELECT_VALUE(0x1750750, 0x1C978D0, 0x1B455F8));
|
||||
native::sv_cmd_args = reinterpret_cast<native::CmdArgs*>(SELECT_VALUE(0x1757218, 0x1CAA998));
|
||||
native::cmd_args = reinterpret_cast<native::CmdArgs*>(SELECT_VALUE(0x1750750, 0x1C978D0));
|
||||
|
||||
native::scrVarGlob = reinterpret_cast<short*>(SELECT_VALUE(0x19AFC80, 0x1E72180, 0x1D3C800));
|
||||
native::scrMemTreePub = reinterpret_cast<char**>(SELECT_VALUE(0x196FB00, 0x1E32000, 0x1C152A4));
|
||||
native::scrMemTreeGlob = reinterpret_cast<char*>(SELECT_VALUE(0x186DA00, 0x1D6FF00, 0x1C16600));
|
||||
native::scrVarGlob = reinterpret_cast<short*>(SELECT_VALUE(0x19AFC80, 0x1E72180));
|
||||
native::scrMemTreePub = reinterpret_cast<char**>(SELECT_VALUE(0x196FB00, 0x1E32000));
|
||||
native::scrMemTreeGlob = reinterpret_cast<char*>(SELECT_VALUE(0x186DA00, 0x1D6FF00));
|
||||
|
||||
native::scr_VarPub = reinterpret_cast<native::scrVarPub_t*>(SELECT_VALUE(0x0, 0x208E188, 0x1CD8720));
|
||||
native::scr_VmPub = reinterpret_cast<native::scrVmPub_t*>(SELECT_VALUE(0x1BF2580, 0x20B4A80, 0x1F5B080));
|
||||
native::scr_VarPub = reinterpret_cast<native::scrVarPub_t*>(SELECT_VALUE(0x0, 0x208E188));
|
||||
native::scr_VmPub = reinterpret_cast<native::scrVmPub_t*>(SELECT_VALUE(0x1BF2580, 0x20B4A80));
|
||||
|
||||
native::g_script_error_level = reinterpret_cast<int*>(SELECT_VALUE(0x1BEFCFC, 0x20B21FC, 0x1F5B058));
|
||||
native::g_script_error = reinterpret_cast<jmp_buf*>(SELECT_VALUE(0x1BF1D18, 0x20B4218, 0x1F5A818));
|
||||
native::g_script_error_level = reinterpret_cast<int*>(SELECT_VALUE(0x1BEFCFC, 0x20B21FC));
|
||||
native::g_script_error = reinterpret_cast<jmp_buf*>(SELECT_VALUE(0x1BF1D18, 0x20B4218));
|
||||
|
||||
native::g_classMap = reinterpret_cast<native::scr_classStruct_t*>(SELECT_VALUE(0x92D140, 0x8B4300, 0x7C0408));
|
||||
native::g_classMap = reinterpret_cast<native::scr_classStruct_t*>(SELECT_VALUE(0x92D140, 0x8B4300));
|
||||
|
||||
native::svs_clientCount = reinterpret_cast<int*>(SELECT_VALUE(0x0, 0x4B5CF8C, 0x4A12E8C));
|
||||
native::svs_clientCount = reinterpret_cast<int*>(SELECT_VALUE(0x0, 0x4B5CF8C));
|
||||
|
||||
native::levelEntityId = reinterpret_cast<unsigned int*>(SELECT_VALUE(0x1BCBCA4, 0x208E1A4, 0x1CD873C));
|
||||
native::levelEntityId = reinterpret_cast<unsigned int*>(SELECT_VALUE(0x1BCBCA4, 0x208E1A4));
|
||||
|
||||
native::mp::svs_clients = reinterpret_cast<native::mp::client_t*>(0x4B5CF90);
|
||||
native::dedi::svs_clients = reinterpret_cast<native::dedi::client_t*>(0x4A12E90);
|
||||
|
||||
native::g_entities = reinterpret_cast<native::gentity_s*>(SELECT_VALUE(0, 0x1A66E28, 0x191B900));
|
||||
native::g_entities = reinterpret_cast<native::gentity_s*>(0x1A66E28);
|
||||
native::sp::g_entities = reinterpret_cast<native::sp::gentity_s*>(0x1197AD8);
|
||||
|
||||
native::sp::g_clients = reinterpret_cast<native::sp::gclient_s*>(0x1381D48);
|
||||
|
||||
native::level = reinterpret_cast<native::level_locals_t*>(SELECT_VALUE(0x0, 0x1C6D4D8, 0x1B21A20));
|
||||
native::mp::level = reinterpret_cast<native::level_locals_t*>(0x1C6D4D8);
|
||||
|
||||
native::deferredQueue = reinterpret_cast<native::DeferredQueue*>(SELECT_VALUE(0x0, 0x1D55438, 0x0));
|
||||
native::deferredQueue = reinterpret_cast<native::DeferredQueue*>(SELECT_VALUE(0x0, 0x1D55438));
|
||||
|
||||
native::com_codeTimeScale = reinterpret_cast<float*>(SELECT_VALUE(0x1769F1C, 0x1CEF554, 0x1B9CEC0));
|
||||
native::com_codeTimeScale = reinterpret_cast<float*>(SELECT_VALUE(0x1769F1C, 0x1CEF554));
|
||||
|
||||
native::s_criticalSection = reinterpret_cast<RTL_CRITICAL_SECTION*>(SELECT_VALUE(0x1CD5638, 0x5A91048, 0x593FF98));
|
||||
native::s_criticalSection = reinterpret_cast<RTL_CRITICAL_SECTION*>(SELECT_VALUE(0x1CD5638, 0x5A91048));
|
||||
|
||||
native::logfile = reinterpret_cast<int*>(SELECT_VALUE(0x176B534, 0x1CF0B78, 0x1B9E4C8));
|
||||
native::logfile = reinterpret_cast<int*>(SELECT_VALUE(0x176B534, 0x1CF0B78));
|
||||
|
||||
native::fs_searchpaths = reinterpret_cast<native::searchpath_s**>(SELECT_VALUE(0x1C2FE78, 0x59BA858, 0x62F4F60));
|
||||
native::fs_gamedir = reinterpret_cast<char*>(SELECT_VALUE(0x1C2B220, 0x59A98F8, 0x585A4D8));
|
||||
native::fsh = reinterpret_cast<native::fileHandleData_t*>(SELECT_VALUE(0x1C2B540, 0x59B5F20, 0x5866AF8));
|
||||
native::com_fileAccessed = reinterpret_cast<int*>(SELECT_VALUE(0x1C2B328, 0x59A9A04, 0x585A5E0));
|
||||
native::fs_searchpaths = reinterpret_cast<native::searchpath_s**>(SELECT_VALUE(0x1C2FE78, 0x59BA858));
|
||||
native::fs_gamedir = reinterpret_cast<char*>(SELECT_VALUE(0x1C2B220, 0x59A98F8));
|
||||
native::fsh = reinterpret_cast<native::fileHandleData_t*>(SELECT_VALUE(0x1C2B540, 0x59B5F20));
|
||||
native::com_fileAccessed = reinterpret_cast<int*>(SELECT_VALUE(0x1C2B328, 0x59A9A04));
|
||||
|
||||
native::threadId = reinterpret_cast<unsigned(*)[native::THREAD_CONTEXT_COUNT]>(SELECT_VALUE(0x18576C8, 0x1D6E448, 0x1C14BDC));
|
||||
native::threadId = reinterpret_cast<unsigned(*)[native::THREAD_CONTEXT_COUNT]>(SELECT_VALUE(0x18576C8, 0x1D6E448));
|
||||
|
||||
native::initialized_0 = reinterpret_cast<int*>(SELECT_VALUE(0x1CE1CA0, 0x5AA3058, 0x62F4F9C));
|
||||
native::sys_timeBase = reinterpret_cast<int*>(SELECT_VALUE(0x1CE1C98, 0x5AA3050, 0x5950CE4));
|
||||
native::sys_counterBase = reinterpret_cast<unsigned __int64*>(SELECT_VALUE(0x1CE1C90, 0x5AA3048, 0x5950CE8));
|
||||
native::initialized_0 = reinterpret_cast<int*>(SELECT_VALUE(0x1CE1CA0, 0x5AA3058));
|
||||
native::sys_timeBase = reinterpret_cast<int*>(SELECT_VALUE(0x1CE1C98, 0x5AA3050));
|
||||
native::sys_counterBase = reinterpret_cast<unsigned __int64*>(SELECT_VALUE(0x1CE1C90, 0x5AA3048));
|
||||
|
||||
native::dvarCount = reinterpret_cast<int*>(SELECT_VALUE(0x1C42398, 0x59CCDD8, 0x5879644));
|
||||
native::sortedDvars = reinterpret_cast<native::dvar_t**>(SELECT_VALUE(0x1C423C0, 0x59CCE00, 0x587C5D8));
|
||||
native::dvarCount = reinterpret_cast<int*>(SELECT_VALUE(0x1C42398, 0x59CCDD8));
|
||||
native::sortedDvars = reinterpret_cast<native::dvar_t**>(SELECT_VALUE(0x1C423C0, 0x59CCE00));
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -9,7 +9,6 @@ public:
|
||||
none,
|
||||
singleplayer,
|
||||
multiplayer,
|
||||
server,
|
||||
};
|
||||
|
||||
launcher();
|
||||
|
@ -132,7 +132,7 @@ namespace binary_loader
|
||||
long));
|
||||
|
||||
std::string binary;
|
||||
binary.resize(size_t(*size));
|
||||
binary.resize(static_cast<size_t>(*size));
|
||||
|
||||
const auto new_data = reinterpret_cast<unsigned char*>(binary.data());
|
||||
const auto old_data = reinterpret_cast<const unsigned char*>(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);
|
||||
|
@ -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;
|
||||
|
@ -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<const char*>(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<const char*>(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();
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -47,10 +47,10 @@ void bullet::post_load()
|
||||
0.0f, std::numeric_limits<float>::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)
|
||||
|
@ -1,12 +1,11 @@
|
||||
#include <std_include.hpp>
|
||||
#include <loader/module_loader.hpp>
|
||||
|
||||
#include "game/game.hpp"
|
||||
|
||||
#include <utils/hook.hpp>
|
||||
|
||||
#include "game_log.hpp"
|
||||
|
||||
#include <utils/hook.hpp>
|
||||
|
||||
static void notify_on_say(game::native::gentity_s* ent, int mode, const char* message)
|
||||
{
|
||||
const auto ent_num = ent->s.number;
|
||||
|
@ -1,11 +1,12 @@
|
||||
#include <std_include.hpp>
|
||||
#include <loader/module_loader.hpp>
|
||||
#include <utils/string.hpp>
|
||||
|
||||
#include "game/game.hpp"
|
||||
|
||||
#include "command.hpp"
|
||||
#include "scheduler.hpp"
|
||||
|
||||
#include <utils/string.hpp>
|
||||
|
||||
static const game::native::dvar_t* g_cheats;
|
||||
|
||||
class client_command final : public module
|
||||
|
@ -4,12 +4,12 @@
|
||||
|
||||
#include <utils/string.hpp>
|
||||
#include <utils/hook.hpp>
|
||||
#include <utils/io.hpp>
|
||||
|
||||
#include "command.hpp"
|
||||
|
||||
|
||||
utils::memory::allocator command::allocator_;
|
||||
static utils::memory::allocator allocator;
|
||||
|
||||
std::unordered_map<std::string, std::function<void(const command::params&)>> command::handlers;
|
||||
std::unordered_map<std::string, std::function<void(game::native::gentity_s*, command::params_sv&)>> command::handlers_sv;
|
||||
std::unordered_map<std::string, std::function<void(game::native::sp::gentity_s*, command::params_sv&)>> 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_function_t>());
|
||||
game::native::Cmd_AddCommand(name, callback, allocator.allocate<game::native::cmd_function_t>());
|
||||
}
|
||||
|
||||
void command::add(const char* name, const std::function<void(const command::params&)>& 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();
|
||||
}
|
||||
|
@ -1,5 +1,4 @@
|
||||
#pragma once
|
||||
#include <utils/memory.hpp>
|
||||
|
||||
class command final : public module
|
||||
{
|
||||
@ -51,8 +50,6 @@ public:
|
||||
void post_load() override;
|
||||
|
||||
private:
|
||||
static utils::memory::allocator allocator_;
|
||||
|
||||
static std::unordered_map<std::string, std::function<void(const params&)>> handlers;
|
||||
static std::unordered_map<std::string, std::function<void(game::native::gentity_s*, params_sv&)>> handlers_sv;
|
||||
static std::unordered_map<std::string, std::function<void(game::native::sp::gentity_s*, params_sv&)>> handlers_sp_sv;
|
||||
|
@ -1,6 +1,5 @@
|
||||
#include <std_include.hpp>
|
||||
#include <loader/module_loader.hpp>
|
||||
|
||||
#include "game/game.hpp"
|
||||
|
||||
#include "scheduler.hpp"
|
||||
@ -45,11 +44,8 @@ public:
|
||||
}
|
||||
|
||||
void post_load() override
|
||||
{
|
||||
if (!game::is_dedi())
|
||||
{
|
||||
game::native::Sys_ShowConsole();
|
||||
}
|
||||
|
||||
std::lock_guard _(this->mutex_);
|
||||
this->console_initialized_ = true;
|
||||
|
@ -1,18 +1,17 @@
|
||||
#include <std_include.hpp>
|
||||
#include <loader/module_loader.hpp>
|
||||
#include "game/game.hpp"
|
||||
|
||||
#include "scheduler.hpp"
|
||||
#include "log_file.hpp"
|
||||
|
||||
#include <discord_rpc.h>
|
||||
|
||||
#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);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -1,4 +1,6 @@
|
||||
#include <std_include.hpp>
|
||||
#include "game/game.hpp"
|
||||
|
||||
#include <utils/hook.hpp>
|
||||
#include <utils/nt.hpp>
|
||||
#include <utils/cryptography.hpp>
|
||||
@ -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<unsigned long>(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<std::mutex> _(mutex);
|
||||
@ -185,7 +185,7 @@ namespace demonware
|
||||
return server->second;
|
||||
}
|
||||
|
||||
return std::shared_ptr<service_server>();
|
||||
return {};
|
||||
}
|
||||
|
||||
std::shared_ptr<stun_server> dw::find_stun_server_by_name(const std::string& name)
|
||||
@ -204,7 +204,7 @@ namespace demonware
|
||||
return server->second;
|
||||
}
|
||||
|
||||
return std::shared_ptr<stun_server>();
|
||||
return {};
|
||||
}
|
||||
|
||||
std::shared_ptr<service_server> dw::find_server_by_socket(const SOCKET s)
|
||||
@ -217,7 +217,7 @@ namespace demonware
|
||||
return server->second;
|
||||
}
|
||||
|
||||
return std::shared_ptr<service_server>();
|
||||
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)
|
||||
|
@ -1,9 +1,9 @@
|
||||
#include <std_include.hpp>
|
||||
#include <loader/module_loader.hpp>
|
||||
#include <utils/hook.hpp>
|
||||
|
||||
#include "game/game.hpp"
|
||||
|
||||
#include <utils/hook.hpp>
|
||||
|
||||
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);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -1,11 +1,13 @@
|
||||
#include <std_include.hpp>
|
||||
#include <loader/module_loader.hpp>
|
||||
#include "game/game.hpp"
|
||||
|
||||
#include <utils/hook.hpp>
|
||||
|
||||
#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<int>(file_write(buf, block, f));
|
||||
const auto block = remaining;
|
||||
const auto written = static_cast<int>(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<const game::native::dvar_t**>(
|
||||
SELECT_VALUE(0x1C2B538, 0x59ADD18, 0x585E8F0));
|
||||
fs_debug = reinterpret_cast<const game::native::dvar_t**>(
|
||||
SELECT_VALUE(0x1C2B32C, 0x59A9A08, 0x585A5E4));
|
||||
fs_homepath = reinterpret_cast<const game::native::dvar_t**>(SELECT_VALUE(0x1C2B538, 0x59ADD18));
|
||||
fs_debug = reinterpret_cast<const game::native::dvar_t**>(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<const char*>(SELECT_VALUE(0x629031, 0x5B0FD1, 0x526F5C), "userraw");
|
||||
utils::hook::set<const char*>(SELECT_VALUE(0x629031, 0x5B0FD1), "userraw");
|
||||
}
|
||||
|
||||
REGISTER_MODULE(file_system)
|
||||
|
@ -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);
|
||||
|
@ -1,18 +1,18 @@
|
||||
#include <std_include.hpp>
|
||||
#include <loader/module_loader.hpp>
|
||||
#include <utils/hook.hpp>
|
||||
|
||||
#include "game/game.hpp"
|
||||
|
||||
#include "log_file.hpp"
|
||||
|
||||
#include <utils/hook.hpp>
|
||||
|
||||
class fov final : public module
|
||||
{
|
||||
public:
|
||||
void post_load() override
|
||||
{
|
||||
if (game::is_dedi()) return;
|
||||
|
||||
// Set dvar flag
|
||||
utils::hook::set<BYTE>(SELECT_VALUE(0x4302C5, 0x455155, 0), game::native::DVAR_ARCHIVE | (game::is_mp() ? game::native::DVAR_SAVED : 0));
|
||||
utils::hook::set<BYTE>(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;
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -1,9 +1,9 @@
|
||||
#include <std_include.hpp>
|
||||
#include <loader/module_loader.hpp>
|
||||
#include <utils/hook.hpp>
|
||||
|
||||
#include "game/game.hpp"
|
||||
|
||||
#include <utils/hook.hpp>
|
||||
|
||||
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)
|
||||
|
@ -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<unsigned int>(SELECT_VALUE(0x4C4E70, 0x5651F0, 0x0), parent_id, thread_name);
|
||||
const auto res = utils::hook::invoke<unsigned int>(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
|
||||
|
@ -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)
|
||||
|
@ -1,19 +1,18 @@
|
||||
#include <std_include.hpp>
|
||||
#include <loader/module_loader.hpp>
|
||||
#include <utils/hook.hpp>
|
||||
|
||||
#include "game/game.hpp"
|
||||
|
||||
#include <utils/hook.hpp>
|
||||
|
||||
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<BYTE>(0x663B5A, 0xEB);
|
||||
utils::hook::set<BYTE>(0x663C54, 0xEB);
|
||||
utils::hook::set<std::uint8_t>(0x663B5A, 0xEB);
|
||||
utils::hook::set<std::uint8_t>(0x663C54, 0xEB);
|
||||
|
||||
utils::hook(0x44C640, &live_get_local_client_name_stub, HOOK_JUMP).install()->quick();
|
||||
}
|
||||
|
@ -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<BYTE>(SELECT_VALUE(0x44DFED, 0x50DDDD, 0x48C16F), 0x0);
|
||||
utils::hook::set<BYTE>(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();
|
||||
|
||||
|
@ -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();
|
||||
|
@ -1,11 +1,11 @@
|
||||
#include <std_include.hpp>
|
||||
#include <loader/module_loader.hpp>
|
||||
#include "game/game.hpp"
|
||||
|
||||
#include <utils/hook.hpp>
|
||||
#include <utils/thread.hpp>
|
||||
#include <utils/concurrency.hpp>
|
||||
|
||||
#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<void>(SELECT_VALUE(0x4193D0, 0x67F840, 0x0));
|
||||
utils::hook::invoke<void>(SELECT_VALUE(0x4193D0, 0x67F840));
|
||||
execute(pipeline::renderer);
|
||||
}
|
||||
|
||||
void scheduler::g_glass_update_stub()
|
||||
{
|
||||
utils::hook::invoke<void>(SELECT_VALUE(0x4E3730, 0x505BB0, 0x481EA0));
|
||||
utils::hook::invoke<void>(SELECT_VALUE(0x4E3730, 0x505BB0));
|
||||
execute(pipeline::server);
|
||||
}
|
||||
|
||||
void scheduler::main_frame_stub()
|
||||
{
|
||||
utils::hook::invoke<void>(SELECT_VALUE(0x458600, 0x556470, 0x4DB070));
|
||||
utils::hook::invoke<void>(SELECT_VALUE(0x458600, 0x556470));
|
||||
execute(pipeline::main);
|
||||
}
|
||||
|
||||
@ -137,7 +137,7 @@ void scheduler::loop(const std::function<void()>& callback, const pipeline type,
|
||||
void scheduler::once(const std::function<void()>& 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()
|
||||
|
@ -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))
|
||||
{
|
||||
|
@ -1,9 +1,9 @@
|
||||
#include <std_include.hpp>
|
||||
#include <loader/module_loader.hpp>
|
||||
#include <utils/hook.hpp>
|
||||
|
||||
#include "game/game.hpp"
|
||||
|
||||
#include <utils/hook.hpp>
|
||||
|
||||
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<decltype(game::native::DeferredQueue::msgs)>];
|
||||
auto* msg = &game::native::deferredQueue->msgs[game::native::deferredQueue->send % std::extent_v<decltype(game::native::DeferredQueue::msgs)>];
|
||||
std::memcpy(msg->data, net_message->data, net_message->cursize);
|
||||
|
||||
msg->datalen = net_message->cursize;
|
||||
|
@ -19,8 +19,6 @@ public:
|
||||
|
||||
void post_load() override
|
||||
{
|
||||
if (game::is_dedi()) return;
|
||||
|
||||
this->load_client();
|
||||
|
||||
this->clean_up_on_error();
|
||||
|
@ -1,19 +1,21 @@
|
||||
#include <std_include.hpp>
|
||||
#include <loader/module_loader.hpp>
|
||||
#include "game/game.hpp"
|
||||
|
||||
#include <utils/hook.hpp>
|
||||
#include <utils/string.hpp>
|
||||
|
||||
#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<std::uint16_t>(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<std::uint16_t>(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 <number of bots>\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<BYTE>(0x572879, 0xEB); // Skip checks in SV_DirectConnect
|
||||
utils::hook::set<BYTE>(0x5728D4, 0xEB);
|
||||
utils::hook::set<BYTE>(0x57293D, 0xEB);
|
||||
utils::hook::set<std::uint8_t>(0x572879, 0xEB); // Skip checks in SV_DirectConnect
|
||||
utils::hook::set<std::uint8_t>(0x5728D4, 0xEB);
|
||||
utils::hook::set<std::uint8_t>(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<void(*)()>(0x8AC8DC, test_clients::gscr_add_test_client);
|
||||
utils::hook::set<void(*)()>(0x8AC8DC, gscr_add_test_client);
|
||||
}
|
||||
|
||||
REGISTER_MODULE(test_clients);
|
||||
|
@ -17,7 +17,6 @@
|
||||
#pragma warning(disable: 28020)
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#define _CRT_SECURE_NO_WARNINGS
|
||||
|
||||
#include <Windows.h>
|
||||
#include <MsHTML.h>
|
||||
@ -39,17 +38,17 @@
|
||||
#undef min
|
||||
#endif
|
||||
|
||||
#include <map>
|
||||
#include <atomic>
|
||||
#include <vector>
|
||||
#include <chrono>
|
||||
#include <filesystem>
|
||||
#include <fstream>
|
||||
#include <map>
|
||||
#include <mutex>
|
||||
#include <queue>
|
||||
#include <regex>
|
||||
#include <chrono>
|
||||
#include <thread>
|
||||
#include <fstream>
|
||||
#include <utility>
|
||||
#include <filesystem>
|
||||
#include <vector>
|
||||
|
||||
#include <zlib.h>
|
||||
#include <zstd.h>
|
||||
|
@ -206,7 +206,7 @@ namespace utils::cryptography
|
||||
cbc_start(des3, reinterpret_cast<const uint8_t*>(iv.data()), reinterpret_cast<const uint8_t*>(key.data()),
|
||||
key.size(), 0, &cbc);
|
||||
cbc_decrypt(reinterpret_cast<const uint8_t*>(data.data()),
|
||||
reinterpret_cast<uint8_t*>(const_cast<char*>(dec_data.data())), data.size(), &cbc);
|
||||
reinterpret_cast<uint8_t*>(dec_data.data()), data.size(), &cbc);
|
||||
cbc_done(&cbc);
|
||||
|
||||
return dec_data;
|
||||
|
Loading…
Reference in New Issue
Block a user