From ea4f70f5eff74fd209fe3e494032205b0fb9f39e Mon Sep 17 00:00:00 2001 From: Rendo Date: Wed, 3 Dec 2025 20:50:47 +0500 Subject: [PATCH] Spawnables --- TODO_LIST | 13 +- audio/test_damaged.ogg | Bin 0 -> 32566 bytes audio/test_damaged.ogg.import | 19 + environments/split_environment.tres | 13 + levels/prototype_scene.tscn | 6 + levels/split.tscn | 218 + project.godot | 1 + scenes/gui/client_settings.tscn | 2 +- scenes/molikman.tscn | 8821 +++++++++-------- scenes/weapons/bomb.tscn | 2 +- scenes/weapons/starting_pistol.tscn | 2 +- .../spawn_system/dyn_objects_spawner.gd | 50 +- scripts/player/input_system.gd | 11 + scripts/player/input_system.gd.uid | 1 + scripts/player/player.gd | 1 + scripts/registry.gd | 11 + scripts/registry.gd.uid | 1 + scripts/resources/weapon_resource.gd | 9 + scripts/resources/weapon_resource.gd.uid | 1 + scripts/weapon_system/bomb/bomb_main_state.gd | 4 +- .../weapon_system/weapon_substate_machine.gd | 2 +- scripts/weapon_system/weapon_system.gd | 3 +- .../weapons => spawnables}/active_bomb.tscn | 0 weapons/bomb.tres | 14 + weapons/sp.tres | 15 + 25 files changed, 4784 insertions(+), 4436 deletions(-) create mode 100644 audio/test_damaged.ogg create mode 100644 audio/test_damaged.ogg.import create mode 100644 environments/split_environment.tres create mode 100644 levels/split.tscn create mode 100644 scripts/player/input_system.gd create mode 100644 scripts/player/input_system.gd.uid create mode 100644 scripts/registry.gd create mode 100644 scripts/registry.gd.uid create mode 100644 scripts/resources/weapon_resource.gd create mode 100644 scripts/resources/weapon_resource.gd.uid rename {scenes/weapons => spawnables}/active_bomb.tscn (100%) create mode 100644 weapons/bomb.tres create mode 100644 weapons/sp.tres diff --git a/TODO_LIST b/TODO_LIST index 6b02c49..8f30b9e 100644 --- a/TODO_LIST +++ b/TODO_LIST @@ -2,11 +2,9 @@ Current plans: Different damage based on body part - Knife: - Behaviour - Model - Animation Audio system: + Positional sound + Distance and wall dampening Gameplay HUD: Weapon display Ability display @@ -14,6 +12,7 @@ Current plans: Molik Flashbang Wall smoke - Kamikadze? - Think of something better - + Anticheat: + Replace authority over player to server + Make rpc's to sync state + Implement client side state changes and sync calls diff --git a/audio/test_damaged.ogg b/audio/test_damaged.ogg new file mode 100644 index 0000000000000000000000000000000000000000..12b9c894d6e2350fffce73b6b6f6ab0f9953078c GIT binary patch literal 32566 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 void: Session.dynamic_objects_spawner = self func request_spawn(data: Variant) -> Node: - if data.has("scene") == false: + if is_multiplayer_authority() == false: return + if data.has("type") == false or data.has("spawn_name") == false: return Node.new() - var node = load(data.scene).instantiate() - if data.has("impulse"): - if data.has_all(["ammo","remaining_ammo","slot"]): - node.weapon.ammo = data.ammo - node.weapon.remaining_ammo = data.remaining_ammo - node.slot = data.slot - - node.apply_impulse(data.impulse) - - for key in data.keys(): - if key in ["scene","ammo","remaining_ammo","slot","position","rotation"]: - continue - node.set(key,data[key]) - return node + match data.type: + "weapon": + var weapon: DroppableWeapon = Registry.weapons[data.spawn_name].dropped_scene.instantiate() + weapon.apply_central_impulse(data.impulse) + weapon.weapon.ammo = data.ammo + weapon.weapon.remaining_ammo = data.remaining_ammo + weapon.slot = Registry.weapons[data.spawn_name].slot + + for key in data.keys(): + if key == "impulse" or key == "ammo" or key == "remaining_ammo": + continue + weapon.set(key,data[key]) + + return weapon + "projectile": + var projectile: RigidBody3D = Registry.spawnable_objects[data.spawn_name].instantiate() + projectile.apply_central_impulse(data.impulse) + + for key in data.keys(): + if key == "impulse": + continue + projectile.set(key,data[key]) + + return projectile + "object": + var object: Node3D = Registry.spawnable_objects[data.spawn_name].instantiate() + + for key in data.keys(): + object.set(key,data[key]) + + return object + _: + return Node.new() diff --git a/scripts/player/input_system.gd b/scripts/player/input_system.gd new file mode 100644 index 0000000..fae2c76 --- /dev/null +++ b/scripts/player/input_system.gd @@ -0,0 +1,11 @@ +extends Node + + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + pass diff --git a/scripts/player/input_system.gd.uid b/scripts/player/input_system.gd.uid new file mode 100644 index 0000000..2810c17 --- /dev/null +++ b/scripts/player/input_system.gd.uid @@ -0,0 +1 @@ +uid://cg0v1nmwuuoej diff --git a/scripts/player/player.gd b/scripts/player/player.gd index d55c7f5..0dd68f7 100644 --- a/scripts/player/player.gd +++ b/scripts/player/player.gd @@ -66,6 +66,7 @@ func set_after_spawn(start_position: Vector3,new_team: int): @rpc("any_peer","call_local","reliable") func take_damage(damage: int): hp -= damage + $DamageAudio.multiplayer_play() func _input(event: InputEvent) -> void: if not is_multiplayer_authority(): diff --git a/scripts/registry.gd b/scripts/registry.gd new file mode 100644 index 0000000..cacce20 --- /dev/null +++ b/scripts/registry.gd @@ -0,0 +1,11 @@ +extends Node + +var spawnable_objects: Dictionary[StringName,PackedScene] +var weapons: Dictionary[StringName,WeaponResource] + +func _ready() -> void: + for file in ResourceLoader.list_directory("res://weapons/"): + weapons[file.trim_suffix(".tres")] = load("res://weapons/"+ file) + + for file in ResourceLoader.list_directory("res://spawnables/"): + spawnable_objects[file.trim_suffix(".tscn")] = load("res://spawnables/" + file) diff --git a/scripts/registry.gd.uid b/scripts/registry.gd.uid new file mode 100644 index 0000000..5bfda02 --- /dev/null +++ b/scripts/registry.gd.uid @@ -0,0 +1 @@ +uid://c7p8avavia4fp diff --git a/scripts/resources/weapon_resource.gd b/scripts/resources/weapon_resource.gd new file mode 100644 index 0000000..c10ad2c --- /dev/null +++ b/scripts/resources/weapon_resource.gd @@ -0,0 +1,9 @@ +extends Resource + +class_name WeaponResource + +@export var cost: int +@export var preview: Texture2D +@export var dropped_scene: PackedScene +@export var weapon_system_scene: PackedScene +@export var slot: StringName diff --git a/scripts/resources/weapon_resource.gd.uid b/scripts/resources/weapon_resource.gd.uid new file mode 100644 index 0000000..145239f --- /dev/null +++ b/scripts/resources/weapon_resource.gd.uid @@ -0,0 +1 @@ +uid://bvnn2eiwqbu7t diff --git a/scripts/weapon_system/bomb/bomb_main_state.gd b/scripts/weapon_system/bomb/bomb_main_state.gd index 46c1d84..869e343 100644 --- a/scripts/weapon_system/bomb/bomb_main_state.gd +++ b/scripts/weapon_system/bomb/bomb_main_state.gd @@ -1,7 +1,5 @@ extends WeaponState -const active_bomb: StringName = "uid://dtbpyfdawb02b" - func enter(): machine.animation_player.play(machine.animation_prefix+"plant") machine.animation_player.animation_finished.connect(on_animation_finished) @@ -17,7 +15,7 @@ func on_animation_finished(animation: StringName): return if animation == machine.animation_prefix + "plant": - Session.spawn({"scene": active_bomb, "position": machine.player_camera.get_parent().global_position,"plant": Session.get_site().name}) + Session.spawn({"type": "object","spawn_name": "active_bomb", "position": machine.player_camera.get_parent().global_position,"plant": Session.get_site().name}) machine.ammo -= 1 return_to_previous.emit() diff --git a/scripts/weapon_system/weapon_substate_machine.gd b/scripts/weapon_system/weapon_substate_machine.gd index 87dc84e..d70ef96 100644 --- a/scripts/weapon_system/weapon_substate_machine.gd +++ b/scripts/weapon_system/weapon_substate_machine.gd @@ -3,7 +3,7 @@ extends SubStateMachine class_name WeaponSubStateMachine @export var animation_prefix: StringName -@export var droppable: StringName +@export var index: StringName @export var visibility_target: StringName @export var max_ammo: int diff --git a/scripts/weapon_system/weapon_system.gd b/scripts/weapon_system/weapon_system.gd index 7dcaeb6..2ecb45c 100644 --- a/scripts/weapon_system/weapon_system.gd +++ b/scripts/weapon_system/weapon_system.gd @@ -103,7 +103,8 @@ func drop(weapon: WeaponSubStateMachine) -> void: if slots.find_key(weapon) == "knife": return var drop_data: Dictionary = {} - drop_data.scene = weapon.droppable + drop_data.type = "weapon" + drop_data.spawn_name = weapon.index drop_data.ammo = weapon.ammo drop_data.remaining_ammo = weapon.remaining_ammo drop_data.slot = weapon.slot diff --git a/scenes/weapons/active_bomb.tscn b/spawnables/active_bomb.tscn similarity index 100% rename from scenes/weapons/active_bomb.tscn rename to spawnables/active_bomb.tscn diff --git a/weapons/bomb.tres b/weapons/bomb.tres new file mode 100644 index 0000000..21e0293 --- /dev/null +++ b/weapons/bomb.tres @@ -0,0 +1,14 @@ +[gd_resource type="Resource" script_class="WeaponResource" load_steps=5 format=3 uid="uid://b1obqb8w0o3ma"] + +[ext_resource type="PackedScene" uid="uid://cxdgk74ln5xpn" path="res://scenes/weapons/droppable_bomb.tscn" id="1_sbnmj"] +[ext_resource type="Script" uid="uid://bvnn2eiwqbu7t" path="res://scripts/resources/weapon_resource.gd" id="1_w2ux2"] +[ext_resource type="Texture2D" uid="uid://dnxw4x3cmu7io" path="res://icon.svg" id="2_vkfbs"] +[ext_resource type="PackedScene" uid="uid://bxdatd1ilfgmc" path="res://scenes/weapons/bomb.tscn" id="4_shxvo"] + +[resource] +script = ExtResource("1_w2ux2") +preview = ExtResource("2_vkfbs") +dropped_scene = ExtResource("1_sbnmj") +weapon_system_scene = ExtResource("4_shxvo") +slot = &"bomb" +metadata/_custom_type_script = "uid://bvnn2eiwqbu7t" diff --git a/weapons/sp.tres b/weapons/sp.tres new file mode 100644 index 0000000..b44c072 --- /dev/null +++ b/weapons/sp.tres @@ -0,0 +1,15 @@ +[gd_resource type="Resource" script_class="WeaponResource" load_steps=5 format=3 uid="uid://2jxguk5jxlim"] + +[ext_resource type="PackedScene" uid="uid://dgfqppi21c2u0" path="res://scenes/weapons/droppable_sp.tscn" id="1_vpohq"] +[ext_resource type="Texture2D" uid="uid://dnxw4x3cmu7io" path="res://icon.svg" id="2_c0lu7"] +[ext_resource type="Script" uid="uid://bvnn2eiwqbu7t" path="res://scripts/resources/weapon_resource.gd" id="3_eyl1o"] +[ext_resource type="PackedScene" uid="uid://djwjl8xll53vn" path="res://scenes/weapons/starting_pistol.tscn" id="4_vpohq"] + +[resource] +script = ExtResource("3_eyl1o") +cost = 200 +preview = ExtResource("2_c0lu7") +dropped_scene = ExtResource("1_vpohq") +weapon_system_scene = ExtResource("4_vpohq") +slot = &"secondary" +metadata/_custom_type_script = "uid://bvnn2eiwqbu7t"