Erstmal wie schaut das ganze denn am Ende aus?
Teil 1 Verstecken von Fahrzeugen und Startjahr / Endjahr deaktivieren
Um das ganze einfacher zu gestalten, kommt an den Anfang der mod.lua ein kleines Stück script. Alles wo ich etwas kommentiert habe sollte man mal näher schauen dort muss was geändert werden.
local modId = "maikc_baureihe_52" -- eindeutige modID vergeben.
local hiddenFiles = {}
local function filterDoHideFiles(fileName, data)
for i = 1, #hiddenFiles do
if (string.ends(fileName, hiddenFiles[i])) then
return false
end
end
return true
end
local noStartYearFiles = {}
local noEndYearFiles = {}
local function modifierDoYears(fileName, data)
for i = 1, #noStartYearFiles do
if (string.ends(fileName, noStartYearFiles[i])) then
data.metadata.availability.yearFrom = 0
end
end
for i = 1, #noEndYearFiles do
if (string.ends(fileName, noEndYearFiles[i])) then
data.metadata.availability.yearTo = 0
end
end
return data
end
--###########################################
local yearFiles = {
"vehicle/train/maikc_br52_drg.mdl", -- hier müssen alle mdl angegeben werden auf die "Kein Startjahr / Kein Endjahr" angewendet werden soll.
"vehicle/train/maikc_br52_dr.mdl",
...
}
--###########################################
Display More
Danach müssen wir ein paar Parameter definieren, das kommt nach den Tags in den Infoblock. Auch hier wieder, in den Zeilen wo Kommentare stehen sind individuelle Anpassungen notwendig.
-- Parameter für User-Ingame-Selection
params = {
-- Variante 1
{
key = "maikc_br52_drg", -- eindeutigen key für jede Variante vergeben, einfach den Namen der mdl als key benutzen
name = _("vehicle_br52_drg_name"), -- hier kann entweder der Name als übersetzter string aus der strings.lua stehen oder z.B. name = _("Baureihe 52 DRG"),
values = { _("Anzeigen"), _("Verstecken"), }, -- YES / NO als Werte würde auch gehen, aber ich fand Anzeigen/Verstecken eindeutiger
tooltip = _("Die will ich ja/nein"), -- Ein Tooltip halt
defaultIndex = 0, -- kann 0 oder 1 sein, 0 wäre "Anzeigen" und 1 wäre "Versteckt" als default
},
-- Variante 3 - XX
...
-- Fakes verstecken (default ist hier versteckt)
{
key = "maikc_br52_fake ",
name = _("maikc_br52_fake_name"),
values = { _("Anzeigen"), _("Verstecken"), },
tooltip = _("Die will ich ja/nein"),
defaultIndex = 1,
},
-- Startjahr ab 1850
{
key = "maikc_br52_startyear", -- eindeutigen key vergeben
name = _("Verfügbarkeit / Startjahr"), -- wird in der strings.lua auch übersetzt
values = { _("ab 1850"), _("Default"), }, -- Default bedeutet das die in der mdl eingetragenen Wert verwendet werden
tooltip = _("Die will ich ja/nein"),
defaultIndex = 1, -- Es wird standardmäßig der in der mdl eingetragene Wert verwendet
},
-- unendlich verfügbar
{
key = "maikc_br52_endyear", -- eindeutigen key vergeben
name = _("Verfügbarkeit / Endjahr"),
values = { _("Unendlich"), _("Default"), },
tooltip = _("Die will ich ja/nein"),
defaultIndex = 1,
},
}, -- params schliessen
}, -- info schliessen
Display More
Danach muss das ganze noch aufgerufen werden und das geht so:
runFn = function(settings, modParams)
-- Mod-Parameter holen
local params = modParams[getCurrentModId()]
-- Wenn vorhanden....
if params then
--Variante 1
if ((params.maikc_br52_drg or 0) == 1) then -- Parameter wie oben der key also Name der mdl
table.insert(hiddenFiles, "vehicle/train/maikc_br52_drg.mdl") -- mdl angeben, darauf achten das auch der Pfad stimmt
end
-- Variante 2
if ((params.maikc_br52_dr or 0) == 1) then
table.insert(hiddenFiles, "vehicle/train/maikc_br52_dr.mdl")
table.insert(hiddenFiles, "vehicle/train/maikc_br52_dr_reverse.mdl") -- man kann auch mehrere mdl angeben, hier würde dann Reverse gleich mit ausgeblendet
end
-- Variante 3- XXXX
if ((params.maikc_br52_fake or 0) == 1) then
table.insert(hiddenFiles, "vehicle/train/maikc_br52_drg_fake.mdl")-- Oder alle Fakevarianten ausblenden
table.insert(hiddenFiles, "vehicle/train/maikc_br52_dr_fake.mdl")
table.insert(hiddenFiles, "vehicle/train/maikc_br52_dr2_fake.mdl")
table.insert(hiddenFiles, "vehicle/train/maikc_br52_db_fake.mdl") -- Oder alle Fakevarianten ausblenden
end
-- Startjahr setzen
if (params.maikc_br52_startyear or 0) == 0 then -- Darauf achten den gleichen Parameter wie oben zu nehmen
for i = 1, #yearFiles do
table.insert(noStartYearFiles, yearFiles[i])
end
end
-- Endjahr setzen
if (params.maikc_br52_endyear or 0) == 0 then -- Darauf achten den gleichen Parameter wie oben zu nehmen
for i = 1, #yearFiles do
table.insert(noEndYearFiles, yearFiles[i])
end
end
-- Wenn Tabelle "hiddenFiles" nicht leer, FileFilter hinzufügen
if (#hiddenFiles > 0) then
addFileFilter("model/vehicle", filterDoHideFiles)
end
-- Modifier laden, falls Tabelle für "kein Endjahr" und/oder "kein Startjahr" nicht leer
if ((#noEndYearFiles > 0) or (#noStartYearFiles > 0)) then
addModifier("loadModel", modifierDoYears)
end
Display More
Da das Forum leider keine lua formatierung mehr kann und das ganze so absolut unübersichtlich ist, bitte die mod_lua_ohne_script.zip aus dem Dateianhang verwenden und diese auf den eigenen Mod anpassen. Die strings.lua habe ich auch angehängt, dort kann man sehen wie ich vorgehe um die strings zu übersetzen.
Teil 2: Das Ganze für Multiple units
folgt
Teil 3 Verstecken der Gruppierungs mdl
Da es einige User immer wieder schaffen den Gruppierungseintrag zu kaufen, hier mal die entsprechenden Codezeilen um die Gruppierungs.mdl DAU-Sicher zu verstecken, dafür ist allerdings ein externes Script notwendig (Anhang kommt in den Ordner res/scripts). Wie das ganze innerhalb der mod.lua ausschaut kann man der angehängten mod_lua_mit_script.zip entnehmen.
function data()
local global = require "eatglobal_v2_26"
local modutils = global.modutils
local modId = "maikc_baureihe_52"
local modData = {
defaultSettings = { },
general = {
hideFiles = { "vehicle/train/maikc_br52_group.mdl", }, -- richtigen Pfad angeben
},
}
function data()
return {
info = {
minorVersion = 3,
severityAdd = "NONE",
severityRemove = "CRITICAL",
name = _("br52_name"),
description = _("br52_desc"),
authors = {
{
name = "MaikC",
role = "CREATOR",
tfnetId = '21205'
},
{
name = 'Skyjoe',
role = 'CO-CREATOR',
text = 'Textur',
tfnetId = '23463'
},
},
tags = { "europe", "railcar", "steam", "locomotive", },
visible = true,
},
settings = modutils.userSettings.getDefaultSettings(modData),
runFn = function(settings)
modutils.userSettings.create(modId, modData)
end
}
end
Display More
Comments 15
Newly created comments need to be manually approved before publication, other users cannot see this comment until it has been approved.
Newly created comments need to be manually approved before publication, other users cannot see this comment until it has been approved.
IbisCitea
Wenn man so gar keine Ahnung vom Scripten hat, dann überfordert das trotzdem noch ein wenig. Aber sobald es klick macht, hilft es. Wenn es jetzt noch ingame funzt, dann kann ich mich ransetzen und das in allen meinen Mods einbauen. xD
MaikC
Du kannst einfach noch ein bisschen warten, wir haben das ganze inzwischen stark vereinfacht.
Eine funktionierende (einfache) Version ist bei meinen zuletzt aktualisierten mods dabei, ein paar features fehlen da aber noch.
IbisCitea
ich habe den alten jetzt fast fertig eingebaut, aber noch hat die Modifikation noch etws Zeit. Also ok. (was ich aber nicht brauche, ist das Startdatum ausschalten xD )
VacuumTube
Puh, ganz schön viel Code... ich weiß nicht wie viele Modder sich das für eigene settings genauer anschauen. Ein Interface wäre da sicherlich praktischer
MaikC
Mal schauen was da kommt
Nicht erschrecken lassen von den "vielen" Zeilen (es sind nicht mal viele, die ganze mdl hat 211 Zeilen), im Endeffekt muss man nur ein paar Parameter ändern (Keys) und die Pfade zu den mdl auf den eigenen Mod anpassen, als Modder ist das nur Copy&Paste aus dem EffEff. Die ganze Arbeit ist schon gemacht.
VacuumTube
Kein Problem, ich habe den Code verstanden. Aber wenn ich Fahrzeuge modden würde und mich mit Lua nicht gut auskennen würde, fände ich das wahrscheinlich überfordernd für so etwas eigentlich einfaches wie Fahrzeug ein/ausblenden.
Außerdem sollten Modder möglichst wenig fremden Code einfügen, vor allem wenn man nicht genau versteht was er macht. Die mod.lua wird dadurch auch nicht übersichtlicher. Da wäre ein Interface wie ParamBuilder schon hilfreich, sodass man alle Daten nur einmal angeben muss, was am ende auch weniger fehleranfällig ist.
MaikC
Bisschen Eigenwerbung wa
Und nach dem Motto "möglichst wenig fremden Code einfügen," meinst du wohl --> lieber deinen Code verwenden? Naja Schwamm drüber.
Ich hatte das wohl schon in der Webdisk gesehen, aber das es auch für das ingame Menü anwendbar wäre ist mir nicht aufgefallen.
Ausserdem bin ich jemand der von lua (fast) keine Ahnung hat und die Beispiele dort sind allesamt für Constructions so das man (also ich) nicht mal ansatzweise weiss wie das ganze aufgebaut sein müsste und das was ich hier beschrieben habe abzubilden. Du kannst ja gerne mal einen einfach verständlichen Lexikonartikel mit Beispiel dazu schreiben wie das ganze ausschauen müsste um die hier beschriebenen Sachen zu erreichen und ich schaue mir das nochmal an was denn (für mich) einfacher ist.
VacuumTube
Nein, so war das nicht gemeint. Es war nur als Beispiel, wie ein Interface aussehen könnte, ebenso wie eatglobal ja auch eins ist. Dass man ein fest definiertes skript hat, das man schnell einbinden kann und die eigentliche Angabe für jede einzelne Einstellung in nur einer Zeile erledigt ist.
Mit "wenig fremden Code" meinte ich, dass es für Modder/Programmierer immer unangenehm ist, viel mit Copy-Paste zu übernehmen. Klar kann man auch sagen Hauptsache es funktioniert. Aber so ist es eben fehleranfälliger und manchmal schauen auch andere mal in den Code und da ist es schön, wenn das halbwegs übersichtlich ist.
ParamBuilder ist auch für die ingame Modeinstellungen gedacht, da die ja gleich aufgebaut sind wie bei Constructions. (siehe Beispiel Realistic Railway Slopes) Der zweite wesentliche Vorteil ist die Verwendung bei Slidern, damit man nicht ("0.1","0.2","0.3",...) schreiben muss und die Werte umrechnen muss (deswegen ist das ganze auch entstanden).
Für diesen Fall, wo es nur um einen einfachen Button geht, lohnt es sich kaum das darüber zu machen, klar. Es wäre natürlich möglich, in ParamBuilder eine Art Preset einzubauen, das einen vorgefertigten Button zum Anzeigen/Verstecken zurückgibt. Allerdings frage ich mich dabei, wie viele Modder das anwenden würden. Es geht ja vor allem um die Auswahl bei Fakes? (sofern die überhaupt vorhanden sind). Für jedes Fahrzeug "No end year" einzustellen können ist zwar nice to have, aber glaube ich nicht so nachgefragt.
MaikC
Ah dann habe ich deinen Beitrag falsch verstanden, ja dein Vorschlag das ganze in eine API auszulagern so das man nur Parameter übergeben muss ist natürlich schöner. So war es ja auch seit TPF nur da es jetzt halt kein Tool mehr gibt was die settings ändern kann musste ich nun auch umsteigen.
Da sind wir auch am überlegen ob und wie wir das ganze in eine verbesserte API integrieren können.
Copy&Paste braucht man aber immer was sich aber schon bei dem hier vorgestellten darauf beschränkt das man eigene (eindeutige) Keys vergeben muss und natürlich die Pfade zu den mdl + mdl angeben muss, der Rest kann komplett unverändert übernommen werden. Das wird auch mit einer API nicht anders werden, nur ein bisschen kürzer so das man alles Sachen wo man nichts ändern muss gar nicht mehr erst sieht.
Claude
Thank you very much MaikC.
so "eatglobal_v2_26" is only required to hide a buy menu, right?
MaikC
I see a translation of this wiki is needed
Since some users manage to buy the grouping entry again and again, the corresponding lines of code are necessary to hide the group.mdl safely from buying it. It's still visible but you can't buy it.
But the external script is necessary for this (attachment is in the res / scripts folder).
Claude
Thanks, DeepL does a good job though.
I guess I'm simply surprised that the buy menu is still modded in a way that makes it buyable at all.
I just prefer to avoid using script libraries, I see too many errors poping up in player's stdout due to a version conflict.
Cheers
elektronikfreak
Herzlichen Dank für diesen hervorragenden Tipp. Sieht zwar kompliziert aus, aber mit Deiner Vorlage widerum verständlich.
MaikC
Danke und ja sieht kompliziert aus, leider unterstützt das Forum auch weder LUA noch Farbige Markierungen innerhalb des Codes. Wenn man aber die angehängte mod.lua nimmt und aufmerksam durchgeht erkennt man schnell wo die Werte sind die man individiduell anpassen muss. 95% der ganzen Zeilen können unverändert verwendet werden.
elektronikfreak
Hast recht, ich werd mich mal einlesen und ausprobieren.