Beiträge von The_GTA

    Hallo Paddy,


    in deinem obigen Versuch hast du versehentlich das Feld "value" des Arrays "playerData" zu sortieren versucht. Natürlich hat playerData kein Feld namens "value". Denn stattdessen hat ja jeder Eintrag von playerData ein Feld names "value".


    Versuch mal folgenden Code:



    Liebe Grüße,
    Martin

    Hallo zusammen,


    in meinem letzten Mathethread habe ich über die 2D Ebene-Ebene Schneidung geschrieben, mit Lua Implementierung und tiefer mathematischer Analyse. Basierend auf der gleichen Mathematik möchte ich euch nun die 3D Frustum-Ebene Schneidung vorstellen.


    https://twitter.com/rplgn/status/1230073312816005120


    Link zur MTA Resource: https://github.com/quiret/mta_lua_3d_math
    Link zum Thread auf dem offiziellen MTA Forum: https://forum.mtasa.com/topic/…e-rendering-in-mtasa-lua/
    Promotional Video: https://www.youtube.com/watch?v=RQy3Q4Xe110


    Beschreibung:
    Ein Frustum dient zur Modellierung der Fluchtpunktperspektive. Graphics APIs wie Direct3D oder OpenGL bieten eine schnelle Schnittstelle zur Hardwareimplementierung einer Frustum-Ebene Schneidung. Doch um die Grundlagen des Problems zu verstehen, auf dem die Graphics Industrie ihre GPUs aufbaut, lohnt es sich die Mathematik dahinter anzuschauen und spielerisch mit Software zu lernen.



    Der Quellcode besteht aus einem Frustum-Ebene Schneidungs Solver (math_shared.lua), einer RenderWare DFF Ladungsumgebung (rw_shared.lua) und vieler niedlicher Hilfsstrukturen (Ladebalken für das Zeichnen, vorimplementierten Befehlen für die Zeichnung).


    Benutzung der MTA Resource:
    Einfach in den Server Resources Ordner reinpacken mit dem Namen "math_3d_nonlin" und dann in der Serverconsole tippen:


    Code
    refresh
    start math_3d_nonlin

    Tutorial: Wie man ein Frustum mit Ebenen schneidet
    Falls du die MTA Resource oben heruntergeladen hast, dann können wir ein wenig mit dieser herumspielen. Erstelle zuerst eine neue Lua Datei namens "_math_test.lua" mit folgendem Inhalt:

    Folgende Zeile muss in meta.xml ergänzt werden:

    XML
    <script type="server" src="_math_test.lua" />

    Verbindet euch mit eurem MTA Server und startet die Resource neu. Dann führt den Befehl "testdraw" aus. Ihr solltet ungefähr Folgendes sehen:



    Durch Ändern der Ebenen in der Variable "test_planes" kannst du den Inhalt der Zeichnung ändern die dir durch "testdraw" dargestellt wird.


    Nützliche Befehle:

    • draw_model: Zeichne eine DFF und lade sie zu allen Spielern hoch
    • send_bbuf: Zeichne die Szene die am Anfang von math_server.lua definiert worden ist


    Viel Spaß mit dem Code! 8):D


    Habt Ihr Fragen zur Mathematik oder zur Implementierung? Ich möchte euch so gut wie möglich in diesem Thread beraten.

    @The_GTA Dein Ansatz ist ja gut usw., aber bei Scripts musst du sehr hart auf den Gamemode achten, wofür das Script geschrieben wird - möglichst auch auf andere laufende Ressourcen.
    Wenn du das, was du geschrieben hast, bei einem Ultimate Gamemode reintun würdest, hättest du am Ende mehr Bugs als dir lieb ist.
    Und da Vio-Gamemodes eben scheiße geschrieben sind, muss man das Script erst zumindest etwas kennen und verstehen, bevor man was reintun kann.

    Stimmt ^^ Wenn man nen Gamemode schreibt sollte man gleich seinen eigenen Wiederbelebungsbefehl mitschicken, damit der alle Sonderfälle abarbeitet. Aber ich bin davon ausgegangen, dass er einen einfachen Befehl in MTA reintun wollte.


    Ich stimme zu, dass es nach deiner Argumentation keinen perfekten Befehl geben kann.

    Wir erstellen ein neues MTA Kommando namens "revive", der von der Konsole nur durch Admins ausgeführt werden kann.


    Konfiguration der Benutzerrechte:
    Um ein Kommando für Administratoren zu privilegieren, musst du in deinen MTA Server Ordner gehen und das "deathmatch" Verzeichnis suchen. Dann öffne die "acl.xml" Datei in einem Texteditor und füge folgende XML-Knoten ein:

    XML
    <right name="command.revive" access="false" />

    unter dem "Default" Recht-Knoten und

    XML
    <right name="command.revive" access="true" />

    unter dem "Admin" Recht-Knoten.


    Schreiben des Scripts:
    Wir kommen mit einem Server-seitigen Script aus. Dazu erstellen wir einen neuen Ordner im MTA Server Deathmatch "resources" Ordner. Dann tun wir eine "meta.xml" Datei mit folgenden Inhalt rein:

    XML
    <meta>
    <script src="revive_server.lua" type="server" />
    </meta>

    Als Nächstes erstellen wir die "revive_server.lua" Datei in demselben Verzeichnis. In dieser Datei ist es empfohlen, folgende Befehle zu verwenden:

    • addCommandHandler
    • getPlayerFromName
    • getElementPosition
    • spawnPlayer
    • getElementModel
    • getElementRotation (optional)

    Es gilt aber auch, ein paar Probleme zu lösen…

    • Was ist, falls ein Spieler in einem Fahrzeug stirbt? Soll er in dem Fahrzeug wiederbelebt werden und wieder auf dem gleicher Sitz sein?

    Falls du ein funktionierendes Etwas hat, dann kann ich ja mal drüberschauen und dir Feedback geben.


    Zum Schreiben von Skripten empfehle ich übrigens resedit ^^

    Seit ihr auch Internetveteranen und habt mittlerweile gemerkt, wie stark sich die Gier nach Aufmerksamkeit durch Internetkonzerne in den letzten Jahren verschlimmert hat? Das empfinde ich am Beispiel der sich selbst installierenden Third-Party Software während man halt gute und altbekannte Freeware installiert.


    Beispiel 1: Avast Free Antivirus


    Während ich gestern auf mein Papas Laptop die freie Version von Avast installiert habe, öffnete sich auf einmal Google Chrome am Ende der Installation. Dabei habe ich explizit darauf geachtet, keine Werbesoftware mit zu installieren. Ich fühle mich als langer Avast-Nutzer richtig verarscht, dass die so eine Checkbox verstecken beziehungsweise einfach ganz still dazu installieren ohne meine Erlaubnis! <X


    Ich habe im Internet einen guten Appreciation-Thread gefunden, voll mit ignoranten Marketingleuten, allerdings zu AVG: https://support.avg.com/answers?id=906b0000000DnZWAA0


    Beispiel 2: CCleaner


    Vor Monaten als ich CCleaner installiert hatte da wurde bei mir Google Chrome auch installiert. Dabei wurde CCleaner sogar durch meine Uni und Zeitschriften wie Computerbild als gute freie Software zur Entrümpelung deines Computer gepriesen. Aber von diesem alten Image profitieren heute Google und andere Konsorten.


    -------


    Nur Veteranen sollten sich an die alten Installer erinnern, bei denen jeder Crapware eine eigenen Seite bei dem Installer gegeben wurde. Anscheinend ist die neue Praxis, eine Checkbox ganz unauffällig zu verstecken! Dabei ist die Komplexität der Dialoge so groß, dass der Standardnutzer nicht auf alle Optionen achten kann…


    Wurdet ihr selber mal von Software(-konzernen) auf diese Art verarscht? War die Benutzererfahrung damals besser? Dann teilt bitte mit mir eure Erfahrungen :)


    Mit freundlichen Grüßen,
    Martin Turski

    Naja Microsoft hat auch nicht aus codeplex gelernt.. Statt GitHub konkurrenz machen einfach aufkaufen :D

    Sehr guter Punkt. Das mit CodePlex hätte ich ja beinahe vergessen. Ich hatte extra meinen gesamten Code auf deren SVN Server hochgeladen, aber dann machten die auf einmal dicht und ich musste lange nach einer Konkurrenz suchen. Meine Entscheidung fiel dann auf OSDN.net, weil die ja alles anbieten was relevant ist, unter anderem SVN. Daher mein entsetzter Kommentar auf deren Blog.


    Nein, ist eine Schweinerei.

    Abwarten, für die ist das ein Image Kauf.
    Wenn Microsoft tut, was gesagt wurde bleibt Github existent.

    Ich stimme da vollkommen zu.

    Seit Satya Nadella ist die Firmenpolitik bei denen eh anders.Deshalb gehe ich davon auch aus.

    Dieser Satya ist für mich Luft. Ich denke dass die wirklich wichtigen Entscheidungen durch die Firmenmitglieder mit wirklicher Programmiererfahrung getroffen werden (und/oder sollten). Der hat nur Erfolg, weil ihm Steve Ballmer so einen guten Weg vorallem mit dem Hardware-Business vorbereitet hat.


    --------------------------


    Microsoft wird das aber nicht zerstören, da bin ich mir sicher. Sie sichern sich in letzter Zeit viel Entwicklerpotenzial.

    Schneidung von 2D Ebenen in Lua


    In diesem Tutorial möchte ich euch beibringen, wie man 2D Ebenen mit Software schneidet und dadurch simple convexe 2D Formen (Rechtecke, Dreiecke) zeichnen kann. Ihr müsst Code ja nur lesen können da die Implementierung ein Geschenk von mir ist.


    Und nun zur Motivation. Seit ich Spiele auf dem PC spiele hat mich schon immer die Lineare Algebra fasziniert. In der Schule hat man noch das Schneiden von unendlichen Ebenen auf Papier gelernt (lasst euch bitte nicht von Mathe abschrecken!). Streng genommen hat man da nur geprüft, ob zwei Ebenen windschief sind, was equivalent dazu ist, dass die die 2 Ebenenvektorenpärchen zueinander linear abhängig sind. Doch das sollte nur der Anfang sein.


    Sicherlich kennt ihr die GPUs, die im Allgemeinen schnelle, parallele Löser von linearen Gleichungssystemen sind. Und wie genau das funktioniert, das möchte ich euch beibringen!



    Quellcode: https://github.com/quiret/lua_math


    Anleitung
    Ladet euch den Quellcode von GitHub runter und stellt ihn als Resource in den MTA Server rein. Startet dann den MTA Server (oder macht halt nen refresh) mit der "lua_math" resource (kann auch anders heißen). Nachdem ihr euch mit dem Client zum Server verbunden habt, könnt ihr den Befehl "send_bbuf" benutzen um euch ein durch den Server generiertes Bild zu senden, auf dem 2D Formen durch Mathematik allein durch Lua gezeichnet wurden (Bild oben).


    Idee: Spiele zum Beispiel mit den Ebenenmethoden wie "addSupremumPolynomeU" oder "addInfimumPolynomeV" herum, um andere Ebenenformen zu erzeugen.


    Ausrechnung von Ebene-Ebene Schneidung auf Blatt Papier
    Alles was da im Quellcode steht ist einfach auf Blatt Papier ausrechenbar. Benötigte Fähigkeiten sind: Umstellung von linearen Gleichungssystemen nach Variablen, Verständnis von Ungleichungen und deren Folgerungen, Wissen wie man richtig Zahlen sortiert und Intervalle. Und wenn man nicht so viele Fehler macht (wie ich, lol) dann geht es richtig flott.


    Es ist empfohlen, dass du mit Hochschulmathematik vertraut bist oder das Lernen willst. Bitte versuche auch mitzurechnen.


    Wir definieren eine Ebene als ein Positionsvektor (p1x, p1y) mit Richtungsvektoren (u1x, u1y) und (v1x, v1y) Spaltenvektoren die eine Fläche aufspannen. Dementsprechend ist (p2x, p2y) der Positionsvektor der zweiten Ebene und (u2x, u2y), (v2x, v2y) deren Aufspannvektoren.



    Weiter setzen wir vorraus, dass alle Variablen u2, v2, u1, v1 im Intervall zwischen 0 und 1 liegen (einschließlich).


    Um euch nicht am Anfang zu überfordern möchte ich dieses Problem an einem Beispiel vorstellen. Ihr werdet im Nachhinein merken, dass da nicht alzu viel mehr ist.



    Das oben gezeigte Gleichungssystem stellen wir nach u1 und v1 um, sodass wir folgende Gleichungen erhalten.



    Erinnere dich nun, dass wir gefordert haben, dass u1 und v1 zwischen 0 und 1 liegen (einschließlich). Wir setzen also die Lösungen von u1 und v1 in die Ungleichungen ein und erhalten somit Ungleichungen, die nur noch auf den u2 und v2 Variablen basieren.




    Da wir ja nur an Ungleichungen von u2 und v2 interessiert sind, haben wir sie gezielt umgeformt. Jetzt kommt ein Punkt, an dem mit der höheren Hochschulmathematik vielleicht höchste Konzentration erforderlich ist. Die Ungleichungen in u2 und v2 sind zwar Schranken, jedoch nicht unbedingt eng an unserer eingeschlossenen Fläche gebunden.



    Was wir also suchen sind Intervalle für u2, in denen die Ungleichungen in v2 tatsächlich eng an unsere Fläche grenzen. Das gleiche suchen wir natürlich für v2 und Ungleichungen in u2 (Polynome). Wir fassen also zur Verdeutlichung alle Unter- und Oberpolynome in u2 in eine gemeinsame Ungleichung von v2 zusammen.



    Die Minimumsfunktion gibt für jeden Wert von u2 das Polynom und somit dessen Wert aus, das am kleinsten ist (zur Bestimmung des Supremumpolynoms). Also gibt es ja (eventuell) eine Menge von Werten, für die jedes Polynom das Kleinste sein kann! Es funktioniert genauso analog für die Maximumsfunktion.


    Wir schreiben diesen Gedanken gründlich auf Blatt Papier auf und Lösen das Problem.




    Falls man die Ebene auf Blatt Papier zeichnet sollte man feststellen, das diese Werte tatsächlich die sind, bei denen sich die Schranken der Ebenen abwechseln. Ansonsten hat man ja falsch gerechnet.


    Sicherlich hast du gemerkt, dass wir zwischen Unter- und Oberpolynomen streng unterscheiden. Dies ist so, weil die Unterpolynome die kleinstmöglichen Werte von u2 bzw v2 in einem Wert von v2 bzw u2 darstellen. Somit befinden sich alle gültigen Werte zwischen dem Ober- und Unterpolynom.


    Das ist wichtig, weil wir noch gar nicht berechnet haben, für welche Werte das Unterpolynom tatsächlich kleiner-gleich dem Oberpolynom ist! Wir nehmen also alle Intervalle, in denen ein Unterpolynom in u2 das Größte und ein Oberpolynom in u2 das Kleinste ist und schrenken das Gültigkeitsintervall von u2 weiter ein durch direktes Gegenüberstellen.



    (Sichtlich ein sehr einfaches Beispiel, wo keine Rechnung nötig ist; für etwas komplizierteres weiter unten schauen)


    Zu guter Letzt erhalten wir ein eindeutiges Ergebnis: Intervalle von u2/v2, in denen ein Unter- und ein Oberpolynom die Werte von v2/u2 einschränken. Falls keine solche Intervalle existieren so schneiden sich die Ebenen nunmal nicht.


    Beispielrechnungen als Bilder:
    - Beispiel mit eingeschlossener Ebene
    - Beispiel mit Ebenen die sich kreuzen


    Ideen:
    - schreibe eine Implementierung der 2D Ebenen Schneidung in C++
    - erweitere das Zeichnen von 2D Ebenen, indem du mit den U/V Koordinaten eine Texture ausliest und somit gefärbte Formen erstellst
    - lese DFFs mit einem Luascript ein und erzeuge mit einer gezielten inversen 3D Transformation 2D Formen, die du ohne Tiefeneinwirkung auf dem Bildschirm zeichnen kannst


    Anwendungen und Ausblick
    Als Beispiel habe ich euch das Zeichnen von Formen mit Software herangebracht. In Spielen ist es auch möglich, zu prüfen, ob ein Charakter, der durch Dreiecke approximiert wird, auf ein bestimmtes Feld ohne Kollision (und ohne Bewegung) platziert werden kann, wie beispielsweise das Platzieren von Gebäuden bei Command and Conquer.


    Ich plane noch mehr über Lua und Mathematik in diesen Thread zu posten. Schließlich ist die Programmierung ein gutes Werkzeug, um deine Vorstellungskraft auszudrücken, in gezielter Modellierung. Also könnt ihr mich in Zukunft durch meine Forschung begleiten und was dabei lernen ^^


    Mit freundlichen Grüßen,
    - Martin a.k.a. The_GTA

    Str0, hoffe mal dieser Thread geht jetzt nicht nur um mein Tool aber es ist ein TXD Editor der halt alle offiziellen TXD Dateien öffnen und bearbeiten können soll. ^^

    Sehr geehrte deutsche mta-sa.org Community,


    ich nenne mich The_GTA und bin 25 Jahre alt. Um 2011 bis 2014 war ich sehr aktiv in MTA und habe unter anderem an einem eigenen Client gearbeitet. Nach wie vor spiele ich sehr gerne GTA:SA und programmiere oft in C++, gerne skripte ich in Lua. Ich habe vor, ein paar Lua Tutorials und so zu posten. Vielleicht gibt es ja Interessenten hier.


    Mein neustes großes Projekt ist Magic.TXD, zu dem es sogar eine deutsche Lokalisation gibt.


    Auf eine gute Bekanntschaft :)


    Mit freundlichen Grüßen,
    Martin (The_GTA)