diff options
author | metamuffin <metamuffin@disroot.org> | 2024-09-02 14:17:55 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-09-02 14:18:02 +0200 |
commit | 2c2052cf38757e3c77e1e7a6af18af3eb9f3a2eb (patch) | |
tree | f985f1ca2e294aada0cc95ef6761a70ff1fbf20d /server/src/server.rs | |
parent | e9e1692fb34b661e7c928c9b4b440dcb655eb062 (diff) | |
download | hurrycurry-2c2052cf38757e3c77e1e7a6af18af3eb9f3a2eb.tar hurrycurry-2c2052cf38757e3c77e1e7a6af18af3eb9f3a2eb.tar.bz2 hurrycurry-2c2052cf38757e3c77e1e7a6af18af3eb9f3a2eb.tar.zst |
campaign gate entity
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}") |