[Gelöst]Probleme mit showfilllevel[/Gelöst]+ neue Frage

  • Hallo erstmal, ich hätte gerne mal ein Problem...



    Ich habe mir, wie so manch anderer den showfilllevel aus LS09 umgeschrieben. Leider scheint der ursprüngliche Autor nicht mehr in dieser Richtung aktiv zu sein, weshalb es wohl keine aktuelle Version gibt. Aber zum Problem. Das Script an sich arbeitet fehlerfrei, Probleme entstehen erst, wenn ich einen Drescher, der mit dem Script ausgestattet ist, verkaufe. Dann gibt es folgenden Fehler in der LOG:


    showFillLevel.lua(34) : attempt to index local 'veh' (a nil value)


    In Zeile 34 der .lua wird diese Variable ausgewertet: "if veh.grainTankFillLevel > 0 then"


    veh ist diese Variable: "local veh = g_currentMission.nodeToVehicle[ShowFillLevel.vehicles]"


    Natürlich stimmt diese Bedingung damit nicht mehr. Wie sage ich dem Script also jetzt, das er den Drescher vergessen soll. Wäre es möglich, mit ner else - Bedingung dieses zu realisieren, in der ich dem Script sage, ignoriere alle Drescher mit Tankinhalt = 0? Allerdings überprüft das Script ja dann trotzdem, ob der Drescher vorhanden ist, und schmeißt ihn nicht aus der Updateschleife. Warum er die Funktion allerdings nicht beendet, da die Bedingung ja eigentlich nicht mehr vorhanden ist (nil) verstehe ich nicht wirklich.


    Ja, ich gebe zu, so viel habe ich mich noch nicht mit dem Scripten versucht, komme auch nicht wirklich aus dieser Richtung. Allerdings will ich versuchen, so mehr zu verstehen. Ich habe auch nicht vor, irgendwelche Scripte zusammenzuklauen, ich will das nur für mich realisieren.


    Ich hoffe daher auf Hilfe. Den Hauptteil der Funktion habe ich angehangen, das ist aber nicht die komplette lua. Will ja keine fremden Scripte hier veröffendlichen. Wenn Fragen zum Problemstellungsverständnis sind, versuche ich die gerne zu beantworten.


    [hide][lua]function ShowFillLevel:update(dt)
    if table.getn(ShowFillLevel.vehicles) > 0 and ShowFillLevel.vehicles[1] == self.rootNode then
    local fillLevels = {}
    local names = {}
    local fruit = {}
    local fastNum = {}
    for i=1,table.getn(ShowFillLevel.vehicles) do
    local veh = g_currentMission.nodeToVehicle[ShowFillLevel.vehicles[i]]
    if veh.grainTankFillLevel > 0 then
    local Level = veh.grainTankFillLevel*100/veh.grainTankCapacity
    table.insert(fillLevels,Level)
    table.insert(names,veh.name)
    local fruitType = FruitUtil.fruitIndexToDesc[veh.currentGrainTankFruitType].name
    if g_i18n:hasText(fruitType) then
    fruitType = g_i18n:getText(fruitType)
    end
    table.insert(fruit,fruitType)
    for k,v in pairs(g_currentMission.steerables) do
    if v.rootNode == ShowFillLevel.vehicles[i] then
    table.insert(fastNum,k)
    end
    end
    end
    end
    for i=1,table.getn(names) do
    setTextAlignment(2)
    local posY = 0.85
    local posX = 0.98
    renderText(posX, posY - (i-1)*0.05, 0.021,names[i]..": ("..fastNum[i]..")");
    if fillLevels[i] > 80 then setTextColor(1, 0, 0, 1); end
    renderText(posX, posY - 0.021 - (i-1)*0.05, 0.02,""..string.format("(%d%%) %s",fillLevels[i],fruit[i]).."");
    setTextColor(1, 1, 1, 1)
    setTextAlignment(0)
    end
    end
    end;[/lua][/hide]

  • Hmm, ich kenne das Script nicht und du hast es ja leider nicht komplett gepostet...


    Soweit ich das verstehe was du zu dem ganzen schreibst und was der Ausschnitt der LUA zeigt, willst du ja nur, dass das Script wenn die Lokale "veh" nil ist da der Drescher nichtmehr existiert, mit der Schleife weitermacht und die restlichen Drescher durchgeht.


    Wenn ich das richtig verstehe sollte es klappen wenn du vor dem ganzen Prozess überprüfst ob veh.grainTankFillLevel nil ist..
    Also vor Zeile 9 deines Beispieles:
    [lua]if veh.grainTankFillLevel ~= nil then
    [/lua]
    Also wenn veh.grainTankFillLevel ungleich nil ist dann.. (andernfalls überspringt der Rechner dann den folgenden Block, somit wäre der Error weg)
    Natürlich noch ein weiteres end; einfügen um den Block zu beenden, wenn ich mich nicht verzählt habe in deinem Beispiel vor Zeile 23



    Ich hoffe das hilft
    LG

  • Hallo modelleicher,


    habe es probiert, ändert aber leider nichts. Vom Verständnis her sollte es auch fast egal sein, ob ich die Variable jetzt auf ungleich Null oder größer Null vergleiche. Nichts anderes mache ich doch eigentlich mit beiden Befehlen hintereinander. Oder denke ich da falsch?



    Ich hänge einfach noch mal die komplette lua an, das hilft dann sicher mehr.
    (Ist die originale ohne deine Änderung)


    Wobei mir da auffällt, vll bringt es etwas im Aufruf der Funktion diesen Vergleich anzubringen (Also zwischen Zeile 8 und 15 der unten geposteten lua). Das werde ich noch einmal probieren.



    [hide][[lua]
    ShowFillLevel = {};
    ShowFillLevel.vehicles = {}
    function ShowFillLevel.prerequisitesPresent(specializations)
    return true
    end;


    function ShowFillLevel:load(xmlFile)
    if not self.name then
    self.name = Utils.getNoNil(getXMLString(xmlFile, "vehicle.name."..g_languageShort), "no Name");
    end
    if self.grainTankCapacity then
    table.insert(ShowFillLevel.vehicles,self.rootNode)
    end
    end;


    function ShowFillLevel:mouseEvent(posX, posY, isDown, isUp, button)
    end;


    function ShowFillLevel:keyEvent(unicode, sym, modifier, isDown)
    end;


    function ShowFillLevel:update(dt)
    if table.getn(ShowFillLevel.vehicles) > 0 and ShowFillLevel.vehicles[1] == self.rootNode then
    local fillLevels = {}
    local names = {}
    local fruit = {}
    local fastNum = {}
    for i=1,table.getn(ShowFillLevel.vehicles) do
    local veh = g_currentMission.nodeToVehicle[ShowFillLevel.vehicles[i]]
    if veh.grainTankFillLevel > 0 then
    local Level = veh.grainTankFillLevel*100/veh.grainTankCapacity
    table.insert(fillLevels,Level)
    table.insert(names,veh.name)
    local fruitType = FruitUtil.fruitIndexToDesc[veh.currentGrainTankFruitType].name
    if g_i18n:hasText(fruitType) then
    fruitType = g_i18n:getText(fruitType)
    end
    table.insert(fruit,fruitType)
    for k,v in pairs(g_currentMission.steerables) do
    if v.rootNode == ShowFillLevel.vehicles[i] then
    table.insert(fastNum,k)
    end
    end
    end
    end
    for i=1,table.getn(names) do
    setTextAlignment(2)
    local posY = 0.85
    local posX = 0.98
    renderText(posX, posY - (i-1)*0.05, 0.021,names[i]..": ("..fastNum[i]..")");
    if fillLevels[i] > 80 then setTextColor(1, 0, 0, 1); end
    renderText(posX, posY - 0.021 - (i-1)*0.05, 0.02,""..string.format("(%d%%) %s",fillLevels[i],fruit[i]).."");
    setTextColor(1, 1, 1, 1)
    setTextAlignment(0)
    end
    end
    end;


    function ShowFillLevel:draw()
    end;


    function ShowFillLevel:delete()
    end;
    [/lua][/hide]

  • Zu dem was ich geschrieben hatte...


    Nunja, ich dachte mir, in deinem nun komplett angehängten Script Zeile 28, beginnt eine for schleife. Diese wird in Zeile 44 beendet.
    In Zeile 29 wird die lokale Variable "veh" mit einem Wert belegt, aber wenn dein Drescher nichtmehr existiert wird der Wert nil.
    In Zeile 30 wird dieser Wert dann mit der Zahl 0 verglichen. LS kann nur Zahlen mit Zahlen vergleichen, es fragt also wenn wert größer als null dann
    wert ist nun aber keine Zahl sondern nil, das kann LS nicht mit 0 vergleichen und wirft den von dir geschriebenen Error aus.
    Soweit meine Gedankengänge, allerdings wäre der Error dann wohl anders ausgefallen, ausserdem ist in deinem Script ja in Zeile 34 nicht die Zeile die du schriebst dass sie da ist..
    Also umdenken.


    Im Grunde müsste es dennoch funktionieren, weil der Block mit meiner Idee ja nicht weiter ausgeführt würde sondern die for Schleife von vorn beginnt..


    Ich hab auch immer ein recht großes Prob damit andere LUAs zu verstehen und die Logik zu erkennen, bin gerade etwas hilflos.. :D
    Sry dass ich da auch keine direkte Lösung weiß, wenn mich was einfällt schreibe ich nochmal..
    Aber vill. kann ja jemand andres uns auf die Sprünge helfen :rolleyes:



    LG

  • Genau das ist ja das Problem, was viele haben. Jeder hat seine eigene Logik, da ist es oft schwierig, sich da rein zu finden. Kenne ich zur genüge, hat aber auch Vorteile.



    Mir fällt aber auch auf, das die Zeilen in der vollständigen LUA jetzt auch Nummerrierungstechnisch nicht stimmt. Da ist Zeile 34 plötzlich Zeile 30.


    Ich danke dir trotzdem für die Hilfe, bringt mich im verstehen weiter. Habe völlig vergessen das fehlende Variablen ja nicht automatisch 0 sind. Von daher macht dein Vorschlag ja auch Sinn. Allerdings hängt er beim Verkauf dann trotzdem wieder an der Zeile, die schon von Anfang an die Probleme bereitet.


    Mal schauen, vll. fällt ja noch jemandem etwas dazu ein. Danke dir.


  • Hatte länger keine Zeit, mich damit zu beschäftigen. Da ich das jetzt aber nach Vorbild des Abfahrhelfer globalisieren wollte, also ohne Eintrag in jeden Drescher, habe ich mich erneut damit beschäftigt. Als erstes, du warst auf dem richtigen Weg. Was dein Befehl aber gemacht hat ist die Erweiterung der Lokalen "veh" zu vergleichen. Allerdings gibt es ja keine Lokale "veh" mehr...


    Hat gedauert, bis ich das geschnallt habe ;)


    Also, der Vergleich muss einfach lauten:


    [lua] if veh ~= nil then[/lua]



    und schon klappt es.


    Danke für den Schupps in diese Richtung :thumbsup:




    Aber mir stellt sich noch eine Frage, die nicht direkt damit zu tun hat, ich dafür aber keinen neuen Thread eröffnen mag.



    Thema Paarung (pairs)


    Die "lua" Funktion macht irgendwie falsche Zeilenumbrüche, deshalb so:



    for k,v in pairs(g_currentMission.steerable) do
    if v.rootNode == FillLevel.vehicles[i] then
    table.insert(fastNum,k)
    end
    end



    Was davon sind die Werte k sowie v? v wird ja danach definiert, aber woher kommt die Variable k?


    Kann mir dieses jemand beantworten? Bin aus dem, was ich dazu im Netz finde leider noch nicht viel schlauer geworden.


    Danke :)

  • k,v steht für key,value - oder auf deutsch : schlüssel, wert
    Ein table ist eine Tabelle mit zwei Spalten - die erste enthält den Schlüssel - die zweite den Wert.
    der Schlüssel kann ein Bezeichner sein :
    name : weizen ( tabelle["name"] = "weizen" oder tabelle.name = "weizen" )
    menge : 24000
    preis : 0.28


    oder er kann auch eine Nummer sein
    1. weizen ( tabelle[1] = "weizen" )
    2. gerste
    3. raps


    pairs() geht die übergebene Tabelle Zeile für Zeile durch und gibt dir jeweils (im übertragenen Sinne) die linke ( k ) und rechte ( v ) Spalte zurück .

Jetzt mitmachen!

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