[WIP] Plane Fly By

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

    • [WIP] Plane Fly By

      Tagchen.
      Wollte hier mal mein kleines Projekt vorstellen was ich momentan am werkeln bin.



      Plane Fly By/Ghost Planes?
      Hiermit versuche ich das Singleplayer Feature auch in MTA umzusetzen - wie in GTA:SA fliegen zur Spielatmosphäre Flugzeuge über den Spieler hinweg, das Feature wurde in der Community auch als Mythos 'Ghost Planes' bekannt da bei einem Absturz kein Pilot zu finden ist. Mehr dazu hier: GTA SA Myth - The Truth About Ghost Planes








      Die Funktionen
      Clientseitig wird durch einen Timer eine zufällige Fluglinie berechnet und geprüft ob sich nichts im Weg befindet.
      Anschliessend wird Serverseitig ein zufälliges Flugzeug generiert und mit setElementVelocity (Danke an @Sorginator) in Fluggeschwindigkeit gebracht, clientseitig wird dann die Steuerung des Piloten geregelt damit das Flugzeug geradeaus fliegen kann.
      Sobald das Flugzeug aus dem Sync-Radius des gewählten Spielers ist und kein neuer Syncer gefunden wird, wird das Flugzeug gelöscht.
      Die Linien im Video(dxDrawLine3D) & in der Abbildung unten sind die generierten Flugrichtungen.


      - Legende -
      [Player]: Spielerposition
      [Flugzeug]: Spawnposition des Flugzeuges(kann am Anfang oder am Ende einer generierten Flugrichtung spawnen)
      [Graue Quadrate]: Hindernisse u.a. Gebäude
      [Linien]: Generierte Flugroute
      [X]: Aktuell gewählte Flugroute blockiert, Hinterniss im Weg
      [✔]: Neue gewählte Flugroute akzeptiert(bis zum Ende der bislang gerechneten Route, isLineOfSightClear)





      Geplante Funktionen
      Das einzige woran man noch arbeiten müsste ist die generierte Flugroute zu verbessern(Startposition in jede Himmelsrichtung zufällig zu generieren)
      Die Kollisionsabfrage beruht momentan nur auf einem isLineOfSightClear(einer Linie), weshalb die Flugzeuge noch mit den Tragflächen an zu nahe gelegenen Objekte ankommen können, wie oben im Bild zu sehen. Geplant wäre es jeweils 3 Abfragen zu erstellen welche auch die Tragflächen einbezieht, siehe Bild unten.






      Mithilfe
      Vielleicht weiss jemand wie ich diese Abfragen am besten lösen kann.

      - Flugroute in einem Radius um den Spieler generieren.
      - Die Kollisionsabfragen(isLineOfSightClear) parallel für die Tragfläche Links & Rechts generieren lassen, Offset-Position von der Mittleren Abfrage aus. (Bild dazu weiter oben)




      Ihr dürft hier frei diskutieren, Kritik äussern und eure Meinung abgeben.
      Ich und meine Illustrationen... :D

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Flatliner_ ()

    • Flatliner_ schrieb:

      Die Kollisionsabfragen(isLineOfSightClear) parallel für die Tragfläche Links & Rechts generieren lassen, Offset-Position von der Mittleren Abfrage aus. (Bild dazu weiter oben)
      Das ist eine Aufgabe für MasterMatrix! (ne Spaß ich hab davon fast keine Ahnung)


      LUA-Quellcode

      1. addEventHandler("onClientRender", root, function()
      2. local v = localPlayer.vehicle
      3. if v then
      4. local x0, _, _, x1 = getElementBoundingBox(v) -- dies gibt Offset Werte zurück, wie man sie z.B. bei attachElements verwendet. Jeweils das minimale x, y, z und das maximale x, y, z - hier brauchen wir aber nur x, weil es ja nach links / rechts verschoben werden soll
      5. local m = v.matrix
      6. local length = m.forward*100 --m.forward gibt einen Vektor in Richtung des Fahrzeuges zurück
      7. dxDrawLine3D(m.position, m.position + length, tocolor(200, 0, 0), 5) --forward
      8. dxDrawLine3D(m.position + m.right*x0, m.position + m.right*x0 + length, tocolor(0, 200, 0), 5) --left
      9. --m.right gibt den Vektor nach rechts zurück (Länge 1), den wir mit dem minimalsten Offset der Bounding Box multiplizieren können (also -irgendwas) = Position am linken Rand
      10. dxDrawLine3D(m.position + m.right*x1, m.position + m.right*x1 + length, tocolor(0, 0, 200), 5) --right
      11. -- das gleiche, nur diesmal mit einer positiven Zahl = rechter Rand
      12. end
      13. end)
      Alles anzeigen
      Damit kannst du den Offset anhand der Bounding Box berechnen, was im Endeffekt die Box ist, die man im Map Editor sehen kann. Ergebnis:

      ggf. müsste man die Werte der Bounding Box noch + 2 oder ähnliches Rechnen, damit die Checks nicht genau am Ende der Tragfläche gemacht werden, sondern etwas weiter draußen

      //EDIT OOP muss aktiviert sein, bzw ich weiß nicht genau, ob es die Matrix-Funktionen auch normal gibt
    • Hallöchen.
      Nach 'ner Weile hatte ich mich nun wieder drangesetzt und es weiter ausgebaut und verbessert.


      Flatliner_ schrieb:

      Geplante Funktionen

      Die Kollisionsabfrage beruht momentan nur auf einem isLineOfSightClear(einer Linie), weshalb die Flugzeuge noch mit den Tragflächen an zu nahe gelegenen Objekte ankommen können, wie oben im Bild zu sehen. Geplant wäre es jeweils 3 Abfragen zu erstellen welche auch die Tragflächen einbezieht, siehe Bild unten.
      Danke @MasterM für den Ansatz, habe das ganze danach ohne Probleme mit der Matrix-Class (ohne oop) getPositionFromElementOffset geregelt, welche ich schon andersweitig in Verwendung hatte.
      Die Flugroute hat nun jeweils 3 Kollisionsabfragen. Mittig, Links & Rechts an den Tragflächen (die Mittlere verläuft etwas nach oben).
      Den Wert für die Länge der Tragflächen welche zum abfragen der Kollisionsroute genommen wird kann beliebig eingestellt werden (z.B. Dodo Tragflächenspannweite 7, Shamal 10).


      Flatliner_ schrieb:


      - Flugroute in einem Radius um den Spieler generieren
      Das grösste Manko war bisher das "am einfachsten generieren einer sauberen Flugroute", welche ich auch (dank einer Useful-Funktion) umsetzen konnte.
      Es wird eine zufällige Distanz/Entfernung rund um den Spieler ausgegeben und eine Zielroute generiert welche über den Spieler hinweg geht, in welchem Winkel die Fluglinie zum Spieler verläuft kann ebenso eingestellt werden.
      Spoiler anzeigen


      Spawnpunkt um den Spieler herum (zufällige Distanz in der Endphase)


      Endresultat der Flugrouten, welche sich über dem Spieler generiert



      Es ist so gut wie erledigt.
      Werde nur noch ein paar Einzelheiten checken und eine kleine Spezial-Funktion fertigstellen für jene, die noch eigene schlichten Flugrouten hinzufügen möchten, welche dann durch den Spieler ausgelöst werden können.