diff --git a/godot/scenes/player/remote_player.tscn b/godot/scenes/player/remote_player.tscn index c8f1731..08ae900 100644 --- a/godot/scenes/player/remote_player.tscn +++ b/godot/scenes/player/remote_player.tscn @@ -5,7 +5,34 @@ [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1cgct"] -[node name="player" type="RemotePlayer" unique_id=845968872 node_paths=PackedStringArray("soldier_mesh", "collider", "effects", "spectator_camera", "camera_origin", "name_label")] +[sub_resource type="ViewportTexture" id="ViewportTexture_1cgct"] +viewport_path = NodePath("health_bar_sprite/health_bar_viewport") + +[sub_resource type="Curve" id="Curve_yli5f"] +_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0] +point_count = 2 + +[sub_resource type="CurveTexture" id="CurveTexture_3g557"] +width = 70 +curve = SubResource("Curve_yli5f") + +[sub_resource type="Curve" id="Curve_dmbod"] +_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0] +point_count = 2 + +[sub_resource type="CurveTexture" id="CurveTexture_1cgct"] +width = 70 +curve = SubResource("Curve_dmbod") + +[sub_resource type="Curve" id="Curve_qn18y"] +_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0] +point_count = 2 + +[sub_resource type="CurveTexture" id="CurveTexture_840kl"] +width = 70 +curve = SubResource("Curve_qn18y") + +[node name="player" type="RemotePlayer" unique_id=845968872 node_paths=PackedStringArray("soldier_mesh", "collider", "effects", "spectator_camera", "camera_origin", "name_label", "health_bar", "health_bar_sprite")] move_speed = 5.0 soldier_mesh = NodePath("soldier_m") collider = NodePath("collision_shape_3d") @@ -14,6 +41,8 @@ health = 100 spectator_camera = NodePath("spectate_root/spectate_camera") camera_origin = NodePath("camera_origin") name_label = NodePath("name_label") +health_bar = NodePath("health_bar_sprite/health_bar_viewport/health_bar") +health_bar_sprite = NodePath("health_bar_sprite") collision_layer = 2 collision_mask = 4 @@ -42,3 +71,27 @@ pixel_size = 0.002 billboard = 1 text = "asd" font_size = 64 + +[node name="health_bar_sprite" type="Sprite3D" parent="." unique_id=1478315510] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.1606798, 0) +billboard = 1 +texture = SubResource("ViewportTexture_1cgct") + +[node name="health_bar_viewport" type="SubViewport" parent="health_bar_sprite" unique_id=1819065918] +disable_3d = true +transparent_bg = true +size = Vector2i(70, 10) +size_2d_override = Vector2i(70, 10) +size_2d_override_stretch = true + +[node name="health_bar" type="TextureProgressBar" parent="health_bar_sprite/health_bar_viewport" unique_id=121411216] +offset_right = 70.0 +offset_bottom = 1.0 +scale = Vector2(1, 5) +value = 100.0 +texture_under = SubResource("CurveTexture_3g557") +texture_over = SubResource("CurveTexture_1cgct") +texture_progress = SubResource("CurveTexture_840kl") +tint_under = Color(0, 0, 0, 0.3647059) +tint_over = Color(1, 1, 1, 0) +tint_progress = Color(0.5660922, 1.7688051e-06, 3.3691526e-07, 1) diff --git a/godot/scenes/ui/health_bar.tscn b/godot/scenes/ui/health_bar.tscn new file mode 100644 index 0000000..b6ae60d --- /dev/null +++ b/godot/scenes/ui/health_bar.tscn @@ -0,0 +1,37 @@ +[gd_scene format=3 uid="uid://bxudpgjj5q0o2"] + +[sub_resource type="Curve" id="Curve_yli5f"] +_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0] +point_count = 2 + +[sub_resource type="CurveTexture" id="CurveTexture_3g557"] +width = 70 +curve = SubResource("Curve_yli5f") + +[sub_resource type="Curve" id="Curve_dmbod"] +_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0] +point_count = 2 + +[sub_resource type="CurveTexture" id="CurveTexture_1cgct"] +width = 70 +curve = SubResource("Curve_dmbod") + +[sub_resource type="Curve" id="Curve_qn18y"] +_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0] +point_count = 2 + +[sub_resource type="CurveTexture" id="CurveTexture_840kl"] +width = 70 +curve = SubResource("Curve_qn18y") + +[node name="texture_progress_bar" type="TextureProgressBar" unique_id=121411216] +offset_right = 70.0 +offset_bottom = 1.0 +scale = Vector2(1, 5) +value = 50.0 +texture_under = SubResource("CurveTexture_3g557") +texture_over = SubResource("CurveTexture_1cgct") +texture_progress = SubResource("CurveTexture_840kl") +tint_under = Color(0, 0, 0, 0.3647059) +tint_over = Color(1, 1, 1, 0) +tint_progress = Color(0.5660922, 1.7688051e-06, 3.3691526e-07, 1) diff --git a/rust/src/player/mod.rs b/rust/src/player/mod.rs index d8e2d1f..15e1e2a 100644 --- a/rust/src/player/mod.rs +++ b/rust/src/player/mod.rs @@ -3,7 +3,8 @@ use std::{f32::consts::PI, ops::Neg}; use godot::{ classes::{ Button, Camera3D, CharacterBody3D, CollisionShape3D, ICharacterBody3D, Input, InputEvent, - InputEventMouseMotion, Label, Label3D, Panel, PanelContainer, input::MouseMode, + InputEventMouseMotion, Label, Label3D, Panel, PanelContainer, Sprite3D, TextureProgressBar, + input::MouseMode, }, obj::WithBaseField, prelude::*, @@ -789,6 +790,10 @@ pub struct RemotePlayer { camera_origin: Option>, #[export] name_label: Option>, + #[export] + health_bar: Option>, + #[export] + health_bar_sprite: Option>, pub player_id: Option, @@ -899,6 +904,10 @@ impl IPlayer for RemotePlayer { s.kill(source); } } + if let Some(health_bar) = &mut s.health_bar { + let value = (s.health as f64 / 100.).clamp(0., 1.) * 100.; + health_bar.set_value(value); + } }); } @@ -927,6 +936,9 @@ impl IPlayer for RemotePlayer { if let Some(mut name) = self.name_label.take() { name.queue_free(); } + if let Some(healthbar_sprit) = &mut self.health_bar_sprite { + healthbar_sprit.set_visible(false); + } self.is_dead = true; }