Basic weapon slots system

This commit is contained in:
Alexey 2025-07-26 13:56:13 +03:00
commit 22a72e572e
7 changed files with 115 additions and 15 deletions

View file

@ -1,8 +1,10 @@
[gd_scene load_steps=5 format=3 uid="uid://dwx5tcatj35gu"] [gd_scene load_steps=7 format=3 uid="uid://dwx5tcatj35gu"]
[ext_resource type="Script" uid="uid://dts8lbivkgsmj" path="res://base/scripts/player/player.gd" id="1_1w3ab"] [ext_resource type="Script" uid="uid://dts8lbivkgsmj" path="res://base/scripts/player/player.gd" id="1_1w3ab"]
[ext_resource type="Texture2D" uid="uid://cfw6p5g680c55" path="res://base/assets/sprites/guns/placeholder/shoot1.png" id="2_i1xqq"] [ext_resource type="Texture2D" uid="uid://cfw6p5g680c55" path="res://base/assets/sprites/guns/placeholder/shoot1.png" id="2_i1xqq"]
[ext_resource type="PackedScene" uid="uid://bb6ovrbusyxpi" path="res://base/scenes/weapons/weapon_base.tscn" id="2_ma1q3"] [ext_resource type="PackedScene" uid="uid://bb6ovrbusyxpi" path="res://base/scenes/weapons/weapon_base.tscn" id="2_ma1q3"]
[ext_resource type="Script" uid="uid://byhp4pklbjltn" path="res://base/scripts/player/weapon_container.gd" id="3_1w3ab"]
[ext_resource type="Script" uid="uid://diu6eno2ag6ga" path="res://base/scripts/player/weapon_slot.gd" id="4_gt0rj"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_jjqxs"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_jjqxs"]
@ -49,5 +51,18 @@ theme_override_font_sizes/font_size = 32
text = "0/0" text = "0/0"
[node name="WeaponContainer" type="Node3D" parent="."] [node name="WeaponContainer" type="Node3D" parent="."]
script = ExtResource("3_1w3ab")
[node name="Weapon" parent="WeaponContainer" instance=ExtResource("2_ma1q3")] [node name="Primary" type="Node3D" parent="WeaponContainer"]
script = ExtResource("4_gt0rj")
metadata/_custom_type_script = "uid://diu6eno2ag6ga"
[node name="Weapon" parent="WeaponContainer/Primary" instance=ExtResource("2_ma1q3")]
[node name="Secondary" type="Node3D" parent="WeaponContainer"]
script = ExtResource("4_gt0rj")
metadata/_custom_type_script = "uid://diu6eno2ag6ga"
[node name="Tertiary" type="Node3D" parent="WeaponContainer"]
script = ExtResource("4_gt0rj")
metadata/_custom_type_script = "uid://diu6eno2ag6ga"

View file

