diff options
Diffstat (limited to 'server/src/game.rs')
-rw-r--r-- | server/src/game.rs | 47 |
1 files changed, 35 insertions, 12 deletions
diff --git a/server/src/game.rs b/server/src/game.rs index 3eb6e5a6..908c0b4e 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -325,29 +325,34 @@ impl Game { self.packet_out .push_back(PacketC::Collide { player, force }); } - PacketS::Interact { pos, edge } => { - info!("interact {pos:?} edge={edge}"); + PacketS::Interact { pos } => { + info!("interact {pos:?}"); let pid = player; let player = self .players .get_mut(&pid) .ok_or(anyhow!("player does not exist"))?; - let tile = self - .tiles - .get_mut(&pos) - .ok_or(anyhow!("tile does not exist"))?; - if edge && player.interacting.is_some() { - bail!("already interacting") - } - if !edge && player.interacting != Some(pos) { - bail!("already not interacting here") - } + let (pos, edge) = match (pos, player.interacting) { + (None, None) => return Ok(()), // this is silent because of auto release + (None, Some(pos)) => (pos, false), + (Some(pos), None) => (pos, true), + (Some(_), Some(_)) => bail!("already interacting"), + }; + let entpos = pos.as_vec2() + Vec2::splat(0.5); if edge && entpos.distance(player.position) > 2. { bail!("interacting too far from player"); } + + let tile = self + .tiles + .get_mut(&pos) + .ok_or(anyhow!("tile does not exist"))?; + + // No going back from here on + player.interacting = if edge { Some(pos) } else { None }; let other_pid = if !self.data.is_tile_interactable(tile.kind) { @@ -509,6 +514,24 @@ impl Game { } } + let mut players_auto_release = Vec::new(); + for (pid, player) in &mut self.players { + if let Some(pos) = player.interacting { + if let Some(tile) = self.tiles.get(&pos) { + if let Some(item) = &tile.item { + if let Some(involvement) = &item.active { + if involvement.progress >= 1. { + players_auto_release.push(*pid); + } + } + } + } + } + } + for pid in players_auto_release.drain(..) { + let _ = self.packet_in(pid, PacketS::Interact { pos: None }); + } + for entity in &mut self.entities { if let Err(e) = entity.tick( &self.data, |