From 6e8e995da5e29d4abc3a4e9b6d856fbc455add6c Mon Sep 17 00:00:00 2001 From: extrawurst Date: Fri, 6 Jun 2025 10:15:45 +0200 Subject: [PATCH] use different head drop meshes --- assets/models/head_drops/none.glb | Bin 0 -> 25728 bytes src/head_drop.rs | 92 +++++++++++++++++++----------- src/loading_assets.rs | 10 +++- src/npc.rs | 2 +- 4 files changed, 66 insertions(+), 38 deletions(-) create mode 100644 assets/models/head_drops/none.glb diff --git a/assets/models/head_drops/none.glb b/assets/models/head_drops/none.glb new file mode 100644 index 0000000000000000000000000000000000000000..f1bb3c562ae743743d107069ef84804e89c40881 GIT binary patch literal 25728 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 literal 0 HcmV?d00001 diff --git a/src/head_drop.rs b/src/head_drop.rs index 957c861..d94d644 100644 --- a/src/head_drop.rs +++ b/src/head_drop.rs @@ -1,6 +1,6 @@ use crate::{ - GameState, billboards::Billboard, global_observer, loading_assets::GameAssets, - physics_layers::GameLayer, player::Player, sounds::PlaySound, + GameState, billboards::Billboard, global_observer, heads_database::HeadsDatabase, + loading_assets::HeadDropAssets, physics_layers::GameLayer, player::Player, sounds::PlaySound, squish_animation::SquishAnimation, tb_entities::SecretHead, }; use avian3d::prelude::*; @@ -8,7 +8,29 @@ use bevy::prelude::*; use std::f32::consts::PI; #[derive(Event, Reflect)] -pub struct HeadDrops(pub Vec3, pub usize); +pub struct HeadDrops { + pos: Vec3, + head_id: usize, + impulse: bool, +} + +impl HeadDrops { + pub fn new(pos: Vec3, head_id: usize) -> Self { + Self { + pos, + head_id, + impulse: true, + } + } + + fn new_static(pos: Vec3, head_id: usize) -> Self { + Self { + pos, + head_id, + impulse: false, + } + } +} #[derive(Component, Reflect)] #[reflect(Component)] @@ -28,63 +50,65 @@ pub fn plugin(app: &mut App) { global_observer!(app, on_head_drop); } -fn spawn( - mut commands: Commands, - query: Query<(Entity, &GlobalTransform, &SecretHead)>, - assets: Res, -) { +fn spawn(mut commands: Commands, query: Query<(Entity, &GlobalTransform, &SecretHead)>) { for (e, t, head) in query { - commands - .spawn(( - Name::new("headdrop"), - SecretHeadMarker, - HeadDrop(head.head_id), - Transform::from_translation(t.translation() + Vec3::new(0., 2., 0.)), - Visibility::default(), - Collider::sphere(1.5), - LockedAxes::ROTATION_LOCKED, - RigidBody::Dynamic, - CollisionLayers::new(LayerMask(GameLayer::Collectibles.to_bits()), LayerMask::ALL), - CollisionEventsEnabled, - Restitution::new(0.6), - )) - .with_child(( - Billboard, - SquishAnimation(2.6), - SceneRoot(assets.mesh_head_drop.clone()), - )); + commands.trigger(HeadDrops::new_static( + t.translation() + Vec3::new(0., 2., 0.), + head.head_id, + )); commands.entity(e).despawn(); } } -fn on_head_drop(trigger: Trigger, mut commands: Commands, assets: Res) { - let HeadDrops(position, id) = trigger.event(); +fn on_head_drop( + trigger: Trigger, + mut commands: Commands, + assets: Res, + heads_db: Res, + gltf_assets: Res>, +) -> Result<(), BevyError> { + let drop = trigger.event(); let angle = rand::random::() * PI * 2.; let spawn_dir = Quat::from_rotation_y(angle) * Vec3::new(0.5, 0.6, 0.).normalize(); - commands.trigger(PlaySound::HeadDrop); + if drop.impulse { + commands.trigger(PlaySound::HeadDrop); + } + + let ability = format!("{:?}.glb", heads_db.head_stats(drop.head_id).ability).to_lowercase(); + let mesh = if let Some(handle) = assets.meshes.get(ability.as_str()) { + gltf_assets.get(handle) + } else { + gltf_assets.get(&assets.meshes["none.glb"]) + } + .ok_or_else(|| "asset not found")?; commands .spawn(( Name::new("headdrop"), - HeadDrop(*id), - Transform::from_translation(*position), + HeadDrop(drop.head_id), + Transform::from_translation(drop.pos), Visibility::default(), Collider::sphere(1.5), - ExternalImpulse::new(spawn_dir * 180.).with_persistence(false), LockedAxes::ROTATION_LOCKED, RigidBody::Dynamic, CollisionLayers::new(LayerMask(GameLayer::Collectibles.to_bits()), LayerMask::ALL), CollisionEventsEnabled, Restitution::new(0.6), )) + .insert_if( + ExternalImpulse::new(spawn_dir * 180.).with_persistence(false), + || drop.impulse, + ) .with_child(( Billboard, SquishAnimation(2.6), - SceneRoot(assets.mesh_head_drop.clone()), + SceneRoot(mesh.scenes[0].clone()), )); + + Ok(()) } fn collect_head( diff --git a/src/loading_assets.rs b/src/loading_assets.rs index 1073d2f..5eb80a3 100644 --- a/src/loading_assets.rs +++ b/src/loading_assets.rs @@ -67,6 +67,12 @@ struct HeadsAssets { heads: Handle, } +#[derive(AssetCollection, Resource)] +pub struct HeadDropAssets { + #[asset(path = "models/head_drops", collection(mapped, typed))] + pub meshes: HashMap>, +} + #[derive(AssetCollection, Resource)] pub struct UIAssets { #[asset(path = "font.ttf")] @@ -93,9 +99,6 @@ pub struct GameAssets { #[asset(path = "models/key.glb#Scene0")] pub mesh_key: Handle, - #[asset(path = "models/head_drop.glb#Scene0")] - pub mesh_head_drop: Handle, - #[asset(path = "models/spawn.glb#Scene0")] pub mesh_spawn: Handle, @@ -122,6 +125,7 @@ impl Plugin for LoadingPlugin { .load_collection::() .load_collection::() .load_collection::() + .load_collection::() .load_collection::(), ); } diff --git a/src/npc.rs b/src/npc.rs index 7b1a6c4..12e6c2f 100644 --- a/src/npc.rs +++ b/src/npc.rs @@ -59,7 +59,7 @@ fn on_kill( return; }; - commands.trigger(HeadDrops(transform.translation, head.0)); + commands.trigger(HeadDrops::new(transform.translation, head.0)); commands.entity(trigger.target()).despawn();