diff options
| author | metamuffin <metamuffin@disroot.org> | 2025-10-19 23:50:23 +0200 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2025-10-19 23:50:23 +0200 |
| commit | ab83f982601d93b2399102c4d030fd6e13c4c735 (patch) | |
| tree | c0536ca9e328707d6b4f4cfc7a2307713466a5be /server/src/server.rs | |
| parent | 231a5ce21fcee9195fcc504ee672e4464d627c47 (diff) | |
| download | hurrycurry-ab83f982601d93b2399102c4d030fd6e13c4c735.tar hurrycurry-ab83f982601d93b2399102c4d030fd6e13c4c735.tar.bz2 hurrycurry-ab83f982601d93b2399102c4d030fd6e13c4c735.tar.zst | |
Refactor and move interaction code
Diffstat (limited to 'server/src/server.rs')
| -rw-r--r-- | server/src/server.rs | 111 |
1 files changed, 7 insertions, 104 deletions
diff --git a/server/src/server.rs b/server/src/server.rs index 7ded8eb7..45f31e0b 100644 --- a/server/src/server.rs +++ b/server/src/server.rs @@ -18,13 +18,12 @@ use crate::{ ConnectionID, entity::{Entities, EntityContext, construct_entity}, - interaction::{interact, tick_slot}, random_float, scoreboard::ScoreboardStore, }; use anyhow::{Context, Result}; -use hurrycurry_game_core::{Game, Involvement, Item, Player, Tile}; use hurrycurry_data::{Serverdata, index::DataIndex}; +use hurrycurry_game_core::{Game, Involvement, Item, Player, Tile}; use hurrycurry_locale::{ FALLBACK_LOCALE, TrError, message::{COLORED, MessageDisplayExt}, @@ -546,83 +545,9 @@ impl Server { return Err(tre!("s.error.interacting_too_far")); } - // No going back from here on - player.interacting = if edge { Some((loc, hand)) } else { None }; - - match loc { - ItemLocation::Tile(pos) => { - let player = self - .game - .players - .get_mut(&pid) - .ok_or(tre!("s.error.no_player"))?; - - let hslot = player - .items - .get_mut(hand.0) - .ok_or(tre!("s.error.no_hand"))?; - - let tile = self - .game - .tiles - .get_mut(&pos) - .ok_or(tre!("s.error.no_tile"))?; - - interact( - &self.game.data, - edge, - Some(tile.kind), - Some(pid), - &mut tile.item, - ItemLocation::Tile(pos), - hslot, - ItemLocation::Player(pid, hand), - &mut self.game.score, - &mut self.score_changed, - false, - &mut self.packet_out, - ) - } - ItemLocation::Player(other_pid, other_hand) => { - if pid == other_pid { - return Err(tre!("s.error.self_interact")); - } - let [Some(other), Some(this)] = - self.game.players.get_disjoint_mut([&pid, &other_pid]) - else { - return Err(tre!("s.error.no_player")); - }; - - if this.class == PlayerClass::Customer - || other.class == PlayerClass::Customer - { - return Err(tre!("s.error.customer_interact")); - } - - let this_hslot = - this.items.get_mut(hand.0).ok_or(tre!("s.error.no_hand"))?; - let other_hslot = other - .items - .get_mut(other_hand.0) - .ok_or(tre!("s.error.no_hand"))?; - - interact( - &self.game.data, - edge, - None, - Some(pid), - this_hslot, - ItemLocation::Player(other_pid, hand), - other_hslot, - ItemLocation::Player(pid, hand), - &mut self.game.score, - &mut self.score_changed, - false, - &mut self.packet_out, - ) - } - } + self.game + .interact(loc, ItemLocation::Player(pid, hand), edge)?; } PacketS::Communicate { message, @@ -695,18 +620,10 @@ impl Server { .push_back(PacketC::Score(self.game.score.clone())); } - for (&pos, tile) in &mut self.game.tiles { - tick_slot( - dt, - &self.game.data, - &self.game.data_index, - Some(tile.kind), - &mut tile.item, - ItemLocation::Tile(pos), - &mut self.game.score, - &mut self.score_changed, - &mut self.packet_out, - ); + for loc in self.game.item_locations_index.clone() { + if let Err(e) = self.game.tick_slot(loc, dt) { + warn!("Slot tick failed: {}", e.to_string()); + } } for (&pid, player) in &mut self.game.players { @@ -737,20 +654,6 @@ impl Server { boost: player.movement.boosting, rot: player.movement.rotation, }); - - for (i, item) in player.items.iter_mut().enumerate() { - tick_slot( - dt, - &self.game.data, - &self.game.data_index, - None, - item, - ItemLocation::Player(pid, Hand(i)), - &mut self.game.score, - &mut self.score_changed, - &mut self.packet_out, - ); - } } let mut players_auto_release = Vec::new(); |