aboutsummaryrefslogtreecommitdiff
path: root/server/src/game.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/game.rs')
-rw-r--r--server/src/game.rs26
1 files changed, 19 insertions, 7 deletions
diff --git a/server/src/game.rs b/server/src/game.rs
index 46bc0569..35502d3c 100644
--- a/server/src/game.rs
+++ b/server/src/game.rs
@@ -33,7 +33,7 @@ pub struct Tile {
pub struct Player {
pub name: String,
pub position: Vec2,
- pub interacting: bool,
+ pub interacting: Option<IVec2>,
pub item: Option<Item>,
}
@@ -98,7 +98,7 @@ impl Game {
Player {
item: None,
position: self.data.spawn,
- interacting: false,
+ interacting: None,
name: name.clone(),
},
);
@@ -113,8 +113,17 @@ impl Game {
.players
.remove(&player)
.ok_or(anyhow!("player does not exist"))?;
- if let Some(_id) = p.item {
- // TODO place on ground
+ if let Some(item) = p.item {
+ let pos = p.position.floor().as_ivec2();
+ if let Some(tile) = self.tiles.get_mut(&pos) {
+ if tile.item.is_none() {
+ self.packet_out.push_back(PacketC::ProduceItem {
+ tile: pos,
+ item: item.kind,
+ });
+ tile.item = Some(item);
+ }
+ }
}
self.packet_out
.push_back(PacketC::RemovePlayer { id: player })
@@ -140,8 +149,11 @@ impl Game {
.get_mut(&pos)
.ok_or(anyhow!("tile does not exist"))?;
- if edge == player.interacting {
- bail!("already (not) interacting")
+ if edge && player.interacting.is_some() {
+ bail!("already interacting")
+ }
+ if !edge && player.interacting != Some(pos) {
+ bail!("already not interacting here")
}
let tile_had_item = tile.item.is_some();
@@ -190,7 +202,7 @@ impl Game {
}
}
- player.interacting = edge;
+ player.interacting = if edge { Some(pos) } else { None };
}
}
Ok(())