Flugzeuge geradeaus steuern lassen (Element Speed)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Flugzeuge geradeaus steuern lassen (Element Speed)

    Hello everrrrone.


    Hänge seit längerem an einem kleinen Problem, ich möchte ein Flugzeug in der Luft spawnen und geradeaus fliegen lassen.
    Geht eigentlich auch alles, nur das "ich kann das Flugzeug DIREKT geradeaus fliegend starten" ist der problematische Teil.

    Flugzeug wird erstellt, Pilot wird reingesetzt und clientseitig mit den benötigten Control-Funktionen ausgestattet damit er so lange es geht in der Luft bleibt.
    (Ja, jedes Flugzeug wird anders darauf reagieren(z.B. Rustler - Beagle) - trotzdem sollte der Start irgendwie funktionieren)


    setElementVelocity mehr als genug ausprobiert aber da es ja die X, Y, Z Richtungsangaben sind wird das Fahrzeug nicht geradeaus sondern nur nach Nord-Ost-Süd-West geschossen.
    setVehicleTurnVelocity ist das gleiche, Welt-Richtungsangabe.
    setElementSpeed(useful function) genauso getestet aber das klappt bei meinem Vorhaben auch nicht wirklich weiter(benötigt ohnehin einen Timer) da ich eigentlich eine Offset-Richtungsangabe für das Fahrzeug bräuchte(X - Links&Rechts, Y - Vorne&Hinten, Z - Hoch&Runter).




    Bitte keine Vorschläge mit moveObject & attachElements, das habe ich bereits gemacht aber ich möchte diesen Weg erstmal ausarbeiten.
    (moveObject und danach detachElements bringt nichts, da wird das Flugzeug einfach ohne Movement 'gedroppt' und fällt runter)
    Wie kann ich das mit ElementVelocity lösen?


    Code

    LUA-Quellcode: Server

    1. --Useful Function
    2. function getElementSpeed(theElement, unit)
    3. -- Check arguments for errors
    4. assert(isElement(theElement), "Bad argument 1 @ getElementSpeed (element expected, got " .. type(theElement) .. ")")
    5. local elementType = getElementType(theElement)
    6. assert(elementType == "player" or elementType == "ped" or elementType == "object" or elementType == "vehicle" or elementType == "projectile", "Invalid element type @ getElementSpeed (player/ped/object/vehicle/projectile expected, got " .. elementType .. ")")
    7. assert((unit == nil or type(unit) == "string" or type(unit) == "number") and (unit == nil or (tonumber(unit) and (tonumber(unit) == 0 or tonumber(unit) == 1 or tonumber(unit) == 2)) or unit == "m/s" or unit == "km/h" or unit == "mph"), "Bad argument 2 @ getElementSpeed (invalid speed unit)")
    8. -- Default to m/s if no unit specified and 'ignore' argument type if the string contains a number
    9. unit = unit == nil and 0 or ((not tonumber(unit)) and unit or tonumber(unit))
    10. -- Setup our multiplier to convert the velocity to the specified unit
    11. local mult = (unit == 0 or unit == "m/s") and 50 or ((unit == 1 or unit == "km/h") and 180 or 111.84681456)
    12. -- Return the speed by calculating the length of the velocity vector, after converting the velocity to the specified unit
    13. return (Vector3(getElementVelocity(theElement)) * mult).length
    14. end
    15. function setElementSpeed(element, unit, speed)
    16. if (unit == nil) then unit = 0 end
    17. if (speed == nil) then speed = 0 end
    18. speed = tonumber(speed)
    19. local acSpeed = getElementSpeed(element, unit)
    20. if (acSpeed~=false) then -- if true - element is valid, no need to check again
    21. local diff = speed/acSpeed
    22. if diff ~= diff then return end -- if the number is a 'NaN' return end.
    23. local x,y,z = getElementVelocity(element)
    24. setElementVelocity(element,x*diff,y*diff,z*diff)
    25. return true
    26. end
    27. return false
    28. end
    29. function getPositionFromElementOffset(element,offX,offY,offZ)
    30. local m = getElementMatrix(element)
    31. local x = offX * m[1][1] + offY * m[2][1] + offZ * m[3][1] + m[4][1]
    32. local y = offX * m[1][2] + offY * m[2][2] + offZ * m[3][2] + m[4][2]
    33. local z = offX * m[1][3] + offY * m[2][3] + offZ * m[3][3] + m[4][3]
    34. return x, y, z
    35. end
    36. addCommandHandler("pl",
    37. function(lp)
    38. local x, y, z = getElementPosition(lp)
    39. local px, py, pz = x+math.random(0, 50), y+math.random(0, 50), z
    40. local angle = ( 360 - math.deg ( math.atan2 ( ( x - px ), ( y - py ) ) ) ) % 360
    41. local Plane = createVehicle(getVehicleModelFromName("Rustler"), x, y, z+40, 0, 0, angle, "FLYING")
    42. local Pilot = createPed(183, x, y, z+42)
    43. warpPedIntoVehicle(Pilot, Plane)
    44. createBlipAttachedTo(Plane)
    45. setElementFrozen(Plane, true)
    46. setTimer(
    47. function()
    48. setTimer(
    49. function()
    50. setElementSpeed(Plane, "mph", 200) --Mit Timer, ansonsten wird keine Bewegung erkannt
    51. --setElementVelocity(Plane, 0, 0, 0.01)
    52. end, 200, 1)
    53. setElementFrozen(Plane, false)
    54. end, 500, 1)
    55. triggerClientEvent(root, "planeMode", Plane, Pilot)
    56. end)
    Alles anzeigen


    LUA-Quellcode: Client

    1. local function planeMode(ped)
    2. local veh = source
    3. if isElement(veh) and getElementType(veh) == "vehicle" then
    4. if ped then
    5. setPedControlState(ped, "horn", true) --Räder/Landegklappen einziehen(funktioniert nicht)
    6. setPedAnalogControlState(ped, "accelerate", 0.7) --Gas
    7. setPedAnalogControlState(ped, "steer_back", 0.07) --Bei dem mieserablen Start zuerst hochziehen
    8. setTimer(setPedAnalogControlState, 2000, 1, ped, "steer_back", 0.01) --Für einen normalen Flug nur noch sehr leicht
    9. end
    10. end
    11. end
    12. addEvent("planeMode", true)
    13. addEventHandler("planeMode", root, planeMode)
    Alles anzeigen
    Ödland
  • Zum Hilfreichsten Beitrag springen

  • Flatliner_ schrieb:

    Bitte keine Vorschläge mit moveObject & attachElements, das habe ich bereits gemacht aber ich möchte diesen Weg erstmal ausarbeiten.
    (moveObject und danach detachElements bringt nichts, da wird das Flugzeug einfach ohne Movement 'gedroppt' und fällt runter)

    Strider schrieb:

    mhmm vielleicht das Flugzeug mit einem Object Attachen und dann MoveObject benutzen.

    War ja klar... :D
    Ödland
  • Hilfreich

    Du warst mit setElementVelocity auf dem richtigen Weg, brauchst hierbei nur nen umrecher von den Rotationsangaben zu den xyz koordinaten
    Ich hab dir da mal n bisschen was gebastelt, ich hoffe du wirst schlau draus :)

    LUA-Quellcode

    1. addCommandHandler("ff", function(player, cmd, a)
    2. local rx, ry, rz = 0, 0, tonumber(a)
    3. local vrz = 360-rz
    4. local fahrzeug = createVehicle(520, 2399.88, 1024.35, 75.70, rx, ry, rz)
    5. setElementVelocity(fahrzeug, math.sin(math.rad(vrz)), math.cos(math.rad(vrz)), 0.5)
    6. setTimer(function()
    7. destroyElement(fahrzeug)
    8. end, 10000, 1)
    9. end )
  • O.M.Goodness

    1000 Dank @Sorginator, klappt so wie ich es mir immer gewünscht hatte.
    War mit den math Funktionen noch nie wirklich vertraut gewesen. Bezüglich dem Thema hier wird man wahrscheinlich bald noch was hören.

    LUA-Quellcode: Lösungssatz

    1. local rx, ry, rz = 0, 0, 80 --Rotation
    2. local vrz = 360-rz
    3. setElementVelocity(Vehicle, math.sin(math.rad(vrz)), math.cos(math.rad(vrz)), 0.01)
    Ödland