12. Visual Slots - Visuelle Paletten-Slots

Übersicht
Mit Visual Slots können Paletten an bestimmten Positionen basierend auf dem FillLevel im Storage angezeigt werden.
📦 Beispiel: Ein Lagerhaus zeigt SUGAR-Paletten die erscheinen/verschwinden je nach Füllstand.
Funktionsweise
- Automatische Anzeige: Paletten erscheinen basierend auf FillLevel
- Auto-Detect: Standard-FillTypes werden automatisch geladen
- Kein Setup nötig: Für SUGAR, FLOUR, BREAD, EGGS etc. - einfach Slots definieren!
- Position-basiert: Jeder Slot hat eine feste Position im i3D
📷 [SCREENSHOT: Lager mit mehreren Paletten-Slots]
Auto-Detect System
WICHTIG: Für Standard-FillTypes ist KEINE zusätzliche Konfiguration nötig!
✅ Automatisch geladen
Diese FillTypes werden automatisch vom FillTypeManager geladen:
- SUGAR
- FLOUR
- BREAD
- EGGS
- MILK
- BUTTER
- CHEESE
- und alle anderen mit
isPalletType = true
Du brauchst KEINE:
- masterObjects
- palletTemplates.xml
- Zusätzliche Konfiguration
Einfach Slots definieren - fertig!
❌ NICHT für Schüttgüter
Diese FillTypes sind KEINE Paletten-Types:
- WHEAT (Schüttgut)
- BARLEY (Schüttgut)
- OAT (Schüttgut)
- CANOLA (Schüttgut)
- SUNFLOWER (Schüttgut)
Basis-Struktur (Auto-Detect)
<placeable>
<productionPoint>
<storage>
<!-- NUR Paletten-FillTypes verwenden! -->
<capacity fillType="SUGAR" capacity="50000"/>
<capacity fillType="FLOUR" capacity="50000"/>
<capacity fillType="BREAD" capacity="30000"/>
<capacity fillType="EGGS" capacity="20000"/>
</storage>
</productionPoint>
<productionExtension>
<visualSlots>
<!-- SUGAR Paletten - automatisch geladen! -->
<slot node="0>2|0|0" fillType="SUGAR"/>
<slot node="0>2|0|1" fillType="SUGAR"/>
<!-- FLOUR Paletten - automatisch geladen! -->
<slot node="0>2|0|2" fillType="FLOUR"/>
<slot node="0>2|0|3" fillType="FLOUR"/>
<!-- BREAD Paletten - automatisch geladen! -->
<slot node="0>2|0|4" fillType="BREAD"/>
<!-- EGGS Paletten - automatisch geladen! -->
<slot node="0>2|0|5" fillType="EGGS"/>
<!-- Universal-Slot (zeigt was auch immer vorhanden ist) -->
<slot node="0>2|0|6" acceptsAny="true"/>
</visualSlots>
<!-- KEINE masterObjects nötig! -->
<!-- KEINE palletTemplates.xml nötig! -->
</productionExtension>
</placeable>
📁 Siehe: examples/07_VisualSlots.xml
Slot Parameter
| Parameter | Beschreibung | Pflicht | Standard |
|---|---|---|---|
node | i3D Node für Slot-Position | ✅ | - |
fillType | FillType der angezeigt wird | ❌* | - |
acceptsAny | Akzeptiert alle FillTypes | ❌ | false |
*fillType oder acceptsAny muss gesetzt sein
Slot Types
Spezifischer Slot
Zeigt nur einen bestimmten FillType:
<slot node="0>2|0|0" fillType="SUGAR"/>
Verhalten:
- Zeigt nur SUGAR-Paletten
- Erscheint wenn SUGAR FillLevel > 0
- Verschwindet wenn SUGAR FillLevel = 0
Universal-Slot (acceptsAny)
Zeigt beliebigen FillType:
<slot node="0>2|0|0" acceptsAny="true"/>
Verhalten:
- Zeigt was auch immer im Storage vorhanden ist
- Wählt FillType mit höchstem FillLevel
- Gut für flexible Lager
Nutzen: Für Lager die verschiedene Produkte speichern!
Wie es funktioniert
Visual Slots bietet zwei Modi zur Anzeige von Paletten:
1. Percentage-Modus (Standard)
Paletten erscheinen prozentual basierend auf dem FillLevel im Storage:
Verwendung:
<visualSlots mode="percentage">
oder einfach:
<visualSlots>
2. Pallets-Modus (für Conveyor Belt)
Paletten erscheinen basierend auf der Anzahl fertiger Paletten:
Verwendung:
<visualSlots mode="pallets" litersPerPallet="1000">
Wichtig: Dieser Modus ist für Kombination mit Pallet Stacking gedacht!
Mode: Percentage (Standard)
FillLevel-basiert
Paletten erscheinen basierend auf dem FillLevel im Storage:
Beispiel:
<storage>
<capacity fillType="SUGAR" capacity="50000"/>
</storage>
<visualSlots>
<slot node="0>2|0|0" fillType="SUGAR"/> <!-- Slot 1 -->
<slot node="0>2|0|1" fillType="SUGAR"/> <!-- Slot 2 -->
<slot node="0>2|0|2" fillType="SUGAR"/> <!-- Slot 3 -->
</visualSlots>
Berechnung:
Paletten-Kapazität = ca. 2000 Liter (Standard)
Anzahl Paletten = FillLevel / 2000
Verhalten:
- 0 Liter SUGAR: 0 Paletten sichtbar
- 2000 Liter SUGAR: 1 Palette sichtbar (Slot 1)
- 4000 Liter SUGAR: 2 Paletten sichtbar (Slots 1+2)
- 6000 Liter SUGAR: 3 Paletten sichtbar (Slots 1+2+3)
Mode: Pallets (für Conveyor Belt)
Paletten-basiert
Paletten erscheinen basierend auf der Anzahl fertiger Paletten vom Conveyor Belt:
Beispiel:
<production id="barrel_production" name="Fass-Herstellung" cyclesPerHour="2" costsPerActiveHour="10">
<outputs>
<output fillType="SUGAR" amount="1000" />
</outputs>
<productionStateVisuals boxesPerCycle="12" outputPerCycle="1000" boxDuration="20">
<traveler node="0>9|0|0" />
<palletStacking mode="visual" capacityPerBox="83.3">
<palletTemplate node="0>9|0|2"/>
<spawnNode node="0>9|0|1"/>
<!-- Box positions 0-11 -->
</palletStacking>
</productionStateVisuals>
</production>
<!-- Visual Slots mit Pallets-Modus -->
<visualSlots mode="pallets" litersPerPallet="1000">
<slot node="0>10|0" fillType="SUGAR"/>
<slot node="0>10|1" fillType="SUGAR"/>
<slot node="0>10|2" fillType="SUGAR"/>
<slot node="0>10|3" fillType="SUGAR"/>
<masterObjects>
<pallet node="0>11|0" fillType="SUGAR"/>
</masterObjects>
</visualSlots>
Parameter
| Parameter | Beschreibung | Pflicht | Standard |
|---|---|---|---|
mode | Anzeigemodus: "percentage" oder "pallets" | ❌ | percentage |
litersPerPallet | Liter pro Palette (nur für mode="pallets") | ❌ | 1000 |
Berechnung
Anzahl sichtbarer Paletten = Anzahl fertiger Paletten vom Conveyor Belt
NICHT basierend auf Liter-Menge!
Verhalten
Mode: percentage (Standard)
- Bei 1500 Liter: Slots werden prozentual gefüllt
- Bei 2500 Liter: Mehr Slots prozentual gefüllt
- ❌ Passt NICHT zu Conveyor Belt Paletten
Mode: pallets (für Conveyor Belt)
-
- Palette fertig (12 Boxen) → 1 Slot voll ✅
-
- Palette fertig (12 Boxen) → 2 Slots voll ✅
-
- Palette fertig (12 Boxen) → 3 Slots voll ✅
- ✅ Passt PERFEKT zu Conveyor Belt!
Workflow
- Conveyor Belt baut Palette (Box für Box)
- 12. Box fertig → Palette komplett
- PalletStacking löscht visuelle Palette
- VisualSlots zeigt Palette im Regal ✨
Effekt: Palette "teleportiert" vom Belt ins Regal!
Nutze mode="pallets" wenn:
- ✅ Du Pallet Stacking mit
mode="visual"verwendest - ✅ Du willst dass fertige Paletten "ins Regal wandern"
- ✅ Du exakte Paletten-Counts brauchst (nicht prozentual)
Nutze mode="percentage" wenn:
- ✅ Du kein Pallet Stacking verwendest
- ✅ Du normale Storage-basierte Anzeige willst
- ✅ Du prozentuale Füllstands-Anzeige brauchst
Beispiele
Beispiel 1: Einfaches Lager (Auto-Detect)
Mehrere FillTypes mit Auto-Detect:
<productionPoint>
<storage>
<capacity fillType="SUGAR" capacity="50000"/>
<capacity fillType="FLOUR" capacity="50000"/>
<capacity fillType="BREAD" capacity="30000"/>
</storage>
</productionPoint>
<productionExtension>
<visualSlots>
<!-- SUGAR Slots -->
<slot node="0>2|0|0" fillType="SUGAR"/>
<slot node="0>2|0|1" fillType="SUGAR"/>
<slot node="0>2|0|2" fillType="SUGAR"/>
<!-- FLOUR Slots -->
<slot node="0>2|0|3" fillType="FLOUR"/>
<slot node="0>2|0|4" fillType="FLOUR"/>
<!-- BREAD Slots -->
<slot node="0>2|0|5" fillType="BREAD"/>
</visualSlots>
</productionExtension>
Keine zusätzliche Konfiguration nötig!
Beispiel 2: Mit Conveyor Belt (mode="pallets")
Kombination von Pallet Stacking und Visual Slots:
<productionExtension>
<productions>
<production id="sugar_production" name="Zucker-Produktion" cyclesPerHour="2">
<inputs>
<input fillType="SUGARBEET" amount="600" />
<input fillType="WATER" amount="400" />
</inputs>
<outputs>
<output fillType="SUGAR" amount="1000" />
</outputs>
<!-- Conveyor Belt System -->
<productionStateVisuals boxesPerCycle="12" outputPerCycle="1000" boxDuration="20" splinePath="0>9|0">
<traveler node="0>9|0|0" />
<palletStacking mode="visual" capacityPerBox="83.3">
<palletTemplate node="0>9|0|2"/>
<spawnNode node="0>9|0|1"/>
<!-- 12 Box-Positionen -->
<boxPosition index="0" node="0>9|0|2|0"/>
<boxPosition index="1" node="0>9|0|2|1"/>
<!-- ... bis index="11" ... -->
</palletStacking>
</productionStateVisuals>
</production>
</productions>
<!-- Regal-System mit Pallets-Modus -->
<visualSlots mode="pallets" litersPerPallet="1000">
<!-- Regal-Slots für fertige Paletten -->
<slot node="0>10|0" fillType="SUGAR"/>
<slot node="0>10|1" fillType="SUGAR"/>
<slot node="0>10|2" fillType="SUGAR"/>
<slot node="0>10|3" fillType="SUGAR"/>
<slot node="0>10|4" fillType="SUGAR"/>
<masterObjects>
<pallet node="0>11|0" fillType="SUGAR"/>
</masterObjects>
</visualSlots>
</productionExtension>
Was passiert:
- Produktion läuft → Boxen spawnen auf Belt
- 12 Boxen = 1 Palette fertig → Palette verschwindet vom Belt
- → Sofort erscheint 1 Palette im Regal (Slot 0)
- Nächste 12 Boxen fertig → 2. Palette im Regal (Slot 1)
- usw.
litersPerPallet="1000" muss mit outputPerCycle="1000" übereinstimmen!
Siehe auch: Conveyor Belt & Pallet Stacking
Beispiel 3: Mit Universal-Slots
Flexible Slots für beliebige FillTypes:
<visualSlots>
<!-- Spezifische Slots -->
<slot node="0>2|0|0" fillType="SUGAR"/>
<slot node="0>2|0|1" fillType="FLOUR"/>
<!-- Universal-Slots (für overflow) -->
<slot node="0>2|0|2" acceptsAny="true"/>
<slot node="0>2|0|3" acceptsAny="true"/>
<slot node="0>2|0|4" acceptsAny="true"/>
</visualSlots>
Verhalten:
- Slots 0-1: Zeigen nur SUGAR/FLOUR
- Slots 2-4: Zeigen was auch immer übrig ist
Master Objects - Custom-Paletten
NUR verwenden wenn du eigene 3D-Modelle im i3D hast!
Wann verwenden?
✅ Verwende masterObjects wenn:
- Du eigene 3D-Modelle verwenden willst (z.B. Kartons statt Paletten)
- Du vom Standard komplett abweichen willst
- Du spezielle Container/Fässer hast
❌ Verwende NICHT masterObjects wenn:
- Du Standard-Paletten verwenden willst
- FillType ist Standard-FS25 (SUGAR, FLOUR, etc.)
Master Objects Struktur
<productionExtension>
<visualSlots>
<slot node="0>2|0|0" fillType="SUGAR"/>
<slot node="0>2|0|1" fillType="FLOUR"/>
<!-- Master Objects für Custom-Paletten -->
<masterObjects>
<!-- Node muss im i3d existieren! -->
<pallet node="0>3|0|0" fillType="SUGAR"/>
<pallet node="0>3|0|1" fillType="FLOUR"/>
</masterObjects>
</visualSlots>
</productionExtension>
Verhalten:
- System klont das 3D-Modell vom Master-Node
- Master-Node wird unsichtbar gemacht
- Geklonte Objekte erscheinen an den Slot-Positionen
Master Objects Parameter
| Parameter | Beschreibung | Pflicht |
|---|---|---|
node | Master-Node im i3D | ✅ |
fillType | FillType für diesen Master | ✅ |
Pallet Variants - Mehrere Varianten
Für mehrere Varianten pro FillType mit verschiedenen Modellen/Texturen:
<productionExtension>
<visualSlots>
<slot node="0>2|0|0" fillType="FLOUR"/>
</visualSlots>
<!-- Mehrere Varianten für FLOUR -->
<palletVariants>
<variant fillType="FLOUR"
filename="data/objects/pallets/flourPallet/flourPalletWhite.xml"
capacity="1500"
name="Weißes Mehl"/>
<variant fillType="FLOUR"
filename="data/objects/pallets/flourPallet/flourPalletBrown.xml"
capacity="1500"
name="Vollkornmehl"/>
</palletVariants>
</productionExtension>
Verhalten:
- System wählt zufällig eine Variante aus
- Jeder Slot kann eine andere Variante haben
Siehe auch: Advanced Config - PalletTemplates
PalletVariants Parameter
| Parameter | Beschreibung | Pflicht | Standard |
|---|---|---|---|
fillType | FillType für diese Variante | ✅ | - |
filename | Palette XML-Datei | ✅ | - |
capacity | Kapazität in Litern | ✅ | - |
name | Anzeigename (optional) | ❌ | - |
Slot-Nodes im i3D
Node-Setup im Giants Editor
Jeder Slot benötigt einen Transform-Node im i3D:
Beispiel-Struktur:
Scenegraph:
├─ Placeable
│ ├─ Visual
│ └─ Slots ← TransformGroup
│ ├─ Slot01 (0>2|0|0) ← Transform-Node für Palette
│ ├─ Slot02 (0>2|0|1)
│ ├─ Slot03 (0>2|0|2)
│ └─ Slot04 (0>2|0|3)
Wichtig:
- Nodes müssen als Transform im i3D existieren
- Position bestimmt wo Palette erscheint
- Rotation wird übernommen
📷 [SCREENSHOT: Giants Editor Scenegraph mit Slot-Nodes]
Node-Pfade
<!-- Root → Placeable → Slots → Slot01 -->
<slot node="0>2|0|0" fillType="SUGAR"/>
<!-- Root → Placeable → Slots → Slot02 -->
<slot node="0>2|0|1" fillType="SUGAR"/>
Nutze TransformGroups zur Organisation der Slots!
Häufige Fehler
❌ Paletten werden nicht angezeigt
Ursache 1: Kein Paletten-FillType
<!-- FALSCH - WHEAT ist Schüttgut, kein Paletten-Type -->
<storage>
<capacity fillType="WHEAT" capacity="50000"/>
</storage>
<visualSlots>
<slot node="0>2|0|0" fillType="WHEAT"/> <!-- Funktioniert NICHT! -->
</visualSlots>
<!-- RICHTIG - FLOUR ist Paletten-Type -->
<storage>
<capacity fillType="FLOUR" capacity="50000"/>
</storage>
<visualSlots>
<slot node="0>2|0|0" fillType="FLOUR"/> <!-- Funktioniert! -->
</visualSlots>
Du musst die ProductionExtension Specialization registrieren!
Ursache 2: FillLevel = 0
<visualSlots>
<slot node="0>2|0|0" fillType="SUGAR"/>
</visualSlots>
Lösung: Storage mit SUGAR befüllen!
Ursache 3: Slot-Node existiert nicht
<!-- FALSCH - Node 0>99|0|0 existiert nicht im i3D -->
<slot node="0>99|0|0" fillType="SUGAR"/>
<!-- RICHTIG - Node existiert -->
<slot node="0>2|0|0" fillType="SUGAR"/>
Lösung: Im Giants Editor Scenegraph prüfen!
❌ Falsche Palette wird angezeigt
Ursache: FillType stimmt nicht mit Storage überein
<!-- Storage hat SUGAR -->
<storage>
<capacity fillType="SUGAR" capacity="50000"/>
</storage>
<!-- FALSCH - Slot zeigt FLOUR (nicht im Storage) -->
<visualSlots>
<slot node="0>2|0|0" fillType="FLOUR"/> <!-- Erscheint nicht! -->
</visualSlots>
<!-- RICHTIG - Slot zeigt SUGAR -->
<visualSlots>
<slot node="0>2|0|0" fillType="SUGAR"/> <!-- Funktioniert! -->
</visualSlots>
❌ Master Object funktioniert nicht
Ursache: Master-Node existiert nicht im i3D
<!-- FALSCH - Node existiert nicht -->
<masterObjects>
<pallet node="0>99|0|0" fillType="SUGAR"/>
</masterObjects>
<!-- RICHTIG - Node existiert im i3D -->
<masterObjects>
<pallet node="0>3|0|0" fillType="SUGAR"/>
</masterObjects>
Lösung: Master-Objekt muss im i3D als 3D-Modell vorhanden sein!
Paletten-FillTypes Liste
Standard Paletten-FillTypes in FS25:
| FillType | Beschreibung |
|---|---|
| SUGAR | Zucker |
| FLOUR | Mehl |
| BREAD | Brot |
| EGGS | Eier |
| MILK | Milch |
| BUTTER | Butter |
| CHEESE | Käse |
| WOOL | Wolle |
| FABRIC | Stoff |
| BOARDS | Bretter |
| CHIPS | Chips |
Prüfen: fillType.isPalletType = true im FillTypeManager. Dies sind nur Beispiele - natürlich gibt es einige Paletten-Produkte mehr.
Wann was verwenden?
Szenario 1: Standard-FillTypes (SUGAR, FLOUR, BREAD)
→ NUR visualSlots definieren
<visualSlots>
<slot node="0>2|0|0" fillType="SUGAR"/>
<slot node="0>2|0|1" fillType="FLOUR"/>
</visualSlots>
Kein Setup nötig! Auto-Detect lädt automatisch!
Szenario 2: Custom 3D-Modelle (Fässer statt Paletten)
→ visualSlots + masterObjects
<visualSlots>
<slot node="0>2|0|0" fillType="MILK"/>
<masterObjects>
<pallet node="0>3|0|0" fillType="MILK"/> <!-- Fass-Modell im i3d -->
</masterObjects>
</visualSlots>
Szenario 3: Mehrere Varianten (verschiedene Texturen)
→ palletTemplates.xml + visualSlots
<!-- In palletTemplates.xml -->
<template fillType="FLOUR">
<i3d>pallets/flourSack.i3d</i3d>
<texture>pallets/textures/flourSack_white.dds</texture>
<capacity>1500</capacity>
</template>
<template fillType="FLOUR">
<i3d>pallets/flourSack.i3d</i3d>
<texture>pallets/textures/flourSack_brown.dds</texture>
<capacity>1500</capacity>
</template>
<!-- In placeable XML -->
<visualSlots>
<slot node="0>2|0|0" fillType="FLOUR"/>
</visualSlots>
Szenario 4: Custom-Mod FillType mit eigener Palette
→ fillTypes.xml + visualSlots
Custom FillTypes werden über fillTypes.xml registriert:
<!-- In Custom Mod: fillTypes/fillTypes.xml -->
<map xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<fillTypes>
<fillType name="MY_CUSTOM_FILLTYPE"
title="$l10n_MY_CUSTOM_FILLTYPE"
isPalletType="true">
<physics massPerLiter="0.8"/>
<economy pricePerLiter="2.0"/>
<image hud="fillTypes/huds/myCustom.dds"/>
<pallet filename="fillTypes/pallets/myPallet.xml"/>
</fillType>
</fillTypes>
</map>
<!-- In placeable XML -->
<visualSlots>
<slot node="0>2|0|0" fillType="MY_CUSTOM_FILLTYPE"/>
</visualSlots>
Auto-Detect erkennt die Palette aus fillTypes.xml automatisch!
isPalletType="true" muss gesetzt sein!
Performance-Tipps
✅ Nicht zu viele Slots
<!-- Gut - 10-15 Slots -->
<visualSlots>
<slot node="0>2|0|0" fillType="SUGAR"/>
<!-- ... 10 weitere ... -->
</visualSlots>
<!-- Zu viel - 50+ Slots -->
<visualSlots>
<slot node="0>2|0|0" fillType="SUGAR"/>
<!-- ... 50 weitere ... -->
</visualSlots>
✅ Auto-Detect statt Custom
<!-- Gut - Auto-Detect (schneller) -->
<visualSlots>
<slot node="0>2|0|0" fillType="SUGAR"/>
</visualSlots>
<!-- Langsamer - Custom Master Objects -->
<visualSlots>
<slot node="0>2|0|0" fillType="SUGAR"/>
<masterObjects>
<pallet node="0>3|0|0" fillType="SUGAR"/>
</masterObjects>
</visualSlots>
✅ Einfache 3D-Modelle
- Low-Poly Paletten verwenden
- Einfache Texturen
- LODs für weite Entfernungen
Kombination mit anderen Features
Mit Pallet Stacking
Visual Slots können mit Pallet Stacking kombiniert werden:
<!-- Visual Slots für Storage -->
<visualSlots>
<slot node="0>2|0|0" fillType="FLOUR"/>
</visualSlots>
<!-- Pallet Stacking für Produktion -->
<productions>
<production id="muehle">
<productionStateVisuals>
<palletStacking mode="real">
<realPallet fillType="FLOUR" .../>
</palletStacking>
</productionStateVisuals>
</production>
</productions>
Siehe: Pallet Stacking
Verwandte Features
- Pallet Stacking - Paletten vom Förderband
- Advanced Config - PalletTemplates - Mehrere Varianten
Zusammenfassung
✅ Zwei Modi: mode="percentage" (Standard) und mode="pallets" (für Conveyor Belt)
✅ Automatische Paletten-Anzeige basierend auf FillLevel oder Paletten-Count
✅ Auto-Detect für Standard-FillTypes (kein Setup nötig!)
✅ Spezifische Slots oder Universal-Slots (acceptsAny)
✅ Master Objects für Custom 3D-Modelle
✅ Pallet Variants für mehrere Varianten
✅ Nur Paletten-FillTypes (KEINE Schüttgüter!)
✅ Performance-freundlich mit Auto-Detect
✅ Perfekt kombinierbar mit Pallet Stacking (mode="pallets")
✅ Multiplayer-kompatibel


