aboutsummaryrefslogtreecommitdiff
path: root/server/game-core/src
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-03-10 23:59:25 +0100
committermetamuffin <metamuffin@disroot.org>2026-03-10 23:59:25 +0100
commit1383cf5dac9d1471034ec491e122dfef6cf9999c (patch)
treec96f9f554b7752c7c31c8e72e32459b3282ec3b7 /server/game-core/src
parentc49f0a8afd405e5fe8f0ed79c034f9a9b80674cf (diff)
downloadhurrycurry-1383cf5dac9d1471034ec491e122dfef6cf9999c.tar
hurrycurry-1383cf5dac9d1471034ec491e122dfef6cf9999c.tar.bz2
hurrycurry-1383cf5dac9d1471034ec491e122dfef6cf9999c.tar.zst
clean up server code, move some code to game behaviour crate
Diffstat (limited to 'server/game-core/src')
-rw-r--r--server/game-core/src/lib.rs134
1 files changed, 134 insertions, 0 deletions
diff --git a/server/game-core/src/lib.rs b/server/game-core/src/lib.rs
index faecb9d1..21315a07 100644
--- a/server/game-core/src/lib.rs
+++ b/server/game-core/src/lib.rs
@@ -316,4 +316,138 @@ impl Game {
self.player_id_counter += 1;
PlayerID(self.player_id_counter)
}
+
+ pub fn prime_client(&self) -> Vec<PacketC> {
+ let mut out = Vec::new();
+ out.push(PacketC::GameData({
+ let mut k = self.data.as_ref().to_owned();
+ k.recipes.clear();
+ k.demands.clear();
+ k
+ }));
+ out.push(PacketC::Environment {
+ effects: self.environment_effects.clone(),
+ });
+ for (&id, player) in &self.players {
+ out.push(PacketC::AddPlayer {
+ id,
+ class: player.class,
+ position: player.movement.position,
+ character: player.character,
+ name: player.name.clone(),
+ });
+ for (i, item) in player.items.iter().enumerate() {
+ if let Some(item) = &item {
+ out.push(PacketC::SetItem {
+ location: ItemLocation::Player(id, Hand(i)),
+ item: Some(item.kind),
+ });
+ if let Some(Involvement {
+ players: player,
+ position,
+ speed,
+ warn,
+ ..
+ }) = item.active.clone()
+ {
+ out.push(PacketC::SetProgress {
+ players: player,
+ item: ItemLocation::Player(id, Hand(i)),
+ position,
+ speed,
+ warn,
+ });
+ }
+ }
+ }
+ if let Some((message, timeout)) = &player.communicate_persist {
+ out.push(PacketC::Communicate {
+ player: id,
+ message: Some(message.to_owned()),
+ timeout: Some(*timeout),
+ })
+ }
+ }
+ out.push(PacketC::UpdateMap {
+ changes: self
+ .tiles
+ .iter()
+ .map(|(pos, tile)| (*pos, tile.parts.clone()))
+ .collect(),
+ });
+ for (&tile, tdata) in &self.tiles {
+ if let Some(item) = &tdata.item {
+ out.push(PacketC::SetItem {
+ location: ItemLocation::Tile(tile),
+ item: Some(item.kind),
+ });
+ if let Some(Involvement {
+ players,
+ position,
+ speed,
+ warn,
+ ..
+ }) = item.active.clone()
+ {
+ out.push(PacketC::SetProgress {
+ players: players.to_owned(),
+ item: ItemLocation::Tile(tile),
+ position,
+ speed,
+ warn,
+ });
+ }
+ }
+ }
+ out.push(PacketC::Score(self.score.clone()));
+ out.push(PacketC::SetIngame {
+ state: true,
+ lobby: self.lobby,
+ });
+ out
+ }
+
+ pub fn unload(&mut self, packet_out: &mut VecDeque<PacketC>) {
+ packet_out.push_back(PacketC::SetIngame {
+ state: false,
+ lobby: false,
+ });
+ for (id, _) in self.players.drain() {
+ self.players_spatial_index.remove_entry(id);
+ packet_out.push_back(PacketC::RemovePlayer { id })
+ }
+ packet_out.push_back(PacketC::UpdateMap {
+ changes: self.tiles.keys().map(|&p| (p, Vec::new())).collect(),
+ });
+ self.tiles.clear();
+ self.score = Score::default();
+ self.environment_effects.clear();
+ self.walkable.clear();
+ self.tile_index.clear();
+ self.item_locations_index.clear();
+ }
+
+ pub fn remove_player(&mut self, id: PlayerID) -> bool {
+ let Some(p) = self.players.remove(&id) else {
+ return false;
+ };
+ for (hand, item) in p.items.into_iter().enumerate() {
+ if let Some(item) = item {
+ self.item_locations_index
+ .remove(&ItemLocation::Player(id, Hand(hand)));
+ let pos = p.movement.position.floor().as_ivec2();
+ if let Some(tile) = self.tiles.get_mut(&pos)
+ && tile.item.is_none()
+ {
+ self.events.push_back(PacketC::SetItem {
+ location: ItemLocation::Tile(pos),
+ item: Some(item.kind),
+ });
+ tile.item = Some(item);
+ }
+ }
+ }
+ self.events.push_back(PacketC::RemovePlayer { id });
+ true
+ }
}