Von einem Mapskript aufs andere zugreifen, bzw Werte übertragen?

  • Hi,
    Ich bin derzeit dabei einen kleinen Mod zu erstellen, der über einen onCreate aufruf in die Map eingebaut werden soll.
    Mit meinem onCreate aufruf klappt auch alles wunderbar, die Indexe werden wie gewollt ausgelesen und auch alles ausgeführt.
    Mein Problem ist jetzt das ich einen TipTrigger dazu brauche, da ich aber nicht die ganze StandartTrigger.lua kopieren und in ein Skript packen wollte habe ich nun einen TipTrigger angelegt der über einen eigenen onCreate aufruf erstellt wird, bzw in dem Skript wird nur der benötigte updateTrailerTipping() Teil etwas umgeschrieben damit ich es so nutzen kann wie ich es brauche. Und da tritt dann mein Problem auch auf.


    Ich möchte das fillDelta des updateTrailerTipping() in mein anderes Skript übertragen. Somit habe ich in meinem ersten Skript eine function angelegt, die fillDelta erhält. Das klappt auch, aber wenn ich in der function mein eigenes fillLevel um fillDelta erhöhen will, kriege ich LOG Fehler, das "fillLevel" 'a nil value' ist.


    Kann mir da jemand einen Tip geben warum das so ist und wie ich das umgehen kann???


    Beide Skripte sind in einer lua, haben einen eigenen onCreate aufruf und funktionieren allein gesehen auch ohne Probleme.


    [lua]function Testskript:getTestFillLevel()
    return self.fillLevel;
    end;


    function Testskript:setFillLevel()
    local a = self:getTestFillLevel()
    print(fillDelta); --fillDelta schreibt er mir in die log, aber bei "a" steht eine leere Zeile in der Log
    print(a);
    end;
    --Versuche ich in der Fuction gleich zu rechnen mit self.fillLevel = self.fillLevel - fillDelta, schreibt er mir fillLevel "a nil value"







    function TestTipTrigger:updateTrailerTipping(trailer, fillDelta, fillType)
    if fillDelta < 0 then
    if self.isFarmTrigger then
    local siloFillType = fillType
    if fillType == Fillable.FILLTYPE_DRYGRASS then
    siloFillType = Fillable.FILLTYPE_GRASS
    end
    Testskript:setFillLevel(fillDelta); --hier rufe ich die Function auf
    else
    local desc = Fillable.fillTypeIndexToDesc[fillType]
    desc.totalAmount = desc.totalAmount - fillDelta
    local priceMultiplier = self.priceMultipliers[fillType]
    local difficultyMultiplier = math.max(2 * (3 - g_currentMission.missionStats.difficulty), 1)
    local greatDemandMultiplier = 1
    local money = Fillable.fillTypeIndexToDesc[fillType].pricePerLiter * priceMultiplier * difficultyMultiplier * greatDemandMultiplier * -fillDelta
    g_currentMission:addSharedMoney(money, "harvestIncome")
    end
    self:updateMoving(-fillDelta)
    end
    end
    -- <Attribute name="onCreate" type="scriptCallback" value="modOnCreate.TestTipTrigger"/>
    g_onCreateUtil.addOnCreateFunction("TestTipTrigger", TestTipTrigger.onCreate)[/lua]


    Dazu habe ich ein paar Bemerkungen geschrieben, Zeile 24 ruft meine Function des anderen onCreate skriptes auf, dort schreibt er mit das fillDelta auch in die LOG, aber self.fillLevel, was sich ja auf Testskript bezieht ist entweder eine nil Value oder eine leere Zeile in der LOG, wenn ich es mir über die Function getTestFillLevel hole.
    Wenn ich im update() mein self.fillLevel jeweils um dt erhöhe und in die Log schreiben lasse, dann funktioniert das ganze auch ohne Probleme.

  • probier mal das self durch Testskript zu ersetzen:


    [lua]function Testskript:getTestFillLevel()
    return Testskript.fillLevel;
    end;


    function Testskript:setFillLevel()
    local a = Testskript:getTestFillLevel()
    print(fillDelta); --fillDelta schreibt er mir in die log, aber bei "a" steht eine leere Zeile in der Log
    print(a);
    end;
    [/lua]

  • Auch mit Testskript funktioniert es leider nicht. Aber ich habe das Problem gefunden, es liegt an der identifizierung des Objektes.


    Habe mein onCreate jetzt einfach in einen Table eingefügt im onCreate:


    [lua]function Testskript.onCreate(id)
    local ts = Testskript:new(g_server ~= nil, g_client ~= nil);
    local index = g_currentMission:addOnCreateLoadedObject(ts);
    ts:load(id)
    ts:register(true)
    table.insert(Testskript.triggers, ts);
    end;[/lua]


    Wenn ich dann im updateTrailerTipping() anstatt nur Testskript:setFillLevel(fillDelta), dazu meinen Testskript.triggers[1] übergebe:
    [lua]Testskript:setFillLevel(Testskript.triggers[1], fillDelta);[/lua]
    und dann so rangehe:


    [lua]function Testskript:setFillLevel(id, fillDelta)
    id.fillLevel = id.fillLevel - fillDelta
    print(id.fillLevel);
    end;[/lua]
    Dann schreibt er mir das fill level auch in die log und erhöht es auch so wie es sein sollte.


    Also, kann ich mit der bisherigen Variante mein Objekt nicht eindeutig identifizieren, obwohl es nur einmal in der Map verbaut ist. Wobei es wohl auch nicht ganz vorteilhaft ist, es so zu lassen wie ich es jetzt zum Testen getan habe. Da muss ich mir also einen anderen Weg einfallen lassen.

Jetzt mitmachen!

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