diff options
author | metamuffin <metamuffin@disroot.org> | 2024-06-25 23:34:10 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-06-25 23:34:10 +0200 |
commit | 4dc15a1e86ef1ae985fdf36f1a84d07b1de99ea7 (patch) | |
tree | 6a262cd2be9abee480adda3e367c7f8abf8845d6 /server/src/game.rs | |
parent | 84c90e84a1e0d6cd2eae36fd8888354b4e23c354 (diff) | |
download | hurrycurry-4dc15a1e86ef1ae985fdf36f1a84d07b1de99ea7.tar hurrycurry-4dc15a1e86ef1ae985fdf36f1a84d07b1de99ea7.tar.bz2 hurrycurry-4dc15a1e86ef1ae985fdf36f1a84d07b1de99ea7.tar.zst |
server can change map at runtime
Diffstat (limited to 'server/src/game.rs')
-rw-r--r-- | server/src/game.rs | 52 |
1 files changed, 40 insertions, 12 deletions
diff --git a/server/src/game.rs b/server/src/game.rs index c5eb8c9f..c0a03616 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -67,15 +67,39 @@ pub struct Game { } impl Game { - pub fn new(gamedata: Arc<Gamedata>) -> Self { - let mut g = Self { - data: gamedata.clone(), + pub fn new() -> Self { + Self { + data: Gamedata::default().into(), packet_out: Default::default(), players: Default::default(), tiles: Default::default(), - }; - for (&p, (tile, item)) in &gamedata.initial_map { - g.tiles.insert( + } + } + + fn unload(&mut self) { + for (id, _) in self.players.drain() { + self.packet_out.push_back(PacketC::RemovePlayer { id }) + } + for (pos, _) in self.tiles.drain() { + self.packet_out.push_back(PacketC::UpdateMap { + tile: pos, + kind: None, + neighbors: [None, None, None, None], + }) + } + } + pub fn load(&mut self, gamedata: Gamedata) { + let players = self + .players + .iter() + .map(|(id, p)| (*id, (p.name.to_owned(), p.character))) + .collect::<HashMap<_, _>>(); + + self.unload(); + + self.data = gamedata.into(); + for (&p, (tile, item)) in &self.data.initial_map { + self.tiles.insert( p, Tile { kind: *tile, @@ -86,7 +110,12 @@ impl Game { }, ); } - g + for (id, (name, character)) in players { + self.packet_in(id, PacketS::Join { name, character }) + .unwrap(); + } + + self.packet_out.extend(self.prime_client()); } pub fn tiles(&self) -> &HashMap<IVec2, Tile> { @@ -97,10 +126,9 @@ impl Game { self.packet_out.pop_front() } - pub fn prime_client(&self, id: PlayerID) -> Vec<PacketC> { + pub fn prime_client(&self) -> Vec<PacketC> { let mut out = Vec::new(); - out.push(PacketC::Init { - id, + out.push(PacketC::Data { data: self.data.deref().to_owned(), }); for (&id, player) in &self.players { @@ -125,14 +153,14 @@ impl Game { } for (&tile, tdata) in &self.tiles { out.push(PacketC::UpdateMap { - pos: tile, + tile, neighbors: [ self.tiles.get(&(tile + IVec2::NEG_Y)).map(|e| e.kind), self.tiles.get(&(tile + IVec2::NEG_X)).map(|e| e.kind), self.tiles.get(&(tile + IVec2::Y)).map(|e| e.kind), self.tiles.get(&(tile + IVec2::X)).map(|e| e.kind), ], - tile: tdata.kind.clone(), + kind: Some(tdata.kind.clone()), }); if let Some(item) = &tdata.item { out.push(PacketC::SetTileItem { |