fix: Zweitwaffe der Assassine zeigte Schild- statt Waffen-Icon #14

Merged
DasAoD merged 1 commit from fix/assassin-second-weapon-icon into main 2026-08-03 16:51:28 +02:00
Owner

Problem

Bei der Assassine (trägt zwei Waffen) stimmte das Icon der zweiten Waffe im Charakter-Modal nicht mit dem Spiel überein (Screenshot-Vergleich von @Arkumen).

Ursache

Die Ausrüstungsliste der sf-api ist positionsbasiert (EnumMap<EquipmentSlot, Option<Item>>), nicht typbasiert: Equipment::parse liest die Items einfach nacheinander aus dem Rohdaten-Array in die Slots Hat, BreastPlate, Gloves, FootWear, Amulet, Belt, Ring, Talisman, Weapon, Shield. Bei der Assassine landet die zweite Waffe dadurch technisch im "Shield"-Slot, ist aber weiterhin ein ganz normales Waffen-Item (item.typ == Weapon{...}).

Die bisherige Icon-Auflösung (item_icons.php) hat blind dem Slotnamen vertraut ("Shield" → geteiltes Schild-Icon-Set), statt den tatsächlichen Item-Typ zu prüfen.

Fix

  • cli/cron_character_sync.php: speichert jetzt zusätzlich das rohe typ-Feld jedes Ausrüstungsgegenstands in char_data_json.
  • includes/item_icons.php: bestimmt die Icon-Typ-ID aus item.typ (Weapon/Shield/...) statt aus dem Slotnamen. Der Slotname bleibt nur als Fallback für alte, noch nicht neu synchronisierte Datensätze ohne typ-Feld.

Wichtig für den Test

Der Fix greift erst, nachdem für den betroffenen Charakter ein neuer character_sync-Lauf passiert ist (Cronjob oder manueller Sync-Button) — vorher fehlt das typ-Feld noch in den gespeicherten Daten und der alte Slot-Fallback greift (zeigt weiterhin das falsche Schild-Icon).

## Problem Bei der Assassine (trägt zwei Waffen) stimmte das Icon der zweiten Waffe im Charakter-Modal nicht mit dem Spiel überein (Screenshot-Vergleich von @Arkumen). ## Ursache Die Ausrüstungsliste der `sf-api` ist positionsbasiert (`EnumMap<EquipmentSlot, Option<Item>>`), nicht typbasiert: `Equipment::parse` liest die Items einfach nacheinander aus dem Rohdaten-Array in die Slots `Hat, BreastPlate, Gloves, FootWear, Amulet, Belt, Ring, Talisman, Weapon, Shield`. Bei der Assassine landet die zweite Waffe dadurch technisch im **"Shield"-Slot**, ist aber weiterhin ein ganz normales Waffen-Item (`item.typ == Weapon{...}`). Die bisherige Icon-Auflösung (`item_icons.php`) hat blind dem Slotnamen vertraut ("Shield" → geteiltes Schild-Icon-Set), statt den tatsächlichen Item-Typ zu prüfen. ## Fix - `cli/cron_character_sync.php`: speichert jetzt zusätzlich das rohe `typ`-Feld jedes Ausrüstungsgegenstands in `char_data_json`. - `includes/item_icons.php`: bestimmt die Icon-Typ-ID aus `item.typ` (Weapon/Shield/...) statt aus dem Slotnamen. Der Slotname bleibt nur als Fallback für alte, noch nicht neu synchronisierte Datensätze ohne `typ`-Feld. ## Wichtig für den Test Der Fix greift erst, nachdem für den betroffenen Charakter ein neuer `character_sync`-Lauf passiert ist (Cronjob oder manueller Sync-Button) — vorher fehlt das `typ`-Feld noch in den gespeicherten Daten und der alte Slot-Fallback greift (zeigt weiterhin das falsche Schild-Icon).
Die Ausrüstungsliste der sf-api ist positionsbasiert (EnumMap<EquipmentSlot,
Option<Item>>), nicht typbasiert: Bei der Assassine (zwei Waffen) liegt die
zweite Waffe technisch im "Shield"-Slot, ist aber weiterhin ein echtes
Waffen-Item (typ.Weapon). Die Icon-Auflösung hat bisher blind dem Slotnamen
vertraut und deshalb aus dem geteilten Schild-Set statt dem klassen-
spezifischen Waffen-Set gewählt.

- cron_character_sync.php speichert jetzt das rohe item.typ-Feld mit
- item_icons.php bestimmt die Typ-ID aus item.typ statt aus dem Slotnamen
  (Slotname bleibt nur Fallback für Alt-Datensätze ohne typ-Feld)

Wirkt erst nach dem nächsten character_sync-Lauf für bereits synchronisierte
Mitglieder, da das typ-Feld vorher nicht gespeichert wurde.
DasAoD merged commit 17d5cc7f70 into main 2026-08-03 16:51:28 +02:00
Sign in to join this conversation.
No description provided.