diff --git a/crates/client/src/map.rs b/crates/client/src/map.rs index 885f242..75d2460 100644 --- a/crates/client/src/map.rs +++ b/crates/client/src/map.rs @@ -390,7 +390,8 @@ pub fn map(assets: Option, args: MapArgs) -> anyhow::Result<()> { } // Физган: тело, которое держим, и расстояние удержания (A21/A23). - let mut grabbed: Option<(engine::physics::BodyId, f32)> = None; + // Тело, расстояние удержания и углы: колесо мыши крутит взятый проп. + let mut grabbed: Option<(engine::physics::BodyId, f32, math::Vec3)> = None; // `SOURCE_RS_PHYSGUN=1` — держать ближайшее тело без мыши: нужно, чтобы // проверять физган кадром и скриптом, а не руками. let auto_grab = std::env::var_os("SOURCE_RS_PHYSGUN").is_some(); @@ -431,7 +432,7 @@ pub fn map(assets: Option, args: MapArgs) -> anyhow::Result<()> { } } if let Some((along, id)) = best { - grabbed = Some((id, along)); + grabbed = Some((id, along, math::Vec3::ZERO)); log.push_back(format!("физган: взял ({} юнитов)", along as i32)); while log.len() > 8 { log.pop_front(); @@ -526,6 +527,13 @@ pub fn map(assets: Option, args: MapArgs) -> anyhow::Result<()> { } => { pressed.remove(&code); } + Event::MouseWheel { y, .. } => { + // Колесо крутит взятый проп вокруг вертикальной оси. + if let Some((id, along, angles)) = grabbed { + let angles = math::Vec3::new(angles.x, angles.y + y * 15.0, angles.z); + grabbed = Some((id, along, angles)); + } + } Event::MouseMotion { xrel, yrel, .. } if relative_mouse => { // Source: +Y — влево, поэтому движение мыши вправо уменьшает yaw. camera.rotate(-xrel * 0.15, yrel * 0.15); @@ -573,17 +581,19 @@ pub fn map(assets: Option, args: MapArgs) -> anyhow::Result<()> { } } if let Some((along, id)) = best { - grabbed = Some((id, along)); + grabbed = Some((id, along, math::Vec3::ZERO)); } } - if let Some((id, along)) = grabbed { + if let Some((id, along, mut angles)) = grabbed { + // Углы при захвате берём у тела, дальше их крутит колесо. + if angles == math::Vec3::ZERO + && let Some((_, current)) = w.physics.transform(id) + { + angles = current; + } let target = player.eye_position() + camera.forward() * along; - let angles = w - .physics - .transform(id) - .map(|(_, angles)| angles) - .unwrap_or(math::Vec3::ZERO); w.physics.teleport(id, target, angles); + grabbed = Some((id, along, angles)); } // Модель игрока едет за игроком: позиция — ступни, поворот — курс. if let Some(index) = player_model_instance {