pull/28/head
Sascha 2025-08-12 20:31:12 +07:00
parent 0a33780205
commit 0a09dc4beb
28 changed files with 775 additions and 465 deletions

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
<mapping directory="/mnt/Daten/coding/godot/schildderstärke" vcs="Git" />
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

@ -1,5 +1,5 @@
{
"godotTools.editorPath.godot4": "c:\\Program Files\\Godot\\Godot_v4.5-beta4_win64.exe",
"godotTools.editorPath.godot4": "/home/sascha/Godot/Godot_v4.5-beta5_linux.x86_64",
"git.alwaysShowStagedChangesResourceGroup": false,
"git.enableCommitSigning": true
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -31701,13 +31701,11 @@ states/Jump_Start/position = Vector2(658, 283)
transitions = ["Start", "IWR", SubResource("AnimationNodeStateMachineTransition_l0xk8"), "IWR", "Death_A", SubResource("AnimationNodeStateMachineTransition_0pn5a"), "IWR", "Interact", SubResource("AnimationNodeStateMachineTransition_ddrtj"), "Interact", "IWR", SubResource("AnimationNodeStateMachineTransition_vokpi"), "IWR", "1h_slice_diagonal", SubResource("AnimationNodeStateMachineTransition_w32h3"), "1h_slice_diagonal", "IWR", SubResource("AnimationNodeStateMachineTransition_x8rkg"), "IWR", "1h_attack_chop", SubResource("AnimationNodeStateMachineTransition_ai0h0"), "1h_attack_chop", "IWR", SubResource("AnimationNodeStateMachineTransition_flmvj"), "IWR", "1h_slice_horizontal", SubResource("AnimationNodeStateMachineTransition_hnfj8"), "1h_slice_horizontal", "IWR", SubResource("AnimationNodeStateMachineTransition_17t07"), "IWR", "Jump_Start", SubResource("AnimationNodeStateMachineTransition_4j7ud"), "Jump_Start", "Jump_Idle", SubResource("AnimationNodeStateMachineTransition_mgjn7"), "Jump_Idle", "Jump_Land", SubResource("AnimationNodeStateMachineTransition_eh75m"), "Jump_Land", "IWR", SubResource("AnimationNodeStateMachineTransition_qllfg"), "IWR", "Jump_Idle", SubResource("AnimationNodeStateMachineTransition_vq1x0"), "IWR", "Blocking", SubResource("AnimationNodeStateMachineTransition_pnrta"), "Blocking", "IWR", SubResource("AnimationNodeStateMachineTransition_hku22"), "Blocking", "Block_Hit", SubResource("AnimationNodeStateMachineTransition_ghj3a"), "Block_Hit", "Blocking", SubResource("AnimationNodeStateMachineTransition_os6oe"), "Blocking", "Block_Attack", SubResource("AnimationNodeStateMachineTransition_dips5"), "Block_Attack", "Blocking", SubResource("AnimationNodeStateMachineTransition_ar41x"), "Block_Attack", "IWR", SubResource("AnimationNodeStateMachineTransition_sxuk5"), "IWR", "Hit_A", SubResource("AnimationNodeStateMachineTransition_skg6m"), "Hit_A", "IWR", SubResource("AnimationNodeStateMachineTransition_sufwf"), "IWR", "Hit_B", SubResource("AnimationNodeStateMachineTransition_5gf1y"), "Hit_B", "IWR", SubResource("AnimationNodeStateMachineTransition_gjm3q"), "IWR", "Death_B", SubResource("AnimationNodeStateMachineTransition_vc3og")]
graph_offset = Vector2(-318, -48.186)
[node name="Knight" type="CharacterBody3D" node_paths=PackedStringArray("spring_arm", "model") groups=["player"]]
[node name="Knight" type="CharacterBody3D" groups=["player"]]
transform = Transform3D(0.8, 0, 0, 0, 0.8, 0, 0, 0, 0.8, 0, 0, 0)
collision_layer = 4
collision_mask = 25
script = ExtResource("1_kj8gh")
spring_arm = NodePath("SpringArm3D")
model = NodePath("Rig")
[node name="Navigation_CollisionShape" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.2, 0)
@ -31728,43 +31726,43 @@ bones/0/name = "root"
bones/0/parent = -1
bones/0/rest = Transform3D(1, 0, 2.38419e-07, 0, 1, 0, -2.38419e-07, 0, 1, 0, 0, 0)
bones/0/enabled = true
bones/0/position = Vector3(0, 0.00014053543, 0)
bones/0/position = Vector3(0, 0.0002437637, 0)
bones/0/rotation = Quaternion(-2.1973744e-11, -0.000638415, -3.8059562e-11, 0.9999998)
bones/0/scale = Vector3(1, 1, 1)
bones/1/name = "hips"
bones/1/parent = 0
bones/1/rest = Transform3D(1, 0, -2.38419e-07, 0, 1, 0, 2.38419e-07, 0, 1, 0, 0.405663, 0)
bones/1/enabled = true
bones/1/position = Vector3(3.6406747e-19, 0.38125348, 1.4381516e-18)
bones/1/rotation = Quaternion(0.002150177, 0.042223994, -5.894737e-06, 0.9991059)
bones/1/position = Vector3(9.497293e-19, 0.38813215, 2.66826e-19)
bones/1/rotation = Quaternion(0.0021075443, 0.042223834, -4.0831505e-06, 0.99910605)
bones/1/scale = Vector3(1, 1, 1)
bones/2/name = "spine"
bones/2/parent = 1
bones/2/rest = Transform3D(1, 0, 1.42109e-14, 0, 1, 0, -1.42109e-14, 0, 1, 0, 0.191978, 0)
bones/2/enabled = true
bones/2/position = Vector3(0, 0.191978, 0)
bones/2/rotation = Quaternion(0.0025062335, -0.00060442404, 1.4894359e-06, 0.9999967)
bones/2/rotation = Quaternion(0.0024995934, 0.0013235669, -0.0001541548, 0.99999607)
bones/2/scale = Vector3(1, 1, 1)
bones/3/name = "chest"
bones/3/parent = 2
bones/3/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.374988, 0)
bones/3/enabled = true
bones/3/position = Vector3(0, 0.374988, 0)
bones/3/rotation = Quaternion(0.0009533176, 0.00017604706, -0.00015982457, 0.9999995)
bones/3/rotation = Quaternion(0.000941912, 0.00020751615, 1.9329798e-06, 0.9999995)
bones/3/scale = Vector3(1, 1, 1)
bones/4/name = "upperarm.l"
bones/4/parent = 3
bones/4/rest = Transform3D(0.0572842, 0.998357, -3.57628e-07, -3.57628e-07, 4.76837e-07, 1, 0.998357, -0.0572841, 4.76837e-07, 0.212007, 0.134132, 8.40246e-08)
bones/4/enabled = true
bones/4/position = Vector3(0.21164604, 0.13374294, -0.000974262)
bones/4/rotation = Quaternion(-0.559113, -0.065407015, -0.6520691, 0.5078587)
bones/4/position = Vector3(0.21183969, 0.13383988, -0.0010265693)
bones/4/rotation = Quaternion(-0.5642994, -0.063032076, -0.6384719, 0.5195641)
bones/4/scale = Vector3(0.999999, 0.999999, 1)
bones/5/name = "lowerarm.l"
bones/5/parent = 4
bones/5/rest = Transform3D(0.993887, 0.110402, -1.19007e-07, -0.110402, 0.993887, 3.28831e-09, 1.18643e-07, 9.87045e-09, 1, -3.21966e-09, 0.241897, -1.19406e-07)
bones/5/enabled = true
bones/5/position = Vector3(-3.21966e-09, 0.241897, -1.19406e-07)
bones/5/rotation = Quaternion(2.9125124e-08, -5.490448e-08, -0.47540045, 0.8797696)
bones/5/rotation = Quaternion(3.362798e-08, -5.752714e-08, -0.5015191, 0.86514664)
bones/5/scale = Vector3(1, 1, 1)
bones/6/name = "wrist.l"
bones/6/parent = 5
@ -31778,14 +31776,14 @@ bones/7/parent = 6
bones/7/rest = Transform3D(1, 1.09104e-05, 2.66204e-07, -1.09104e-05, 1, -2.40181e-09, -2.66204e-07, 2.39891e-09, 1, 9.08162e-13, 0.0738258, 2.22045e-16)
bones/7/enabled = true
bones/7/position = Vector3(9.08162e-13, 0.0738258, 2.22045e-16)
bones/7/rotation = Quaternion(-0.30997488, -0.33169147, 0.12663393, 0.8819638)
bones/7/rotation = Quaternion(-0.31416693, -0.3306734, 0.14101787, 0.87867415)
bones/7/scale = Vector3(1, 1, 1)
bones/8/name = "handslot.l"
bones/8/parent = 7
bones/8/rest = Transform3D(-1.19209e-07, 1, -2.22045e-16, -1, -1.19209e-07, -4.55307e-09, -4.55307e-09, -2.22045e-16, 1, 8.34815e-10, 0.0961251, -0.0575001)
bones/8/enabled = true
bones/8/position = Vector3(-1.695765e-09, 0.0961252, -0.0575)
bones/8/rotation = Quaternion(0.00037105524, 0.0025946489, -0.6976476, 0.7164363)
bones/8/rotation = Quaternion(-0.0010980972, 0.0011924243, -0.70297664, 0.71121114)
bones/8/scale = Vector3(1, 1, 1)
bones/9/name = "1H_Sword_Offhand"
bones/9/parent = 8
@ -31826,15 +31824,15 @@ bones/14/name = "upperarm.r"
bones/14/parent = 3
bones/14/rest = Transform3D(0.0572841, -0.998357, 4.47035e-07, 5.06639e-07, 4.17232e-07, 1, -0.998357, -0.0572842, 4.76837e-07, -0.212007, 0.134132, 8.40246e-08)
bones/14/enabled = true
bones/14/position = Vector3(-0.21180826, 0.13382415, -0.0010180731)
bones/14/rotation = Quaternion(-0.61663836, 0.085415535, 0.62646276, 0.46904776)
bones/14/position = Vector3(-0.21161461, 0.13372721, -0.0009657647)
bones/14/rotation = Quaternion(-0.6217154, 0.08091892, 0.61135864, 0.48286915)
bones/14/scale = Vector3(0.999999, 0.999999, 1)
bones/15/name = "lowerarm.r"
bones/15/parent = 14
bones/15/rest = Transform3D(0.993887, -0.110402, 1.19007e-07, 0.110402, 0.993887, 3.28831e-09, -1.18643e-07, 9.87045e-09, 1, -7.12186e-11, 0.241897, -1.19406e-07)
bones/15/enabled = true
bones/15/position = Vector3(-7.12186e-11, 0.241897, -1.19406e-07)
bones/15/rotation = Quaternion(-9.942978e-11, 5.7771533e-08, 0.49996057, 0.86604816)
bones/15/rotation = Quaternion(2.2416012e-08, 4.7645823e-08, 0.5239009, 0.8517793)
bones/15/scale = Vector3(1, 1, 1)
bones/16/name = "wrist.r"
bones/16/parent = 15
@ -31848,14 +31846,14 @@ bones/17/parent = 16
bones/17/rest = Transform3D(1, -1.09104e-05, -1.78637e-07, 1.09104e-05, 1, -2.40084e-09, 1.78637e-07, 2.39889e-09, 1, 1.33227e-15, 0.0738258, 2.22045e-16)
bones/17/enabled = true
bones/17/position = Vector3(1.33227e-15, 0.0738258, 2.22045e-16)
bones/17/rotation = Quaternion(-0.30761233, 0.30569842, -0.2079677, 0.87673986)
bones/17/rotation = Quaternion(-0.31240138, 0.30759928, -0.22043851, 0.87131804)
bones/17/scale = Vector3(1, 1, 1)
bones/18/name = "handslot.r"
bones/18/parent = 17
bones/18/rest = Transform3D(-1.19209e-07, -1, 2.22045e-16, 1, -1.19209e-07, -4.55301e-09, 4.55301e-09, -2.22045e-16, 1, -8.34815e-10, 0.0961251, -0.0575001)
bones/18/enabled = true
bones/18/position = Vector3(-1.4181621e-08, 0.0961251, -0.0575)
bones/18/rotation = Quaternion(0.00288088, 0.003609095, 0.6994344, 0.7146819)
bones/18/rotation = Quaternion(-0.000722094, -0.00065644423, 0.7032415, 0.71095043)
bones/18/scale = Vector3(1, 1, 1)
bones/19/name = "1H_Sword"
bones/19/parent = 18
@ -31876,7 +31874,7 @@ bones/21/parent = 3
bones/21/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.268797, 0)
bones/21/enabled = true
bones/21/position = Vector3(0, 0.268797, 0)
bones/21/rotation = Quaternion(-0.0028465556, -0.030465301, -0.00017991973, 0.9995318)
bones/21/rotation = Quaternion(-0.002863213, -0.031277914, -0.0001311412, 0.99950665)
bones/21/scale = Vector3(1, 1, 1)
bones/22/name = "Knight_Helmet"
bones/22/parent = 21
@ -31896,71 +31894,71 @@ bones/24/name = "upperleg.l"
bones/24/parent = 1
bones/24/rest = Transform3D(1, -1.42215e-07, -2.65602e-08, -1.43052e-07, -0.999396, -0.0347412, -2.16035e-08, 0.0347411, -0.999398, 0.170945, 0.113587, 1.39233e-08)
bones/24/enabled = true
bones/24/position = Vector3(0.170945, 0.113587, 0.00057042035)
bones/24/rotation = Quaternion(0.99204415, 0.08068581, 0.07546906, 0.0603542)
bones/24/position = Vector3(0.170945, 0.113587, -0.000105813386)
bones/24/rotation = Quaternion(0.99345654, 0.0811756, 0.07348098, 0.03248293)
bones/24/scale = Vector3(1, 1, 1)
bones/25/name = "lowerleg.l"
bones/25/parent = 24
bones/25/rest = Transform3D(1, 1.6129e-07, 1.20856e-07, -1.3212e-07, 0.977433, -0.211248, -1.52201e-07, 0.211248, 0.977433, 3.57982e-09, 0.227077, -6.13986e-09)
bones/25/enabled = true
bones/25/position = Vector3(3.57982e-09, 0.227077, -6.13986e-09)
bones/25/rotation = Quaternion(0.32404235, 6.3634864e-08, -2.2536847e-07, 0.9460426)
bones/25/rotation = Quaternion(0.24327531, 6.3616234e-08, -1.702651e-07, 0.9699573)
bones/25/scale = Vector3(1, 1, 1)
bones/26/name = "foot.l"
bones/26/parent = 25
bones/26/rest = Transform3D(1, 4.64335e-08, 6.01239e-08, -7.59277e-08, 0.585515, 0.810661, 2.4383e-09, -0.810662, 0.585514, 1.83222e-10, 0.149437, 9.66537e-10)
bones/26/enabled = true
bones/26/position = Vector3(1.83222e-10, 0.149437, 9.66537e-10)
bones/26/rotation = Quaternion(-0.5754419, -0.20132868, 0.05900708, 0.79047567)
bones/26/rotation = Quaternion(-0.5418797, -0.20360991, 0.049623527, 0.8139085)
bones/26/scale = Vector3(1, 1, 0.999999)
bones/27/name = "toes.l"
bones/27/parent = 26
bones/27/rest = Transform3D(-1, -1.75424e-09, 1.51741e-07, -1.10452e-07, 0.694106, -0.719873, -1.04062e-07, -0.719873, -0.694106, -2.1306e-10, 0.16565, 5.17174e-09)
bones/27/enabled = true
bones/27/position = Vector3(-2.1306e-10, 0.16565, 5.17174e-09)
bones/27/rotation = Quaternion(-1.0198054e-08, 0.9203551, -0.39108407, 7.81167e-08)
bones/27/rotation = Quaternion(-1.0076592e-08, 0.92022187, -0.3913972, 7.810878e-08)
bones/27/scale = Vector3(1, 1, 1)
bones/28/name = "upperleg.r"
bones/28/parent = 1
bones/28/rest = Transform3D(1, 1.49611e-07, -6.08626e-08, 1.47406e-07, -0.999396, -0.0347412, -6.60234e-08, 0.0347411, -0.999398, -0.170945, 0.113587, 1.39233e-08)
bones/28/enabled = true
bones/28/position = Vector3(-0.170945, 0.113587, -0.00057038915)
bones/28/rotation = Quaternion(0.99463373, -0.030836096, 0.029874805, 0.09412949)
bones/28/position = Vector3(-0.170945, 0.113587, 0.000105844934)
bones/28/rotation = Quaternion(0.9960918, -0.029753873, 0.030318597, 0.07743766)
bones/28/scale = Vector3(1, 1, 1)
bones/29/name = "lowerleg.r"
bones/29/parent = 28
bones/29/rest = Transform3D(1, -1.6129e-07, -1.20856e-07, 1.3212e-07, 0.977433, -0.211248, 1.52201e-07, 0.211248, 0.977433, -3.57982e-09, 0.227077, -6.13986e-09)
bones/29/enabled = true
bones/29/position = Vector3(-3.57982e-09, 0.227077, -6.13986e-09)
bones/29/rotation = Quaternion(0.3606838, -6.1874765e-08, 2.5102509e-07, 0.93268824)
bones/29/rotation = Quaternion(0.3265183, -6.343523e-08, 2.2676572e-07, 0.9451909)
bones/29/scale = Vector3(1, 1, 1)
bones/30/name = "foot.r"
bones/30/parent = 29
bones/30/rest = Transform3D(1, -1.55132e-07, 2.93521e-07, -1.47115e-07, 0.585515, 0.810661, -2.97621e-07, -0.810662, 0.585514, -1.83221e-10, 0.149437, 9.66542e-10)
bones/30/enabled = true
bones/30/position = Vector3(-1.83221e-10, 0.149437, 9.66542e-10)
bones/30/rotation = Quaternion(-0.60487497, 0.11134049, -0.015335035, 0.7883493)
bones/30/rotation = Quaternion(-0.57683736, 0.11186066, -0.011214538, 0.809086)
bones/30/scale = Vector3(1, 1, 0.999999)
bones/31/name = "toes.r"
bones/31/parent = 30
bones/31/rest = Transform3D(-1, 1.75425e-09, -1.51741e-07, 1.10452e-07, 0.694106, -0.719873, 1.04062e-07, -0.719873, -0.694106, 2.13058e-10, 0.16565, 5.17174e-09)
bones/31/enabled = true
bones/31/position = Vector3(2.13058e-10, 0.16565, 5.17174e-09)
bones/31/rotation = Quaternion(2.9855265e-08, 0.91963625, -0.39277142, -6.948212e-08)
bones/31/rotation = Quaternion(3.036425e-08, 0.9203551, -0.39108407, -6.9542686e-08)
bones/31/scale = Vector3(1, 1, 1)
bones/32/name = "kneeIK.l"
bones/32/parent = 0
bones/32/rest = Transform3D(1, -2.59151e-07, -3.89414e-07, -3.89414e-07, 0, -1, 2.59151e-07, 1, 0, 0.170945, 0.29231, 0.575812)
bones/32/enabled = true
bones/32/position = Vector3(0.170945, 0.29417834, 0.57768035)
bones/32/position = Vector3(0.170945, 0.29395023, 0.57745224)
bones/32/rotation = Quaternion(0.7071068, -2.2930195e-07, -4.605519e-08, 0.7071068)
bones/32/scale = Vector3(1, 1, 1)
bones/33/name = "control-toe-roll.l"
bones/33/parent = 0
bones/33/rest = Transform3D(1, 1.99485e-07, -3.55271e-14, 3.55271e-14, 0, 1, 1.99485e-07, -1, 0, 0.170945, 0.0259903, 0.245789)
bones/33/enabled = true
bones/33/position = Vector3(0.20149983, 0.02648736, 0.2002749)
bones/33/rotation = Quaternion(-0.6969236, -7.1386694e-08, -6.966377e-08, 0.7171454)
bones/33/position = Vector3(0.20149983, 0.025736796, 0.2065412)
bones/33/rotation = Quaternion(-0.7069235, -7.0546484e-08, -7.05101e-08, 0.70729)
bones/33/scale = Vector3(1, 1, 1)
bones/34/name = "control-heel-roll.l"
bones/34/parent = 33
@ -32001,15 +31999,15 @@ bones/39/name = "kneeIK.r"
bones/39/parent = 0
bones/39/rest = Transform3D(1, -2.59151e-07, 1.50996e-07, 1.50996e-07, 0, -1, 2.59151e-07, 1, 0, -0.170945, 0.29231, 0.575812)
bones/39/enabled = true
bones/39/position = Vector3(-0.170945, 0.29417834, 0.57768035)
bones/39/position = Vector3(-0.170945, 0.29395023, 0.57745224)
bones/39/rotation = Quaternion(0.7071068, -3.823849e-08, 1.4500897e-07, 0.7071068)
bones/39/scale = Vector3(1, 1, 1)
bones/40/name = "control-toe-roll.r"
bones/40/parent = 0
bones/40/rest = Transform3D(1, 1.99485e-07, 0, 0, 0, 1, 1.99485e-07, -1, 0, -0.170945, 0.0259903, 0.245789)
bones/40/enabled = true
bones/40/position = Vector3(-0.170945, 0.025172958, 0.24447253)
bones/40/rotation = Quaternion(-0.70611846, -7.062541e-08, -7.04294e-08, 0.70809376)
bones/40/position = Vector3(-0.170945, 0.026971472, 0.23711088)
bones/40/rotation = Quaternion(-0.6949559, -7.186032e-08, -6.916646e-08, 0.71905243)
bones/40/scale = Vector3(1, 1, 1)
bones/41/name = "control-heel-roll.r"
bones/41/parent = 40
@ -32057,8 +32055,8 @@ bones/47/name = "handIK.l"
bones/47/parent = 0
bones/47/rest = Transform3D(-2.38419e-07, 1, 0, 0, 0, 1, 1, 2.38419e-07, 0, 0.713181, 1.10676, 2.54914e-07)
bones/47/enabled = true
bones/47/position = Vector3(0.52067727, 0.7694862, -0.052982565)
bones/47/rotation = Quaternion(0.7997721, 0.011139648, 0.60019785, 0.0017665469)
bones/47/position = Vector3(0.52067727, 0.7865253, -0.053098496)
bones/47/rotation = Quaternion(0.7996751, 0.011015488, 0.60032946, 0.0017332288)
bones/47/scale = Vector3(1, 1, 1)
bones/48/name = "elbowIK.r"
bones/48/parent = 0
@ -32071,12 +32069,12 @@ bones/49/name = "handIK.r"
bones/49/parent = 0
bones/49/rest = Transform3D(1.19209e-07, -1, -1.19209e-07, 0, -1.19209e-07, 1, -1, -1.19209e-07, 0, -0.713182, 1.10676, -8.51573e-08)
bones/49/enabled = true
bones/49/position = Vector3(-0.5107404, 0.7694862, 0.06251216)
bones/49/rotation = Quaternion(0.7642572, -0.010505465, -0.64482236, 0.002165003)
bones/49/position = Vector3(-0.5107404, 0.7865253, 0.062396146)
bones/49/rotation = Quaternion(0.7641528, -0.0103831915, -0.6449481, 0.0021248688)
bones/49/scale = Vector3(1, 1, 1)
[node name="1H_Sword_Offhand" type="BoneAttachment3D" parent="Rig/Skeleton3D"]
transform = Transform3D(-0.015049586, 0.2677652, 0.96336627, 0.99983937, -0.0052937283, 0.017091671, 0.009676961, 0.96346873, -0.26764208, 0.5156648, 0.6181228, 0.0015728083)
transform = Transform3D(-0.0139374025, 0.26635683, 0.9637731, 0.9998758, 0.010773339, 0.011482892, -0.0073242015, 0.96381366, -0.26647344, 0.5150406, 0.63604933, 0.0038526263)
visible = false
bone_name = "1H_Sword_Offhand"
bone_idx = 9
@ -32086,7 +32084,7 @@ mesh = SubResource("ArrayMesh_rvosg")
skeleton = NodePath("")
[node name="Badge_Shield" type="BoneAttachment3D" parent="Rig/Skeleton3D"]
transform = Transform3D(-0.015049551, 0.26776502, 0.9633663, 0.99983937, -0.0052962666, 0.017092336, 0.009679582, 0.9634688, -0.26764187, 0.6658392, 0.6207872, -0.04014858)
transform = Transform3D(-0.013937371, 0.26635665, 0.96377313, 0.99987584, 0.010770801, 0.011483561, -0.00732158, 0.9638137, -0.26647323, 0.6652783, 0.6378394, -0.037686586)
visible = false
bone_name = "Badge_Shield"
bone_idx = 10
@ -32096,7 +32094,7 @@ mesh = SubResource("ArrayMesh_0xags")
skeleton = NodePath("")
[node name="Rectangle_Shield" type="BoneAttachment3D" parent="Rig/Skeleton3D"]
transform = Transform3D(-0.015049551, 0.26776502, 0.9633663, 0.99983937, -0.0052962666, 0.017092336, 0.009679582, 0.9634688, -0.26764187, 0.6658392, 0.6207872, -0.04014858)
transform = Transform3D(-0.013937371, 0.26635665, 0.96377313, 0.99987584, 0.010770801, 0.011483561, -0.00732158, 0.9638137, -0.26647323, 0.6652783, 0.6378394, -0.037686586)
visible = false
bone_name = "Rectangle_Shield"
bone_idx = 11
@ -32106,7 +32104,7 @@ mesh = SubResource("ArrayMesh_qr44s")
skeleton = NodePath("")
[node name="Round_Shield" type="BoneAttachment3D" parent="Rig/Skeleton3D"]
transform = Transform3D(-0.015049551, 0.26776502, 0.9633663, 0.99983937, -0.0052962666, 0.017092336, 0.009679582, 0.9634688, -0.26764187, 0.6658392, 0.6207872, -0.04014858)
transform = Transform3D(-0.013937371, 0.26635665, 0.96377313, 0.99987584, 0.010770801, 0.011483561, -0.00732158, 0.9638137, -0.26647323, 0.6652783, 0.6378394, -0.037686586)
bone_name = "Round_Shield"
bone_idx = 12
@ -32115,7 +32113,7 @@ mesh = SubResource("ArrayMesh_bb24p")
skeleton = NodePath("")
[node name="Spike_Shield" type="BoneAttachment3D" parent="Rig/Skeleton3D"]
transform = Transform3D(-0.015049551, 0.26776502, 0.9633663, 0.99983937, -0.0052962666, 0.017092336, 0.009679582, 0.9634688, -0.26764187, 0.6658392, 0.6207872, -0.04014858)
transform = Transform3D(-0.013937371, 0.26635665, 0.96377313, 0.99987584, 0.010770801, 0.011483561, -0.00732158, 0.9638137, -0.26647323, 0.6652783, 0.6378394, -0.037686586)
bone_name = "Spike_Shield"
bone_idx = 13
@ -32124,7 +32122,7 @@ mesh = SubResource("ArrayMesh_jnwr3")
skeleton = NodePath("")
[node name="1H_Sword" type="BoneAttachment3D" parent="Rig/Skeleton3D"]
transform = Transform3D(0.011193838, -0.17062251, 0.9852722, 0.9999358, 0.00048182314, -0.011278062, 0.001449997, 0.98533547, 0.17061667, -0.49953735, 0.62163496, 0.14066279)
transform = Transform3D(0.015426677, -0.1609513, 0.9868411, 0.9998449, 0.010797168, -0.013869914, -0.008422304, 0.9869024, 0.16109234, -0.50000477, 0.64089423, 0.14236996)
bone_name = "1H_Sword"
bone_idx = 19
@ -32143,7 +32141,7 @@ shape = SubResource("CapsuleShape3D_nge0l")
disabled = true
[node name="2H_Sword" type="BoneAttachment3D" parent="Rig/Skeleton3D"]
transform = Transform3D(0.011193823, -0.17062251, 0.9852722, 0.9999358, 0.0004818084, -0.011278049, 0.0014500092, 0.98533547, 0.17061667, -0.49953735, 0.62163496, 0.14066279)
transform = Transform3D(0.015426662, -0.1609513, 0.9868411, 0.9998449, 0.010797153, -0.0138699, -0.008422291, 0.9869024, 0.16109234, -0.50000477, 0.64089423, 0.14236996)
bone_name = "2H_Sword"
bone_idx = 20
@ -32152,7 +32150,7 @@ mesh = SubResource("ArrayMesh_ys2n7")
skeleton = NodePath("")
[node name="Knight_Helmet" type="BoneAttachment3D" parent="Rig/Skeleton3D"]
transform = Transform3D(0.99977034, 0.0011376548, 0.021400176, -0.0010204955, 0.9999845, -0.005484817, -0.02140607, 0.0054617194, 0.99975586, 0.0005204348, 1.1915882, 0.0071707955)
transform = Transform3D(0.9997187, 0.0010152785, 0.02369085, -0.00088914554, 0.9999854, -0.005334071, -0.023695912, 0.005311506, 0.999705, 0.00063757086, 1.1985708, 0.007078468)
bone_name = "Knight_Helmet"
bone_idx = 22
@ -32171,7 +32169,7 @@ transform = Transform3D(-0.999711, 2.27778e-05, 0.024046, 5.34939e-07, 1, -0.000
shape = SubResource("CapsuleShape3D_i3cyd")
[node name="Knight_Cape" type="BoneAttachment3D" parent="Rig/Skeleton3D"]
transform = Transform3D(0.9966117, 0.0010734616, 0.08224274, -0.00015146508, 0.9999371, -0.011216093, -0.0822496, 0.011165633, 0.9965491, 0.0005215872, 1.1915886, 0.007025121)
transform = Transform3D(0.9962818, 0.0010680342, 0.08614643, -0.00011263996, 0.9999385, -0.011094455, -0.08615297, 0.0110435, 0.99622065, 0.0006357368, 1.1985713, 0.006932077)
visible = false
bone_name = "Knight_Cape"
bone_idx = 23

@ -44,7 +44,6 @@ blend_shape_mode = 0
shadow_mesh = SubResource("ArrayMesh_55kdo")
[node name="Projectile" type="Node3D"]
transform = Transform3D(-4.371139e-08, -1, 0, 1, -4.371139e-08, 0, 0, 0, 1, 0, 0, 0)
script = ExtResource("1_82dr7")
[node name="arrow" type="MeshInstance3D" parent="."]

@ -31230,7 +31230,6 @@ collision_layer = 4
collision_mask = 25
script = ExtResource("1_neebp")
arrow_scene = ExtResource("2_7uuak")
loaded = true
spring_arm = NodePath("SpringArm3D")
maximum_health = 20
maximum_stamina = 100
@ -31255,43 +31254,43 @@ bones/0/name = "root"
bones/0/parent = -1
bones/0/rest = Transform3D(1, 0, 2.3841855e-07, 0, 1, 0, -2.3841855e-07, 0, 1, 0, 0, 0)
bones/0/enabled = true
bones/0/position = Vector3(0, 0, 0)
bones/0/rotation = Quaternion(-2.8600409e-09, -0.21643952, -1.2900808e-08, 0.97629607)
bones/0/position = Vector3(0, 0.00013663707, 0)
bones/0/rotation = Quaternion(-1.0940686e-11, 0.00031804445, 1.8949824e-11, 1)
bones/0/scale = Vector3(1, 1, 1)
bones/1/name = "hips"
bones/1/parent = 0
bones/1/rest = Transform3D(1, 0, -2.3841855e-07, 0, 1, 0, 2.3841855e-07, 0, 1, 0, 0.40566343, 0)
bones/1/enabled = true
bones/1/position = Vector3(-1.7763568e-15, 0.39206383, -4.2351642e-22)
bones/1/rotation = Quaternion(-3.2009018e-09, -0.1826899, -1.1047754e-08, 0.98317057)
bones/1/position = Vector3(-6.3228814e-20, 0.3844245, -1.5074922e-26)
bones/1/rotation = Quaternion(0.0004105097, 0.04297279, -5.994663e-05, 0.99907625)
bones/1/scale = Vector3(1, 1, 1)
bones/2/name = "spine"
bones/2/parent = 1
bones/2/rest = Transform3D(1, 0, 1.4210855e-14, 0, 1, 0, -1.4210855e-14, 0, 1, 0, 0.1919775, 0)
bones/2/enabled = true
bones/2/position = Vector3(0, 0.1919775, 0)
bones/2/rotation = Quaternion(0.028270612, -0.22488676, -0.04717921, 0.97283137)
bones/2/rotation = Quaternion(0.00048524613, 0.000382297, -4.34367e-06, 0.9999998)
bones/2/scale = Vector3(1, 1, 1)
bones/3/name = "chest"
bones/3/parent = 2
bones/3/rest = Transform3D(1, 0, 0, 0, 0.99999994, 0, 0, 0, 1, 0, 0.37498796, 0)
bones/3/enabled = true
bones/3/position = Vector3(0, 0.37498796, 0)
bones/3/rotation = Quaternion(-2.0235038e-09, 0.3907311, 2.8329053e-08, 0.92050487)
bones/3/rotation = Quaternion(0.00018436032, -8.572831e-05, 8.9289446e-05, 1)
bones/3/scale = Vector3(1, 0.99999994, 1)
bones/4/name = "upperarm.l"
bones/4/parent = 3
bones/4/rest = Transform3D(0.057284202, 0.9983573, -4.5386042e-07, -3.8742996e-07, 4.768369e-07, 0.99999976, 0.9983573, -0.057284202, 4.1410917e-07, 0.21200737, 0.13413215, 8.402462e-08)
bones/4/enabled = true
bones/4/position = Vector3(0.23782511, 0.13413225, 0.07073039)
bones/4/rotation = Quaternion(-0.5327466, -0.38964266, -0.7511684, -0.010284676)
bones/4/position = Vector3(0.21200009, 0.1340884, -0.00020367274)
bones/4/rotation = Quaternion(-0.55839837, -0.059612595, -0.6398795, 0.5245872)
bones/4/scale = Vector3(0.99999934, 0.99999934, 0.99999976)
bones/5/name = "lowerarm.l"
bones/5/parent = 4
bones/5/rest = Transform3D(0.99388725, 0.11040192, -1.1900745e-07, -0.110401966, 0.9938869, 3.2883107e-09, 1.1864304e-07, 9.870443e-09, 0.99999994, -3.219665e-09, 0.2418973, -1.1940561e-07)
bones/5/enabled = true
bones/5/position = Vector3(-3.219665e-09, 0.2418973, -1.1940561e-07)
bones/5/rotation = Quaternion(9.53509e-09, -6.659632e-08, -0.7050866, 0.7091212)
bones/5/rotation = Quaternion(9.948397e-11, -5.4190842e-08, -0.5051468, 0.8630335)
bones/5/scale = Vector3(1.0000002, 0.9999999, 0.99999994)
bones/6/name = "wrist.l"
bones/6/parent = 5
@ -31305,28 +31304,28 @@ bones/7/parent = 6
bones/7/rest = Transform3D(1, 1.091039e-05, 2.662036e-07, -1.0910391e-05, 0.99999994, -2.4018103e-09, -2.6620367e-07, 2.398906e-09, 0.99999994, 9.0816243e-13, 0.073825836, 2.220446e-16)
bones/7/enabled = true
bones/7/position = Vector3(9.0816243e-13, 0.073825836, 2.220446e-16)
bones/7/rotation = Quaternion(-0.33596215, 0.3571115, -0.3113091, 0.8140562)
bones/7/rotation = Quaternion(-0.3203019, -0.330552, 0.14747664, 0.87543863)
bones/7/scale = Vector3(1, 0.99999994, 0.99999994)
bones/8/name = "handslot.l"
bones/8/parent = 7
bones/8/rest = Transform3D(-1.1920929e-07, 1, -3.2072357e-16, -0.99999994, -1.192093e-07, -4.553069e-09, -4.553069e-09, -2.2204463e-16, 0.99999994, 8.348149e-10, 0.09612507, -0.057500124)
bones/8/enabled = true
bones/8/position = Vector3(8.348433e-10, 0.096125185, -0.057500035)
bones/8/rotation = Quaternion(-3.6586003e-09, 6.8781096e-09, -0.7071068, 0.7071067)
bones/8/position = Vector3(4.437712e-10, 0.096125185, -0.057500035)
bones/8/rotation = Quaternion(3.328525e-05, 0.00048371762, -0.70549875, 0.7087111)
bones/8/scale = Vector3(0.99999994, 1, 0.99999994)
bones/9/name = "upperarm.r"
bones/9/parent = 3
bones/9/rest = Transform3D(0.05728419, -0.99835724, 4.4361707e-07, 5.6624367e-07, 4.7683673e-07, 0.99999976, -0.99835724, -0.05728419, 5.9262936e-07, -0.21200737, 0.13413215, 8.402462e-08)
bones/9/enabled = true
bones/9/position = Vector3(-0.20570403, 0.1341324, -0.072821945)
bones/9/rotation = Quaternion(-0.6303763, 0.26368794, 0.5050146, 0.5273088)
bones/9/position = Vector3(-0.21190722, 0.1340419, -0.00017857713)
bones/9/rotation = Quaternion(-0.6166699, 0.079242595, 0.6140466, 0.48619512)
bones/9/scale = Vector3(0.9999993, 0.9999993, 0.99999976)
bones/10/name = "lowerarm.r"
bones/10/parent = 9
bones/10/rest = Transform3D(0.99388725, -0.11040192, 1.1900747e-07, 0.110401966, 0.9938869, 3.288313e-09, -1.1864305e-07, 9.870443e-09, 0.99999994, -7.1218566e-11, 0.24189733, -1.1940561e-07)
bones/10/enabled = true
bones/10/position = Vector3(-7.1218566e-11, 0.24189733, -1.1940561e-07)
bones/10/rotation = Quaternion(3.359196e-08, 3.9002582e-08, 0.76466405, 0.6444292)
bones/10/rotation = Quaternion(3.4285858e-08, 5.570678e-08, 0.5273911, 0.84962267)
bones/10/scale = Vector3(1.0000002, 0.9999999, 0.99999994)
bones/11/name = "wrist.r"
bones/11/parent = 10
@ -31340,111 +31339,111 @@ bones/12/parent = 11
bones/12/rest = Transform3D(1, -1.091039e-05, -1.7863715e-07, 1.0910391e-05, 0.99999994, -2.4008375e-09, 1.786372e-07, 2.3988884e-09, 0.99999994, 1.3322676e-15, 0.073825836, 2.220446e-16)
bones/12/enabled = true
bones/12/position = Vector3(1.3322676e-15, 0.073825836, 2.220446e-16)
bones/12/rotation = Quaternion(-0.2046257, 0.5077341, 0.3203099, 0.7731339)
bones/12/rotation = Quaternion(-0.31897667, 0.30674514, -0.2283519, 0.867189)
bones/12/scale = Vector3(1, 0.99999994, 0.99999994)
bones/13/name = "handslot.r"
bones/13/parent = 12
bones/13/rest = Transform3D(-1.1920929e-07, -1, 3.207168e-16, 0.99999994, -1.192093e-07, -4.553012e-09, 4.553012e-09, -2.2204463e-16, 0.99999994, -8.348149e-10, 0.09612507, -0.057500124)
bones/13/enabled = true
bones/13/position = Vector3(-0.003275872, 0.09574351, -0.074703574)
bones/13/rotation = Quaternion(0.018248208, 0.017789543, 0.7072114, 0.70654273)
bones/13/position = Vector3(-1.5459904e-08, 0.096125126, -0.057499975)
bones/13/rotation = Quaternion(0.0005711166, 0.00084369734, 0.705499, 0.7087102)
bones/13/scale = Vector3(0.99999994, 1, 0.99999994)
bones/14/name = "head"
bones/14/parent = 3
bones/14/rest = Transform3D(1, 0, 2.3841854e-07, 0, 1, 0, -2.3841854e-07, 0, 1, 0, 0.26879656, 0)
bones/14/enabled = true
bones/14/position = Vector3(0, 0.26879656, 0)
bones/14/rotation = Quaternion(-0.017512754, 0.17142966, 0.10093436, 0.97985584)
bones/14/rotation = Quaternion(-0.0005532181, -0.0316875, 5.2185755e-05, 0.9994977)
bones/14/scale = Vector3(1, 1, 1)
bones/15/name = "upperleg.l"
bones/15/parent = 1
bones/15/rest = Transform3D(1, -1.4221531e-07, -2.6560238e-08, -1.4305222e-07, -0.9993962, -0.034741182, -2.160345e-08, 0.034741133, -0.9993976, 0.17094506, 0.11358726, 1.3923272e-08)
bones/15/enabled = true
bones/15/position = Vector3(0.20013013, 0.11078364, -0.030277956)
bones/15/rotation = Quaternion(0.89663213, 0.0868622, -0.43388677, 0.015750801)
bones/15/position = Vector3(0.17094508, 0.1135872, 0.00040953764)
bones/15/rotation = Quaternion(0.99261445, 0.08264179, 0.075759545, 0.046340596)
bones/15/scale = Vector3(1, 0.9999998, 1.0000012)
bones/16/name = "lowerleg.l"
bones/16/parent = 15
bones/16/rest = Transform3D(1, 1.6129098e-07, 1.208564e-07, -1.3212028e-07, 0.9774329, -0.21124826, -1.5220138e-07, 0.21124834, 0.97743255, 3.5797574e-09, 0.2270775, -6.140325e-09)
bones/16/enabled = true
bones/16/position = Vector3(3.5797574e-09, 0.2270775, -6.140325e-09)
bones/16/rotation = Quaternion(0.24438089, 6.046063e-08, -1.7316562e-07, 0.96967936)
bones/16/rotation = Quaternion(0.2825805, 6.505027e-08, -1.9808719e-07, 0.95924366)
bones/16/scale = Vector3(1, 1.0000005, 1.0000001)
bones/17/name = "foot.l"
bones/17/parent = 16
bones/17/rest = Transform3D(1, 4.6433247e-08, 6.012356e-08, -7.592726e-08, 0.5855154, 0.8106606, 2.4383358e-09, -0.81066227, 0.5855142, 1.8334093e-10, 0.14943703, 9.660811e-10)
bones/17/enabled = true
bones/17/position = Vector3(1.8334093e-10, 0.14943703, 9.660811e-10)
bones/17/rotation = Quaternion(-0.54108834, -0.062926054, 0.0603443, 0.8364343)
bones/17/rotation = Quaternion(-0.562834, -0.20574357, 0.05673057, 0.79854184)
bones/17/scale = Vector3(1, 1.0000008, 0.99999875)
bones/18/name = "toes.l"
bones/18/parent = 17
bones/18/rest = Transform3D(-1, -1.7553674e-09, 1.5174173e-07, -1.1045316e-07, 0.69410586, -0.719873, -1.0406117e-07, -0.7198729, -0.694106, -2.131959e-10, 0.16565003, 5.1714744e-09)
bones/18/enabled = true
bones/18/position = Vector3(-2.131959e-10, 0.16565003, 5.1714744e-09)
bones/18/rotation = Quaternion(-9.7412585e-09, 0.9203548, -0.39108446, 7.830905e-08)
bones/18/rotation = Quaternion(-9.8348e-09, 0.9203548, -0.39108446, 7.827594e-08)
bones/18/scale = Vector3(1, 0.99999994, 1.0000001)
bones/19/name = "upperleg.r"
bones/19/parent = 1
bones/19/rest = Transform3D(1, 1.4961141e-07, -6.08626e-08, 1.4740668e-07, -0.9993962, -0.034741182, -6.6023446e-08, 0.034741133, -0.9993976, -0.17094506, 0.11358726, 1.3923272e-08)
bones/19/enabled = true
bones/19/position = Vector3(-0.1709451, 0.11358726, 6.4771823e-09)
bones/19/rotation = Quaternion(0.98653436, -0.10536158, -0.061947674, -0.108680725)
bones/19/position = Vector3(-0.17094508, 0.11358732, -0.000409506)
bones/19/rotation = Quaternion(0.9954408, -0.030771783, 0.030710364, 0.0848976)
bones/19/scale = Vector3(1, 0.9999998, 1.0000012)
bones/20/name = "lowerleg.r"
bones/20/parent = 19
bones/20/rest = Transform3D(1, -1.61291e-07, -1.2085643e-07, 1.3212028e-07, 0.9774329, -0.21124826, 1.5220141e-07, 0.21124834, 0.97743255, -3.5797574e-09, 0.2270775, -6.140325e-09)
bones/20/enabled = true
bones/20/position = Vector3(-3.5797574e-09, 0.2270775, -6.140325e-09)
bones/20/rotation = Quaternion(0.0019655824, -5.6433496e-08, 1.5559724e-08, 0.9999981)
bones/20/rotation = Quaternion(0.3424002, -6.229277e-08, 2.3734248e-07, 0.9395543)
bones/20/scale = Vector3(1, 1.0000005, 1.0000001)
bones/21/name = "foot.r"
bones/21/parent = 20
bones/21/rest = Transform3D(1, -1.5513157e-07, 2.9352182e-07, -1.4711539e-07, 0.5855154, 0.8106606, -2.9762074e-07, -0.81066227, 0.5855142, -1.8333904e-10, 0.14943703, 9.660859e-10)
bones/21/enabled = true
bones/21/position = Vector3(-1.8333904e-10, 0.14943703, 9.660859e-10)
bones/21/rotation = Quaternion(-0.46157384, 0.15737474, -0.05748793, 0.8711361)
bones/21/rotation = Quaternion(-0.59319395, 0.11343628, -0.014418132, 0.79689735)
bones/21/scale = Vector3(1, 1.0000008, 0.99999875)
bones/22/name = "toes.r"
bones/22/parent = 21
bones/22/rest = Transform3D(-1, 1.7553639e-09, -1.5174174e-07, 1.1045316e-07, 0.69410586, -0.719873, 1.0406118e-07, -0.7198729, -0.694106, 2.1319319e-10, 0.16565003, 5.171479e-09)
bones/22/enabled = true
bones/22/position = Vector3(2.1319319e-10, 0.16565003, 5.171479e-09)
bones/22/rotation = Quaternion(3.035973e-08, 0.9203548, -0.39108446, -6.953384e-08)
bones/22/rotation = Quaternion(3.012012e-08, 0.9202567, -0.3913154, -6.948012e-08)
bones/22/scale = Vector3(1, 0.99999994, 1.0000001)
bones/23/name = "kneeIK.l"
bones/23/parent = 0
bones/23/rest = Transform3D(1, -2.5915057e-07, -3.8941417e-07, -3.8941423e-07, 0, -0.9999999, 2.591506e-07, 0.9999999, -1.00916915e-13, 0.17094491, 0.29231027, 0.57581246)
bones/23/enabled = true
bones/23/position = Vector3(0.46929193, 0.29231024, 0.43669105)
bones/23/rotation = Quaternion(0.7071068, -2.2930229e-07, -4.605515e-08, 0.7071068)
bones/23/position = Vector3(0.17094491, 0.29240057, 0.57590276)
bones/23/rotation = Quaternion(0.7071068, -2.2930868e-07, -4.604875e-08, 0.7071068)
bones/23/scale = Vector3(1, 0.9999999, 0.9999999)
bones/24/name = "control-toe-roll.l"
bones/24/parent = 0
bones/24/rest = Transform3D(1, 1.994847e-07, -2.1316282e-14, 2.1316282e-14, 0, 1, 1.994847e-07, -1, 0, 0.17094497, 0.025990263, 0.24578938)
bones/24/enabled = true
bones/24/position = Vector3(0.27470604, 0.023186672, 0.256143)
bones/24/rotation = Quaternion(-0.6989447, 0.10712827, 0.10712827, 0.69894457)
bones/24/position = Vector3(0.20205116, 0.027284328, 0.20681709)
bones/24/rotation = Quaternion(-0.7081707, -7.039047e-08, -7.065962e-08, 0.7060413)
bones/24/scale = Vector3(1, 1, 1)
bones/25/name = "control-heel-roll.l"
bones/25/parent = 24
bones/25/rest = Transform3D(-1, 4.6600026e-34, 1.4210875e-14, -4.6993156e-34, -1, -2.7664234e-22, 1.4210875e-14, -2.7664234e-22, 1, 1.945811e-08, 0.36283267, -2.4286129e-15)
bones/25/enabled = true
bones/25/position = Vector3(1.945811e-08, 0.36283267, -2.4286129e-15)
bones/25/rotation = Quaternion(9.6579225e-09, 1.7795515e-09, 0.98571914, -0.1683977)
bones/25/position = Vector3(1.9449061e-08, 0.36283267, -2.4286129e-15)
bones/25/rotation = Quaternion(9.609895e-09, 1.7662254e-09, 0.98583835, -0.16769859)
bones/25/scale = Vector3(1, 1, 1)
bones/26/name = "control-foot-roll.l"
bones/26/parent = 25
bones/26/rest = Transform3D(-1, -2.702424e-08, -2.1459303e-07, -1.3572199e-07, -0.69410604, 0.71987265, -1.6840436e-07, 0.71987265, 0.69410604, -1.1148217e-08, 0.21343614, -2.5094198e-15)
bones/26/enabled = true
bones/26/position = Vector3(-2.6049376e-08, 0.21343614, -5.171498e-09)
bones/26/rotation = Quaternion(-1.012734e-07, 0.39108434, 0.92035484, -3.3509146e-08)
bones/26/position = Vector3(-2.5933513e-08, 0.21343614, -5.1498223e-09)
bones/26/rotation = Quaternion(-1.0128852e-07, 0.39108434, 0.92035484, -3.3484394e-08)
bones/26/scale = Vector3(1, 0.9999999, 0.9999999)
bones/27/name = "heelIK.l"
bones/27/parent = 26
bones/27/rest = Transform3D(1, 1.7465582e-07, -7.540012e-08, -6.6951195e-08, 0.69410604, 0.7198727, 1.7806566e-07, -0.71987265, 0.6941061, 8.589882e-09, 0.16565004, -5.0913656e-09)
bones/27/enabled = true
bones/27/position = Vector3(8.589881e-09, 0.16565004, -2.4096307e-09)
bones/27/position = Vector3(8.536473e-09, 0.16565004, -2.4208708e-09)
bones/27/rotation = Quaternion(-0.39108434, -6.8850014e-08, -6.5628775e-08, 0.92035484)
bones/27/scale = Vector3(1, 0.9999999, 1)
bones/28/name = "IK-foot.l"
@ -31452,7 +31451,7 @@ bones/28/parent = 26
bones/28/rest = Transform3D(1, -6.217254e-15, 3.8941437e-07, -6.217254e-15, -1, 1.7293365e-22, 3.894144e-07, -2.5940218e-21, -0.99999994, 8.589882e-09, 0.16565004, -5.0913656e-09)
bones/28/enabled = true
bones/28/position = Vector3(8.589882e-09, 0.16565004, -5.0913656e-09)
bones/28/rotation = Quaternion(1, -2.3313629e-09, 1.9977652e-07, -1.3421114e-15)
bones/28/rotation = Quaternion(1, -2.3303943e-09, 1.9975572e-07, 1.129646e-12)
bones/28/scale = Vector3(1, 1, 0.99999994)
bones/29/name = "IK-toe.l"
bones/29/parent = 25
@ -31465,35 +31464,35 @@ bones/30/name = "kneeIK.r"
bones/30/parent = 0
bones/30/rest = Transform3D(1, -2.5915057e-07, 1.5099583e-07, 1.5099585e-07, 0, -0.9999999, 2.591506e-07, 0.9999999, 3.913066e-14, -0.17094518, 0.29231027, 0.57581234)
bones/30/enabled = true
bones/30/position = Vector3(-0.3253411, 0.2989459, 0.4951202)
bones/30/rotation = Quaternion(0.7071068, -3.8238483e-08, 1.4500867e-07, 0.7071068)
bones/30/position = Vector3(-0.17094518, 0.29240057, 0.57590264)
bones/30/rotation = Quaternion(0.7071068, -3.824488e-08, 1.4501506e-07, 0.7071068)
bones/30/scale = Vector3(1, 0.9999999, 0.9999999)
bones/31/name = "control-toe-roll.r"
bones/31/parent = 0
bones/31/rest = Transform3D(1, 1.9948473e-07, -7.1054274e-15, 7.1054274e-15, 0, 1, 1.9948473e-07, -1, 0, -0.1709451, 0.025990263, 0.24578929)
bones/31/enabled = true
bones/31/position = Vector3(-0.17094511, 0.025990263, 0.3700746)
bones/31/rotation = Quaternion(-0.7071068, -7.0528515e-08, -7.05285e-08, 0.7071068)
bones/31/position = Vector3(-0.1709451, 0.02643883, 0.2428261)
bones/31/rotation = Quaternion(-0.70422566, -7.083134e-08, -7.022758e-08, 0.70997626)
bones/31/scale = Vector3(1, 1, 1)
bones/32/name = "control-heel-roll.r"
bones/32/parent = 31
bones/32/rest = Transform3D(-1, 4.6600044e-34, 1.4210875e-14, -4.6993174e-34, -1, -2.7664213e-22, 1.4210875e-14, -2.7664213e-22, 1, 1.9458106e-08, 0.36283267, 2.4286129e-15)
bones/32/enabled = true
bones/32/position = Vector3(0.007571359, 0.6197595, 2.3210177e-15)
bones/32/rotation = Quaternion(-1.4227276e-08, 3.7800945e-09, 0.96958256, 0.24476466)
bones/32/position = Vector3(1.9458106e-08, 0.36283267, 2.136342e-10)
bones/32/rotation = Quaternion(-5.8071365e-09, 6.407014e-10, 0.9948528, 0.101331115)
bones/32/scale = Vector3(1, 1, 1)
bones/33/name = "control-foot-roll.r"
bones/33/parent = 32
bones/33/rest = Transform3D(-1, -2.7024187e-08, -2.1459297e-07, -1.3572199e-07, -0.69410604, 0.71987265, -1.6840428e-07, 0.71987265, 0.69410604, 3.7529415e-09, 0.21343614, 0)
bones/33/enabled = true
bones/33/position = Vector3(-1.114822e-08, 0.21343614, -2.5094192e-15)
bones/33/rotation = Quaternion(-1.05795515e-07, 0.39108434, 0.92035484, -2.5864264e-08)
bones/33/position = Vector3(-1.10767155e-08, 0.21343614, 8.991798e-11)
bones/33/rotation = Quaternion(-1.0578508e-07, 0.39108434, 0.92035484, -2.587891e-08)
bones/33/scale = Vector3(1, 0.9999999, 0.9999999)
bones/34/name = "heelIK.r"
bones/34/parent = 33
bones/34/rest = Transform3D(1, 1.7465578e-07, -7.5400145e-08, -6.695115e-08, 0.69410604, 0.7198727, 1.7806565e-07, -0.71987265, 0.6941061, -6.311275e-09, 0.16565004, 1.3660824e-09)
bones/34/enabled = true
bones/34/position = Vector3(-6.3112755e-09, 0.16565004, 2.7069498e-09)
bones/34/position = Vector3(-6.3112755e-09, 0.16565004, 2.75915e-09)
bones/34/rotation = Quaternion(-0.39108434, -6.885002e-08, -6.5628754e-08, 0.92035484)
bones/34/scale = Vector3(1, 0.9999999, 1)
bones/35/name = "IK-foot.r"
@ -31501,7 +31500,7 @@ bones/35/parent = 33
bones/35/rest = Transform3D(1, 8.881729e-16, 3.8941437e-07, 8.881729e-16, -1, -1.210544e-21, 3.894144e-07, 1.5564114e-21, -0.99999994, -2.1212436e-08, 0.16565004, 1.3660766e-09)
bones/35/enabled = true
bones/35/position = Vector3(-2.1212436e-08, 0.16565004, 1.3660766e-09)
bones/35/rotation = Quaternion(1, 3.7652574e-09, 1.9487908e-07, 7.4505815e-09)
bones/35/rotation = Quaternion(1, 3.7504853e-09, 1.9488023e-07, 7.4193536e-09)
bones/35/scale = Vector3(1, 1, 0.99999994)
bones/36/name = "IK-toe.r"
bones/36/parent = 32
@ -31514,29 +31513,29 @@ bones/37/name = "elbowIK.l"
bones/37/parent = 0
bones/37/rest = Transform3D(1, 2.0589563e-07, -2.842171e-14, 2.842171e-14, 0, 1, 2.0589563e-07, -1, 0, 0.45350748, 1.1067611, -0.5888594)
bones/37/enabled = true
bones/37/position = Vector3(0.69555855, 0.4532858, -0.08304638)
bones/37/rotation = Quaternion(-0.7071068, -7.279511e-08, -7.279509e-08, 0.7071068)
bones/37/position = Vector3(0.4538927, 1.1058015, -0.58884)
bones/37/rotation = Quaternion(-0.7071068, -7.500853e-05, -7.50085e-05, 0.7071068)
bones/37/scale = Vector3(1, 1, 1)
bones/38/name = "handIK.l"
bones/38/parent = 0
bones/38/rest = Transform3D(-2.3841855e-07, 0.99999976, -1.4210854e-14, -5.9604638e-08, -3.5527128e-15, 0.99999994, 0.9999999, 2.3841852e-07, 5.960464e-08, 0.7131815, 1.1067611, 2.5491414e-07)
bones/38/enabled = true
bones/38/position = Vector3(0.23445112, 0.9805997, 0.46837047)
bones/38/rotation = Quaternion(-0.44315913, 0.5510082, 0.5510082, 0.44315904)
bones/38/position = Vector3(0.52073157, 0.7848377, -0.05660627)
bones/38/rotation = Quaternion(0.7954525, 0.002042901, 0.6060126, 0.00044618515)
bones/38/scale = Vector3(0.9999999, 0.99999976, 0.99999994)
bones/39/name = "elbowIK.r"
bones/39/parent = 0
bones/39/rest = Transform3D(1, 2.0589563e-07, -2.842171e-14, 2.842171e-14, 0, 1, 2.0589563e-07, -1, 0, -0.45350718, 1.1067611, -0.5888596)
bones/39/enabled = true
bones/39/position = Vector3(-0.45350718, 1.1067611, -0.5888596)
bones/39/rotation = Quaternion(-0.7071068, -7.279511e-08, -7.279509e-08, 0.7071068)
bones/39/position = Vector3(-0.45335817, 1.1059228, -0.5893418)
bones/39/rotation = Quaternion(-0.7071068, -7.500853e-05, -7.50085e-05, 0.7071068)
bones/39/scale = Vector3(1, 1, 1)
bones/40/name = "handIK.r"
bones/40/parent = 0
bones/40/rest = Transform3D(1.1920929e-07, -1, -5.9604645e-08, 5.9604645e-08, -1.1920929e-07, 1, -1, -1.7881393e-07, 0, -0.71318156, 1.1067611, -8.515731e-08)
bones/40/enabled = true
bones/40/position = Vector3(-0.44945085, 0.9935347, 0.11420849)
bones/40/rotation = Quaternion(-0.35593528, 0.39234617, 0.60617733, -0.59323156)
bones/40/position = Vector3(-0.51085526, 0.7848376, 0.059935648)
bones/40/rotation = Quaternion(-0.75935376, 0.0018002092, 0.65067565, -0.00019453318)
bones/40/scale = Vector3(1, 1, 1)
[node name="ik_hand_r" type="SkeletonIK3D" parent="Rig/Skeleton3D"]
@ -31548,12 +31547,12 @@ target_node = NodePath("../ik_target")
transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 2.1487267e-07, 1.2203609, 2.457857)
[node name="handslot_l" type="BoneAttachment3D" parent="Rig/Skeleton3D"]
transform = Transform3D(0.97585, 0.21843804, 4.249306e-07, -2.1316929e-07, -8.940697e-08, 0.99999934, 0.21843834, -0.97585, -1.6255832e-07, -0.13313779, 0.94706607, 0.5470377)
transform = Transform3D(-0.0025151167, 0.26375514, 0.9645856, 0.9999951, -0.00054824096, 0.0027577316, 0.0012565508, 0.96458894, -0.26375264, 0.50813305, 0.6336772, -0.017135022)
bone_name = "handslot.l"
bone_idx = 8
[node name="handslot_r" type="BoneAttachment3D" parent="Rig/Skeleton3D"]
transform = Transform3D(0.018572412, 0.0021734908, -0.9998244, 0.012681573, 0.99991626, 0.0024094805, 0.9997462, -0.0127240885, 0.018542781, -0.42644227, 0.9758862, 0.061491005)
transform = Transform3D(-0.002038993, -0.15413956, -0.9880464, -0.9999967, -0.0004969534, 0.0021415746, -0.0008214881, 0.9880484, -0.15413828, -0.491604, 0.63811827, 0.1078307)
bone_name = "handslot.r"
bone_idx = 13
@ -31566,7 +31565,7 @@ skeleton = NodePath("")
transform = Transform3D(1.4901161e-08, 9.34815e-08, -1.0000007, 4.2747706e-07, 1.0000008, 9.301584e-08, 1, -4.2561442e-07, 7.450581e-09, 0.0035024583, 0.17694426, 0.668434)
[node name="chest" type="BoneAttachment3D" parent="Rig/Skeleton3D"]
transform = Transform3D(0.89813906, 4.0456847e-08, -0.43971157, -0.048295908, 0.9939497, -0.098647416, 0.43705124, 0.10983537, 0.8927051, 4.754022e-08, 0.9567605, 0.041186962)
transform = Transform3D(0.9962004, 0.0001027984, 0.087090485, 8.605286e-05, 0.9999976, -0.0021646915, -0.08709051, 0.0021639608, 0.9961981, 0.00012307301, 0.9515259, 0.0008243459)
bone_name = "chest"
bone_idx = 3

