Different damage based on body part

This commit is contained in:
Rendo 2025-12-11 20:54:24 +05:00
commit 1d5065cbbf
8 changed files with 86 additions and 101 deletions

View file

@ -1,7 +1,6 @@
^ - completed
Current plans:
Different damage based on body part
Audio system:
Positional sound
Distance and wall dampening

View file

@ -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:

View file

@ -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")

View file

@ -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():

View file

@ -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()

View file

@ -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="."]

View file

@ -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":

View file

@ -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":