extends Node class_name WeaponSystem @export var default_pistol: WeaponSubStateMachine @export var default_knife: WeaponSubStateMachine @export var animation_player: AnimationPlayer @export var camera: PlayerCamera @export var player: Player var current_state: WeaponSubStateMachine var last_slot: StringName var slots: Dictionary[StringName,WeaponSubStateMachine] = { "primary": null, "secondary": null, "knife": null, "bomb": null, "ability_first": null, "ability_second": null, "ability_third": null, "ultimate": null } signal switched_to(state: WeaponSubStateMachine) func _ready() -> void: current_state = default_pistol add(default_knife,"knife") add(default_pistol,"secondary") current_state.enter() func can_add(slot: StringName) -> bool: return slots.has(slot) and slots[slot] == null @rpc("call_local","reliable") func add(state: WeaponSubStateMachine, slot: StringName) -> void: if can_add(slot) == false: return print('leech') if state.get_parent() == null: add_child(state) if state.get_parent() != self: state.reparent(self) slots[slot] = state state.system = self state.animation_player = animation_player state.player_camera = camera state.player = player state.request_return.connect(return_to_previous) func switch(to: StringName): if slots.has(to) == false or slots[to] == null or slots[to] == current_state: return current_state.exit() if current_state.can_be_previous: last_slot = slots.find_key(current_state) else: last_slot = "" current_state = slots[to] current_state.enter() switched_to.emit(current_state) update_remotes.rpc(to) func return_to_previous(): if last_slot != "": switch(last_slot) @rpc("authority","call_remote","reliable") func update_remotes(to: StringName): current_state.exit() current_state = slots[to] current_state.enter() switched_to.emit(current_state) func _process(delta: float) -> void: if current_state == null: push_error("State is not set") return current_state.update(delta) func _physics_process(delta: float) -> void: if current_state == null: push_error("State is not set") return current_state.physics_update(delta) func _input(event: InputEvent) -> void: if is_multiplayer_authority() == false: return if current_state != null: current_state.state_input(event) 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_state.use_begin.rpc() if event.is_action_released("plr_fire"): current_state.use_end.rpc() if event.is_action_pressed("plr_scope"): current_state.alternate_state() if event.is_action_pressed("plr_firemode"): current_state.switch_mode()