diff --git a/engine/physics/src/physics.rs b/engine/physics/src/physics.rs index aaee911..c328360 100644 --- a/engine/physics/src/physics.rs +++ b/engine/physics/src/physics.rs @@ -857,6 +857,12 @@ impl Default for PhysicsState{ } impl PhysicsState{ + pub fn new_at_position(position:Planar64Vec3)->Self{ + Self{ + body:Body::new(position,vec3::int(0,0,0),vec3::int(0,-100,0),Time::ZERO), + ..Self::default() + } + } pub fn camera_body(&self)->Body{ Body{ position:self.body.position+self.style.camera_offset, diff --git a/integration-testing/src/main.rs b/integration-testing/src/main.rs index f93abae..69fb8fc 100644 --- a/integration-testing/src/main.rs +++ b/integration-testing/src/main.rs @@ -9,10 +9,35 @@ fn main(){ match arg.as_deref(){ Some("determinism")|None=>test_determinism().unwrap(), Some("replay")=>run_replay().unwrap(), + Some("bug2")=>physics_bug_2().unwrap(), _=>println!("invalid argument"), } } +fn physics_bug_2()->Result<(),ReplayError>{ + println!("loading map file.."); + let data=read_entire_file("/run/media/quat/Files/Documents/map-files/strafesnet/maps/bsp_to_snf/bhop_monster_jam.snfm")?; + let map=strafesnet_snf::read_map(data)?.into_complete_map()?; + + // create recording + let mut physics_data=PhysicsData::default(); + println!("generating models.."); + physics_data.generate_models(&map); + println!("simulating..."); + + //teleport to bug + // body pos = Vector { array: [Fixed { bits: 554895163352 }, Fixed { bits: 1485633089990 }, Fixed { bits: 1279601007173 }] } + let mut physics=PhysicsState::new_at_position(strafesnet_common::integer::vec3::raw_xyz(554895163352,1485633089990,1279601007173)); + // wait one second to activate the bug + // hit=Some(ModelId(2262)) + PhysicsContext::run_input_instruction(&mut physics,&physics_data,strafesnet_common::instruction::TimedInstruction{ + time:strafesnet_common::integer::Time::ONE_SECOND, + instruction:strafesnet_common::physics::Instruction::Idle, + }); + + Ok(()) +} + #[allow(unused)] #[derive(Debug)] enum ReplayError{