diff options
Diffstat (limited to 'server/src')
| -rw-r--r-- | server/src/interaction.rs | 39 | ||||
| -rw-r--r-- | server/src/server.rs | 12 |
2 files changed, 27 insertions, 24 deletions
diff --git a/server/src/interaction.rs b/server/src/interaction.rs index 7d7376cb..dfe62121 100644 --- a/server/src/interaction.rs +++ b/server/src/interaction.rs @@ -18,7 +18,7 @@ use hurrycurry_client_lib::{Involvement, Item, gamedata_index::GamedataIndex}; use hurrycurry_protocol::{Gamedata, ItemLocation, PacketC, PlayerID, Recipe, Score, TileIndex}; use log::info; -use std::collections::VecDeque; +use std::collections::{BTreeSet, VecDeque}; #[allow(clippy::too_many_arguments)] pub fn interact( @@ -37,19 +37,22 @@ pub fn interact( ) { if other.is_none() && let Some(item) = this - && let Some(active) = &mut item.active + && let Some(inv) = &mut item.active { - let recipe = &data.recipe(active.recipe); + let recipe = &data.recipe(inv.recipe); if recipe.supports_tile(tile) && let Recipe::Active { outputs, speed, .. } = recipe { if edge { - active.speed += speed; + inv.players.extend(player); } else { - active.speed -= speed; - active.speed = active.speed.max(0.); // in case of "release without press" when items cool on active tile + if let Some(player) = player { + inv.players.remove(&player); + } } - if active.position >= 1. { + inv.speed = speed * inv.players.len() as f32; + + if inv.position >= 1. { let this_had_item = this.is_some(); let other_had_item = other.is_some(); *other = outputs[0].map(|kind| Item { kind, active: None }); @@ -66,11 +69,11 @@ pub fn interact( ); } else { packet_out.push_back(PacketC::SetProgress { - player, + players: inv.players.clone(), item: this_loc, - position: active.position, - speed: active.speed, - warn: active.warn, + position: inv.position, + speed: inv.speed, + warn: inv.warn, }); } return; @@ -92,7 +95,7 @@ pub fn interact( { info!("start active {ri}"); item.active = Some(Involvement { - player, + players: player.into_iter().collect(), recipe: ri, speed: *speed, position: 0., @@ -107,7 +110,7 @@ pub fn interact( let mut item = other.take().unwrap(); info!("start active {ri}"); item.active = Some(Involvement { - player, + players: player.into_iter().collect(), recipe: ri, speed: *speed, position: 0., @@ -120,7 +123,7 @@ pub fn interact( to: this_loc, }); packet_out.push_back(PacketC::SetProgress { - player, + players: player.into_iter().collect(), item: this_loc, position: 0., speed: *speed, @@ -248,7 +251,7 @@ pub fn tick_slot( score.passive_recipes += 1; *score_changed = true; packet_out.push_back(PacketC::SetProgress { - player: None, + players: BTreeSet::new(), warn: *warn, item: slot_loc, position: 1., @@ -266,7 +269,7 @@ pub fn tick_slot( if a.speed != prev_speed { packet_out.push_back(PacketC::SetProgress { - player: None, + players: a.players.clone(), position: a.position, speed: a.speed, warn: a.warn, @@ -283,14 +286,14 @@ pub fn tick_slot( && *input == item.kind { item.active = Some(Involvement { - player: None, + players: BTreeSet::new(), recipe: ri, position: 0., warn: *warn, speed: *speed, }); packet_out.push_back(PacketC::SetProgress { - player: None, + players: BTreeSet::new(), position: 0., speed: *speed, warn: *warn, diff --git a/server/src/server.rs b/server/src/server.rs index c0b32a1c..73035463 100644 --- a/server/src/server.rs +++ b/server/src/server.rs @@ -198,15 +198,15 @@ impl GameServerExt for Game { item: Some(item.kind), }); if let Some(Involvement { - player, + players: player, position, speed, warn, .. - }) = item.active + }) = item.active.clone() { out.push(PacketC::SetProgress { - player, + players: player, item: ItemLocation::Player(id, Hand(i)), position, speed, @@ -240,15 +240,15 @@ impl GameServerExt for Game { item: Some(item.kind), }); if let Some(Involvement { - player, + players, position, speed, warn, .. - }) = item.active + }) = item.active.clone() { out.push(PacketC::SetProgress { - player, + players: players.to_owned(), item: ItemLocation::Tile(tile), position, speed, |