[General]: Attempt to fix a crash for Bisaknosp (#745)
This commit is contained in:
parent
d00ba58658
commit
dedfb36ad2
@ -89,6 +89,36 @@ namespace Components
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Dedicated::Com_ClampMsec(const int msec)
|
||||||
|
{
|
||||||
|
if (msec > 500 && msec < 500000)
|
||||||
|
{
|
||||||
|
Game::Com_PrintWarning(Game::CON_CHANNEL_SYSTEM, "Hitch warning: %i msec frame time\n", msec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__declspec(naked) void Dedicated::Com_ClampMsec_Stub()
|
||||||
|
{
|
||||||
|
using namespace Game;
|
||||||
|
|
||||||
|
__asm
|
||||||
|
{
|
||||||
|
pushad
|
||||||
|
|
||||||
|
push ecx
|
||||||
|
call Com_ClampMsec
|
||||||
|
add esp, 0x4
|
||||||
|
|
||||||
|
popad
|
||||||
|
|
||||||
|
// Game's code
|
||||||
|
mov edx, dword ptr com_sv_running
|
||||||
|
|
||||||
|
push 0x47DDB8
|
||||||
|
ret
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Dedicated::TransmitGuids()
|
void Dedicated::TransmitGuids()
|
||||||
{
|
{
|
||||||
std::string list = Utils::String::VA("%c", 20);
|
std::string list = Utils::String::VA("%c", 20);
|
||||||
@ -224,6 +254,9 @@ namespace Components
|
|||||||
// Post initialization point
|
// Post initialization point
|
||||||
Utils::Hook(0x60BFBF, PostInitializationStub, HOOK_JUMP).install()->quick();
|
Utils::Hook(0x60BFBF, PostInitializationStub, HOOK_JUMP).install()->quick();
|
||||||
|
|
||||||
|
Utils::Hook(0x47DDB2, Com_ClampMsec_Stub, HOOK_JUMP).install()->quick(); // Com_Frame_Try_Block_Function
|
||||||
|
Utils::Hook::Nop(0x47DDB2 + 5, 1);
|
||||||
|
|
||||||
// Transmit custom data
|
// Transmit custom data
|
||||||
Scheduler::Loop([]
|
Scheduler::Loop([]
|
||||||
{
|
{
|
||||||
|
@ -23,6 +23,9 @@ namespace Components
|
|||||||
static void PostInitialization();
|
static void PostInitialization();
|
||||||
static void PostInitializationStub();
|
static void PostInitializationStub();
|
||||||
|
|
||||||
|
static void Com_ClampMsec(int msec);
|
||||||
|
static void Com_ClampMsec_Stub();
|
||||||
|
|
||||||
static void TransmitGuids();
|
static void TransmitGuids();
|
||||||
|
|
||||||
static void TimeWrapStub(Game::errorParm_t code, const char* message);
|
static void TimeWrapStub(Game::errorParm_t code, const char* message);
|
||||||
|
@ -6,8 +6,6 @@ namespace Components
|
|||||||
std::vector<Script::ScriptFunction> Script::CustomScrFunctions;
|
std::vector<Script::ScriptFunction> Script::CustomScrFunctions;
|
||||||
std::vector<Script::ScriptMethod> Script::CustomScrMethods;
|
std::vector<Script::ScriptMethod> Script::CustomScrMethods;
|
||||||
|
|
||||||
int Script::LastFrameTime = -1;
|
|
||||||
|
|
||||||
std::unordered_map<const char*, const char*> Script::ReplacedFunctions;
|
std::unordered_map<const char*, const char*> Script::ReplacedFunctions;
|
||||||
const char* Script::ReplacedPos = nullptr;
|
const char* Script::ReplacedPos = nullptr;
|
||||||
|
|
||||||
@ -393,26 +391,6 @@ namespace Components
|
|||||||
Utils::Hook(0x61E92E, VMExecuteInternalStub, HOOK_JUMP).install()->quick();
|
Utils::Hook(0x61E92E, VMExecuteInternalStub, HOOK_JUMP).install()->quick();
|
||||||
Utils::Hook::Nop(0x61E933, 1);
|
Utils::Hook::Nop(0x61E933, 1);
|
||||||
|
|
||||||
Scheduler::Loop([]
|
|
||||||
{
|
|
||||||
if (!Game::SV_Loaded())
|
|
||||||
return;
|
|
||||||
|
|
||||||
const auto nowMs = Game::Sys_Milliseconds();
|
|
||||||
|
|
||||||
if (LastFrameTime != -1)
|
|
||||||
{
|
|
||||||
const auto timeTaken = (nowMs - LastFrameTime) * static_cast<int>((*Game::com_timescale)->current.value);
|
|
||||||
|
|
||||||
if (timeTaken >= 500)
|
|
||||||
{
|
|
||||||
Logger::Print(Game::CON_CHANNEL_PARSERSCRIPT, "Hitch warning: {} msec frame time\n", timeTaken);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
LastFrameTime = nowMs;
|
|
||||||
}, Scheduler::Pipeline::SERVER);
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
AddFunction("DebugBox", []
|
AddFunction("DebugBox", []
|
||||||
{
|
{
|
||||||
|
@ -57,8 +57,6 @@ namespace Components
|
|||||||
static std::vector<ScriptFunction> CustomScrFunctions;
|
static std::vector<ScriptFunction> CustomScrFunctions;
|
||||||
static std::vector<ScriptMethod> CustomScrMethods;
|
static std::vector<ScriptMethod> CustomScrMethods;
|
||||||
|
|
||||||
static int LastFrameTime;
|
|
||||||
|
|
||||||
static std::unordered_map<std::string, int> ScriptMainHandles;
|
static std::unordered_map<std::string, int> ScriptMainHandles;
|
||||||
static std::unordered_map<std::string, int> ScriptInitHandles;
|
static std::unordered_map<std::string, int> ScriptInitHandles;
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ namespace Components
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Logger::Debug("Successfully fetched motd");
|
Logger::Print("Successfully fetched motd");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,7 +77,7 @@ namespace Components
|
|||||||
Changelog::LoadChangelog();
|
Changelog::LoadChangelog();
|
||||||
if (Terminate) return;
|
if (Terminate) return;
|
||||||
|
|
||||||
std::string data = Utils::Cache::GetFile("/iw4/motd.txt");
|
const auto data = Utils::Cache::GetFile("/iw4/motd.txt");
|
||||||
if (!data.empty())
|
if (!data.empty())
|
||||||
{
|
{
|
||||||
Localization::Set("MPUI_MOTD_TEXT", data);
|
Localization::Set("MPUI_MOTD_TEXT", data);
|
||||||
@ -90,7 +90,7 @@ namespace Components
|
|||||||
// Sleep for 3 minutes
|
// Sleep for 3 minutes
|
||||||
for (int i = 0; i < 180 && !Terminate; ++i)
|
for (int i = 0; i < 180 && !Terminate; ++i)
|
||||||
{
|
{
|
||||||
std::this_thread::sleep_for(1s);
|
Game::Sys_Sleep(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -373,12 +373,14 @@ namespace Components
|
|||||||
{
|
{
|
||||||
std::thread([]
|
std::thread([]
|
||||||
{
|
{
|
||||||
|
Com_InitThreadData();
|
||||||
|
|
||||||
// check natpmpstate
|
// check natpmpstate
|
||||||
// state 4 is no more devices to query
|
// state 4 is no more devices to query
|
||||||
while (Utils::Hook::Get<int>(0x66CE200) < 4)
|
while (Utils::Hook::Get<int>(0x66CE200) < 4)
|
||||||
{
|
{
|
||||||
Utils::Hook::Call<void()>(0x4D7030)();
|
Utils::Hook::Call<void()>(0x4D7030)();
|
||||||
std::this_thread::sleep_for(500ms);
|
Game::Sys_Sleep(500);
|
||||||
}
|
}
|
||||||
}).detach();
|
}).detach();
|
||||||
}, HOOK_JUMP).install()->quick();
|
}, HOOK_JUMP).install()->quick();
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
namespace Components
|
namespace Components
|
||||||
{
|
{
|
||||||
bool Session::Terminate;
|
volatile bool Session::Terminate;
|
||||||
std::thread Session::Thread;
|
std::thread Session::Thread;
|
||||||
|
|
||||||
std::recursive_mutex Session::Mutex;
|
std::recursive_mutex Session::Mutex;
|
||||||
@ -144,11 +144,13 @@ namespace Components
|
|||||||
Session::Terminate = false;
|
Session::Terminate = false;
|
||||||
Session::Thread = std::thread([]()
|
Session::Thread = std::thread([]()
|
||||||
{
|
{
|
||||||
|
Com_InitThreadData();
|
||||||
|
|
||||||
while (!Session::Terminate)
|
while (!Session::Terminate)
|
||||||
{
|
{
|
||||||
Session::RunFrame();
|
Session::RunFrame();
|
||||||
Session::HandleSignatures();
|
Session::HandleSignatures();
|
||||||
std::this_thread::sleep_for(20ms);
|
Game::Sys_Sleep(20);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,7 @@ namespace Components
|
|||||||
static void Handle(const std::string& packet, const Network::NetworkCallback& callback);
|
static void Handle(const std::string& packet, const Network::NetworkCallback& callback);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static bool Terminate;
|
static volatile bool Terminate;
|
||||||
static std::thread Thread;
|
static std::thread Thread;
|
||||||
static std::recursive_mutex Mutex;
|
static std::recursive_mutex Mutex;
|
||||||
static std::unordered_map<Network::Address, Frame> Sessions;
|
static std::unordered_map<Network::Address, Frame> Sessions;
|
||||||
|
@ -35,6 +35,7 @@ namespace Game
|
|||||||
const dvar_t** com_developer = reinterpret_cast<const dvar_t**>(0x1AD78E8);
|
const dvar_t** com_developer = reinterpret_cast<const dvar_t**>(0x1AD78E8);
|
||||||
const dvar_t** com_developer_script = reinterpret_cast<const dvar_t**>(0x1AD8F10);
|
const dvar_t** com_developer_script = reinterpret_cast<const dvar_t**>(0x1AD8F10);
|
||||||
const dvar_t** com_timescale = reinterpret_cast<const dvar_t**>(0x1AD7920);
|
const dvar_t** com_timescale = reinterpret_cast<const dvar_t**>(0x1AD7920);
|
||||||
|
const dvar_t** com_maxFrameTime = reinterpret_cast<const dvar_t**>(0x1AD78F4);
|
||||||
const dvar_t** com_sv_running = reinterpret_cast<const dvar_t**>(0x1AD7934);
|
const dvar_t** com_sv_running = reinterpret_cast<const dvar_t**>(0x1AD7934);
|
||||||
|
|
||||||
const dvar_t** dev_timescale = reinterpret_cast<const dvar_t**>(0x1AD8F20);
|
const dvar_t** dev_timescale = reinterpret_cast<const dvar_t**>(0x1AD8F20);
|
||||||
|
@ -87,6 +87,7 @@ namespace Game
|
|||||||
extern const dvar_t** com_developer;
|
extern const dvar_t** com_developer;
|
||||||
extern const dvar_t** com_developer_script;
|
extern const dvar_t** com_developer_script;
|
||||||
extern const dvar_t** com_timescale;
|
extern const dvar_t** com_timescale;
|
||||||
|
extern const dvar_t** com_maxFrameTime;
|
||||||
extern const dvar_t** com_sv_running;
|
extern const dvar_t** com_sv_running;
|
||||||
|
|
||||||
extern const dvar_t** dev_timescale;
|
extern const dvar_t** dev_timescale;
|
||||||
|
Loading…
Reference in New Issue
Block a user