summaryrefslogtreecommitdiff
path: root/server/src/server.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-09-02 14:17:55 +0200
committermetamuffin <metamuffin@disroot.org>2024-09-02 14:18:02 +0200
commit2c2052cf38757e3c77e1e7a6af18af3eb9f3a2eb (patch)
treef985f1ca2e294aada0cc95ef6761a70ff1fbf20d /server/src/server.rs
parente9e1692fb34b661e7c928c9b4b440dcb655eb062 (diff)
downloadhurrycurry-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.rs50
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}")