diff --git a/crates/render_anim/src/occupancy/dyn_ent_phys.rs b/crates/render_anim/src/occupancy/dyn_ent_phys.rs index c8bdc82..32ca162 100644 --- a/crates/render_anim/src/occupancy/dyn_ent_phys.rs +++ b/crates/render_anim/src/occupancy/dyn_ent_phys.rs @@ -202,14 +202,12 @@ fn integrate_body(body: &mut DynEntPhysBody, clip: &ClipCollision, dt: f32) { CONTENTS_SOLID, ); if hit.allsolid || hit.startsolid { + // The hull is the model's whole bounds (a potted plant's leaves with it), so a prop where + // the map placed it can already overlap a wall, pillar or shelf. Lifting it out a unit a + // step floated such props up until the hull cleared the obstacle, where they fell asleep + // in the air; the map's placement stands instead and the prop settles where it is. body.vel = Vec3::ZERO; body.on_ground = true; - let lift = if body.mins[2] < 0.0 { - -body.mins[2] - } else { - 1.0 - }; - body.origin.z += lift; return; } if hit.fraction < 1.0 { diff --git a/crates/render_frontend/src/adapters/anim/dyn_ent_wake.rs b/crates/render_frontend/src/adapters/anim/dyn_ent_wake.rs index 8ac25ad..027bc13 100644 --- a/crates/render_frontend/src/adapters/anim/dyn_ent_wake.rs +++ b/crates/render_frontend/src/adapters/anim/dyn_ent_wake.rs @@ -862,7 +862,10 @@ pub(crate) fn wake_player_overlap( let maxs = origin + PLAYER_MAXS; let catalog = catalog.as_deref(); for (entity, inst, transform) in &instances { - if world.is_awake(entity) { + // Walking past moves clutter (cans, bottles, luggage) only: a breakable prop's sphere + // takes in a potted plant's leaves, so walking near one pushed the pot along at the + // player's speed. Bullets and explosions still move them. + if inst.ty != asset_world::DynEntType::Clutter || world.is_awake(entity) { continue; } let Some(preset) = can_wake(inst) else {