Skip to content

tweak(rdr): remove support for older rdr builds #3385

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 1 addition & 16 deletions code/client/launcher/ExecutableLoader.Snapshot.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,22 +108,7 @@ inline uintptr_t GetTriggerEP()
return ep;
}

if (xbr::IsGameBuild<1355>())
{
return 0x142DE455C; // 1355.18
}

if (xbr::IsGameBuild<1436>())
{
return 0x142E13DA4; // 1436.31
}

if (xbr::IsGameBuild<1491>())
{
return 0x142E4FAD0; // 1491.50
}

return 0x142E0F92C; // 1311.20
return 0x142E4FAD0; // 1491.50
}

#define TRIGGER_EP (GetTriggerEP())
Expand Down
192 changes: 1 addition & 191 deletions code/client/launcher/GameCache.cpp

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -174,36 +174,6 @@ inline bool Is3407()
return value;
}
#elif defined(STATE_RDR3)
inline bool Is1311()
{
static bool value = ([]()
{
return fx::GetEnforcedGameBuildNumber() >= 1311;
})();

return value;
}

inline bool Is1355()
{
static bool value = ([]()
{
return fx::GetEnforcedGameBuildNumber() >= 1355;
})();

return value;
}

inline bool Is1436()
{
static bool value = ([]()
{
return fx::GetEnforcedGameBuildNumber() >= 1436;
})();

return value;
}

