[saco] Implement/match ScrUnk2B, ScrUnk2E and ScrUnk2F; CObjectPool::FUNC_10012850 takes a 16-bit object id, so the caller pushes the slot dword with no movzx

This commit is contained in:
ricardoofnl
2026-09-04 23:05:10 +07:00
parent f685a0bcd9
commit 8fa52f694e
4 changed files with 77 additions and 5 deletions
+1
View File
@@ -177,3 +177,4 @@ struct struc_vdelete { virtual int Delete(int a1); };
void sub_100A4170(const char *a1); // .text:100A4170
void __stdcall sub_100A02E0(const char *a1); // .text:100A02E0
int __stdcall sub_100A0310(void *a1); // .text:100A0310
int FUNC_1009D3D0(int iModel, float fX, float fY, float fZ, float fRadius); // .text:1009D3D0
+1 -1
View File
@@ -21,7 +21,7 @@ CObjectPool::~CObjectPool()
//----------------------------------------------------
void CObjectPool::FUNC_10012850(int iObject)
void CObjectPool::FUNC_10012850(WORD wObject)
{
// TODO: CObjectPool::FUNC_10012850() .text:10012850
}
+2 -1
View File
@@ -18,6 +18,7 @@ public:
void FUNC_100A7E20();
void FUNC_100A9E30();
void FUNC_100A9E70();
void FUNC_100A80A0(VECTOR *pPos); // .text:100A80A0
};
class CObjectPool
@@ -32,7 +33,7 @@ public:
CObjectPool();
~CObjectPool(); // .text:10013160
void FUNC_10012850(int iObject); // .text:10012850
void FUNC_10012850(WORD wObject); // .text:10012850
void FUNC_10012A50(); // .text:10012A50
void FUNC_10012B10(); // .text:10012B10
+73 -3
View File
@@ -76,8 +76,54 @@ void ScrUnk94(RPCParameters *rpcParams) {}
void ScrUnk95(RPCParameters *rpcParams) {}
void ScrUnk2C(RPCParameters *rpcParams) {}
void ScrUnk2D(RPCParameters *rpcParams) {}
void ScrUnk2E(RPCParameters *rpcParams) {}
void ScrUnk2F(RPCParameters *rpcParams) {}
void ScrUnk2E(RPCParameters *rpcParams)
{
PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
int iBitLength = rpcParams->numberOfBitsOfData;
PlayerID sender = rpcParams->sender;
WORD objectId;
VECTOR vecPos;
RakNet::BitStream bsData(Data,(iBitLength/8)+1,false);
bsData.Read(objectId);
bsData.Read(vecPos.X);
bsData.Read(vecPos.Y);
bsData.Read(vecPos.Z);
CObjectPool *pObjectPool = pNetGame->GetObjectPool();
if(pObjectPool && objectId <= MAX_OBJECTS && pObjectPool->field_4[objectId]
&& pObjectPool->field_FA4[objectId]) {
((CObject *)pObjectPool->field_FA4[objectId])->FUNC_100A80A0(&vecPos);
}
}
void ScrUnk2F(RPCParameters *rpcParams)
{
PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
int iBitLength = rpcParams->numberOfBitsOfData;
PlayerID sender = rpcParams->sender;
WORD objectId;
RakNet::BitStream bsData(Data,(iBitLength/8)+1,false);
bsData.Read(objectId);
CObjectPool *pObjectPool = pNetGame->GetObjectPool();
CLocalPlayer *pLocalPlayer = pNetGame->GetPlayerPool()->GetLocalPlayer();
if(objectId <= MAX_OBJECTS && pObjectPool->field_4[objectId]) {
int iObject = pObjectPool->field_FA4[objectId];
if(iObject) {
if(pLocalPlayer && pLocalPlayer->field_2DA == (DWORD)iObject) {
pLocalPlayer->field_2DA = 0;
pLocalPlayer->field_2E2 = 0;
}
pObjectPool->FUNC_10012850(objectId);
}
}
}
void ScrUnk4F(RPCParameters *rpcParams)
{
PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
@@ -785,7 +831,31 @@ void ScrUnk2A(RPCParameters *rpcParams)
{
if(pAudioStream) pAudioStream->Stop(0);
}
void ScrUnk2B(RPCParameters *rpcParams) {}
void ScrUnk2B(RPCParameters *rpcParams)
{
PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
int iBitLength = rpcParams->numberOfBitsOfData;
PlayerID sender = rpcParams->sender;
int iModel;
float fX, fY, fZ, fRadius;
RakNet::BitStream bsData(Data,(iBitLength/8)+1,false);
iModel = 0;
fX = 0.0f;
fY = 0.0f;
fZ = 0.0f;
fRadius = 0.0f;
bsData.Read(iModel);
bsData.Read(fX);
bsData.Read(fY);
bsData.Read(fZ);
bsData.Read(fRadius);
FUNC_1009D3D0(iModel, fX, fY, fZ, fRadius);
}
void ScrUnk51(RPCParameters *rpcParams) {}
void ScrUnk52(RPCParameters *rpcParams) {}
void ScrUnk53(RPCParameters *rpcParams) {}