Seddo Posted January 11, 2015 Share Posted January 11, 2015 Приветствую. Столкнулся с проблемой в обновлении 1.4.7000, которое недавно вышло. Суть такая: в автомобиле есть компонент, немного повернут. Он должен вращаться по своей оси. В версии МТА 1.4.0.6968 и ранее все работает правильно, а в новой он будто игнорирует свою ось и ось дамми и вращается прямо относительно мира. Откатывался на старую версию - снова все хорошо. Такая проблема возникает у всех игроков кто обновился на новую версию Link to comment
Elengar Posted January 11, 2015 Share Posted January 11, 2015 Может быть как-нибудь поможет: коммиты, в которых меняли getVehicleComponentPosition https://code.google.com/p/mtasa-blue/so ... ail?r=6974 https://code.google.com/p/mtasa-blue/so ... ail?r=6977 https://code.google.com/p/mtasa-blue/so ... ail?r=6980 В первом посмотри комментарии. Link to comment
Seddo Posted January 16, 2015 Author Share Posted January 16, 2015 Проблема решена, спасибо Link to comment
Kenix Posted January 18, 2015 Share Posted January 18, 2015 У меня тажа проблема, правдо теперь с прицелом для танка. До обновлений с компонентами все работало нормально, теперь же нет. Кому не сложно помогите, в геометрии/тригонометрии не силен. 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
Kernell Posted January 18, 2015 Share Posted January 18, 2015 Так ты не сказал что нужно. Вижу только кашу из Lua-кода. Link to comment
Kenix Posted January 18, 2015 Share Posted January 18, 2015 Помощь больше не нужна, проблема решена. Решение оказалось простым, теперь в новом комите доступен новый аргумент "base" для функций getVehicleComponentPosition/Rotation и берем значение "world". Проводим вектор от misc_b до misc_c и просто умножаем на новый вектор, чтобы сделать его длиннее (именно в то место полетит ракета). Большое спасибо SDraw. Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now