inline bool Is1491()
{
static bool value = ([]()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -435,10 +435,7 @@ struct CBoatGameStateDataNode
bool unk52 = state.buffer.ReadBit();
bool forcedBoatLocationWhenAnchored = state.buffer.ReadBit();

if (Is1355())
{
bool unk54 = state.buffer.ReadBit();
}
bool unk54 = state.buffer.ReadBit();

bool movementResistant = state.buffer.ReadBit(); // resistance >= 0.0

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6193,7 +6193,7 @@ void CExplosionEvent::Parse(rl::MessageBufferView& buffer)
f142 = buffer.ReadBit();
f273 = buffer.ReadBit();

unkHash1436 = Is1436() ? buffer.Read<uint32_t>(32) : 0;
unkHash1436 = buffer.Read<uint32_t>(32);

attachEntityId = buffer.Read<uint16_t>(13);
f244 = buffer.Read<uint8_t>(5); // 1311+
Expand Down
17 changes: 5 additions & 12 deletions code/components/extra-natives-rdr3/src/NativeFixes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -159,13 +159,10 @@ static HookFunction hookFunction([]()
hook::put<uintptr_t>(&vtable[204], (uintptr_t)CanBlendWhenFixed);
}

if (xbr::IsGameBuildOrGreater<1436>())
{
auto location = hook::get_pattern<char>("0F 28 05 ? ? ? ? 83 25 ? ? ? ? 00 83 25 ? ? ? ? 00");
auto location = hook::get_pattern<char>("0F 28 05 ? ? ? ? 83 25 ? ? ? ? 00 83 25 ? ? ? ? 00");

g_textCentre = hook::get_address<bool*>(location + 0x33) + 2;
g_textDropshadow = hook::get_address<bool*>(location + 0x3B) + 1;
}
g_textCentre = hook::get_address<bool*>(location + 0x33) + 2;
g_textDropshadow = hook::get_address<bool*>(location + 0x3B) + 1;

rage::scrEngine::OnScriptInit.Connect([]()
{
Expand All @@ -174,12 +171,8 @@ static HookFunction hookFunction([]()
// R* removed some text related natives since RDR3 1436.25 build.
// Redirecting original natives to their successors to keep cross build compatibility.
// Also re-implementing entirely removed natives.
if (xbr::IsGameBuildOrGreater<1436>())
{
RedirectNoppedTextNatives();
ImplementRemovedTextNatives();
}

RedirectNoppedTextNatives();
ImplementRemovedTextNatives();
FixPedCombatAttributes();
});

Expand Down
5 changes: 0 additions & 5 deletions code/components/gta-core-rdr3/src/GameCrashLogHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,6 @@ static bool WriteGameLog(const char* path)

static HookFunction hookFunction([]
{
if (!xbr::IsGameBuildOrGreater<1311>())
{
return;
}

g_gameLogWriter = (decltype(g_gameLogWriter))hook::get_pattern("48 8B D9 E8 ? ? ? ? 48 8B CB E8 ? ? ? ? 48 8D 15", -0xD);

if (auto func = (void (*)(bool (*)(const char*)))GetProcAddress(GetModuleHandleW(L"CoreRT.dll"), "SetCrashLogHandler"))
Expand Down
11 changes: 4 additions & 7 deletions code/components/gta-core-rdr3/src/GameInitRage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -269,14 +269,11 @@ static HookFunction hookFunctionNet([]()
hook::jump(hook::get_pattern("84 C0 74 04 32 C0 EB 0E 4C 8B C7 48 8B D6", -0x1D), ReturnTrueAndForcePedMPFlag);
hook::jump(hook::get_pattern("40 8A F2 48 8B F9 E8 ? ? ? ? 84 C0 74", -0x12), ReturnTrueAndForcePedMPFlag);

if (xbr::IsGameBuildOrGreater<1436>())
{
// nop checks used for not syncing some "unwanted" metaped components
hook::nop(hook::get_pattern("8B 40 18 3D CC E2 69 9D"), 0x2F);
// nop checks used for not syncing some "unwanted" metaped components
hook::nop(hook::get_pattern("8B 40 18 3D CC E2 69 9D"), 0x2F);

// skip tunable checks for explosion/fire related natives
hook::jump(hook::get_pattern("B9 BD C5 AF E3 BA B2 A0 A7 92", -0x14), Return1);
}
// skip tunable checks for explosion/fire related natives
hook::jump(hook::get_pattern("B9 BD C5 AF E3 BA B2 A0 A7 92", -0x14), Return1);

//hook::jump(0x1406B50E8, LogStubLog1);

Expand Down
19 changes: 4 additions & 15 deletions code/components/gta-core-rdr3/src/SimpleAllocator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -474,21 +474,10 @@ static HookFunction hookFunction([]()
hook::call(ptr + 0x21, corrupt_this.GetCode());
hook::call(ptr + 0x75, corrupt_next.GetCode());
#elif IS_RDR3
if (xbr::IsGameBuildOrGreater<1436>())
{
char* ptr = hook::get_pattern<char>("F7 46 ? ? ? ? ? 48 8D 5E");
char* ptr = hook::get_pattern<char>("F7 46 ? ? ? ? ? 48 8D 5E");

hook::call(ptr + 0x18, already_free.GetCode());
hook::call(ptr + 0x31, corrupt_this.GetCode());
hook::call(ptr + 0xA1, corrupt_next.GetCode());
}
else
{
char* ptr = hook::get_pattern<char>("8B 43 ? 48 83 C3 ? 0F BA E0");

hook::call(ptr + 0x17, already_free.GetCode());
hook::call(ptr + 0x34, corrupt_this.GetCode());
hook::call(ptr + 0xA4, corrupt_next.GetCode());
}
hook::call(ptr + 0x18, already_free.GetCode());
hook::call(ptr + 0x31, corrupt_this.GetCode());
hook::call(ptr + 0xA1, corrupt_next.GetCode());
#endif
});
12 changes: 6 additions & 6 deletions code/components/gta-game-rdr3/include/NetworkPlayerMgr.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@
#endif

#define DECLARE_ACCESSOR(x) \
decltype(impl.m1311.x)& x() \
decltype(impl.m1491.x)& x() \
{ \
return (impl.m1311.x); \
return (impl.m1491.x); \
} \
const decltype(impl.m1311.x)& x() const \
const decltype(impl.m1491.x)& x() const \
{ \
return (impl.m1311.x); \
return (impl.m1491.x); \
}

namespace rage
Expand Down Expand Up @@ -81,13 +81,13 @@ class CNetGamePlayer : public rage::netPlayer

union
{
Impl m1311;
Impl m1491;
} impl;

public:
void* GetPlayerInfo()
{
if (auto pedPlayerComponent = (void*)(impl.m1311.pedPlayerComponent))
if (auto pedPlayerComponent = (void*)(impl.m1491.pedPlayerComponent))
{
return (void*)((char*)pedPlayerComponent + 0x130);
}
Expand Down
53 changes: 18 additions & 35 deletions code/components/gta-net-five/src/CloneExperiments.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1332,7 +1332,8 @@ static void* NetworkObjectMgrCtorStub(void* mgr, void* bw, void* unk)
auto alloc = rage::GetAllocator();
alloc->Free(mgr);

int initialSize = (xbr::IsGameBuildOrGreater<1355>()) ? 268672 : 163056;
// TODO: Remove if not needed, was used for new rdr version checks
int initialSize = 268672;

mgr = alloc->Allocate(initialSize + 4096, 16, 0);

Expand Down Expand Up @@ -1643,20 +1644,10 @@ static HookFunction hookFunction([]()
hook::call_rcx(location, ownerLoop.GetCode());
hook::put<uint16_t>(location + 0x3F, 0xC084); // test al, al
#elif IS_RDR3
if (xbr::IsGameBuildOrGreater<1436>())
{
auto location = hook::get_pattern<char>("48 8B CB E8 ? ? ? ? 48 85 C0 75 27 8D 50 01");
hook::nop(location, 0x6E);
hook::call_rcx(location, ownerLoop.GetCode());
hook::put<uint16_t>(location + 0x6E, 0xC084); // test al, al
}
else
{
auto location = hook::get_pattern<char>("48 8B CB E8 ? ? ? ? 48 85 C0 74 57 48 8B CB");
hook::nop(location, 0x47);
hook::call_rcx(location, ownerLoop.GetCode());
hook::put<uint16_t>(location + 0x47, 0xC084); // test al, al
}
auto location = hook::get_pattern<char>("48 8B CB E8 ? ? ? ? 48 85 C0 75 27 8D 50 01");
hook::nop(location, 0x6E);
hook::call_rcx(location, ownerLoop.GetCode());
hook::put<uint16_t>(location + 0x6E, 0xC084); // test al, al
#endif
}

Expand Down Expand Up @@ -1718,8 +1709,8 @@ static HookFunction hookFunction([]()
MH_CreateHook(hook::get_pattern("4C 8B F1 41 BD 05", -0x22), PassObjectControlStub, (void**)&g_origPassObjectControl);
MH_CreateHook(hook::get_pattern("8A 41 49 4C 8B F2 48 8B", -0x10), SetOwnerStub, (void**)&g_origSetOwner);
#elif IS_RDR3
MH_CreateHook(hook::get_pattern("48 8B D9 E8 ? ? ? ? 33 ? 66 C7 83", (xbr::IsGameBuildOrGreater<1355>()) ? -0xA : -0x6), NetworkObjectMgrCtorStub, (void**)&g_origNetworkObjectMgrCtor);
MH_CreateHook(hook::get_pattern("83 FE 01 41 0F 9F C4 48 85 DB 74", (xbr::IsGameBuildOrGreater<1436>()) ? -0x99 : -0x71), PassObjectControlStub, (void**)&g_origPassObjectControl);
MH_CreateHook(hook::get_pattern("48 8B D9 E8 ? ? ? ? 33 ? 66 C7 83", -0xA), NetworkObjectMgrCtorStub, (void**)&g_origNetworkObjectMgrCtor);
MH_CreateHook(hook::get_pattern("83 FE 01 41 0F 9F C4 48 85 DB 74", -0x99), PassObjectControlStub, (void**)&g_origPassObjectControl);
MH_CreateHook(hook::get_call(hook::get_pattern("E8 ? ? ? ? 80 7B 47 00 75 ? 48 8B 03")), SetOwnerStub, (void**)&g_origSetOwner);
#endif

Expand Down Expand Up @@ -1774,8 +1765,8 @@ static HookFunction hookFunction([]()
MH_CreateHook(hook::get_pattern("8A 41 49 3C FF 74 17 3C 20 73 13 0F B6 C8"), netObject__GetPlayerOwner, (void**)&g_origGetOwnerNetPlayer);
MH_CreateHook(hook::get_pattern("8A 41 4A 3C FF 74 17 3C 20 73 13 0F B6 C8"), netObject__GetPendingPlayerOwner, (void**)&g_origGetPendingPlayerOwner);
#elif IS_RDR3
MH_CreateHook(hook::get_pattern((xbr::IsGameBuildOrGreater<1436>()) ? "8A 49 45 80 F9 20 72 03 33 C0 C3" : "80 79 45 20 72 ? 33 C0 C3"), netObject__GetPlayerOwner, (void**)&g_origGetOwnerNetPlayer);
MH_CreateHook(hook::get_pattern((xbr::IsGameBuildOrGreater<1436>()) ? "8A 49 46 80 F9 FF 75 03" : "8A 41 46 3C FF 74"), netObject__GetPendingPlayerOwner, (void**)&g_origGetPendingPlayerOwner);
MH_CreateHook(hook::get_pattern("8A 49 45 80 F9 20 72 03 33 C0 C3"), netObject__GetPlayerOwner, (void**)&g_origGetOwnerNetPlayer);
MH_CreateHook(hook::get_pattern("8A 49 46 80 F9 FF 75 03"), netObject__GetPendingPlayerOwner, (void**)&g_origGetPendingPlayerOwner);
#endif

// function is only 4 bytes, can't be hooked like this
Expand Down Expand Up @@ -1816,7 +1807,7 @@ static HookFunction hookFunction([]()
#ifdef GTA_FIVE
auto location = hook::get_pattern("48 8B D0 E8 ? ? ? ? E8 ? ? ? ? 83 BB ? ? ? ? 04", 3);
#elif IS_RDR3
auto location = (xbr::IsGameBuildOrGreater<1436>()) ? hook::get_pattern("40 0F B6 CF 48 89 44 CB 40 48", -5) : hook::get_pattern("48 85 C9 74 ? 4C 8D 44 24 40 40 88 7C", 18);
auto location = hook::get_pattern("40 0F B6 CF 48 89 44 CB 40 48", -5);
#endif

hook::set_call(&g_origJoinBubble, location);
Expand All @@ -1840,10 +1831,9 @@ static HookFunction hookFunction([]()
MH_CreateHook(hook::get_call(hook::get_pattern("40 0F 92 C7 40 84 FF 0F 85 ? ? ? ? 40 8A CE E8", 16)), GetPlayerByIndex, nullptr);
}
#elif IS_RDR3
auto pattern = (xbr::IsGameBuildOrGreater<1436>()) ? "80 F9 20 72 2B BA" : "80 F9 20 73 13 48 8B";
auto match = hook::pattern(pattern).count(2);
MH_CreateHook(match.get(0).get<void>((xbr::IsGameBuildOrGreater<1436>()) ? -19 : 0), GetPlayerByIndex, (void**)&g_origGetPlayerByIndex);
MH_CreateHook(match.get(1).get<void>((xbr::IsGameBuildOrGreater<1436>()) ? -19 : 0), GetPlayerByIndex, nullptr);
auto match = hook::pattern("80 F9 20 72 2B BA").count(2);
MH_CreateHook(match.get(0).get<void>(-19), GetPlayerByIndex, (void**)&g_origGetPlayerByIndex);
MH_CreateHook(match.get(1).get<void>(-19), GetPlayerByIndex, nullptr);
#endif
}

Expand Down Expand Up @@ -1946,7 +1936,7 @@ static HookFunction hookFunction([]()

#ifdef IS_RDR3
// in RDR3 net player relevance position is cached in array indexed with physical player index, we need to patch it
MH_CreateHook((xbr::IsGameBuildOrGreater<1436>()) ? hook::get_pattern("0F A3 D0 0F 92 C0 88 06", -0x76) : hook::get_pattern("44 0F A3 C0 0F 92 C0 41 88 02", -0x32), getNetPlayerRelevancePosition, (void**)&g_origGetNetPlayerRelevancePosition);
MH_CreateHook(hook::get_pattern("0F A3 D0 0F 92 C0 88 06", -0x76), getNetPlayerRelevancePosition, (void**)&g_origGetNetPlayerRelevancePosition);
#endif

// always allow to migrate, even if not cloned on bit test
Expand Down Expand Up @@ -1986,14 +1976,7 @@ static HookFunction hookFunction([]()
#ifdef GTA_FIVE
hook::call(hook::get_pattern("48 C1 EA 04 E8 ? ? ? ? 48 8B 03", 17), delStub.GetCode());
#elif IS_RDR3
if (xbr::IsGameBuildOrGreater<1436>())
{
hook::call(hook::get_pattern("48 8B 06 41 8B D4 48 8B CE FF 10 48 8B 5C", 6), delStub.GetCode());
}
else
{
hook::call(hook::get_pattern("48 8B 06 BA 01 00 00 00 48 8B CE FF 10 48 8B 5C 24 50", 8), delStub.GetCode());
}
hook::call(hook::get_pattern("48 8B 06 41 8B D4 48 8B CE FF 10 48 8B 5C", 6), delStub.GetCode());
#endif

#ifdef IS_RDR3
Expand Down Expand Up @@ -2026,7 +2009,7 @@ static HookFunction hookFunction([]()

// patch SerializePlayerIndex methods of sync data reader/writer
MH_CreateHook(hook::get_pattern("80 3B 20 73 ? 65 4C 8B 0C", -0x2F), SyncDataReaderSerializePlayerIndex, (void**)&g_origSyncDataReaderSerializePlayerIndex);
MH_CreateHook(xbr::IsGameBuildOrGreater<1436>() ? hook::get_pattern("41 B2 3F 48 8D 54 24 30 44 88", -30) : hook::get_pattern("80 3A 20 48 8B D9 C6 44", -6), SyncDataWriterSerializePlayerIndex, (void**)&g_origSyncDataWriterSerializePlayerIndex);
MH_CreateHook(hook::get_pattern("41 B2 3F 48 8D 54 24 30 44 88", -30), SyncDataWriterSerializePlayerIndex, (void**)&g_origSyncDataWriterSerializePlayerIndex);

// also patch sync data size calculator allowing more bits
{
Expand Down Expand Up @@ -2468,7 +2451,7 @@ static HookFunction hookFunction2([]()
#ifdef GTA_FIVE
MH_CreateHook(hook::get_pattern("48 8B 03 48 8B D6 48 8B CB EB 06", -0x48), ReadDataNodeStub, (void**)&g_origReadDataNode);
#elif IS_RDR3
MH_CreateHook(xbr::IsGameBuildOrGreater<1436>() ? hook::get_pattern("42 8A BC 6B", -0x33) : hook::get_pattern("40 8A BC 43", -0x3D), ReadDataNodeStub, (void**)&g_origReadDataNode);
MH_CreateHook(hook::get_pattern("42 8A BC 6B", -0x33), ReadDataNodeStub, (void**)&g_origReadDataNode);
#endif

#ifdef GTA_FIVE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ static hook::cdecl_stub<rage::netArrayHandlerBase*(rage::netArrayManager*, int,
#ifdef GTA_FIVE
return hook::get_call(hook::get_pattern("48 8B 0D ? ? ? ? BA 06 00 00 00 45 33 C0", 0xF));
#elif IS_RDR3
return hook::get_call((xbr::IsGameBuildOrGreater<1436>()) ? hook::get_pattern("48 8B 0D ? ? ? ? 41 8D 56 06 45 33 C0", 0xE) : hook::get_pattern("48 8B 0D ? ? ? ? BA 06 00 00 00 45 33 C0", 0xF));
return hook::get_call(hook::get_pattern("48 8B 0D ? ? ? ? 41 8D 56 06 45 33 C0", 0xE));
#endif
});

Expand Down Expand Up @@ -112,7 +112,7 @@ static HookFunction hookFunctionArray([]()
#ifdef GTA_FIVE
g_arrayManager = hook::get_address<rage::netArrayManager**>(hook::get_pattern("48 8B 0D ? ? ? ? BA 06 00 00 00 45 33 C0", 3));
#elif IS_RDR3
g_arrayManager = hook::get_address<rage::netArrayManager**>((xbr::IsGameBuildOrGreater<1436>()) ? hook::get_pattern("48 8B 0D ? ? ? ? 41 8D 56 06 45 33 C0", 3) : hook::get_pattern("48 8B 0D ? ? ? ? BA 06 00 00 00 45 33 C0", 3));
g_arrayManager = hook::get_address<rage::netArrayManager**>(hook::get_pattern("48 8B 0D ? ? ? ? 41 8D 56 06 45 33 C0", 3));
#endif
});

Expand Down
17 changes: 4 additions & 13 deletions code/components/gta-net-five/src/CloneObjectManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -202,20 +202,11 @@ static HookFunction hookFunction([]()
MH_CreateHook(hook::get_pattern("44 38 33 75 30 66 44", -0x40), netObjectMgrBase__GetNetworkObject, (void**)&g_orig_netObjectMgrBase__GetNetworkObject); //
MH_CreateHook(hook::get_pattern("41 80 78 ? FF 74 2D 41 0F B6 40"), netObjectMgrBase__GetNetworkObjectForPlayer, (void**)&g_orig_netObjectMgrBase__GetNetworkObjectForPlayer);
#elif IS_RDR3
if (xbr::IsGameBuildOrGreater<1436>())
{
MH_CreateHook(hook::get_pattern("48 8B F2 41 B0 01 0F B7 52", -0x1B), netObjectMgrBase__RegisterNetworkObject, (void**)&g_orig_netObjectMgrBase__RegisterNetworkObject);
MH_CreateHook(hook::get_call(hook::get_pattern("E8 ? ? ? ? 48 8D 76 08 48 83 EB 01 75 E8")), netObjectMgrBase__DestroyNetworkObject, (void**)&g_orig_netObjectMgrBase__DestroyNetworkObject);
MH_CreateHook(hook::get_pattern("0F B6 43 ? 48 03 C0 48 8B 4C C7 08 EB", -0x64), netObjectMgrBase__GetNetworkObjectForPlayer, (void**)&g_orig_netObjectMgrBase__GetNetworkObjectForPlayer);
}
else
{
MH_CreateHook(hook::get_pattern("41 0F B7 55 00 41 B0 01 48 8B E9 E8", xbr::IsGameBuildOrGreater<1355>() ? -0x20 : -0x27), netObjectMgrBase__RegisterNetworkObject, (void**)&g_orig_netObjectMgrBase__RegisterNetworkObject);
MH_CreateHook(hook::get_pattern("45 33 FF C1 E8 03 48 8B F2 48 8B E9 A8 01", -0x24), netObjectMgrBase__DestroyNetworkObject, (void**)&g_orig_netObjectMgrBase__DestroyNetworkObject);
MH_CreateHook(hook::get_pattern("0F B6 43 ? 48 03 C0 48 8B 4C C7 08 EB", -0x3B), netObjectMgrBase__GetNetworkObjectForPlayer, (void**)&g_orig_netObjectMgrBase__GetNetworkObjectForPlayer);
}
MH_CreateHook(hook::get_pattern("48 8B F2 41 B0 01 0F B7 52", -0x1B), netObjectMgrBase__RegisterNetworkObject, (void**)&g_orig_netObjectMgrBase__RegisterNetworkObject);
MH_CreateHook(hook::get_call(hook::get_pattern("E8 ? ? ? ? 48 8D 76 08 48 83 EB 01 75 E8")), netObjectMgrBase__DestroyNetworkObject, (void**)&g_orig_netObjectMgrBase__DestroyNetworkObject);
MH_CreateHook(hook::get_pattern("0F B6 43 ? 48 03 C0 48 8B 4C C7 08 EB", -0x64), netObjectMgrBase__GetNetworkObjectForPlayer, (void**)&g_orig_netObjectMgrBase__GetNetworkObjectForPlayer);

MH_CreateHook(hook::get_pattern("41 83 F9 04 75 ? 8D 4B 20 E8 ? ? ? ? 48", xbr::IsGameBuildOrGreater<1491>() ? -0x39 : -0x31), netObjectMgrBase__ChangeOwner, (void**)&g_orig_netObjectMgrBase__ChangeOwner);
MH_CreateHook(hook::get_pattern("41 83 F9 04 75 ? 8D 4B 20 E8 ? ? ? ? 48", -0x39), netObjectMgrBase__ChangeOwner, (void**)&g_orig_netObjectMgrBase__ChangeOwner);
MH_CreateHook(hook::get_pattern("45 8A F0 0F B7 F2 E8 ? ? ? ? 33 DB 38", -0x24), netObjectMgrBase__GetNetworkObject, (void**)&g_orig_netObjectMgrBase__GetNetworkObject);
#endif

Expand Down
Loading