1. Placeable Setup - XML Grundlagen
Übersicht

Die productionExtension Specialization ist das Herzstück des Production Extensions Systems. Sie ersetzt die Standard-Giants productionPoint Specialization und bietet deutlich mehr Funktionen.
Du kannst entweder productionExtension ODER productionPoint verwenden, aber nicht beide gleichzeitig!
Voraussetzungen
Bevor du die productionExtension nutzen kannst, muss dein Placeable:
- ✅ Den Production Extensions Mod als Dependency haben
PlaceableType registrieren
In deiner modDesc.xml:
Dependencies setzen
Wichtig ansonsten wird dein Mod nicht gefunden, dies hier ist dort einzutragen FS25_ProductionExtensions.
<modDesc>
<dependencies>
<dependency>FS25_ProductionExtensions</dependency>
</dependencies>
</modDesc>
Dann in deiner Placeable-XML:
<placeable type="FS25_ProductionExtensions.extendedProductionPoint">
<!-- ... -->
</placeable>
Grundlegende XML-Struktur
Minimales Beispiel
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<placeable type="FS25_ProductionExtensions.extendedProductionPoint">
<storeData>
<name>Meine Produktion</name>
<price>25000</price>
<!-- ... weitere StoreData ... -->
</storeData>
<productionExtension>
<productions>
<production id="meineProduktion" name="$l10n_produktionsname" cyclesPerHour="2" costsPerActiveHour="10">
<inputs>
<input fillType="WHEAT" amount="1000"/>
</inputs>
<outputs>
<output fillType="FLOUR" amount="800"/>
</outputs>
</production>
</productions>
</productionExtension>
</placeable>
Dies ist die absolut minimale Konfiguration. Weiter unten findest du erweiterte Optionen!
Wichtige XML-Parameter
<productionExtension> Hauptelement
| Parameter | Typ | Beschreibung | Standard |
|---|---|---|---|
descriptionId | String | ID aus description.xml für Dialog-Beschreibung | - |
logoSliceId | String | Logo für GUI-Dialogs (z.B. "myMod.myLogo") | - |
Beispiel:
<productionExtension descriptionId="meineBrauerei" logoSliceId="myMod.breweryLogo">
<!-- ... -->
</productionExtension>
Siehe auch: Descriptions und Logos
<production> Element
Jede Production definiert eine Produktionslinie:
| Parameter | Typ | Beschreibung | Pflicht |
|---|---|---|---|
id | String | Eindeutige ID der Produktion | ✅ |
name | String | Anzeigename (kann $l10n_ sein) | ✅ |
cyclesPerHour | Float | Zyklen pro Stunde (z.B. 2 = alle 30min) | ✅ |
costsPerActiveHour | Float | Kosten pro Betriebsstunde | ✅ |
Beispiel:
<production id="brotBacken"
name="$l10n_production_bread"
cyclesPerHour="4"
costsPerActiveHour="15">
<!-- inputs/outputs -->
</production>
<inputs> und <outputs>
Definiere Ein- und Ausgänge:
<inputs>
<input fillType="WHEAT" amount="1000"/>
<input fillType="WATER" amount="500"/>
</inputs>
<outputs>
<output fillType="BREAD" amount="10" sellDirectly="false"/>
<output fillType="CHAFF" amount="100" sellDirectly="true"/>
</outputs>
| Parameter | Beschreibung |
|---|---|
fillType | FillType Name (WHEAT, FLOUR, etc.) |
amount | Menge pro Zyklus in Litern |
sellDirectly | true = Auto-Verkauf (nur outputs) |
📷 [SCREENSHOT: InGame-Produktionsmenü mit mehreren Inputs/Outputs]
Trigger & Interaktion
Production Control Trigger
Erlaubt Spielern die Produktion zu starten/stoppen:
<productionExtension>
<productionControlTrigger node="0>1|2|0"/>
<productions>
<!-- ... -->
</productions>
</productionExtension>
Outsourcing Trigger
Öffnet den Output-Dialog zum Abtransport von Produkten:
<productionExtension>
<outsourcingTrigger node="0>1|3|0"/>
<productions>
<!-- ... -->
</productions>
</productionExtension>
Node-Syntax: 0>1|2|0 = i3d-Pfad zum Trigger-Node
Spawn Areas (Paletten-Spawn)
Definiere Bereiche, wo Output-Paletten spawnen:
<productionExtension>
<spawnAreas>
<spawnArea startNode="0>2|0|0"
endNode="0>2|0|1"
name="Haupt-Spawn"
palletRotationOffset="90"
palletSpacing="1.5"/>
<spawnArea startNode="0>2|1|0"
endNode="0>2|1|1"
name="Neben-Spawn"/>
</spawnAreas>
<productions>
<!-- ... -->
</productions>
</productionExtension>
| Parameter | Typ | Beschreibung | Standard |
|---|---|---|---|
startNode | Node | Start-Punkt des Spawn-Bereichs | - |
endNode | Node | End-Punkt des Spawn-Bereichs | - |
name | String | Name des Bereichs | Auto |
palletRotationOffset | Float | Rotation in Grad | 0 |
palletSpacing | Float | Abstand zwischen Paletten (m) | 1.5 |
Vollständiges Beispiel
Hier ein komplettes Beispiel mit allen Basis-Elementen:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<placeable type="FS25_ProductionExtensions.extendedProductionPoint">
<storeData>
<name>Moderne Bäckerei</name>
<price>85000</price>
<dailyUpkeep>50</dailyUpkeep>
<canBeSold>true</canBeSold>
</storeData>
<productionExtension descriptionId="bakery_modern" logoSliceId="myMod.bakeryLogo">
<!-- Trigger -->
<productionControlTrigger node="0>1|0|0"/>
<outsourcingTrigger node="0>1|0|1"/>
<!-- Spawn Areas -->
<spawnAreas>
<spawnArea startNode="0>2|0"
endNode="0>2|1"
name="Brot-Paletten"
palletSpacing="2.0"/>
</spawnAreas>
<!-- Produktionen -->
<productions>
<!-- Produktion 1: Brot -->
<production id="brot"
name="$l10n_production_bread"
cyclesPerHour="2"
costsPerActiveHour="20">
<inputs>
<input fillType="FLOUR" amount="500"/>
<input fillType="WATER" amount="200"/>
</inputs>
<outputs>
<output fillType="BREAD" amount="10"/>
</outputs>
</production>
<!-- Produktion 2: Kuchen -->
<production id="kuchen"
name="$l10n_production_cake"
cyclesPerHour="1"
costsPerActiveHour="30">
<inputs>
<input fillType="FLOUR" amount="300"/>
<input fillType="MILK" amount="100"/>
<input fillType="EGG" amount="50"/>
</inputs>
<outputs>
<output fillType="CAKE" amount="5"/>
</outputs>
</production>
</productions>
</productionExtension>
</placeable>
📷 [SCREENSHOT: Die fertige Bäckerei im Spiel mit GUI-Dialog]
Storage (Lager)
Füge Lager für Inputs/Outputs hinzu:
<productionExtension>
<storage>
<capacity fillType="FLOUR" capacity="10000"/>
<capacity fillType="WATER" capacity="5000"/>
<capacity fillType="BREAD" capacity="2000"/>
</storage>
<productions>
<!-- ... -->
</productions>
</productionExtension>
Ohne Storage können Produktionen keine Inputs speichern!
Storage Header Konfiguration
Der Storage-Header im Info-Trigger kann angepasst werden:
<storage showHeader="true" headerText="$l10n_storage_kalkLager">
<capacity fillType="STONE" capacity="240000" />
<capacity fillType="LIME" capacity="240000" />
</storage>
Parameter:
| Parameter | Typ | Beschreibung | Standard |
|---|---|---|---|
showHeader | Boolean | Header im Info-Trigger anzeigen | true |
headerText | String | Header-Text (fest oder per $l10n_KEY) | - |
Priorität:
headerText→ Text direkt oder übersetzt via$l10n_KEY- Standard → "Gebäudelager" / "Building Storage"
Beispiel mit Übersetzung (empfohlen):
Der $l10n_-Präfix wird automatisch im Kontext des eigenen Mods aufgelöst — der Key muss also in den eigenen Translation-Dateien des Mods stehen, nicht in ProductionExtension.
<!-- In LimeProduction.xml -->
<storage showHeader="true" headerText="$l10n_storage_kalkLager">
<capacity fillType="LIME" capacity="240000" />
</storage>
<!-- In translation_de.xml des eigenen Mods -->
<text name="storage_kalkLager" text="Kalk Lager" />
Beispiel mit festem Text:
<storage showHeader="true" headerText="Mein Lager">
<capacity fillType="FLOUR" capacity="10000" />
</storage>
Header ausblenden:
<storage showHeader="false">
<capacity fillType="FLOUR" capacity="10000" />
</storage>
Erweiterte Features
Nachdem du die Grundlagen verstanden hast, kannst du deine Produktion mit zusätzlichen Features erweitern:
Visuelle Features
- Status Lights - Farbige Statusanzeigen
- Beacon Lights - Animierte Warnlichter
- Production State Visuals - Conveyor-Belts & Animationen
- Visual Slots - Sichtbare Lagerbereiche
Produktions-Features
- Mix Recipes - Komplexe Rezepte mit mehreren Inputs
- Seasonal Production - Saisonabhängige Produktionen
- Opening Hours - Betriebszeiten definieren
- Production Templates - Vordefinierte Produktionsketten
- Rainwater Collection - Regenwasser sammeln
Logistik-Features
- Animal Unload - Tiere entladen
- Pallet Stacking - Paletten stapeln
- Production Display - Detaillierte Anzeige
Häufige Fehler
❌ "Production not loading"
Ursache: PlaceableType hat nicht die richtige Specialization
Lösung: Überprüfe, ob productionExtension registriert ist und NICHT productionPoint
❌ "No spawn area found"
Ursache: Start/End-Nodes für spawnArea existieren nicht
Lösung: Überprüfe die Node-Pfade im i3d mit dem Giants Editor
Nächste Schritte
- ✅ Erstelle eine einfache Produktion mit diesem Setup
- Lies die Status Lights Anleitung
- Füge Production State Visuals hinzu
- Erweitere mit Mix Recipes oder anderen Features
Beispiel-Dateien
Im examples/ Ordner findest du vollständige Beispiele:
example_01_single_lane_visual.xml- Einfache Produktion mit Visualsexample_02_single_lane_real_pallets.xml- Mit echten Paletten12_description.xml- Beispiel für description.xml13_logos_gui.xml- Beispiel für Logo-Integration
Kopiere ein Beispiel und passe es an deine Bedürfnisse an!