From 100afe5e51e9b0f0188bd7a2dd130c4b7a199121 Mon Sep 17 00:00:00 2001 From: Rendo Date: Fri, 28 Nov 2025 18:03:30 +0500 Subject: [PATCH] FINISHED DAMN DROP SYSTEM --- levels/prototype_scene.tscn | 6 +-- models/weapons/starting_pistol.glb | Bin 103268 -> 113128 bytes scenes/molikman.tscn | 9 ++++- scenes/weapons/bomb.tscn | 6 +-- scenes/weapons/droppable_sp.tscn | 35 ++++++++++++++++++ scenes/weapons/starting_pistol.tscn | 5 +-- .../multiplayer/dynamic_objects_spawner.gd | 5 --- .../dynamic_objects_spawner.gd.uid | 1 - scripts/multiplayer/session.gd | 27 +++++++++++++- .../spawn_system/dyn_objects_spawner.gd | 17 +++++++++ .../spawn_system/dyn_objects_spawner.gd.uid | 1 + scripts/player/player_pickup.gd | 14 ++++++- scripts/weapon_system/dropped_weapon.gd | 8 ++++ scripts/weapon_system/gun/idle_state.gd | 5 ++- scripts/weapon_system/gun/reload_state.gd | 7 +++- .../weapon_system/weapon_substate_machine.gd | 4 +- scripts/weapon_system/weapon_system.gd | 26 ++++++++++++- 17 files changed, 151 insertions(+), 25 deletions(-) create mode 100644 scenes/weapons/droppable_sp.tscn delete mode 100644 scripts/multiplayer/dynamic_objects_spawner.gd delete mode 100644 scripts/multiplayer/dynamic_objects_spawner.gd.uid create mode 100644 scripts/multiplayer/spawn_system/dyn_objects_spawner.gd create mode 100644 scripts/multiplayer/spawn_system/dyn_objects_spawner.gd.uid diff --git a/levels/prototype_scene.tscn b/levels/prototype_scene.tscn index c31cf6f..0b2bb08 100644 --- a/levels/prototype_scene.tscn +++ b/levels/prototype_scene.tscn @@ -4,9 +4,9 @@ [ext_resource type="Script" uid="uid://ypgm3aplt78m" path="res://scripts/multiplayer/team_spawner.gd" id="4_pi0y7"] [ext_resource type="Material" uid="uid://bx3f5vx71ynh5" path="res://materials/OrangeMat.tres" id="4_y6i55"] [ext_resource type="Material" uid="uid://mlha6r17v2en" path="res://materials/Bluemat.tres" id="5_bno23"] -[ext_resource type="Script" uid="uid://be7l33prlm8gh" path="res://scripts/multiplayer/dynamic_objects_spawner.gd" id="5_y6i55"] [ext_resource type="Script" uid="uid://dncldab5y4yod" path="res://scripts/item_spawner.gd" id="6_61ure"] [ext_resource type="PackedScene" uid="uid://cxdgk74ln5xpn" path="res://scenes/weapons/droppable_bomb.tscn" id="6_bno23"] +[ext_resource type="Script" uid="uid://bqjv6l7hh0lix" path="res://scripts/multiplayer/spawn_system/dyn_objects_spawner.gd" id="6_oujx2"] [sub_resource type="Animation" id="Animation_y6i55"] length = 0.001 @@ -132,11 +132,11 @@ _spawnable_scenes = PackedStringArray("uid://dpsr6ug3pkb40", "uid://ckjabjcvgki6 spawn_path = NodePath("..") [node name="DynamicObjectsContainer" type="Node3D" parent="."] -script = ExtResource("5_y6i55") [node name="MultiplayerSpawner" type="MultiplayerSpawner" parent="DynamicObjectsContainer"] -_spawnable_scenes = PackedStringArray("uid://dtbpyfdawb02b", "uid://cxdgk74ln5xpn") +_spawnable_scenes = PackedStringArray("uid://dtbpyfdawb02b", "uid://cxdgk74ln5xpn", "uid://dgfqppi21c2u0") spawn_path = NodePath("..") +script = ExtResource("6_oujx2") [node name="Bomb" type="Node3D" parent="DynamicObjectsContainer"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -28.858309, 4.6431036, 12.873563) diff --git a/models/weapons/starting_pistol.glb b/models/weapons/starting_pistol.glb index 32b8a05c103d9f3e95e46672d44e90c34fae7599..43ed5dad7bbe527a2ab9e98698f46f902e09621b 100644 GIT binary patch delta 26019 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 YOlQvUlg_SHvv9rIN(1ifC!IO|KZ>yT(EtDd delta 15825 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 O;|H44IHD??#`$0Jzo5nd diff --git a/scenes/molikman.tscn b/scenes/molikman.tscn index fa9d09b..be17a36 100644 --- a/scenes/molikman.tscn +++ b/scenes/molikman.tscn @@ -256,9 +256,10 @@ script = ExtResource("12_fulsm") player = NodePath("../..") SPEED = 5.0 -[node name="WeaponSystem" type="Node" parent="." node_paths=PackedStringArray("default_pistol", "animation_player", "camera", "player")] +[node name="WeaponSystem" type="Node" parent="." node_paths=PackedStringArray("default_pistol", "default_knife", "animation_player", "camera", "player")] script = ExtResource("4_qlg0r") default_pistol = NodePath("StartingPistol") +default_knife = NodePath("KnifePlaceholder") animation_player = NodePath("../Camera3D/molikman_hands/AnimationPlayer") camera = NodePath("../Camera3D") player = NodePath("..") @@ -268,6 +269,11 @@ player = NodePath("..") [node name="Shoot" parent="WeaponSystem/StartingPistol" index="1" node_paths=PackedStringArray("raycast")] raycast = NodePath("../../../Camera3D/RayCast3D") +[node name="KnifePlaceholder" parent="WeaponSystem" instance=ExtResource("7_fjrip")] + +[node name="Shoot" parent="WeaponSystem/KnifePlaceholder" index="1" node_paths=PackedStringArray("raycast")] +raycast = NodePath("../../../Camera3D/RayCast3D") + [node name="WeaponSpawner" type="MultiplayerSpawner" parent="WeaponSystem"] spawn_path = NodePath("..") @@ -298,3 +304,4 @@ shape = SubResource("CapsuleShape3D_3xmak") [editable path="Camera3D/molikman_hands"] [editable path="WeaponSystem/StartingPistol"] +[editable path="WeaponSystem/KnifePlaceholder"] diff --git a/scenes/weapons/bomb.tscn b/scenes/weapons/bomb.tscn index f828c8f..861089f 100644 --- a/scenes/weapons/bomb.tscn +++ b/scenes/weapons/bomb.tscn @@ -1,16 +1,16 @@ -[gd_scene load_steps=4 format=3 uid="uid://bxdatd1ilfgmc"] +[gd_scene load_steps=3 format=3 uid="uid://bxdatd1ilfgmc"] [ext_resource type="Script" uid="uid://e6lqknfl4ngt" path="res://scripts/weapon_system/weapon_substate_machine.gd" id="1_krsgt"] -[ext_resource type="PackedScene" uid="uid://dftij0fdq3lbr" path="res://models/weapons/Bomb.glb" id="2_1x0so"] [ext_resource type="Script" uid="uid://rx78vdadldm7" path="res://scripts/weapon_system/bomb/bomb_state.gd" id="2_870cc"] [node name="Bomb" type="Node" node_paths=PackedStringArray("enter_state")] script = ExtResource("1_krsgt") animation_prefix = &"baked_bomb_" -model = ExtResource("2_1x0so") +droppable = &"uid://cxdgk74ln5xpn" visibility_target = &"bomb" max_ammo = 1 can_be_previous = false +destroy_when_empty = true enter_state = NodePath("Main") metadata/_custom_type_script = "uid://e6lqknfl4ngt" diff --git a/scenes/weapons/droppable_sp.tscn b/scenes/weapons/droppable_sp.tscn new file mode 100644 index 0000000..1261136 --- /dev/null +++ b/scenes/weapons/droppable_sp.tscn @@ -0,0 +1,35 @@ +[gd_scene load_steps=6 format=3 uid="uid://dgfqppi21c2u0"] + +[ext_resource type="Script" uid="uid://cskgqgkr7pmb0" path="res://scripts/weapon_system/dropped_weapon.gd" id="1_jym52"] +[ext_resource type="PackedScene" uid="uid://djwjl8xll53vn" path="res://scenes/weapons/starting_pistol.tscn" id="2_jym52"] +[ext_resource type="PackedScene" uid="uid://d3sjs6efbshpk" path="res://models/weapons/starting_pistol.glb" id="3_jym52"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_hsebh"] +size = Vector3(0.07324219, 0.25274658, 0.46972656) + +[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_ddvbd"] +properties/0/path = NodePath(".:position") +properties/0/spawn = true +properties/0/replication_mode = 1 +properties/1/path = NodePath(".:rotation") +properties/1/spawn = true +properties/1/replication_mode = 1 + +[node name="DroppableStartingPistol" type="RigidBody3D" node_paths=PackedStringArray("weapon")] +collision_layer = 8 +collision_mask = 9 +script = ExtResource("1_jym52") +slot = &"secondary" +weapon = NodePath("StartingPistol") +team = 3 + +[node name="StartingPistol" parent="." instance=ExtResource("2_jym52")] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -3.0517578e-05, 0.0010986328) +shape = SubResource("BoxShape3D_hsebh") + +[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="."] +replication_config = SubResource("SceneReplicationConfig_ddvbd") + +[node name="starting_pistol" parent="." instance=ExtResource("3_jym52")] diff --git a/scenes/weapons/starting_pistol.tscn b/scenes/weapons/starting_pistol.tscn index 2b61eef..b0075ea 100644 --- a/scenes/weapons/starting_pistol.tscn +++ b/scenes/weapons/starting_pistol.tscn @@ -1,7 +1,6 @@ -[gd_scene load_steps=9 format=3 uid="uid://djwjl8xll53vn"] +[gd_scene load_steps=8 format=3 uid="uid://djwjl8xll53vn"] [ext_resource type="Script" uid="uid://e6lqknfl4ngt" path="res://scripts/weapon_system/weapon_substate_machine.gd" id="1_g7s1i"] -[ext_resource type="PackedScene" uid="uid://d3sjs6efbshpk" path="res://models/weapons/starting_pistol.glb" id="2_016ti"] [ext_resource type="Script" uid="uid://ofv4e3dsfe8" path="res://scripts/weapon_system/gun/idle_state.gd" id="2_cmn6f"] [ext_resource type="Script" uid="uid://vj13r83l3xyq" path="res://scripts/weapon_system/gun/semi_auto_shoot_state.gd" id="3_016ti"] [ext_resource type="Script" uid="uid://hmekwp8444ao" path="res://scripts/weapon_system/gun/reload_state.gd" id="4_hoqxt"] @@ -22,7 +21,7 @@ point_count = 5 [node name="StartingPistol" type="Node" node_paths=PackedStringArray("enter_state")] script = ExtResource("1_g7s1i") animation_prefix = &"baked_sp_" -model = ExtResource("2_016ti") +droppable = &"uid://dgfqppi21c2u0" visibility_target = &"sp" max_ammo = 20 enter_state = NodePath("Intro") diff --git a/scripts/multiplayer/dynamic_objects_spawner.gd b/scripts/multiplayer/dynamic_objects_spawner.gd deleted file mode 100644 index d5593dc..0000000 --- a/scripts/multiplayer/dynamic_objects_spawner.gd +++ /dev/null @@ -1,5 +0,0 @@ -extends Node3D - - -func _ready() -> void: - Session.dynamic_objects_container = self diff --git a/scripts/multiplayer/dynamic_objects_spawner.gd.uid b/scripts/multiplayer/dynamic_objects_spawner.gd.uid deleted file mode 100644 index 0dbc95a..0000000 --- a/scripts/multiplayer/dynamic_objects_spawner.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://be7l33prlm8gh diff --git a/scripts/multiplayer/session.gd b/scripts/multiplayer/session.gd index 980e592..e0f9e1e 100644 --- a/scripts/multiplayer/session.gd +++ b/scripts/multiplayer/session.gd @@ -7,4 +7,29 @@ enum TEAMS { UNASSIGNED } -var dynamic_objects_container: Node3D +var dynamic_objects_spawner: MultiplayerSpawner + +func spawn(data: Dictionary) -> void: + spawn_internal.rpc_id(1,data) + +@rpc("any_peer","call_local","reliable") +func spawn_internal(data: Dictionary) -> void: + if multiplayer.is_server() == false: + printerr(str(multiplayer.get_remote_sender_id())+" tried to spawn internally on "+str(multiplayer.get_unique_id())) + return + + var object = dynamic_objects_spawner.spawn(data) + + if data.has("position"): + object.global_position = data.position + +func despawn(path: NodePath): + despawn_internal.rpc_id(1,path) + +@rpc("any_peer","call_local","reliable") +func despawn_internal(path: NodePath) -> void: + if multiplayer.is_server() == false: + printerr(str(multiplayer.get_remote_sender_id())+" tried to despawn internally on "+str(multiplayer.get_unique_id())) + return + + get_node(path).queue_free() diff --git a/scripts/multiplayer/spawn_system/dyn_objects_spawner.gd b/scripts/multiplayer/spawn_system/dyn_objects_spawner.gd new file mode 100644 index 0000000..1cd660c --- /dev/null +++ b/scripts/multiplayer/spawn_system/dyn_objects_spawner.gd @@ -0,0 +1,17 @@ +extends MultiplayerSpawner + +func _ready() -> void: + spawn_function = request_spawn + Session.dynamic_objects_spawner = self + +func request_spawn(data: Variant) -> Node: + if data.has_all(["scene","impulse"]): + var projectile: RigidBody3D = load(data.scene).instantiate() + if data.has_all(["ammo","remaining_ammo","slot"]): + projectile.weapon.ammo = data.ammo + projectile.weapon.remaining_ammo = data.remaining_ammo + projectile.slot = data.slot + + projectile.apply_impulse(data.impulse) + return projectile + return Node.new() diff --git a/scripts/multiplayer/spawn_system/dyn_objects_spawner.gd.uid b/scripts/multiplayer/spawn_system/dyn_objects_spawner.gd.uid new file mode 100644 index 0000000..515c347 --- /dev/null +++ b/scripts/multiplayer/spawn_system/dyn_objects_spawner.gd.uid @@ -0,0 +1 @@ +uid://bqjv6l7hh0lix diff --git a/scripts/player/player_pickup.gd b/scripts/player/player_pickup.gd index 9655848..53b167a 100644 --- a/scripts/player/player_pickup.gd +++ b/scripts/player/player_pickup.gd @@ -19,4 +19,16 @@ func on_body_entered(body: Node3D): "slot": body.slot }) weapon_system.on_weapon_added(weapon) - body.queue_free() + + Session.despawn(body.get_path()) + +func start_temp_ignore(): + if is_multiplayer_authority() == false: + return + monitoring = false + get_tree().create_timer(0.5).timeout.connect(stop_temp_ignore) + +func stop_temp_ignore(): + if is_multiplayer_authority() == false: + return + monitoring = true diff --git a/scripts/weapon_system/dropped_weapon.gd b/scripts/weapon_system/dropped_weapon.gd index 5be6418..c7790e6 100644 --- a/scripts/weapon_system/dropped_weapon.gd +++ b/scripts/weapon_system/dropped_weapon.gd @@ -2,6 +2,14 @@ extends RigidBody3D class_name DroppableWeapon +const IMPULSE = 10 + @export var slot: StringName @export var weapon: WeaponSubStateMachine @export var team: Session.TEAMS + +@rpc("any_peer","call_local","reliable") +func drop(direction: Vector3,new_position: Vector3): + apply_impulse(direction * IMPULSE) + global_position = new_position + diff --git a/scripts/weapon_system/gun/idle_state.gd b/scripts/weapon_system/gun/idle_state.gd index f790d0b..edb111c 100644 --- a/scripts/weapon_system/gun/idle_state.gd +++ b/scripts/weapon_system/gun/idle_state.gd @@ -15,11 +15,12 @@ func state_input(event: InputEvent) -> void: init_reload.rpc() func use_begin() -> void: - transition.emit("Shoot") + if machine.ammo > 0: + transition.emit("Shoot") @rpc("authority","call_local","reliable") func init_reload(): - if machine.ammo == machine.max_ammo: + if machine.ammo == machine.max_ammo or machine.remaining_ammo <= 0: return transition.emit("Reload") diff --git a/scripts/weapon_system/gun/reload_state.gd b/scripts/weapon_system/gun/reload_state.gd index 6abafee..325846a 100644 --- a/scripts/weapon_system/gun/reload_state.gd +++ b/scripts/weapon_system/gun/reload_state.gd @@ -11,7 +11,12 @@ func exit() -> void: func on_animation_finished(animation): if animation == with_morphems("reload"): - machine.ammo = machine.max_ammo + if machine.remaining_ammo > machine.max_ammo: + machine.ammo = machine.max_ammo + machine.remaining_ammo -= machine.max_ammo + else: + machine.ammo = machine.remaining_ammo + machine.remaining_ammo = 0 transition.emit("Idle") func with_morphems(animation): diff --git a/scripts/weapon_system/weapon_substate_machine.gd b/scripts/weapon_system/weapon_substate_machine.gd index b1cb38a..545c84e 100644 --- a/scripts/weapon_system/weapon_substate_machine.gd +++ b/scripts/weapon_system/weapon_substate_machine.gd @@ -3,8 +3,7 @@ extends SubStateMachine class_name WeaponSubStateMachine @export var animation_prefix: StringName -@export var droppable: PackedScene -@export var self_scene: PackedScene +@export var droppable: StringName @export var visibility_target: StringName @export var max_ammo: int @@ -12,6 +11,7 @@ class_name WeaponSubStateMachine @onready var remaining_ammo: int = max_ammo * 3 @export var can_be_previous: bool = true +@export var destroy_when_empty: bool = false var slot: StringName diff --git a/scripts/weapon_system/weapon_system.gd b/scripts/weapon_system/weapon_system.gd index 52d4078..1e64d02 100644 --- a/scripts/weapon_system/weapon_system.gd +++ b/scripts/weapon_system/weapon_system.gd @@ -28,6 +28,7 @@ signal switched_to(state: WeaponSubStateMachine) func _ready() -> void: current_state = default_pistol add(default_pistol,"secondary") + add(default_knife,"knife") current_state.enter() $WeaponSpawner.spawn_function = pick_up_weapon $WeaponSpawner.spawned.connect(on_weapon_added) @@ -55,7 +56,7 @@ func add(state: WeaponSubStateMachine, slot: StringName) -> void: 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: + if slots.has(to) == false or slots[to] == null or slots[to] == current_state or is_multiplayer_authority() == false: return current_state.exit() if current_state.can_be_previous: @@ -69,7 +70,23 @@ func switch(to: StringName): update_remotes.rpc(to) -func drop(): pass +func drop(): + if slots.find_key(current_state) == "knife": + return + var drop_data: Dictionary = {} + drop_data.scene = current_state.droppable + drop_data.ammo = current_state.ammo + drop_data.remaining_ammo = current_state.remaining_ammo + drop_data.slot = current_state.slot + drop_data.position = camera.global_position + drop_data.impulse = -camera.global_basis.z * 10 + + Session.spawn(drop_data) + + $"../PickupRange".start_temp_ignore() + + Session.despawn(current_state.get_path()) + return_to_previous() # Spawn function # Data should be a dictionary with these keys: @@ -91,6 +108,8 @@ func on_weapon_added(weapon: Node): func return_to_previous(): if last_slot != "": switch(last_slot) + else: + switch("knife") @rpc("authority","call_remote","reliable") func update_remotes(to: StringName): @@ -143,4 +162,7 @@ func _input(event: InputEvent) -> void: current_state.alternate_state() if event.is_action_pressed("plr_firemode"): current_state.switch_mode() + + if event.is_action_pressed("plr_drop"): + drop()