diff --git a/saco/game/camera.cpp b/saco/game/camera.cpp index e754304..93cfa74 100644 --- a/saco/game/camera.cpp +++ b/saco/game/camera.cpp @@ -1,6 +1,7 @@ #include "game.h" #include "util.h" +#include bool byte_1014FD8C; @@ -10,7 +11,7 @@ void CCamera::SetBehindPlayer() { ScriptCommand(&lock_camera_position, 0); ScriptCommand(&restore_camera_to_user_defined); - field_0 = 0; + field_0 = NULL; ScriptCommand(&set_camera_behind_player); ScriptCommand(&restore_camera_jumpcut); } @@ -20,7 +21,7 @@ void CCamera::SetBehindPlayer() void CCamera::SetPosition(float fX, float fY, float fZ, float fRotationX, float fRotationY, float fRotationZ) { ScriptCommand(&restore_camera_to_user_defined); - field_0 = 0; + field_0 = NULL; ScriptCommand(&set_camera_position,fX,fY,fZ,fRotationX,fRotationY,fRotationZ); } @@ -29,7 +30,7 @@ void CCamera::SetPosition(float fX, float fY, float fZ, float fRotationX, float void CCamera::LookAtPoint(float fX, float fY, float fZ, int iType) { ScriptCommand(&restore_camera_to_user_defined); - field_0 = 0; + field_0 = NULL; ScriptCommand(&point_camera,fX,fY,fZ,iType); } @@ -37,7 +38,7 @@ void CCamera::LookAtPoint(float fX, float fY, float fZ, int iType) void CCamera::Restore() { - field_0 = 0; + field_0 = NULL; ScriptCommand(&restore_camera_jumpcut); } @@ -130,5 +131,48 @@ void CCamera::InterpolateLookAt(VECTOR *vecFrom, VECTOR *vecTo, int iTime, BYTE //----------------------------------------------------------- +void CCamera::sub_1009D660(CEntity *pEntity) +{ + field_0 = pEntity; + if(pEntity) { + MATRIX4X4 mat; + pEntity->GetMatrix(&mat); + if(unnamed_100B4B50(&mat.pos)) { + InterpolatePosition(&mat.pos, &mat.pos, 100, 1); + } + } +} +//----------------------------------------------------------- + +void CCamera::sub_1009D6B0() +{ + if(!field_0 || field_0->m_pEntity) return; + + MATRIX4X4 mat; + field_0->GetMatrix(&mat); + if(unnamed_100B4B50(&mat.pos)) { + InterpolatePosition(&mat.pos, &mat.pos, 100, 1); + } +} + +//----------------------------------------------------------- + +float CCamera::GetDistanceFromPoint(VECTOR *vecPos) +{ + VECTOR vecCameraPos; + float fSX,fSY,fSZ; + + vecCameraPos.X = *(float*)0xB6F9CC; + vecCameraPos.Y = *(float*)0xB6F9D0; + vecCameraPos.Z = *(float*)0xB6F9D4; + + fSX = (vecPos->X - vecCameraPos.X) * (vecPos->X - vecCameraPos.X); + fSY = (vecPos->Y - vecCameraPos.Y) * (vecPos->Y - vecCameraPos.Y); + fSZ = (vecPos->Z - vecCameraPos.Z) * (vecPos->Z - vecCameraPos.Z); + + return (float)sqrt(fSX + fSY + fSZ); +} + +//----------------------------------------------------------- diff --git a/saco/game/camera.h b/saco/game/camera.h index cdfd568..1caa3e0 100644 --- a/saco/game/camera.h +++ b/saco/game/camera.h @@ -8,7 +8,7 @@ class CCamera // size: 8 { public: - int field_0; + CEntity *field_0; MATRIX4X4 *m_matPos; public: void SetBehindPlayer(); @@ -21,9 +21,12 @@ public: void Attach(int unk1, int unk2, int unk3); void InterpolatePosition(VECTOR *vecFrom, VECTOR *vecTo, int iTime, BYTE byteCut); void InterpolateLookAt(VECTOR *vecFrom, VECTOR *vecTo, int iTime, BYTE byteCut); + void sub_1009D660(CEntity *pEntity); + void sub_1009D6B0(); + float GetDistanceFromPoint(VECTOR *vecPos); CCamera() { m_matPos = (MATRIX4X4 *)ADDR_CAMERA; - field_0 = 0; + field_0 = NULL; } }; diff --git a/saco/game/util.cpp b/saco/game/util.cpp index e455336..5d60496 100644 --- a/saco/game/util.cpp +++ b/saco/game/util.cpp @@ -1350,6 +1350,21 @@ BYTE __stdcall FindPlayerNumFromPedPtr(DWORD dwPedPtr) return 0; } +//----------------------------------------------------------- + + + + + + +bool unnamed_100B4B50(VECTOR *vecPos) +{ + return + vecPos->X < 20000.0f && vecPos->X > -20000.0f && + vecPos->Y < 20000.0f && vecPos->Y > -20000.0f && + vecPos->Z < 100000.0f && vecPos->Z > -10000.0f; +} + diff --git a/saco/game/util.h b/saco/game/util.h index 0da587e..8f8cb63 100644 --- a/saco/game/util.h +++ b/saco/game/util.h @@ -32,3 +32,5 @@ void GameResetRadarColors(); BOOL IsFileOrDirectoryExists(char * szPath); DWORD unnamed_100B6100(char *szString, int nMaxLen); + +bool unnamed_100B4B50(VECTOR *vecPos);