@ -9,7 +9,7 @@ var queue: CommandQueue = CommandQueue.new()
@onready var camera: Camera3D = $"Camera" @onready var camera: Camera3D = $"Camera"
@onready var weapon_player: AnimationPlayer = $"HUD/Weapon/AnimationPlayer" @onready var weapon_player: AnimationPlayer = $"HUD/Weapon/AnimationPlayer"
@onready var weapons: Node3D = $"WeaponContainer" @onready var weapons: WeaponContainer = $"WeaponContainer"
# Placeholder UI # Placeholder UI
@onready var ammo_label: Label = $"HUD/Ammo" @onready var ammo_label: Label = $"HUD/Ammo"
@ -20,19 +20,15 @@ func _ready() -> void:
queue.command_pushed.connect(on_queue_command_pushed) queue.command_pushed.connect(on_queue_command_pushed)
queue.command_popped.connect(on_queue_command_popped) queue.command_popped.connect(on_queue_command_popped)
current_weapon = weapons.get_child(0) as Weapon weapons.slot_selected.connect(on_weapon_slot_selected)
current_weapon.fired.connect(on_weapon_fired)
current_weapon.fire_failed.connect(finish_task) get_tree().create_timer(0.02).timeout.connect(on_weapon_slot_selected)
weapon_player.add_animation_library("current", current_weapon.animation_library)
weapon_player.play("current/static")
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
update_ammo_label()
func _process(_delta: float) -> void: func _process(_delta: float) -> void:
if current_weapon == null:
return
var weapon_sides = current_weapon.uses_hands var weapon_sides = current_weapon.uses_hands
var weapon_sides_are_free = not queue.sides_are_busy(weapon_sides) var weapon_sides_are_free = not queue.sides_are_busy(weapon_sides)
if weapon_sides_are_free: if weapon_sides_are_free:
@ -77,6 +73,25 @@ func _input(event):
camera.rotation.x = new_rotation camera.rotation.x = new_rotation
rotation.y -= event.relative.x * horizontal_sensivity rotation.y -= event.relative.x * horizontal_sensivity
func on_weapon_slot_selected():
if current_weapon != null:
current_weapon.fired.disconnect(on_weapon_fired)
current_weapon.fire_failed.disconnect(finish_task)
weapon_player.remove_animation_library("current")
current_weapon = weapons.current_weapon
print('im here')
current_weapon.fired.connect(on_weapon_fired)
current_weapon.fire_failed.connect(finish_task)
weapon_player.add_animation_library("current", current_weapon.animation_library)
weapon_player.play("current/static")
update_ammo_label()
func on_queue_command_pushed(commands: Dictionary): func on_queue_command_pushed(commands: Dictionary):
for side in commands: for side in commands:
match side: match side:
@ -91,7 +106,6 @@ func push_copied_command(command: CommandQueue.Command, sides: Array[CommandQueu
commands[side] = command commands[side] = command
queue.push(commands) queue.push(commands)
func finish_task(): func finish_task():
queue.pop() queue.pop()

View file

@ -0,0 +1,30 @@
extends Node3D
class_name WeaponContainer
var slots: Array[WeaponSlot]
var current_slot: WeaponSlot = null
var current_weapon: Weapon
signal slot_selected()
func _ready():
for slot in get_children():
assert(slot is WeaponSlot)
slots.push_back(slot as WeaponSlot)
for slot in range(slots.size()):
if current_slot == null:
select_slot(slot)
else:
break
assert(current_slot != null)
func select_slot(index: int):
assert(index < slots.size())
if slots[index].has_weapon:
current_slot = slots[index]
current_weapon = current_slot.weapon
print('here we go')
slot_selected.emit()

View file

@ -0,0 +1 @@
uid://byhp4pklbjltn

View file

@ -0,0 +1,14 @@
extends Node3D
class_name WeaponSlot
var has_weapon = false
var weapon: Weapon
func _ready():
has_weapon = get_child_count() > 0
if has_weapon:
var child = get_child(0)
assert(child is Weapon)
weapon = child as Weapon

View file

@ -0,0 +1 @@
uid://diu6eno2ag6ga

View file

@ -51,6 +51,31 @@ reload={
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":82,"key_label":0,"unicode":114,"location":0,"echo":false,"script":null) "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":82,"key_label":0,"unicode":114,"location":0,"echo":false,"script":null)
] ]
} }
slot_primary={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":49,"key_label":0,"unicode":49,"location":0,"echo":false,"script":null)
]
}
slot_secondary={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":50,"key_label":0,"unicode":50,"location":0,"echo":false,"script":null)
]
}
slot_tertiary={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":51,"key_label":0,"unicode":51,"location":0,"echo":false,"script":null)
]
}
slot_next={
"deadzone": 0.2,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":16,"position":Vector2(230, 5),"global_position":Vector2(239, 53),"factor":1.0,"button_index":5,"canceled":false,"pressed":true,"double_click":false,"script":null)
]
}
slot_previous={
"deadzone": 0.2,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":8,"position":Vector2(402, 28),"global_position":Vector2(411, 76),"factor":1.0,"button_index":4,"canceled":false,"pressed":true,"double_click":false,"script":null)
]
}
[layer_names] [layer_names]