mtasa-resources
mtasa-resources copied to clipboard
EDF custom vehicle rotation doesn't match actual vehicle rotation
Which resource(s) have this problem? Not sure, edf, editor_main maybe
Describe the bug The rotation of a custom element represented by a vehicle seems to work differently than the rotation of an actual vehicle. For example, if I want to use that custom element's rotation to do something with real vehicles, It won't work as expected. This doesn't happen with all rotations.
To Reproduce
- Define a custom element that is represented by a vehicle, for example:
<element name="customveh" friendlyname="Custom vehicle">
<vehicle editorOnly="true" model="!model!" />
<data name="model" type="vehicleID" default="411" />
<data name="position" type="coord3d" default="0,0,0" />
<data name="rotation" type="coord3d" default="0,0,0" />
</element>
- Place one in a map
- Set it's rotation to x:345 y:180 z:90
- Save the map and play it
- Create a vehicle through scripting and set it's rotation to the same as the custom element in the map file -> Rotations do not match
Expected behavior If I create a custom element represented by a vehicle it's rotation should match an actual vehicle rotation.
Screenshots See 'additional context'
Version 1.5.6
Additional context I made a forum post regarding this problem https://forum.mtasa.com/topic/117044-possible-editor-bug/
Found workaround You need to convert 'object' rotation in ZXY format to 'vehicle' rotation in ZYX format.
But I think the editor should give the rotation in ZYX format if the element is represented as a Vehicle
I don't sure if this is solution so i don't do pull request yet. Please check this:
- Open edf_client.lua file ([edito]/edf/)
- Find this function
function edfSetElementRotation(element, rx, ry, rz)
if rx and ry and rz then
local etype = getElementType(element)
if etype == "object" or etype == "vehicle" or etype == "player" or etype == "ped" then
return setElementRotation(element, rx, ry, rz)
else
local handle = edfGetHandle(element)
if handle then
return setElementRotation(handle, rx, ry, rz)
else
setElementData(element, "rotX", rx or 0)
setElementData(element, "rotY", ry or 0)
setElementData(element, "rotZ", rz or 0)
return true
end
end
end
end
- Change this line
if etype == "object" or etype == "vehicle" or etype == "player" or etype == "ped" then
return setElementRotation(element, rx, ry, rz) -- THIS
else
to
if etype == "object" or etype == "vehicle" or etype == "player" or etype == "ped" then
return setElementRotation(element, rx, ry, rz, etype == 'vehicle' and 'ZYX' or 'default') -- THIS
else
- Test it and tell me if it fix that issue.