aboutsummaryrefslogtreecommitdiff
path: root/NorthstarDedicatedTest/dedicated.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'NorthstarDedicatedTest/dedicated.cpp')
-rw-r--r--NorthstarDedicatedTest/dedicated.cpp170
1 files changed, 152 insertions, 18 deletions
diff --git a/NorthstarDedicatedTest/dedicated.cpp b/NorthstarDedicatedTest/dedicated.cpp
index c7663201..67cb66d2 100644
--- a/NorthstarDedicatedTest/dedicated.cpp
+++ b/NorthstarDedicatedTest/dedicated.cpp
@@ -7,7 +7,7 @@
bool IsDedicated()
{
// temp: should get this from commandline
- return true;
+ //return true;
return false;
}
@@ -23,29 +23,79 @@ enum EngineState_t
struct CEngine
{
public:
- char unknown[12];
-
+ void* vtable;
+
+ int m_nQuitting;
EngineState_t m_nDllState;
EngineState_t m_nNextDllState;
+ double m_flCurrentTime;
+ float m_flFrameTime;
+ double m_flPreviousTime;
+ float m_flFilteredTime;
+ float m_flMinFrameTime; // Expected duration of a frame, or zero if it is unlimited.
+};
+
+enum HostState_t
+{
+ HS_NEW_GAME = 0,
+ HS_LOAD_GAME,
+ HS_CHANGE_LEVEL_SP,
+ HS_CHANGE_LEVEL_MP,
+ HS_RUN,
+ HS_GAME_SHUTDOWN,
+ HS_SHUTDOWN,
+ HS_RESTART,
+};
+
+struct CHostState
+{
+ HostState_t m_currentState;
+ HostState_t m_nextState;
+
+ float m_vecLocationX;
+ float m_vecLocationY;
+ float m_vecLocationZ;
+
+ float m_angLocationX;
+ float m_angLocationY;
+ float m_angLocationZ;
+
+ char m_levelName[32];
+
+ // there's more stuff here, just this is all i use atm
};
void InitialiseDedicated(HMODULE engineAddress)
{
spdlog::info("InitialiseDedicated");
- while (!IsDebuggerPresent())
- Sleep(100);
+ //while (!IsDebuggerPresent())
+ // Sleep(100);
// create binary patches
+ //{
+ // // CEngineAPI::SetStartupInfo
+ // // prevents englishclient_frontend from loading
+ //
+ // char* ptr = (char*)engineAddress + 0x1C7CBE;
+ // TempReadWrite rw(ptr);
+ //
+ // // je => jmp
+ // *ptr = (char)0xEB;
+ //}
+
{
- // CEngineAPI::SetStartupInfo
- // prevents englishclient_frontend from loading
+ // Host_Init
+ // prevent a particle init that relies on client dll
- char* ptr = (char*)engineAddress + 0x1C7CBE;
+ char* ptr = (char*)engineAddress + 0x156799;
TempReadWrite rw(ptr);
- // je => jmp
- *ptr = (char)0xEB;
+ *ptr = (char)0x90;
+ *(ptr + 1) = (char)0x90;
+ *(ptr + 2) = (char)0x90;
+ *(ptr + 3) = (char)0x90;
+ *(ptr + 4) = (char)0x90;
}
{
@@ -100,6 +150,67 @@ void InitialiseDedicated(HMODULE engineAddress)
*(ptr + 16) = (char)0x90;
}
+ {
+ // HostState_State_NewGame
+ char* ptr = (char*)engineAddress + 0x156B4C;
+ TempReadWrite rw(ptr);
+
+ // nop some access violations
+ *ptr = (char)0x90;
+ *(ptr + 1) = (char)0x90;
+ *(ptr + 2) = (char)0x90;
+ *(ptr + 3) = (char)0x90;
+ *(ptr + 4) = (char)0x90;
+ *(ptr + 5) = (char)0x90;
+ *(ptr + 6) = (char)0x90;
+ *(ptr + 7) = (char)0x90;
+ *(ptr + 8) = (char)0x90;
+ *(ptr + 9) = (char)0x90;
+ *(ptr + 10) = (char)0x90;
+ *(ptr + 11) = (char)0x90;
+ *(ptr + 12) = (char)0x90;
+ *(ptr + 13) = (char)0x90;
+ *(ptr + 14) = (char)0x90;
+ *(ptr + 15) = (char)0x90;
+ *(ptr + 16) = (char)0x90;
+ *(ptr + 17) = (char)0x90;
+ *(ptr + 18) = (char)0x90;
+ *(ptr + 19) = (char)0x90;
+ *(ptr + 20) = (char)0x90;
+ *(ptr + 21) = (char)0x90;
+ }
+
+ {
+ // HostState_State_NewGame
+ char* ptr = (char*)engineAddress + 0xB934C;
+ TempReadWrite rw(ptr);
+
+ // nop an access violation
+ *ptr = (char)0x90;
+ *(ptr + 1) = (char)0x90;
+ *(ptr + 2) = (char)0x90;
+ *(ptr + 3) = (char)0x90;
+ *(ptr + 4) = (char)0x90;
+ *(ptr + 5) = (char)0x90;
+ *(ptr + 6) = (char)0x90;
+ *(ptr + 7) = (char)0x90;
+ *(ptr + 8) = (char)0x90;
+ }
+
+ {
+ // some inputsystem bullshit
+ char* ptr = (char*)engineAddress + 0x1CEE28;
+ TempReadWrite rw(ptr);
+
+ // nop an accessviolation: temp because we still create game window atm
+ *ptr = (char)0x90;
+ *(ptr + 1) = (char)0x90;
+ *(ptr + 2) = (char)0x90;
+ }
+
+
+ // materialsystem later:
+ // do materialsystem + 5f0f1 je => jmp to make material loading not die
CDedicatedExports* dedicatedApi = new CDedicatedExports;
dedicatedApi->Sys_Printf = Sys_Printf;
@@ -122,36 +233,59 @@ void InitialiseDedicated(HMODULE engineAddress)
// also look into materialsystem + 5B344 since it seems to be the base of all the renderthread stuff
}
+void InitialiseDedicatedMaterialSystem(HMODULE baseAddress)
+{
+ {
+ // CMaterialSystem::FindMaterial
+ char* ptr = (char*)baseAddress + 0x5F0F1;
+ TempReadWrite rw(ptr);
+
+ // make the game use the error material
+ *ptr = 0xE9;
+ *(ptr + 1) = (char)0x34;
+ *(ptr + 2) = (char)0x03;
+ *(ptr + 3) = (char)0x00;
+ }
+}
+
void Sys_Printf(CDedicatedExports* dedicated, char* msg)
{
- std::cout << msg << std::endl;
+ spdlog::info("[DEDICATED PRINT] {}", msg);
}
+typedef void(*CHostState__InitType)(CHostState* self);
+
void RunServer(CDedicatedExports* dedicated)
{
+ while (!IsDebuggerPresent())Sleep(100);
+
Sys_Printf(dedicated, (char*)"CDedicatedServerAPI::RunServer(): starting");
HMODULE engine = GetModuleHandleA("engine.dll");
CEngine__Frame engineFrame = (CEngine__Frame)((char*)engine + 0x1C8650);
- CEngineAPI__ActivateSimulation engineApiStartSimulation = (CEngineAPI__ActivateSimulation)((char*)engine + 0x1C4370);
-
CEngine* cEnginePtr = (CEngine*)((char*)engine + 0x7D70C8);
-
- CEngineAPI__SetMap engineApiSetMap = (CEngineAPI__SetMap)((char*)engine + 0x1C7B30);
+ CHostState* cHostStatePtr = (CHostState*)((char*)engine + 0x7CF180);
+ CHostState__InitType CHostState__Init = (CHostState__InitType)((char*)engine + 0x16E110);
+
// call once to init
engineFrame(cEnginePtr);
- // allow us to hit CHostState::FrameUpdate
- cEnginePtr->m_nDllState = EngineState_t::DLL_ACTIVE;
+ // init hoststate, if we don't do this, we get a crash later on
+ CHostState__Init(cHostStatePtr);
+
+ // set up engine and host states to allow us to enter CHostState::FrameUpdate, with the state HS_NEW_GAME
cEnginePtr->m_nNextDllState = EngineState_t::DLL_ACTIVE;
+ cHostStatePtr->m_currentState = HostState_t::HS_NEW_GAME;
+ cHostStatePtr->m_nextState = HostState_t::HS_RUN;
+ strcpy(cHostStatePtr->m_levelName, "mp_lobby"); // set map to load into
while (true)
{
engineFrame(cEnginePtr);
+
//engineApiStartSimulation(nullptr, true);
Sys_Printf(dedicated, (char*)"engine->Frame()");
- engineApiSetMap(nullptr, "mp_thaw");
Sleep(50);
}
} \ No newline at end of file