From a0b3117ee4c39ef546257746996411433476e8b5 Mon Sep 17 00:00:00 2001 From: Filip Gawin Date: Wed, 13 May 2020 02:01:42 +0200 Subject: [PATCH 01/16] Revert to memcpy --- src/core/Pools.cpp | 2 +- src/objects/ParticleObject.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/Pools.cpp b/src/core/Pools.cpp index b361c36f..58605f0a 100644 --- a/src/core/Pools.cpp +++ b/src/core/Pools.cpp @@ -90,7 +90,7 @@ CPools::MakeSureSlotInObjectPoolIsEmpty(int32 slot) // relocate to another slot?? CObject *newObject = new CObject(object->GetModelIndex(), false); CWorld::Remove(object); -#ifdef FIX_BUGS +#if 0 // todo better *newObject = *object; #else memcpy(newObject, object, ms_pObjectPool->GetMaxEntrySize()); diff --git a/src/objects/ParticleObject.cpp b/src/objects/ParticleObject.cpp index 2fbe6195..a8afaf6c 100644 --- a/src/objects/ParticleObject.cpp +++ b/src/objects/ParticleObject.cpp @@ -1127,7 +1127,7 @@ CParticleObject::SaveParticle(uint8 *buffer, uint32 *length) for ( CParticleObject *p = pCloseListHead; p != NULL; p = p->m_pNext ) { -#ifdef FIX_BUGS +#if 0 // todo better *(CParticleObject*)buffer = *p; #else memcpy(buffer, p, sizeof(CParticleObject)); @@ -1137,7 +1137,7 @@ CParticleObject::SaveParticle(uint8 *buffer, uint32 *length) for ( CParticleObject *p = pFarListHead; p != NULL; p = p->m_pNext ) { -#ifdef FIX_BUGS +#if 0 // todo better *(CParticleObject*)buffer = *p; #else memcpy(buffer, p, sizeof(CParticleObject)); From 4ac53960f5a38426da73f3a1779539266055a3b9 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Wed, 13 May 2020 03:43:20 +0300 Subject: [PATCH 02/16] Changing save/load for CPlayerInfo because of alignment crap --- src/core/PlayerInfo.cpp | 66 +++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 36 deletions(-) diff --git a/src/core/PlayerInfo.cpp b/src/core/PlayerInfo.cpp index ec6d3023..487f536f 100644 --- a/src/core/PlayerInfo.cpp +++ b/src/core/PlayerInfo.cpp @@ -275,47 +275,41 @@ CPlayerInfo::SavePlayerInfo(uint8 *buf, uint32 *size) // Interesting *size = sizeof(CPlayerInfo); -INITSAVEBUF - WriteSaveBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMoney); - WriteSaveBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_WBState); - WriteSaveBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nWBTime); - WriteSaveBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTrafficMultiplier); - WriteSaveBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_fRoadDensity); - WriteSaveBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney); - WriteSaveBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages); - WriteSaveBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages); - WriteSaveBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bInfiniteSprint); - WriteSaveBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFastReload); - WriteSaveBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfJailFree); - WriteSaveBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfHospitalFree); - for (int i = 0; i < sizeof(CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName); i++) { - WriteSaveBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName[i]); - } -// Save struct is different -// VALIDATESAVEBUF(*size) +#define CopyToBuf(buf, data) memcpy(buf, &data, sizeof(data)); buf += sizeof(data); + CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMoney); + CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_WBState); + CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nWBTime); + CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTrafficMultiplier); + CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_fRoadDensity); + CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney); + CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages); + CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages); + CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bInfiniteSprint); + CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFastReload); + CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfJailFree); + CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfHospitalFree); + CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName); +#undef CopyToBuf } void CPlayerInfo::LoadPlayerInfo(uint8 *buf, uint32 size) { -INITSAVEBUF - CWorld::Players[CWorld::PlayerInFocus].m_nMoney = ReadSaveBuf(buf); - CWorld::Players[CWorld::PlayerInFocus].m_WBState = ReadSaveBuf(buf); - CWorld::Players[CWorld::PlayerInFocus].m_nWBTime = ReadSaveBuf(buf); - CWorld::Players[CWorld::PlayerInFocus].m_nTrafficMultiplier = ReadSaveBuf(buf); - CWorld::Players[CWorld::PlayerInFocus].m_fRoadDensity = ReadSaveBuf(buf); - CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney = ReadSaveBuf(buf); - CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages = ReadSaveBuf(buf); - CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages = ReadSaveBuf(buf); - CWorld::Players[CWorld::PlayerInFocus].m_bInfiniteSprint = ReadSaveBuf(buf); - CWorld::Players[CWorld::PlayerInFocus].m_bFastReload = ReadSaveBuf(buf); - CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfJailFree = ReadSaveBuf(buf); - CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfHospitalFree = ReadSaveBuf(buf); - for (int i = 0; i < sizeof(CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName); i++) { - CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName[i] = ReadSaveBuf(buf); - } -// Save struct is different -// VALIDATESAVEBUF(size) +#define CopyFromBuf(buf, data) memcpy(&data, buf, sizeof(data)); buf += sizeof(data); + CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMoney); + CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_WBState); + CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nWBTime); + CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTrafficMultiplier); + CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_fRoadDensity); + CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney); + CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages); + CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages); + CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bInfiniteSprint); + CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFastReload); + CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfJailFree); + CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfHospitalFree); + CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName) +#undef CopyFromBuf } void From 7aeac06fdb9bd43addad145cad1763dc58063624 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Wed, 13 May 2020 05:31:14 +0300 Subject: [PATCH 03/16] Redoing some pool reading for better alignment --- src/core/Pools.cpp | 150 +++++++++++++++++++++++++-------------------- src/math/Matrix.h | 5 ++ 2 files changed, 90 insertions(+), 65 deletions(-) diff --git a/src/core/Pools.cpp b/src/core/Pools.cpp index 58605f0a..17b9e08d 100644 --- a/src/core/Pools.cpp +++ b/src/core/Pools.cpp @@ -102,6 +102,9 @@ CPools::MakeSureSlotInObjectPoolIsEmpty(int32 slot) } } +#define CopyFromBuf(buf, data) memcpy(&data, buf, sizeof(data)); SkipSaveBuf(buf, sizeof(data)); +#define CopyToBuf(buf, data) memcpy(buf, &data, sizeof(data)); SkipSaveBuf(buf, sizeof(data)); + void CPools::LoadVehiclePool(uint8* buf, uint32 size) { INITSAVEBUF @@ -266,10 +269,10 @@ INITSAVEBUF if (pObject->ObjectCreatedBy == MISSION_OBJECT) ++nObjects; } - *size = nObjects * (sizeof(int16) + sizeof(int) + sizeof(CCompressedMatrixNotAligned) + sizeof(uint32) + - sizeof(float) + sizeof(CCompressedMatrixNotAligned) + sizeof(uint32) + sizeof(int8) + 7 * sizeof(bool) + sizeof(float) + + *size = nObjects * (sizeof(int16) + sizeof(int) + sizeof(CCompressedMatrix) + + sizeof(float) + sizeof(CCompressedMatrix) + sizeof(int8) + 7 * sizeof(bool) + sizeof(float) + sizeof(int8) + sizeof(int8) + sizeof(uint32) + 2 * sizeof(uint32)) + sizeof(int); - WriteSaveBuf(buf, nObjects); + CopyToBuf(buf, nObjects); for (int i = 0; i < nPoolSize; i++) { CObject* pObject = GetObjectPool()->GetSlot(i); if (!pObject) @@ -282,33 +285,32 @@ INITSAVEBUF bool bGlassBroken = pObject->bGlassBroken; bool bHasBeenDamaged = pObject->bHasBeenDamaged; bool bUseVehicleColours = pObject->bUseVehicleColours; - CCompressedMatrixNotAligned tmp; - WriteSaveBuf(buf, pObject->GetModelIndex()); - WriteSaveBuf(buf, GetObjectRef(pObject)); + CCompressedMatrix tmp; + CopyToBuf(buf, pObject->m_modelIndex); + int32 ref = GetObjectRef(pObject); + CopyToBuf(buf, ref); tmp.CompressFromFullMatrix(pObject->GetMatrix()); - WriteSaveBuf(buf, tmp); - WriteSaveBuf(buf, (uint32)0); // game writes ununitialized data here - WriteSaveBuf(buf, pObject->m_fUprootLimit); + CopyToBuf(buf, tmp); + CopyToBuf(buf, pObject->m_fUprootLimit); tmp.CompressFromFullMatrix(pObject->m_objectMatrix); - WriteSaveBuf(buf, tmp); - WriteSaveBuf(buf, (uint32)0); // same - WriteSaveBuf(buf, pObject->ObjectCreatedBy); - WriteSaveBuf(buf, bIsPickup); - WriteSaveBuf(buf, bPickupObjWithMessage); - WriteSaveBuf(buf, bOutOfStock); - WriteSaveBuf(buf, bGlassCracked); - WriteSaveBuf(buf, bGlassBroken); - WriteSaveBuf(buf, bHasBeenDamaged); - WriteSaveBuf(buf, bUseVehicleColours); - WriteSaveBuf(buf, pObject->m_fCollisionDamageMultiplier); - WriteSaveBuf(buf, pObject->m_nCollisionDamageEffect); - WriteSaveBuf(buf, pObject->m_nSpecialCollisionResponseCases); - WriteSaveBuf(buf, pObject->m_nEndOfLifeTime); + CopyToBuf(buf, tmp); + CopyToBuf(buf, pObject->ObjectCreatedBy); + CopyToBuf(buf, bIsPickup); + CopyToBuf(buf, bPickupObjWithMessage); + CopyToBuf(buf, bOutOfStock); + CopyToBuf(buf, bGlassCracked); + CopyToBuf(buf, bGlassBroken); + CopyToBuf(buf, bHasBeenDamaged); + CopyToBuf(buf, bUseVehicleColours); + CopyToBuf(buf, pObject->m_fCollisionDamageMultiplier); + CopyToBuf(buf, pObject->m_nCollisionDamageEffect); + CopyToBuf(buf, pObject->m_nSpecialCollisionResponseCases); + CopyToBuf(buf, pObject->m_nEndOfLifeTime); #ifdef COMPATIBLE_SAVES pObject->SaveEntityFlags(buf); #else - WriteSaveBuf(buf, (pObject->GetAddressOfEntityProperties())[0]); - WriteSaveBuf(buf, (pObject->GetAddressOfEntityProperties())[1]); + CopyToBuf(buf, (pObject->GetAddressOfEntityProperties())[0]); + CopyToBuf(buf, (pObject->GetAddressOfEntityProperties())[1]); #endif } } @@ -318,35 +320,44 @@ VALIDATESAVEBUF(*size) void CPools::LoadObjectPool(uint8* buf, uint32 size) { INITSAVEBUF - int nObjects = ReadSaveBuf(buf); + int nObjects; + CopyFromBuf(buf, nObjects); for (int i = 0; i < nObjects; i++) { - int16 mi = ReadSaveBuf(buf); - int ref = ReadSaveBuf(buf); + int16 mi; + CopyFromBuf(buf, mi); + int ref; + CopyFromBuf(buf, ref); char* obuf = new char[sizeof(CObject)]; CObject* pBufferObject = (CObject*)obuf; - CCompressedMatrixNotAligned tmp; - tmp = ReadSaveBuf(buf); + CCompressedMatrix tmp; + CopyFromBuf(buf, tmp); tmp.DecompressIntoFullMatrix(pBufferObject->GetMatrix()); - ReadSaveBuf(buf); - pBufferObject->m_fUprootLimit = ReadSaveBuf(buf); - tmp = ReadSaveBuf(buf); + CopyFromBuf(buf, pBufferObject->m_fUprootLimit); + CopyFromBuf(buf, tmp); tmp.DecompressIntoFullMatrix(pBufferObject->m_objectMatrix); - ReadSaveBuf(buf); - pBufferObject->ObjectCreatedBy = ReadSaveBuf(buf); - pBufferObject->bIsPickup = ReadSaveBuf(buf); - pBufferObject->bPickupObjWithMessage = ReadSaveBuf(buf); - pBufferObject->bOutOfStock = ReadSaveBuf(buf); - pBufferObject->bGlassCracked = ReadSaveBuf(buf); - pBufferObject->bGlassBroken = ReadSaveBuf(buf); - pBufferObject->bHasBeenDamaged = ReadSaveBuf(buf); - pBufferObject->bUseVehicleColours = ReadSaveBuf(buf); - pBufferObject->m_fCollisionDamageMultiplier = ReadSaveBuf(buf); - pBufferObject->m_nCollisionDamageEffect = ReadSaveBuf(buf); - pBufferObject->m_nSpecialCollisionResponseCases = ReadSaveBuf(buf); - pBufferObject->m_nEndOfLifeTime = ReadSaveBuf(buf); + CopyFromBuf(buf, pBufferObject->ObjectCreatedBy); + int8 bitFlag; + CopyFromBuf(buf, bitFlag); + pBufferObject->bIsPickup = bitFlag; + CopyFromBuf(buf, bitFlag); + pBufferObject->bPickupObjWithMessage = bitFlag; + CopyFromBuf(buf, bitFlag); + pBufferObject->bOutOfStock = bitFlag; + CopyFromBuf(buf, bitFlag); + pBufferObject->bGlassCracked = bitFlag; + CopyFromBuf(buf, bitFlag); + pBufferObject->bGlassBroken = bitFlag; + CopyFromBuf(buf, bitFlag); + pBufferObject->bHasBeenDamaged = bitFlag; + CopyFromBuf(buf, bitFlag); + pBufferObject->bUseVehicleColours = bitFlag; + CopyFromBuf(buf, pBufferObject->m_fCollisionDamageMultiplier); + CopyFromBuf(buf, pBufferObject->m_nCollisionDamageEffect); + CopyFromBuf(buf, pBufferObject->m_nSpecialCollisionResponseCases); + CopyFromBuf(buf, pBufferObject->m_nEndOfLifeTime); #ifndef COMPATIBLE_SAVES - (pBufferObject->GetAddressOfEntityProperties())[0] = ReadSaveBuf(buf); - (pBufferObject->GetAddressOfEntityProperties())[1] = ReadSaveBuf(buf); + CopyFromBuf(buf, (pBufferObject->GetAddressOfEntityProperties())[0]); + CopyFromBuf(buf, (pBufferObject->GetAddressOfEntityProperties())[1]); #endif if (GetObjectPool()->GetSlot(ref >> 8)) CPopulation::ConvertToDummyObject(GetObjectPool()->GetSlot(ref >> 8)); @@ -394,38 +405,45 @@ INITSAVEBUF } *size = sizeof(int) + nNumPeds * (sizeof(uint32) + sizeof(int16) + sizeof(int) + CPlayerPed::nSaveStructSize + sizeof(CWanted::MaximumWantedLevel) + sizeof(CWanted::nMaximumWantedLevel) + MAX_MODEL_NAME); - WriteSaveBuf(buf, nNumPeds); + CopyToBuf(buf, nNumPeds); for (int i = 0; i < nPoolSize; i++) { CPed* pPed = GetPedPool()->GetSlot(i); if (!pPed) continue; if (!pPed->bInVehicle && pPed->m_nPedType == PEDTYPE_PLAYER1) { - WriteSaveBuf(buf, pPed->m_nPedType); - WriteSaveBuf(buf, pPed->GetModelIndex()); - WriteSaveBuf(buf, GetPedRef(pPed)); + CopyToBuf(buf, pPed->m_nPedType); + CopyToBuf(buf, pPed->m_modelIndex); + int32 ref = GetPedRef(pPed); + CopyToBuf(buf, ref); #ifdef COMPATIBLE_SAVES pPed->Save(buf); #else memcpy(buf, pPed, sizeof(CPlayerPed)); SkipSaveBuf(buf, sizeof(CPlayerPed)); #endif - WriteSaveBuf(buf, CWanted::MaximumWantedLevel); - WriteSaveBuf(buf, CWanted::nMaximumWantedLevel); + CopyToBuf(buf, CWanted::MaximumWantedLevel); + CopyToBuf(buf, CWanted::nMaximumWantedLevel); memcpy(buf, CModelInfo::GetModelInfo(pPed->GetModelIndex())->GetName(), MAX_MODEL_NAME); SkipSaveBuf(buf, MAX_MODEL_NAME); } } VALIDATESAVEBUF(*size); +#undef CopyToBuf } void CPools::LoadPedPool(uint8* buf, uint32 size) { INITSAVEBUF - int nPeds = ReadSaveBuf(buf); + int nPeds; + CopyFromBuf(buf, nPeds); for (int i = 0; i < nPeds; i++) { - uint32 pedtype = ReadSaveBuf(buf); - int16 model = ReadSaveBuf(buf); - int ref = ReadSaveBuf(buf); + uint32 pedtype; + int16 model; + int ref; + + CopyFromBuf(buf, pedtype); + CopyFromBuf(buf, model); + CopyFromBuf(buf, ref); #ifdef COMPATIBLE_SAVES CPed* pPed; @@ -443,8 +461,8 @@ INITSAVEBUF pPed->Load(buf); if (pedtype == PEDTYPE_PLAYER1) { - CWanted::MaximumWantedLevel = ReadSaveBuf(buf); - CWanted::nMaximumWantedLevel = ReadSaveBuf(buf); + CopyFromBuf(buf, CWanted::MaximumWantedLevel); + CopyFromBuf(buf, CWanted::nMaximumWantedLevel); SkipSaveBuf(buf, MAX_MODEL_NAME); } @@ -462,10 +480,9 @@ INITSAVEBUF if (pedtype == PEDTYPE_PLAYER1) { // always true memcpy(pbuf, buf, sizeof(CPlayerPed)); SkipSaveBuf(buf, sizeof(CPlayerPed)); - CWanted::MaximumWantedLevel = ReadSaveBuf(buf); - CWanted::nMaximumWantedLevel = ReadSaveBuf(buf); - memcpy(name, buf, MAX_MODEL_NAME); - SkipSaveBuf(buf, MAX_MODEL_NAME); + CopyFromBuf(buf, CWanted::MaximumWantedLevel); + CopyFromBuf(buf, CWanted::nMaximumWantedLevel); + CopyFromBuf(buf, name); } CStreaming::RequestSpecialModel(model, name, STREAMFLAGS_DONT_REMOVE); CStreaming::LoadAllRequestedModels(false); @@ -476,7 +493,7 @@ INITSAVEBUF pPlayerPed->m_fMaxStamina = pBufferPlayer->m_fMaxStamina; pPed = pPlayerPed; } - pPed->GetPosition() = pBufferPlayer->GetPosition(); + pPed->SetPosition(pBufferPlayer->GetPosition()); pPed->m_fHealth = pBufferPlayer->m_fHealth; pPed->m_fArmour = pBufferPlayer->m_fArmour; pPed->CharCreatedBy = pBufferPlayer->CharCreatedBy; @@ -495,3 +512,6 @@ INITSAVEBUF } VALIDATESAVEBUF(size) } + +#undef CopyFromBuf +#undef CopyToBuf \ No newline at end of file diff --git a/src/math/Matrix.h b/src/math/Matrix.h index 35972e7f..b7e055c5 100644 --- a/src/math/Matrix.h +++ b/src/math/Matrix.h @@ -313,3 +313,8 @@ public: other.Reorthogonalise(); } }; + +class CCompressedMatrix : public CCompressedMatrixNotAligned +{ + int _alignment; // no clue what would this align to +}; \ No newline at end of file From 509d57edcb4e60be87548b202b33cef508f11fd1 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Wed, 13 May 2020 13:29:17 +0300 Subject: [PATCH 04/16] car control and cranes fixes --- src/control/CarCtrl.cpp | 2 -- src/vehicles/Cranes.cpp | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/control/CarCtrl.cpp b/src/control/CarCtrl.cpp index d6ccc8bb..cd86ce4c 100644 --- a/src/control/CarCtrl.cpp +++ b/src/control/CarCtrl.cpp @@ -461,8 +461,6 @@ CCarCtrl::GenerateOneRandomCar() directionCurrentLinkY = pCurrentLink->GetDirY() * pVehicle->AutoPilot.m_nCurrentDirection; directionNextLinkX = pNextLink->GetDirX() * pVehicle->AutoPilot.m_nNextDirection; directionNextLinkY = pNextLink->GetDirY() * pVehicle->AutoPilot.m_nNextDirection; - pCurNode = &ThePaths.m_pathNodes[pVehicle->AutoPilot.m_nCurrentRouteNode]; - pNextNode = &ThePaths.m_pathNodes[pVehicle->AutoPilot.m_nNextRouteNode]; } #else float currentPathLinkForwardX = pVehicle->AutoPilot.m_nCurrentDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo].GetDirX(); diff --git a/src/vehicles/Cranes.cpp b/src/vehicles/Cranes.cpp index 9c1442c4..9c8f9fda 100644 --- a/src/vehicles/Cranes.cpp +++ b/src/vehicles/Cranes.cpp @@ -180,7 +180,7 @@ bool CCranes::IsThisCarPickedUp(float X, float Y, CVehicle* pVehicle) for (int i = 0; i < NumCranes; i++) { float distance = (CVector2D(X, Y) - aCranes[i].m_pCraneEntity->GetPosition()).Magnitude(); if (distance < MAX_DISTANCE_TO_FIND_CRANE && aCranes[i].m_pVehiclePickedUp == pVehicle) { - if (aCranes[i].m_nCraneStatus == CCrane::LIFTING_TARGET || aCranes[i].m_nCraneStatus == CCrane::ROTATING_TARGET) + if (aCranes[i].m_nCraneState == CCrane::LIFTING_TARGET || aCranes[i].m_nCraneState == CCrane::ROTATING_TARGET) result = true; } } From 3f1001b86bffe6c5de8b7c6ce047d0f2bc3472b4 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Wed, 13 May 2020 16:24:00 +0300 Subject: [PATCH 05/16] More save/load alignment fixes --- src/peds/Ped.cpp | 32 ++++++++++++++++++-------------- src/peds/PlayerPed.cpp | 24 ++++++++++++++---------- src/weapons/Weapon.cpp | 29 +++++++++++++++++------------ 3 files changed, 49 insertions(+), 36 deletions(-) diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index f4e99d4d..d261385a 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -17738,23 +17738,25 @@ CPed::SetExitBoat(CVehicle *boat) } #ifdef COMPATIBLE_SAVES +#define CopyFromBuf(buf, data) memcpy(&data, buf, sizeof(data)); SkipSaveBuf(buf, sizeof(data)); +#define CopyToBuf(buf, data) memcpy(buf, &data, sizeof(data)); SkipSaveBuf(buf, sizeof(data)); void CPed::Save(uint8*& buf) { SkipSaveBuf(buf, 52); - WriteSaveBuf(buf, GetPosition().x); - WriteSaveBuf(buf, GetPosition().y); - WriteSaveBuf(buf, GetPosition().z); + CopyToBuf(buf, GetPosition().x); + CopyToBuf(buf, GetPosition().y); + CopyToBuf(buf, GetPosition().z); SkipSaveBuf(buf, 288); - WriteSaveBuf(buf, CharCreatedBy); + CopyToBuf(buf, CharCreatedBy); SkipSaveBuf(buf, 351); - WriteSaveBuf(buf, m_fHealth); - WriteSaveBuf(buf, m_fArmour); + CopyToBuf(buf, m_fHealth); + CopyToBuf(buf, m_fArmour); SkipSaveBuf(buf, 148); for (int i = 0; i < 13; i++) // has to be hardcoded m_weapons[i].Save(buf); SkipSaveBuf(buf, 5); - WriteSaveBuf(buf, m_maxWeaponTypeAllowed); + CopyToBuf(buf, m_maxWeaponTypeAllowed); SkipSaveBuf(buf, 162); } @@ -17762,19 +17764,21 @@ void CPed::Load(uint8*& buf) { SkipSaveBuf(buf, 52); - GetMatrix().GetPosition().x = ReadSaveBuf(buf); - GetMatrix().GetPosition().y = ReadSaveBuf(buf); - GetMatrix().GetPosition().z = ReadSaveBuf(buf); + CopyFromBuf(buf, GetMatrix().GetPosition().x); + CopyFromBuf(buf, GetMatrix().GetPosition().y); + CopyFromBuf(buf, GetMatrix().GetPosition().z); SkipSaveBuf(buf, 288); - CharCreatedBy = ReadSaveBuf(buf); + CopyFromBuf(buf, CharCreatedBy); SkipSaveBuf(buf, 351); - m_fHealth = ReadSaveBuf(buf); - m_fArmour = ReadSaveBuf(buf); + CopyFromBuf(buf, m_fHealth); + CopyFromBuf(buf, m_fArmour); SkipSaveBuf(buf, 148); for (int i = 0; i < 13; i++) // has to be hardcoded m_weapons[i].Load(buf); SkipSaveBuf(buf, 5); - m_maxWeaponTypeAllowed = ReadSaveBuf(buf); + CopyFromBuf(buf, m_maxWeaponTypeAllowed); SkipSaveBuf(buf, 162); } +#undef CopyFromBuf +#undef CopyToBuf #endif diff --git a/src/peds/PlayerPed.cpp b/src/peds/PlayerPed.cpp index 92e3d358..3c6fad57 100644 --- a/src/peds/PlayerPed.cpp +++ b/src/peds/PlayerPed.cpp @@ -1513,17 +1513,19 @@ CPlayerPed::ProcessControl(void) } #ifdef COMPATIBLE_SAVES +#define CopyFromBuf(buf, data) memcpy(&data, buf, sizeof(data)); SkipSaveBuf(buf, sizeof(data)); +#define CopyToBuf(buf, data) memcpy(buf, &data, sizeof(data)); SkipSaveBuf(buf, sizeof(data)); void CPlayerPed::Save(uint8*& buf) { CPed::Save(buf); SkipSaveBuf(buf, 16); - WriteSaveBuf(buf, m_fMaxStamina); + CopyToBuf(buf, m_fMaxStamina); SkipSaveBuf(buf, 28); - WriteSaveBuf(buf, m_nTargettableObjects[0]); - WriteSaveBuf(buf, m_nTargettableObjects[1]); - WriteSaveBuf(buf, m_nTargettableObjects[2]); - WriteSaveBuf(buf, m_nTargettableObjects[3]); + CopyToBuf(buf, m_nTargettableObjects[0]); + CopyToBuf(buf, m_nTargettableObjects[1]); + CopyToBuf(buf, m_nTargettableObjects[2]); + CopyToBuf(buf, m_nTargettableObjects[3]); SkipSaveBuf(buf, 116); } @@ -1532,12 +1534,14 @@ CPlayerPed::Load(uint8*& buf) { CPed::Load(buf); SkipSaveBuf(buf, 16); - m_fMaxStamina = ReadSaveBuf(buf); + CopyFromBuf(buf, m_fMaxStamina); SkipSaveBuf(buf, 28); - m_nTargettableObjects[0] = ReadSaveBuf(buf); - m_nTargettableObjects[1] = ReadSaveBuf(buf); - m_nTargettableObjects[2] = ReadSaveBuf(buf); - m_nTargettableObjects[3] = ReadSaveBuf(buf); + CopyFromBuf(buf, m_nTargettableObjects[0]); + CopyFromBuf(buf, m_nTargettableObjects[1]); + CopyFromBuf(buf, m_nTargettableObjects[2]); + CopyFromBuf(buf, m_nTargettableObjects[3]); SkipSaveBuf(buf, 116); } +#undef CopyFromBuf +#undef CopyToBuf #endif diff --git a/src/weapons/Weapon.cpp b/src/weapons/Weapon.cpp index 67e01a2e..88c4788c 100644 --- a/src/weapons/Weapon.cpp +++ b/src/weapons/Weapon.cpp @@ -2284,27 +2284,32 @@ CWeapon::ProcessLineOfSight(CVector const &point1, CVector const &point2, CColPo } #ifdef COMPATIBLE_SAVES +#define CopyFromBuf(buf, data) memcpy(&data, buf, sizeof(data)); SkipSaveBuf(buf, sizeof(data)); +#define CopyToBuf(buf, data) memcpy(buf, &data, sizeof(data)); SkipSaveBuf(buf, sizeof(data)); void CWeapon::Save(uint8*& buf) { - WriteSaveBuf(buf, m_eWeaponType); - WriteSaveBuf(buf, m_eWeaponState); - WriteSaveBuf(buf, m_nAmmoInClip); - WriteSaveBuf(buf, m_nAmmoTotal); - WriteSaveBuf(buf, m_nTimer); - WriteSaveBuf(buf, m_bAddRotOffset); + CopyToBuf(buf, m_eWeaponType); + CopyToBuf(buf, m_eWeaponState); + CopyToBuf(buf, m_nAmmoInClip); + CopyToBuf(buf, m_nAmmoTotal); + CopyToBuf(buf, m_nTimer); + CopyToBuf(buf, m_bAddRotOffset); SkipSaveBuf(buf, 3); } void CWeapon::Load(uint8*& buf) { - m_eWeaponType = (eWeaponType)ReadSaveBuf(buf); - m_eWeaponState = (eWeaponState)ReadSaveBuf(buf); - m_nAmmoInClip = ReadSaveBuf(buf); - m_nAmmoTotal = ReadSaveBuf(buf); - m_nTimer = ReadSaveBuf(buf); - m_bAddRotOffset = ReadSaveBuf(buf); + CopyFromBuf(buf, m_eWeaponType); + CopyFromBuf(buf, m_eWeaponState); + CopyFromBuf(buf, m_nAmmoInClip); + CopyFromBuf(buf, m_nAmmoTotal); + CopyFromBuf(buf, m_nTimer); + CopyFromBuf(buf, m_bAddRotOffset); SkipSaveBuf(buf, 3); } + +#undef CopyFromBuf +#undef CopyToBuf #endif From 1237941180dd8e56ad65fdcfdbd893ca4ce7579e Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Wed, 13 May 2020 17:33:50 +0300 Subject: [PATCH 06/16] fixed traffic lights --- src/control/TrafficLights.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/control/TrafficLights.cpp b/src/control/TrafficLights.cpp index b2f0900e..278366a3 100644 --- a/src/control/TrafficLights.cpp +++ b/src/control/TrafficLights.cpp @@ -137,7 +137,7 @@ void CTrafficLights::ScanForLightsOnMap(void) { int x, y; - int i, j, l; + int i, j, k, l; CPtrNode *node; for(x = 0; x < NUMSECTORS_X; x++) @@ -188,8 +188,9 @@ CTrafficLights::ScanForLightsOnMap(void) for(l = 0; l < ThePaths.m_pathNodes[i].numLinks; l++){ j = ThePaths.m_pathNodes[i].firstLink + l; if(ThePaths.ConnectionCrossesRoad(j)){ - dist2 = Abs(ThePaths.m_pathNodes[j].GetX() - light->GetPosition().x) + - Abs(ThePaths.m_pathNodes[j].GetY() - light->GetPosition().y); + k = ThePaths.ConnectedNode(j); + dist2 = Abs(ThePaths.m_pathNodes[k].GetX() - light->GetPosition().x) + + Abs(ThePaths.m_pathNodes[k].GetY() - light->GetPosition().y); if(dist1 < 15.0f || dist2 < 15.0f) ThePaths.ConnectionSetTrafficLight(j); } From 7036e80fc692f49d9997a16d05762bc295f96a97 Mon Sep 17 00:00:00 2001 From: shfil Date: Wed, 13 May 2020 17:48:07 +0200 Subject: [PATCH 07/16] Fix calloc in CdStreamPosix --- src/core/CdStreamPosix.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/CdStreamPosix.cpp b/src/core/CdStreamPosix.cpp index 7c49f5f1..4d6bcdab 100644 --- a/src/core/CdStreamPosix.cpp +++ b/src/core/CdStreamPosix.cpp @@ -168,7 +168,7 @@ CdStreamInit(int32 numChannels) gNumChannels = numChannels; - gpReadInfo = (CdReadInfo *)calloc(sizeof(CdReadInfo), numChannels); + gpReadInfo = (CdReadInfo *)calloc(numChannels, sizeof(CdReadInfo)); ASSERT( gpReadInfo != nil ); CDDEBUG("read info %p", gpReadInfo); From f5345f59eaf35cd701837ae80730495531793cfd Mon Sep 17 00:00:00 2001 From: aap Date: Thu, 14 May 2020 00:09:45 +0200 Subject: [PATCH 08/16] blacklist for glfw "joysticks" --- src/skel/glfw/glfw.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/skel/glfw/glfw.cpp b/src/skel/glfw/glfw.cpp index f0a704a8..fc23e900 100644 --- a/src/skel/glfw/glfw.cpp +++ b/src/skel/glfw/glfw.cpp @@ -715,10 +715,23 @@ void scrollCB(GLFWwindow* window, double xoffset, double yoffset); void cursorCB(GLFWwindow* window, double xpos, double ypos); void joysChangeCB(int jid, int event); +bool IsThisJoystickBlacklisted(int i) +{ + const char *joyname = glfwGetJoystickName(i); + + // this is just a keyboard and mouse + // Microsoft Microsoft® 2.4GHz Transceiver v8.0 Consumer Control + // Microsoft Microsoft® 2.4GHz Transceiver v8.0 System Control + if(strstr(joyname, "2.4GHz Transceiver")) + return true; + + return false; +} + void _InputInitialiseJoys() { for (int i = 0; i <= GLFW_JOYSTICK_LAST; i++) { - if (glfwJoystickPresent(i)) { + if (glfwJoystickPresent(i) && !IsThisJoystickBlacklisted(i)) { if (PSGLOBAL(joy1id) == -1) PSGLOBAL(joy1id) = i; else if (PSGLOBAL(joy2id) == -1) From 9b162554ca7c4368781c22df9df4fd7ab2045a43 Mon Sep 17 00:00:00 2001 From: aap Date: Thu, 14 May 2020 12:32:51 +0200 Subject: [PATCH 09/16] fixed skinned cutscene head --- src/modelinfo/ClumpModelInfo.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/modelinfo/ClumpModelInfo.cpp b/src/modelinfo/ClumpModelInfo.cpp index ccfcd304..49198437 100644 --- a/src/modelinfo/ClumpModelInfo.cpp +++ b/src/modelinfo/ClumpModelInfo.cpp @@ -78,10 +78,6 @@ CClumpModelInfo::SetClump(RpClump *clump) AddTexDictionaryRef(); RpClumpForAllAtomics(clump, SetAtomicRendererCB, nil); - // TODO: also set for player? - if(strncmp(GetName(), "playerh", 8) == 0) - RpClumpForAllAtomics(clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB); - #ifdef PED_SKIN if(IsClumpSkinned(clump)){ int i; @@ -114,8 +110,12 @@ CClumpModelInfo::SetClump(RpClump *clump) weights->w3 /= sum; } RpHAnimHierarchySetFlags(hier, (RpHAnimHierarchyFlag)(rpHANIMHIERARCHYUPDATEMODELLINGMATRICES|rpHANIMHIERARCHYUPDATELTMS)); - } + }else #endif + // do not set on skinned clip because cutscene head is not compatible with player head + if(strncmp(GetName(), "playerh", 8) == 0) + RpClumpForAllAtomics(clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB); + } void From 9d4d83db0d9b9bd2921972a030a0c53566688fbb Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Thu, 14 May 2020 14:01:24 +0300 Subject: [PATCH 10/16] some fixes --- src/audio/sampman_miles.cpp | 4 ++++ src/audio/sampman_oal.cpp | 4 ++++ src/peds/Ped.cpp | 4 ++++ src/vehicles/Boat.cpp | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/src/audio/sampman_miles.cpp b/src/audio/sampman_miles.cpp index caf2917f..e0c7170c 100644 --- a/src/audio/sampman_miles.cpp +++ b/src/audio/sampman_miles.cpp @@ -1449,7 +1449,11 @@ cSampleManager::IsPedCommentLoaded(uint32 nComment) for ( int32 i = 0; i < _TODOCONST(3); i++ ) { +#ifdef FIX_BUGS + slot = (nCurrentPedSlot - i - 1) % ARRAY_SIZE(nPedSlotSfx); +#else slot = nCurrentPedSlot - i - 1; +#endif if ( nComment == nPedSlotSfx[slot] ) return true; } diff --git a/src/audio/sampman_oal.cpp b/src/audio/sampman_oal.cpp index 64b763ec..7276a895 100644 --- a/src/audio/sampman_oal.cpp +++ b/src/audio/sampman_oal.cpp @@ -779,7 +779,11 @@ cSampleManager::IsPedCommentLoaded(uint32 nComment) for ( int32 i = 0; i < _TODOCONST(3); i++ ) { +#ifdef FIX_BUGS + slot = (nCurrentPedSlot - i - 1) % ARRAY_SIZE(nPedSlotSfx); +#else slot = nCurrentPedSlot - i - 1; +#endif if ( nComment == nPedSlotSfx[slot] ) return true; } diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index d261385a..fd8fd540 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -16166,7 +16166,11 @@ CPed::SeekCar(void) } if (dest.x == 0.0f && dest.y == 0.0f) { +#ifdef FIX_BUGS + if ((!IsPlayer() && CharCreatedBy != MISSION_CHAR) || vehToSeek->VehicleCreatedBy != MISSION_VEHICLE || vehToSeek->pDriver || !vehToSeek->CanPedOpenLocks(this)) { +#else if ((!IsPlayer() && CharCreatedBy != MISSION_CHAR) || vehToSeek->VehicleCreatedBy != MISSION_VEHICLE || vehToSeek->pDriver) { +#endif RestorePreviousState(); if (IsPlayer()) { ClearObjective(); diff --git a/src/vehicles/Boat.cpp b/src/vehicles/Boat.cpp index d992d190..72fca542 100644 --- a/src/vehicles/Boat.cpp +++ b/src/vehicles/Boat.cpp @@ -184,7 +184,11 @@ CBoat::ProcessControl(void) } float collisionDamage = pHandling->fCollisionDamageMultiplier * m_fDamageImpulse; +#ifdef FIX_BUGS + if (collisionDamage > 25.0f && GetStatus() != STATUS_WRECKED && m_fHealth >= 150.0f && !bCollisionProof) { +#else if(collisionDamage > 25.0f && GetStatus() != STATUS_WRECKED && m_fHealth >= 150.0f){ +#endif float prevHealth = m_fHealth; if(this == FindPlayerVehicle()){ if(bTakeLessDamage) From 8e0b132f43b0ac952255bf85b0d1e22e3879d694 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Thu, 14 May 2020 14:03:56 +0300 Subject: [PATCH 11/16] it works differently --- src/audio/sampman_miles.cpp | 6 +++--- src/audio/sampman_oal.cpp | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/audio/sampman_miles.cpp b/src/audio/sampman_miles.cpp index e0c7170c..a2a206a4 100644 --- a/src/audio/sampman_miles.cpp +++ b/src/audio/sampman_miles.cpp @@ -1449,10 +1449,10 @@ cSampleManager::IsPedCommentLoaded(uint32 nComment) for ( int32 i = 0; i < _TODOCONST(3); i++ ) { -#ifdef FIX_BUGS - slot = (nCurrentPedSlot - i - 1) % ARRAY_SIZE(nPedSlotSfx); -#else slot = nCurrentPedSlot - i - 1; +#ifdef FIX_BUGS + if (slot < 0) + slot += ARRAY_SIZE(nPedSlotSfx); #endif if ( nComment == nPedSlotSfx[slot] ) return true; diff --git a/src/audio/sampman_oal.cpp b/src/audio/sampman_oal.cpp index 7276a895..30efd7f5 100644 --- a/src/audio/sampman_oal.cpp +++ b/src/audio/sampman_oal.cpp @@ -779,10 +779,10 @@ cSampleManager::IsPedCommentLoaded(uint32 nComment) for ( int32 i = 0; i < _TODOCONST(3); i++ ) { -#ifdef FIX_BUGS - slot = (nCurrentPedSlot - i - 1) % ARRAY_SIZE(nPedSlotSfx); -#else slot = nCurrentPedSlot - i - 1; +#ifdef FIX_BUGS + if (slot < 0) + slot += ARRAY_SIZE(nPedSlotSfx); #endif if ( nComment == nPedSlotSfx[slot] ) return true; From b01987719ea9b20e5979b412ae32096ff3d3e6be Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Thu, 14 May 2020 15:26:59 +0300 Subject: [PATCH 12/16] fixed script error --- src/control/Script.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 13000847..357436c6 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -5601,8 +5601,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) { CollectParameters(&m_nIp, 1); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - assert(pVehicle); - UpdateCompareFlag(pVehicle->bIsInWater); + UpdateCompareFlag(pVehicle && pVehicle->bIsInWater); return 0; } case COMMAND_GET_CLOSEST_CHAR_NODE: From c21061a1998772ed9cde2e5f473966c5efd46cf4 Mon Sep 17 00:00:00 2001 From: aap Date: Thu, 14 May 2020 14:29:26 +0200 Subject: [PATCH 13/16] fixed RotateTorso --- src/peds/PedIK.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/peds/PedIK.cpp b/src/peds/PedIK.cpp index c9428cb3..ae9a85b4 100644 --- a/src/peds/PedIK.cpp +++ b/src/peds/PedIK.cpp @@ -64,8 +64,8 @@ CPedIK::RotateTorso(AnimBlendFrameData *node, LimbOrientation *limb, bool change // We can't get the parent matrix of an hanim frame but // this function is always called with PED_MID, so we know the parent frame. // Trouble is that PED_MID is "Smid" on PS2/PC but BONE_torso on mobile/xbox... - // so this doesn't exactly do what we'd like anyway - RwMatrix *mat = GetComponentMatrix(m_ped, PED_MID); + // Assuming BONE_torso, the parent is BONE_mid, so let's use that: + RwMatrix *mat = GetBoneMatrix(m_ped, BONE_mid); RwV3d vec1, vec2; vec1.x = mat->right.z; From 2fb4305a73c2aa1972daf1037189b2bc5b25ea34 Mon Sep 17 00:00:00 2001 From: aap Date: Thu, 14 May 2020 15:03:01 +0200 Subject: [PATCH 14/16] fixed hanging boot --- src/vehicles/Automobile.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vehicles/Automobile.cpp b/src/vehicles/Automobile.cpp index a880f26d..83fe44d5 100644 --- a/src/vehicles/Automobile.cpp +++ b/src/vehicles/Automobile.cpp @@ -107,7 +107,7 @@ CAutomobile::CAutomobile(int32 id, uint8 CreatedBy) else Doors[DOOR_BONNET].Init(0.0f, PI*0.3f, 1, 0); if(pHandling->Flags & HANDLING_HANGING_BOOT) - Doors[DOOR_BOOT].Init(PI*0.4f, 0.0f, 0, 0); + Doors[DOOR_BOOT].Init(-PI*0.4f, 0.0f, 0, 0); else if(pHandling->Flags & HANDLING_TAILGATE_BOOT) Doors[DOOR_BOOT].Init(0.0, HALFPI, 1, 0); else From 41e9754338c3496a9caa8fc67f892cf043713293 Mon Sep 17 00:00:00 2001 From: aap Date: Thu, 14 May 2020 15:03:01 +0200 Subject: [PATCH 15/16] fixed hanging boot --- src/vehicles/Automobile.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vehicles/Automobile.cpp b/src/vehicles/Automobile.cpp index ecf821bc..6fc0436c 100644 --- a/src/vehicles/Automobile.cpp +++ b/src/vehicles/Automobile.cpp @@ -107,7 +107,7 @@ CAutomobile::CAutomobile(int32 id, uint8 CreatedBy) else Doors[DOOR_BONNET].Init(0.0f, PI*0.3f, 1, 0); if(pHandling->Flags & HANDLING_HANGING_BOOT) - Doors[DOOR_BOOT].Init(PI*0.4f, 0.0f, 0, 0); + Doors[DOOR_BOOT].Init(-PI*0.4f, 0.0f, 0, 0); else if(pHandling->Flags & HANDLING_TAILGATE_BOOT) Doors[DOOR_BOOT].Init(0.0, HALFPI, 1, 0); else From ede6b7db6a4fd1b5c09213302208cb343307ccef Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Thu, 14 May 2020 17:15:26 +0300 Subject: [PATCH 16/16] Fix compilation --- src/peds/PedIK.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/peds/PedIK.cpp b/src/peds/PedIK.cpp index f74d82bf..9dae5ff1 100644 --- a/src/peds/PedIK.cpp +++ b/src/peds/PedIK.cpp @@ -64,8 +64,8 @@ CPedIK::RotateTorso(AnimBlendFrameData *node, LimbOrientation *limb, bool change // We can't get the parent matrix of an hanim frame but // this function is always called with PED_MID, so we know the parent frame. // Trouble is that PED_MID is "Smid" on PS2/PC but BONE_torso on mobile/xbox... - // Assuming BONE_torso, the parent is BONE_mid, so let's use that: - RwMatrix *mat = GetBoneMatrix(m_ped, BONE_mid); + // so this doesn't exactly do what we'd like anyway + RwMatrix* mat = GetComponentMatrix(m_ped, PED_MID); RwV3d vec1, vec2; vec1.x = mat->right.z;