# HG changeset patch # User Ritor1 # Date 1389111345 -21600 # Node ID af349bd395ff9bbefd0d0e7dfb04f5429efbea48 # Parent 4393b60cd9e2a9e2114103787324f2a1f95fe3e8 ODM_ProcessPartyActions continue diff -r 4393b60cd9e2 -r af349bd395ff Outdoor.cpp --- a/Outdoor.cpp Mon Jan 06 22:46:11 2014 +0600 +++ b/Outdoor.cpp Tue Jan 07 22:15:45 2014 +0600 @@ -3662,8 +3662,8 @@ bool v78; // ecx@303 int v79; // ecx@314 __int16 v80; // dx@317 - int v81; // ebx@318 - int v82; // ecx@318 + //int v81; // ebx@318 + //int v82; // ecx@318 int pTerrainHeight; // eax@321 int v86; // [sp-20h] [bp-B4h]@246 int v87; // [sp-20h] [bp-B4h]@248 @@ -3678,9 +3678,10 @@ Vec3_int_ v98; bool high_fall_flag; // [sp+1Ch] [bp-78h]@33 int v102; // [sp+20h] [bp-74h]@1 - int v103; // [sp+24h] [bp-70h]@1 + int trigger_id; // [sp+24h] [bp-70h]@1 bool bFeatherFall; // [sp+28h] [bp-6Ch]@4 - int v105; // [sp+2Ch] [bp-68h]@24 + int bonus; + int on_ground; // [sp+2Ch] [bp-68h]@24 bool bWaterWalk; // [sp+30h] [bp-64h]@1 int ceiling_height; // [sp+3Ch] [bp-58h]@28 int v110; // [sp+40h] [bp-54h]@180 @@ -3701,7 +3702,7 @@ int v129; // [sp+8Ch] [bp-8h]@92 v1 = 0; - v103 = 0; + trigger_id = 0; v2 = 0; //*(float *)&v128 = 0.0; v128 = 0; @@ -3765,8 +3766,8 @@ { pParty->pPlayers[i].ReceiveDamage( (signed int)((pParty->uFallStartY - pZ) * (unsigned __int64)(pParty->pPlayers[i].GetMaxHealth() / 10)) / 256, DMGT_PHISYCAL); - v105 = 20 - pParty->pPlayers[i].GetParameterBonus(pParty->pPlayers[i].GetActualEndurance()); - pParty->pPlayers[i].SetRecoveryTime((signed __int64)((double)v105 * flt_6BE3A4_debug_recmod1 * 2.133333333333333)); + bonus = 20 - pParty->pPlayers[i].GetParameterBonus(pParty->pPlayers[i].GetActualEndurance()); + pParty->pPlayers[i].SetRecoveryTime((signed __int64)((double)bonus * flt_6BE3A4_debug_recmod1 * 2.133333333333333)); } } } @@ -3775,8 +3776,8 @@ if ( pParty->bFlying ) ceiling_height = GetCeilingHeight(pX, pY, pZ + pParty->uPartyHeight, (int)&v102);//высота потолка //v107 = bmodel_standing_on_pid == 0; - v105 = v111 + 1; - if ( pZ <= v111 + 1 ) + on_ground = v111 + 1; + if ( pZ <= on_ground )//полёт: посадка { ceiling_height = -1; pParty->bFlying = false; @@ -3793,9 +3794,10 @@ pParty->walk_sound_timer = 0; } - if (!bUnderwater && pParty->pPartyBuffs[PARTY_BUFF_FLY].uExpireTime <= 0) + if (!bUnderwater && pParty->pPartyBuffs[PARTY_BUFF_FLY].uExpireTime <= 0)// конец действия полёта pParty->bFlying = false; - if (!hovering) + + if (!hovering)// { if ( pParty->floor_face_pid != PID(OBJECT_BModel, bmodel_standing_on_pid) ) { @@ -3813,13 +3815,14 @@ if ( face[v6].uAttributes & FACE_PRESSURE_PLATE ) { pParty->floor_face_pid = PID(OBJECT_BModel, bmodel_standing_on_pid); - v103 = face[v6].sCogTriggeredID; // + trigger_id = face[v6].sCogTriggeredID; // } } } } pParty->floor_face_pid = PID(OBJECT_BModel, bmodel_standing_on_pid); } + _walk_speed = pParty->uWalkSpeed; _angle_y = pParty->sRotationY; _angle_x = pParty->sRotationX; @@ -4135,7 +4138,7 @@ if ( pModel ) pZ = v113; if (pParty->FlyActive()) - stru_5E4C90_MapPersistVars._decor_events[20 * pParty->pPartyBuffs[PARTY_BUFF_FLY].uOverlayID + 119] &= 0xFEu; + stru_5E4C90_MapPersistVars._decor_events[20 * pParty->pPartyBuffs[PARTY_BUFF_FLY].uOverlayID + 119] &= 0xFE; pParty->uFallStartY = pZ; } else @@ -4147,16 +4150,16 @@ pParty->uFallStartY = v111; v113 = pZ; if (pParty->FlyActive()) - stru_5E4C90_MapPersistVars._decor_events[20 * pParty->pPartyBuffs[PARTY_BUFF_FLY].uOverlayID + 119] |= 1u; + stru_5E4C90_MapPersistVars._decor_events[20 * pParty->pPartyBuffs[PARTY_BUFF_FLY].uOverlayID + 119] |= 1; } } else { - v113 = pZ; - if (pParty->FlyActive()) - stru_5E4C90_MapPersistVars._decor_events[20 * pParty->pPartyBuffs[PARTY_BUFF_FLY].uOverlayID + 119] |= 1u; + v113 = pZ; + if (pParty->FlyActive()) + stru_5E4C90_MapPersistVars._decor_events[20 * pParty->pPartyBuffs[PARTY_BUFF_FLY].uOverlayID + 119] |= 1; } -//LABEL_141: + if (hovering && !pParty->bFlying)//расчёт скорости падения { v33 = -(pEventTimer->uTimeElapsed * GetGravityStrength()); @@ -4168,25 +4171,24 @@ else if (!hovering) { if ( !bmodel_standing_on_pid ) - { + { // rolling down the hill // how it's done: you get a little bit pushed in the air along terrain normal, getting in the air // and falling to the gravity, gradually sliding downwards. nice trick pZ = v111; ODM_GetTerrainNormalAt(pX, pY, &v98); - v35 = pParty->uFallSpeed + (8 * -((pEventTimer->uTimeElapsed - 4) * GetGravityStrength())); + v35 = pParty->uFallSpeed + (8 * -(pEventTimer->uTimeElapsed * GetGravityStrength())); v129 = abs(v2 * v98.x + v1 * v98.y + v35 * v98.z) >> 16; v2 += (unsigned __int64)(v129 * (signed __int64)v98.x) >> 16; v1 += (unsigned __int64)(v129 * (signed __int64)v98.y) >> 16; v34 = v35 + ((unsigned __int64)(v129 * (signed __int64)v98.z) >> 16); v128 = v1; pParty->uFallSpeed = v34; - } + } } else - v34 = pParty->uFallSpeed; - -//LABEL_164: + v34 = pParty->uFallSpeed; + if ( hovering ) { if ( !bUnderwater && v34 <= 0) @@ -4365,7 +4367,7 @@ if ( pParty->floor_face_pid != v45 && pODMFace->Pressure_Plate() ) { pParty->floor_face_pid = v45; - v103 = pODMFace->sCogTriggeredID; // + trigger_id = pODMFace->sCogTriggeredID; // } v2 = (unsigned __int64)(58500i64 * v2) >> 16; pModel = (BSPModel *)58500; @@ -4401,7 +4403,7 @@ if ( pParty->floor_face_pid != stru_721530.uFaceID && pODMFace->Pressure_Plate() ) { pParty->floor_face_pid = stru_721530.uFaceID; - v103 = pODMFace->sCogTriggeredID; // + trigger_id = pODMFace->sCogTriggeredID; // } v2 = (unsigned __int64)(58500i64 * v2) >> 16; pModel = (BSPModel *)58500; @@ -4422,7 +4424,7 @@ if ( pParty->floor_face_pid != stru_721530.uFaceID && pODMFace->Pressure_Plate() ) { pParty->floor_face_pid = stru_721530.uFaceID; - v103 = pODMFace->sCogTriggeredID; // + trigger_id = pODMFace->sCogTriggeredID; // } v2 = (unsigned __int64)(58500i64 * v2) >> 16; pModel = (BSPModel *)58500; @@ -4513,8 +4515,9 @@ pParty->uFallStartY = 8160; pParty->vPosition.z = 8160; } - if ( !v103 //падение на землю - || (EventProcessor(v103, 0, 1), pParty->vPosition.x == pX) + if ( !trigger_id //падение на землю + || (EventProcessor(trigger_id, 0, 1), + pParty->vPosition.x == pX) && pParty->vPosition.y == pY && pParty->vPosition.z == pZ ) { @@ -4522,8 +4525,8 @@ { pParty->uFallSpeed = 0; //v73 = v105; - pParty->vPosition.z = v105; - if ( pParty->uFallStartY - pZ > 512 && !bFeatherFall && pZ <= v105 && !bUnderwater )//Fall to the ground(падение на землю с высоты) + pParty->vPosition.z = on_ground; + if ( pParty->uFallStartY - pZ > 512 && !bFeatherFall && pZ <= on_ground && !bUnderwater )//Fall to the ground(падение на землю с высоты) { if ( pParty->uFlags & PARTY_FLAGS_1_LANDING ) { @@ -4606,12 +4609,12 @@ pParty->walk_sound_timer = 64; } - v81 = pZ; - v82 = pZ; + //v81 = pZ; + //v82 = pZ; pParty->vPosition.z = pZ; if ( pZ > 8160 ) { - v82 = 8160; + //v82 = 8160; pParty->uFallStartY = 8160; pParty->vPosition.z = 8160; } @@ -4625,17 +4628,18 @@ pParty->uFlags |= PARTY_FLAGS_1_WATER_DAMAGE; } - if ( !v103//падение на воду - || (EventProcessor(v103, 0, 1), pParty->vPosition.x == pX) + if ( !trigger_id//падение на воду + || (EventProcessor(trigger_id, 0, 1), + pParty->vPosition.x == pX) && pParty->vPosition.y == pY - && (v82 = pParty->vPosition.z, pParty->vPosition.z == v81) ) + && pParty->vPosition.z == pZ ) { if ( pParty->vPosition.z < v111 ) { - v82 = v105; + //v82 = on_ground; pParty->uFallSpeed = 0; - pParty->vPosition.z = v105; - if ( pParty->uFallStartY - v81 > 512 && !bFeatherFall && v81 <= v105 && !bUnderwater )//Fall to the water(падение на воду с высоты) + pParty->vPosition.z = on_ground; + if ( pParty->uFallStartY - pZ > 512 && !bFeatherFall && pZ <= on_ground && !bUnderwater )//Fall to the water(падение на воду с высоты) { if ( pParty->uFlags & PARTY_FLAGS_1_LANDING ) { @@ -4646,20 +4650,20 @@ for ( uint i = 1; i <= 4; ++i ) { v110 = pPlayers[i]->GetMaxHealth(); - pPlayers[i]->ReceiveDamage((signed int)((pParty->uFallStartY - v81) * (unsigned __int64)(signed __int64)((double)v110 * 0.1)) / 256, + pPlayers[i]->ReceiveDamage((signed int)((pParty->uFallStartY - pZ) * (unsigned __int64)(signed __int64)((double)v110 * 0.1)) / 256, DMGT_PHISYCAL); v110 = 20 - pPlayers[i]->GetParameterBonus(pPlayers[i]->GetActualEndurance()); pPlayers[i]->SetRecoveryTime((signed __int64)((double)v110 * flt_6BE3A4_debug_recmod1 * 2.133333333333333)); } - v82 = pParty->vPosition.z; + //v82 = pParty->vPosition.z; } } - pParty->uFallStartY = v81; + pParty->uFallStartY = pZ; } - if ( v102 && v82 < ceiling_height && (signed int)(pParty->uPartyHeight + v82) >= ceiling_height ) + if ( v102 && pParty->vPosition.z < ceiling_height && (signed int)(pParty->uPartyHeight + pParty->vPosition.z) >= ceiling_height ) { - pParty->vPosition.z = v82 + pParty->uPartyHeight - ceiling_height + 1; - pParty->field_6F0 = v82 + pParty->uPartyHeight - ceiling_height + 1; + pParty->vPosition.z = pParty->vPosition.z + pParty->uPartyHeight - ceiling_height + 1; + pParty->field_6F0 = pParty->vPosition.z + pParty->uPartyHeight - ceiling_height + 1; } } } diff -r 4393b60cd9e2 -r af349bd395ff mm7_3.cpp --- a/mm7_3.cpp Mon Jan 06 22:46:11 2014 +0600 +++ b/mm7_3.cpp Tue Jan 07 22:15:45 2014 +0600 @@ -194,7 +194,7 @@ int __fastcall _46E889_collide_against_bmodels(unsigned int ecx0) { int result; // eax@1 - int v3; // ebx@9 + //int v3; // ebx@9 int v8; // eax@19 int v9; // ecx@20 int v10; // eax@24 @@ -204,48 +204,59 @@ unsigned int v17; // eax@36 int v21; // eax@42 unsigned int v22; // eax@43 - int a11; // [sp+70h] [bp-18h]@1 - int a10; // [sp+80h] [bp-8h]@1 + //int a11; // [sp+70h] [bp-18h]@1 + //int a10; // [sp+80h] [bp-8h]@1 int a2; // [sp+84h] [bp-4h]@23 - a11 = ecx0; + //a11 = ecx0; BLVFace face; // [sp+Ch] [bp-7Ch]@1 result = 0; - for ( a10 = 0; a10 < (signed int)pOutdoor->uNumBModels; ++a10 ) + for ( uint i = 0; i < (signed int)pOutdoor->uNumBModels; ++i ) { - if ( stru_721530.sMaxX <= pOutdoor->pBModels[a10].sMaxX && stru_721530.sMinX >= pOutdoor->pBModels[a10].sMinX - && stru_721530.sMaxY <= pOutdoor->pBModels[a10].sMaxY && stru_721530.sMinY >= pOutdoor->pBModels[a10].sMinY - && stru_721530.sMaxZ <= pOutdoor->pBModels[a10].sMaxZ && stru_721530.sMinZ >= pOutdoor->pBModels[a10].sMinZ ) + if ( stru_721530.sMaxX <= pOutdoor->pBModels[i].sMaxX && stru_721530.sMinX >= pOutdoor->pBModels[i].sMinX + && stru_721530.sMaxY <= pOutdoor->pBModels[i].sMaxY && stru_721530.sMinY >= pOutdoor->pBModels[i].sMinY + && stru_721530.sMaxZ <= pOutdoor->pBModels[i].sMaxZ && stru_721530.sMinZ >= pOutdoor->pBModels[i].sMinZ ) { - for ( v3 = 0; v3 < pOutdoor->pBModels[a10].uNumFaces; ++v3 ) + for ( uint j = 0; j < pOutdoor->pBModels[i].uNumFaces; ++j ) { - if ( stru_721530.sMaxX <= pOutdoor->pBModels[a10].pFaces[v3].pBoundingBox.x2 && stru_721530.sMinX >= pOutdoor->pBModels[a10].pFaces[v3].pBoundingBox.x1 - && stru_721530.sMaxY <= pOutdoor->pBModels[a10].pFaces[v3].pBoundingBox.y2 && stru_721530.sMinY >= pOutdoor->pBModels[a10].pFaces[v3].pBoundingBox.y1 - && stru_721530.sMaxZ <= pOutdoor->pBModels[a10].pFaces[v3].pBoundingBox.z2 && stru_721530.sMinZ >= pOutdoor->pBModels[a10].pFaces[v3].pBoundingBox.z1 ) + if ( stru_721530.sMaxX <= pOutdoor->pBModels[i].pFaces[j].pBoundingBox.x2 && stru_721530.sMinX >= pOutdoor->pBModels[i].pFaces[j].pBoundingBox.x1 + && stru_721530.sMaxY <= pOutdoor->pBModels[i].pFaces[j].pBoundingBox.y2 && stru_721530.sMinY >= pOutdoor->pBModels[i].pFaces[j].pBoundingBox.y1 + && stru_721530.sMaxZ <= pOutdoor->pBModels[i].pFaces[j].pBoundingBox.z2 && stru_721530.sMinZ >= pOutdoor->pBModels[i].pFaces[j].pBoundingBox.z1 ) { - face.pFacePlane_old.vNormal.x = pOutdoor->pBModels[a10].pFaces[v3].pFacePlane.vNormal.x; - face.pFacePlane_old.vNormal.y = pOutdoor->pBModels[a10].pFaces[v3].pFacePlane.vNormal.y; - face.pFacePlane_old.vNormal.z = pOutdoor->pBModels[a10].pFaces[v3].pFacePlane.vNormal.z; - face.pFacePlane_old.dist = pOutdoor->pBModels[a10].pFaces[v3].pFacePlane.dist; - face.uAttributes = pOutdoor->pBModels[a10].pFaces[v3].uAttributes; - face.pBounding.x1 = pOutdoor->pBModels[a10].pFaces[v3].pBoundingBox.x1; - face.pBounding.y1 = pOutdoor->pBModels[a10].pFaces[v3].pBoundingBox.y1; - face.pBounding.z1 = pOutdoor->pBModels[a10].pFaces[v3].pBoundingBox.z1; - face.pBounding.x2 = pOutdoor->pBModels[a10].pFaces[v3].pBoundingBox.x2; - face.pBounding.y2 = pOutdoor->pBModels[a10].pFaces[v3].pBoundingBox.y2; - face.pBounding.z2 = pOutdoor->pBModels[a10].pFaces[v3].pBoundingBox.z2; - face.zCalc1 = pOutdoor->pBModels[a10].pFaces[v3].zCalc1; - face.zCalc2 = pOutdoor->pBModels[a10].pFaces[v3].zCalc2; - face.zCalc3 = pOutdoor->pBModels[a10].pFaces[v3].zCalc3; - face.pXInterceptDisplacements = pOutdoor->pBModels[a10].pFaces[v3].pXInterceptDisplacements; - face.pYInterceptDisplacements = pOutdoor->pBModels[a10].pFaces[v3].pYInterceptDisplacements; - face.pZInterceptDisplacements = pOutdoor->pBModels[a10].pFaces[v3].pZInterceptDisplacements; - face.uPolygonType = (PolygonType)pOutdoor->pBModels[a10].pFaces[v3].uPolygonType; - face.uNumVertices = pOutdoor->pBModels[a10].pFaces[v3].uNumVertices; - face.uBitmapID = pOutdoor->pBModels[a10].pFaces[v3].uTextureID; - face.pVertexIDs = pOutdoor->pBModels[a10].pFaces[v3].pVertexIDs; + face.pFacePlane_old.vNormal.x = pOutdoor->pBModels[i].pFaces[j].pFacePlane.vNormal.x; + face.pFacePlane_old.vNormal.y = pOutdoor->pBModels[i].pFaces[j].pFacePlane.vNormal.y; + face.pFacePlane_old.vNormal.z = pOutdoor->pBModels[i].pFaces[j].pFacePlane.vNormal.z; + + face.pFacePlane_old.dist = pOutdoor->pBModels[i].pFaces[j].pFacePlane.dist; //incorrect + + face.uAttributes = pOutdoor->pBModels[i].pFaces[j].uAttributes; + + face.pBounding.x1 = pOutdoor->pBModels[i].pFaces[j].pBoundingBox.x1; + face.pBounding.y1 = pOutdoor->pBModels[i].pFaces[j].pBoundingBox.y1; + face.pBounding.z1 = pOutdoor->pBModels[i].pFaces[j].pBoundingBox.z1; + + face.pBounding.x2 = pOutdoor->pBModels[i].pFaces[j].pBoundingBox.x2; + face.pBounding.y2 = pOutdoor->pBModels[i].pFaces[j].pBoundingBox.y2; + face.pBounding.z2 = pOutdoor->pBModels[i].pFaces[j].pBoundingBox.z2; + + face.zCalc1 = pOutdoor->pBModels[i].pFaces[j].zCalc1; + face.zCalc2 = pOutdoor->pBModels[i].pFaces[j].zCalc2; + face.zCalc3 = pOutdoor->pBModels[i].pFaces[j].zCalc3; + + face.pXInterceptDisplacements = pOutdoor->pBModels[i].pFaces[j].pXInterceptDisplacements; + face.pYInterceptDisplacements = pOutdoor->pBModels[i].pFaces[j].pYInterceptDisplacements; + face.pZInterceptDisplacements = pOutdoor->pBModels[i].pFaces[j].pZInterceptDisplacements; + + face.uPolygonType = (PolygonType)pOutdoor->pBModels[i].pFaces[j].uPolygonType; + + face.uNumVertices = pOutdoor->pBModels[i].pFaces[j].uNumVertices; + + face.uBitmapID = pOutdoor->pBModels[i].pFaces[j].uTextureID; + + face.pVertexIDs = pOutdoor->pBModels[i].pFaces[j].pVertexIDs; + if ( !face.Ethereal() && !face.Portal() ) { v8 = (face.pFacePlane_old.dist + face.pFacePlane_old.vNormal.x * stru_721530.normal.x @@ -262,7 +273,7 @@ { a2 = stru_721530.field_6C; if ( sub_4754BF(stru_721530.prolly_normal_d, &a2, stru_721530.normal.x, stru_721530.normal.y, stru_721530.normal.z, - stru_721530.direction.x, stru_721530.direction.y, stru_721530.direction.z, &face, a10, a11) ) + stru_721530.direction.x, stru_721530.direction.y, stru_721530.direction.z, &face, i, ecx0) ) { v10 = a2; } @@ -270,7 +281,7 @@ { a2 = stru_721530.prolly_normal_d + stru_721530.field_6C; if ( !sub_475F30( &a2, &face, stru_721530.normal.x, stru_721530.normal.y, stru_721530.normal.z, - stru_721530.direction.x, stru_721530.direction.y, stru_721530.direction.z, a10) ) + stru_721530.direction.x, stru_721530.direction.y, stru_721530.direction.z, i) ) goto LABEL_29; v10 = a2 - stru_721530.prolly_normal_d; a2 -= stru_721530.prolly_normal_d; @@ -278,7 +289,7 @@ if ( v10 < stru_721530.field_7C ) { stru_721530.field_7C = v10; - v14 = 8 * (v3 | (a10 << 6)); + v14 = 8 * (j | (i << 6)); LOBYTE(v14) = v14 | 6; stru_721530.uFaceID = v14; } @@ -302,12 +313,12 @@ { a2 = stru_721530.field_6C; if ( sub_4754BF(stru_721530.field_8_radius, &a2, stru_721530.position.x, stru_721530.position.y, stru_721530.position.z, - stru_721530.direction.x, stru_721530.direction.y, stru_721530.direction.z, &face, a10, a11) ) + stru_721530.direction.x, stru_721530.direction.y, stru_721530.direction.z, &face, i, ecx0) ) { if ( a2 < stru_721530.field_7C ) { stru_721530.field_7C = a2; - v17 = 8 * (v3 | (a10 << 6)); + v17 = 8 * (j | (i << 6)); LOBYTE(v17) = v17 | 6; stru_721530.uFaceID = v17; } @@ -316,14 +327,14 @@ { a2 = stru_721530.field_6C + stru_721530.field_8_radius; if ( sub_475F30(&a2, &face, stru_721530.position.x, stru_721530.position.y, stru_721530.position.z, - stru_721530.direction.x, stru_721530.direction.y, stru_721530.direction.z, a10) ) + stru_721530.direction.x, stru_721530.direction.y, stru_721530.direction.z, i) ) { v21 = a2 - stru_721530.prolly_normal_d; a2 -= stru_721530.prolly_normal_d; if ( a2 < stru_721530.field_7C ) { stru_721530.field_7C = v21; - v22 = 8 * (v3 | (a10 << 6)); + v22 = 8 * (j | (i << 6)); LOBYTE(v22) = v22 | 6; stru_721530.uFaceID = v22; } @@ -337,7 +348,7 @@ } } } - result = a10; + result = i; } return result; }