@ -40,7 +40,7 @@ gold_label = NodePath("Panel/PanelBackground/UiPanel/Stats/Gold")
[node name="Panel" type="BoxContainer" parent="."]
layout_mode = 1
anchors_preset = 2
anchors_preset = -1
anchor_top = 1.0
anchor_bottom = 1.0
offset_left = 8.0
@ -56,7 +56,7 @@ texture = SubResource("AtlasTexture_7ucui")
[node name="UiPanel" type="HBoxContainer" parent="Panel/PanelBackground"]
layout_mode = 1
anchors_preset = 2
anchors_preset = -1
anchor_top = 1.0
anchor_bottom = 1.0
offset_left = 24.0
@ -113,7 +113,7 @@ text = "0"
[node name="Vector" type="BoxContainer" parent="."]
layout_mode = 1
anchors_preset = 3
anchors_preset = -1
anchor_left = 1.0
anchor_top = 1.0
anchor_right = 1.0
@ -157,7 +157,7 @@ stretch_mode = 3
[node name="MessageBox" type="BoxContainer" parent="."]
visible = false
layout_mode = 1
anchors_preset = 8
anchors_preset = -1
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
@ -177,7 +177,7 @@ texture = SubResource("AtlasTexture_v7jgd")
[node name="VBoxContainer" type="VBoxContainer" parent="MessageBox/Background"]
layout_mode = 1
anchors_preset = 8
anchors_preset = -1
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
@ -214,7 +214,7 @@ stretch_mode = 3
[node name="CrossHair" type="BoxContainer" parent="."]
visible = false
layout_mode = 1
anchors_preset = 8
anchors_preset = -1
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5

