Player can loose head (#46)

This commit is contained in:
extrawurst
2025-06-20 17:35:00 +02:00
committed by GitHub
parent a8f2116804
commit 28ad53fd68
3 changed files with 118 additions and 42 deletions

View File

@@ -37,7 +37,13 @@ impl HeadDrops {
#[derive(Component, Reflect)]
#[reflect(Component)]
struct HeadDrop(pub usize);
struct HeadDrop {
pub head_id: usize,
}
#[derive(Component, Reflect)]
#[reflect(Component)]
struct HeadDropEnableTime(f32);
#[derive(Component, Reflect)]
#[reflect(Component)]
@@ -47,6 +53,11 @@ struct SecretHeadMarker;
pub struct HeadCollected(pub usize);
pub fn plugin(app: &mut App) {
app.add_systems(
Update,
enable_collectible.run_if(in_state(GameState::Playing)),
);
app.add_systems(OnEnter(GameState::Playing), spawn);
global_observer!(app, on_head_drop);
@@ -69,6 +80,7 @@ fn on_head_drop(
assets: Res<HeadDropAssets>,
heads_db: Res<HeadsDatabase>,
gltf_assets: Res<Assets<Gltf>>,
time: Res<Time>,
) -> Result<(), BevyError> {
let drop = trigger.event();
@@ -87,8 +99,6 @@ fn on_head_drop(
}
.ok_or("asset not found")?;
let head_id = drop.head_id;
commands
.spawn((
Name::new("headdrop"),
@@ -102,16 +112,21 @@ fn on_head_drop(
LayerMask::ALL & !GameLayer::Player.to_bits(),
),
Restitution::new(0.6),
Children::spawn(SpawnWith(move |parent: &mut RelatedSpawner<ChildOf>| {
parent
.spawn((
Collider::sphere(1.5),
CollisionLayers::new(GameLayer::CollectibleSensors, GameLayer::Player),
Sensor,
CollisionEventsEnabled,
HeadDrop(head_id),
))
.observe(on_collect_head);
Children::spawn(SpawnWith({
let head_id = drop.head_id;
let now = time.elapsed_secs();
move |parent: &mut RelatedSpawner<ChildOf>| {
parent
.spawn((
Collider::sphere(1.5),
CollisionLayers::new(GameLayer::CollectibleSensors, LayerMask::NONE),
Sensor,
CollisionEventsEnabled,
HeadDrop { head_id },
HeadDropEnableTime(now + 1.2),
))
.observe(on_collect_head);
}
})),
))
.insert_if(
@@ -127,8 +142,28 @@ fn on_head_drop(
Ok(())
}
fn enable_collectible(
mut commands: Commands,
query: Query<(Entity, &HeadDropEnableTime)>,
time: Res<Time>,
) {
let now = time.elapsed_secs();
for (e, enable_time) in query.iter() {
if now > enable_time.0 {
commands
.entity(e)
.insert(CollisionLayers::new(
LayerMask(GameLayer::CollectibleSensors.to_bits()),
LayerMask::ALL,
))
.remove::<HeadDropEnableTime>();
}
}
}
fn on_collect_head(
trigger: Trigger<OnCollisionStart>,
mut commands: Commands,
query_player: Query<&Player>,
query_collectable: Query<(&HeadDrop, &ChildOf)>,
@@ -148,7 +183,7 @@ fn on_collect_head(
commands.trigger(PlaySound::HeadCollect);
}
commands.trigger(HeadCollected(drop.0));
commands.trigger(HeadCollected(drop.head_id));
commands.entity(child_of.parent()).despawn();
}
}