Objekt von Klasse erstellen (LUA) | Create object from class (LUA)

  • Hallo liebe LS Gemeinde,


    vor ein paar Tagen bin ich auf folgendes Problem gestoßen.


    Ich erstelle eine LUA Datei und binde diese in eine Map mittels modDesc.xml ein.
    Dafür verwende ich innerhalb der xml den extraSourceFiles Tag:


    [lua]<extraSourceFiles>
    <sourceFile filename="map/scripts/test.lua" />
    </extraSourceFiles>[/lua]



    Der Inhalt der LUA Datei ist lediglich ein Duplikat der bereits implementierten Klasse Rotator innerhalb der Rotator.lua, die bereits standartmäßig von GIANTS eingebunden wird.
    Innerhalb der Datei wurde nur der Klassenname von Rotator in Test geändert.


    [lua]
    print("LUA: Test geladen");


    Test = {}


    local Test_mt = Class(Test);


    function Test:onCreate(id)
    print("created Test, id: ", id);
    g_currentMission:addUpdateable(Test:new(id));
    end;


    function Test:new(name)
    print("created Test, name: ", name);
    local self = {};
    setmetatable(self, Test_mt);
    self.axisTable = {0, 0, 0};
    self.me = name;
    self.speed = Utils.getNoNil(getUserAttribute(name, "speed"), 0.0012);
    local axis = Utils.getNoNil(getUserAttribute(name, "axis"), 3);
    self.axisTable[axis] = 1;
    return self;
    end;


    function Test:delete()
    end;


    function Test:update(dt)
    rotate(self.me, self.axisTable[1] * self.speed * dt, self.axisTable[2] * self.speed * dt, self.axisTable[3] * self.speed * dt);
    end;
    [/lua]

    Die Datei wird auch geladen, da der Debug String von print(); ausgegeben wird.


    Nun möchte ich im Editor ein Objekt erstellen. Ich wähle ein beliebiges Objekt aus, z.B. einen Baum der sich drehen soll.
    Unter "User Attributes" füge ich einen Script callback unter "onCreate" mit dem Parameter "Test.onCreate" ein.


    Allerdings passiert überhaupt nichts. Es wird zwar der print im Konstruktor (onCreate) aufgerufen, jedoch wird keine id übergeben, woraus ein Fehler resultiert, da er aus einem nicht vorhandenem Dummy Objekt mit der id "nil" ein Objekt erzeugen will.


    Freundliche Grüße


    Skript

  • Hallo FIAT80-90DT,


    erstmal Danke für deine schnelle Antwort.



    im Editorfenster gebe ich unter User Attribute bei onCreate: Test.onCreate ein.
    Das heißt normalerweise müsste zuerst die onCreate Methode aufgerufen werden und dann in der Methode das new();


    Die Datei wird geladen, jedoch passiert nichts, es wird nichts erstellt.


    Freundliche Grüße

  • Versuch mal in den UserAttributes den Namen des Ordners davor zu packen.


    Wenn dein Ordner beispielsweise Test heißt :


    Test.Test.onCreate



    Alternative wäre das onCreate() wiefolgt abzuändern


    [lua]
    function onCreate(id)
    print("created Test, id: ", id);
    g_currentMission:addUpdateable(Test:new(id));
    end;
    [/lua]


    und als UserAttribute OrdnerName.onCreate zu schreiben.

  • Fehlt da im Skript nicht noch das "modOnCreate.testOnCreate"?


    Findet man zumindest in fast jedem Modskript was in einer Map eingebunden ist, meist ganz am Ende. Ich kann grad leider nur nicht nachsehen wie es genau geschrieben steht. Bei Standartskripten wird das aber nicht benötigt, vermutlich löst Giants das in einer seperaren Registrierung.



    Edit:
    [lua] g_onCreateUtil.addOnCreateFunction("baleToManureOnCreate", baleToManureOnCreate);
    [/lua]



    In deinem Falle solltest du es mit "testOnCreate", testOnCreate versuchen.


    Es ist aber so das man hier 2 Möglichkeiten hat, entweder muss man den zip Namen mit angeben oder ebend nur direkt test.onCreate in den UserAttributen. Das kann ich jetzt aber nicht finden und auch nicht selber am Pc nachsehen. Am besten du testest es einmal mit test.onCreate und einmal mit NamenDeinerZip.onCreateTest

  • Vielen Dank für eure Antworten!


    Wie bluebaby schon gesagt hat fehlte:


    g_onCreateUtil.addOnCreateFunction("TestOnCreate", Test.onCreate);


    desweiteren musste ich aus dem statischen Aufruf
    function Test:onCreate(id)


    einen dynamischen machen:
    function Test.onCreate(id)


    anschließend unter User Attributes bei onCreate:


    modOnCreate.TestOnCreate



    Vielen Dank für eure Mühe!


    Freundliche Grüße,
    Skript

Jetzt mitmachen!

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