Zum Hauptinhalt springen

12. Visual Slots - Visuelle Paletten-Slots

Warnung außerhalb der Saison

Ü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 1
Screenshot 1
Screenshot 1

📷 [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
Hinweis

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

ParameterBeschreibungPflichtStandard
nodei3D Node für Slot-Position-
fillTypeFillType der angezeigt wird❌*-
acceptsAnyAkzeptiert alle FillTypesfalse

*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
Anmerkung

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

ParameterBeschreibungPflichtStandard
modeAnzeigemodus: "percentage" oder "pallets"percentage
litersPerPalletLiter 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)

    1. Palette fertig (12 Boxen) → 1 Slot voll ✅
    1. Palette fertig (12 Boxen) → 2 Slots voll ✅
    1. Palette fertig (12 Boxen) → 3 Slots voll ✅
  • ✅ Passt PERFEKT zu Conveyor Belt!

Workflow

  1. Conveyor Belt baut Palette (Box für Box)
  2. 12. Box fertig → Palette komplett
  3. PalletStacking löscht visuelle Palette
  4. VisualSlots zeigt Palette im Regal ✨

Effekt: Palette "teleportiert" vom Belt ins Regal!

Wann verwenden?

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>
Hinweis

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:

  1. Produktion läuft → Boxen spawnen auf Belt
  2. 12 Boxen = 1 Palette fertig → Palette verschwindet vom Belt
  3. → Sofort erscheint 1 Palette im Regal (Slot 0)
  4. Nächste 12 Boxen fertig → 2. Palette im Regal (Slot 1)
  5. usw.
WICHTIG

litersPerPallet="1000" muss mit outputPerCycle="1000" übereinstimmen!

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

ParameterBeschreibungPflicht
nodeMaster-Node im i3D
fillTypeFillType 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

PalletVariants Parameter

ParameterBeschreibungPflichtStandard
fillTypeFillType für diese Variante-
filenamePalette XML-Datei-
capacityKapazität in Litern-
nameAnzeigename (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"/>
TIPP

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>
WICHTIG

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:

FillTypeBeschreibung
SUGARZucker
FLOURMehl
BREADBrot
EGGSEier
MILKMilch
BUTTERButter
CHEESEKäse
WOOLWolle
FABRICStoff
BOARDSBretter
CHIPSChips
TIPP

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!

WICHTIG

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>
Anmerkung

Verwandte Features

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