aboutsummaryrefslogtreecommitdiff
path: root/server/src/server.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/server.rs')
-rw-r--r--server/src/server.rs40
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,