diff --git a/project.godot b/project.godot index d8b3deb..cf75f06 100644 --- a/project.godot +++ b/project.godot @@ -49,10 +49,6 @@ gdscript/warnings/function_used_as_property=2 window/stretch/mode="canvas_items" -[editor] - -run/main_run_args="-t --resolution 480x300" - [editor_plugins] enabled=PackedStringArray("res://addons/sky_3d/plugin.cfg", "res://addons/terrain_3d/plugin.cfg") @@ -177,6 +173,7 @@ inventory_slot_0={ 3d_render/layer_2="Sky" 3d_render/layer_3="Player" 3d_physics/layer_1="World" +3d_physics/layer_2="Players" 3d_physics/layer_3="Damage" 3d_physics/layer_4="Objective" 3d_physics/layer_32="WalkableSurface" @@ -185,7 +182,4 @@ inventory_slot_0={ 3d/run_on_separate_thread=true 3d/physics_engine="Jolt Physics" -jolt_physics_3d/simulation/speculative_contact_distance=0.0 -jolt_physics_3d/queries/use_enhanced_internal_edge_removal=true 3d/default_gravity=19.6 -3d/solver/contact_max_allowed_penetration=0.02 diff --git a/scenes/entities/components/flag_holder.tscn b/scenes/entities/components/flag_holder.tscn index 9f5bb4d..1ff9c53 100644 --- a/scenes/entities/components/flag_holder.tscn +++ b/scenes/entities/components/flag_holder.tscn @@ -1,6 +1,6 @@ -[gd_scene load_steps=5 format=3 uid="uid://ciwnbmkjqyf4d"] +[gd_scene format=3 uid="uid://ciwnbmkjqyf4d"] -[ext_resource type="Script" uid="uid://cefq7u2fatx2e" path="res://scenes/entities/components/scripts/flag_holder.gd" id="1_3kspm"] +[ext_resource type="Script" uid="uid://cefq7u2fatx2e" path="res://scripts/entities/components/flag_holder.gd" id="1_3kspm"] [ext_resource type="PackedScene" uid="uid://d3l7fvbdg6m5g" path="res://scenes/entities/flag/assets/flag.glb" id="2_p6h8o"] [ext_resource type="Texture2D" uid="uid://1mwcg0cd0msw" path="res://scenes/interfaces/hud/throw_force_texture.svg" id="3_l5ucd"] @@ -9,14 +9,14 @@ properties/0/path = NodePath(".:visible") properties/0/spawn = true properties/0/replication_mode = 2 -[node name="FlagHolder" type="Node3D"] +[node name="FlagHolder" type="Node3D" unique_id=379943701] visible = false script = ExtResource("1_3kspm") -[node name="ThrowTimer" type="Timer" parent="."] +[node name="ThrowTimer" type="Timer" parent="." unique_id=1484924086] one_shot = true -[node name="ThrowForce" type="TextureProgressBar" parent="."] +[node name="ThrowForce" type="TextureProgressBar" parent="." unique_id=1819816062] visible = false anchors_preset = 8 anchor_left = 0.5 @@ -35,7 +35,7 @@ radial_initial_angle = 293.0 radial_fill_degrees = 135.0 texture_progress = ExtResource("3_l5ucd") -[node name="Mesh" parent="." instance=ExtResource("2_p6h8o")] +[node name="Mesh" parent="." unique_id=1497174958 instance=ExtResource("2_p6h8o")] -[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="."] +[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="." unique_id=508705761] replication_config = SubResource("SceneReplicationConfig_sh8bn") diff --git a/scenes/entities/components/inventory.tscn b/scenes/entities/components/inventory.tscn index d594041..ee73887 100644 --- a/scenes/entities/components/inventory.tscn +++ b/scenes/entities/components/inventory.tscn @@ -1,6 +1,6 @@ -[gd_scene load_steps=4 format=3 uid="uid://53egh2236e1u"] +[gd_scene format=3 uid="uid://53egh2236e1u"] -[ext_resource type="Script" uid="uid://bih0550c0aj65" path="res://scenes/entities/components/scripts/inventory.gd" id="1_u5gxb"] +[ext_resource type="Script" uid="uid://bih0550c0aj65" path="res://scripts/entities/components/inventory.gd" id="1_u5gxb"] [ext_resource type="PackedScene" uid="uid://c8co0qa2omjmh" path="res://scenes/entities/weapons/space_gun/space_gun.tscn" id="2_3ti0l"] [ext_resource type="PackedScene" uid="uid://cstl7yxc75572" path="res://scenes/entities/weapons/grenade_launcher/grenade_launcher.tscn" id="3_qgqo0"] diff --git a/scenes/entities/flag/flag.gd b/scenes/entities/flag/flag.gd index 23590e0..913e7b3 100644 --- a/scenes/entities/flag/flag.gd +++ b/scenes/entities/flag/flag.gd @@ -14,8 +14,8 @@ # along with this program. If not, see . class_name Flag extends RigidBody3D -signal grabbed(by_peer:int) -signal dropped(by_peer:int) +signal grabbed(by:Node) +signal dropped(by:Node) const scene:PackedScene = preload("res://scenes/entities/flag/flag.tscn") @@ -32,13 +32,15 @@ enum FlagState { } @export var state:FlagState = FlagState.ON_STAND -@export var last_carrier:int +@export var last_carrier:Node @onready var area:Area3D = $GripArea @onready var mesh:Node3D = $Mesh @onready var waypoint:Waypoint3D = $Waypoint +# @TODO: move this variable to a server.cfg var dropped_max_duration := 30. + ## This timer is responsible for returning the flag when it is dropped for more than [member dropped_max_duration]. var respawn_timer := Timer.new() @@ -57,33 +59,36 @@ func _process(_delta:float) -> void: else: waypoint.text = "" -func _physics_process(delta:float) -> void: - var root = get_tree().current_scene - var distance_to_camera = global_position.distance_to(get_viewport().get_camera_3d().global_position) - # Determine if terrain collision is active (or too far from camera when using dynamic terrain colliton mode) - var using_fake_ground = distance_to_camera > root.map.collision_radius - if using_fake_ground: - global_position.y = root.map.data.get_height(global_position) # ground_height - linear_velocity.y = 0 +# @NOTE: simple way to deal with dynamic collision for distant objects +#func _physics_process(delta:float) -> void: + #var root := get_tree().current_scene + #var distance_to_camera := global_position.distance_to(get_viewport().get_camera_3d().global_position) + ## Determine if terrain collision is active (or too far from camera when using dynamic terrain colliton mode) + #var using_fake_ground:bool = distance_to_camera > root.map.collision_radius + #if using_fake_ground: + #global_position.y = root.map.data.get_height(global_position) # ground_height + #linear_velocity.y = 0 func _on_body_entered(body: Node) -> void: if body is Player: assert(body.flag_holder) - if state < FlagState.TAKEN: - body.flag_holder.grab(self) - hide() + body.flag_holder.grab(self) -func _on_grabbed(peer_id:int) -> void: +## This method is called immediatly after the flag is grabbed +func _on_grabbed(by:Node) -> void: assert(state < FlagState.TAKEN) - hide() state = FlagState.TAKEN - sleeping = true + freeze = true area.set_deferred("monitoring", false) - last_carrier = peer_id + last_carrier = by + hide() -func _on_dropped(_peer_id:int) -> void: +func _on_dropped(by:Node) -> void: assert(state == FlagState.TAKEN) - sleeping = false - area.set_deferred("monitoring", true) state = FlagState.DROPPED + freeze = false + # enable monitoring back after some delay + var _timer := get_tree().create_timer(1.) + _timer.timeout.connect(func() -> void: area.monitoring = true) + last_carrier = by show() diff --git a/scenes/entities/flag/flag.tscn b/scenes/entities/flag/flag.tscn index 26ca503..0e2e98d 100644 --- a/scenes/entities/flag/flag.tscn +++ b/scenes/entities/flag/flag.tscn @@ -57,12 +57,15 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) shape = ExtResource("2_ig160") [node name="GripArea" type="Area3D" parent="." unique_id=1556910033] +collision_layer = 8 +collision_mask = 11 [node name="CollisionShape3D" type="CollisionShape3D" parent="GripArea" unique_id=512420425] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) shape = ExtResource("2_ig160") [node name="Mesh" parent="." unique_id=1972686775 instance=ExtResource("2_i78em")] +transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 0, 0, 0) [node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="." unique_id=1011418792] replication_config = SubResource("SceneReplicationConfig_lpijf") diff --git a/scenes/entities/player/input_sync.gd b/scenes/entities/player/input_sync.gd index 199efe8..bb9fa0d 100644 --- a/scenes/entities/player/input_sync.gd +++ b/scenes/entities/player/input_sync.gd @@ -17,7 +17,6 @@ class_name InputSynchronizer extends MultiplayerSynchronizer # synchronized properties @export var jetting:bool = false @export var skiing:bool = false -# @NOTE: make this direction a ready to use Vector3 instead @export var direction:Vector3 @export var rotation:Vector3 @@ -71,10 +70,9 @@ func _unhandled_input(event:InputEvent) -> void: _primary.rpc(event.pressed) elif event.is_action_pressed("secondary"): _jump.rpc() - elif event.is_action_pressed("throw"): + elif event.is_action("throw") and not event.is_echo(): _throw.rpc(event.pressed) elif event.is_action_pressed("wheel_up"): - # @TODO: add settings for cycle direction _cycle.rpc(1) elif event.is_action_pressed("wheel_down"): _cycle.rpc(-1) diff --git a/scenes/entities/player/player.gd b/scenes/entities/player/player.gd index 753a2ca..44dc465 100644 --- a/scenes/entities/player/player.gd +++ b/scenes/entities/player/player.gd @@ -49,8 +49,6 @@ static func instantiate() -> Player: @onready var spring_arm:SpringArm3D = $Pivot/SpringArm3D @onready var tp_head_remote_transform:RemoteTransform3D = $Pivot/Mesh/Node/Skeleton3D/Head/RT_Head -@export var travel_acceleration_curve:Curve - @export_category("Components") ## The is player [IFF] (Indicator Friend or Foe) component. @export var iff:IFF diff --git a/scenes/entities/player/player.tscn b/scenes/entities/player/player.tscn index 86ab8af..fe2754c 100644 --- a/scenes/entities/player/player.tscn +++ b/scenes/entities/player/player.tscn @@ -4,10 +4,10 @@ [ext_resource type="PackedScene" uid="uid://bbeecp3jusppn" path="res://scenes/interfaces/hud/iffs/IFF.tscn" id="2_s5wgp"] [ext_resource type="PackedScene" uid="uid://bcv81ku26xo" path="res://scenes/interfaces/hud/hud.tscn" id="3_ccety"] [ext_resource type="Shape3D" uid="uid://cb8esdlnottdn" path="res://scenes/entities/player/assets/collider.tres" id="4_8kvcy"] -[ext_resource type="Script" uid="uid://c2df3oj23o0wa" path="res://scenes/entities/components/scripts/health.gd" id="4_18p7g"] +[ext_resource type="Script" uid="uid://c2df3oj23o0wa" path="res://scripts/entities/components/health.gd" id="4_18p7g"] [ext_resource type="Script" uid="uid://c0v6nfmjxp045" path="res://scenes/entities/player/scripts/energy.gd" id="5_18p7g"] -[ext_resource type="Script" uid="uid://bih0550c0aj65" path="res://scenes/entities/components/scripts/inventory.gd" id="6_pcd0u"] -[ext_resource type="Script" uid="uid://bh5mmolmfwj7h" path="res://scenes/entities/components/scripts/loadout.gd" id="7_pcd0u"] +[ext_resource type="Script" uid="uid://bih0550c0aj65" path="res://scripts/entities/components/inventory.gd" id="6_pcd0u"] +[ext_resource type="Script" uid="uid://bh5mmolmfwj7h" path="res://scripts/entities/components/loadout.gd" id="7_pcd0u"] [ext_resource type="PackedScene" uid="uid://c8co0qa2omjmh" path="res://scenes/entities/weapons/space_gun/space_gun.tscn" id="7_yywfu"] [ext_resource type="Texture2D" uid="uid://ct1v5iadtpadm" path="res://scenes/entities/player/assets/jetpackfx/smoke_01.png" id="9_4pant"] [ext_resource type="PackedScene" uid="uid://cstl7yxc75572" path="res://scenes/entities/weapons/grenade_launcher/grenade_launcher.tscn" id="9_knby6"] @@ -27,10 +27,6 @@ resource_local_to_scene = true bounce = 1.0 absorbent = true -[sub_resource type="Curve" id="Curve_7dqom"] -_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0] -point_count = 2 - [sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_18p7g"] properties/0/path = NodePath(".:value") properties/0/spawn = true @@ -4124,7 +4120,6 @@ continuous_cd = true script = ExtResource("1_y2i7h") input = NodePath("InputSynchronizer") dominant_laterality = 0 -travel_acceleration_curve = SubResource("Curve_7dqom") iff = NodePath("IFF") health = NodePath("Health") energy = NodePath("Energy") @@ -4172,19 +4167,20 @@ replication_config = SubResource("SceneReplicationConfig_go8vc") transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.75, 0) [node name="FlagHolder" parent="Pivot" unique_id=2064483558 instance=ExtResource("9_yqrof")] -transform = Transform3D(-0.6674206, -0.0039073885, 0.8743766, 0.069051005, 1.0963181, 0.057606522, -0.87165445, 0.08984035, -0.6649414, -0.18662778, -0.45797598, 0.15343875) +transform = Transform3D(-0.65634036, -0.034888066, 0.88204324, 0.059532925, 1.0948886, 0.08760617, -0.88072306, 0.100009166, -0.6514024, -0.18194272, -0.45592213, 0.14700356) [node name="SpringArm3D" type="SpringArm3D" parent="Pivot" unique_id=1512107091] spring_length = 0.0 [node name="Camera3D" type="Camera3D" parent="Pivot/SpringArm3D" unique_id=378827417] -transform = Transform3D(1, 0, 2.98023e-07, 0, 1, 0, -2.98023e-07, 0, 1, 0.014624884, -0.01053226, 0.015016291) +transform = Transform3D(1, 0, 2.98023e-07, 0, 1, 0, -2.98023e-07, 0, 1, 0.008185344, -0.0012946129, 0.02404015) cull_mask = 1048571 fov = 90.0 +far = 2048.0 script = SubResource("GDScript_yywfu") [node name="Inventory" type="Node3D" parent="Pivot/SpringArm3D" unique_id=1438258666] -transform = Transform3D(0.999975, 1.78819e-07, 0, -1.78814e-07, 0.999992, 0, 1.78814e-07, 1.13687e-13, 1.00001, 0.26154926, -0.46331096, -0.09845946) +transform = Transform3D(0.999975, 1.78819e-07, 0, -1.78814e-07, 0.999992, 0, 1.78814e-07, 1.13687e-13, 1.00001, 0.26200315, -0.45637846, -0.102321304) script = ExtResource("6_pcd0u") loadout = SubResource("Resource_yywfu") @@ -4197,7 +4193,7 @@ spawn_limit = 3 transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.1, 0.075, -0.175) [node name="Mesh" type="Node3D" parent="Pivot" unique_id=1158972654] -transform = Transform3D(-1.1, 0, -1.66095e-07, 0, 1.1, 0, 1.66095e-07, 0, -1.1, 0, -1.75, 0) +transform = Transform3D(-1.1, 0, -1.6609539e-07, 0, 1.1, 0, 1.6609539e-07, 0, -1.1, 0, -1.75, 0) script = ExtResource("12_we0b7") [node name="Node" type="Node3D" parent="Pivot/Mesh" unique_id=919762305] @@ -4208,8 +4204,8 @@ bones/0/name = "mixamorigHips" bones/0/parent = -1 bones/0/rest = Transform3D(0.840322, -0.0112564, -0.54197, 0.100302, 0.98575, 0.135045, 0.532727, -0.167842, 0.829476, -0.108641, 1.00646, 0.128315) bones/0/enabled = true -bones/0/position = Vector3(-0.002052404, 0.98129636, 0.0006635934) -bones/0/rotation = Quaternion(-0.07004869, -0.46052682, -0.015985264, 0.8847332) +bones/0/position = Vector3(-0.0063307732, 0.98749405, 0.0039958134) +bones/0/rotation = Quaternion(-0.059231613, -0.46074396, -0.010282587, 0.8854947) bones/0/scale = Vector3(1, 1, 1) bones/0/bone_meta/extras = { "transformData": { @@ -4234,7 +4230,7 @@ bones/2/parent = 0 bones/2/rest = Transform3D(0.99997, -0.00719291, 0.00291518, 0.0071261, 0.999726, 0.022313, -0.00307487, -0.0222916, 0.999747, -0.000381054, 0.0949051, -0.0139206) bones/2/enabled = true bones/2/position = Vector3(-0.000381054, 0.0949051, -0.0139206) -bones/2/rotation = Quaternion(-0.007896309, 0.00722248, 0.004365788, 0.99993324) +bones/2/rotation = Quaternion(-0.02499322, 0.0036796855, 0.0059157913, 0.99966335) bones/2/scale = Vector3(1, 1, 1) bones/2/bone_meta/extras = { "transformData": { @@ -4259,7 +4255,7 @@ bones/4/parent = 2 bones/4/rest = Transform3D(0.999772, -0.00744334, 0.0200044, 0.00913675, 0.996258, -0.08594, -0.0192899, 0.0861032, 0.996099, 2.10942e-17, 0.111908, -2.27018e-14) bones/4/enabled = true bones/4/position = Vector3(2.10942e-17, 0.111908, -2.27018e-14) -bones/4/rotation = Quaternion(0.052176304, 0.011090109, 0.011241058, 0.99851304) +bones/4/rotation = Quaternion(0.043055557, 0.008567377, 0.0046201134, 0.9990253) bones/4/scale = Vector3(1, 1, 1) bones/4/bone_meta/extras = { "transformData": { @@ -4284,7 +4280,7 @@ bones/6/parent = 4 bones/6/rest = Transform3D(0.999829, 0.00457417, 0.0179285, 0.000811383, 0.95719, -0.28946, -0.0184851, 0.289425, 0.957022, -1.12617e-11, 0.127895, 1.62274e-09) bones/6/enabled = true bones/6/position = Vector3(-1.12617e-11, 0.127895, 1.62274e-09) -bones/6/rotation = Quaternion(0.16492026, 0.014548209, -0.0058699953, 0.98618215) +bones/6/rotation = Quaternion(0.1443437, 0.0076817703, 0.00019370053, 0.9894978) bones/6/scale = Vector3(1, 1, 1) bones/6/bone_meta/extras = { "transformData": { @@ -4309,7 +4305,7 @@ bones/8/parent = 6 bones/8/rest = Transform3D(0.166448, -0.959107, 0.228929, -0.251609, -0.265794, -0.930616, 0.953409, 0.097299, -0.285561, -0.0672877, 0.117567, -0.0205846) bones/8/enabled = true bones/8/position = Vector3(-0.0672877, 0.117567, -0.0205846) -bones/8/rotation = Quaternion(0.6725654, -0.4258957, 0.41416818, 0.4412861) +bones/8/rotation = Quaternion(0.677974, -0.39901322, 0.40137878, 0.46907872) bones/8/scale = Vector3(1, 1, 1) bones/8/bone_meta/extras = { "transformData": { @@ -4334,7 +4330,7 @@ bones/10/parent = 8 bones/10/rest = Transform3D(0.738572, 0.406156, -0.538097, -0.657443, 0.610624, -0.441482, 0.149265, 0.679834, 0.718015, 0, 0.144488, 2.84217e-16) bones/10/enabled = true bones/10/position = Vector3(0, 0.144488, 2.84217e-16) -bones/10/rotation = Quaternion(0.28060567, -0.13303672, -0.27172375, 0.91089404) +bones/10/rotation = Quaternion(0.29777864, -0.17430125, -0.23311573, 0.90917766) bones/10/scale = Vector3(1, 0.999999, 1) bones/10/bone_meta/extras = { "transformData": { @@ -4359,7 +4355,7 @@ bones/12/parent = 10 bones/12/rest = Transform3D(-0.162568, 0.970006, 0.180723, -0.881527, -0.0605007, -0.468241, -0.443263, -0.235434, 0.864921, -8.53685e-10, 0.231603, 0) bones/12/enabled = true bones/12/position = Vector3(-8.53685e-10, 0.231603, 0) -bones/12/rotation = Quaternion(0.08545353, 0.24508853, -0.7250717, 0.6378875) +bones/12/rotation = Quaternion(0.073658906, 0.23617035, -0.7251226, 0.642647) bones/12/scale = Vector3(1, 1, 0.999999) bones/12/bone_meta/extras = { "transformData": { @@ -4384,7 +4380,7 @@ bones/14/parent = 12 bones/14/rest = Transform3D(0.968394, 0.2492, 0.0105764, -0.249182, 0.964715, 0.0850511, 0.0109915, -0.0849985, 0.99632, 3.93518e-09, 0.240717, 5.26683e-12) bones/14/enabled = true bones/14/position = Vector3(3.93518e-09, 0.240717, 5.26683e-12) -bones/14/rotation = Quaternion(0.10928703, 0.04473894, -0.18593398, 0.97544014) +bones/14/rotation = Quaternion(0.09711099, 0.067824416, -0.19662778, 0.9732969) bones/14/scale = Vector3(1, 1, 1) bones/14/bone_meta/extras = { "transformData": { @@ -4906,7 +4902,7 @@ bones/56/parent = 6 bones/56/rest = Transform3D(0.999949, -0.00320252, 0.00960124, 0.000671414, 0.96752, 0.252792, -0.010099, -0.252773, 0.967473, -0.000568679, 0.142358, -0.0208809) bones/56/enabled = true bones/56/position = Vector3(-0.000568679, 0.142358, -0.0208809) -bones/56/rotation = Quaternion(0.017421698, 0.050302185, -0.00430328, 0.9985728) +bones/56/rotation = Quaternion(0.02282005, 0.04879616, 0.00013798969, 0.99854803) bones/56/scale = Vector3(1, 1, 1) bones/56/bone_meta/extras = { "transformData": { @@ -4930,7 +4926,7 @@ bones/58/parent = 56 bones/58/rest = Transform3D(0.897566, 0.100881, 0.429184, -0.370227, 0.701041, 0.609486, -0.23939, -0.705949, 0.666579, 3.59272e-12, 0.0328022, 0.00313332) bones/58/enabled = true bones/58/position = Vector3(3.59272e-12, 0.0328022, 0.00313332) -bones/58/rotation = Quaternion(-0.023273136, 0.3029091, -0.060544655, 0.9508096) +bones/58/rotation = Quaternion(-0.0032725618, 0.32101098, -0.04812093, 0.94584656) bones/58/scale = Vector3(1, 1, 1) bones/58/bone_meta/extras = { "transformData": { @@ -4978,7 +4974,7 @@ bones/62/parent = 6 bones/62/rest = Transform3D(0.418567, 0.818421, -0.393685, 0.0144908, -0.439449, -0.898151, -0.90807, 0.370232, -0.195798, 0.0672877, 0.117566, -0.0205846) bones/62/enabled = true bones/62/position = Vector3(0.0672877, 0.117566, -0.0205846) -bones/62/rotation = Quaternion(0.72069615, 0.34667727, -0.39491805, 0.4521633) +bones/62/rotation = Quaternion(0.70425487, 0.3615935, -0.3964566, 0.46486288) bones/62/scale = Vector3(1, 1, 1) bones/62/bone_meta/extras = { "transformData": { @@ -5003,7 +4999,7 @@ bones/64/parent = 62 bones/64/rest = Transform3D(0.89629, -0.416688, -0.151774, 0.229002, 0.727966, -0.646238, 0.379766, 0.54446, 0.747892, 3.55271e-17, 0.144488, 0) bones/64/enabled = true bones/64/position = Vector3(3.55271e-17, 0.144488, 0) -bones/64/rotation = Quaternion(0.37971902, -0.25614035, 0.10029207, 0.8832594) +bones/64/rotation = Quaternion(0.41133937, -0.22071162, 0.070427865, 0.88154763) bones/64/scale = Vector3(1, 1, 1) bones/64/bone_meta/extras = { "transformData": { @@ -5028,7 +5024,7 @@ bones/66/parent = 64 bones/66/rest = Transform3D(0.00458962, -0.878165, -0.478335, 0.00417536, 0.478353, -0.878158, 0.999981, 0.00203318, 0.00586212, -7.99361e-17, 0.231603, -2.84217e-16) bones/66/enabled = true bones/66/position = Vector3(-7.99361e-17, 0.231603, -2.84217e-16) -bones/66/rotation = Quaternion(0.5366648, -0.5635461, 0.43584213, 0.45215964) +bones/66/rotation = Quaternion(0.5360815, -0.57642156, 0.4231218, 0.4486901) bones/66/scale = Vector3(1, 1, 1) bones/66/bone_meta/extras = { "transformData": { @@ -5053,7 +5049,7 @@ bones/68/parent = 66 bones/68/rest = Transform3D(0.659074, 0.052151, -0.750268, -0.155553, 0.985474, -0.0681455, 0.735816, 0.161619, 0.657613, -1.77636e-17, 0.240718, 0) bones/68/enabled = true bones/68/position = Vector3(-1.77636e-17, 0.240718, 0) -bones/68/rotation = Quaternion(0.014293031, -0.23843515, 0.07320828, 0.96828973) +bones/68/rotation = Quaternion(0.038727142, -0.23529421, 0.080569126, 0.9678045) bones/68/scale = Vector3(1, 1, 1) bones/68/bone_meta/extras = { "transformData": { @@ -5577,7 +5573,7 @@ bones/110/parent = 0 bones/110/rest = Transform3D(-0.91222, -0.282496, -0.296733, 0.315884, -0.94619, -0.0703024, -0.260905, -0.157864, 0.952369, -0.0994098, -0.0527242, -0.0101088) bones/110/enabled = true bones/110/position = Vector3(-0.0994098, -0.0527242, -0.0101088) -bones/110/rotation = Quaternion(-0.18759225, 0.15787517, 0.95606756, 0.16068429) +bones/110/rotation = Quaternion(-0.1886969, 0.1586396, 0.95626295, 0.15744276) bones/110/scale = Vector3(1, 1, 1) bones/110/bone_meta/extras = { "transformData": { @@ -5602,7 +5598,7 @@ bones/112/parent = 110 bones/112/rest = Transform3D(0.929344, 0.0683616, 0.362832, -0.246173, 0.847127, 0.47093, -0.275172, -0.526975, 0.804101, -1.55044e-09, 0.433648, -1.11022e-16) bones/112/enabled = true bones/112/position = Vector3(-1.55044e-09, 0.433648, -1.11022e-16) -bones/112/rotation = Quaternion(-0.39658067, 0.01996214, -0.03707125, 0.9170339) +bones/112/rotation = Quaternion(-0.37956765, 0.023052681, -0.03639854, 0.92416024) bones/112/scale = Vector3(1, 1, 1) bones/112/bone_meta/extras = { "transformData": { @@ -5627,7 +5623,7 @@ bones/114/parent = 112 bones/114/rest = Transform3D(0.941956, 0.141806, 0.30432, 0.225352, 0.404852, -0.886178, -0.24887, 0.903319, 0.349396, 4.96938e-09, 0.44493, 8.88178e-17) bones/114/enabled = true bones/114/position = Vector3(4.96938e-09, 0.44493, 8.88178e-17) -bones/114/rotation = Quaternion(0.54032165, 0.058724742, 0.047654618, 0.8380531) +bones/114/rotation = Quaternion(0.53526986, 0.058657013, 0.047999293, 0.84127384) bones/114/scale = Vector3(1, 1, 1) bones/114/bone_meta/extras = { "transformData": { @@ -5701,7 +5697,7 @@ bones/120/parent = 0 bones/120/rest = Transform3D(-0.97191, 0.126861, 0.198235, -0.0758087, -0.966144, 0.246613, 0.222809, 0.224658, 0.948623, 0.0961826, -0.0527232, -0.0101089) bones/120/enabled = true bones/120/position = Vector3(0.0961826, -0.0527232, -0.0101089) -bones/120/rotation = Quaternion(0.13472028, 0.19166389, 0.9651029, -0.11701269) +bones/120/rotation = Quaternion(0.1351276, 0.19175674, 0.96536964, -0.11415474) bones/120/scale = Vector3(1, 1, 1) bones/120/bone_meta/extras = { "transformData": { @@ -5726,7 +5722,7 @@ bones/122/parent = 120 bones/122/rest = Transform3D(0.99626, 0.0304266, -0.0808751, 0.0180711, 0.841892, 0.539343, 0.0844985, -0.538787, 0.838193, 1.06581e-16, 0.43365, 2.53131e-16) bones/122/enabled = true bones/122/position = Vector3(1.06581e-16, 0.43365, 2.53131e-16) -bones/122/rotation = Quaternion(-0.3227801, -0.12107396, 0.030268976, 0.93820995) +bones/122/rotation = Quaternion(-0.30433115, -0.12461352, 0.028640933, 0.94394594) bones/122/scale = Vector3(1, 1, 1) bones/122/bone_meta/extras = { "transformData": { @@ -5751,7 +5747,7 @@ bones/124/parent = 122 bones/124/rest = Transform3D(0.998261, 0.0403719, -0.0429512, -0.057954, 0.539038, -0.840285, -0.0107716, 0.841314, 0.54044, 6.80091e-09, 0.44493, 2.44249e-16) bones/124/enabled = true bones/124/position = Vector3(6.80091e-09, 0.44493, 2.44249e-16) -bones/124/rotation = Quaternion(0.4267349, -0.07353834, -0.021167269, 0.9011334) +bones/124/rotation = Quaternion(0.42179984, -0.0729473, -0.020230481, 0.90352327) bones/124/scale = Vector3(1, 1, 1) bones/124/bone_meta/extras = { "transformData": { @@ -5850,7 +5846,7 @@ metadata/extras = { } [node name="Head" type="BoneAttachment3D" parent="Pivot/Mesh/Node/Skeleton3D" unique_id=1249179736] -transform = Transform3D(0.9815701, -0.13703907, -0.13319325, 0.10977411, 0.97483927, -0.19400467, 0.15642819, 0.175808, 0.9719165, -0.0010545002, 1.4838504, -0.029447766) +transform = Transform3D(0.98060906, -0.14383163, -0.13311046, 0.12020373, 0.97788936, -0.17112455, 0.15478036, 0.15180594, 0.97621626, 0.005478885, 1.4919432, -0.035251066) bone_name = "mixamorigHead" bone_idx = 58 @@ -5861,12 +5857,12 @@ update_rotation = false update_scale = false [node name="LeftHand" type="BoneAttachment3D" parent="Pivot/Mesh/Node/Skeleton3D" unique_id=193420688] -transform = Transform3D(-0.5248522, -0.8149367, 0.24578059, 0.34175372, 0.062700644, 0.93769544, -0.779573, 0.57614815, 0.24559914, -0.08869287, 1.1722004, 0.32468426) +transform = Transform3D(-0.52726996, -0.8121701, 0.24973288, 0.34432584, 0.06446422, 0.93663454, -0.77680516, 0.5798487, 0.24566111, -0.08871077, 1.1793221, 0.32737708) bone_name = "mixamorigLeftHand" bone_idx = 68 [node name="RightHand" type="BoneAttachment3D" parent="Pivot/Mesh/Node/Skeleton3D" unique_id=593252078] -transform = Transform3D(-0.1731301, 0.046542034, 0.9837976, 0.9369213, 0.31574342, 0.14994255, -0.30364984, 0.94770217, -0.09827159, -0.24295405, 1.1444879, 0.015566632) +transform = Transform3D(-0.17289613, 0.051788636, 0.98357654, 0.93714803, 0.31594095, 0.14809866, -0.30308312, 0.94736433, -0.10315942, -0.24378592, 1.1507742, 0.019104391) bone_name = "mixamorigRightHand" bone_idx = 14 @@ -5888,7 +5884,7 @@ tip_bone = &"mixamorigRightHand_2" override_tip_basis = false [node name="Neck" type="BoneAttachment3D" parent="Pivot/Mesh/Node/Skeleton3D" unique_id=383704236] -transform = Transform3D(0.6067459, 0.0035521835, -0.7948879, 0.06277364, 0.9966528, 0.052369565, 0.79241323, -0.08167305, 0.604492, 0.029093198, 1.1837319, -0.031919427) +transform = Transform3D(0.59667295, 0.031716436, -0.8018576, 0.05412084, 0.9953532, 0.07964197, 0.8006574, -0.090917416, 0.5921839, 0.02361435, 1.1903718, -0.028223187) bone_name = "mixamorigSpine1" bone_idx = 4 @@ -5925,7 +5921,7 @@ parameters/transition/transition_request = "" parameters/transition/current_index = 0 [node name="Jetpack" type="Node3D" parent="Pivot" unique_id=2136871172 node_paths=PackedStringArray("input", "energy")] -transform = Transform3D(-0.251616, 0.148812, 1.06045, 0.0939164, 1.08821, -0.130422, -1.06672, 0.0607055, -0.261622, -0.1985025, -0.35181713, 0.17094094) +transform = Transform3D(-0.251616, 0.148812, 1.06045, 0.0939164, 1.08821, -0.130422, -1.06672, 0.0607055, -0.261622, -0.19693954, -0.3502971, 0.16531946) script = ExtResource("17_fg2wu") input = NodePath("../../InputSynchronizer") energy = NodePath("../../Energy") diff --git a/scenes/entities/components/scripts/flag_holder.gd b/scripts/entities/components/flag_holder.gd similarity index 53% rename from scenes/entities/components/scripts/flag_holder.gd rename to scripts/entities/components/flag_holder.gd index e647449..7b19ca8 100644 --- a/scenes/entities/components/scripts/flag_holder.gd +++ b/scripts/entities/components/flag_holder.gd @@ -13,7 +13,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . @icon("res://assets/icons/flag_holder.svg") -## This component is a unified system to manage [Flag] ownership, interaction +## This component is a unified system to manage [Flag] ownership, interaction ## logic, and visual displays for the owning Entity. class_name FlagHolder extends Node3D @@ -26,7 +26,7 @@ class_name FlagHolder extends Node3D ## The flag mesh to display when the owner carries the flag @onready var mesh: Node3D = $Mesh -## The reference to a [Flag] node, useful when [member Flag.state] is [member Flag.FlagState.TAKEN] +## The [Flag] instance to hold var flag:Flag func _process(_delta: float) -> void: @@ -34,60 +34,54 @@ func _process(_delta: float) -> void: var time_elapsed: float = timer.wait_time - timer.time_left texture_progress.value = time_elapsed / timer.wait_time * 100 -## This method grabs a [Flag] which set the mesh visible, holds a reference to it +## This method grabs a [Flag] which set the mesh visible, holds a reference to it ## and emits the [Flag.grabbed] signal to handle further state changes func grab(p_flag:Flag) -> void: if p_flag.state < Flag.FlagState.TAKEN: - show() flag = p_flag - flag.grabbed.emit(owner.peer_id) - -@rpc("any_peer", "call_local", "reliable") + flag.grabbed.emit(self) + show() + func drop() -> void: if multiplayer.is_server() and flag and flag.state == flag.FlagState.TAKEN: - flag.dropped.emit(owner.peer_id) - if owner: - # set flag mesh to face velocity - flag.global_position = owner.global_position + flag.global_position = global_position + flag.global_rotation.y = global_rotation.y + # inheritance + if owner is RigidBody3D: flag.global_rotation.y = -flag.global_basis.z.dot(owner.linear_velocity) - # apply impulse to wake up the flag flag.apply_impulse.call_deferred(flag.mass * owner.linear_velocity) + flag.dropped.emit(self) flag = null - hide() -## This method send the throw input to the multiplayer authority while -## displaying a throw force progress on the [HUD] of the client. -## When the throw action is released (before an abort timeout) it will also -## send that input to the authority and stop displaying the throw force progress -## on the [HUD] of the client. +## This method displays throw force progress on the [HUD] of a client and upon release +## it throws the [Flag]. It has no effect when holding no flag or flag is [member Flag.FlagState.TAKEN] func throw(pressed:bool) -> void: - prints("flag_holder._throw", owner.peer_id, multiplayer.get_unique_id(), pressed, flag) if flag and flag.state == flag.FlagState.TAKEN: if pressed: timer.start() texture_progress.visible = true else: + if timer.is_stopped(): + texture_progress.visible = false + return + var time_elapsed:float = timer.wait_time - timer.time_left timer.stop() texture_progress.visible = false - #if is_multiplayer_authority(): - #var time_elapsed:float = timer.wait_time - timer.time_left - #var pumped_force:float = clampf(time_elapsed / timer.wait_time * throw_force, 6., throw_force) - #var throw_velocity:Vector3 = -owner.spring_arm.global_basis.z * pumped_force - #var total_velocity:Vector3 = owner.linear_velocity + throw_velocity - # - #flag.dropped.emit(owner.peer_id) - # - #var impulse:Vector3 = flag.mass * total_velocity - ## set flag mesh to face velocity - #var aim_offset:Vector3 = -owner.spring_arm.global_basis.z - #aim_offset.y = 1. if aim_offset.y < 1. else aim_offset.y - # - #flag.global_position = owner.global_position + aim_offset - ##flag.global_position = owner.global_position + -owner.spring_arm.global_basis.z - #flag.global_rotation.y = -flag.global_basis.z.dot(impulse) - ## apply impulse to wake up the flag - #flag.apply_impulse.call_deferred(flag.mass * (owner.linear_velocity + throw_velocity)) - # - #flag = null - #hide() + var pumped_force:float = clampf(time_elapsed / timer.wait_time * throw_force, 6., throw_force) + var throw_velocity:Vector3 = -global_basis.z * pumped_force + + if owner: + flag.global_position = owner.global_position + flag.global_rotation.y = owner.camera.global_rotation.y + throw_velocity = -owner.camera.global_basis.z * pumped_force + owner.linear_velocity + else: + flag.global_position = global_position + flag.global_position.y = global_rotation.y + + var impulse:Vector3 = flag.mass * throw_velocity + flag.apply_impulse.call_deferred(impulse) + + hide() + flag.dropped.emit(self) + flag = null diff --git a/scenes/entities/components/scripts/flag_holder.gd.uid b/scripts/entities/components/flag_holder.gd.uid similarity index 100% rename from scenes/entities/components/scripts/flag_holder.gd.uid rename to scripts/entities/components/flag_holder.gd.uid diff --git a/scenes/entities/components/scripts/health.gd b/scripts/entities/components/health.gd similarity index 99% rename from scenes/entities/components/scripts/health.gd rename to scripts/entities/components/health.gd index 29663cb..3527368 100644 --- a/scenes/entities/components/scripts/health.gd +++ b/scripts/entities/components/health.gd @@ -12,7 +12,6 @@ # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -@tool ## This class defines a Health component for entities. class_name Health extends Area3D diff --git a/scenes/entities/components/scripts/health.gd.uid b/scripts/entities/components/health.gd.uid similarity index 100% rename from scenes/entities/components/scripts/health.gd.uid rename to scripts/entities/components/health.gd.uid diff --git a/scenes/entities/components/scripts/inventory.gd b/scripts/entities/components/inventory.gd similarity index 100% rename from scenes/entities/components/scripts/inventory.gd rename to scripts/entities/components/inventory.gd diff --git a/scenes/entities/components/scripts/inventory.gd.uid b/scripts/entities/components/inventory.gd.uid similarity index 100% rename from scenes/entities/components/scripts/inventory.gd.uid rename to scripts/entities/components/inventory.gd.uid diff --git a/scenes/entities/components/scripts/item.gd b/scripts/entities/components/item.gd similarity index 100% rename from scenes/entities/components/scripts/item.gd rename to scripts/entities/components/item.gd diff --git a/scenes/entities/components/scripts/item.gd.uid b/scripts/entities/components/item.gd.uid similarity index 100% rename from scenes/entities/components/scripts/item.gd.uid rename to scripts/entities/components/item.gd.uid diff --git a/scenes/entities/components/scripts/item_storage.gd b/scripts/entities/components/item_storage.gd similarity index 100% rename from scenes/entities/components/scripts/item_storage.gd rename to scripts/entities/components/item_storage.gd diff --git a/scenes/entities/components/scripts/item_storage.gd.uid b/scripts/entities/components/item_storage.gd.uid similarity index 100% rename from scenes/entities/components/scripts/item_storage.gd.uid rename to scripts/entities/components/item_storage.gd.uid diff --git a/scenes/entities/components/scripts/loadout.gd b/scripts/entities/components/loadout.gd similarity index 100% rename from scenes/entities/components/scripts/loadout.gd rename to scripts/entities/components/loadout.gd diff --git a/scenes/entities/components/scripts/loadout.gd.uid b/scripts/entities/components/loadout.gd.uid similarity index 100% rename from scenes/entities/components/scripts/loadout.gd.uid rename to scripts/entities/components/loadout.gd.uid diff --git a/scenes/entities/components/scripts/old_inventory.gd b/scripts/entities/components/old_inventory.gd similarity index 100% rename from scenes/entities/components/scripts/old_inventory.gd rename to scripts/entities/components/old_inventory.gd diff --git a/scenes/entities/components/scripts/old_inventory.gd.uid b/scripts/entities/components/old_inventory.gd.uid similarity index 100% rename from scenes/entities/components/scripts/old_inventory.gd.uid rename to scripts/entities/components/old_inventory.gd.uid diff --git a/tests/test_flag.gd b/tests/test_flag.gd index f340f51..a0ac394 100644 --- a/tests/test_flag.gd +++ b/tests/test_flag.gd @@ -37,7 +37,7 @@ func test_grab_flag() -> void: _carry.grab(_subject) assert_signal_emitted_with_parameters(_subject, 'grabbed', [_carry]) assert_eq(_subject.state, Flag.FlagState.TAKEN) - assert_eq(_subject.last_carrier, null) + assert_eq(_subject.last_carrier, _carry) assert_false(_subject.is_visible()) func test_drop_flag() -> void: @@ -59,3 +59,16 @@ func test_grab_already_taken_flag() -> void: _new_carry.grab(_subject) assert_null(_new_carry.flag) assert_eq(_carry.flag, _subject) + +func test_flag_drop_position() -> void: + test_grab_flag() + _carry.global_position = Vector3(5., 0., 5.) + _carry.drop() + assert_eq(_subject.global_position, _carry.global_position) + +func test_flag_throw_position() -> void: + test_grab_flag() + _carry.global_position = Vector3(5., 0., 5.) + _carry.throw(true) + _carry.throw(false) + assert_eq(_subject.global_position, _carry.global_position) diff --git a/tests/test_health.gd b/tests/test_health.gd index 95682cd..63365c3 100644 --- a/tests/test_health.gd +++ b/tests/test_health.gd @@ -15,12 +15,12 @@ extends GutTest var _subject:Health -const TEST_MAX_VALUE:int = 255 +const HEALTH_MAX_VALUE:int = 255 func before_each() -> void: _subject = Health.new() watch_signals(_subject) - autoqfree(_subject) + autofree(_subject) func test_that_it_has_max_health_when_ready() -> void: assert_eq(_subject.value, _subject.max_value) @@ -28,23 +28,23 @@ func test_that_it_has_max_health_when_ready() -> void: func test_that_it_takes_damage_from_opponent_team() -> void: var amount:int = 42 _subject.damage(amount, -1) - assert_eq(_subject.value, TEST_MAX_VALUE - amount) + assert_eq(_subject.value, HEALTH_MAX_VALUE - amount) func test_that_it_can_self_damage() -> void: var amount:int = 42 _subject.damage(amount, 1) - assert_eq(_subject.value, TEST_MAX_VALUE - amount) + assert_eq(_subject.value, HEALTH_MAX_VALUE - amount) func test_that_it_emits_health_changed_after_damage() -> void: _subject.damage(42, -1) assert_signal_emitted(_subject, 'changed') func test_that_it_emits_signals_when_health_value_is_min_value() -> void: - _subject.damage(TEST_MAX_VALUE, -1) + _subject.damage(HEALTH_MAX_VALUE, -1) assert_signal_emitted_with_parameters(_subject, 'killed', [-1]) assert_signal_emitted(_subject, 'exhausted') func test_that_it_heals_fully() -> void: _subject.value = 42 _subject.heal() - assert_eq(_subject.value, TEST_MAX_VALUE) + assert_eq(_subject.value, HEALTH_MAX_VALUE)