From 63c79b116215bf2ff2559796bd409fa5838d8d5f Mon Sep 17 00:00:00 2001 From: ricardoofnl Date: Fri, 4 Sep 2026 22:55:04 +0700 Subject: [PATCH] [saco] Implement/match `ScrUnk45`; its local-player arm inlines a new `CLocalPlayer::SetTeam`, whose COMDAT is the body at 0x10017C70 --- saco/net/localplayer.h | 1 + saco/net/scriptrpc.cpp | 24 +++++++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/saco/net/localplayer.h b/saco/net/localplayer.h index 90e032e..623bac4 100644 --- a/saco/net/localplayer.h +++ b/saco/net/localplayer.h @@ -113,6 +113,7 @@ public: DWORD GetPlayerColorAsRGBA(); DWORD GetPlayerColorAsARGB(); BOOL IsSpectating() { return m_bIsSpectating; }; + void SetTeam(BYTE byteTeam) { m_byteTeam = byteTeam; }; void ReturnToClassSelection() { m_bWantsAnotherClass = TRUE; }; diff --git a/saco/net/scriptrpc.cpp b/saco/net/scriptrpc.cpp index e0c9714..a33304f 100644 --- a/saco/net/scriptrpc.cpp +++ b/saco/net/scriptrpc.cpp @@ -408,7 +408,29 @@ void ScrSetSpawnInfo(RPCParameters *rpcParams) pPlayerPool->GetLocalPlayer()->sub_10003BE0(&SpawnInfo); } -void ScrUnk45(RPCParameters *rpcParams) {} +void ScrUnk45(RPCParameters *rpcParams) +{ + PCHAR Data = reinterpret_cast(rpcParams->input); + int iBitLength = rpcParams->numberOfBitsOfData; + PlayerID sender = rpcParams->sender; + + PLAYERID playerId; + BYTE byteTeam; + + RakNet::BitStream bsData(Data,(iBitLength/8)+1,false); + + CPlayerPool *pPlayerPool = pNetGame->GetPlayerPool(); + + bsData.Read(playerId); + bsData.Read(byteTeam); + + if(playerId == pPlayerPool->GetLocalPlayerID()) { + pPlayerPool->GetLocalPlayer()->SetTeam(byteTeam); + } else { + CRemotePlayer *pRemotePlayer = pPlayerPool->GetAt(playerId); + if(pRemotePlayer) pRemotePlayer->field_109 = byteTeam; + } +} void ScrUnk99(RPCParameters *rpcParams) { PCHAR Data = reinterpret_cast(rpcParams->input);