From 791edd231d44ec94fdd00fda6dcaaf211432de58 Mon Sep 17 00:00:00 2001 From: ricardoofnl Date: Sat, 5 Sep 2026 08:12:27 +0700 Subject: [PATCH] [saco] Implement/match `Unk22`; MSVC parks the 2-byte locals below the 4-byte ones under the `BitStream` --- saco/net/netrpc.cpp | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/saco/net/netrpc.cpp b/saco/net/netrpc.cpp index 145a3cb..61f5a0a 100644 --- a/saco/net/netrpc.cpp +++ b/saco/net/netrpc.cpp @@ -60,7 +60,48 @@ void LoadModelsThread(void *pParam) } // TODO: these RPCs -void Unk22(RPCParameters *rpcParams) {} +void Unk22(RPCParameters *rpcParams) +{ + PCHAR Data = reinterpret_cast(rpcParams->input); + int iBitLength = rpcParams->numberOfBitsOfData; + + PLAYERID playerId; + int iSkill; + WORD wLevel; + + RakNet::BitStream bsData(Data,(iBitLength/8)+1,false); + bsData.Read(playerId); + bsData.Read(iSkill); + bsData.Read(wLevel); + + CPlayerPool *pPlayerPool = pNetGame->GetPlayerPool(); + + if(pPlayerPool) + { + if(playerId == pPlayerPool->GetLocalPlayerID()) + { + CPlayerPed *pPlayerPed = pGame->FindPlayerPed(); + if(pPlayerPed) + pPlayerPed->SetWeaponSkillLevel(iSkill,wLevel); + } + else if(playerId < MAX_PLAYERS) + { + if(pPlayerPool->field_2A[playerId]) + { + CNetPlayer *pPlayer = pPlayerPool->m_pPlayers[playerId]; + if(pPlayer) + { + CRemotePlayer *pRemotePlayer = pPlayer->m_pRemotePlayer; + if(pRemotePlayer) + { + if(pRemotePlayer->FUNC_10001080() && pRemotePlayer->m_pPlayerPed) + pRemotePlayer->m_pPlayerPed->SetWeaponSkillLevel(iSkill,wLevel); + } + } + } + } + } +} void Unk24(RPCParameters *rpcParams) {} // MATCH void Unk3A(RPCParameters *rpcParams)