diff --git a/src/audio/sampman_miles.cpp b/src/audio/sampman_miles.cpp index caf2917f..a2a206a4 100644 --- a/src/audio/sampman_miles.cpp +++ b/src/audio/sampman_miles.cpp @@ -1450,6 +1450,10 @@ cSampleManager::IsPedCommentLoaded(uint32 nComment) for ( int32 i = 0; i < _TODOCONST(3); i++ ) { 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 64b763ec..30efd7f5 100644 --- a/src/audio/sampman_oal.cpp +++ b/src/audio/sampman_oal.cpp @@ -780,6 +780,10 @@ cSampleManager::IsPedCommentLoaded(uint32 nComment) for ( int32 i = 0; i < _TODOCONST(3); i++ ) { 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/control/CarCtrl.cpp b/src/control/CarCtrl.cpp index 963ef693..c1d89884 100644 --- a/src/control/CarCtrl.cpp +++ b/src/control/CarCtrl.cpp @@ -498,8 +498,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/control/Script.cpp b/src/control/Script.cpp index 50dc6b7b..3bcfa745 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -5661,8 +5661,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: diff --git a/src/control/TrafficLights.cpp b/src/control/TrafficLights.cpp index f2dd6814..500d6af2 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); } 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); diff --git a/src/core/PlayerInfo.cpp b/src/core/PlayerInfo.cpp index 3db42d8b..d7b3f0e5 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 diff --git a/src/core/Pools.cpp b/src/core/Pools.cpp index b361c36f..17b9e08d 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()); @@ -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 diff --git a/src/modelinfo/ClumpModelInfo.cpp b/src/modelinfo/ClumpModelInfo.cpp index 82241d04..3fa9a36f 100644 --- a/src/modelinfo/ClumpModelInfo.cpp +++ b/src/modelinfo/ClumpModelInfo.cpp @@ -74,7 +74,6 @@ CClumpModelInfo::SetClump(RpClump *clump) AddTexDictionaryRef(); if(GetAnimFileIndex() != -1) CAnimManager::AddAnimBlockRef(GetAnimFileIndex()); - if(IsClumpSkinned(clump)){ int i; RpHAnimHierarchy *hier; 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)); diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index 91b74b96..8bfa6654 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -16049,7 +16049,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(); @@ -17621,23 +17625,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); } @@ -17645,19 +17651,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/PedIK.cpp b/src/peds/PedIK.cpp index 0c7509eb..f74d82bf 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; 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/skel/glfw/glfw.cpp b/src/skel/glfw/glfw.cpp index e74e83dd..c60c5cd9 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) diff --git a/src/vehicles/Boat.cpp b/src/vehicles/Boat.cpp index 2f056b02..784d859f 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) diff --git a/src/vehicles/Cranes.cpp b/src/vehicles/Cranes.cpp index 764f9a7c..043f1c73 100644 --- a/src/vehicles/Cranes.cpp +++ b/src/vehicles/Cranes.cpp @@ -181,7 +181,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; } } diff --git a/src/weapons/Weapon.cpp b/src/weapons/Weapon.cpp index 8ce39ceb..18c605bc 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