diff --git a/godot/raw_assets/Soldier/HealthPickup.blend b/godot/raw_assets/Soldier/HealthPickup.blend index d8aaf8c..b19c2a7 100644 Binary files a/godot/raw_assets/Soldier/HealthPickup.blend and b/godot/raw_assets/Soldier/HealthPickup.blend differ diff --git a/godot/raw_assets/Soldier/HealthPickup.blend1 b/godot/raw_assets/Soldier/HealthPickup.blend1 index 24d291f..d8aaf8c 100644 Binary files a/godot/raw_assets/Soldier/HealthPickup.blend1 and b/godot/raw_assets/Soldier/HealthPickup.blend1 differ diff --git a/godot/scenes/player/remote_player.tscn b/godot/scenes/player/remote_player.tscn index 50d6363..0ca6063 100644 --- a/godot/scenes/player/remote_player.tscn +++ b/godot/scenes/player/remote_player.tscn @@ -5,7 +5,7 @@ [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1cgct"] -[sub_resource type="ViewportTexture" id="ViewportTexture_1cgct"] +[sub_resource type="ViewportTexture" id="ViewportTexture_orxjf"] viewport_path = NodePath("health_bar_sprite/health_bar_viewport") [sub_resource type="Curve" id="Curve_yli5f"] @@ -32,7 +32,10 @@ point_count = 2 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")] +[sub_resource type="ViewportTexture" id="ViewportTexture_rmxnb"] +viewport_path = NodePath("double_health_bar_sprite/health_bar_viewport") + +[node name="player" type="RemotePlayer" unique_id=845968872 node_paths=PackedStringArray("soldier_mesh", "collider", "effects", "spectator_camera", "camera_origin", "name_label", "health_bar", "double_health_bar", "health_bar_sprite", "double_health_bar_sprite")] move_speed = 7.0 soldier_mesh = NodePath("soldier_m") collider = NodePath("collision_shape_3d") @@ -43,7 +46,9 @@ 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") +double_health_bar = NodePath("double_health_bar_sprite/health_bar_viewport/double_health_bar") health_bar_sprite = NodePath("health_bar_sprite") +double_health_bar_sprite = NodePath("double_health_bar_sprite") collision_layer = 2 collision_mask = 4 slide_on_ceiling = false @@ -78,7 +83,7 @@ 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") +texture = SubResource("ViewportTexture_orxjf") [node name="health_bar_viewport" type="SubViewport" parent="health_bar_sprite" unique_id=1819065918] disable_3d = true @@ -98,3 +103,27 @@ 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) + +[node name="double_health_bar_sprite" type="Sprite3D" parent="." unique_id=1003826376] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.075818, 0) +billboard = 1 +texture = SubResource("ViewportTexture_rmxnb") + +[node name="health_bar_viewport" type="SubViewport" parent="double_health_bar_sprite" unique_id=1279264647] +disable_3d = true +transparent_bg = true +size = Vector2i(70, 10) +size_2d_override = Vector2i(70, 10) +size_2d_override_stretch = true + +[node name="double_health_bar" type="TextureProgressBar" parent="double_health_bar_sprite/health_bar_viewport" unique_id=62083710] +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) +tint_over = Color(1, 1, 1, 0) +tint_progress = Color(0.5660922, 1.7688051e-06, 3.3691526e-07, 1) diff --git a/godot/scenes/player/replay_player.tscn b/godot/scenes/player/replay_player.tscn index bdec3a9..b8c291d 100644 --- a/godot/scenes/player/replay_player.tscn +++ b/godot/scenes/player/replay_player.tscn @@ -32,7 +32,10 @@ point_count = 2 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")] +[sub_resource type="ViewportTexture" id="ViewportTexture_bfcd3"] +viewport_path = NodePath("double_health_bar_sprite/double_health_bar_viewport") + +[node name="player" type="RemotePlayer" unique_id=845968872 node_paths=PackedStringArray("soldier_mesh", "collider", "effects", "spectator_camera", "camera_origin", "name_label", "health_bar", "double_health_bar", "health_bar_sprite", "double_health_bar_sprite")] move_speed = 5.0 soldier_mesh = NodePath("soldier_m") collider = NodePath("collision_shape_3d") @@ -43,7 +46,9 @@ 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") +double_health_bar = NodePath("double_health_bar_sprite/double_health_bar_viewport/double_health_bar") health_bar_sprite = NodePath("health_bar_sprite") +double_health_bar_sprite = NodePath("double_health_bar_sprite") collision_layer = 16 collision_mask = 4 @@ -96,3 +101,27 @@ 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) + +[node name="double_health_bar_sprite" type="Sprite3D" parent="." unique_id=1841216543] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.0923502, 0) +billboard = 1 +texture = SubResource("ViewportTexture_bfcd3") + +[node name="double_health_bar_viewport" type="SubViewport" parent="double_health_bar_sprite" unique_id=1749355472] +disable_3d = true +transparent_bg = true +size = Vector2i(70, 10) +size_2d_override = Vector2i(70, 10) +size_2d_override_stretch = true + +[node name="double_health_bar" type="TextureProgressBar" parent="double_health_bar_sprite/double_health_bar_viewport" unique_id=220343908] +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) +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/remote_player.rs b/rust/src/player/remote_player.rs index 2d423c4..9423da0 100644 --- a/rust/src/player/remote_player.rs +++ b/rust/src/player/remote_player.rs @@ -44,7 +44,11 @@ pub struct RemotePlayer { #[export] health_bar: Option>, #[export] + double_health_bar: Option>, + #[export] health_bar_sprite: Option>, + #[export] + double_health_bar_sprite: Option>, pub player_id: Option, pub player_name: String, @@ -154,10 +158,7 @@ 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); - } + s.update_health_bar(); }); } @@ -188,8 +189,11 @@ 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); + if let Some(healthbar_sprite) = &mut self.health_bar_sprite { + healthbar_sprite.set_visible(false); + } + if let Some(double_health_bar_sprite) = &mut self.double_health_bar_sprite { + double_health_bar_sprite.set_visible(false); } self.is_dead = true; } @@ -241,6 +245,7 @@ impl IPlayer for RemotePlayer { let delta = (s.health + amount).min(200) - s.health; s.run_deferred(move |s| s.signals().on_heal().emit(delta)); s.health += delta; + s.update_health_bar(); }); } @@ -262,6 +267,7 @@ impl ICharacterBody3D for RemotePlayer { }); self.swap_weapon(WeaponType::Raygun, false); + self.update_health_bar(); } fn process(&mut self, delta: f64) { @@ -309,6 +315,17 @@ impl RemotePlayer { ); #[signal] pub fn on_heal(amount: i32); + + pub fn update_health_bar(&mut self) { + if let Some(health_bar) = &mut self.health_bar { + let value = (self.health as f64 / 100.).clamp(0., 1.) * 100.; + health_bar.set_value(value); + } + if let Some(double_health_bar) = &mut self.double_health_bar { + let double_value = ((self.health as f64 - 100.) / 100.).clamp(0., 1.) * 100.; + double_health_bar.set_value(double_value); + } + } } #[godot_dyn]