Fix CWorld::RepositionOneObject bugs

This commit is contained in:
saml1er 2020-04-17 03:54:22 +05:00
parent 6b1093f1c8
commit 03247ce98f

View File

@ -1743,30 +1743,59 @@ CWorld::RepositionCertainDynamicObjects()
void void
CWorld::RepositionOneObject(CEntity* pEntity) CWorld::RepositionOneObject(CEntity* pEntity)
{ {
int16 modeId = pEntity->m_modelIndex; int16 modelId = pEntity->m_modelIndex;
if (MI_SINGLESTREETLIGHTS1 == modeId || MI_SINGLESTREETLIGHTS2 == modeId || MI_SINGLESTREETLIGHTS3 == modeId if (modelId == MI_SINGLESTREETLIGHTS1
|| MI_DOUBLESTREETLIGHTS == modeId || MI_TREE1 == modeId || MI_TREE2 == modeId || MI_TREE3 == modeId || modelId == MI_SINGLESTREETLIGHTS2
|| MI_TREE4 == modeId || MI_TREE5 == modeId || MI_TREE6 == modeId || MI_TREE7 == modeId || modelId == MI_SINGLESTREETLIGHTS3
|| MI_TREE8 == modeId || MI_TREE9 == modeId || MI_TREE10 == modeId || MI_TREE11 == modeId || modelId == MI_DOUBLESTREETLIGHTS
|| MI_TREE12 == modeId || MI_TREE13 == modeId || MI_TREE14 == modeId || MI_TRAFFICLIGHTS == modeId || modelId == MI_TREE1
|| MI_PARKINGMETER == modeId || MI_PHONEBOOTH1 == modeId || MI_WASTEBIN == modeId || MI_BIN == modeId || modelId == MI_TREE2
|| MI_POSTBOX1 == modeId || MI_NEWSSTAND == modeId || MI_TRAFFICCONE == modeId || MI_DUMP1 == modeId || modelId == MI_TREE3
|| MI_ROADWORKBARRIER1 == modeId || MI_BUSSIGN1 == modeId || MI_NOPARKINGSIGN1 == modeId || modelId == MI_TREE4
|| MI_PHONESIGN == modeId || MI_TAXISIGN == modeId || MI_FISHSTALL01 == modeId || MI_FISHSTALL02 == modeId || modelId == MI_TREE5
|| MI_FISHSTALL03 == modeId || MI_FISHSTALL04 == modeId || MI_BAGELSTAND2 == modeId || MI_FIRE_HYDRANT == modeId || modelId == MI_TREE6
|| MI_BOLLARDLIGHT == modeId || MI_PARKTABLE == modeId) { || modelId == MI_TREE7
|| modelId == MI_TREE8
|| modelId == MI_TREE9
|| modelId == MI_TREE10
|| modelId == MI_TREE11
|| modelId == MI_TREE12
|| modelId == MI_TREE13
|| modelId == MI_TREE14
|| modelId == MI_TRAFFICLIGHTS
|| modelId == MI_PARKINGMETER
|| modelId == MI_PHONEBOOTH1
|| modelId == MI_WASTEBIN
|| modelId == MI_BIN
|| modelId == MI_POSTBOX1
|| modelId == MI_NEWSSTAND
|| modelId == MI_TRAFFICCONE
|| modelId == MI_DUMP1
|| modelId == MI_ROADWORKBARRIER1
|| modelId == MI_BUSSIGN1
|| modelId == MI_NOPARKINGSIGN1
|| modelId == MI_PHONESIGN
|| modelId == MI_TAXISIGN
|| modelId == MI_FISHSTALL01
|| modelId == MI_FISHSTALL02
|| modelId == MI_FISHSTALL03
|| modelId == MI_FISHSTALL04
|| modelId == MI_BAGELSTAND2
|| modelId == MI_FIRE_HYDRANT
|| modelId == MI_BOLLARDLIGHT
|| modelId == MI_PARKTABLE) {
CVector& position = pEntity->m_matrix.GetPosition(); CVector& position = pEntity->m_matrix.GetPosition();
float fBoundingBoxMinZ = pEntity->GetColModel()->boundingBox.min.z; float fBoundingBoxMinZ = pEntity->GetColModel()->boundingBox.min.z;
position.z = CWorld::FindGroundZFor3DCoord(position.x, position.y, position.z + OBJECT_REPOSITION_OFFSET_Z, nil) - fBoundingBoxMinZ; position.z = CWorld::FindGroundZFor3DCoord(position.x, position.y, position.z + OBJECT_REPOSITION_OFFSET_Z, nil) - fBoundingBoxMinZ;
pEntity->m_matrix.UpdateRW(); pEntity->m_matrix.UpdateRW();
pEntity->UpdateRwFrame(); pEntity->UpdateRwFrame();
} else if (MI_BUOY == modeId) { } else if (modelId == MI_BUOY) {
float fWaterLevel = 0.0f; float fWaterLevel = 0.0f;
bool found = true; bool bFound = true;
const CVector& position = pEntity->m_matrix.GetPosition(); const CVector& position = pEntity->m_matrix.GetPosition();
float fGroundZ = CWorld::FindGroundZFor3DCoord(position.x, position.y, position.z + OBJECT_REPOSITION_OFFSET_Z, &found); float fGroundZ = CWorld::FindGroundZFor3DCoord(position.x, position.y, position.z + OBJECT_REPOSITION_OFFSET_Z, &bFound);
if (CWaterLevel::GetWaterLevelNoWaves(position.x, position.y, position.z + OBJECT_REPOSITION_OFFSET_Z, &fWaterLevel)) { if (CWaterLevel::GetWaterLevelNoWaves(position.x, position.y, position.z + OBJECT_REPOSITION_OFFSET_Z, &fWaterLevel)) {
if (!found || fWaterLevel > fGroundZ) { if (!bFound || fWaterLevel > fGroundZ) {
CColModel* pColModel = pEntity->GetColModel(); CColModel* pColModel = pEntity->GetColModel();
float fHeight = pColModel->boundingBox.max.z - pColModel->boundingBox.min.z; float fHeight = pColModel->boundingBox.max.z - pColModel->boundingBox.min.z;
pEntity->m_matrix.GetPosition().z = 0.2f * fHeight + fWaterLevel - 0.5f * fHeight; pEntity->m_matrix.GetPosition().z = 0.2f * fHeight + fWaterLevel - 0.5f * fHeight;