Chelimbalo/scripts/weapon_system/system.gd
2025-11-24 04:44:42 +05:00

107 lines
2.5 KiB
GDScript

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()