commit
aebfd94858
@ -1,22 +1,21 @@
|
|||||||
#include <std_include.hpp>
|
#include <std_include.hpp>
|
||||||
#include "loader/component_loader.hpp"
|
#include "loader/component_loader.hpp"
|
||||||
#include "game/game.hpp"
|
#include "game/game.hpp"
|
||||||
|
#include "version.hpp"
|
||||||
|
|
||||||
|
#include "scheduler.hpp"
|
||||||
|
|
||||||
#include <utils/hook.hpp>
|
#include <utils/hook.hpp>
|
||||||
#include <version.hpp>
|
|
||||||
|
|
||||||
namespace branding
|
namespace branding
|
||||||
{
|
{
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
utils::hook::detour r_end_frame_hook;
|
|
||||||
|
|
||||||
void draw_branding()
|
void draw_branding()
|
||||||
{
|
{
|
||||||
constexpr auto x = 4;
|
constexpr auto x = 4;
|
||||||
constexpr auto y = 0;
|
constexpr auto y = 0;
|
||||||
constexpr auto scale = 0.5f;
|
constexpr auto scale = 0.5f;
|
||||||
//float color[4] = {0.666f, 0.666f, 0.666f, 0.666f};
|
|
||||||
float color[4] = {236 / 255.0f, 113 / 255.0f, 10 / 255.0f, 1.0f};
|
float color[4] = {236 / 255.0f, 113 / 255.0f, 10 / 255.0f, 1.0f};
|
||||||
|
|
||||||
auto* font = reinterpret_cast<uint32_t*(*)()>(0x141CAC8E0_g)();
|
auto* font = reinterpret_cast<uint32_t*(*)()>(0x141CAC8E0_g)();
|
||||||
@ -26,12 +25,6 @@ namespace branding
|
|||||||
y + static_cast<float>(font[2]) * scale,
|
y + static_cast<float>(font[2]) * scale,
|
||||||
scale, scale, 0.0f, color, game::ITEM_TEXTSTYLE_SHADOWEDMORE);
|
scale, scale, 0.0f, color, game::ITEM_TEXTSTYLE_SHADOWEDMORE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void r_end_frame_stub()
|
|
||||||
{
|
|
||||||
draw_branding();
|
|
||||||
r_end_frame_hook.invoke<void>();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class component final : public component_interface
|
class component final : public component_interface
|
||||||
@ -39,7 +32,7 @@ namespace branding
|
|||||||
public:
|
public:
|
||||||
void post_unpack() override
|
void post_unpack() override
|
||||||
{
|
{
|
||||||
r_end_frame_hook.create(0x142273560_g, r_end_frame_stub);
|
scheduler::loop(draw_branding, scheduler::renderer);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -68,14 +68,15 @@ namespace exception
|
|||||||
|
|
||||||
void display_error_dialog()
|
void display_error_dialog()
|
||||||
{
|
{
|
||||||
const std::string error_str = utils::string::va("Fatal error (0x%08X) at 0x%p.\n"
|
const std::string error_str = utils::string::va("Fatal error (0x%08X) at 0x%p (0x%p).\n"
|
||||||
"A minidump has been written.\n\n",
|
"A minidump has been written.\n",
|
||||||
exception_data.code, exception_data.address);
|
exception_data.code, exception_data.address,
|
||||||
|
reverse_g(reinterpret_cast<uint64_t>(exception_data.address)));
|
||||||
|
|
||||||
utils::thread::suspend_other_threads();
|
utils::thread::suspend_other_threads();
|
||||||
show_mouse_cursor();
|
show_mouse_cursor();
|
||||||
|
|
||||||
MessageBoxA(nullptr, error_str.data(), "S1x ERROR", MB_ICONERROR);
|
MessageBoxA(nullptr, error_str.data(), "BOIII ERROR", MB_ICONERROR);
|
||||||
TerminateProcess(GetCurrentProcess(), exception_data.code);
|
TerminateProcess(GetCurrentProcess(), exception_data.code);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,11 +87,12 @@ namespace exception
|
|||||||
recovery_data.last_recovery = std::chrono::high_resolution_clock::now();
|
recovery_data.last_recovery = std::chrono::high_resolution_clock::now();
|
||||||
++recovery_data.recovery_counts;
|
++recovery_data.recovery_counts;
|
||||||
|
|
||||||
game::Com_Error(game::ERR_DROP, "Fatal error (0x%08X) at 0x%p.\nA minidump has been written.\n\n"
|
game::Com_Error(game::ERR_DROP, "Fatal error (0x%08X) at 0x%p (0x%p).\nA minidump has been written.\n\n"
|
||||||
"BOIII has tried to recover your game, but it might not run stable anymore.\n\n"
|
"BOIII has tried to recover your game, but it might not run stable anymore.\n\n"
|
||||||
"Make sure to update your graphics card drivers and install operating system updates!\n"
|
"Make sure to update your graphics card drivers and install operating system updates!\n"
|
||||||
"Closing or restarting Steam might also help.",
|
"Closing or restarting Steam might also help.",
|
||||||
exception_data.code, exception_data.address);
|
exception_data.code, exception_data.address,
|
||||||
|
reverse_g(reinterpret_cast<uint64_t>(exception_data.address)));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -137,6 +139,7 @@ namespace exception
|
|||||||
line("Timestamp: "s + get_timestamp());
|
line("Timestamp: "s + get_timestamp());
|
||||||
line(utils::string::va("Exception: 0x%08X", exceptioninfo->ExceptionRecord->ExceptionCode));
|
line(utils::string::va("Exception: 0x%08X", exceptioninfo->ExceptionRecord->ExceptionCode));
|
||||||
line(utils::string::va("Address: 0x%llX", exceptioninfo->ExceptionRecord->ExceptionAddress));
|
line(utils::string::va("Address: 0x%llX", exceptioninfo->ExceptionRecord->ExceptionAddress));
|
||||||
|
line(utils::string::va("Base: 0x%llX", get_base()));
|
||||||
|
|
||||||
#pragma warning(push)
|
#pragma warning(push)
|
||||||
#pragma warning(disable: 4996)
|
#pragma warning(disable: 4996)
|
||||||
|
@ -85,6 +85,7 @@ namespace scheduler
|
|||||||
volatile bool kill = false;
|
volatile bool kill = false;
|
||||||
std::thread thread;
|
std::thread thread;
|
||||||
task_pipeline pipelines[pipeline::count];
|
task_pipeline pipelines[pipeline::count];
|
||||||
|
|
||||||
utils::hook::detour r_end_frame_hook;
|
utils::hook::detour r_end_frame_hook;
|
||||||
utils::hook::detour g_run_frame_hook;
|
utils::hook::detour g_run_frame_hook;
|
||||||
utils::hook::detour main_frame_hook;
|
utils::hook::detour main_frame_hook;
|
||||||
@ -162,6 +163,13 @@ namespace scheduler
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void post_unpack() override
|
||||||
|
{
|
||||||
|
r_end_frame_hook.create(0x142273560_g, r_end_frame_stub); // some func called before R_EndFrame, maybe SND_EndFrame?
|
||||||
|
g_run_frame_hook.create(0x14065C360_g, server_frame_stub); // GlassSv_Update
|
||||||
|
main_frame_hook.create(0x1420F9860_g, main_frame_stub); // Com_Frame_Try_Block_Function
|
||||||
|
}
|
||||||
|
|
||||||
void pre_destroy() override
|
void pre_destroy() override
|
||||||
{
|
{
|
||||||
kill = true;
|
kill = true;
|
||||||
|
@ -136,17 +136,22 @@ std::vector<std::unique_ptr<component_interface>>& component_loader::get_compone
|
|||||||
return *components;
|
return *components;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t operator"" _g(const size_t val)
|
size_t get_base()
|
||||||
{
|
{
|
||||||
static auto base = size_t(utils::nt::library{}.get_ptr());
|
static auto base = size_t(utils::nt::library{}.get_ptr());
|
||||||
assert(base && "Failed to resolve base");
|
assert(base && "Failed to resolve base");
|
||||||
|
return base;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t operator"" _g(const size_t val)
|
||||||
|
{
|
||||||
|
static auto base = get_base();
|
||||||
return base + (val - 0x140000000);
|
return base + (val - 0x140000000);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t reverse_g(const size_t val)
|
size_t reverse_g(const size_t val)
|
||||||
{
|
{
|
||||||
static auto base = size_t(utils::nt::library{}.get_ptr());
|
static auto base = get_base();
|
||||||
assert(base && "Failed to resolve base");
|
|
||||||
return (val - base) + 0x140000000;
|
return (val - base) + 0x140000000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,6 +57,7 @@ namespace \
|
|||||||
static component_loader::installer<name> __component; \
|
static component_loader::installer<name> __component; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t get_base();
|
||||||
size_t operator"" _g(size_t val);
|
size_t operator"" _g(size_t val);
|
||||||
size_t reverse_g(size_t val);
|
size_t reverse_g(size_t val);
|
||||||
size_t reverse_g(const void* val);
|
size_t reverse_g(const void* val);
|
||||||
|
Loading…
Reference in New Issue
Block a user