From 1d5065cbbf44910244470f4b693a3d5a0bf85188 Mon Sep 17 00:00:00 2001 From: Rendo Date: Thu, 11 Dec 2025 20:54:24 +0500 Subject: [PATCH] Different damage based on body part --- TODO_LIST | 1 - multiplayer/session.gd | 18 +++- players/molikman.tscn | 137 ++++++++++----------------- players/player/states/standing.gd | 9 +- weapons/gun/semi_auto_shoot_state.gd | 7 +- weapons/gun/sp/starting_pistol.tscn | 11 ++- weapons/knife/knife_attack.gd | 2 +- weapons/knife/knife_attack_heavy.gd | 2 +- 8 files changed, 86 insertions(+), 101 deletions(-) diff --git a/TODO_LIST b/TODO_LIST index d9b62d8..1761fb5 100644 --- a/TODO_LIST +++ b/TODO_LIST @@ -1,7 +1,6 @@ ^ - completed Current plans: - Different damage based on body part Audio system: Positional sound Distance and wall dampening diff --git a/multiplayer/session.gd b/multiplayer/session.gd index 8aa096d..5ab4149 100644 --- a/multiplayer/session.gd +++ b/multiplayer/session.gd @@ -306,7 +306,7 @@ func add_dead(team: int): func is_server_request() -> bool: return multiplayer.is_server() or multiplayer.get_remote_sender_id() == 1 -func shoot(id:int , damage: int, distance: float) -> void: +func shoot(id:int , limb_damage: int, torso_damage: int,head_damage: int, distance: float,damage_reduction_curve: Curve = null) -> void: if multiplayer.is_server() == false: return @@ -328,8 +328,22 @@ func shoot(id:int , damage: int, distance: float) -> void: var collision = space.intersect_ray(ray) + if collision != {} and collision["collider"] is Player: - collision["collider"].take_damage(damage) + var hit_player: Player = collision["collider"] + var shape_object: CollisionShape3D = hit_player.shape_owner_get_owner(collision["shape"]) + var reduction: float = 0 + if damage_reduction_curve != null: + var distance_to_hit = (player_camera.global_position - collision["position"]).length()/distance + reduction = damage_reduction_curve.sample(distance_to_hit) + match shape_object.get_groups()[0]: + "Head": + hit_player.take_damage(head_damage*reduction) + "Limb": + hit_player.take_damage(limb_damage*reduction) + _: + hit_player.take_damage(torso_damage*reduction) + func interact(id: int) -> void: diff --git a/players/molikman.tscn b/players/molikman.tscn index 1e2b625..8251121 100644 --- a/players/molikman.tscn +++ b/players/molikman.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=83 format=4 uid="uid://dpsr6ug3pkb40"] +[gd_scene load_steps=86 format=4 uid="uid://dpsr6ug3pkb40"] [ext_resource type="Script" uid="uid://3dphlay25fih" path="res://players/player/player.gd" id="1_l07l8"] [ext_resource type="Material" uid="uid://cjb0h3of85nc2" path="res://materials/players/molikman/mat_Molikman.tres" id="2_330gv"] @@ -38,6 +38,21 @@ [ext_resource type="Script" uid="uid://dsp1sq46c5i3y" path="res://players/player/player_interaction.gd" id="37_3lpnn"] [ext_resource type="Script" uid="uid://dfvnx8f1v6m5g" path="res://players/player/player_input.gd" id="38_2cl6u"] +[sub_resource type="SphereShape3D" id="SphereShape3D_tgg0h"] +radius = 0.15783496 + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_l07l8"] +radius = 0.2163086 +height = 1.5151367 + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_330gv"] +radius = 0.083984375 +height = 0.73394775 + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_og1ui"] +radius = 0.08154297 +height = 0.7824707 + [sub_resource type="ArrayMesh" id="ArrayMesh_lot4n"] _surfaces = [{ "aabb": AABB(-1.6094911, -1.1382344, -1.5418212, 3.2189822, 2.1382344, 2.9440465), @@ -325,9 +340,6 @@ _surfaces = [{ }] blend_shape_mode = 0 -[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_u8vuu"] -resource_local_to_scene = true - [sub_resource type="ArrayMesh" id="ArrayMesh_xd1kh"] resource_name = "molikman_hands_Plane_004" _surfaces = [{ @@ -7444,124 +7456,64 @@ length = 0.001 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("CollisionShape3D:position") +tracks/0/path = NodePath("Camera3D:position") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), "update": 0, -"values": [Vector3(0, 1, 0)] +"values": [Vector3(0, 2, 0)] } tracks/1/type = "value" tracks/1/imported = false tracks/1/enabled = true -tracks/1/path = NodePath("CollisionShape3D:shape:height") +tracks/1/path = NodePath("molikman_ingame:position") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), "update": 0, -"values": [2.0] +"values": [Vector3(0, 1.1793717, 0)] } tracks/2/type = "value" tracks/2/imported = false tracks/2/enabled = true -tracks/2/path = NodePath("Camera3D:position") +tracks/2/path = NodePath("molikman_ingame:rotation") tracks/2/interp = 1 tracks/2/loop_wrap = true tracks/2/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), "update": 0, -"values": [Vector3(0, 2, 0)] -} -tracks/3/type = "value" -tracks/3/imported = false -tracks/3/enabled = true -tracks/3/path = NodePath("molikman_ingame:position") -tracks/3/interp = 1 -tracks/3/loop_wrap = true -tracks/3/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Vector3(0, 1.1793717, 0)] -} -tracks/4/type = "value" -tracks/4/imported = false -tracks/4/enabled = true -tracks/4/path = NodePath("molikman_ingame:rotation") -tracks/4/interp = 1 -tracks/4/loop_wrap = true -tracks/4/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, "values": [Vector3(0, 0, 0)] } -tracks/5/type = "value" -tracks/5/imported = false -tracks/5/enabled = true -tracks/5/path = NodePath("CollisionShape3D:disabled") -tracks/5/interp = 1 -tracks/5/loop_wrap = true -tracks/5/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [false] -} [sub_resource type="Animation" id="Animation_oprun"] resource_name = "crouch" tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("CollisionShape3D:position") +tracks/0/path = NodePath("Camera3D:position") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { "times": PackedFloat32Array(0, 1), "transitions": PackedFloat32Array(1, 1), "update": 0, -"values": [Vector3(0, 1.166, 0), Vector3(0, 0.874, 0)] +"values": [Vector3(0, 2, 0), Vector3(0, 1.5, 0)] } tracks/1/type = "value" tracks/1/imported = false tracks/1/enabled = true -tracks/1/path = NodePath("CollisionShape3D:shape:height") +tracks/1/path = NodePath("molikman_ingame:position") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { "times": PackedFloat32Array(0, 1), "transitions": PackedFloat32Array(1, 1), "update": 0, -"values": [2.331, 1.7479999999999998] -} -tracks/2/type = "value" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath("Camera3D:position") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/keys = { -"times": PackedFloat32Array(0, 1), -"transitions": PackedFloat32Array(1, 1), -"update": 0, -"values": [Vector3(0, 2, 0), Vector3(0, 1.5, 0)] -} -tracks/3/type = "value" -tracks/3/imported = false -tracks/3/enabled = true -tracks/3/path = NodePath("molikman_ingame:position") -tracks/3/interp = 1 -tracks/3/loop_wrap = true -tracks/3/keys = { -"times": PackedFloat32Array(0, 1), -"transitions": PackedFloat32Array(1, 1), -"update": 0, "values": [Vector3(0, 1.1793717, 0), Vector3(0, 0.6695229, 0)] } @@ -7592,18 +7544,6 @@ tracks/1/keys = { "update": 0, "values": [Vector3(0, 1.1793717, 0), Vector3(0, 0.019058675, 1.1753564)] } -tracks/2/type = "value" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath("CollisionShape3D:disabled") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [true] -} [sub_resource type="AnimationLibrary" id="AnimationLibrary_a8ls1"] _data = { @@ -7634,6 +7574,30 @@ weapon_models = { &"sp": NodePath("Camera3D/molikman_hands/GunArm") } +[node name="HeadShape" type="CollisionShape3D" parent="." groups=["Head"]] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.0182142, 0) +shape = SubResource("SphereShape3D_tgg0h") + +[node name="TorsoShape" type="CollisionShape3D" parent="." groups=["Torso"]] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.1868755, 0) +shape = SubResource("CapsuleShape3D_l07l8") + +[node name="LegShape1" type="CollisionShape3D" parent="." groups=["Limb"]] +transform = Transform3D(0.9984104, 0.056361705, 0, -0.056361705, 0.9984104, 0, 0, 0, 1, -0.15081304, 0.36279398, -0.039083213) +shape = SubResource("CapsuleShape3D_330gv") + +[node name="LegShape2" type="CollisionShape3D" parent="." groups=["Limb"]] +transform = Transform3D(0.99874574, -0.050070006, 0, 0.050070006, 0.99874574, 0, 0, 0, 1, 0.15715861, 0.35183817, -0.046561778) +shape = SubResource("CapsuleShape3D_330gv") + +[node name="HandShape1" type="CollisionShape3D" parent="." groups=["Limb"]] +transform = Transform3D(0.9803125, 0.19745202, 0, -0.19745202, 0.9803125, 0, 0, 0, 1, -0.27572715, 1.5459963, 0) +shape = SubResource("CapsuleShape3D_og1ui") + +[node name="HandShape2" type="CollisionShape3D" parent="." groups=["Limb"]] +transform = Transform3D(0.9477017, -0.31915784, 0, 0.31915784, 0.9477017, 0, 0, 0, 1, 0.27863508, 1.5459963, 0) +shape = SubResource("CapsuleShape3D_og1ui") + [node name="molikman_ingame" type="Node3D" parent="."] transform = Transform3D(0.75, 0, 0, 0, 0.74999994, 0, 0, 0, 0.74999994, 0, 1.1793717, 0) @@ -8112,10 +8076,6 @@ visible_for_others = true reference_player = NodePath("../..") metadata/_custom_type_script = "uid://dd5mp72dq43v6" -[node name="CollisionShape3D" type="CollisionShape3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) -shape = SubResource("CapsuleShape3D_u8vuu") - [node name="Camera3D" type="Camera3D" parent="."] transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 0, 2, 0) cull_mask = 1048573 @@ -8819,6 +8779,7 @@ layer = true inverse = true [node name="PickupRange" type="Area3D" parent="." node_paths=PackedStringArray("weapon_system")] +visible = false collision_layer = 0 collision_mask = 8 script = ExtResource("34_anida") diff --git a/players/player/states/standing.gd b/players/player/states/standing.gd index 8e2fb2b..fd8e83d 100644 --- a/players/player/states/standing.gd +++ b/players/player/states/standing.gd @@ -20,10 +20,11 @@ func _enter() -> void: player_input.walk_begin.connect(begin_walk) func _exit() -> void: - player_input.jumped.disconnect(on_jumped) - player_input.crouch_begin.disconnect(begin_crouch) - player_input.walk_begin.disconnect(begin_walk) - step_time = 0 + if Session.is_server_request(): + player_input.jumped.disconnect(on_jumped) + player_input.crouch_begin.disconnect(begin_crouch) + player_input.walk_begin.disconnect(begin_walk) + step_time = 0 func physics_update(delta: float) -> void: if not is_multiplayer_authority(): diff --git a/weapons/gun/semi_auto_shoot_state.gd b/weapons/gun/semi_auto_shoot_state.gd index 0ad62af..4a9ccf9 100644 --- a/weapons/gun/semi_auto_shoot_state.gd +++ b/weapons/gun/semi_auto_shoot_state.gd @@ -2,9 +2,12 @@ extends WeaponState @export var vertical_curve: Curve @export var horizontal_curve: Curve +@export var damage_reduction_curve: Curve @export var emptyable: bool -@export var damage: int +@export var torso_damage: int +@export var head_damage: int +@export var limb_damage: int @export var shoot_distance: float = 100 @export var fire_timer: Timer @@ -38,7 +41,7 @@ func fire() -> void: machine.animation_player.play(with_morphems("shoot")) if is_multiplayer_authority(): - Session.shoot(int(machine.player.name),damage,shoot_distance) + Session.shoot(int(machine.player.name),limb_damage,torso_damage,head_damage,shoot_distance,damage_reduction_curve) machine.player.get_node("ShootAudio").multiplayer_play() fire_timer.start() diff --git a/weapons/gun/sp/starting_pistol.tscn b/weapons/gun/sp/starting_pistol.tscn index 873835f..786be11 100644 --- a/weapons/gun/sp/starting_pistol.tscn +++ b/weapons/gun/sp/starting_pistol.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=9 format=3 uid="uid://djwjl8xll53vn"] +[gd_scene load_steps=10 format=3 uid="uid://djwjl8xll53vn"] [ext_resource type="Script" uid="uid://e6lqknfl4ngt" path="res://systems/weapon_system/weapon_substate_machine.gd" id="1_g7s1i"] [ext_resource type="Script" uid="uid://ofv4e3dsfe8" path="res://weapons/gun/idle_state.gd" id="2_cmn6f"] @@ -18,6 +18,10 @@ _limits = [-0.02, 0.02, 0.0, 20.0] _data = [Vector2(0, -9.313226e-10), 0.0, 0.0, 0, 0, Vector2(4.959569, 0.0044327714), 0.0, 0.0, 0, 0, Vector2(9.919138, -0.0075840354), 0.0, 0.0, 0, 0, Vector2(15.09434, 0.011533612), 0.0, 0.0, 0, 0, Vector2(20, -0.014684878), 0.0, 0.0, 0, 0] point_count = 5 +[sub_resource type="Curve" id="Curve_bwg3m"] +_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(0.49799195, 1), 0.0, 0.0, 0, 0, Vector2(0.8473895, 0.51194537), 0.0, 0.0, 0, 0] +point_count = 3 + [sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_bwg3m"] properties/0/path = NodePath(".:ammo") properties/0/spawn = true @@ -45,8 +49,11 @@ emptyable = true script = ExtResource("3_016ti") vertical_curve = SubResource("Curve_cmn6f") horizontal_curve = SubResource("Curve_016ti") +damage_reduction_curve = SubResource("Curve_bwg3m") emptyable = true -damage = 22 +torso_damage = 22 +head_damage = 60 +limb_damage = 12 fire_timer = NodePath("../FireTimer") [node name="Reload" type="Node" parent="."] diff --git a/weapons/knife/knife_attack.gd b/weapons/knife/knife_attack.gd index 1c3df29..091c750 100644 --- a/weapons/knife/knife_attack.gd +++ b/weapons/knife/knife_attack.gd @@ -14,7 +14,7 @@ func _exit() -> void: func attack() -> void: if is_multiplayer_authority(): - Session.shoot(int(machine.player.name),damage,1.5) + Session.shoot(int(machine.player.name),damage,damage,damage,1.5) func on_animation_finished(animation): if animation == machine.animation_prefix + "attack": diff --git a/weapons/knife/knife_attack_heavy.gd b/weapons/knife/knife_attack_heavy.gd index 94def1b..f9d84b2 100644 --- a/weapons/knife/knife_attack_heavy.gd +++ b/weapons/knife/knife_attack_heavy.gd @@ -12,7 +12,7 @@ func _exit() -> void: func attack() -> void: if is_multiplayer_authority(): - Session.shoot(int(machine.player.name),damage,1.5) + Session.shoot(int(machine.player.name),damage,damage,damage,1.5) func on_animation_finished(animation): if animation == machine.animation_prefix + "heavy_attack":