From 7700d4bef9b1be7a98d00e932bfa959ca6990008 Mon Sep 17 00:00:00 2001 From: extrawurst Date: Mon, 23 Jun 2025 00:05:24 +0200 Subject: [PATCH] beaming in characters --- assets/models/beaming.glb | Bin 0 -> 1972 bytes assets/textures/beaming.png | Bin 0 -> 463 bytes src/abilities/arrow.rs | 2 +- src/abilities/curver.rs | 2 +- src/abilities/gun.rs | 2 +- src/abilities/missile.rs | 2 +- src/abilities/thrown.rs | 2 +- src/aim/marker.rs | 2 +- src/head_drop.rs | 2 +- src/heal_effect.rs | 2 +- src/keys.rs | 2 +- src/loading_assets.rs | 3 +++ src/npc.rs | 50 +++++++++++++++++++++++++++++++++--- src/player.rs | 3 +++ src/utils/billboards.rs | 38 ++++++++++++++++++++------- 15 files changed, 91 insertions(+), 21 deletions(-) create mode 100644 assets/models/beaming.glb create mode 100644 assets/textures/beaming.png diff --git a/assets/models/beaming.glb b/assets/models/beaming.glb new file mode 100644 index 0000000000000000000000000000000000000000..39887023ad14a4a0004c00c254b9ca101fc4ec48 GIT binary patch literal 1972 zcmeHIOK4PA7(PjAwE=0O~#X{-bAk|$>P1q?1#1pr_3N` zz=D|WBpCy2ppqFK$n`_$s?#W&v}jam73-WeDDVl$j)lIk$t|-n%86+jm4ef#PukRj zh)rB39_@2Xhn46IZ!n14#0H2o14)1sR_HTGD!!iboJdzB>1Y31mW?!BW>^L{rovUi zIWx))E~ZU9o-bxg*?i8|CzmgbrAM)@NVqiceP2Fb=szlBT?J6UH!8wK1E`G@fR3*R z4|oQ0c*Jr|3UwB>avH26$|e{Z7O96E%8go$vO@-)#(E3_8Wt_hxG>)6!hL9AXyjSFMLh7J@c1O%K=q@Gw*ODKw#6va+x ziIhfr4LB48}99j`n4<1aym-wI)}3pOG;SG^R=3Po!ijonMJw-O~~S`0Q^R zZ`glrv%^@t=JyBBPZ{IZfJY=u5Ora&kpw&;5je8+dhZi>-)$J zcyxG$p$uBO_0_*HUd;BVOEc%5{5jHnZG0#CZT9@{>laqnSASR-{yIH9_1CxZPp6j8 zoOu+#Yu)_WZr%K2?~l&$JKnw>%dOVKxz_s0l}nEvKY5xud*Sc3E7K3wUOYdwc7EmM zEmRL8uVQ!hh6K=GX#y E1!C?~!vFvP literal 0 HcmV?d00001 diff --git a/assets/textures/beaming.png b/assets/textures/beaming.png new file mode 100644 index 0000000000000000000000000000000000000000..2b755f61d146f52b0bcc7ec4744389decce7701c GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-D%zJ3U<-Ln`LH zz2wbxC_sSWVCB5yzvmzMeWbU^L&dSY?5dW*, mut commands: Commands, assets: Res< Restitution::new(0.6), Children::spawn(( Spawn(( - Billboard, + Billboard::All, SquishAnimation(2.6), SceneRoot(assets.mesh_key.clone()), )), diff --git a/src/loading_assets.rs b/src/loading_assets.rs index 46dbbc4..0b66904 100644 --- a/src/loading_assets.rs +++ b/src/loading_assets.rs @@ -110,6 +110,9 @@ pub struct GameAssets { #[asset(path = "models/medic_particle.glb#Scene0")] pub mesh_heal_particle: Handle, + #[asset(path = "models/beaming.glb#Scene0")] + pub beaming: Handle, + #[asset(path = "models/projectiles", collection(mapped, typed))] pub projectiles: HashMap>, diff --git a/src/npc.rs b/src/npc.rs index d2b2c3e..f63939d 100644 --- a/src/npc.rs +++ b/src/npc.rs @@ -9,10 +9,12 @@ use crate::{ heads_database::HeadsDatabase, hitpoints::{Hitpoints, Kill}, keys::KeySpawn, + loading_assets::GameAssets, sounds::PlaySound, tb_entities::EnemySpawn, + utils::billboards::Billboard, }; -use bevy::prelude::*; +use bevy::{pbr::NotShadowCaster, prelude::*}; use std::collections::HashMap; #[derive(Component, Reflect)] @@ -25,14 +27,23 @@ struct NpcSpawning { spawn_index: u32, } +#[derive(Component, Reflect)] +#[reflect(Component)] +pub struct SpawningBeam(pub f32); + #[derive(Event)] struct OnCheckSpawns; +#[derive(Event)] +pub struct SpawnCharacter(pub Vec3); + pub fn plugin(app: &mut App) { app.init_resource::(); app.add_systems(OnEnter(GameState::Playing), setup); + app.add_systems(Update, update_beams.run_if(in_state(GameState::Playing))); global_observer!(app, on_spawn_check); + global_observer!(app, on_spawn); } fn setup(mut commands: Commands) { @@ -43,7 +54,7 @@ fn setup(mut commands: Commands) { fn on_spawn_check( _trigger: Trigger, mut commands: Commands, - query: Query<(Entity, &EnemySpawn), Without>, + query: Query<(Entity, &EnemySpawn, &Transform), Without>, heads_db: Res, spawning: Res, ) { @@ -53,7 +64,7 @@ fn on_spawn_check( names.insert(heads_db.head_key(i).to_string(), i); } - for (e, spawn) in query.iter() { + for (e, spawn, transform) in query.iter() { if let Some(order) = spawn.spawn_order { if order > spawning.spawn_index { continue; @@ -79,6 +90,7 @@ fn on_spawn_check( .with_child((Name::from("body-rig"), AnimatedCharacter::new(id))) .observe(on_kill); + commands.trigger(SpawnCharacter(transform.translation)); commands.trigger(PlaySound::Beaming); } } @@ -107,3 +119,35 @@ fn on_kill( commands.trigger(KeySpawn(transform.translation, enemy.key.clone())); } } + +fn on_spawn( + trigger: Trigger, + mut commands: Commands, + assets: Res, + time: Res