bomb spawn im crying

This commit is contained in:
Rendo 2025-11-27 18:16:26 +05:00
commit 3302fcfc96
16 changed files with 148 additions and 15 deletions

13
scripts/item_spawner.gd Normal file
View file

@ -0,0 +1,13 @@
extends Node3D
@export var item: PackedScene
func _ready() -> void:
deferred_spawn.call_deferred()
func deferred_spawn():
if multiplayer.is_server():
var node = item.instantiate()
add_sibling(node,true)
node.global_position = global_position
queue_free()

View file

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

View file

@ -3,7 +3,8 @@ extends Node
enum TEAMS {
DEFENCE,
ATTACK,
SPECTATE
SPECTATE,
UNASSIGNED
}
var dynamic_objects_container: Node3D

View file

@ -0,0 +1,22 @@
extends Area3D
@export var weapon_spawner: MultiplayerSpawner
@export var weapon_system: WeaponSystem
func _ready() -> void:
if is_multiplayer_authority() == false: return
body_entered.connect(on_body_entered)
func on_body_entered(body: Node3D):
if body is DroppableWeapon:
if weapon_system.can_add(body.slot) == false:
return
var weapon = weapon_spawner.spawn({
"ammo": body.weapon.ammo,
"remaining_ammo": body.weapon.remaining_ammo,
"scene_file_path": body.weapon.scene_file_path,
"slot": body.slot
})
weapon_system.on_weapon_added(weapon)
body.queue_free()

View file

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

View file

@ -8,7 +8,8 @@ func enter() -> void:
change_state(enter_state)
func exit() -> void:
clear_state.rpc()
if is_multiplayer_authority():
clear_state.rpc()
func update(delta: float) -> void:
if current_state == null:

View file

@ -0,0 +1,7 @@
extends RigidBody3D
class_name DroppableWeapon
@export var slot: StringName
@export var weapon: WeaponSubStateMachine
@export var team: Session.TEAMS

View file

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

View file

@ -3,6 +3,7 @@ extends State
class_name WeaponState
@warning_ignore("unused_signal")
signal return_to_previous
var machine: WeaponSubStateMachine

View file

@ -3,7 +3,8 @@ extends SubStateMachine
class_name WeaponSubStateMachine
@export var animation_prefix: StringName
@export var model: PackedScene
@export var droppable: PackedScene
@export var self_scene: PackedScene
@export var visibility_target: StringName
@export var max_ammo: int
@ -12,6 +13,8 @@ class_name WeaponSubStateMachine
@export var can_be_previous: bool = true
var slot: StringName
signal request_return
var system: WeaponSystem

View file

@ -27,9 +27,10 @@ signal switched_to(state: WeaponSubStateMachine)
func _ready() -> void:
current_state = default_pistol
add(default_knife,"knife")
add(default_pistol,"secondary")
current_state.enter()
$WeaponSpawner.spawn_function = pick_up_weapon
$WeaponSpawner.spawned.connect(on_weapon_added)
func can_add(slot: StringName) -> bool:
return slots.has(slot) and slots[slot] == null
@ -38,12 +39,13 @@ func can_add(slot: StringName) -> bool:
func add(state: WeaponSubStateMachine, slot: StringName) -> void:
if can_add(slot) == false:
return
print('leech')
if state.get_parent() == null:
add_child(state)
add_child(state, true)
if state.get_parent() != self:
state.reparent(self)
state.get_parent().remove_child(state)
add_child(state,true)
state.ready.emit()
slots[slot] = state
state.system = self
@ -67,6 +69,25 @@ func switch(to: StringName):
update_remotes.rpc(to)
func drop(): pass
# Spawn function
# Data should be a dictionary with these keys:
# ammo
# remaining_ammo
# scene_file_path
func pick_up_weapon(data: Variant) -> Node:
if data.has("ammo") == false or data.has("remaining_ammo") == false or data.has("scene_file_path") == false or data.has("slot") == false:
return null
var scene: WeaponSubStateMachine = load(data["scene_file_path"]).instantiate()
scene.ammo = data["ammo"]
scene.remaining_ammo = data["remaining_ammo"]
scene.slot = data["slot"]
return scene
func on_weapon_added(weapon: Node):
add(weapon,weapon.slot)
func return_to_previous():
if last_slot != "":
switch(last_slot)