[Sammelthema] Objektorientierte Programmierung (OOP)


  • Kommt immernoch "text" raus anstatt "Hallo"
    Mfg

  • Du hast oben "o" definiert. Willst aber in self die Sachen setzen..


    Unten kannste dann self verwenden.

  • Ich hab garnicht gewusst, das es auch ein OOP-Sammelthema gibt - also schiebe ich meine Frage aus dem Sammelthema einfach hierher. Es geht um folgendes: Ich möchte gerne die Position eines Fahrzeugs auslesen und speichern, es kommt aber immer ein 'userdata' error, mit dem ich nichts anfangen kann. Als Codeschnipsel sieht das dann so aus:

    Lua
    function sVehicle:savePosition()
    local x,y,z = self:getPosition()
    local rx,ry,rz = self:getRotation()
    -- hier ein Datenbankeintrag, nicht relevantend


    laut dem Beispiel von createVehicle schätze ich, das ich mit Vector3() arbeiten muss, aber mangels Wiki-Einträgen weiß ich nicht wie man das benutzt.



    Lua
    --Wiki-Eintrag
    infernus = Vehicle(411, Vector3(0, 0, 3))-- man sieht den Vektor als Positionsangabe


    Ich kann den Fehler auch reproduzieren:


    Lua
    --das geht
    outputChatBox(Player("MasterM"):getHealth())
    -- das geht nicht
    local x,y,z = Player("MasterM"):getPosition()
    outputChatBox(x..","..y..","..z)


    Kurz gefasst weiß ich nicht wie ich aus einer Methode mehrere Rückgabewerte bekomme. Ich hoffe mal das mir die Frage ein schlauer Kopf beantworten kann. PS: Ich habe den OOP-Tag in der Meta auf true gesetzt

  • MTA OOP unterstützt leider keine Attribute auf Objekte. Du kannst jedoch per debug.setmetatable eine eigene Metatable setzen. Nachteil daran ist jedoch erstmal, dass das MTA OOP dann nicht mehr funktioniert. Abhilfe schafft an dieser Stelle die Verwendung der Classlib: https://github.com/sbx320/lua_utils/blob/master/classlib.lua


    Zitat von Shape

    Nytech ist ein scheiß Ami, der darf rassistische Witze machen!


    Wer einige meiner Kommentare ernst nimnt ist selbst dran schuld

  • Nytech: War deine Antwort an mich gerichtet? Ich nutze schon die Classlib und getElementPosition ist auch eine MTA-Funktion. Nur leider bekomme ich von der OOP-Variante keine Rückgabewerte, die ich gebrauchen kann. Bisher habe ich im Wiki auch noch keine Antwort darauf gefunden.

  • MasterM:
    Die OOP Funktionen geben, wie du schon bemerkt hast, Vektoren zurück.


    Um aus einem Vektor wieder die einzelnen Koordinaten zu erhalten kannst du einfach folgendermaßen vorgehen:

    Lua
    local pos = Player("MasterM"):getPosition()
    outputChatBox(pos.x..","..pos.y..","..pos.z)

  • Würde das so stimmen?


  • Würde das so stimmen?


    Habs verbessert

  • setmetatable wie der Befehl schon heisst wandelt eine Table in eine metatable um. Wenn du mehr über metatables wissen willst dann geh auf die seite LUA GTS Stolberg dort kannst du mehr darüber lesen.
    Mfg Iven

  • Zitat

    setmetatable wie der Befehl schon heisst wandelt eine Table in eine metatable um. Wenn du mehr über metatables wissen willst dann geh auf die seite LUA GTS Stolberg dort kannst du mehr darüber lesen.
    Mfg Iven


    Deine Erklaerung ist genauso miserabel wie die Erklaerung auf GTS Stolberg. Das ist alles sehr fachsprachlich geschrieben, ich hatte es da auch nicht verstanden.

  • Zitat von Iven

    setmetatable wie der Befehl schon heisst wandelt eine Table in eine metatable um.


    So formuliert ist es falsch. Eine Metatable ist einfach eine Table, in der Zusatzinformationen zu der ursprünglichen Table mit u.a. spezieller Bedeutung gespeichert werden.


    So lassen sich Metatables z.B. nutzen, um Werte zu setzen, die nicht bei der Iteration mit einer for-Schleife eingeschlossen werden:


    Ob es sinnvoll ist, Metatables dafür zu nutzen, ist jedoch eine andere Sache (im Regelfall sollte das aus Übersichtsgründen eher vermieden werden).


    Der eigentliche Anwendungszweck von Metatables besteht darin festzulegen, wie eine Table sich bei bestimmten Operationen verhält. Diese Operationen werden Metamethoden genannt.
    So gibt es z.B. die Metamethode __add, die aufgerufen wird, wenn jemand versucht 2 Tables zu addieren:


    Lua
    local t = {1}
    setmetatable(t, {__add = function(operand1, operand2) return operand1[1] + operand2 end})
    local var = t + 2 -- var = 3


    Wenn jetzt in Zeile 4 versucht wird eine Table + Zahl zu addieren, wird die Metamethode __add aufgerufen, die das erste Feld von t (t[1] == operand[1]) und den 2. Operanden (in diesem Fall also 2) addiert. Das Ergebnis ist dementsprechend 3.


    Eine Übersicht mit allen Metamethoden ist hier zu finden: http://lua-users.org/wiki/MetatableEvents

  • Moin,
    ich hab mal wieder ein Problem. Ich hab zwei Klassen, die ich miteinander kommunizieren lassen möchte. Zum einen eine Spielerklasse und zum anderen die Spielklasse an sich. Wenn ich jetzt eine Methode der jeweils anderen Klasse aufrufen will, funktioniert das nur zu der jeweils höheren in der Meta. Jetzt möchte ich aber Daten hin- und herschicken. Wie kann ich das am Besten lösen?

  • Generell dürfte es kein Problem sein sie mit einander kommunizieren zu lassen. Läst du sie direkt unter onResourceStart miteinander kommunizieren, oder erst durch eine Funktion, die nachträglich ausgelöst wird?

  • Warum erweiterest du nicht einfach die MTA-Player Klasse?

    Lua
    function Player:bla ( )endgetRandomPlayer():bla()


    Oh du willst etwas anderes, ab wann wird einer der Klassen aufgerufen?
    Wurde der Code von beiden schon eingelesen oder nicht?


    - StiviK

  • Ich hab gerade mal den gesamten Startprozess auseinandergeschnitten, um zu sehen, woher der Error kommt. Jetzt ist er komischerweise weg. Ich glaube ich muss nochmal neu anfangen zu schreiben, da sich irgendwo ein Bug eingeschlichen hat -,- Beim testen ist mir folgendes aufgefallen:


    Lua
    triggerClientEvent(self,"RCB_newGame",self)



    Wenn ich triggerClientEvent so verwende, bekomme ich einen Game-Crash. Ich trigger es aber nur aus der Spielerklasse und kann auch mit self:getName() usw. alles vom Spieler abfragen, also liegt es schonmal nicht am self. Oder doch? Ist self denn ein Element oder nur eine Instanz? Kann ich das mit der Classlib beheben? Und warum kann ich normale Events von Instanzen triggern, eigens erstellte aber nicht?

  • Self ist eine Instanz, dies macht aber normal nichts da beim Triggern der "status" als Metatabelle verloren geht.
    Ich werde es nach mal testen, dann kann ich dir sagen ob dies bei mir auch so ist.


    Zitat

    Ist self denn ein Element oder nur eine Instanz? Kann ich das mit der Classlib beheben


    Die Classlib nutzt dir hierbei nichts, da enew das gleiche wie die MTA macht.


    - StivIK

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!