Einstellungen für Mods

Willkommen in der Transport Fever Community

Welcome to the fan community of Transport Fever and Train Fever, the economic simulators of Urban Games. The community is free for you to share and inform yourself about the game. We cultivate a friendly and objective interaction with each other and our team will be happy to answer any questions you may have.

 

Registration and use is of course free for you.

 

We wish you a lot of fun and hope for active participation.

The Team of the Transport-Fever Community

You are currently viewing an older version of the article. Click here, to view the current version.

  • Ein kurzes Tutorial zur Verwendung der neuen "Mod Einstellungen" im TPFMM.
    [img]https://ftp.train-fever.net/flaggen/gb.png[/img] The English version can be found here: [url='https://www.transportfever.net/lexikon/index.php/Entry/217-Settings-for-Mods/']Settings for Mods[/url]

    1 Einleitung

    Mit hat es schon öfter gestört, dass man, wegen kleiner Anpassungen an die Vorlieben der Nutzer, zwei nur leicht verschiedene Mods oder einen Hauptmod mit Zusatzmods anbieten musste. Meine Lösung war ein einfaches Lua Script (settings.lua), das im Ordner des Mods liegt und alle Optionen in der Form [tt]Option = Wert[/tt] enthält: [code='settings.lua']return { option1 = true, option2 = 4, }[/code]Diese Datei kann dann entweder direkt ausgelesen werden oder man nutzt die dafür vorgesehenen Funktionen meines ModUtil Scripts (einfach den Inhalt des [url='https://www.transportfever.net/index.php/Attachment/87750']angehängten Archivs[/url] in den Mod Ordner kopieren). Erstgenannte Variante ist etwas komplizierter und nur zu empfehlen, wenn man sich mit Lua auskennt. Daher werde ich hier auch nur die Variante mit dem ModUtil Script vorstellen.

    2 Optionen definieren

    Um den Mod Nutzern die Mühe zu sparen, die settings.lua selbst mit einem Texteditor zu bearbeiten, war [url='https://www.transportfever.net/index.php/User/18122-Xanos/']@Xanos[/url] so freundlich dem TPFMM ein weiteres Fenster zu spendieren (eines großes Danke dafür :thumbup: ), in dem die Optionen grafisch dargestellt und bearbeitet werden können. Natürlich kann der TPFMM das aber nur leisten, wenn er die möglichen Optionen und deren erlaubte Werte kennt. Wir haben uns dazu entschlossen, die dafür nötigen Informationen aus der mod.lua auszulesen, dazu müssen sie dort aber erst definiert werden. Das geht über den Eintrag [tt]settings[/tt], zusätzlich zum Eintrag [tt]info[/tt], wo man beliebig viele Optionen definieren kann: [code='mod.lua']function data() return { info = { -- ... }, settings = { -- optionen }, } end[/code]Jede Option wird dann durch verschiedene Parameter bestimmt: [code]option1 = { -- interne ID der Option, mit der sie später ausgelesen werden kann type = "number", -- "boolean", "number", "string" name = _("Option1"), -- Name der im TPFMM für diese Option angezeigt wird (kann mit der strings.lua übersetzt werden) -- optionale Parameter description = _(""), -- genauere Beschreibung was diese Option beeeinflusst, wird im TPFMM als Tooltip angezeigt default = 0, -- Standardwert, wenn nicht angegeben, wird für "boolean" false, für "number" 0 und für "string" "" genutzt min = -2147483647, max = 2147483648, -- minimal und maximal möglicher Wert (nur bei "number") step = 1, -- wie genau man den Wert mit den Pfeiltasten einstellen kann (nur bei "number") },[/code]Die ID der Option sollte innerhalb des Mods einzigartig sein. Anders gesagt, wird immer nur die zuletzt definierte Option, mit dieser ID, verwendet. Sofern nicht anders angegeben, stellen bei den optionalen Parametern, die in diesem Bespiel genutzten Werte, auch die Standarwerte dar, falls dieser Parameter fehlt. Wird das ModUtil Script verwendet, ist es sinnvoll die Optionen erst in einer Variable zu speichern damit diese dann sowohl für den TPFMM als auch für das Script verwendet werden kann: [code='mod.lua']local modUtil = require "merk_modutil_1" local settings_def = { option1 = { type = "boolean", name = _("Option1"), }, option2 = { type = "number", name = _("Option2"), }, } function data() return { info = { -- ... }, settings = settings_def, runFn = function(settings) modUtil.userSettings.create("mod_id", settings_def) end } end[/code]Mit der Zeile [tt]modUtil.userSettings.create("mod_id", settings_def)[/tt] wird dem Script mitgeteilt, welche Optionen erwartet werden. Außerdem werden automatisch die settings.lua des Mods ausgelesen (sofern vorhanden) und die dort angegeben Werte für die spätere Verwendung gespeichert. Die "mod_id" wird intern genutzt, um zu unterscheiden, von welchem Mod die Einstellungen stammen. Zwei unterschiedliche Mods sollten also nicht die gleiche ID haben. Meiner Meinung nach bietet sich daher der Ordnername des Mods an.

    3 Optionen auslesen

    Nachdem das Script die settings.lua ausgelesen hat, kann jederzeit auf die Werte der Optionen zugegriffen werden und zwar in jeder beliebigen Scriptdatei (runFn der mod.lua, .con, .mdl, .msh, etc.). Wenn man direkt nach der Definition darauf zugreifen möchte (also noch in der runFn der mod.lua), empfehle ich folgenden Code: [code]local options = mod_util.userSettings.get("mod_id")[/code]In allen anderen Dateien ist folgender Code sinnvoller (damit man nicht jedes mal das ModUtil Script einbinden muss): [code]if merk_modutil and merk_modutil[1] then local options = merk_modutil[1].userSettings.get("mod_id") -- Einstellungen verabeiten end[/code]"mod_id" bestimmt in beiden Fällen von welchem Mod man die Einstellungen haben möchte. Im Normalfall wird es also die gleiche ID wie bei "create" sein, man kann aber auch die Einstellungen eines anderen Mods auslesen (z.B. wenn der eigene diesen nur ergänzt und daher auch zum Teil die gleichen Optionen nutzt). Der Zugriff auf die einzelnen Optionen funktioniert ebenfalls in beiden Fällen identisch, z.B. mit [tt]options.option1[/tt].

Share

Comments

  • Wie hier schon geschrieben habe (CommonAPI2), wäre es nützlich, wenn Änderungen von Mod Einstellungen über die GUI der CommonApi im laufenden Spiel direkt von den Mods erfasst werden könnten. Dazu ist wahrscheinlich eine Art Interface notwendig.


    Konzeptidee:

    Momentan werden ja die Einstellungen einmal beim Laden des Spiels von settings.lua eingelesen und gespeichert. Da manche Mods möglicherweise sehr oft die Einstellungen mit local options = merk_modutil[1].userSettings.get("mod_id") aufrufen, wäre es wahrscheinlich ineffizient, jedes Mal die Datei auszulesen. Daher sollte die CommonApi beim Ändern eines Wertes dieses modutil informieren, sodass die geänderten Einstellungen erkannt und aktualisiert werden. Rufen Mods danach wieder ihre Einstellungen ab, erhalten sie die neuen Werte.