aboutsummaryrefslogtreecommitdiff
path: root/server/src/server.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-10-19 23:50:23 +0200
committermetamuffin <metamuffin@disroot.org>2025-10-19 23:50:23 +0200
commitab83f982601d93b2399102c4d030fd6e13c4c735 (patch)
treec0536ca9e328707d6b4f4cfc7a2307713466a5be /server/src/server.rs
parent231a5ce21fcee9195fcc504ee672e4464d627c47 (diff)
downloadhurrycurry-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.rs111
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();