Add buffs, add spawnprotection buff effect

This commit is contained in:
Sofia 2026-07-29 22:22:18 +03:00
parent bfddd3129f
commit 6a2d8564d5
10 changed files with 123 additions and 18 deletions

View File

@ -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")

View File

@ -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

View File

@ -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)]

61
rust/src/player/buffs.rs Normal file
View File

@ -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<Buff>,
}
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,
}

View File

@ -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<CharacterBody3D>,
}
@ -359,6 +362,10 @@ impl IPlayer for LocalPlayer {
fn as_gd(&self) -> DynGd<CharacterBody3D, dyn IPlayer> {
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<InputEvent>) {
@ -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()
{

View File

@ -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.));
}
}

View File

@ -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<Gd<Telegrenade>>;
fn telegrenade_teleport(&mut self, to: Vector3) -> bool;
fn as_gd(&self) -> DynGd<CharacterBody3D, dyn IPlayer>;
fn set_bubble_color(&mut self, color: Color);
}
pub trait PlayerCommon {

View File

@ -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<CharacterBody3D>,
}
@ -298,6 +301,12 @@ impl IPlayer for RemotePlayer {
fn as_gd(&self) -> DynGd<CharacterBody3D, dyn IPlayer> {
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) {

View File

@ -29,6 +29,8 @@ pub struct SoldierMesh {
look_at: Option<Gd<Node3D>>,
#[export]
pub hand_remover: Option<Gd<PlayerHandRemover>>,
#[export]
pub bubble: Option<Gd<MeshInstance3D>>,
pub current_weapon: Option<DynGd<Node3D, dyn Weapon>>,
@ -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());
}
}
}

View File

@ -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;