# Bug-Report: Absturz beim Platzieren einer Blaupause — ChangeRecipe.lua:49

- Typ: bug
- Datum: 2026-09-27 (Crash-Log vom 2026-09-16)
- Session: t915k6damdrmujtzzh1 (Bug-Chat, manuell analysiert)
- Version: ~0.4.1.x
- Reproduzierbarkeit: beim Positionieren/Ablegen einer Blaupause

## Zusammenfassung
Beim Platzieren einer Blaupause stürzt das Spiel ab, weil `getItemIconName` in
`Source/Commands/ChangeRecipe.lua:49` auf `Recipe["Output"][1]` zugreift und
`Recipe` nil ist bzw. kein `Output[1]` besitzt.

## Fehler
```
Error: Commands/ChangeRecipe.lua:49: attempt to index a nil value
Commands/ChangeRecipe.lua:49: in function 'getItemIconName'
Commands/ChangeRecipe.lua:107: in function 'COMMAND_ChangeRecipe'
Objects/BlueprintManager.lua:1077: in function 'BuildFromInventory'
Objects/BlueprintManager.lua:1163: in function 'Update'
Update/TilePlacement.lua:83: in function 'Update'
Stages/Game.lua:287: in function 'Update'
```

## Technische Analyse
`getItemIconName(MachineName, Recipe)` gibt `Recipe["Output"][1]["Name"]` zurück
(Z. 49). Es gibt keine Prüfung, ob `Recipe` nil oder `Recipe["Output"]` leer ist.
Aufrufkette: `BlueprintManager.Update` → `BuildFromInventory` (Z. 1077) →
`COMMAND_ChangeRecipe` für jede Maschine der Blaupause, die ein Rezept gespeichert
hat.

Wahrscheinliche Ursache: Die Blaupause referenziert einen Rezeptnamen, der nicht
(mehr) in RecipeDB existiert — z. B. ein inzwischen entferntes Rezept
(Railgun-/TransportCannon-Rezepte wurden kürzlich gelöscht und registrieren sich
selbst beim Laden ihres Ordners; eine ältere Blaupause kann noch
`"Recipe = Railgun"` o. ä. tragen) oder ein Rezept ohne `Output`-Liste
(z. B. Bohrer-Pseudo-Rezepte, deren Output asteroidenabhängig ist).

Fix-Richtung:
- In `COMMAND_ChangeRecipe`/`getItemIconName` prüfen, ob das Rezept in RecipeDB
  auflösbar ist; bei unbekanntem Rezept Rezept-Änderung überspringen und eine
  LogManager-Zeile schreiben (kein silent fail — sichtbar im Log).
- `getItemIconName` nil-/leer-sicher machen (Fallback-Icon), da es rein
  kosmetisch ist und den Bau nicht blockieren darf.
- Optional: Beim Capture/Load von Blaupausen unbekannte Rezeptnamen filtern.
