extends Node class_name WeaponSystem @export var default_pistol: Usable @export var default_knife: Usable @export var animation_player: AnimationPlayer var current_usable: Usable var slots: Dictionary[StringName,Usable] = { "primary": null, "secondary": default_pistol, "knife": default_knife, "bomb": null, "ability_first": null, "ability_second": null, "ability_third": null, "ultimate": null } signal switched_to(usable: Usable) func _ready() -> void: for child in get_children(): if child is Usable: child.system = self else: push_warning("Child of weapon system is not ability or weapon") current_usable = default_pistol current_usable.enter() func can_add(slot: StringName) -> bool: return slots.has(slot) func add(usable: Usable, slot: StringName) -> void: if can_add(slot) == false: return add_child(usable) slots[slot] = usable usable.system = self func switch(to: StringName): if slots.has(to) == false or slots[to] == null: return current_usable.exit() current_usable.in_use = false current_usable = slots[to] current_usable.enter() current_usable.in_use = true switched_to.emit(current_usable) update_remotes.rpc(to) @rpc("authority","call_remote","reliable") func update_remotes(to: StringName): switch(to) func _process(delta: float) -> void: if current_usable == null: push_error("State is not set") return current_usable.update(delta) func _physics_process(delta: float) -> void: if current_usable == null: push_error("State is not set") return current_usable.physics_update(delta) func _input(event: InputEvent) -> void: if is_multiplayer_authority() == false: return if event.is_action_pressed("plr_ult"): switch("ultimate") elif event.is_action_pressed("plr_bomb"): switch("bomb") elif event.is_action_pressed("plr_primary"): switch("primary") elif event.is_action_pressed("plr_active_first"): switch("ability_first") elif event.is_action_pressed("plr_active_second"): switch("ability_second") elif event.is_action_pressed("plr_active_third"): switch("ability_third") elif event.is_action_pressed("plr_secondary"): switch("secondary") elif event.is_action_pressed("plr_knife"): switch("knife") if event.is_action_pressed("plr_fire"): current_usable.use_begin.rpc() if event.is_action_released("plr_fire"): current_usable.use_end.rpc() if event.is_action_pressed("plr_scope"): current_usable.alternate_state() if event.is_action_pressed("plr_firemode"): current_usable.switch_mode()