WIP: Damage/frag system is implemented without ragdolls

This commit is contained in:
Nikolai Rodionov 2025-02-03 23:03:36 +01:00
parent dbc6a79182
commit 3560bebbcc
Signed by: allanger
GPG Key ID: 09F8B434D0FDD99B
31 changed files with 5748 additions and 4972 deletions

BIN
assets/models/character/y-bot/model.blend (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/models/character/y-bot/model.blend1 (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/models/character/y-bot/model.glb (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/models/character/y-bot/model.glb.import (Stored with Git LFS) Normal file

Binary file not shown.

12
docs/characters.md Normal file
View File

@ -0,0 +1,12 @@
# Characters
## Implementation
Characater is a 3D model (currently based on Mixamo) that must implement certain methods in order to become a "Character".
Currently, each character must be able to detect collisions, pass the information about the take damage to its parent controller and dissapear when dying.
## How to add a new character?
- Import a mixamo model in the scale of 0.01 in a T-Pose and make it local (Node should be names `model`)
- Attach a character script to the main node

View File

@ -0,0 +1,39 @@
extends CharacterBody3D
const SPEED = 5.0
const JUMP_VELOCITY = 4.5
var physics_bones: Array[Node]
func _ready() -> void:
var anim: AnimationPlayer = $Base/model/AnimationPlayer
anim.play("riffle_idle")
var skel_ph: PhysicalBoneSimulator3D = $Base/model/Body/Skeleton3D/PhysicalBoneSimulator3D
physics_bones = skel_ph.get_children().filter(func(x): return x is PhysicalBone3D)
func _input(event: InputEvent) -> void:
if Input.is_action_just_pressed("jump"):
var anim: AnimationPlayer = $Base/model/AnimationPlayer
anim.stop()
var skel_ph: PhysicalBoneSimulator3D = $Base/model/Body/Skeleton3D/PhysicalBoneSimulator3D
var target_skeleton = $Base/model/Body/Skeleton3D
for b: PhysicalBone3D in physics_bones:
#var target_transforms: Vector3 = target_skeleton.global_position * target_skeleton.get_bone_global_pose(b.get_bone_id())
print(target_skeleton.to_global(target_skeleton.get_bone_global_pose(b.get_bone_id()).origin))
b.global_position = target_skeleton.to_global(target_skeleton.get_bone_global_pose(b.get_bone_id()).origin)
skel_ph.physical_bones_start_simulation()
func _physics_process(delta: float) -> void:
for b: PhysicalBone3D in physics_bones:
var target_skeleton = $Base/model/Body/Skeleton3D
#var target_transforms: Vector3 = target_skeleton.global_position * target_skeleton.get_bone_global_pose(b.get_bone_id())
print(target_skeleton.to_global(target_skeleton.get_bone_global_pose(b.get_bone_id()).origin))
b.global_position = target_skeleton.to_global(target_skeleton.get_bone_global_pose(b.get_bone_id()).origin)
# Add the gravity.
if not is_on_floor():
velocity += get_gravity() * delta
move_and_slide()

View File

@ -0,0 +1,13 @@
extends Node3D
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
$"Y-Bot/AnimationPlayer".play("T-Pose")
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass

View File

@ -0,0 +1,31 @@
extends Skeleton3D
@onready var physical_bone_sim = $PhysicalBoneSimulator3D
var physics_bones: Array[Node]
@export var target_skeleton: Skeleton3D = null
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
physics_bones = physical_bone_sim.get_children().filter(func(x): return x is PhysicalBone3D)
physical_bone_sim.physical_bones_start_simulation()
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
func die() -> void:
for b: PhysicalBone3D in physics_bones:
#var target_transforms: Vector3 = target_skeleton.global_position * target_skeleton.get_bone_global_pose(b.get_bone_id())
b.global_position = target_skeleton.to_global(target_skeleton.get_bone_global_pose(b.get_bone_id()).origin)
#var current_transforn: Transform3D = global_transform * get_bone_global_pose(b.get_bone_id())
#var position_difference: Vector3 = target_transforms.origin - current_transforn.origin
#var force: Vector3 = hookes_law(position_difference, b.linear_velocity, 200.0, 40.0)
#b.linear_velocity += force * delta
#
#var rotation_difference: Basis = target_transforms.basis * current_transforn.basis.inverse()
#var torgue = hookes_law(rotation_difference.get_euler(), b.angular_velocity, 200.0, 40.0)
#b.angular_velocity += torgue * delta
func hookes_law(dis: Vector3, cur_vel: Vector3, stif: float, damp: float):
return (stif * dis) - (damp * cur_vel)

View File

@ -0,0 +1,12 @@
extends Skeleton3D
@export var target_skeleton: Skeleton3D
var physical_bones
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass

View File

@ -0,0 +1,31 @@
[gd_scene load_steps=4 format=3 uid="uid://c3h6gm254tuoc"]
[ext_resource type="Script" path="res://scenes/_test/ragdoll/animated_skel.gd" id="2_14gej"]
[ext_resource type="PackedScene" uid="uid://dgb3r24su3er2" path="res://scenes/characters/base/base.tscn" id="2_vodd8"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_vwp6f"]
height = 1.6
[node name="TestRagdoll" type="Node3D"]
[node name="Body" type="CharacterBody3D" parent="."]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 1.33032, 1.47238, 0)
collision_layer = 2
script = ExtResource("2_14gej")
[node name="CollisionShape3D" type="CollisionShape3D" parent="Body"]
transform = Transform3D(1.06005, 0, 0, 0, 1.06005, 0, 0, 0, 1.06005, 0, 0.799564, 0)
shape = SubResource("CapsuleShape3D_vwp6f")
[node name="Base" parent="Body" instance=ExtResource("2_vodd8")]
[node name="CSGBox3D" type="CSGBox3D" parent="."]
use_collision = true
collision_layer = 17
size = Vector3(10, 0.5, 10)
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.16491, 0.986309, 0, -0.986309, 0.16491, 0, 3.4524, 0)
[node name="Camera3D" type="Camera3D" parent="."]
transform = Transform3D(0.999981, -0.00165754, 0.00588508, 0.00118019, 0.996777, 0.0802076, -0.00599906, -0.0801992, 0.996761, 1.27162, 2.37388, 2.16416)

View File

@ -0,0 +1 @@
extends GameServerController

View File

@ -0,0 +1,11 @@
extends Node3D
# 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

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=27 format=4 uid="uid://1txob6jskn5s"]
[gd_scene load_steps=28 format=4 uid="uid://1txob6jskn5s"]
[ext_resource type="Script" path="res://scenes/characters/blue/dummy.gd" id="1_cyeub"]
[ext_resource type="Script" path="res://scenes/characters/blue/hit_collision.gd" id="2_jsfjb"]
@ -321,6 +321,10 @@ radius = 1.75
[sub_resource type="SphereShape3D" id="SphereShape3D_wnhib"]
radius = 1.2
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_ycdvn"]
radius = 11.096
height = 30.138
[sub_resource type="Animation" id="Animation_6g1lc"]
resource_name = "Run Forward"
length = 0.533333
@ -941,7 +945,7 @@ bones/0/name = "mixamorig_Hips"
bones/0/parent = -1
bones/0/rest = Transform3D(1, -8.78096e-05, -2.78699e-06, 2.78699e-06, 0, 1, -8.78096e-05, -1, 0, -6.75701e-06, 4.84474e-05, -99.7919)
bones/0/enabled = true
bones/0/position = Vector3(0.491984, 0.381591, -82.5342)
bones/0/position = Vector3(0.491975, 0.381586, -82.5341)
bones/0/rotation = Quaternion(-0.656646, -0.246297, 0.163159, 0.693926)
bones/0/scale = Vector3(1, 1, 1)
bones/1/name = "mixamorig_Spine"
@ -949,35 +953,35 @@ bones/1/parent = 0
bones/1/rest = Transform3D(1, -1.22161e-05, -7.43263e-07, 1.22161e-05, 0.992624, 0.121236, -7.43257e-07, -0.121236, 0.992624, 0.000859786, 9.92346, -1.22733)
bones/1/enabled = true
bones/1/position = Vector3(0.000859786, 9.92346, -1.22733)
bones/1/rotation = Quaternion(0.034224, -0.0149729, 0.00749797, 0.999274)
bones/1/rotation = Quaternion(0.0341866, -0.0149626, 0.00750204, 0.999275)
bones/1/scale = Vector3(1, 1, 1)
bones/2/name = "mixamorig_Spine1"
bones/2/parent = 1
bones/2/rest = Transform3D(1, 1.86323e-05, -7.30208e-09, -1.86323e-05, 1, -0.000392269, -6.79989e-12, 0.000392269, 1, -1.13096e-09, 11.732, 1.20875e-06)
bones/2/enabled = true
bones/2/position = Vector3(-1.13096e-09, 11.732, 1.20875e-06)
bones/2/rotation = Quaternion(0.12507, -0.0184348, 0.0542054, 0.990495)
bones/2/rotation = Quaternion(0.125114, -0.0184178, 0.0542074, 0.990489)
bones/2/scale = Vector3(1, 1, 1)
bones/3/name = "mixamorig_Spine2"
bones/3/parent = 2
bones/3/rest = Transform3D(1, -6.30587e-06, 4.7635e-06, 6.81277e-06, 0.993339, -0.115231, -4.00514e-06, 0.115231, 0.993339, -4.47471e-10, 13.4588, 9.85582e-07)
bones/3/enabled = true
bones/3/position = Vector3(-4.47471e-10, 13.4588, 9.85582e-07)
bones/3/rotation = Quaternion(0.182886, -0.00347211, 0.0505617, 0.981827)
bones/3/rotation = Quaternion(0.182929, -0.00345339, 0.0505595, 0.981819)
bones/3/scale = Vector3(1, 1, 1)
bones/4/name = "mixamorig_Neck"
bones/4/parent = 3
bones/4/rest = Transform3D(1, 6.23025e-11, 3.44099e-12, -6.2282e-11, 0.999984, -0.0056553, -3.79327e-12, 0.0056553, 0.999984, 2.54808e-05, 15.0277, 0.877905)
bones/4/enabled = true
bones/4/position = Vector3(2.54808e-05, 15.0277, 0.877905)
bones/4/rotation = Quaternion(-0.145632, 0.0325123, -0.0330231, 0.988253)
bones/4/rotation = Quaternion(-0.145638, 0.0325141, -0.0330159, 0.988252)
bones/4/scale = Vector3(1, 1, 1)
bones/5/name = "mixamorig_Head"
bones/5/parent = 4
bones/5/rest = Transform3D(1, -2.18268e-11, 3.38872e-13, 2.18268e-11, 1, 1.21453e-08, -3.38872e-13, -1.21453e-08, 1, 2.55988e-06, 10.3218, 3.14243)
bones/5/enabled = true
bones/5/position = Vector3(2.55988e-06, 10.3218, 3.14243)
bones/5/rotation = Quaternion(-0.0210308, 0.237778, -0.0423015, 0.97017)
bones/5/rotation = Quaternion(-0.0210257, 0.237777, -0.0423074, 0.97017)
bones/5/scale = Vector3(1, 1, 1)
bones/6/name = "mixamorig_HeadTop_End"
bones/6/parent = 5
@ -991,28 +995,28 @@ bones/7/parent = 3
bones/7/rest = Transform3D(-0.20123, 0.979319, -0.0210089, 0.00976801, -0.0194404, -0.999763, -0.979495, -0.201387, -0.00565398, 6.10582, 9.10625, 0.75706)
bones/7/enabled = true
bones/7/position = Vector3(6.10582, 9.10625, 0.75706)
bones/7/rotation = Quaternion(-0.541246, -0.520049, 0.463313, -0.471107)
bones/7/rotation = Quaternion(-0.541247, -0.520049, 0.463313, -0.471107)
bones/7/scale = Vector3(1, 1, 1)
bones/8/name = "mixamorig_LeftArm"
bones/8/parent = 7
bones/8/rest = Transform3D(0.979535, -0.20123, -0.00422908, 0.201275, 0.979318, 0.0205813, 2.98023e-08, -0.0210113, 0.999779, 1.2517e-06, 12.9223, 2.02477e-05)
bones/8/enabled = true
bones/8/position = Vector3(9.33429e-06, 12.9223, -7.56018e-06)
bones/8/rotation = Quaternion(0.336008, -0.378768, 0.36516, 0.781212)
bones/8/rotation = Quaternion(0.33598, -0.378796, 0.365236, 0.781174)
bones/8/scale = Vector3(1, 1, 1)
bones/9/name = "mixamorig_LeftForeArm"
bones/9/parent = 8
bones/9/rest = Transform3D(1, 2.3344e-08, 1.63133e-08, -2.3344e-08, 1, -1.23929e-06, -1.63133e-08, 1.23929e-06, 1, 1.34292e-05, 27.4047, 1.27254e-05)
bones/9/enabled = true
bones/9/position = Vector3(3.76439e-06, 27.4047, 1.46218e-05)
bones/9/rotation = Quaternion(0.5427, -0.586184, 0.376246, 0.469366)
bones/9/rotation = Quaternion(0.54268, -0.586202, 0.376231, 0.469379)
bones/9/scale = Vector3(1, 1, 1)
bones/10/name = "mixamorig_LeftHand"
bones/10/parent = 9
bones/10/rest = Transform3D(1, 1.28733e-07, -1.28721e-07, -1.28733e-07, 1, -1.41334e-06, 1.28721e-07, 1.41334e-06, 1, -8.88504e-08, 27.6145, 1.39405e-06)
bones/10/enabled = true
bones/10/position = Vector3(-8.88504e-08, 27.6145, 1.39405e-06)
bones/10/rotation = Quaternion(-0.00451409, -0.370335, 0.0741844, 0.92592)
bones/10/rotation = Quaternion(-0.00450489, -0.370333, 0.0741756, 0.925922)
bones/10/scale = Vector3(1, 1, 1)
bones/11/name = "mixamorig_LeftHandThumb1"
bones/11/parent = 10
@ -1159,28 +1163,28 @@ bones/31/parent = 3
bones/31/rest = Transform3D(-0.201228, -0.979319, 0.0210167, -0.00976938, -0.0194482, -0.999763, 0.979496, -0.201385, -0.00565398, -6.1057, 9.10635, 0.757074)
bones/31/enabled = true
bones/31/position = Vector3(-6.1057, 9.10635, 0.757074)
bones/31/rotation = Quaternion(0.564829, -0.510698, 0.433, 0.482355)
bones/31/rotation = Quaternion(0.564823, -0.510705, 0.433008, 0.482347)
bones/31/scale = Vector3(1, 1, 1)
bones/32/name = "mixamorig_RightArm"
bones/32/parent = 31
bones/32/rest = Transform3D(0.979535, 0.201228, 0.00423029, -0.201272, 0.979319, 0.020588, 6.65896e-08, -0.0210181, 0.999779, -3.57628e-07, 12.9223, 1.30742e-05)
bones/32/enabled = true
bones/32/position = Vector3(1.38714e-05, 12.9223, 9.93985e-06)
bones/32/rotation = Quaternion(0.121488, 0.0685437, -0.457339, 0.878284)
bones/32/rotation = Quaternion(0.121459, 0.0686106, -0.457335, 0.878285)
bones/32/scale = Vector3(1, 1, 1)
bones/33/name = "mixamorig_RightForeArm"
bones/33/parent = 32
bones/33/rest = Transform3D(1, -5.84677e-08, 3.90717e-08, 5.84677e-08, 1, -4.48963e-07, -3.90717e-08, 4.48963e-07, 1, -7.61224e-07, 27.4047, -2.11461e-06)
bones/33/enabled = true
bones/33/position = Vector3(-7.61224e-07, 27.4047, -2.11461e-06)
bones/33/rotation = Quaternion(0.0823296, 0.139543, -0.797481, 0.581183)
bones/33/rotation = Quaternion(0.0823482, 0.139563, -0.797482, 0.581175)
bones/33/scale = Vector3(1, 1, 1)
bones/34/name = "mixamorig_RightHand"
bones/34/parent = 33
bones/34/rest = Transform3D(1, -4.75946e-09, 4.7599e-09, 4.75946e-09, 1, 5.92689e-07, -4.7599e-09, -5.92689e-07, 1, 1.32686e-05, 27.6144, -7.82493e-06)
bones/34/enabled = true
bones/34/position = Vector3(1.72122e-05, 27.6145, 1.36209e-05)
bones/34/rotation = Quaternion(-0.144782, 0.19281, -0.064513, 0.968349)
bones/34/rotation = Quaternion(-0.144791, 0.192789, -0.0644966, 0.968353)
bones/34/scale = Vector3(1, 1, 1)
bones/35/name = "mixamorig_RightHandThumb1"
bones/35/parent = 34
@ -1334,21 +1338,21 @@ bones/56/parent = 55
bones/56/rest = Transform3D(0.99993, 0.0118315, 0.000579731, -0.0118447, 0.999273, 0.0362199, -0.000150774, -0.0362242, 0.999344, -8.63573e-07, 40.5994, -7.20611e-08)
bones/56/enabled = true
bones/56/position = Vector3(-8.63573e-07, 40.5994, -7.20611e-08)
bones/56/rotation = Quaternion(-0.766637, -0.00443554, -0.0623044, 0.639036)
bones/56/rotation = Quaternion(-0.766639, -0.00443562, -0.0623043, 0.639033)
bones/56/scale = Vector3(1, 1, 1)
bones/57/name = "mixamorig_LeftFoot"
bones/57/parent = 56
bones/57/rest = Transform3D(0.998342, -0.0264272, 0.0511338, 0.0574903, 0.414367, -0.908292, 0.00281544, 0.909726, 0.415199, -4.32148e-07, 42.099, -4.07919e-07)
bones/57/enabled = true
bones/57/position = Vector3(-4.32148e-07, 42.099, -4.07919e-07)
bones/57/rotation = Quaternion(0.547634, 0.0625633, 0.0248344, 0.834006)
bones/57/rotation = Quaternion(0.547639, 0.0625631, 0.0248342, 0.834003)
bones/57/scale = Vector3(1, 1, 1)
bones/58/name = "mixamorig_LeftToeBase"
bones/58/parent = 57
bones/58/rest = Transform3D(0.997412, 0.0150935, -0.0702888, -0.0447132, 0.89584, -0.442121, 0.0562943, 0.444119, 0.894197, 1.14934e-06, 15.7216, 8.9407e-07)
bones/58/enabled = true
bones/58/position = Vector3(1.14934e-06, 15.7216, 8.9407e-07)
bones/58/rotation = Quaternion(0.442835, -0.0259829, -0.0121603, 0.896144)
bones/58/rotation = Quaternion(0.442825, -0.0259829, -0.0121608, 0.896149)
bones/58/scale = Vector3(1, 1, 1)
bones/59/name = "mixamorig_LeftToe_End"
bones/59/parent = 58
@ -1362,28 +1366,28 @@ bones/60/parent = 0
bones/60/rest = Transform3D(-0.999981, -0.00611455, -7.52684e-05, 0.00611501, -0.999901, -0.0126672, 2.1931e-06, -0.0126674, 0.99992, -9.12503, -6.6556, -0.0553527)
bones/60/enabled = true
bones/60/position = Vector3(-9.12503, -6.6556, -0.0553527)
bones/60/rotation = Quaternion(-0.0339464, 0.334675, 0.92684, -0.166755)
bones/60/rotation = Quaternion(-0.0339455, 0.334676, 0.92684, -0.166754)
bones/60/scale = Vector3(1, 1, 1)
bones/61/name = "mixamorig_RightLeg"
bones/61/parent = 60
bones/61/rest = Transform3D(0.99993, -0.0118315, -0.000580536, 0.0118448, 0.999271, 0.0362854, 0.000150802, -0.0362897, 0.999341, 3.28565e-07, 40.5995, 1.49012e-08)
bones/61/enabled = true
bones/61/position = Vector3(3.28565e-07, 40.5995, 1.49012e-08)
bones/61/rotation = Quaternion(-0.581827, -0.0846288, -0.016647, 0.808726)
bones/61/rotation = Quaternion(-0.581827, -0.0846291, -0.0166473, 0.808726)
bones/61/scale = Vector3(1, 1, 1)
bones/62/name = "mixamorig_RightFoot"
bones/62/parent = 61
bones/62/rest = Transform3D(0.998342, 0.0264271, -0.0511337, -0.0574901, 0.414337, -0.908306, -0.0028173, 0.90974, 0.415169, 2.71709e-07, 42.099, -1.01514e-07)
bones/62/enabled = true
bones/62/position = Vector3(2.71709e-07, 42.099, -1.01514e-07)
bones/62/rotation = Quaternion(0.725848, 0.0249634, -0.120039, 0.67684)
bones/62/rotation = Quaternion(0.725845, 0.0249646, -0.120038, 0.676843)
bones/62/scale = Vector3(1, 1, 1)
bones/63/name = "mixamorig_RightToeBase"
bones/63/parent = 62
bones/63/rest = Transform3D(0.997471, -0.0150664, 0.0694586, 0.044322, 0.895832, -0.442177, -0.0555612, 0.444137, 0.894234, 1.55898e-07, 15.7216, 3.8445e-06)
bones/63/enabled = true
bones/63/position = Vector3(1.55898e-07, 15.7216, 3.8445e-06)
bones/63/rotation = Quaternion(0.245405, 0.0480431, 0.0189418, 0.968044)
bones/63/rotation = Quaternion(0.245405, 0.0480429, 0.0189423, 0.968044)
bones/63/scale = Vector3(1, 1, 1)
bones/64/name = "mixamorig_RightToe_End"
bones/64/parent = 63
@ -1405,12 +1409,12 @@ surface_material_override/0 = SubResource("StandardMaterial3D_j3emx")
[node name="PhysicalBoneSimulator3D" type="PhysicalBoneSimulator3D" parent="Body/Armature/Skeleton3D" groups=["target"]]
[node name="Physical Bone mixamorig_Hips" type="PhysicalBone3D" parent="Body/Armature/Skeleton3D/PhysicalBoneSimulator3D" groups=["target"]]
transform = Transform3D(82.5044, -54.0559, -16.4615, 55.0482, 83.4649, 1.8195, 12.756, -10.5629, 98.619, 1.31501, 0.290643, -87.4647)
transform = Transform3D(82.5044, -54.0559, -16.4615, 55.0482, 83.4649, 1.8195, 12.756, -10.5629, 98.619, 1.315, 0.29064, -87.4646)
collision_layer = 8
collision_mask = 9
joint_type = 1
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.10511e-07, -1.76951e-08, 0.0499957)
body_offset = Transform3D(100, -0.0695229, -0.00863039, -2.57492e-05, 12.2744, -99.2438, 0.0700531, 99.2438, 12.2744, 0.000462532, 4.96176, -0.613665)
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.44603e-07, -1.76951e-08, 0.0499957)
body_offset = Transform3D(100, -0.0695229, -0.00861943, -2.6226e-05, 12.2744, -99.2438, 0.0700493, 99.2438, 12.2744, 0.000465393, 4.96176, -0.613665)
mass = 20.0
bone_name = "mixamorig_Hips"
joint_constraints/bias = 0.3
@ -1425,12 +1429,12 @@ transform = Transform3D(0.01, 0, 0, 0, -4.37114e-10, 0.01, 0, -0.01, -4.37114e-1
shape = SubResource("CapsuleShape3D_0ptuo")
[node name="Physical Bone mixamorig_Spine" type="PhysicalBone3D" parent="Body/Armature/Skeleton3D/PhysicalBoneSimulator3D"]
transform = Transform3D(80.9399, -58.5481, -4.56548, 57.6062, 80.6673, -13.2029, 11.4129, 8.0564, 99.0194, 2.40579, 0.974135, -98.2037)
transform = Transform3D(80.9412, -58.546, -4.56915, 57.6045, 80.6695, -13.1964, 11.4119, 8.04926, 99.0201, 2.40599, 0.973749, -98.2036)
collision_layer = 8
collision_mask = 9
joint_type = 1
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.79713e-09, -8.36489e-09, 0.05866)
body_offset = Transform3D(100, 2.28882e-05, -4.76837e-06, 9.53674e-07, 3.24249e-05, -100, -2.28882e-05, 100, 3.05176e-05, 0, 5.866, -9.53674e-07)
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.46942e-08, 1.17182e-09, 0.0586602)
body_offset = Transform3D(100, 2.28882e-05, 6.67572e-06, 1.43051e-06, 3.24249e-05, -100, -3.8147e-05, 100, 3.05176e-05, -2.86102e-06, 5.86602, -1.90735e-06)
mass = 20.0
bone_name = "mixamorig_Spine"
joint_constraints/bias = 0.3
@ -1445,12 +1449,12 @@ transform = Transform3D(0.0318071, 3.86358e-14, 4.9738e-14, -2.13163e-14, -1.629
shape = SubResource("CapsuleShape3D_126jt")
[node name="Physical Bone mixamorig_Head" type="PhysicalBone3D" parent="Body/Armature/Skeleton3D/PhysicalBoneSimulator3D" groups=["target"]]
transform = Transform3D(-97.8018, 4.48619, 20.364, -15.845, -79.4738, -58.5905, 13.5555, -60.5292, 78.4376, -13.8186, 23.4966, -143.637)
transform = Transform3D(-97.8019, 4.47329, 20.366, -15.8368, -79.471, -58.5966, 13.5639, -60.5339, 78.4326, -13.8193, 23.4986, -143.635)
collision_layer = 8
collision_mask = 9
joint_type = 1
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.0589e-07, 7.45058e-08, 0.0981534)
body_offset = Transform3D(-100, -0.00221062, -0.000787735, -1.19209e-05, 33.8066, -94.1122, 0.00233173, -94.1122, -33.8066, 4.673e-05, 9.23743, 3.31824)
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.1186e-07, 1.08033e-07, 0.0981535)
body_offset = Transform3D(-100, -0.00220776, -0.000774384, -1.52588e-05, 33.8066, -94.1122, 0.00233746, -94.1123, -33.8066, 4.48227e-05, 9.23744, 3.31825)
mass = 7.0
bone_name = "mixamorig_Head"
joint_constraints/bias = 0.3
@ -1465,12 +1469,12 @@ transform = Transform3D(0.0099, 0, 0, 0, 0.0099, 0, 0, 0, 0.0099, 0, 0, 0)
shape = SubResource("CapsuleShape3D_1gw5y")
[node name="Physical Bone mixamorig_LeftArm" type="PhysicalBone3D" parent="Body/Armature/Skeleton3D/PhysicalBoneSimulator3D"]
transform = Transform3D(86.116, 14.0289, -48.8593, -45.502, 64.1247, -61.7867, 22.6629, 75.4402, 61.605, 16.193, 31.0319, -132.592)
transform = Transform3D(86.1165, 14.0252, -48.8594, -45.4995, 64.1262, -61.787, 22.666, 75.4395, 61.6046, 16.1942, 31.0309, -132.592)
collision_layer = 8
collision_mask = 9
joint_type = 1
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.07897e-08, 1.8395e-07, 0.137023)
body_offset = Transform3D(100, -6.10352e-05, -4.57764e-05, 7.05719e-05, 100, -2.28882e-05, 1.90735e-05, 3.8147e-06, 100, 1.33514e-05, -1.52588e-05, -13.7023)
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.81838e-07, 2.39336e-07, 0.137023)
body_offset = Transform3D(100, -9.72748e-05, -3.43323e-05, 8.96454e-05, 100, -7.62939e-06, 1.90735e-05, 3.8147e-06, 100, 2.28882e-05, -2.28882e-05, -13.7023)
mass = 3.0
bone_name = "mixamorig_LeftArm"
joint_constraints/bias = 0.3
@ -1482,12 +1486,12 @@ transform = Transform3D(0.01, 0, 0, 0, 0.00997432, -0.000716193, 0, 0.000716193,
shape = SubResource("CapsuleShape3D_krlof")
[node name="Physical Bone mixamorig_LeftForeArm" type="PhysicalBone3D" parent="Body/Armature/Skeleton3D/PhysicalBoneSimulator3D"]
transform = Transform3D(-48.2559, -12.0561, 86.7526, -78.7314, -37.4274, -48.9954, 38.3762, -91.9448, 8.56898, 1.36465, 46.9037, -104.66)
transform = Transform3D(-48.2566, -12.058, 86.752, -78.7312, -37.4258, -48.997, 38.3757, -91.9452, 8.56699, 1.36483, 46.9033, -104.66)
collision_layer = 8
collision_mask = 9
joint_type = 1
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.36614e-07, -2.63348e-09, 0.138072)
body_offset = Transform3D(100, 7.62939e-06, -5.34058e-05, -3.05176e-05, 0, -100, 7.62939e-06, 100, 1.90735e-06, 6.10352e-05, 13.8072, 0)
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.57681e-07, -1.84345e-08, 0.138072)
body_offset = Transform3D(100, 1.14441e-05, -3.8147e-05, -3.8147e-05, 3.8147e-06, -100, 1.33514e-05, 100, 1.33514e-05, 6.10352e-05, 13.8072, 0)
mass = 3.0
bone_name = "mixamorig_LeftForeArm"
joint_constraints/bias = 0.3
@ -1499,12 +1503,12 @@ transform = Transform3D(0.01, 0, 0, 0, -4.37114e-10, 0.01, 0, -0.01, -4.37114e-1
shape = SubResource("CapsuleShape3D_2k34c")
[node name="Physical Bone mixamorig_LeftHand" type="PhysicalBone3D" parent="Body/Armature/Skeleton3D/PhysicalBoneSimulator3D"]
transform = Transform3D(9.1154, -98.6768, 13.4087, 23.9481, -10.8975, -96.4766, 96.6613, 12.0054, 22.6379, -10.9687, 56.2244, -106.443)
transform = Transform3D(9.11562, -98.6768, 13.4088, 23.9481, -10.8976, -96.4766, 96.6612, 12.0056, 22.6379, -10.9684, 56.2241, -106.442)
collision_layer = 8
collision_mask = 9
joint_type = 1
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.58325e-08, -8.61473e-08, 0.0264902)
body_offset = Transform3D(-58.5197, 57.9894, 56.6805, 1.52588e-05, 69.899, -71.5131, -81.0891, -41.8493, -40.9047, -1.50147, 1.8944, 1.08357)
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.45058e-08, -1.15018e-07, 0.0264901)
body_offset = Transform3D(-58.5197, 57.9894, 56.6805, 1.52588e-05, 69.899, -71.5132, -81.0891, -41.8493, -40.9047, -1.50147, 1.8944, 1.08356)
bone_name = "mixamorig_LeftHand"
joint_constraints/bias = 0.3
joint_constraints/damping = 1.0
@ -1515,12 +1519,12 @@ transform = Transform3D(0.01, 0, 0, 0, 0.00697578, 0.00716509, 0, -0.00716509, 0
shape = SubResource("CapsuleShape3D_5fgdh")
[node name="Physical Bone mixamorig_RightArm" type="PhysicalBone3D" parent="Body/Armature/Skeleton3D/PhysicalBoneSimulator3D"]
transform = Transform3D(30.7225, 72.891, 61.1803, 93.7858, -34.0919, -6.4783, 16.1354, 59.3687, -78.8353, -27.5288, -1.29731, -110.131)
transform = Transform3D(30.7246, 72.8896, 61.1809, 93.7855, -34.092, -6.48191, 16.1331, 59.3704, -78.8345, -27.5296, -1.29565, -110.13)
collision_layer = 8
collision_mask = 9
joint_type = 1
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.5515e-08, 2.72834e-07, 0.137023)
body_offset = Transform3D(100, 0, 1.33514e-05, 1.00136e-05, 8.10623e-06, -100, 3.8147e-06, 100, 2.36034e-05, 5.72205e-06, 13.7023, -3.05176e-05)
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.03082e-07, 4.39518e-08, 0.137023)
body_offset = Transform3D(100, -1.90735e-06, 1.95503e-05, 1.52588e-05, 6.91414e-06, -100, -3.8147e-06, 100, 2.36034e-05, 7.62939e-06, 13.7023, -7.62939e-06)
mass = 3.0
bone_name = "mixamorig_RightArm"
joint_constraints/bias = 0.3
@ -1532,12 +1536,12 @@ transform = Transform3D(0.01, 0, 0, 0, -4.37114e-10, 0.01, 0, -0.01, -4.37114e-1
shape = SubResource("CapsuleShape3D_8vkyv")
[node name="Physical Bone mixamorig_RightForeArm" type="PhysicalBone3D" parent="Body/Armature/Skeleton3D/PhysicalBoneSimulator3D"]
transform = Transform3D(24.3602, 37.4045, 89.4846, -25.0076, 91.5666, -31.467, -93.7081, -14.7125, 31.6598, -48.2673, 3.93511, -103.7)
transform = Transform3D(24.3552, 37.4063, 89.4852, -25.0101, 91.5653, -31.4688, -93.7087, -14.716, 31.6563, -48.2682, 3.93752, -103.698)
collision_layer = 8
collision_mask = 9
joint_type = 1
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.66977e-07, -2.58653e-07, 0.138072)
body_offset = Transform3D(100, 2.47955e-05, -2.38419e-05, -3.24249e-05, 100, 3.62396e-05, 4.24385e-05, -2.86102e-05, 100, -5.34058e-05, 2.08616e-05, -13.8072)
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.2944e-07, -2.55922e-07, 0.138072)
body_offset = Transform3D(100, 1.52588e-05, -3.09944e-05, -2.86102e-05, 100, 3.8147e-05, 4.24385e-05, -3.8147e-05, 100, -6.86646e-05, 2.03252e-05, -13.8072)
mass = 3.0
bone_name = "mixamorig_RightForeArm"
joint_constraints/bias = 0.3
@ -1549,12 +1553,12 @@ transform = Transform3D(0.01, 0, 0, 0, 0.00999714, -0.000239087, 0, 0.000239087,
shape = SubResource("CapsuleShape3D_fh1k4")
[node name="Physical Bone mixamorig_RightHand" type="PhysicalBone3D" parent="Body/Armature/Skeleton3D/PhysicalBoneSimulator3D"]
transform = Transform3D(89.0766, -24.8072, -38.0785, 5.05096, 88.6727, -45.9525, 45.1647, 39.0096, 80.2396, -24.5741, 26.0933, -105.517)
transform = Transform3D(89.0767, -24.8074, -38.0781, 5.05123, 88.6727, -45.9527, 45.1645, 39.0097, 80.2397, -24.5745, 26.0951, -105.517)
collision_layer = 8
collision_mask = 9
joint_type = 1
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.3935e-07, 3.21772e-07, 0.0264905)
body_offset = Transform3D(-58.5197, -57.9893, -56.6806, -7.62939e-06, 69.8991, -71.513, 81.0891, -41.8492, -40.9048, 1.5015, 1.89439, 1.08362)
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.14787e-07, 3.66941e-07, 0.0264904)
body_offset = Transform3D(-58.5197, -57.9893, -56.6806, -9.05991e-06, 69.8991, -71.5131, 81.0891, -41.8492, -40.9048, 1.5015, 1.89439, 1.08363)
bone_name = "mixamorig_RightHand"
joint_constraints/bias = 0.3
joint_constraints/damping = 1.0
@ -1565,12 +1569,12 @@ transform = Transform3D(0.01, 0, 0, 0, 0.00693402, 0.00720551, 0, -0.00720551, 0
shape = SubResource("CapsuleShape3D_1m8r5")
[node name="Physical Bone mixamorig_LeftUpLeg" type="PhysicalBone3D" parent="Body/Armature/Skeleton3D/PhysicalBoneSimulator3D"]
transform = Transform3D(-96.1774, -26.2683, 7.73898, -23.4202, 64.2555, -72.957, 14.1919, -71.9806, -67.9513, 5.83709, 19.601, -60.9755)
transform = Transform3D(-96.1774, -26.2683, 7.73898, -23.4202, 64.2555, -72.957, 14.1918, -71.9806, -67.9513, 5.83709, 19.601, -60.9754)
collision_layer = 8
collision_mask = 9
joint_type = 1
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.70518e-08, 2.19423e-07, 0.202997)
body_offset = Transform3D(100, -7.82013e-05, 2.28882e-05, 2.86102e-05, 5.72205e-05, -100, 7.62939e-05, 100, 6.10352e-05, -1.33514e-05, 20.2997, -3.43323e-05)
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.09712e-07, 3.11205e-07, 0.202997)
body_offset = Transform3D(100, -8.39233e-05, 3.05176e-05, 2.67029e-05, 5.72205e-05, -100, 8.96454e-05, 100, 5.34058e-05, -1.71661e-05, 20.2997, -4.19617e-05)
mass = 5.0
bone_name = "mixamorig_LeftUpLeg"
joint_constraints/bias = 0.3
@ -1582,12 +1586,12 @@ transform = Transform3D(0.01, 0, 0, 0, -4.37114e-10, 0.01, 0, -0.01, -4.37114e-1
shape = SubResource("CapsuleShape3D_3cygo")
[node name="Physical Bone mixamorig_LeftLeg" type="PhysicalBone3D" parent="Body/Armature/Skeleton3D/PhysicalBoneSimulator3D"]
transform = Transform3D(-97.5216, -11.6195, -18.829, -22.0484, 58.1432, 78.315, 1.84803, 80.5255, -59.2641, 8.22949, 17.9262, -34.7068)
transform = Transform3D(-97.5216, -11.6193, -18.8291, -22.0483, 58.1427, 78.3154, 1.84805, 80.5259, -59.2635, 8.22949, 17.9261, -34.7068)
collision_layer = 8
collision_mask = 9
joint_type = 1
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.01487e-09, -5.92223e-08, 0.210495)
body_offset = Transform3D(100, -2.86102e-06, -1.90735e-06, 3.8147e-06, 1.14441e-05, -100, 3.8147e-06, 100, 1.90735e-05, 0, 21.0495, 1.90735e-06)
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.76408e-08, -8.02975e-08, 0.210495)
body_offset = Transform3D(100, 2.86102e-06, 1.33514e-05, 5.72205e-06, 2.28882e-05, -100, -9.53674e-07, 100, 3.8147e-05, 9.53674e-07, 21.0495, 0)
mass = 5.0
bone_name = "mixamorig_LeftLeg"
joint_constraints/bias = 0.3
@ -1599,12 +1603,12 @@ transform = Transform3D(0.01, 0, 0, 0, -4.37114e-10, 0.01, 0, -0.01, -4.37114e-1
shape = SubResource("CapsuleShape3D_vwdij")
[node name="Physical Bone mixamorig_LeftFoot" type="PhysicalBone3D" parent="Body/Armature/Skeleton3D/PhysicalBoneSimulator3D"]
transform = Transform3D(-93.6711, -34.5298, 5.7808, -34.9452, 91.207, -21.4502, 2.13422, -22.1128, -97.5011, 11.7385, 3.12743, -14.5676)
transform = Transform3D(-93.6711, -34.5297, 5.78095, -34.9451, 91.207, -21.4506, 2.1342, -22.1132, -97.501, 11.7385, 3.12728, -14.5678)
collision_layer = 8
collision_mask = 9
joint_type = 1
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.32068e-08, 1.41355e-07, 0.0786084)
body_offset = Transform3D(100, 2.28882e-05, 3.33786e-06, 8.10623e-06, -3.62396e-05, -100, -3.24249e-05, 100, -1.90735e-05, -8.58307e-06, 7.86084, -1.26362e-05)
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.06569e-07, 1.98453e-07, 0.0786085)
body_offset = Transform3D(100, 4.19617e-05, 1.00136e-05, 9.53674e-06, -3.62396e-05, -100, -3.8147e-05, 100, -5.53131e-05, -1.14441e-05, 7.86085, -1.54972e-05)
bone_name = "mixamorig_LeftFoot"
joint_constraints/bias = 0.3
joint_constraints/damping = 1.0
@ -1615,12 +1619,12 @@ transform = Transform3D(0.01, 0, 0, 0, -4.37114e-10, 0.01, 0, -0.01, -4.37114e-1
shape = SubResource("CapsuleShape3D_qyg6j")
[node name="Physical Bone mixamorig_RightUpLeg" type="PhysicalBone3D" parent="Body/Armature/Skeleton3D/PhysicalBoneSimulator3D"]
transform = Transform3D(-83.6897, -51.5226, 18.4784, -50.5593, 59.8312, -62.161, 20.9711, -61.3649, -76.122, -11.4061, 7.37456, -61.6461)
transform = Transform3D(-83.6898, -51.5224, 18.4786, -50.5593, 59.8312, -62.161, 20.9708, -61.3651, -76.1219, -11.4062, 7.37456, -61.646)
collision_layer = 8
collision_mask = 9
joint_type = 1
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.97626e-08, 1.89829e-15, 0.202997)
body_offset = Transform3D(100, -3.8147e-06, -5.72205e-06, -7.62939e-06, -3.05176e-05, -100, -3.8147e-06, 100, 0, -3.8147e-06, 20.2997, 0)
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.92993e-08, 1.00668e-07, 0.202997)
body_offset = Transform3D(100, -1.14441e-05, -5.72205e-06, -5.72205e-06, -4.95911e-05, -100, -3.8147e-06, 100, -4.95911e-05, -4.76837e-06, 20.2997, 0)
mass = 5.0
bone_name = "mixamorig_RightUpLeg"
joint_constraints/bias = 0.3
@ -1632,12 +1636,12 @@ transform = Transform3D(0.01, 0, 0, 0, -4.37114e-10, 0.01, 0, -0.01, -4.37114e-1
shape = SubResource("CapsuleShape3D_a81km")
[node name="Physical Bone mixamorig_RightLeg" type="PhysicalBone3D" parent="Body/Armature/Skeleton3D/PhysicalBoneSimulator3D"]
transform = Transform3D(-91.8174, -23.5085, -31.8891, -36.0103, 83.0804, 42.437, 16.5174, 50.4479, -84.7478, -8.44469, 11.0604, -28.3545)
transform = Transform3D(-91.8175, -23.5085, -31.8888, -36.0102, 83.0805, 42.437, 16.517, 50.4478, -84.7479, -8.44486, 11.0604, -28.3544)
collision_layer = 8
collision_mask = 9
joint_type = 1
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.71532e-07, -2.44424e-07, 0.210495)
body_offset = Transform3D(100, -8.7738e-05, -1.23978e-05, -4.76837e-06, 8.01086e-05, -100, 8.96454e-05, 100, 5.72205e-05, -1.45435e-05, 21.0495, 1.23978e-05)
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.52464e-07, -3.77421e-07, 0.210495)
body_offset = Transform3D(100, -0.000101089, 5.72205e-06, -5.72205e-06, 8.7738e-05, -100, 0.000110626, 100, 0.000106812, -1.64509e-05, 21.0495, 1.52588e-05)
mass = 5.0
bone_name = "mixamorig_RightLeg"
joint_constraints/bias = 0.3
@ -1649,12 +1653,12 @@ transform = Transform3D(0.01, 0, 0, 0, -4.37114e-10, 0.01, 0, -0.01, -4.37114e-1
shape = SubResource("CylinderShape3D_2binp")
[node name="Physical Bone mixamorig_RightFoot" type="PhysicalBone3D" parent="Body/Armature/Skeleton3D/PhysicalBoneSimulator3D" groups=["target"]]
transform = Transform3D(-88.192, -17.3349, 43.8369, -46.855, 42.4437, -77.4799, -5.17492, -88.8709, -45.5542, -5.17813, 8.21814, -6.93456)
transform = Transform3D(-88.192, -17.3351, 43.8368, -46.8549, 42.4443, -77.4797, -5.17505, -88.8706, -45.5548, -5.17838, 8.21811, -6.93438)
collision_layer = 8
collision_mask = 9
joint_type = 1
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.21032e-08, -1.68616e-08, 0.078608)
body_offset = Transform3D(100, 0, -3.8147e-06, -7.62939e-06, -0.000114441, -100, -3.8147e-06, 100, -8.7738e-05, 7.51019e-06, 7.8608, 8.58307e-06)
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.45649e-08, 4.31115e-08, 0.078608)
body_offset = Transform3D(100, 1.71661e-05, -1.52588e-05, -1.52588e-05, -0.000137329, -100, -5.72205e-06, 100, -0.000164032, 9.65595e-06, 7.8608, 8.58307e-06)
bone_name = "mixamorig_RightFoot"
joint_constraints/bias = 0.3
joint_constraints/damping = 1.0
@ -1668,6 +1672,14 @@ shape = SubResource("CylinderShape3D_l2il6")
transform = Transform3D(9.83936, 0.264962, 1.76546, 0.249217, 9.58855, -2.82801, -1.76775, 2.82658, 9.42791, -12.7207, 21.3283, -142.579)
shape = SubResource("SphereShape3D_wnhib")
[node name="BoneAttachment3D" type="BoneAttachment3D" parent="Body/Armature/Skeleton3D"]
[node name="Area3D" type="Area3D" parent="Body/Armature/Skeleton3D/BoneAttachment3D"]
transform = Transform3D(1, 0, -4.23516e-22, 0, 1, 0, 8.47033e-22, 0, 1, -7.01829e-20, -5.93397e-06, -135.753)
[node name="CollisionShape3D" type="CollisionShape3D" parent="Body/Armature/Skeleton3D/BoneAttachment3D/Area3D"]
shape = SubResource("CapsuleShape3D_ycdvn")
[node name="AnimationPlayer" type="AnimationPlayer" parent="Body"]
libraries = {
"": SubResource("AnimationLibrary_dbxeu")

View File

@ -0,0 +1,33 @@
extends Node
class_name CharacterWrapper
@export var die_script: GDScript = null
var owner_placeholder: Node3D = null
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
# Characters should be always controlled by the server and synced accross client
# The owner should be responsible for the syncronization, since this node is
# just a dummy that is following the controller
set_multiplayer_authority(1)
pass # Replace with function body.
# Set the owner placeholder, so the characters can send the requests to a node
# it depends on
func set_owner_placeholder(owner: Node3D):
owner_placeholder = owner
func die():
push_warning("TODO: Implement ragdoll kind of dying and respawn character as an object")
queue_free()
func _on_area_body_part_hit(damage: int) -> void:
# The owner node should be aware of how to take damage, so we need to
# pass the value.
if owner_placeholder:
if owner_placeholder.has_method("take_damage"):
owner_placeholder.take_damage(damage)
else:
push_warning("Node doesn't know how to take the damage")

File diff suppressed because one or more lines are too long

View File

@ -1,7 +0,0 @@
[gd_scene format=3 uid="uid://dv23lxk4hr8io"]
[node name="FirstViewGenericGun" type="Node3D"]
[node name="TestCamera" type="Camera3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.49377, 1.45724, 5.45639)
fov = 40.0

View File

@ -0,0 +1,13 @@
extends Area3D
@export var damage_multiplexer: float = 1.0
@export var body_part: String = ""
signal body_part_hit(damage: int)
func _ready() -> void:
add_to_group("target")
func hit(base_damage: int):
var final_damage = round(base_damage * damage_multiplexer)
body_part_hit.emit(final_damage)

View File

@ -1,17 +0,0 @@
extends CharacterBody3D
var health = 100
var alive = true
func take_damage(damage: int):
print("I")
func _physics_process(delta: float) -> void:
if health == 0:
alive = false
var world: Node3D = find_parent("Map")
var spawner: MultiplayerSpawner = world.find_child("ObjectSpawner").find_child("MultiplayerSpawner")
var objects_root: Node3D = world.find_child("ObjectSpawner").find_child("Objects")
#reparent(get_tree().get_root())
$Dummy.die()
#queue_free()

View File

@ -1,16 +0,0 @@
[gd_scene load_steps=4 format=3 uid="uid://b7vj5j6wxqrfr"]
[ext_resource type="Script" path="res://scenes/characters/npc/zombie/zombie.gd" id="1_2j0kt"]
[ext_resource type="PackedScene" uid="uid://1txob6jskn5s" path="res://scenes/characters/blue/dummy.tscn" id="1_qd8fb"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_t4cyd"]
height = 1.6
[node name="PlayerPlaceholder_Zombie" type="CharacterBody3D"]
script = ExtResource("1_2j0kt")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.801503, -0.185051)
shape = SubResource("CapsuleShape3D_t4cyd")
[node name="Dummy" parent="." instance=ExtResource("1_qd8fb")]

View File

@ -1,186 +0,0 @@
[gd_scene load_steps=13 format=3 uid="uid://b10lpwfjgxds4"]
[ext_resource type="Script" path="res://scripts/player/player_input_controller.gd" id="1_q75ai"]
[ext_resource type="Texture2D" uid="uid://oopj5mj1vdp0" path="res://assets/crosshairs/crosshair_default.png" id="2_lsd7c"]
[ext_resource type="Script" path="res://scenes/characters/player_input_controller.gd" id="3_n3epd"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_jc50w"]
margin = 0.5
radius = 0.4
height = 1.6
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_tl74a"]
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
properties/2/path = NodePath(".:health")
properties/2/spawn = true
properties/2/replication_mode = 2
properties/3/path = NodePath(".:velocity")
properties/3/spawn = true
properties/3/replication_mode = 1
properties/4/path = NodePath(".:owner_id")
properties/4/spawn = true
properties/4/replication_mode = 1
[sub_resource type="Animation" id="Animation_falg4"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0.125),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0, 0, 0)]
}
[sub_resource type="Animation" id="Animation_mkk0p"]
resource_name = "move"
length = 0.5
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.125, 0.25, 0.375, 0.5),
"transitions": PackedFloat32Array(1, 2, 1, 2, 1),
"update": 0,
"values": [Vector3(0, 0, 0), Vector3(0.001, 0.001, -0.001), Vector3(0, 0, 0), Vector3(-0.001, 0.001, -0.001), Vector3(0, 0, 0)]
}
[sub_resource type="Animation" id="Animation_ah507"]
resource_name = "shooting"
length = 0.2
loop_mode = 1
step = 0.1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2),
"transitions": PackedFloat32Array(1, 0.233258, 8.57419),
"update": 0,
"values": [Vector3(0, 0, 0), Vector3(0, -0.01, -0.01), Vector3(0, 0, 0)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_u1b6p"]
_data = {
"RESET": SubResource("Animation_falg4"),
"move": SubResource("Animation_mkk0p"),
"shooting": SubResource("Animation_ah507")
}
[sub_resource type="LabelSettings" id="LabelSettings_toaij"]
font_size = 70
[sub_resource type="LabelSettings" id="LabelSettings_1j1uq"]
font_size = 100
font_color = Color(0.756874, 0, 0.223924, 1)
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_eour5"]
properties/0/path = NodePath(".:input_direction")
properties/0/spawn = false
properties/0/replication_mode = 2
properties/1/path = NodePath(".:jumping")
properties/1/spawn = false
properties/1/replication_mode = 2
[node name="CharacterPlaceholder" type="CharacterBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.799455, 0)
collision_layer = 9
collision_mask = 9
script = ExtResource("1_q75ai")
[node name="Collision" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0150437, 0)
shape = SubResource("CapsuleShape3D_jc50w")
[node name="PlayerSynchronizer" type="MultiplayerSynchronizer" parent="."]
replication_config = SubResource("SceneReplicationConfig_tl74a")
[node name="FirstPersonCameraMount" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.609154, -0.209324)
[node name="Camera" type="Camera3D" parent="FirstPersonCameraMount"]
fov = 60.0
[node name="BulletStartingPoint" type="Node3D" parent="FirstPersonCameraMount"]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, -0.42185)
[node name="AimRay" type="RayCast3D" parent="FirstPersonCameraMount/BulletStartingPoint"]
target_position = Vector3(0, 0, 1000)
hit_from_inside = true
collide_with_areas = true
[node name="GunMount" type="Node3D" parent="FirstPersonCameraMount"]
[node name="AnimationPlayer" type="AnimationPlayer" parent="FirstPersonCameraMount/GunMount"]
libraries = {
"": SubResource("AnimationLibrary_u1b6p")
}
[node name="HUD" type="Control" parent="FirstPersonCameraMount"]
visible = false
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = 8.0
offset_right = 8.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
[node name="TextureRect" type="TextureRect" parent="FirstPersonCameraMount/HUD"]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -36.0
offset_top = -36.0
offset_right = 36.0
offset_bottom = 36.0
grow_horizontal = 2
grow_vertical = 2
texture = ExtResource("2_lsd7c")
[node name="HealthIndicator" type="Label" parent="FirstPersonCameraMount/HUD"]
layout_mode = 1
anchors_preset = 2
anchor_top = 1.0
anchor_bottom = 1.0
offset_top = -23.0
offset_right = 40.0
grow_vertical = 0
text = "100"
label_settings = SubResource("LabelSettings_toaij")
[node name="FPS" type="Label" parent="FirstPersonCameraMount/HUD" groups=["player_placeholder"]]
layout_mode = 1
offset_right = 40.0
offset_bottom = 23.0
text = "0"
label_settings = SubResource("LabelSettings_1j1uq")
[node name="ModelMount" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.790262, 0)
[node name="PlayerInput" type="MultiplayerSynchronizer" parent="."]
root_path = NodePath(".")
replication_config = SubResource("SceneReplicationConfig_eour5")
script = ExtResource("3_n3epd")

View File

@ -1,35 +0,0 @@
extends MultiplayerSynchronizer
@export var jumping := false
@export var input_direction := Vector2()
@onready var camera_mount = $"../FirstPersonCameraMount"
@onready var placeholder = $".."
func _ready() -> void:
pass
#set_process(get_multiplayer_authority() == multiplayer.get_unique_id())
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
# Add the gravity.
if multiplayer.get_unique_id() == get_multiplayer_authority():
input_direction = Input.get_vector("move_left", "move_right", "move_forward", "move_backwards")
set_input_direction.rpc(input_direction)
if Input.is_action_just_pressed("jump"):
jump.rpc_id(1)
var camera_sens: float = 0.002
func _input(event):
if multiplayer.get_unique_id() == get_multiplayer_authority():
if event is InputEventMouseMotion and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
placeholder.rotate_y(-event.relative.x * camera_sens)
@rpc("any_peer", "call_local", "reliable")
func set_input_direction(direction: Vector2):
input_direction = direction
@rpc("any_peer", "call_local", "reliable")
func jump():
jumping = true

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,9 +1,14 @@
[gd_scene format=3 uid="uid://b0k17hibnhnv4"]
[gd_scene load_steps=2 format=3 uid="uid://b0k17hibnhnv4"]
[ext_resource type="PackedScene" uid="uid://ddwrs0so7swxn" path="res://scenes/characters/y-bot/character.tscn" id="1_87hqt"]
[node name="ObjectSpawner" type="Node3D"]
[node name="MultiplayerSpawner" type="MultiplayerSpawner" parent="."]
_spawnable_scenes = PackedStringArray("res://scenes/characters/y-bot/character.tscn")
spawn_path = NodePath("../Objects")
spawn_limit = 10000
[node name="Objects" type="Node3D" parent="."]
[node name="Character" parent="Objects" instance=ExtResource("1_87hqt")]

View File

@ -1,9 +1,8 @@
[gd_scene load_steps=79 format=4 uid="uid://dddu0t2sdcy8h"]
[gd_scene load_steps=78 format=4 uid="uid://dddu0t2sdcy8h"]
[ext_resource type="Script" path="res://scenes/maps/base/map_loader.gd" id="1_innhj"]
[ext_resource type="Script" path="res://scenes/maps/base/spawn_controller.gd" id="2_1ss1b"]
[ext_resource type="PackedScene" uid="uid://cdcbn8mglqlyh" path="res://scenes/maps/tools/hit_detector.tscn" id="3_hjypr"]
[ext_resource type="PackedScene" uid="uid://b7vj5j6wxqrfr" path="res://scenes/characters/npc/zombie/zombie.tscn" id="4_32d4x"]
[ext_resource type="PackedScene" uid="uid://ddwrs0so7swxn" path="res://scenes/characters/y-bot/character.tscn" id="3_nqyim"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_umuqw"]
resource_name = "Material_146"
@ -758,7 +757,6 @@ ambient_light_source = 3
ambient_light_color = Color(1, 1, 1, 1)
reflected_light_source = 2
glow_enabled = true
fog_enabled = true
fog_density = 0.103
fog_height = 1.5
fog_height_density = 2.0
@ -1026,8 +1024,5 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -42.595, -0.0187502, -17.3639
environment = SubResource("Environment_3ha0j")
camera_attributes = SubResource("CameraAttributesPractical_402xp")
[node name="HitDetector" parent="." instance=ExtResource("3_hjypr")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 32.1837, 9.29777, -7.02714)
[node name="Zombie" parent="." instance=ExtResource("4_32d4x")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 32.4367, -0.00937653, -3.80586)
[node name="Character" parent="." instance=ExtResource("3_nqyim")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.46435, -0.00937462, 0.132427)

View File

@ -3,14 +3,10 @@ class_name HitDetector
var health = 5
@export var color: Color = Color(0, 0, 0)
@export var color: Color = Color(0.0, 0.0, 0.0, 0)
var colors = [Color(1.0, 0.0, 0.0, 1.0),
Color(0.0, 1.0, 0.0, 1.0),
Color(0.0, 0.0, 1.0, 0.0)]
func hit(damage: int):
color = Color(randf(), randf(), randf())
color = Color(randf(), randf(), randf(), randi())
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
@ -19,6 +15,6 @@ func _ready() -> void:
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
material_override.albedo_color = color
material.albedo_color = color
if health < 1:
queue_free()

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=5 format=3 uid="uid://cdcbn8mglqlyh"]
[gd_scene load_steps=4 format=3 uid="uid://cdcbn8mglqlyh"]
[ext_resource type="Script" path="res://scenes/maps/tools/hit_detector.gd" id="1_4w4v8"]
@ -7,9 +7,7 @@ properties/0/path = NodePath("Box:color")
properties/0/spawn = true
properties/0/replication_mode = 1
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_petk4"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_5m44n"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_r26tj"]
[node name="HitDetector" type="Node3D"]
@ -17,8 +15,7 @@ properties/0/replication_mode = 1
replication_config = SubResource("SceneReplicationConfig_8tws6")
[node name="Box" type="CSGBox3D" parent="." groups=["target"]]
material_override = SubResource("StandardMaterial3D_petk4")
use_collision = true
collision_layer = 9
material = SubResource("StandardMaterial3D_5m44n")
material = SubResource("StandardMaterial3D_r26tj")
script = ExtResource("1_4w4v8")

View File

@ -1,6 +1,8 @@
extends Node3D
class_name PlayerPlaceholder
@export var health: int = 100
@onready var character_node: CharacterWrapper = $ServerControlledNode/Character
@export var owner_id: int = 0
@export var initial_position: Vector3 = Vector3(0, 0, 0)
# -- Components
@ -22,7 +24,7 @@ func _ready() -> void:
$PlayerControlledNode/CameraMount.set_multiplayer_authority(owner_id)
switch_players_camera.rpc_id(owner_id)
server_node.global_position = initial_position
character_node.set_owner_placeholder($".")
client_node.global_position = server_node.global_position
client_node.rotation.y = server_node.rotation.y
client_node.rotation.x = server_node.rotation.x
@ -48,7 +50,13 @@ func _process(delta: float) -> void:
pass
func _physics_process(delta: float) -> void:
pass
if character_node != null:
if health < 1:
character_node.die()
character_node = null
func take_damage(damage: int):
health -= damage
@rpc("authority", "call_local", "reliable")
func switch_players_camera():

View File

@ -3,7 +3,7 @@
[ext_resource type="Script" path="res://scenes/player/player_input_controller.gd" id="1_m6tul"]
[ext_resource type="Script" path="res://scenes/player/placeholder.gd" id="1_ts455"]
[ext_resource type="Texture2D" uid="uid://oopj5mj1vdp0" path="res://assets/crosshairs/crosshair_default.png" id="3_8ulsx"]
[ext_resource type="PackedScene" uid="uid://1txob6jskn5s" path="res://scenes/characters/blue/dummy.tscn" id="5_16l76"]
[ext_resource type="PackedScene" uid="uid://ddwrs0so7swxn" path="res://scenes/characters/y-bot/character.tscn" id="4_ewxcr"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_taqso"]
radius = 0.4
@ -106,6 +106,9 @@ properties/6/replication_mode = 1
properties/7/path = NodePath("ServerControlledNode/BulletStartingPoint:rotation")
properties/7/spawn = true
properties/7/replication_mode = 1
properties/8/path = NodePath(".:health")
properties/8/spawn = true
properties/8/replication_mode = 1
[node name="Placeholder" type="Node3D"]
script = ExtResource("1_ts455")
@ -220,10 +223,9 @@ shape = SubResource("CapsuleShape3D_taqso")
[node name="BulletStartingPoint" type="Node3D" parent="ServerControlledNode"]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 1.287, -0.37786)
[node name="Dummy" parent="ServerControlledNode" instance=ExtResource("5_16l76")]
visible = false
[node name="CameraMount" type="Node3D" parent="ServerControlledNode"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.15245, -0.0611187)
[node name="Character" parent="ServerControlledNode" instance=ExtResource("4_ewxcr")]
[connection signal="timeout" from="Timer" to="." method="_on_timer_timeout"]

View File

@ -261,8 +261,6 @@ func _shoot():
var collider := aim_ray.get_collider()
if collider != null and collider.is_in_group("target"):
aim_ray.get_collider().take_damage()
if collider != null and collider.is_in_group("body"):
collider.hit(50)
var root := get_tree().get_root()
gun_with_hands.shoot()
cant_shoot = true
@ -288,6 +286,7 @@ func _get_camera_collision():
return ray_end
func take_damage(dam: int):
print("takin damage")
var new_health = health - dam
set_health(new_health)
if multiplayer.is_server():