Skip to content

Commit 739bb62

Browse files
committed
fix(achievements): Hook CAPIJob::GetPlayerStats
Fixes forced offline cache usage on some games
1 parent 59a6fec commit 739bb62

6 files changed

Lines changed: 56 additions & 0 deletions

File tree

src/feats/achievements.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,16 @@
66
#include "../log.hpp"
77

88

9+
void Achievements::getPlayerStats(uint32_t& eresult)
10+
{
11+
if (eresult == ERESULT_OK)
12+
{
13+
return;
14+
}
15+
16+
eresult = ERESULT_NO_CONNECTION;
17+
}
18+
919
void Achievements::recvMessage(const CProtoBufMsgBase* msg)
1020
{
1121
if (msg->type != EMSG_REQUEST_USERSTATS_RESPONSE)

src/feats/achievements.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
#pragma once
22

3+
#include <cstdint>
34

45
class CProtoBufMsgBase;
56

67
namespace Achievements
78
{
9+
void getPlayerStats(uint32_t& eresult);
810
void recvMessage(const CProtoBufMsgBase* msg);
911
}

src/hooks.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,23 @@ static void hkTraceIPC(const char* iface, const char* fn)
166166
}
167167
}
168168

169+
static uint32_t hkCAPIJob_GetPlayerStats(void* pAPIJob)
170+
{
171+
uint32_t res = Hooks::CAPIJob_GetPlayerStats.tramp.fn(pAPIJob);
172+
173+
g_pLog->debug
174+
(
175+
"%s(%p) -> %i\n",
176+
Hooks::CAPIJob_GetPlayerStats.name.c_str(),
177+
pAPIJob,
178+
res
179+
);
180+
181+
Achievements::getPlayerStats(res);
182+
183+
return res;
184+
}
185+
169186
static void hkProtoBufMsgBase_InitFromPacket(CProtoBufMsgBase* pMsg, void* pSrc)
170187
{
171188
Hooks::CProtoBufMsgBase_InitFromPacket.tramp.fn(pMsg, pSrc);
@@ -925,6 +942,8 @@ namespace Hooks
925942
DetourHook<IClientUser_RunIPCFrame_t> IClientUser_RunIPCFrame;
926943
DetourHook<IClientUserStats_RunIPCFrame_t> IClientUserStats_RunIPCFrame;
927944

945+
DetourHook<CAPIJob_GetPlayerStats_t> CAPIJob_GetPlayerStats;
946+
928947
DetourHook<CProtoBufMsgBase_InitFromPacket_t> CProtoBufMsgBase_InitFromPacket;
929948
DetourHook<CProtoBufMsgBase_Send_t> CProtoBufMsgBase_Send;
930949

@@ -976,6 +995,8 @@ bool Hooks::setup()
976995
bool succeeded =
977996
TraceIPC.setup(Patterns::TraceIPC, &hkTraceIPC)
978997

998+
&& CAPIJob_GetPlayerStats.setup(Patterns::CAPIJob::GetPlayerStats, &hkCAPIJob_GetPlayerStats)
999+
9791000
&& CProtoBufMsgBase_InitFromPacket.setup(Patterns::CProtoBufMsgBase::InitFromPacket, &hkProtoBufMsgBase_InitFromPacket)
9801001
&& CProtoBufMsgBase_Send.setup(Patterns::CProtoBufMsgBase::Send, &hkProtoBufMsgBase_Send)
9811002

@@ -1022,6 +1043,8 @@ void Hooks::place()
10221043
//Detours
10231044
TraceIPC.place();
10241045

1046+
CAPIJob_GetPlayerStats.place();
1047+
10251048
CProtoBufMsgBase_InitFromPacket.place();
10261049
CProtoBufMsgBase_Send.place();
10271050

@@ -1060,6 +1083,8 @@ void Hooks::remove()
10601083
//Detours
10611084
TraceIPC.remove();
10621085

1086+
CAPIJob_GetPlayerStats.remove();
1087+
10631088
CProtoBufMsgBase_InitFromPacket.remove();
10641089
CProtoBufMsgBase_Send.remove();
10651090

src/hooks.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ namespace Hooks
8080
typedef void(*IClientUser_RunIPCFrame_t)(void*, void*, void*, void*);
8181
typedef void(*IClientUserStats_RunIPCFrame_t)(void*, void*, void*, void*);
8282

83+
typedef uint32_t(*CAPIJob_GetPlayerStats_t)(void*);
84+
8385
typedef void(*CProtoBufMsgBase_InitFromPacket_t)(CProtoBufMsgBase*, void*);
8486
typedef uint32_t(*CProtoBufMsgBase_Send_t)(CProtoBufMsgBase*);
8587

@@ -103,6 +105,8 @@ namespace Hooks
103105

104106
extern DetourHook<TraceIPC_t> TraceIPC;
105107

108+
extern DetourHook<CAPIJob_GetPlayerStats_t> CAPIJob_GetPlayerStats;
109+
106110
extern DetourHook<CProtoBufMsgBase_InitFromPacket_t> CProtoBufMsgBase_InitFromPacket;
107111
extern DetourHook<CProtoBufMsgBase_Send_t> CProtoBufMsgBase_Send;
108112

src/patterns.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,16 @@ namespace Patterns
7272
SigFollowMode::Relative
7373
};
7474

75+
namespace CAPIJob
76+
{
77+
Pattern_t GetPlayerStats
78+
{
79+
"CAPIJob::GetPlayerStats",
80+
"E8 ? ? ? ? 83 C4 10 89 C5 E9 ? ? ? ? C7 86 ? ? ? ? 00 00 00 00",
81+
SigFollowMode::Relative
82+
};
83+
}
84+
7585
namespace CProtoBufMsgBase
7686
{
7787
Pattern_t InitFromPacket

src/patterns.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ namespace Patterns
3333

3434
extern Pattern_t TraceIPC;
3535

36+
namespace CAPIJob
37+
{
38+
extern Pattern_t GetPlayerStats;
39+
}
40+
3641
namespace CProtoBufMsgBase
3742
{
3843
extern Pattern_t InitFromPacket;

0 commit comments

Comments
 (0)