summaryrefslogtreecommitdiff
path: root/server/src/game.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-07-09 14:52:54 +0200
committermetamuffin <metamuffin@disroot.org>2024-07-09 14:52:54 +0200
commit13cbcc920a2756376e0005046b4b82c68eb9c9da (patch)
treebabcd00e7fedc9a2fd8001d3435d7c1268aeb414 /server/src/game.rs
parent52f7b5833510b0e55d4942d99f1c8046643ee31d (diff)
downloadhurrycurry-13cbcc920a2756376e0005046b4b82c68eb9c9da.tar
hurrycurry-13cbcc920a2756376e0005046b4b82c68eb9c9da.tar.bz2
hurrycurry-13cbcc920a2756376e0005046b4b82c68eb9c9da.tar.zst
implement auto release on active (and passive) recipes
Diffstat (limited to 'server/src/game.rs')
-rw-r--r--server/src/game.rs47
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,