extends Node ## Local hotbar slot state mirror for NEO-29. Holds slot -> ability mapping from ## server-owned `HotbarLoadout` payloads. signal hotbar_changed(slots: Array) const SLOT_COUNT: int = 8 var _slots: Array = [] func _ready() -> void: if _slots.is_empty(): _slots.resize(SLOT_COUNT) for i in range(SLOT_COUNT): _slots[i] = null func apply_slots(slots: Array) -> void: var normalized: Array = [] normalized.resize(SLOT_COUNT) for i in range(SLOT_COUNT): normalized[i] = null for slot_variant in slots: if not slot_variant is Dictionary: continue var slot: Dictionary = slot_variant var idx: int = int(slot.get("slotIndex", -1)) if idx < 0 or idx >= SLOT_COUNT: continue var ability_variant: Variant = slot.get("abilityId", null) if ability_variant is String and not (ability_variant as String).is_empty(): normalized[idx] = ability_variant as String else: normalized[idx] = null _slots = normalized hotbar_changed.emit(_slots.duplicate()) func slots_snapshot() -> Array: return _slots.duplicate()