diff --git a/client/player/PlayerNetworkingComponent.gd b/client/player/PlayerNetworkingComponent.gd index 9729eb1..a6efdf7 100644 --- a/client/player/PlayerNetworkingComponent.gd +++ b/client/player/PlayerNetworkingComponent.gd @@ -54,34 +54,34 @@ func is_local_authority() -> bool: #sync player on clients func _physics_process(_delta): return - if !is_local_authority(): - if not processed_position: - PlayerRef.character_node.position = sync_position - processed_position = true - PlayerRef.mesh_ref.rotation = sync_mesh_rotation - PlayerRef.input_direction = sync_direction - PlayerRef.gait = sync_gait - PlayerRef.stance = sync_stance - PlayerRef.rotation_mode = sync_rotation_mode - PlayerRef.camera_root.VObject.transform = sync_camera_v_transform - PlayerRef.camera_root.HObject.transform = sync_camera_h_transform - PlayerRef.camera_root.view_mode = sync_CameraHOffset - PlayerRef.camera_root.CameraHOffset = sync_CameraHOffset - PlayerRef.movement_state = sync_movement_state - PlayerRef.movement_action = sync_movement_action -# PlayerRef.velocity = sync_velocity - PlayerRef.input_is_moving = sync_input_is_moving - return - sync_position = PlayerRef.character_node.position - sync_mesh_rotation = PlayerRef.mesh_ref.rotation - sync_direction = PlayerRef.input_direction - sync_gait = PlayerRef.gait - sync_stance = PlayerRef.stance - sync_rotation_mode = PlayerRef.rotation_mode - sync_camera_h_transform = PlayerRef.camera_root.HObject.transform - sync_camera_v_transform = PlayerRef.camera_root.VObject.transform - sync_movement_state = PlayerRef.movement_state - sync_movement_action = PlayerRef.movement_action - sync_input_is_moving = PlayerRef.input_is_moving - sync_view_mode = PlayerRef.camera_root.view_mode - sync_CameraHOffset = PlayerRef.camera_root.CameraHOffset +# if !is_local_authority(): +# if not processed_position: +# PlayerRef.character_node.position = sync_position +# processed_position = true +# PlayerRef.mesh_ref.rotation = sync_mesh_rotation +# PlayerRef.input_direction = sync_direction +# PlayerRef.gait = sync_gait +# PlayerRef.stance = sync_stance +# PlayerRef.rotation_mode = sync_rotation_mode +# PlayerRef.camera_root.VObject.transform = sync_camera_v_transform +# PlayerRef.camera_root.HObject.transform = sync_camera_h_transform +# PlayerRef.camera_root.view_mode = sync_CameraHOffset +# PlayerRef.camera_root.CameraHOffset = sync_CameraHOffset +# PlayerRef.movement_state = sync_movement_state +# PlayerRef.movement_action = sync_movement_action +## PlayerRef.velocity = sync_velocity +# PlayerRef.input_is_moving = sync_input_is_moving +# return +# sync_position = PlayerRef.character_node.position +# sync_mesh_rotation = PlayerRef.mesh_ref.rotation +# sync_direction = PlayerRef.input_direction +# sync_gait = PlayerRef.gait +# sync_stance = PlayerRef.stance +# sync_rotation_mode = PlayerRef.rotation_mode +# sync_camera_h_transform = PlayerRef.camera_root.HObject.transform +# sync_camera_v_transform = PlayerRef.camera_root.VObject.transform +# sync_movement_state = PlayerRef.movement_state +# sync_movement_action = PlayerRef.movement_action +# sync_input_is_moving = PlayerRef.input_is_moving +# sync_view_mode = PlayerRef.camera_root.view_mode +# sync_CameraHOffset = PlayerRef.camera_root.CameraHOffset diff --git a/client/scenes/multi.gd b/client/scenes/multi.gd index c8e9cb1..92960aa 100644 --- a/client/scenes/multi.gd +++ b/client/scenes/multi.gd @@ -134,6 +134,7 @@ func get_event_received(): var rx:float = data.decode_double(2+32) var ry:float = data.decode_double(2+40) var rz:float = data.decode_double(2+48) + var _tick:int = data.decode_double(2+1) print("MyID:", id) #print("id:", id, " x:", x, " y:", y, " z:", z) update_my_position.emit(Vector3(x, y, z), Vector3(rx, ry, rz)) @@ -154,11 +155,12 @@ func get_event_received(): var rx:float = data.decode_double(pos+32) var ry:float = data.decode_double(pos+40) var rz:float = data.decode_double(pos+48) - pos += 56 + var tick:int = data.decode_u8(pos+56) + pos += 57 if mid == id: #print("Me id:", mid, " x:", mx, " y:", my, " z:", mz) continue - print("pos:", pos, " id:", mid, " x:", mx, " y:", my, " z:", mz, " rx:", rx, " ry:", ry, " rz:", rz) + print("pos:", pos, " id:", mid, " tick:", tick, " x:", mx, " y:", my, " z:", mz, " rx:", rx, " ry:", ry, " rz:", rz) update_player_position.emit(mid, Vector3(mx, my, mz), Vector3(rx, ry, rz)) var nbuserremove:int = data[pos] pos += 1 diff --git a/server/src/main.rs b/server/src/main.rs index 16dae48..faf8aa8 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -62,6 +62,7 @@ fn push_u64(data:&mut Vec, value:u64) { data.push(buf[6]); data.push(buf[7]); } + fn push_f64(data:&mut Vec, value:f64) { let mut buf = [0; 8]; LittleEndian::write_f64(&mut buf, value); @@ -75,6 +76,10 @@ fn push_f64(data:&mut Vec, value:f64) { data.push(buf[7]); } +fn push_u8(data:&mut Vec, value:u8) { + data.push(value); +} + /* enum Simple { Error(String), @@ -125,6 +130,7 @@ struct User { position_updated: bool, lasttime: Instant, sendfull: u8, + lastupdate: u8, } impl PartialEq for User { @@ -143,6 +149,18 @@ impl User { } } */ + pub fn clear_player(&mut self) { + self.x = 0.0; + self.y = 0.0; + self.z = 0.0; + self.rx = 0.0; + self.ry = 0.0; + self.rz = 0.0; + self.position_updated = false; + self.lasttime = Instant::now(); + self.sendfull = 0; + self.lastupdate = 0; + } pub fn set_inactive(&mut self) { self.active = false; self.lasttime = Instant::now(); @@ -160,6 +178,7 @@ impl User { } pub fn clear_username(&mut self) { self.username = "".to_string(); + self.clear_player(); } pub fn clear_address(&mut self) { self.address = Address::new(Ipv4Addr::new(0, 0, 0, 0), 0); @@ -167,30 +186,36 @@ impl User { pub fn clear_position_updated(&mut self) { self.position_updated = false; } - pub fn update_pos_rot(&mut self, x:f64, y:f64, z:f64, rx:f64, ry:f64, rz:f64) { + pub fn update_pos_rot(&mut self, x:f64, y:f64, z:f64, rx:f64, ry:f64, rz:f64, lastupdate:u8) { if self.x != x { self.x = x; self.position_updated = true; + self.lastupdate = lastupdate; } if self.y != y { self.y = y; self.position_updated = true; + self.lastupdate = lastupdate; } if self.z != z { self.z = z; self.position_updated = true; + self.lastupdate = lastupdate; } if self.rx != rx { self.rx = rx; self.position_updated = true; + self.lastupdate = lastupdate; } if self.ry != ry { self.ry = ry; self.position_updated = true; + self.lastupdate = lastupdate; } if self.rz != rz { self.rz = rz; self.position_updated = true; + self.lastupdate = lastupdate; } } /* @@ -207,6 +232,7 @@ impl User { push_f64(data, self.rx); push_f64(data, self.ry); push_f64(data, self.rz); + push_u8(data, self.lastupdate); } pub fn push_packet_id(&self, data:&mut Vec) { push_u64(data, self.id); @@ -335,13 +361,13 @@ impl Users { pub fn add(&mut self, username:String, address: Address) -> u64 { let id = self.get_new_id(); self.player_active += 1; - self.users.push( User { active: true, username:username, address: address, id: id, x: 0.0, y: 10.0, z:0.0, rx: 0.0, ry: 0.0, rz:0.0, position_updated:true, lasttime: Instant::now(), sendfull:10} ); + self.users.push( User { active: true, username:username, address: address, id: id, x: 0.0, y: 10.0, z:0.0, rx: 0.0, ry: 0.0, rz:0.0, position_updated:true, lasttime: Instant::now(), sendfull:10, lastupdate:0} ); id } - pub fn update_pos_rot(&mut self, address: Address, x:f64, y:f64, z:f64, rx:f64, ry:f64, rz:f64) { + pub fn update_pos_rot(&mut self, address: Address, x:f64, y:f64, z:f64, rx:f64, ry:f64, rz:f64, tick:u8) { for user in self.users.iter_mut() { if user.address == address { - user.update_pos_rot(x, y, z, rx, ry, rz); + user.update_pos_rot(x, y, z, rx, ry, rz, tick); } } } @@ -717,6 +743,7 @@ fn main() -> anyhow::Result<()> { let mut launch_cleanup : u8 = 60; let mut last_update:Instant = Instant::now(); let mut stat:Statistics = Statistics::new(); + let mut tick : u8 = 0; if cli.trace { loginit(LevelFilter::Trace).unwrap(); @@ -748,6 +775,12 @@ fn main() -> anyhow::Result<()> { info!("Started"); loop { trace!("users: {}", users); + if tick == 255 { + tick += 1; + } else { + tick = 1; + } + stat.inc_loop(); match host.service(1000).context("service failed")? { Some(Event::Connect(_)) => { @@ -902,7 +935,7 @@ fn main() -> anyhow::Result<()> { let ry = rybytes.read_f64::().unwrap(); let mut rzbytes: &[u8] = &packet.data()[40..48]; let rz = rzbytes.read_f64::().unwrap(); - users.update_pos_rot(sender.address(), x, y, z, rx, ry, rz); + users.update_pos_rot(sender.address(), x, y, z, rx, ry, rz, tick); } _ => { send_message_connect_ko(sender.clone()).unwrap();