mtasa-resources icon indicating copy to clipboard operation
mtasa-resources copied to clipboard

EDF custom vehicle rotation doesn't match actual vehicle rotation

Open javier2409 opened this issue 6 years ago • 2 comments

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

  1. 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>
  1. Place one in a map
  2. Set it's rotation to x:345 y:180 z:90
  3. Save the map and play it
  4. 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/

javier2409 avatar Jun 03 '19 23:06 javier2409

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

javier2409 avatar Jun 04 '19 07:06 javier2409

I don't sure if this is solution so i don't do pull request yet. Please check this:

  1. Open edf_client.lua file ([edito]/edf/)
  2. 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
  1. 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
  1. Test it and tell me if it fix that issue.

FileEX avatar Jun 09 '19 22:06 FileEX