Jump to content

[BUG] Проблема с setVehicleComponentRotation в 1.4.0.7000


Recommended Posts

Приветствую. Столкнулся с проблемой в обновлении 1.4.7000, которое недавно вышло. Суть такая: в автомобиле есть компонент, немного повернут. Он должен вращаться по своей оси. В версии МТА 1.4.0.6968 и ранее все работает правильно, а в новой он будто игнорирует свою ось и ось дамми и вращается прямо относительно мира.

1a5758d990ad.png

Откатывался на старую версию - снова все хорошо. Такая проблема возникает у всех игроков кто обновился на новую версию

Link to comment

У меня тажа проблема, правдо теперь с прицелом для танка. До обновлений с компонентами все работало нормально, теперь же нет. Кому не сложно помогите, в геометрии/тригонометрии не силен.

  
function DestroyAttachedTankObjects( pVehicle ) 
    local pObject = getElementData( pVehicle, "AttachedObject" ); 
    if pObject and isElement( pObject ) then 
        destroyElement( pObject ); 
    end 
                 
    local pObject2 = getElementData( pVehicle, "AttachedObject2" ); 
    if pObject2 and isElement( pObject2 ) then 
        destroyElement( pObject2 ); 
    end 
end 
  
addEventHandler( "onClientPreRender", root, 
    function() 
        if isPedInVehicle( localPlayer ) then 
            local pVehicle = getPedOccupiedVehicle( localPlayer ); 
            if pVehicle and isElement( pVehicle ) then 
                -- Танк 
                local iVehicleModel = getElementModel( pVehicle ); 
                if iVehicleModel == 432 then 
                    local _, fPosY, fPosZ = getVehicleComponentPosition( pVehicle, "misc_c" ); 
                    local fComponentRotX = getVehicleComponentRotation( pVehicle, "misc_b" ); 
                    local _, _, fComponentRotZ = getVehicleComponentRotation( pVehicle, "misc_a" ); 
                    fComponentRotX = 360 - fComponentRotX; 
                    local pObject = getElementData( pVehicle, "AttachedObject" ); 
                    local pObject2 = getElementData( pVehicle, "AttachedObject2" ); 
                    if pObject and isElement( pObject ) and pObject2 and isElement( pObject2 ) then 
                        attachElements( 
                            pObject2, 
                            pObject, 
                            fPosY * math.sin( math.rad( fComponentRotZ ) ) * math.cos( math.rad( fComponentRotX ) ), 
                            fPosY * math.cos( math.rad( fComponentRotZ ) ) * math.cos( math.rad( fComponentRotX ) ), 
                            ( fPosZ - 1.1 ) + fPosY * math.sin( math.rad( fComponentRotX ) ) 
                        ); 
                        -- Рассчитываем точку попадания снаряда 
  
                        local fObjectPosX, fObjectPosY, fObjectPosZ = getElementPosition( pObject ); 
                        local fObject2PosX, fObject2PosY, fObject2PosZ = getElementPosition( pObject2 ); 
                         
                        local fMaxDistance = 300; 
                        local fDistance = getDistanceBetweenPoints3D( fObjectPosX, fObjectPosY, fObjectPosZ, fObject2PosX, fObject2PosY, fObject2PosZ ); 
                        local fDx, fDy, fDz = (fObject2PosX - fObjectPosX) / fDistance, (fObject2PosY - fObjectPosY) / fDistance, (fObject2PosZ - fObjectPosZ) / fDistance 
                        local fX3, fY3, fZ3 = fObjectPosX + fMaxDistance * fDx, fObjectPosY + fMaxDistance * fDy, fObjectPosZ + fMaxDistance * fDz; 
  
                        local iAimPosX , iAimPosY = getScreenFromWorldPosition( fX3, fY3, fZ3 ); 
                         
                        if iAimPosX then 
                            local bHit, fColX, fColY, fColZ = processLineOfSight ( fObject2PosX, fObject2PosY, fObject2PosZ, fX3, fY3, fZ3 ); 
                            if bHit then 
                                dxDrawLine3D( fObject2PosX, fObject2PosY, fObject2PosZ, fColX, fColY, fColZ ); 
                            end 
                        end 
                    end 
                end 
            end 
        end 
    end 
);                   
  
addEventHandler( "onClientVehicleEnter", root, 
    function( pPlayer, iSeat ) 
        if pPlayer == localPlayer then 
            local iVehicleModel = getElementModel( source ); 
            -- В танке 
            if iVehicleModel == 432 then 
                local fPosX, fPosY, fPosZ = getElementPosition( source ); 
                local pObject = createObject( 1239, fPosX, fPosY, fPosZ ); 
                local pObject2 = createObject( 1239, fPosX, fPosY, fPosZ ); 
                setElementAlpha( pObject, 0 ); 
                setElementAlpha( pObject2, 0 ); 
                setElementCollisionsEnabled( pObject, false ); 
                setElementCollisionsEnabled( pObject2, false ); 
                local _,_,fComponentPosZ = getVehicleComponentPosition( source, "misc_a" ); 
                attachElements( pObject, source, 0, 0, fComponentPosZ ); 
                attachElements( pObject2, pObject, 0, 5, fComponentPosZ ); 
                setElementData( source, "AttachedObject", pObject ); 
                setElementData( source, "AttachedObject2", pObject2 ); 
            end 
        end 
    end 
); 
  
addEventHandler( "onClientVehicleExit", root, 
    function( pPlayer, iSeat ) 
        if pPlayer == localPlayer then 
            local iVehicleModel = getElementModel( source ); 
            -- Слезаем с танка 
            if iVehicleModel == 432 then 
                DestroyAttachedTankObjects( source ); 
            end 
        end 
    end 
); 
  
addEventHandler( "onClientVehicleExplode", root, 
    function() 
        DestroyAttachedTankObjects( source ); 
    end 
); 
  

Link to comment

Помощь больше не нужна, проблема решена. Решение оказалось простым, теперь в новом комите доступен новый аргумент "base" для функций getVehicleComponentPosition/Rotation и берем значение "world". Проводим вектор от misc_b до misc_c и просто умножаем на новый вектор, чтобы сделать его длиннее (именно в то место полетит ракета). Большое спасибо SDraw.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...