diff options
Diffstat (limited to 'server/src/server.rs')
-rw-r--r-- | server/src/server.rs | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/server/src/server.rs b/server/src/server.rs index bee94b0e..63664354 100644 --- a/server/src/server.rs +++ b/server/src/server.rs @@ -72,6 +72,7 @@ pub trait GameServerExt { packet_out: Option<&mut VecDeque<PacketC>>, ); fn prime_client(&self) -> Vec<PacketC>; + fn set_tile(&mut self, p: IVec2, t: Option<TileIndex>, packet_out: &mut VecDeque<PacketC>); } impl GameServerExt for Game { fn unload(&mut self, packet_out: &mut VecDeque<PacketC>) { @@ -229,6 +230,35 @@ impl GameServerExt for Game { }); } } + + fn set_tile( + &mut self, + tile: IVec2, + kind: Option<TileIndex>, + packet_out: &mut VecDeque<PacketC>, + ) { + if let Some(kind) = kind { + self.tiles.insert(tile, Tile::from(kind)); + if self.data.is_tile_colliding(kind) { + self.walkable.remove(&tile); + } else { + self.walkable.insert(tile); + } + } else { + self.tiles.remove(&tile); + self.walkable.remove(&tile); + } + packet_out.push_back(PacketC::UpdateMap { + tile, + kind, + neighbors: [ + self.tiles.get(&(tile + IVec2::NEG_Y)).map(|e| e.kind), + self.tiles.get(&(tile + IVec2::NEG_X)).map(|e| e.kind), + self.tiles.get(&(tile + IVec2::Y)).map(|e| e.kind), + self.tiles.get(&(tile + IVec2::X)).map(|e| e.kind), + ], + }) + } } impl Server { @@ -267,6 +297,7 @@ impl Server { packet_out: &mut self.packet_out, packet_in: &mut self.packet_loopback, score_changed: &mut self.score_changed, + scoreboard: &self.scoreboard, dt: 0., load_map: &mut None, }); @@ -345,6 +376,24 @@ impl Server { } } PacketS::Interact { pos, player } => { + for e in &mut self.entities { + if e.interact( + EntityContext { + game: &mut self.game, + packet_out: &mut self.packet_out, + packet_in: &mut self.packet_loopback, + score_changed: &mut self.score_changed, + load_map: &mut None, + scoreboard: &self.scoreboard, + dt: 0., + }, + pos, + player, + )? { + return Ok(()); + } + } + let pid = player; let player = self .game @@ -620,6 +669,7 @@ impl Server { packet_out: &mut self.packet_out, score_changed: &mut self.score_changed, packet_in: &mut self.packet_loopback, + scoreboard: &self.scoreboard, dt, }) { warn!("Entity tick failed: {e}") |