diff options
Diffstat (limited to 'server/src/server.rs')
| -rw-r--r-- | server/src/server.rs | 40 |
1 files changed, 17 insertions, 23 deletions
diff --git a/server/src/server.rs b/server/src/server.rs index 49b9cbd7..bd1d0f86 100644 --- a/server/src/server.rs +++ b/server/src/server.rs @@ -32,7 +32,7 @@ use hurrycurry_locale::{ use hurrycurry_protocol::{ Character, Gamedata, Hand, ItemLocation, Menu, MessageTimeout, PacketC, PacketS, PlayerClass, PlayerID, Score, - glam::{IVec2, Vec2}, + glam::Vec2, movement::MovementBase, }; use log::{info, warn}; @@ -155,13 +155,9 @@ impl GameServerExt for Game { self.players_spatial_index.remove_entry(id); packet_out.push_back(PacketC::RemovePlayer { id }) } - for (pos, _) in self.tiles.drain() { - packet_out.push_back(PacketC::UpdateMap { - tile: pos, - kind: None, - neighbors: [None, None, None, None], - }) - } + packet_out.push_back(PacketC::UpdateMap { + changes: self.tiles.keys().map(|&p| (p, Vec::new())).collect(), + }); self.score = Score::default(); self.environment_effects.clear(); self.walkable.clear(); @@ -193,21 +189,23 @@ impl GameServerExt for Game { ..Default::default() }; - for (&p, (tile, item)) in &serverdata.initial_map { + for (&p, (tiles, item)) in &serverdata.initial_map { self.tiles.insert( p, Tile { - kind: *tile, + parts: tiles.to_vec(), item: item.map(|i| Item { kind: i, active: None, }), }, ); - if !self.data_index.tile_collide[tile.0] { + if !self.data.walkable(tiles) { self.walkable.insert(p); } - self.tile_index.entry(*tile).or_default().insert(p); + for tile in tiles { + self.tile_index.entry(*tile).or_default().insert(p); + } if item.is_some() { self.item_locations_index.insert(ItemLocation::Tile(p)); } @@ -272,17 +270,14 @@ impl GameServerExt for Game { }) } } + out.push(PacketC::UpdateMap { + changes: self + .tiles + .iter() + .map(|(pos, tile)| (*pos, tile.parts.clone())) + .collect(), + }); for (&tile, tdata) in &self.tiles { - out.push(PacketC::UpdateMap { - 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), - ], - kind: Some(tdata.kind), - }); if let Some(item) = &tdata.item { out.push(PacketC::SetItem { location: ItemLocation::Tile(tile), @@ -306,7 +301,6 @@ impl GameServerExt for Game { } } } - out.push(PacketC::FlushMap); out.push(PacketC::Score(self.score.clone())); out.push(PacketC::SetIngame { state: true, |