Mich hat es schon immer gestört, dass die Auswahl von Straßentypen in Konstruktionen zu gering war oder Bahnhöfe nur die 2 Vanilla-Gleise angeboten haben. Schöner wäre es, wenn man automatisch die Auswahl von allen im Spiel vorhandenen Typen hätte, was die Modkompatibilitäten erhöhen würde.
In diesem Post habe ich gefragt, ob man dieses Problem nicht irgendwie lösen kann, worauf jemand von UG schrieb, dass das mit dem neuen dynamischen Ressourcensystem möglich sei, mit Verweis auf dieses Beispiel im Wiki. Umgesetzt habe ich es dann bei der Mod Advanced Person Magnet, welche hier auch als Beispiel dient. Dabei wird ein Parameter für alle Straßentypen implementiert, aber für Gleise, Modelle oder Gütertypen ist das Vorgehen ähnlich.
1 Parameter
Der Parameter, um den es geht, wird zunächst wie gewöhnlich in der Konstruktion definiert. Als Typ bietet sich Combobox an.
...
params = {
{
uiType = "COMBOBOX",
key = "APMstreetType",
name = _("Street Type"),
values = {"dummy","standard/town_medium_new.lua"}, -- wird später ersetzt
},
...
(In APM werden die Parameter eigentlich mithilfe von ParamBuilder definiert)
2 Update-Funktion extern
Die updateFn muss aus der Konstruktion genommen und in einer seperaten .script Datei definiert werden. In der .con Datei stehen dann nur noch die statischen Infos sowie die Parameter. Dazu muss man in der postRunFn die .script Datei benennen:
postRunFn = function (settings, modparams)
local APMcon = api.res.constructionRep.get(api.res.constructionRep.find("Advanced_Person_Magnet.con"))
APMcon.updateScript.fileName = "construction/Advanced_Person_Magnet.updateFn"
...
3 Ressourcen ermitteln
Außerdem muss man alle Typen der entsprechenden Ressource mithilfe der API ermitteln. Der Übersicht halber kann man das in einer eigenen Datei machen:
local s = {}
s.getStreetTypes = function() -- stark vereinfacht
local streetRep = api.res.streetTypeRep.getAll()
local stypes = {}
local snames = {}
for sid,stype in pairs(streetRep) do -- im Original: Filterung nach Sichtbarkeit, nur 4 Lanes sowie Sortierung der Landstraßen nach hinten
local street = api.res.streetTypeRep.get(sid)
table.insert(stypes, stype)
table.insert(snames, street.name)
end
return stypes, snames
end
return s
Display More
Es werden die Dateinamen (Typ), die später in der Update-Funktion gebraucht werden, und die Namen, zur Anzeige in der Liste, zurückgegeben. Dabei kann man die Typen eventuell filtern oder sortieren, um die Übersichtlichkeit im Konstruktions-UI zu bewahren. Ist das Spiel geladen, sind die Parameter fix und können nicht mehr geändert werden.
4 Übergabe der Ressourcen
In der postRunFn wird dann die obige Funktion aufgerufen und die Liste an die Script-Parameter (für die updateFn) übergeben sowie deren Bezeichnungen an den Konstruktions-Parameter:
local streetRep = require "APM_streetRep"
...
postRunFn = function (settings, modparams)
...
local streetTypes, streetNames = streetRep.getStreetTypes()
APMcon.updateScript.params = {
StreetTypes = streetTypes,
}
for _,p in pairs(APMcon.params) do
if p.key=="APMstreetType" then -- hier derselbe key wie in der Parameterdefinition
p.values = streetNames
end
end
Display More
5 Verwendung in der Update-Funktion
In der externen updateFn kann dann mithilfe der scriptParams auf die Ressourcenliste zugegriffen werden. Der Index wird wie gewöhnlich anhand von constrParams ermittelt.
function data()
return {
updateFn = function(constrParams,scriptParams)
local result = { }
result.models = { }
result.edgeLists = { }
local streetIndex = constrParams.APMstreetType -- startet mit 0
local streettype = scriptParams.StreetTypes[streetIndex+1]
table.insert(result.edgeLists, {
type = "STREET",
params = {
type = streettype
},
edges = {
{ { 0, 2, 0 }, { 1, 0, 0 } },
{ { 5, 2, 0 }, { 1, 0, 0 } },
},
} )
...
Display More
Ein anderes Beispiel ist Vehicle Asset Builder wo alle Fahrzeugmodelle ermittelt werden und zu Assets hinzugefügt werden. Dabei findet zusätzlich zur Filterung der Modelle eine Kategorisierung der Fahrzeugtypen statt.
Ich hoffe, einigen damit geholfen zu haben und würde mich freuen, wenn die ein oder andere zukünftige Mod so eine Auswahl anbietet.
Mein Script aus APM zur Ermittlung aller Straßentypen (inklusive Filter) sowie auch das Script von VAB stelle ich zur freien Verfügung.
Comments 2
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.
spyos
Hi, danke für den Eintrag, das ist sehr interessant.
Denkst du, dass es so eine Ermittlung der Ressourcen auch für Fahrzeuge gibt? Zum Beispiel für alle Dampflokomotiven, die in einem Spiel zur Verfügung stehen?
Mein Plan wäre es, diese Fahrzeuge als Asset für den Schönbau zu verwenden. Bisher musste ich jedoch jede Lok, die ich gerne hätte, manuell als Asset erstellen.
VacuumTube
Da hast du doch glatt erraten, was ich als nächstes vorhabe
In dieser Diskussion ging es auch schon um Fahrzeugassets, dort werde ich morgen meinen Zwischenstand ablegen: Assets aus Fahrzeugen - Assets blau