diff --git a/godot/scenes/player/local_player.tscn b/godot/scenes/player/local_player.tscn index f5b5328..ebd995f 100644 --- a/godot/scenes/player/local_player.tscn +++ b/godot/scenes/player/local_player.tscn @@ -15,9 +15,10 @@ shader_parameter/Color = Color(1, 0, 0, 1) shader_parameter/RimDistance = 0.7 shader_parameter/FloatParameter = 3.0 -[node name="player" type="LocalPlayer" unique_id=863055906 node_paths=PackedStringArray("camera", "soldier_mesh", "collider", "effects", "dead_cam_target", "respawn_label", "camera_origin", "weapon_node", "hud", "hit_sound")] +[node name="player" type="LocalPlayer" unique_id=863055906 node_paths=PackedStringArray("camera", "vignette", "soldier_mesh", "collider", "effects", "dead_cam_target", "respawn_label", "camera_origin", "weapon_node", "hud", "hit_sound")] look_sensitivity = 1.5 camera = NodePath("camera_3d") +vignette = NodePath("vignette") move_speed = 7.0 soldier_mesh = NodePath("soldier_m") collider = NodePath("collision_shape_3d2") diff --git a/godot/scenes/player/soldier_m.tscn b/godot/scenes/player/soldier_m.tscn index e2c45da..28f136b 100644 --- a/godot/scenes/player/soldier_m.tscn +++ b/godot/scenes/player/soldier_m.tscn @@ -62,7 +62,7 @@ material = SubResource("ShaderMaterial_tt88r") radius = 1.3764648 height = 4.480774 -[node name="soldier_m" type="SoldierMesh" unique_id=281995630 node_paths=PackedStringArray("hand_attachment", "animation_tree", "skeleton", "mesh", "look_at", "hand_remover")] +[node name="soldier_m" type="SoldierMesh" unique_id=281995630 node_paths=PackedStringArray("hand_attachment", "animation_tree", "skeleton", "mesh", "look_at", "hand_remover", "bubble")] hand_attachment = NodePath("bone_attachment_3d/hand") animation_tree = NodePath("animation_tree") skeleton = NodePath("SoldierM/Soldier/Skeleton3D") @@ -72,16 +72,17 @@ shotgun = ExtResource("2_kknoo") ball = ExtResource("2_jbny0") look_at = NodePath("look_at_root") hand_remover = NodePath("SoldierM/Soldier/Skeleton3D/player_hand_remover") +bubble = NodePath("bubble") [node name="SoldierM" parent="." unique_id=1868587353 instance=ExtResource("1_sxefq")] [node name="Skeleton3D" parent="SoldierM/Soldier" parent_id_path=PackedInt32Array(1868587353, 1101404322) index="0" unique_id=1074852808] bones/0/position = Vector3(0, 0, 0.00071418716) bones/1/position = Vector3(0, 0, -0.007) -bones/1/rotation = Quaternion(0.6956638, 0, 0, 0.71836746) +bones/1/rotation = Quaternion(0.6949507, 0, 0, 0.71905756) bones/1/scale = Vector3(1, 1, 1) bones/2/position = Vector3(0.002, 3.469447e-18, -1.4901118e-10) -bones/2/rotation = Quaternion(0.94657123, 2.131974e-08, 2.3316254e-08, -0.3224949) +bones/2/rotation = Quaternion(0.9462384, 2.1343759e-08, 2.3294275e-08, -0.32347023) bones/2/scale = Vector3(1, 1, 1) bones/3/position = Vector3(0, 0.0069999984, 5.169879e-25) bones/3/scale = Vector3(1, 0.99999994, 1) @@ -89,7 +90,7 @@ bones/4/position = Vector3(-2.39752e-11, 0.010049875, -1.4156722e-10) bones/4/rotation = Quaternion(0.73982674, -2.6881349e-08, 7.0005948e-09, 0.67279744) bones/4/scale = Vector3(1, 0.99999994, 0.99999994) bones/6/position = Vector3(-0.002, 3.469447e-18, -1.4901205e-10) -bones/6/rotation = Quaternion(0.99957573, 1.8108768e-08, 1.8718543e-08, 0.029129328) +bones/6/rotation = Quaternion(0.99965084, 1.8159357e-08, 1.8669468e-08, 0.026424171) bones/6/scale = Vector3(1, 1, 1) bones/7/position = Vector3(0, 0.0069999984, -5.169879e-25) bones/7/rotation = Quaternion(-0.21973656, 4.264305e-08, 9.604991e-09, 0.9755593) @@ -98,33 +99,33 @@ bones/8/position = Vector3(-2.3975525e-11, 0.010049875, -4.6138777e-11) bones/8/rotation = Quaternion(0.86758894, -7.867721e-09, 3.036851e-08, 0.4972821) bones/8/scale = Vector3(1, 0.99999994, 0.99999994) bones/10/position = Vector3(0, 0.009, 0) -bones/10/rotation = Quaternion(-0.15655811, -0.13162379, 0.020073986, 0.9786531) +bones/10/rotation = Quaternion(-0.15553917, -0.13165307, 0.019935569, 0.9788144) bones/10/scale = Vector3(1, 1, 1) bones/11/position = Vector3(6.8186457e-17, 0.008, 0.001) -bones/11/rotation = Quaternion(0.050897807, 0.0001023451, -0.013928697, 0.9986068) +bones/11/rotation = Quaternion(0.054136645, 0.00010869091, -0.014815048, 0.9984237) bones/11/scale = Vector3(1, 1, 1) bones/12/position = Vector3(-2.2285185e-16, 0.0035, 0.0015000002) bones/12/rotation = Quaternion(-0.70710677, 0, 0, 0.70710677) bones/12/scale = Vector3(1, 1, 1) bones/14/position = Vector3(0.005, 0.005, -1.7336413e-21) -bones/14/rotation = Quaternion(0.8931964, 0.033241358, 0.4331066, -0.11624925) +bones/14/rotation = Quaternion(0.8939152, 0.033332374, 0.4326297, -0.11241125) bones/14/scale = Vector3(1, 0.99999994, 1) bones/15/position = Vector3(-1.3005262e-15, 0.0050000004, -6.938894e-18) -bones/15/rotation = Quaternion(1.0327169e-08, -6.815531e-09, 0.9292259, 0.36951232) +bones/15/rotation = Quaternion(1.0339061e-08, -6.7974764e-09, 0.92987007, 0.36788812) bones/15/scale = Vector3(1, 1, 1) bones/16/position = Vector3(7.632945e-11, 0.007071071, 6.938894e-18) -bones/16/rotation = Quaternion(0.009291643, -0.08686193, -0.18488745, 0.9788695) +bones/16/rotation = Quaternion(0.007951379, -0.09016584, -0.1849911, 0.97856295) bones/16/scale = Vector3(0.99999994, 0.9999999, 1) bones/18/position = Vector3(-0.005, 0.005, -1.7303326e-21) -bones/18/rotation = Quaternion(0.65577567, 0.17340483, -0.12684758, -0.72373945) +bones/18/rotation = Quaternion(0.6557931, 0.17115685, -0.12843657, -0.7239786) bones/18/scale = Vector3(1, 0.99999994, 1) bones/19/position = Vector3(-1.3005262e-15, 0.0050000004, -6.938894e-18) -bones/19/rotation = Quaternion(-2.0834433e-08, -3.5793978e-08, -0.25694573, 0.96642584) +bones/19/rotation = Quaternion(-2.1018757e-08, -3.568606e-08, -0.26192647, 0.9650879) bones/19/scale = Vector3(1, 1, 1) bones/20/position = Vector3(-2.2286711e-10, 0.007071072, 0) -bones/20/rotation = Quaternion(-0.1155467, -0.46956262, -0.13840127, 0.8642945) +bones/20/rotation = Quaternion(-0.114065535, -0.47033018, -0.13636212, 0.86439806) bones/20/scale = Vector3(1, 0.9999999, 1) -bones/22/position = Vector3(0.011440838, -0.0085772155, 0.002479433) +bones/22/position = Vector3(0.011173905, -0.0085772155, 0.0025524832) bones/22/rotation = Quaternion(3.090862e-08, 0.70710677, 0.70710677, 3.090862e-08) bones/22/scale = Vector3(1, 1, 1) bones/24/position = Vector3(-0.011000002, 0.0050000013, 0.0070000007) @@ -179,7 +180,7 @@ origin_external_node = NodePath("../../../../look_at_root") transform = Transform3D(1, -2.2737368e-13, 0, 2.2737368e-13, 1, 0, -1.3552527e-20, 0, 1, 0, 0, 0) [node name="bone_attachment_3d" type="BoneAttachment3D" parent="." unique_id=1964353847] -transform = Transform3D(-34.56755, 3.8521445, -93.756294, -84.08145, 43.085724, 32.77075, 41.657993, 90.15971, -11.654766, -0.4726672, 3.3849456, 0.7415116) +transform = Transform3D(-34.789017, 3.8380542, -93.674934, -83.87692, 43.364418, 32.92697, 41.885357, 90.026634, -11.866832, -0.4724244, 3.3871224, 0.74117285) bone_name = "HAND.R_end" bone_idx = 17 use_external_skeleton = true diff --git a/rust/src/lobby_world.rs b/rust/src/lobby_world.rs index 99f683d..24b8208 100644 --- a/rust/src/lobby_world.rs +++ b/rust/src/lobby_world.rs @@ -2,7 +2,7 @@ use std::{collections::HashMap, f32::consts::PI}; use godot::{classes::RandomNumberGenerator, prelude::*}; -use crate::{game::Game, ui::menu_player::MenuPlayer}; +use crate::{game::Game, player::menu_player::MenuPlayer}; #[derive(GodotClass)] #[class(base=Node3D, init)] diff --git a/rust/src/player/buffs.rs b/rust/src/player/buffs.rs new file mode 100644 index 0000000..3b1671c --- /dev/null +++ b/rust/src/player/buffs.rs @@ -0,0 +1,61 @@ +use godot::{ + classes::{CharacterBody3D, class_macros::private::virtuals::ZipReader::Color}, + obj::DynGd, +}; + +use crate::player::IPlayer; + +#[derive(Debug, Clone)] +pub struct Buffs { + buffs: Vec, +} + +impl Default for Buffs { + fn default() -> Self { + let mut buffs = Vec::new(); + buffs.push(Buff { + time_remaining: 5., + kind: BuffKind::SpawnProtection, + }); + + Self { buffs } + } +} + +impl Buffs { + pub fn update(&mut self, delta: f64) -> bool { + for buff in &mut self.buffs { + buff.update(delta); + } + let prev_length = self.buffs.len(); + self.buffs.retain(|b| b.time_remaining >= 0.); + prev_length != self.buffs.len() + } + + pub fn update_effects(self, player: &mut dyn IPlayer) { + let mut new_bubble_color = Color::BLACK.with_alpha(0.); + for buff in &self.buffs { + match buff.kind { + BuffKind::SpawnProtection => new_bubble_color = Color::BLUE, + } + } + player.set_bubble_color(new_bubble_color); + } +} + +#[derive(Debug, Clone)] +pub struct Buff { + time_remaining: f64, + kind: BuffKind, +} + +impl Buff { + pub fn update(&mut self, delta: f64) { + self.time_remaining -= delta; + } +} + +#[derive(Debug, Clone)] +pub enum BuffKind { + SpawnProtection, +} diff --git a/rust/src/player/local_player.rs b/rust/src/player/local_player.rs index 1ed6d31..60cca4b 100644 --- a/rust/src/player/local_player.rs +++ b/rust/src/player/local_player.rs @@ -24,6 +24,7 @@ use crate::{ pickup::PickupKind, player::{ DamageSource, DamageSourceSignal, IPlayer, NetTransform, PlayerCommon, + buffs::Buffs, effects::PlayerEffects, remote_player::RemotePlayer, shootable::Shootable, @@ -96,6 +97,8 @@ pub struct LocalPlayer { telegrenade_cd_remaining: f64, telegrenades_allowed: bool, + buffs: Buffs, + base: Base, } @@ -359,6 +362,10 @@ impl IPlayer for LocalPlayer { fn as_gd(&self) -> DynGd { self.to_gd().into_dyn().upcast() } + + fn set_bubble_color(&mut self, color: Color) { + self.set_vignette_color(color); + } } #[godot_api] @@ -413,6 +420,8 @@ impl ICharacterBody3D for LocalPlayer { } } }); + + self.buffs.clone().update_effects(self); } fn process(&mut self, delta: f64) { @@ -523,6 +532,10 @@ impl ICharacterBody3D for LocalPlayer { }; weapon.set_position(new_weapon_pos); } + + if self.buffs.update(delta) { + self.buffs.clone().update_effects(self); + } } fn input(&mut self, event: Gd) { @@ -785,7 +798,7 @@ impl LocalPlayer { } } - fn change_vignette_color(&mut self, color: Color) { + fn set_vignette_color(&mut self, color: Color) { if let Some(rect) = &mut self.vignette && let Some(mut mat) = rect.get_material() { diff --git a/rust/src/ui/menu_player.rs b/rust/src/player/menu_player.rs similarity index 93% rename from rust/src/ui/menu_player.rs rename to rust/src/player/menu_player.rs index 8409e54..c64412a 100644 --- a/rust/src/ui/menu_player.rs +++ b/rust/src/player/menu_player.rs @@ -23,6 +23,8 @@ impl ICharacterBody3D for MenuPlayer { fn ready(&mut self) { if let Some(mesh) = &mut self.mesh { mesh.bind_mut().spawn_raygun(); + mesh.bind_mut() + .set_bubble_color(Color::BLACK.with_alpha(0.)); } } diff --git a/rust/src/player/mod.rs b/rust/src/player/mod.rs index bd251b7..138a059 100644 --- a/rust/src/player/mod.rs +++ b/rust/src/player/mod.rs @@ -23,8 +23,10 @@ use crate::{ }; pub mod ball; +pub mod buffs; pub mod effects; pub mod local_player; +pub mod menu_player; pub mod player_hand_remover; pub mod remote_player; pub mod shootable; @@ -72,6 +74,7 @@ pub trait IPlayer { fn get_telegrenade(&self) -> Option>; fn telegrenade_teleport(&mut self, to: Vector3) -> bool; fn as_gd(&self) -> DynGd; + fn set_bubble_color(&mut self, color: Color); } pub trait PlayerCommon { diff --git a/rust/src/player/remote_player.rs b/rust/src/player/remote_player.rs index cdcbf3c..ca1bfb7 100644 --- a/rust/src/player/remote_player.rs +++ b/rust/src/player/remote_player.rs @@ -13,6 +13,7 @@ use crate::{ pickup::PickupKind, player::{ DamageSource, DamageSourceSignal, IPlayer, NetTransform, PlayerCommon, + buffs::Buffs, effects::PlayerEffects, shootable::Shootable, soldier_mesh::SoldierMesh, @@ -71,6 +72,8 @@ pub struct RemotePlayer { telegrenade_cd_remaining: f64, telegrenades_allowed: bool, + buffs: Buffs, + base: Base, } @@ -298,6 +301,12 @@ impl IPlayer for RemotePlayer { fn as_gd(&self) -> DynGd { self.to_gd().into_dyn().upcast() } + + fn set_bubble_color(&mut self, color: Color) { + if let Some(mesh) = &mut self.soldier_mesh { + mesh.bind_mut().set_bubble_color(color); + } + } } #[godot_api] @@ -324,6 +333,8 @@ impl ICharacterBody3D for RemotePlayer { false }; }); + + self.buffs.clone().update_effects(self); } fn process(&mut self, delta: f64) { @@ -352,6 +363,10 @@ impl ICharacterBody3D for RemotePlayer { { effects.bind_mut().walk(); } + + if self.buffs.update(delta) { + self.buffs.clone().update_effects(self); + } } fn physics_process(&mut self, delta: f64) { diff --git a/rust/src/player/soldier_mesh.rs b/rust/src/player/soldier_mesh.rs index 33b3284..e063566 100644 --- a/rust/src/player/soldier_mesh.rs +++ b/rust/src/player/soldier_mesh.rs @@ -29,6 +29,8 @@ pub struct SoldierMesh { look_at: Option>, #[export] pub hand_remover: Option>, + #[export] + pub bubble: Option>, pub current_weapon: Option>, @@ -116,4 +118,12 @@ impl SoldierMesh { mat.set("albedo_color", &color.to_variant()); } } + + pub fn set_bubble_color(&mut self, color: Color) { + if let Some(bubble) = &mut self.bubble + && let Some(mut mat) = bubble.get_active_material(0) + { + mat.set("shader_parameter/BubbleColor", &color.to_variant()); + } + } } diff --git a/rust/src/ui/mod.rs b/rust/src/ui/mod.rs index d344595..feba837 100644 --- a/rust/src/ui/mod.rs +++ b/rust/src/ui/mod.rs @@ -6,7 +6,6 @@ pub mod hud; pub mod lobby; pub mod lobby_player_listing; pub mod main_menu; -pub mod menu_player; pub mod net_stats; pub mod player_listing; pub mod player_listings;