diff options
author | metamuffin <metamuffin@disroot.org> | 2024-08-11 01:30:59 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-08-11 01:35:05 +0200 |
commit | 218da36b4f963a5dfcd619d543cb95c5c196d214 (patch) | |
tree | 244ecd10f4ca3d9798cedf7149394a1d4827b5d9 /server/client-lib | |
parent | f753629acd906ff7acd42a18a266cc93a883330c (diff) | |
download | hurrycurry-218da36b4f963a5dfcd619d543cb95c5c196d214.tar hurrycurry-218da36b4f963a5dfcd619d543cb95c5c196d214.tar.bz2 hurrycurry-218da36b4f963a5dfcd619d543cb95c5c196d214.tar.zst |
update movement in protocol and all clients
Diffstat (limited to 'server/client-lib')
-rw-r--r-- | server/client-lib/src/lib.rs | 44 | ||||
-rw-r--r-- | server/client-lib/src/network/sync.rs | 14 |
2 files changed, 47 insertions, 11 deletions
diff --git a/server/client-lib/src/lib.rs b/server/client-lib/src/lib.rs index 649e71b2..d949ac6e 100644 --- a/server/client-lib/src/lib.rs +++ b/server/client-lib/src/lib.rs @@ -15,6 +15,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>. */ +#![feature(map_many_mut)] pub mod network; pub mod spatial_index; @@ -63,6 +64,22 @@ pub struct Game { pub score: Score, } +impl Default for Game { + fn default() -> Self { + Self { + data: Default::default(), + tiles: HashMap::new(), + walkable: HashSet::new(), + players: HashMap::new(), + players_spatial_index: SpatialIndex::default(), + end: None, + lobby: false, + environment_effects: HashSet::new(), + score: Score::default(), + } + } +} + impl Game { pub fn apply_packet(&mut self, packet: PacketC) { match packet { @@ -90,16 +107,17 @@ impl Game { PacketC::RemovePlayer { id } => { self.players.remove(&id); } - PacketC::Position { + PacketC::Movement { player, pos, rot, - boosting, + boost, + dir, } => { if let Some(p) = self.players.get_mut(&player) { + p.movement.input(dir, boost); p.movement.position = pos; p.movement.rotation = rot; - p.movement.boosting = boosting; } } @@ -159,6 +177,26 @@ impl Game { _ => (), } } + + pub fn tick(&mut self, dt: f32) { + self.score.time_remaining -= dt as f64; + self.score.time_remaining -= self.score.time_remaining.max(0.); + + for (&pid, player) in &mut self.players { + player.movement.update(&self.walkable, dt); + self.players_spatial_index + .update_entry(pid, player.movement.position); + } + + self.players_spatial_index.all(|p1, pos1| { + self.players_spatial_index.query(pos1, 2., |p2, _pos2| { + if let Some([a, b]) = self.players.get_many_mut([&p1, &p2]) { + a.movement.collide(&mut b.movement, dt) + } + }) + }); + } + pub fn get_item(&mut self, location: ItemLocation) -> &mut Option<Item> { match location { ItemLocation::Tile(pos) => &mut self.tiles.get_mut(&pos).unwrap().item, diff --git a/server/client-lib/src/network/sync.rs b/server/client-lib/src/network/sync.rs index e8aa08de..3a475e01 100644 --- a/server/client-lib/src/network/sync.rs +++ b/server/client-lib/src/network/sync.rs @@ -80,7 +80,7 @@ impl Network { }) } - pub fn poll(&mut self) { + pub fn poll(&mut self) -> anyhow::Result<()> { loop { self.queue_in.extend(match self.sock.read() { Ok(Message::Text(packet)) => match serde_json::from_str(&packet) { @@ -131,18 +131,16 @@ impl Network { for packet in self.queue_out.drain(..) { debug!("-> {packet:?}"); if self.use_bincode { - self.sock - .write(Message::Binary( - bincode::encode_to_vec(&packet, BINCODE_CONFIG).unwrap(), - )) - .unwrap(); + self.sock.write(Message::Binary( + bincode::encode_to_vec(&packet, BINCODE_CONFIG).unwrap(), + ))?; } else { self.sock - .write(Message::Text(serde_json::to_string(&packet).unwrap())) - .unwrap(); + .write(Message::Text(serde_json::to_string(&packet).unwrap()))?; } } self.sock.flush().unwrap(); + Ok(()) } } |