Repository navigation
Fremde Mods anbinden
Ein anderer Mod kann Gebäude und Waren mitbringen, die sich an Production Revamp anlehnen — ohne eine einzige Zeile Lua. Das ist der entscheidende Punkt dieser Schnittstelle: sobald ein Mod auch nur eine Lua-Datei enthält, ist er nicht mehr konsolenfähig. Ein reiner Placeable- oder Frucht-Mod würde damit alle Konsolenspieler verlieren, nur um sich anzumelden.
Beides läuft über eine Datei revamp_extension.xml im Wurzelverzeichnis des fremden Mods. Revamp sucht sie selbst in allen geladenen Mods; ist Revamp nicht installiert, liest sie niemand und der Mod läuft ganz normal weiter.
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<revampExtension>
<storeItems>
<storeItem xmlFilename="SmallUndergroundStorageRevamp.xml"/>
</storeItems>
<fillTypes>
<fillType name="MY_CROP" like="WHEAT" addToStorage="true"/>
</fillTypes>
</revampExtension>Ein Gebäude, das einen Revamp-Placeable-Typ benutzt, kann nicht einfach als <storeItem> in der modDesc des fremden Mods stehen. Ohne Revamp kennt das Spiel den Typ nicht und schreibt Unknown type '...' ins Log — bei jedem Spieler dieses Mods, auch wenn er mit Revamp nie etwas zu tun hatte.
Deshalb wird das Store-Item nicht in der fremden modDesc deklariert, sondern von Revamp zur Laufzeit angemeldet. Ist Revamp nicht da, meldet niemand etwas an und die Placeable existiert für das Spiel schlicht nicht: sie fehlt im Baumenü, ohne eine Meldung im Log.
| Attribut | Bedeutung |
|---|---|
storeItem#xmlFilename |
Pfad zur Placeable-XML, relativ zum Wurzelverzeichnis des anmeldenden Mods |
Beliebig viele Einträge. Revamp meldet jedes davon so an, als käme es aus der modDesc des fremden Mods — mit dessen Umgebung, damit seine eigenen $l10n_-Texte, Bilder und Placeable-Typen greifen.
Zu beachten:
- Der Placeable-Typ braucht den vollen Namen mit Mod-Präfix, also
FS25_0_ProductionRevamp.RevampSilo. - Eine
<dependency>in der modDesc ist bei diesem Weg nicht nötig und auch nicht erwünscht — das Gebäude soll ja gerade optional sein. - Nennt die Anmelde-Datei eine XML, die es nicht gibt, meldet Revamp das beim Laden mit Dateiname und Modname im Log.
Kommt mindestens ein Store-Item durch, steht eine Zusammenfassung im Log:
Info: Production Revamp: added 1 store items from 1 mods
Führt eine Stelle ihre Fülltypen als Kategorie (fillTypeCategories="GRAIN"), reicht die eigene fillTypes.xml des Mods. Eine Kategorie, die es schon gibt, wird dabei ergänzt und nicht abgelehnt:
<fillTypeCategories>
<fillTypeCategory name="GRAIN">MY_CROP</fillTypeCategory>
<fillTypeCategory name="REVAMP_GRAIN">MY_CROP</fillTypeCategory>
</fillTypeCategories>Damit nimmt jede Abladestelle, jedes Silo und jedes Revamp-Rezept, das die Kategorie benutzt, die neue Ware automatisch an. Das ist auch der einzige Weg, eine fremde Ware in ein Rezept zu bekommen — die Anmeldung unten kann das ausdrücklich nicht.
Für den Rest: Stellen, die ihre Fülltypen namentlich aufzählen (fillTypes="WHEAT BARLEY OAT"), und davon gibt es auf den Karten reichlich. Dafür meldet der Mod seine Ware mit einem Referenz-Fülltyp an — „überall, wo Weizen angenommen wird, nimm auch meine Frucht an“.
| Attribut | Vorgabe | Bedeutung |
|---|---|---|
name |
– | Pflicht. Der eigene Fülltyp |
like |
– | Pflicht. Vorhandener Fülltyp als Bezugspunkt: wo dieser angenommen wird, wird künftig auch der eigene angenommen |
addToStorage |
false |
Zusätzlich in Lager aufnehmen, die den Referenz-Fülltyp aus einer Gesamtkapazität bedienen |
| Stelle | Verhalten |
|---|---|
| Verkaufsstelle ohne eigenes Lager | nimmt die Ware an und verkauft sie, Preis kommt aus der Ware selbst |
| Silo mit Gesamtkapazität | nimmt sie auf, aber nur mit addToStorage="true"
|
| Lager mit fest zugeteilten Einzelmengen je Ware | bleibt unangetastet — dort wäre keine Menge vorgesehen, die der Kartenbauer je eingeplant hat |
| Produktionsstätten und Fabriken | nie, auch wenn sie den Referenz-Fülltyp verarbeiten: eine Produktion kann nur, was in ihren Rezepten steht |
| Tierställe | nie: der Stall würde die Ware zwar lagern, gefressen wird aber nur, was das Futtersystem kennt |
Zu wissen ist außerdem: wird eine Ware irgendwo angenommen, wo kein Lagerplatz für sie da ist, kommt beim Abladen schlicht nichts an. Wer addToStorage weglässt, meldet seine Ware also nur zum Verkaufen an.
- Die Anmelde-Datei wird beim Laden der Store-Items gelesen, also noch vor den Fülltypen. Die Namen werden deshalb erst aufgelöst, wenn alle Fülltypen geladen sind, auch die anderer Mods.
- Die Stellen selbst werden ergänzt, wenn sie sich beim Spiel anmelden. Das gilt gleichermaßen für die Stellen der Karte und für alles, was später im laufenden Spiel gebaut wird.
- Die Reihenfolge der Mods spielt keine Rolle.
Im Log steht eine Zeile:
Production Revamp: added 1 fill types to existing stations
Mit eingeschaltetem Debug-Schalter kommt je Stelle und je Lager eine eigene Zeile dazu — hilfreich vor allem bei Silos, weil man einem gebauten Silo nirgends ansehen kann, was es annimmt:
RevampDebug: loadStorage(): MILK in ein Lager mit 500000 l Gesamtkapazitaet aufgenommen (placeable.silo.storages.storage(0))
RevampDebug: addUnloadingStation(): Getreide Flusssilo nimmt jetzt auch MILK an
Fehler in der Anmeldung (unbekannter Fülltyp, unbekannter Referenz-Fülltyp, Ware auf sich selbst bezogen) stehen ebenfalls im Log, mit Namen des anmeldenden Mods.
Braucht ein Mod das doch aus Lua heraus — weil er ohnehin schon Skripte enthält und deshalb nichts mehr zu verlieren hat:
local mod = g_modManager:getModByName("FS25_0_ProductionRevamp")
if mod ~= nil and g_modIsLoaded[mod.modName] then
-- Revamp ist geladen
endDer ModName muss dafür exakt FS25_0_ProductionRevamp lauten, siehe Kompatibilität.
Was ein solcher Mod danach aus Revamps Laufzeitdaten auslesen kann — Rezepte, Mix-Gruppen, Booster, Lagerstände —, steht unter Laufzeitdaten lesen.
Die Knopfleiste des Produktionsmenüs hat sechs feste Plätze. Vanilla belegt davon bis zu fünf, Revamp kommt mit Verwalten und Auslagern dazu — ein siebter Knopf wird vom Spiel nicht mehr dargestellt und verschwindet kommentarlos. Welchen Mod es trifft, hängt allein an der Ladereihenfolge.
Revamp hält deshalb in seinem Verwalten-Dialog in jeder der beiden Knopfreihen einen Platz für einen fremden Mod bereit. Der Mod meldet seinen Knopf dort an, statt ihn in die volle Leiste zu setzen.
Jeder Mod läuft in einer eigenen Umgebung. Revamps Tabellen sind von außen deshalb nur über dessen Mod-Umgebung zu sehen, die das Spiel unter dem ModNamen ablegt:
local revampEnvironment = _G["FS25_0_ProductionRevamp"]
local revampApi = revampEnvironment ~= nil and revampEnvironment.ProductionRevampApi or nilIst Revamp nicht installiert, bleibt revampApi schlicht nil und der eigene Mod läuft unverändert weiter.
revampApi.registerManageButton({
modName = "FS25_MeinMod",
text = g_i18n:getText("meinMod_buttonText"),
scope = revampApi.SCOPE.PRODUCTION_POINT,
isVisible = function(productionPoint) return true end,
callback = function(productionPoint) MeinDialog.show(productionPoint) end
})| Feld | Vorgabe | Bedeutung |
|---|---|---|
modName |
– | Pflicht. Eigener Modname, taucht in Revamps Log-Meldungen auf |
text |
– | Pflicht. Fertige Beschriftung, bereits übersetzt |
scope |
– |
Pflicht. SCOPE.PRODUCTION_POINT oder SCOPE.FILLTYPE, siehe unten |
callback |
– |
Pflicht. Wird beim Klick gerufen, mit Produktionspunkt und bei SCOPE.FILLTYPE zusätzlich dem Fülltyp |
isVisible |
immer sichtbar | Entscheidet je Stätte bzw. je Ware, ob der Knopf erscheint. Gleiche Parameter wie callback
|
Der Rückgabewert ist true, wenn der Knopf angenommen wurde.
scope sagt, worauf sich der Knopf bezieht. Daraus ergibt sich seine Reihe — den Aufbau des Dialogs muss der anmeldende Mod nicht kennen.
| Bereich | Wo der Knopf steht | Wann er sichtbar ist |
|---|---|---|
SCOPE.PRODUCTION_POINT |
untere Reihe, neben Auslagern und Ansichtswechsel | in jeder Ansicht |
SCOPE.FILLTYPE |
obere Reihe, neben Kaufen und Verkaufen | nur in der Waren-Ansicht, und nur solange eine Ware markiert ist |
Die Anmeldung gehört in den Missionsstart des eigenen Mods, zum Beispiel in loadMap — beim Sourcen der eigenen Dateien sind noch nicht alle Mods geladen.
Je Bereich nimmt Revamp genau einen Knopf an, denn je Reihe ist genau ein Platz frei. Meldet sich ein zweiter Mod für denselben Bereich an, wird er abgewiesen; registerManageButton gibt false zurück und im Log steht, welcher Mod den Platz bereits hat:
Error: Production Revamp: 'FS25_MeinMod' wants the manage dialog button for scope 'productionPoint', but 'FS25_AndererMod' already has it. Only one button per scope can be shown.
Der eigene Mod sollte darauf vorbereitet sein und in diesem Fall bei seinem bisherigen Weg bleiben.
- Store-Items meldeten fremde Mods dort über eine eigene
revamp_check.luaan, Fülltypen ebenfalls über eine eigene Lua-Datei. Beides gibt es nicht mehr — die Anmeldung ist rein deklarativ, aus dem Konsolengrund oben. - Die Bedingungen der LS22-Fassung (Store-Item nur bei vorhandenen Fülltypen ein- oder ausblenden) gibt es derzeit nicht. Dass die Datei überhaupt gelesen wird, ist bereits die Bedingung „Revamp ist installiert“. Weitere Bedingungen können später ergänzt werden, ohne dass sich an bestehenden Anmeldungen etwas ändert.