diff --git a/entities/flag/assets/flag.tscn b/entities/flag/assets/flag.tscn
deleted file mode 100644
index e222604..0000000
--- a/entities/flag/assets/flag.tscn
+++ /dev/null
@@ -1,5 +0,0 @@
-[gd_scene load_steps=2 format=3 uid="uid://b8xj25dhhbagw"]
-
-[ext_resource type="PackedScene" uid="uid://bftyiy6r0xaa3" path="res://entities/flag/assets/flag.glb" id="1_pd02q"]
-
-[node name="flag2" instance=ExtResource("1_pd02q")]
diff --git a/entities/flag/flag.tscn b/entities/flag/flag.tscn
index 7dfd975..a9d626a 100644
--- a/entities/flag/flag.tscn
+++ b/entities/flag/flag.tscn
@@ -1,7 +1,8 @@
-[gd_scene load_steps=6 format=3 uid="uid://c88l3h0ph00c7"]
+[gd_scene load_steps=7 format=3 uid="uid://c88l3h0ph00c7"]
[ext_resource type="Script" path="res://entities/flag/flag.gd" id="1_y7d3d"]
-[ext_resource type="PackedScene" uid="uid://d3l7fvbdg6m5g" path="res://entities/flag/assets/flag.glb" id="2_i78em"]
+[ext_resource type="PackedScene" uid="uid://dqrx87qbea1pr" path="res://entities/flag/assets/flag.glb" id="2_i78em"]
+[ext_resource type="PackedScene" uid="uid://bcgkc5fhhyauv" path="res://entities/flag/waypoint.tscn" id="3_tu6jg"]
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_4ymrw"]
bounce = 0.5
@@ -42,3 +43,9 @@ shape = SubResource("BoxShape3D_fkf1k")
[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="."]
replication_config = SubResource("SceneReplicationConfig_lpijf")
+
+[node name="WaypointAttachment" type="Marker3D" parent="."]
+
+[node name="Waypoint" parent="WaypointAttachment" node_paths=PackedStringArray("attach_point", "flag") instance=ExtResource("3_tu6jg")]
+attach_point = NodePath("..")
+flag = NodePath("../..")
diff --git a/entities/flag/waypoint.gd b/entities/flag/waypoint.gd
new file mode 100644
index 0000000..a56a668
--- /dev/null
+++ b/entities/flag/waypoint.gd
@@ -0,0 +1,49 @@
+# This file is part of open-fpsz.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+extends Control
+
+@export var attach_point : Node3D
+@export var flag : Flag
+
+@onready var _iff_container : Control = $IFFContainer
+
+func _ready() -> void:
+ attach_point.transform = attach_point.transform.translated(
+ Vector3(0, flag.get_node("CollisionShape3D").shape.size.y, 0))
+
+func _process(_delta : float) -> void:
+ var camera : Camera3D = get_viewport().get_camera_3d()
+ var viewport_rect : Rect2 = get_viewport_rect()
+ # if the player is NOT infront of the camera or camera does NOT have LOS to player
+ if camera.is_position_behind(attach_point.global_position):
+ _iff_container.hide() # hide the IFF and exit function
+ return
+ else:
+ _iff_container.show() # display the IFF
+
+ # get the screen location of the players head
+ var new_iff_position : Vector2 = camera.unproject_position(attach_point.global_position)
+
+ # check if the unprojected point lies inside the viewport
+ if !Rect2(Vector2(0, 0), viewport_rect.size).has_point(new_iff_position):
+ _iff_container.hide() # hide the IFF and exit function
+ return
+
+ # move the IFF up so the bottom of it is at the players head
+ new_iff_position.y -= _iff_container.size.y
+ # move the IFF left so it's centered horizontally above players head
+ new_iff_position.x -= _iff_container.size.x / 2
+ # set the position of the IFF
+ position = new_iff_position
diff --git a/entities/flag/waypoint.tscn b/entities/flag/waypoint.tscn
new file mode 100644
index 0000000..a3f5cc5
--- /dev/null
+++ b/entities/flag/waypoint.tscn
@@ -0,0 +1,27 @@
+[gd_scene load_steps=2 format=3 uid="uid://bcgkc5fhhyauv"]
+
+[ext_resource type="Script" path="res://entities/flag/waypoint.gd" id="1_gmnl6"]
+
+[node name="IFF" type="Control"]
+layout_mode = 3
+anchors_preset = 0
+script = ExtResource("1_gmnl6")
+
+[node name="IFFContainer" type="MarginContainer" parent="."]
+layout_mode = 0
+offset_right = 11.0
+offset_bottom = 20.0
+mouse_filter = 2
+
+[node name="Chevron" type="Label" parent="IFFContainer"]
+layout_direction = 2
+layout_mode = 2
+size_flags_vertical = 1
+theme_override_colors/font_color = Color(0, 1, 1, 0.784314)
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_constants/line_spacing = -20
+theme_override_font_sizes/font_size = 14
+text = "▼"
+horizontal_alignment = 1
+vertical_alignment = 2
diff --git a/entities/player/player.gd b/entities/player/player.gd
index 5cb7f67..5682b47 100644
--- a/entities/player/player.gd
+++ b/entities/player/player.gd
@@ -16,6 +16,8 @@ class_name Player extends RigidBody3D
enum PlayerState { PLAYER_ALIVE, PLAYER_DEAD }
+@export var iff : Control
+
@export_category("Parameters")
@export var ground_speed : float = 48 / 3.6 # m/s
@export var aerial_control_force : int = 400
@@ -42,11 +44,11 @@ enum PlayerState { PLAYER_ALIVE, PLAYER_DEAD }
@onready var input : PlayerInput = $PlayerInput
@onready var camera : Camera3D = $SpringArm3D/Camera3D
@onready var hud : CanvasLayer = $HUD
-@onready var iff : Node2D = $ThirdPerson/IFF
@onready var shape_cast : ShapeCast3D = $ShapeCast3D
@onready var weapon : Node3D = $SpringArm3D/Inventory/SpaceGun
@onready var animation_player : AnimationPlayer = $AnimationPlayer
@onready var health_component : Area3D = $HealthComponent
+@onready var collision_shape : CollisionShape3D = $CollisionShape3D
@onready var flag_carry_component : FlagCarryComponent = $FlagCarryComponent
@onready var spring_arm_height : float = $SpringArm3D.position.y
@onready var _original_weapon_transform : Transform3D = weapon.transform
@@ -62,22 +64,30 @@ var _jumping : bool = false
func _ready() -> void:
energy_changed.connect(hud._on_energy_changed)
- if _is_pawn():
- health_component.health_changed.connect(hud._on_health_changed)
- camera.current = true
- camera.fov = _game_settings.fov
- remove_child($ThirdPerson)
- else:
- health_component.health_changed.connect(iff._on_health_changed)
- remove_child(hud)
- weapon.hide()
+ health_component.health_changed.connect(hud._on_health_changed)
+ health_component.health_changed.connect(iff._on_health_changed)
health_component.health_changed.emit(health_component.health)
health_component.health_zeroed.connect(die)
- input.MOUSE_SENSITIVITY = _game_settings.mouse_sensitivity
- input.inverted_y_axis = _game_settings.inverted_y_axis
+
input.fired_primary.connect(_fire_primary)
input.jumped.connect(_jump)
input.throwed_flag.connect(_throw_flag)
+
+ input.MOUSE_SENSITIVITY = _game_settings.mouse_sensitivity
+ input.inverted_y_axis = _game_settings.inverted_y_axis
+
+ if _is_pawn():
+ camera.current = true
+ camera.fov = _game_settings.fov
+ # set the spring arm translation to be about head height level
+ $SpringArm3D.transform = Transform3D().translated(Vector3(0, collision_shape.shape.height / 2, 0) * 0.9)
+ flag_carry_attachment.hide()
+ remove_child($ThirdPerson)
+ else:
+ # set the iff attachment translation to be about head height level
+ $ThirdPerson/IFFAttachment.transform = Transform3D().translated(Vector3(0, collision_shape.shape.height / 2, 0) * 0.9)
+ remove_child(hud)
+ weapon.hide()
func _is_pawn() -> bool:
return player_id == multiplayer.get_unique_id()
diff --git a/entities/player/player.tscn b/entities/player/player.tscn
index b46dfb1..184dac0 100644
--- a/entities/player/player.tscn
+++ b/entities/player/player.tscn
@@ -4,9 +4,9 @@
[ext_resource type="PackedScene" uid="uid://drbefw6akui2v" path="res://entities/player/assets/vanguard.tscn" id="2_beyex"]
[ext_resource type="Shape3D" uid="uid://cb8esdlnottdn" path="res://entities/player/collision_shape.tres" id="2_vjqny"]
[ext_resource type="PackedScene" uid="uid://bcv81ku26xo" path="res://interfaces/hud/hud.tscn" id="3_ccety"]
-[ext_resource type="PackedScene" uid="uid://c8co0qa2omjmh" path="res://entities/weapons/space_gun/space_gun.tscn" id="4_6jh57"]
-[ext_resource type="PackedScene" uid="uid://dn1tcakam5egs" path="res://entities/weapons/space_gun/projectile.tscn" id="5_2xh36"]
+[ext_resource type="PackedScene" uid="uid://c8co0qa2omjmh" path="res://entities/weapons/space_gun/space_gun.tscn" id="4_ehwwq"]
[ext_resource type="PackedScene" uid="uid://bof3mg7wgxrmn" path="res://components/health_component.tscn" id="5_t6i6e"]
+[ext_resource type="PackedScene" uid="uid://dn1tcakam5egs" path="res://entities/weapons/space_gun/projectile.tscn" id="5_w56pa"]
[ext_resource type="Script" path="res://entities/player/player_input.gd" id="6_ymcrr"]
[ext_resource type="PackedScene" uid="uid://dsysi2rd3bu76" path="res://interfaces/hud/iff.tscn" id="7_8hc80"]
[ext_resource type="PackedScene" uid="uid://2t8ql8pkxv6c" path="res://components/flag_carry_component.tscn" id="7_e7s1a"]
@@ -198,7 +198,7 @@ properties/3/path = NodePath(".:skiing")
properties/3/spawn = false
properties/3/replication_mode = 2
-[node name="Player" type="RigidBody3D"]
+[node name="Player" type="RigidBody3D" node_paths=PackedStringArray("iff")]
collision_mask = 2147483649
axis_lock_angular_x = true
axis_lock_angular_y = true
@@ -207,6 +207,7 @@ mass = 75.0
physics_material_override = SubResource("PhysicsMaterial_clur0")
continuous_cd = true
script = ExtResource("1_mk68k")
+iff = NodePath("ThirdPerson/IFFAttachment/IFF")
jump_height = 1.5
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
@@ -244,9 +245,9 @@ near = 0.1
[node name="Inventory" type="Node3D" parent="SpringArm3D"]
-[node name="SpaceGun" parent="SpringArm3D/Inventory" instance=ExtResource("4_6jh57")]
+[node name="SpaceGun" parent="SpringArm3D/Inventory" instance=ExtResource("4_ehwwq")]
transform = Transform3D(-1, 0, 2.53518e-06, 0, 1, 0, -2.53518e-06, 0, -1, 0.244668, -0.229311, -0.30332)
-PROJECTILE = ExtResource("5_2xh36")
+PROJECTILE = ExtResource("5_w56pa")
[node name="SpineIKTarget" type="Node3D" parent="SpringArm3D"]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0)
@@ -265,17 +266,17 @@ sensor = NodePath("../Sensor")
[node name="ThirdPerson" type="Node3D" parent="."]
+[node name="IFFAttachment" type="Marker3D" parent="ThirdPerson"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.1, 0)
+
+[node name="IFF" parent="ThirdPerson/IFFAttachment" node_paths=PackedStringArray("player", "attach_point") instance=ExtResource("7_8hc80")]
+player = NodePath("../../..")
+attach_point = NodePath("..")
+
[node name="PlayerMesh" parent="ThirdPerson" node_paths=PackedStringArray("spine_ik_target_attachment") instance=ExtResource("2_beyex")]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0)
spine_ik_target_attachment = NodePath("../../SpringArm3D/SpineIKTarget")
-[node name="IFFAttachment" type="Node3D" parent="ThirdPerson"]
-transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.27457, 0)
-
-[node name="IFF" parent="ThirdPerson" node_paths=PackedStringArray("attach_point", "player") instance=ExtResource("7_8hc80")]
-attach_point = NodePath("../IFFAttachment")
-player = NodePath("../..")
-
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
libraries = {
"": SubResource("AnimationLibrary_hg307")
diff --git a/entities/target_dummy/target_dummy.gd b/entities/target_dummy/target_dummy.gd
index 84850db..abc213d 100644
--- a/entities/target_dummy/target_dummy.gd
+++ b/entities/target_dummy/target_dummy.gd
@@ -24,6 +24,7 @@ var start_pos : Vector3
func _ready() -> void:
health_component.health_zeroed.connect(spawn)
start_pos = global_position
+ $TargetMesh/AnimationPlayer.play("gunTwoHanded")
func spawn() -> void:
hide()
diff --git a/entities/target_dummy/target_dummy.tscn b/entities/target_dummy/target_dummy.tscn
index 083430f..57e0095 100644
--- a/entities/target_dummy/target_dummy.tscn
+++ b/entities/target_dummy/target_dummy.tscn
@@ -1,13 +1,11 @@
[gd_scene load_steps=5 format=3 uid="uid://dpnu1lvfncx6q"]
-[ext_resource type="Script" path="res://entities/target_dummy/target_dummy.gd" id="1_r02ch"]
-[ext_resource type="PackedScene" uid="uid://b83leo1ca47d7" path="res://entities/target_dummy/assets/player_mesh.blend" id="2_x73k8"]
-[ext_resource type="PackedScene" uid="uid://bof3mg7wgxrmn" path="res://components/health_component.tscn" id="3_g1ap4"]
+[ext_resource type="Script" path="res://entities/target_dummy/target_dummy.gd" id="1_iup5v"]
+[ext_resource type="Shape3D" uid="uid://cb8esdlnottdn" path="res://entities/player/collision_shape.tres" id="2_i5k5j"]
+[ext_resource type="PackedScene" uid="uid://b83leo1ca47d7" path="res://entities/target_dummy/assets/player_mesh.blend" id="2_u0wyn"]
+[ext_resource type="PackedScene" uid="uid://bof3mg7wgxrmn" path="res://components/health_component.tscn" id="4_l1exy"]
-[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_rk1ox"]
-radius = 0.3
-
-[node name="TargetDummy" type="RigidBody3D"]
+[node name="DummyTarget" type="RigidBody3D"]
collision_layer = 2147483649
collision_mask = 2147483649
axis_lock_angular_x = true
@@ -15,48 +13,46 @@ axis_lock_angular_y = true
axis_lock_angular_z = true
mass = 75.0
continuous_cd = true
-script = ExtResource("1_r02ch")
+script = ExtResource("1_iup5v")
-[node name="PlayerMesh" parent="." instance=ExtResource("2_x73k8")]
+[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
+shape = ExtResource("2_i5k5j")
+
+[node name="HealthComponent" parent="." instance=ExtResource("4_l1exy")]
+
+[node name="TargetMesh" parent="." instance=ExtResource("2_u0wyn")]
transform = Transform3D(0.75, 0, 0, 0, 0.75, 0, 0, 0, 0.75, 0, -0.916438, 0)
-[node name="Skeleton3D" parent="PlayerMesh/playerrig" index="0"]
+[node name="Skeleton3D" parent="TargetMesh/playerrig" index="0"]
+bones/0/position = Vector3(0, 0.995864, -0.0552)
bones/0/rotation = Quaternion(0.12582, -1.79059e-15, -1.33409e-23, 0.992053)
bones/0/scale = Vector3(1, 1, 1)
-bones/1/rotation = Quaternion(-0.0644764, 1.78006e-15, -6.67523e-16, 0.997919)
-bones/2/rotation = Quaternion(-0.0774641, 0, 0, 0.996995)
+bones/1/rotation = Quaternion(-0.0644764, 5.62483e-23, -9.26994e-23, 0.997919)
bones/4/rotation = Quaternion(0.201738, -3.62729e-15, 4.53412e-16, 0.97944)
bones/6/rotation = Quaternion(-0.605155, -0.345862, -0.356135, 0.622363)
-bones/7/rotation = Quaternion(-0.0464025, 0.68865, -0.38959, 0.609777)
+bones/7/rotation = Quaternion(-0.244994, 0.787594, -0.344589, 0.448255)
bones/7/scale = Vector3(1, 1, 1)
-bones/8/rotation = Quaternion(0.185291, 0.0266179, 0.00595018, 0.982305)
bones/8/scale = Vector3(1, 1, 1)
bones/9/rotation = Quaternion(0.126866, -0.0346058, -0.00662176, 0.991294)
bones/9/scale = Vector3(1, 1, 1)
-bones/10/rotation = Quaternion(0.0557877, -0.312038, -0.196665, 0.927816)
bones/11/rotation = Quaternion(-0.0630718, -0.16283, 0.0971492, 0.979832)
bones/13/rotation = Quaternion(0.0299552, -0.545663, -0.00259936, 0.837465)
bones/13/scale = Vector3(1, 1, 1)
bones/14/rotation = Quaternion(-0.0636278, -0.0624373, 0.0299354, 0.995569)
-bones/15/rotation = Quaternion(0.01399, 0.0251671, 0.0278526, 0.999197)
-bones/16/rotation = Quaternion(-0.1, -0.561252, 0.0324573, 0.82094)
bones/17/rotation = Quaternion(0.0486079, -0.0407852, 0.014286, 0.997883)
bones/19/rotation = Quaternion(-0.12453, -0.526036, 0.129609, 0.831252)
bones/20/rotation = Quaternion(-0.0225172, -0.0668488, 0.0231689, 0.99724)
bones/20/scale = Vector3(1, 1, 1)
bones/21/rotation = Quaternion(-0.00114936, 0.0252308, -0.0174874, 0.999528)
bones/21/scale = Vector3(1, 1, 1)
-bones/22/rotation = Quaternion(-0.192536, -0.535774, 0.0761884, 0.818579)
bones/23/rotation = Quaternion(0.0104723, -0.0704384, 0.0293146, 0.99703)
bones/23/scale = Vector3(1, 1, 1)
-bones/24/rotation = Quaternion(0.0334518, 0.0259883, -0.0178538, 0.998943)
bones/25/rotation = Quaternion(-0.605155, 0.345863, 0.356135, 0.622363)
bones/25/scale = Vector3(1, 1, 1)
-bones/26/rotation = Quaternion(-0.0464025, -0.68865, 0.38959, 0.609777)
+bones/26/rotation = Quaternion(0.0407172, -0.246634, 0.858112, 0.448506)
bones/26/scale = Vector3(1, 1, 1)
-bones/27/rotation = Quaternion(0.185291, -0.0266179, -0.00595018, 0.982305)
bones/27/scale = Vector3(1, 1, 1)
-bones/28/rotation = Quaternion(-0.144176, 0.0367847, -0.00247504, 0.988865)
+bones/28/rotation = Quaternion(-0.217102, 0.0422089, 0.0230507, 0.974963)
bones/28/scale = Vector3(1, 1, 1)
bones/30/rotation = Quaternion(-0.0630717, 0.16283, -0.0971492, 0.979832)
bones/31/rotation = Quaternion(0.0237032, 0.0123211, -0.0433656, 0.998702)
@@ -64,41 +60,33 @@ bones/31/scale = Vector3(1, 1, 1)
bones/32/rotation = Quaternion(0.243143, 0.523041, 0.164477, 0.800161)
bones/32/scale = Vector3(1, 1, 1)
bones/33/rotation = Quaternion(-0.0636278, 0.0624373, -0.0299354, 0.995569)
-bones/34/rotation = Quaternion(0.0139901, -0.0251671, -0.0278526, 0.999197)
bones/35/rotation = Quaternion(0.113348, 0.545076, 0.134205, 0.819776)
-bones/36/rotation = Quaternion(0.0486079, 0.0407853, -0.0142859, 0.997883)
+bones/36/rotation = Quaternion(-0.4266, 0.0977703, 0.332942, 0.835226)
+bones/37/rotation = Quaternion(-0.632018, -0.129105, 0.241206, 0.725056)
bones/38/rotation = Quaternion(0.0934222, 0.536709, 0.031309, 0.837995)
-bones/39/rotation = Quaternion(-0.0225172, 0.0668488, -0.023169, 0.99724)
-bones/40/rotation = Quaternion(-0.00114935, -0.0252307, 0.0174875, 0.999528)
+bones/39/rotation = Quaternion(-0.479327, 0.030236, 0.338389, 0.809212)
+bones/40/rotation = Quaternion(-0.540176, -0.0581251, 0.395197, 0.740709)
bones/40/scale = Vector3(1, 1, 1)
bones/41/rotation = Quaternion(0.0241847, 0.530538, 0.0849425, 0.843048)
bones/41/scale = Vector3(1, 1, 1)
-bones/42/rotation = Quaternion(0.0104724, 0.0704385, -0.0293146, 0.99703)
-bones/43/rotation = Quaternion(0.0334518, -0.0259883, 0.0178538, 0.998943)
-bones/44/rotation = Quaternion(0.986515, -3.3762e-16, 5.03093e-24, 0.163672)
+bones/42/rotation = Quaternion(-0.451682, -0.0170104, 0.326969, 0.829931)
+bones/43/rotation = Quaternion(-0.512965, -0.0942157, 0.391943, 0.757873)
+bones/44/rotation = Quaternion(0.986515, -3.3762e-16, 1.34771e-25, 0.163672)
bones/44/scale = Vector3(1, 1, 0.999997)
-bones/45/rotation = Quaternion(0.143207, -4.28623e-07, 5.19845e-06, 0.989693)
bones/45/scale = Vector3(1, 1, 1)
bones/46/rotation = Quaternion(-0.574131, 2.92207e-06, -4.58343e-06, 0.818763)
bones/47/rotation = Quaternion(1.99048e-05, 0.961249, -0.27568, 4.3124e-06)
bones/47/scale = Vector3(1, 1, 1)
bones/48/rotation = Quaternion(0.679706, 0.679706, -0.194936, 0.194936)
-bones/49/rotation = Quaternion(0.986515, -3.3762e-16, 5.03093e-24, 0.163672)
+bones/49/rotation = Quaternion(0.986515, -3.3762e-16, 1.34771e-25, 0.163672)
bones/49/scale = Vector3(1, 1, 0.999997)
-bones/50/rotation = Quaternion(0.143207, 4.28623e-07, -5.19845e-06, 0.989693)
bones/50/scale = Vector3(1, 1, 1)
bones/51/rotation = Quaternion(-0.574131, -2.92207e-06, 4.58343e-06, 0.818763)
bones/52/rotation = Quaternion(-1.99048e-05, 0.961249, -0.27568, -4.3124e-06)
bones/52/scale = Vector3(1, 1, 1)
bones/53/rotation = Quaternion(0.679706, -0.679706, 0.194936, 0.194936)
-[node name="AnimationPlayer" parent="PlayerMesh" index="4"]
+[node name="AnimationPlayer" parent="TargetMesh" index="4"]
autoplay = "gunOneHanded"
-[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
-shape = SubResource("CapsuleShape3D_rk1ox")
-
-[node name="HealthComponent" parent="." instance=ExtResource("3_g1ap4")]
-max_health = 300
-
-[editable path="PlayerMesh"]
+[editable path="TargetMesh"]
diff --git a/environments/default.tres b/environments/default.tres
index eb27dd6..b8548dd 100644
--- a/environments/default.tres
+++ b/environments/default.tres
@@ -1,6 +1,6 @@
[gd_resource type="Environment" load_steps=4 format=3 uid="uid://d2ahijqqspw5f"]
-[ext_resource type="Texture2D" uid="uid://btdbu0qbe1646" path="res://environments/skyboxes/kloppenheim_06_puresky_2k.exr" id="1_k44rf"]
+[ext_resource type="Texture2D" uid="uid://odwhjbebqfcn" path="res://environments/skyboxes/kloppenheim_06_puresky_2k.exr" id="1_k44rf"]
[sub_resource type="PanoramaSkyMaterial" id="PanoramaSkyMaterial_7tawh"]
panorama = ExtResource("1_k44rf")
diff --git a/interfaces/hud/hud.tscn b/interfaces/hud/hud.tscn
index 14be9b5..eb07e4f 100644
--- a/interfaces/hud/hud.tscn
+++ b/interfaces/hud/hud.tscn
@@ -58,7 +58,6 @@ offset_right = 288.0
offset_bottom = 40.0
size_flags_horizontal = 0
mouse_filter = 2
-theme = SubResource("Theme_irfqb")
theme_override_styles/fill = ExtResource("1_gh51l")
value = 60.0
show_percentage = false
diff --git a/interfaces/hud/iff.gd b/interfaces/hud/iff.gd
index 03d8dab..7a065fc 100644
--- a/interfaces/hud/iff.gd
+++ b/interfaces/hud/iff.gd
@@ -12,30 +12,80 @@
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-extends Node2D
+extends Control
-@export var attach_point : Node3D
@export var player : Player
+@export var attach_point : Marker3D
+@export var healthbar_low_health_color : Color = Color(1 ,0 ,0, 0.78)
+@export var healthbar_mid_health_color : Color = Color(1, 1, 0, 0.78)
+@export var healthbar_high_health_color : Color = Color(0, 1, 0, 0.78)
+@export var iff_in_range_radius_ratio : float = 0.05
-@onready var _player_name_label : Label = $Offset/VBoxContainer/PlayerNameLabel
-@onready var _health_bar : ProgressBar = $Offset/VBoxContainer/HealthBar
-@onready var _v_box_container : VBoxContainer = $Offset/VBoxContainer
+@onready var _iff_container : Control = $IFFContainer
+@onready var _iff_in_range_container : Control = $IFFContainer/IFFInRangeContainer
+@onready var _player_name_label : Control = $IFFContainer/IFFInRangeContainer/PlayerNameLabel
+@onready var _health_bar : ProgressBar = $IFFContainer/IFFInRangeContainer/HealthBar
+@onready var is_within_los : bool = false
+@onready var healthbar_fill_stylebox : StyleBoxFlat = _health_bar.get_theme_stylebox("fill")
+func _ready() -> void:
+ _player_name_label.text = player.name
+
func _process(_delta : float) -> void:
- var camera : Camera3D = get_viewport().get_camera_3d()
- if camera.is_position_behind(attach_point.global_position):
- _v_box_container.hide()
+ # retrieve camera for current viewport
+ var camera : Camera3D = get_viewport().get_camera_3d()
+
+ # if the player is NOT infront of the camera or camera does NOT have LOS to player
+ if camera.is_position_behind(attach_point.global_position) or !is_within_los:
+ _iff_container.hide() # hide the IFF and exit function
+ return
else:
- _v_box_container.show()
+ _iff_container.show() # display the IFF
- _player_name_label.text = player.nickname
- position = camera.unproject_position(attach_point.global_position)
+func _physics_process(_delta : float) -> void:
+ # https://docs.godotengine.org/en/stable/tutorials/physics/ray-casting.html
+ var camera : Camera3D = get_viewport().get_camera_3d()
+ is_within_los = false # always initialise trace_success as false
+ var space_state : PhysicsDirectSpaceState3D = camera.get_world_3d().direct_space_state
+ # do a trace check from camera to towards the player
+ var query : PhysicsRayQueryParameters3D = PhysicsRayQueryParameters3D.create(camera.global_position, attach_point.global_position)
+ # exclude the camera owner nodes from intersecting with the trace check
+ query.exclude = [camera.owner]
+ # do trace check and store result
+ var result : Dictionary = space_state.intersect_ray(query)
+ # if a result was returned and the hit result is the player
+ if result and result["collider"] == player:
+ # the player is in camera LOS
+ is_within_los = true
+
+ var new_iff_position : Vector2 = camera.unproject_position(attach_point.global_position) # get the screen location of the players head
var viewport_size : Vector2 = get_viewport_rect().size
- position.x = clampf(position.x, 0, viewport_size.x - _v_box_container.size.x)
- position.y = clampf(position.y, _v_box_container.size.y, viewport_size.y)
+
+ # check if the unprojected point lies inside the viewport
+ if !Rect2(Vector2(0, 0), viewport_size).has_point(new_iff_position):
+ _iff_container.hide() # hide the IFF and exit function
+ return
+
+ # if player is NOT in range to have its healthbar and name drawn
+ if (new_iff_position - viewport_size / 2).length() > iff_in_range_radius_ratio * viewport_size.length():
+ _iff_in_range_container.hide() # hide the in range IFF
+ else:
+ _iff_in_range_container.show()
+
+ new_iff_position.y -= _iff_container.size.y # move the IFF up so the bottom of it is at the players head
+ new_iff_position.x -= _iff_container.size.x / 2 # move the IFF left so it's centered horizontally above players head
+
+ position = new_iff_position # set the position of the IFF
func _update_health_bar(health : float) -> void:
_health_bar.value = health
-
+ # modify health_box stylebox depending health value
+ if health < 75 and health > 40:
+ healthbar_fill_stylebox.bg_color = healthbar_mid_health_color
+ elif health <= 40:
+ healthbar_fill_stylebox.bg_color = healthbar_low_health_color
+ else:
+ healthbar_fill_stylebox.bg_color = healthbar_high_health_color
+
func _on_health_changed(new_health : float) -> void:
_update_health_bar(new_health)
diff --git a/interfaces/hud/iff.tscn b/interfaces/hud/iff.tscn
index d6b8f0f..94833dc 100644
--- a/interfaces/hud/iff.tscn
+++ b/interfaces/hud/iff.tscn
@@ -1,26 +1,52 @@
[gd_scene load_steps=3 format=3 uid="uid://dsysi2rd3bu76"]
[ext_resource type="Script" path="res://interfaces/hud/iff.gd" id="1_75yi1"]
-[ext_resource type="StyleBox" uid="uid://cl7dmo2bg4153" path="res://interfaces/hud/healthbar_fill_style.tres" id="2_x7k8o"]
+[ext_resource type="StyleBox" uid="uid://cgv081wfih7la" path="res://interfaces/hud/iff_healthbar_fill_style.tres" id="2_frxvy"]
-[node name="IFF" type="Node2D"]
+[node name="IFF" type="Control"]
+layout_mode = 3
+anchors_preset = 0
script = ExtResource("1_75yi1")
-[node name="Offset" type="Node2D" parent="."]
-position = Vector2(0, -32)
-
-[node name="VBoxContainer" type="VBoxContainer" parent="Offset"]
-offset_right = 100.0
-offset_bottom = 40.0
+[node name="IFFContainer" type="MarginContainer" parent="."]
+layout_mode = 0
+offset_right = 63.0
+offset_bottom = 42.0
mouse_filter = 2
-[node name="PlayerNameLabel" type="Label" parent="Offset/VBoxContainer"]
+[node name="IFFInRangeContainer" type="Control" parent="IFFContainer"]
layout_mode = 2
+mouse_filter = 2
+
+[node name="PlayerNameLabel" type="Label" parent="IFFContainer/IFFInRangeContainer"]
+layout_mode = 2
+offset_right = 63.0
+offset_bottom = 17.0
+theme_override_colors/font_color = Color(1, 1, 1, 1)
+theme_override_font_sizes/font_size = 12
+text = "Player"
+horizontal_alignment = 1
metadata/_edit_use_anchors_ = true
-[node name="HealthBar" type="ProgressBar" parent="Offset/VBoxContainer"]
+[node name="HealthBar" type="ProgressBar" parent="IFFContainer/IFFInRangeContainer"]
layout_mode = 2
+offset_top = 20.0
+offset_right = 63.0
+offset_bottom = 24.0
mouse_filter = 2
-theme_override_styles/fill = ExtResource("2_x7k8o")
+theme_override_styles/fill = ExtResource("2_frxvy")
value = 60.0
show_percentage = false
+
+[node name="Chevron" type="Label" parent="IFFContainer"]
+layout_direction = 2
+layout_mode = 2
+size_flags_vertical = 1
+theme_override_colors/font_color = Color(1, 0, 0, 0.2)
+theme_override_colors/font_outline_color = Color(0, 0, 0, 0.2)
+theme_override_constants/outline_size = 3
+theme_override_constants/line_spacing = -20
+theme_override_font_sizes/font_size = 14
+text = "▼"
+horizontal_alignment = 1
+vertical_alignment = 2
diff --git a/interfaces/hud/iff_healthbar_fill_style.tres b/interfaces/hud/iff_healthbar_fill_style.tres
new file mode 100644
index 0000000..08a98b0
--- /dev/null
+++ b/interfaces/hud/iff_healthbar_fill_style.tres
@@ -0,0 +1,9 @@
+[gd_resource type="StyleBoxFlat" format=3 uid="uid://cgv081wfih7la"]
+
+[resource]
+bg_color = Color(1, 0, 0, 0.25)
+corner_radius_top_left = 3
+corner_radius_top_right = 3
+corner_radius_bottom_right = 3
+corner_radius_bottom_left = 3
+anti_aliasing = false
diff --git a/modes/multiplayer.tscn b/modes/multiplayer.tscn
index 06df1c4..bca561d 100644
--- a/modes/multiplayer.tscn
+++ b/modes/multiplayer.tscn
@@ -86,7 +86,7 @@ func add_flag() -> void:
func _exit_tree() -> void:
if multiplayer.is_server():
- multiplayer.peer_connected.disconnect(add_player)
+ #multiplayer.peer_connected.disconnect(add_player)
multiplayer.peer_disconnected.disconnect(remove_player)
"