Gelöst: soundSet per Skript ersetzen funktioniert nicht

Willkommen in der Transport Fever Community

Wir begrüßen euch in der Fan-Community zu den Spielen Transport Fever und Train Fever, den Wirtschaftssimulatoren von Urban Games. Die Community steht euch kostenlos zur Verfügung damit ihr euch über das Spiel austauschen und informieren könnt. Wir pflegen hier einen freundlichen und sachlichen Umgang untereinander und unser Team steht euch in allen Fragen gerne beiseite.

 

Die Registrierung und Nutzung ist selbstverständlich kostenlos.

 

Wir wünschen euch viel Spaß und hoffen auf rege Beteiligung.

Das Team der Transport-Fever Community


  • Weder mit

    updateFn = function (input)

    noch mit

    runFn = function (settings)

    bekomme ich dieses Skript dazu, seinen Job zu tun.

    Fehlermeldungen gibt es keine, es wird einfach nur nicht der Sound ersetzt.



    Das soundSet ist definiert:

    Die .wav Datei existiert auch.

  • Is this failing even with the stock dampftram?

    I ask because it does have a sound set defined.

    Your code will not add a soundset if one is not already defined. The 'if' statement at line 35 will fail and you won't get the new sound set.

    You can get around this with:

    Code
    if type(modelData.metadata.railVehicle["soundSet"]) ~= "table" then modelData.metadata.railVehicle["soundSet"] = {}  end
    modelData.metadata.railVehicle.soundSet = {horn = "", name = "tram_steam" }
    1. if (modelData.metadata) then
    2. if (modelData.metadata.transportVehicle) then
    3. if (modelData.metadata.transportVehicle.carrier) then
    4. if modelData.metadata.transportVehicle.carrier == "TRAM" then

    Die Punkte 1-3 zu prüfen ist doch sinnlos, wenn 4 zutrifft dann braucht man 1-3 nicht zu prüfen, selbiges für die Prüfung ob die engine = "Steam" ist


    Eigentlich sollte da eine Zeile für die Prüfung reichen:

    if modelData.metadata.transportVehicle.carrier == "TRAM" and modelData.metadata.railVehicle.engines.type == "STEAM" then

    modelData.metadata.railVehicle.soundSet.name = "tram_steam"

  • Du fragst "if (modelData.metadata) then" ab, sagst ihm aber nicht was er prüfen soll, also "if (modelData.metadata) == irgendwas then" also wird die Prüfung nie positiv ausfallen und zur nächsten Zeile kommen.

  • Aus

    Code
            runFn = function (settings)
                addModifier("loadModel", function (fileName, modelData)
                    if modelData.metadata.transportVehicle.carrier == "TRAM" and modelData.metadata.railVehicle.engines.type == "STEAM" then
                        modelData.metadata.railVehicle.soundSet.name = "tram_steam"
                    end
                    return modelData
                end )
            end

    wird

    Code
    Error message: error: mods/gordondry_steam_sounds_on_steam_trams_1/mod.lua:27: attempt to index field 'transportVehicle' (a nil value)

    mangels failsafe check ... :P

  • Nächster Anlauf, ich versuche es hiermit:

    Code
            runFn = function (settings)
                addModifier("loadModel", function (fileName, modelData)
                    if (modelData.metadata.transportVehicle.carrier) and (modelData.metadata.railVehicle.engines.type) and (modelData.metadata.railVehicle.soundSet.name) then
                        if modelData.metadata.transportVehicle.carrier == "TRAM" and modelData.metadata.railVehicle.engines.type == "STEAM" then
                            modelData.metadata.railVehicle.soundSet.name = "tram_steam"
                        end
                    end
                    return modelData
                end )
            end
  • Well, it wouldn't be the first time that lua's behaviour in this game has been found to be inconsistent.

    I guess the solution here is to explicitly test against nil:

    if modelData.metadata.transportVehicle.carrier ~= nil then "complete the next step" end

  • Every check in modelData.metadata.railVehicle or deeper fails for some reason.


    for example this:

    Code
    if modelData.metadata.transportVehicle.carrier == "TRAM" and modelData.metadata.railVehicle.engines.type == "STEAM" then

    always fails.


    Could it be that "UG-lua" doesn't like it when jumping back in the hierarchy to check elsewhere?


    The check already was in

    Code
    modelData.metadata.transportVehicle.carrier

    and now it suddenly wants to check

    Code
    modelData.metadata.railVehicle.engines.type

    and this already fails, so even a later check for

    Code
    modelData.metadata.railVehicle.soundSet.name

    never happens at all.


    Weird.

    4 Mal editiert, zuletzt von Gordon Dry ()

  • Du fragst "if (modelData.metadata) then" ab, sagst ihm aber nicht was er prüfen soll, also "if (modelData.metadata) == irgendwas then"

    Die if Abfrage ist nicht nur für boolean Werte gültig, sondern für alle Lua Typen. Die Auswertung ist true für alle Werte außer false und nil.


    Wie Gordon sagt, sind solche (verschachtelten) Abfragen nötig, da nicht jedes Model alle Felder hat und der Zugriff auf Tabellen nur funktioniert wenn diese nicht nil sind - sonst gibts Fehlermeldungen.

    Es sind aber nicht alle Checks nötig. Man muss ein Element nicht vor einem direkten Vergleich auf nil prüfen:

    Code
    if modelData.metadata.railVehicle.engines.type then  -- unnecessary
        if modelData.metadata.railVehicle.engines.type == "STEAM" then


    Well, it wouldn't be the first time that lua's behaviour in this game has been found to be inconsistent.

    From my experience, I can't tell that (pure) lua behavior was ever inconsistent - it was just getting used to lua.

    (This doesn't include the api/userdata interface, there are indeed some problem cases)

  • Gordon Dry

    Hat den Titel des Themas von „soundSet per Skript ersetzen funktioniert nicht“ zu „Gelöst: soundSet per Skript ersetzen funktioniert nicht“ geändert.
BlueBrixx