[saco] Implement/match FUNC_100158D0, the unoccupied vehicle sync; the 0.05 lerp gate is a double literal here, unlike the trailer path

This commit is contained in:
ricardoofnl
2026-09-05 09:37:49 +07:00
parent 558f817285
commit bc516c9fc8
5 changed files with 92 additions and 2 deletions
+1
View File
@@ -61,6 +61,7 @@ DWORD unnamed_100B6100(char *szString, int nMaxLen);
int FUNC_100B61D0(int a1); // .text:100B61D0
bool FUNC_100B4B50(VECTOR *vecPos);
bool FUNC_100B4AE0(VECTOR *vec); // .text:100B4AE0
void FUNC_100B4D10(VECTOR *vecOut, MATRIX4X4 *pMatrix, VECTOR *vecOffset);
int FUNC_100B4BE0(int a1, int a2, int a3); // .text:100B4BE0
int FUNC_100B4C00(int a1, int a2, int a3); // .text:100B4C00
+5 -1
View File
@@ -35,7 +35,9 @@ public:
BYTE m_byteColor2;
BOOL m_bHasNewColor;
char _gap7F[57];
char _gap7F[4];
int field_83;
char _gap87[49];
CVehicle( int iType, float fPosX, float fPosY, float fPosZ, float fRotation = 0.0f, BOOL bKeepModelLoaded = FALSE, int a8 = 0);
@@ -97,6 +99,8 @@ public:
CVehicle *FUNC_100B7C90(); // .text:100B7C90
BOOL FUNC_100B7D70(); // .text:100B7D70
BOOL FUNC_100B7DD0(); // .text:100B7DD0
BOOL FUNC_100B70E0(); // .text:100B70E0
BOOL FUNC_100B7CF0(); // .text:100B7CF0
BOOL FUNC_100B7460(); // .text:100B7460
BOOL FUNC_100B7E00(); // .text:100B7E00
+72
View File
@@ -44,6 +44,8 @@ typedef char BULLET_SYNC_offsets[(offsetof(BULLET_SYNC_DATA, byteWeaponID) == 0x
sizeof(BULLET_SYNC_DATA) == 0x28) ? 1 : -1];
typedef char TRAILER_SYNC_offsets[(offsetof(TRAILER_SYNC_DATA, vecTurnSpeed) == 0x2A &&
sizeof(TRAILER_SYNC_DATA) == 0x36) ? 1 : -1];
typedef char UNOCCUPIED_SYNC_offsets[(offsetof(UNOCCUPIED_SYNC_DATA, vecTurnSpeed) == 0x33 &&
offsetof(CVehiclePool, field_8E34) == 0x8E34 && offsetof(CVehicle, field_83) == 0x83) ? 1 : -1];
typedef char struc_41_offsets[(offsetof(struc_41, field_30) == 0x30) ? 1 : -1];
typedef char WEAPON_SLOT_offsets[(offsetof(WEAPON_SLOT_TYPE, field_8) == 8 &&
sizeof(WEAPON_SLOT_TYPE) == 28) ? 1 : -1];
@@ -478,6 +480,76 @@ void CRemotePlayer::FUNC_10016370(BULLET_SYNC_DATA *pSync)
//----------------------------------------------------
void CRemotePlayer::FUNC_100158D0(UNOCCUPIED_SYNC_DATA *pSync)
{
if(!pSync->VehicleID) return;
if(pSync->VehicleID == INVALID_VEHICLE_ID) return;
MATRIX4X4 mat;
VECTOR vecMove;
CVehiclePool *pVehiclePool = pNetGame->GetVehiclePool();
if(!pVehiclePool) return;
CVehicle *pVehicle = (CVehicle *)pVehiclePool->GetAt(pSync->VehicleID);
pVehiclePool->field_8E34[pSync->VehicleID] = m_PlayerID;
if(!pVehicle) return;
if(pVehicle->FUNC_100B70E0()) return;
if(pVehicle->FUNC_100B7CF0()) return;
if(!FUNC_100B4A70(&pSync->vecDirection)) return;
if(!FUNC_100B4A70(&pSync->vecRoll)) return;
if(!FUNC_100B4B50(&pSync->vecPos)) return;
if(!FUNC_100B4AE0(&pSync->vecMoveSpeed)) return;
if(!FUNC_100B4AE0(&pSync->vecTurnSpeed)) return;
pVehicle->GetMatrix(&mat);
mat.up.X = pSync->vecDirection.X;
mat.up.Y = pSync->vecDirection.Y;
mat.up.Z = pSync->vecDirection.Z;
mat.right.X = pSync->vecRoll.X;
mat.right.Y = pSync->vecRoll.Y;
mat.right.Z = pSync->vecRoll.Z;
if(FloatOffset(pSync->vecPos.X, mat.pos.X) <= 0.1f &&
FloatOffset(pSync->vecPos.Y, mat.pos.Y) <= 0.1f &&
FloatOffset(pSync->vecPos.Z, mat.pos.Z) <= 0.1f) return;
if(FloatOffset(pSync->vecPos.X, mat.pos.X) > 6.0f ||
FloatOffset(pSync->vecPos.Y, mat.pos.Y) > 6.0f ||
FloatOffset(pSync->vecPos.Z, mat.pos.Z) > 3.0f) {
mat.pos.X = pSync->vecPos.X;
mat.pos.Y = pSync->vecPos.Y;
mat.pos.Z = pSync->vecPos.Z;
pVehicle->SetMatrix(mat);
pVehicle->SetMoveSpeedVector(pSync->vecMoveSpeed);
pVehicle->SetTurnSpeedVector(pSync->vecTurnSpeed);
return;
}
pVehicle->SetMatrix(mat);
pVehicle->SetMoveSpeedVector(pSync->vecMoveSpeed);
pVehicle->SetTurnSpeedVector(pSync->vecTurnSpeed);
vecMove.X = 0.0f;
vecMove.Y = 0.0f;
vecMove.Z = 0.0f;
pVehicle->GetMoveSpeedVector(&vecMove);
if(FloatOffset(pSync->vecPos.X, mat.pos.X) > 0.05)
vecMove.X = (pSync->vecPos.X - mat.pos.X) * fVehLerp + vecMove.X;
if(FloatOffset(pSync->vecPos.Y, mat.pos.Y) > 0.05)
vecMove.Y = (pSync->vecPos.Y - mat.pos.Y) * fVehLerp + vecMove.Y;
if(FloatOffset(pSync->vecPos.Z, mat.pos.Z) > 0.05)
vecMove.Z = (pSync->vecPos.Z - mat.pos.Z) * fVehLerp + vecMove.Z;
pVehicle->SetMoveSpeedVector(vecMove);
pVehicle->field_83 = 1;
}
//----------------------------------------------------
void CRemotePlayer::FUNC_10015140()
{
MATRIX4X4 mat;
+12
View File
@@ -3,6 +3,17 @@
//----------------------------------------------------
struct UNOCCUPIED_SYNC_DATA
{
VEHICLEID VehicleID;
BYTE byteSeatID;
VECTOR vecRoll;
VECTOR vecDirection;
VECTOR vecPos;
VECTOR vecMoveSpeed;
VECTOR vecTurnSpeed;
};
struct TRAILER_SYNC_DATA
{
VEHICLEID TrailerID;
@@ -118,6 +129,7 @@ public:
void FUNC_10016370(BULLET_SYNC_DATA *pSync); // .text:10016370
void FUNC_10014950(); // .text:10014950
void FUNC_10015140(); // .text:10015140
void FUNC_100158D0(UNOCCUPIED_SYNC_DATA *pSync); // .text:100158D0
void FUNC_10015C90(TRAILER_SYNC_DATA *pTrailer); // .text:10015C90
void FUNC_10014E60(); // .text:10014E60
void FUNC_10015460(); // .text:10015460
+2 -1
View File
@@ -26,7 +26,8 @@ public:
int field_3074[MAX_VEHICLES];
int field_4FB4[MAX_VEHICLES];
char _gap6EF4[12000];
char _gap6EF4[8000];
WORD field_8E34[MAX_VEHICLES];
DWORD field_9DD4[MAX_VEHICLES];