@ -1,7 +1,7 @@
[gd_scene load_steps=19 format=4 uid="uid://do5dueeowthyn"]
[gd_scene load_steps=20 format=4 uid="uid://do5dueeowthyn"]
[ext_resource type="Script" uid="uid://uigg23n8ddht" path="res://scripts/item_desctructable.gd" id="1_txp5f"]
[ext_resource type="Texture2D" uid="uid://3i63817g50qe" path="res://resources/models/dungeon/Textures/dungeon_texture.png" id="2_5cqwm"]
[ext_resource type="Texture2D" uid="uid://dgv6crdc05p61" path="res://resources/models/dungeon/Textures/dungeon_texture.png" id="2_5cqwm"]
[ext_resource type="Script" uid="uid://3rbry6yfuo6u" path="res://scripts/hurtbox.gd" id="3_2kbl0"]
[ext_resource type="AudioStream" uid="uid://bxnu674tk5euv" path="res://resources/audio/wallhit.mp3" id="4_tc4p0"]
@ -42,6 +42,9 @@ _surfaces = [{
blend_shape_mode = 0
shadow_mesh = SubResource("ArrayMesh_1g6l3")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_txp5f"]
albedo_texture = ExtResource("2_5cqwm")
[sub_resource type="SphereShape3D" id="SphereShape3D_adgbw"]
radius = 2.0
@ -104,7 +107,7 @@ script = ExtResource("1_txp5f")
[node name="Mesh" type="MeshInstance3D" parent="."]
mesh = SubResource("ArrayMesh_t72su")
skeleton = NodePath("")
surface_material_override/0 = SubResource("StandardMaterial3D_txp5f")
[node name="HurtBox" type="Area3D" parent="Mesh"]
script = ExtResource("3_2kbl0")

@ -2,8 +2,8 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://b45epb0j7ul34"
path.s3tc="res://.godot/imported/dungeon_texture.png-481129781fe9a2b7c7250c2568305648.s3tc.ctex"
uid="uid://dgv6crdc05p61"
path.s3tc="res://.godot/imported/dungeon_texture.png-4348596a438780158879d29c23a36d28.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
@ -11,8 +11,8 @@ metadata={
[deps]
source_file="res://resources/models/dungeon/textures/dungeon_texture.png"
dest_files=["res://.godot/imported/dungeon_texture.png-481129781fe9a2b7c7250c2568305648.s3tc.ctex"]
source_file="res://resources/models/dungeon/Textures/dungeon_texture.png"
dest_files=["res://.godot/imported/dungeon_texture.png-4348596a438780158879d29c23a36d28.s3tc.ctex"]
[params]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

@ -1,41 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dgv6crdc05p61"
path.s3tc="res://.godot/imported/dungeon_texture.png-4348596a438780158879d29c23a36d28.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://resources/models/dungeon/Textures/dungeon_texture.png"
dest_files=["res://.godot/imported/dungeon_texture.png-4348596a438780158879d29c23a36d28.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

@ -1032,7 +1032,6 @@ script = ExtResource("1_kvi4c")
[node name="SpawnManager" type="Node" parent="." node_paths=PackedStringArray("enemies_folder", "spawn_points", "enemies_ui_manager", "spawn_points_container")]
script = ExtResource("4_2vmwg")
max_enemy = 0
enemies_folder = NodePath("Enemies")
enemies = Array[PackedScene]([ExtResource("13_8a4e7")])
enemies_ui = ExtResource("9_p6yn7")

@ -1,7 +1,18 @@
extends Node
@onready var background_music: AudioStreamPlayer = $BackgroundMusic
@onready var voice: AudioStreamPlayer = $Voice
@onready var background_music_player: AudioStreamPlayer = $BackgroundMusic
@onready var voice_player: AudioStreamPlayer = $Voice
func _on_player_game_over() -> void:
voice.play()
# Signal-Handler bleibt für Godot-Verbindungen unverändert und delegiert an die Fachlogik.
_play_game_over_voice()
func _play_game_over_voice() -> void:
# Guard Clauses: sichere und idempotente Ausführung
if voice_player == null:
return
if voice_player.playing:
return
voice_player.play()

@ -1,41 +1,74 @@
class_name Chest extends InteractableItem
class_name Chest
extends ItemInteractable
@onready var chest_lid: StaticBody3D = $chest/chest_lid
# Aktionstexte
const ACTION_OPEN := "open chest"
const ACTION_CLOSE := "close chest"
const ACTION_COLLECT := "collect gold"
# Animationsnamen
const ANIM_OPEN := "open"
const ANIM_CLOSE := "close"
const ANIM_TAKE_GOLD := "take_gold"
@export var gold_amount: int = 10
var has_gold: bool = false
@export var gold_amount := 10
var is_empty := false
func _ready() -> void:
state_changed.connect(_on_state_changed)
interaction_area.interact = Callable(self, "_on_interact")
is_empty = gold_amount == 0
interaction_area.interact = _on_interact
has_gold = gold_amount > 0
state = States.closed
update_action_name()
func _on_interact() -> void:
match state:
States.closed:
state = States.opened
if is_empty:
interaction_area.action_name = "close chest"
else:
interaction_area.action_name = "collect gold"
States.opened:
interaction_area.action_name = "close chest"
if is_empty:
state = States.closed
else:
is_empty = true
GameManager.player.gold += gold_amount
if has_gold:
collect_gold()
state = States.looted
else:
state = States.closed
States.looted:
interaction_area.action_name = "open chest"
state = States.closed
update_action_name()
func _on_state_changed(new_state: States) -> void:
match new_state:
States.opened:
animation_player.play("open")
animation_player.play(ANIM_OPEN)
States.closed:
animation_player.play("close")
animation_player.play(ANIM_CLOSE)
States.looted:
animation_player.play("take_gold")
animation_player.play(ANIM_TAKE_GOLD)
States.destroyed:
pass
States.hidden:
pass
States.idle:
pass
func update_action_name() -> void:
match state:
States.closed:
interaction_area.action_name = ACTION_OPEN
States.opened:
interaction_area.action_name = ACTION_COLLECT if has_gold else ACTION_CLOSE
States.looted:
interaction_area.action_name = ACTION_OPEN
States.destroyed:
pass
States.hidden:
pass
States.idle:
pass
func collect_gold() -> void:
GameManager.player.gold += gold_amount
has_gold = false

@ -1,21 +1,30 @@
extends Node
@export var enemies_ui_container: VBoxContainer
@onready var spawn_manager: Node = $"../SpawnManager"
@onready var enemy_ui_scene: PackedScene = ResourceLoader.load("res://packed-scenes/enemy_ui.tscn")
const ENEMY_UI_SCENE: PackedScene = preload("res://packed-scenes/enemy_ui.tscn")
func _ready() -> void:
spawn_manager.enemy_ui_ready = true
func update_enemies_ui(enemies: Array[Enemy]) -> void:
print("Update Enemy UI")
# Remove all enemy_uis
for enemy_uis in enemies_ui_container.get_children():
enemy_uis.queue_free()
# Add new enemy_uis
_clear_enemy_ui_container()
if enemies.is_empty():
return
for enemy in enemies:
print("Add " + enemy.unit_name + "...")
var new_enemy_ui: Node = enemy_ui_scene.instantiate()
new_enemy_ui.enemy = enemy
enemies_ui_container.add_child(new_enemy_ui)
var enemy_ui: Node = _instantiate_enemy_ui(enemy)
enemies_ui_container.add_child(enemy_ui)
func _clear_enemy_ui_container() -> void:
for child in enemies_ui_container.get_children():
child.queue_free()
func _instantiate_enemy_ui(enemy: Enemy) -> Node:
var ui: Node = ENEMY_UI_SCENE.instantiate()
ui.enemy = enemy
return ui

@ -1,69 +1,99 @@
class_name Enemy extends Unit
extends Unit
class_name Enemy
@export var player: Player
@export var chasing_range := 30.0
@export var attack_range := 3.0
@export var attacks := ["Unarmed_Melee_Attack_Punch_A", "Unarmed_Melee_Attack_Punch_B", "Unarmed_Melee_Attack_Kick"]
const ANIM_IWR_PARAM := "parameters/IWR/blend_position"
@onready var navigation_agent: NavigationAgent3D = $NavigationAgent3D
@onready var nav_agent: NavigationAgent3D = $NavigationAgent3D
func _ready() -> void:
health = maximum_health
stamina = maximum_stamina
state_changed.connect(_on_state_changed)
func _physics_process(_delta: float) -> void:
func _physics_process(delta: float) -> void:
# Guards
if state == States.dead or player == null:
return
if player.state == States.dead:
state = States.idle
return
var distance: float = global_position.distance_to(player.global_position)
if distance > chasing_range:
state = States.idle
elif distance <= chasing_range and distance >= attack_range:
state = States.chasing
elif distance <= attack_range:
state = States.attacking
nav_agent.set_target_position(player.position)
if nav_agent.is_navigation_finished() or nav_agent.is_target_reached():
return
# Apply gravity
velocity.y += -gravity * delta
# Zustandsableitung
var distance_to_player := global_position.distance_to(player.global_position)
var desired_state := _determine_state(distance_to_player)
if desired_state != state:
state = desired_state
# Navigation immer auf Spieler ausrichten
navigation_agent.set_target_position(player.global_position)
# Bewegungs-Update je nach Zustand
match state:
States.chasing:
_update_chasing_navigation()
States.attacking, States.idle:
_stop_horizontal_movement()
_:
pass
move_and_slide()
func _determine_state(distance: float) -> States:
if distance <= attack_range:
return States.attacking
elif distance <= chasing_range:
return States.chasing
else:
return States.idle
func _update_chasing_navigation() -> void:
if navigation_agent.is_navigation_finished() or navigation_agent.is_target_reached():
_stop_horizontal_movement()
return
var next_path_position: Vector3 = navigation_agent.get_next_path_position()
model.look_at(next_path_position, Vector3.UP)
# Nur horizontale Bewegung steuern, vertikale Komponente beibehalten
var to_next := next_path_position - global_position
to_next.y = 0.0
var desired := to_next.normalized() * speed
var vy := velocity.y
velocity.x = desired.x
velocity.z = desired.z
velocity.y = vy
# Animation (IWR) nach lokaler Geschwindigkeit blenden
var v_local: Vector3 = velocity * model.transform.basis
anim_tree.set(ANIM_IWR_PARAM, Vector2(v_local.x, -v_local.z) / speed)
func _stop_horizontal_movement() -> void:
var vy := velocity.y
velocity = Vector3.ZERO
velocity.y = vy
func _on_state_changed(_old_state: States, new_state: States) -> void:
#if new_state == _old_state:
#return
name_changed.emit(unit_name, States.keys()[new_state])
print("Enemy changed state from " + str(_old_state) + " to " + str(new_state))
match new_state:
#States.idle:
# TODO: Random movement
#_on_velocity_computed(Vector3.ZERO)
States.chasing:
print("Player position: ", player.position)
var next_path_position: Vector3 = nav_agent.get_next_path_position()
print("Next path position: ", next_path_position)
print("Global position: ", global_position)
model.look_at(next_path_position)
var direction = global_position.direction_to(next_path_position)
velocity = Vector3(direction.x, 0, direction.z).normalized() * speed
var vy: float = direction.y
velocity.y = 0
var vl: Vector3 = velocity * model.transform.basis
var iwr := Vector2(vl.x, -vl.z) / speed
anim_tree.set("parameters/IWR/blend_position", iwr)
velocity.y = vy
print("velocity = ", velocity)
States.attacking:
if enough_stamina_available(attack_cost):
use_stamina(attack_cost)
if attacks.size() > 0:
anim_state.travel(attacks.pick_random())
States.dead:
player.gold += 100
# Belohnung vergeben, wenn der Spieler existiert
if player:
player.gold += 100

@ -1,19 +1,38 @@
extends Sprite3D
const MAX_PERCENT := 100.0
@onready var name_label: Label = $EnemyOverlay/Stats/Name
@onready var health_bar: TextureProgressBar = $EnemyOverlay/Stats/Bars/Health
@onready var stamina_bar: TextureProgressBar = $EnemyOverlay/Stats/Bars/Stamina
func _ready() -> void:
owner.health_changed.connect(update_health_bar)
owner.stamina_changed.connect(update_stamina_bar)
owner.name_changed.connect(update_name_text)
func update_health_bar(current_health: int, maximum_health: int) -> void:
health_bar.value = (100.0 / maximum_health) * current_health
func update_stamina_bar(current_stamina: int, maximum_stamina: int) -> void:
stamina_bar.value = (100.0 / maximum_stamina) * current_stamina
func update_name_text(enemy_name: String, current_state: String) -> void:
name_label.text = "%s (%s)" % [enemy_name, current_state]
if owner == null:
return
owner.health_changed.connect(_on_health_changed)
owner.stamina_changed.connect(_on_stamina_changed)
owner.name_changed.connect(_on_name_changed)
func _on_health_changed(current_health: int, maximum_health: int) -> void:
_update_bar(health_bar, current_health, maximum_health)
func _on_stamina_changed(current_stamina: int, maximum_stamina: int) -> void:
_update_bar(stamina_bar, current_stamina, maximum_stamina)
func _update_bar(bar: TextureProgressBar, current_value: int, maximum_value: int) -> void:
if maximum_value <= 0:
bar.value = 0.0
return
var percent := clampf(float(current_value) / float(maximum_value) * MAX_PERCENT, 0.0, MAX_PERCENT)
bar.value = percent
func _on_name_changed(enemy_name: String, current_state: String) -> void:
name_label.text = _format_name(enemy_name, current_state)
func _format_name(enemy_name: String, current_state: String) -> String:
return "%s (%s)" % [enemy_name, current_state]

@ -1,15 +1,28 @@
class_name enemy_ui extends TextureRect
extends TextureRect
class_name EnemyUI
@export var unit_name: Label
#@export var unit_position: Label
const DEFAULT_UNIT_NAME := "<Unbekannt>"
var _enemy: Enemy
var enemy: Enemy:
get:
return enemy
return _enemy
set(value):
enemy = value
update_ui()
if _enemy == value:
return
_enemy = value
_update_ui()
func update_ui() -> void:
unit_name.text = enemy.unit_name
#unit_position.text = str(enemy.position)
func _ready() -> void:
_update_ui()
func _update_ui() -> void:
if unit_name == null:
return
if _enemy != null:
unit_name.text = _enemy.unit_name
else:
unit_name.text = DEFAULT_UNIT_NAME

@ -1,12 +1,32 @@
# GDScript
extends Node
@onready var player: Player = get_tree().get_first_node_in_group("player")
@onready var spawn_manager: Node = $"../SpawnManager"
const ENEMY_COUNT_INIT_DELAY := 3.0
const PLAYER_GROUP := "player"
const DEFAULT_SPAWN_MANAGER_PATH := NodePath("../SpawnManager")
@export var player: Player
@export var spawn_manager: Node
@onready var _player: Player = player if player else (get_tree().get_first_node_in_group(PLAYER_GROUP) as Player)
@onready var _spawn_manager: Node = spawn_manager if spawn_manager else get_node_or_null(DEFAULT_SPAWN_MANAGER_PATH)
func _ready() -> void:
await get_tree().create_timer(3.0).timeout
spawn_manager.enemy_count_changed()
if _player == null:
push_warning("GameManager: Kein Player gefunden (Export-Referenz setzen oder Gruppe 'player' verwenden).")
if _spawn_manager == null:
push_warning("GameManager: Kein SpawnManager gefunden (Export-Referenz setzen oder NodePath %s)." % str(DEFAULT_SPAWN_MANAGER_PATH))
await _schedule_enemy_count_sync()
func game_over() -> void:
print("Game Over! You have collected " + str(player.gold) + " gold in this run. Try to collect more in the next run...")
# TODO: Show Game Over screen with gold
var gold := _player.gold if _player else 0
print("Game Over! You have collected {gold} gold in this run. Try to collect more in the next run...".format({"gold": gold}))
# TODO: Show Game Over screen with gold
func _schedule_enemy_count_sync() -> void:
await get_tree().create_timer(ENEMY_COUNT_INIT_DELAY).timeout
if _spawn_manager and _spawn_manager.has_method("enemy_count_changed"):
_spawn_manager.call("enemy_count_changed")

@ -1,40 +1,90 @@
class_name Item extends Node3D
@export var item_name: String
@export var maximum_health := 10
@export var health := maximum_health
class_name Item
extends Node3D
const DEFAULT_MAX_HEALTH: int = 10
signal name_changed(item_name: String)
signal health_changed(current_health: int, maximum_health: int)
signal state_changed(new_state: States)
signal recalculate_navigation_map(requester: Node3D)
enum States {
hidden,
idle,
closed,
opened,
looted,
destroyed
hidden,
idle,
closed,
opened,
looted,
destroyed
}
@export var state = States.idle:
get:
return state
set(value):
state = value
state_changed.emit(value)
@export var item_name: String:
get:
return _item_name
set(value):
if _item_name == value:
return
_item_name = value
if _initialized:
name_changed.emit(value)
@export var maximum_health: int = DEFAULT_MAX_HEALTH:
get:
return _maximum_health
set(value):
value = max(1, value)
if _maximum_health == value:
return
_maximum_health = value
if _health > _maximum_health:
_health = _maximum_health
if _initialized:
health_changed.emit(_health, _maximum_health)
@export var health: int = DEFAULT_MAX_HEALTH:
get:
return _health
set(value):
value = clamp(value, 0, maximum_health)
if _health == value:
return
_health = value
if _initialized:
health_changed.emit(_health, maximum_health)
if _health <= 0:
state = States.destroyed
@export var state: States = States.idle:
get:
return _state
set(value):
if _state == value:
return
_state = value
if _initialized:
state_changed.emit(value)
var _initialized: bool = false
var _item_name: String = ""
var _maximum_health: int = DEFAULT_MAX_HEALTH
var _health: int = DEFAULT_MAX_HEALTH
var _state: States = States.idle
signal name_changed(item_name: String)
signal health_changed(current_health: int, maximum_health: int)
signal state_changed(new_state: States)
signal recalculate_navigation_map()
func _ready() -> void:
name_changed.emit(item_name)
health_changed.emit(health, maximum_health)
_initialized = true
name_changed.emit(item_name)
health_changed.emit(health, maximum_health)
func apply_damage(amount: int) -> void:
if amount <= 0:
return
health = health - amount
func take_damage(damage_amount: int) -> void:
health = clamp(health - damage_amount, 0, maximum_health)
health_changed.emit(health, maximum_health)
if health <= 0:
state = States.destroyed
# Rückwärtskompatibel: Bitte künftig apply_damage verwenden.
apply_damage(damage_amount)
func destroy_item() -> void:
recalculate_navigation_map.emit(self)
queue_free()
recalculate_navigation_map.emit(self)
queue_free()

@ -1,22 +0,0 @@
class_name DesctructableItem extends Item
@onready var particles: GPUParticles3D = $Particles
@onready var mesh: MeshInstance3D = $Mesh
@onready var sfx: AudioStreamPlayer3D = $SFX
func _ready() -> void:
particles.one_shot = true
state_changed.connect(_on_state_changed)
health_changed.connect(_on_health_changed)
func _on_particles_finished() -> void:
destroy_item()
func _on_state_changed(new_state: States) -> void:
match new_state:
States.destroyed:
particles.emitting = true
mesh.queue_free()
func _on_health_changed(_health: int, _max_health: int) -> void:
sfx.play()

@ -1 +0,0 @@
uid://uigg23n8ddht

@ -1,4 +1,4 @@
class_name InteractableItem extends Item
class_name ItemInteractable extends Item
@onready var interaction_area: InteractionArea = $InteractionArea
@onready var animation_player: AnimationPlayer = $AnimationPlayer

@ -1,19 +1,26 @@
class_name Player extends Unit
@export var mouse_sensitivity := 0.006
@export var rotation_speed := 24.0
@export var joypad_sensitivity := 2.0
const PITCH_MIN_DEG := -90.0
const PITCH_MAX_DEG := 30.0
const JOY_DEADZONE := 0.10
@export var mouse_sensitivity: float = 0.006
@export var rotation_speed: float = 24.0
@export var joypad_sensitivity: float = 2.0
@export var spring_arm: SpringArm3D
var gold := 0:
signal gold_changed(current_gold: int)
signal player_loaded()
var _gold: int = 0
var gold: int:
get:
return gold
return _gold
set(value):
gold = value
gold_changed.emit(gold)
signal gold_changed(current_gold)
signal player_loaded()
if _gold == value:
return
_gold = value
gold_changed.emit(_gold)
func _ready() -> void:
health = maximum_health
@ -21,24 +28,34 @@ func _ready() -> void:
player_loaded.emit()
func _physics_process(delta: float) -> void:
# Gravity
velocity.y += -gravity * delta
# Movementw
get_move_input(delta)
move_and_slide()
# Smooth face direction to camera
if velocity.length() > 1.0:
model.rotation.y = lerp_angle(model.rotation.y, spring_arm.rotation.y, rotation_speed * delta)
var x_axis = Input.get_joy_axis(0, JOY_AXIS_RIGHT_X)
var y_axis = Input.get_joy_axis(0, JOY_AXIS_RIGHT_Y)
# Use joypad to move camera
if x_axis != 0.0 or y_axis != 0.0:
move_camera_joypad(x_axis, y_axis, delta)
# Joypad camera
var axis_x := Input.get_joy_axis(0, JOY_AXIS_RIGHT_X)
var axis_y := Input.get_joy_axis(0, JOY_AXIS_RIGHT_Y)
if absf(axis_x) > JOY_DEADZONE or absf(axis_y) > JOY_DEADZONE:
move_camera_joypad(axis_x, axis_y, delta)
func rotate_camera(pitch_delta: float, yaw_delta: float) -> void:
# Apply deltas and clamp pitch; yaw is unbounded
spring_arm.rotation.x += pitch_delta
spring_arm.rotation_degrees.x = clampf(spring_arm.rotation_degrees.x, PITCH_MIN_DEG, PITCH_MAX_DEG)
spring_arm.rotation.y += yaw_delta
func move_camera_joypad(x: float, y: float, delta: float) -> void:
spring_arm.rotation.x -= y * joypad_sensitivity * delta
spring_arm.rotation_degrees.x = clamp(spring_arm.rotation_degrees.x, -90.0, 30.0)
spring_arm.rotation.y -= x * joypad_sensitivity * delta
# Scale by sensitivity and frame time; invert to match mouse feel
var pitch_delta := -y * joypad_sensitivity * delta
var yaw_delta := -x * joypad_sensitivity * delta
rotate_camera(pitch_delta, yaw_delta)
func player_game_over():
GameManager.game_over()
@ -47,39 +64,51 @@ func player_game_over():
func _input(event: InputEvent) -> void:
# Move camera via mouse
if event is InputEventMouseMotion:
spring_arm.rotation.x -= event.relative.y * mouse_sensitivity
spring_arm.rotation_degrees.x = clamp(spring_arm.rotation_degrees.x, -90.0, 30.0)
spring_arm.rotation.y -= event.relative.x * mouse_sensitivity
var motion := event as InputEventMouseMotion
var pitch_delta := -motion.relative.y * mouse_sensitivity
var yaw_delta := -motion.relative.x * mouse_sensitivity
rotate_camera(pitch_delta, yaw_delta)
var on_floor := is_on_floor()
# Jump
if is_on_floor() and Input.is_action_just_pressed("jump"):
if on_floor and Input.is_action_just_pressed("jump"):
if enough_stamina_available(jump_cost):
use_stamina(jump_cost)
velocity.y = jump_speed
state = States.jumping
anim_tree.set("parameters/conditions/grounded", false)
# We just hit the floor after being in the air
if is_on_floor() and not last_floor:
if state != States.idle: state = States.idle
if on_floor and not last_floor:
if state != States.idle:
state = States.idle
anim_tree.set("parameters/conditions/grounded", true)
# We're in the air, but we didn't jump
if not is_on_floor() and state != States.jumping:
if not on_floor and state != States.jumping:
anim_state.travel("Jump_Idle")
anim_tree.set("parameters/conditions/grounded", false)
anim_tree.set("parameters/conditions/jumping", state == States.jumping)
last_floor = is_on_floor()
last_floor = on_floor
# Menu
if event.is_action_pressed("Menue"):
get_tree().quit()
func get_move_input(delta: float) -> void:
var vy = velocity.y
velocity.y = 0
var input = Input.get_vector("left", "right", "forward", "back")
var dir = Vector3(input.x, 0, input.y).rotated(Vector3.UP, spring_arm.rotation.y)
if state == States.blocking: dir = Vector3.ZERO # TODO: Walk while blocking
velocity = lerp(velocity, dir * speed, acceleration * delta)
var vl = velocity * model.transform.basis
anim_tree.set("parameters/IWR/blend_position", Vector2(vl.x, -vl.z) / speed)
var vy := velocity.y
velocity.y = 0.0
var input_vector := Input.get_vector("left", "right", "forward", "back")
var direction := Vector3(input_vector.x, 0.0, input_vector.y).rotated(Vector3.UP, spring_arm.rotation.y)
if state == States.blocking:
direction = Vector3.ZERO # TODO: Walk while blocking
velocity = velocity.lerp(direction * speed, acceleration * delta)
var v_local := velocity * model.transform.basis
anim_tree.set("parameters/IWR/blend_position", Vector2(v_local.x, -v_local.z) / speed)
velocity.y = vy

@ -1,33 +1,79 @@
class_name Projectile extends Node3D
# GDScript
class_name Projectile
extends Node3D
signal hit(collider: Object)
@export var initial_speed: float = 50.0
@export var damage: float = 3.0
@export var lifetime_after_hit: float = 3.0
@export var uses_x_forward: bool = true # Mesh zeigt mit +X nach vorne
var speed: float = 0.0
var direction: Vector3 = Vector3.ZERO
var speed: float = 0.0
var direction: Vector3
var damage_amount: float = 3
@onready var ray_cast: RayCast3D = $RayCast3D
func _physics_process(delta):
func _physics_process(delta: float) -> void:
if speed > 0.0:
translate(-transform.basis.x * speed * delta)
#translate(direction * speed * delta)
#translate(Vector3.FORWARD * speed * delta)
if ray_cast.is_colliding():
var collider = ray_cast.get_collider()
#Stuck in collider
print("Arrow hits ", collider)
speed = 0
var move_dir := direction if direction != Vector3.ZERO else -global_transform.basis.z
global_translate(move_dir * speed * delta)
if ray_cast and ray_cast.is_colliding():
var collider: Object = ray_cast.get_collider()
_on_hit(collider)
func shoot(new_direction: Vector3 = Vector3.ZERO) -> void:
direction = new_direction.normalized() if new_direction != Vector3.ZERO else -global_transform.basis.z
speed = initial_speed
# Beim Abfeuern aus der Waffen-Hierarchie lösen, damit Maus-/Kamerabewegung den Pfeil nicht beeinflusst
_detach_to_world()
# Visuelle Ausrichtung konsistent zur Flugrichtung setzen
_align_visual_to_direction()
if ray_cast:
ray_cast.enabled = true
func _align_visual_to_direction() -> void:
look_at(global_transform.origin + direction, Vector3.UP)
# Godot richtet -Z nach vorne aus; wenn das Mesh +X als "vorne" hat, um -90° um Y korrigieren
if uses_x_forward:
rotate_z(deg_to_rad(90.0))
func _detach_to_world() -> void:
var target_parent: Node = get_tree().current_scene if get_tree().current_scene != null else get_tree().root
if target_parent == null:
return
var gt := global_transform
var p := get_parent()
if p and p != target_parent:
p.remove_child(self)
target_parent.add_child(self)
global_transform = gt
func _on_hit(collider: Object) -> void:
if speed == 0.0:
return
speed = 0.0
if ray_cast:
ray_cast.enabled = false
# var timer = get_tree().create_timer(3.0) # 3 seconds lifetime
# print("Arrow will be removed in 3 seconds")
# timer.timeout.connect(queue_free)
#Trigger damage
if collider.has_method("take_damage"):
collider.call("take_damage", damage_amount)
func shoot(new_direction: Vector3) -> void:
direction = new_direction.normalized()
print("Shooting arrow towards ", direction)
speed = 20
ray_cast.enabled = true
emit_signal("hit", collider)
_apply_damage_if_supported(collider)
if lifetime_after_hit > 0.0:
var timer := get_tree().create_timer(lifetime_after_hit)
timer.timeout.connect(queue_free)
else:
queue_free()
func _apply_damage_if_supported(collider: Object) -> void:
if collider and collider.has_method("take_damage"):
collider.call("take_damage", damage)

@ -1,90 +1,135 @@
class_name Rogue extends Player # Rogue class that extends Player
var attacks := ["2H_Ranged_Shoot"]
var reloadings := ["2H_Ranged_Reload"]
var aimings := ["2H_Ranged_Aiming"]
var footsteps := [
"res://resources/audio/footstep_grass_000.ogg",
"res://resources/audio/footstep_grass_001.ogg",
"res://resources/audio/footstep_grass_002.ogg",
"res://resources/audio/footstep_grass_003.ogg",
"res://resources/audio/footstep_grass_004.ogg"
]
@export var arrow_scene: PackedScene # Arrow scene to instantiate
@onready var shoot_point: Node3D = $"Rig/Skeleton3D/handslot_r/2H_Crossbow/ShootPoint" # Shoot point for the arrow
@onready var crossbow: MeshInstance3D = $"Rig/Skeleton3D/handslot_r/2H_Crossbow" # Crossbow mesh instance
@onready var ik_target: Node3D = $Rig/Skeleton3D/ik_target # IK target for the hand
@onready var hand_ik: SkeletonIK3D = $Rig/Skeleton3D/ik_hand_r # IK for the hand
@export var loaded: bool
var current_arrow: Node3D
func _ready() -> void: # Called when the node is added to the scene.
if loaded == true: # If the arrow is loaded, instantiate it
arrow_loaded() # Load the arrow if it is already loaded
func _process(delta: float) -> void: # Process function for the Rogue
var camera := get_viewport().get_camera_3d() # Get the camera from the viewport
if camera: # Check if the camera exists
camera.fov = 40 if state == States.aiming else 70 # Normal FOV
hand_ik.target = ik_target.global_transform # Set IK target position
hand_ik.start() # Start IK processing
var screen_center = get_viewport().get_visible_rect().size / 2 # Center of the screen
var target_pos = camera.project_ray_origin(screen_center) + camera.project_ray_normal(screen_center) * 100 # 100 units away from the camera
ik_target.global_transform.origin = target_pos # Set IK target position
class_name Rogue
extends Player
# Animation-/Audio-Listen als Konstanten
const ATTACK_ANIMS: Array[String] = ["2H_Ranged_Shoot"]
const RELOAD_ANIMS: Array[String] = ["2H_Ranged_Reload"]
const AIM_ANIMS: Array[String] = ["2H_Ranged_Aiming"]
const FOOTSTEP_SOUNDS: Array[String] = [
"res://resources/audio/footstep_grass_000.ogg",
"res://resources/audio/footstep_grass_001.ogg",
"res://resources/audio/footstep_grass_002.ogg",
"res://resources/audio/footstep_grass_003.ogg",
"res://resources/audio/footstep_grass_004.ogg"
]
# Tuning-Konstanten
const FOV_AIM: float = 40.0
const FOV_DEFAULT: float = 70.0
const CROSSHAIR_RAY_DISTANCE: float = 100.0
const SHOOT_RAY_LENGTH: float = 1000.0
const SPRING_ARM_AIM_OFFSET_X: float = 0.5
const SPRING_ARM_AIM_LENGTH: float = 3.0
@export var arrow_scene: PackedScene
@onready var shoot_point: Node3D = $"Rig/Skeleton3D/handslot_r/2H_Crossbow/ShootPoint"
@onready var crossbow: MeshInstance3D = $"Rig/Skeleton3D/handslot_r/2H_Crossbow"
@onready var ik_target: Node3D = $Rig/Skeleton3D/ik_target
@onready var hand_ik: SkeletonIK3D = $Rig/Skeleton3D/ik_hand_r
@export var is_loaded: bool
var current_arrow: Projectile
func _ready() -> void:
# Falls im Editor als geladen markiert, Pfeil instantiieren
if is_loaded:
load_arrow()
func _process(delta: float) -> void:
var camera := get_viewport().get_camera_3d()
if camera:
camera.fov = FOV_AIM if state == States.aiming else FOV_DEFAULT
# IK-Ziel und Waffe Richtung Fadenkreuz ausrichten
hand_ik.target = ik_target.global_transform
hand_ik.start()
var screen_center: Vector2 = get_viewport().get_visible_rect().size * 0.5
var target_pos: Vector3 = camera.project_ray_origin(screen_center) + camera.project_ray_normal(screen_center) * CROSSHAIR_RAY_DISTANCE
ik_target.global_position = target_pos
crossbow.look_at(target_pos, Vector3.UP)
crossbow.rotate_object_local(Vector3.UP, PI) # Falls -Z nach vorne zeigt
if state == States.aiming: # Aiming state
spring_arm.transform.origin.x = 0.5 # Offset to the right
spring_arm.spring_length = 3.0 # Shorter spring length for aiming
if state == States.aiming:
spring_arm.transform.origin.x = SPRING_ARM_AIM_OFFSET_X
spring_arm.spring_length = SPRING_ARM_AIM_LENGTH
super._process(delta)
func _input(event: InputEvent) -> void:
# Shoot
# Schießen
if event.is_action_pressed("attack"):
if loaded == true:
if enough_stamina_available(attack_cost):
use_stamina(attack_cost)
anim_state.travel(attacks.pick_random())
loaded = false
else:
print("No arrow loaded!")
# Reload
if Input.is_action_pressed("reload"):
if loaded == false:
anim_state.travel(reloadings.pick_random())
loaded = true
else:
print("Already loaded!")
# Aiming
if Input.is_action_pressed("block"): state = States.aiming
if Input.is_action_just_released("block"): state = States.idle
handle_attack()
# Nachladen
if event.is_action_pressed("reload"):
handle_reload()
# Zielen (gedrückt/losgelassen)
if event.is_action_pressed("block"):
state = States.aiming
if event.is_action_released("block"):
state = States.idle
anim_tree.set("parameters/conditions/aiming", state == States.aiming)
anim_tree.set("parameters/conditions/not_aiming", state != States.aiming)
# Calls the _input() from player.gd
super._input(event)
func handle_attack() -> void:
if not is_loaded:
print("No arrow loaded!")
return
if not enough_stamina_available(attack_cost):
return
use_stamina(attack_cost)
anim_state.travel(ATTACK_ANIMS.pick_random())
is_loaded = false
func handle_reload() -> void:
if is_loaded:
print("Already loaded!")
return
anim_state.travel(RELOAD_ANIMS.pick_random())
is_loaded = true
func shoot_arrow() -> void:
if current_arrow != null:
var camera := get_viewport().get_camera_3d()
if camera:
# Zielpunkt im Raum berechnen (Ray vom Fadenkreuz)
var from = camera.project_ray_origin(get_viewport().get_visible_rect().size / 2)
var to = from + camera.project_ray_normal(get_viewport().get_visible_rect().size / 2) * 1000
var direction = (to - shoot_point.global_transform.origin).normalized()
current_arrow.shoot(direction)
else:
current_arrow.shoot() # Fallback
if current_arrow == null:
return
var camera := get_viewport().get_camera_3d()
if camera:
var screen_center: Vector2 = get_viewport().get_visible_rect().size * 0.5
var from: Vector3 = camera.project_ray_origin(screen_center)
var to: Vector3 = from + camera.project_ray_normal(screen_center) * SHOOT_RAY_LENGTH
var direction: Vector3 = (to - shoot_point.global_position).normalized()
current_arrow.shoot(direction)
else:
current_arrow.shoot() # Fallback
# Beibehaltung für evtl. Animation-CallMethod; delegiert auf die neue Implementierung
func arrow_loaded() -> void:
load_arrow()
func load_arrow() -> void:
print("Arrow loaded...")
current_arrow = arrow_scene.instantiate()
#new_arrow.global_transform = shoot_point.global_transform
if arrow_scene == null:
push_warning("arrow_scene is null; cannot instantiate arrow.")
return
var arrow := arrow_scene.instantiate() as Projectile
if arrow == null:
push_warning("arrow_scene is not a Projectile.")
return
current_arrow = arrow
shoot_point.add_child(current_arrow)

@ -1,4 +1,4 @@
class_name WallDoorway extends InteractableItem
class_name WallDoorway extends ItemInteractable
func _ready() -> void:
state_changed.connect(_on_state_changed)