aboutsummaryrefslogtreecommitdiff
path: root/server/src/server.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-11-03 17:44:33 +0100
committermetamuffin <metamuffin@disroot.org>2025-11-03 17:44:33 +0100
commitc0342bcbe5f23164f89f4c5246f9e41374325e9e (patch)
tree2a02e344b4274be47ee64621763a5be3cc7cb0c3 /server/src/server.rs
parent1f91f8aae0fb5e77583625a945c273b85f9a25e3 (diff)
downloadhurrycurry-c0342bcbe5f23164f89f4c5246f9e41374325e9e.tar
hurrycurry-c0342bcbe5f23164f89f4c5246f9e41374325e9e.tar.bz2
hurrycurry-c0342bcbe5f23164f89f4c5246f9e41374325e9e.tar.zst
Fix item location index desync on disconnect
Diffstat (limited to 'server/src/server.rs')
-rw-r--r--server/src/server.rs27
1 files changed, 16 insertions, 11 deletions
diff --git a/server/src/server.rs b/server/src/server.rs
index 4c46a280..918058f8 100644
--- a/server/src/server.rs
+++ b/server/src/server.rs
@@ -472,17 +472,22 @@ impl Server {
self.game.players_spatial_index.remove_entry(player);
- // TODO if holding two, one is destroyed
- for item in p.items.into_iter().flatten() {
- let pos = p.movement.position.floor().as_ivec2();
- if let Some(tile) = self.game.tiles.get_mut(&pos)
- && tile.item.is_none()
- {
- self.packet_out.push_back(PacketC::SetItem {
- location: ItemLocation::Tile(pos),
- item: Some(item.kind),
- });
- tile.item = Some(item);
+ // ! if holding two, one is destroyed
+ for (hand, item) in p.items.into_iter().enumerate() {
+ if let Some(item) = item {
+ self.game
+ .item_locations_index
+ .remove(&ItemLocation::Player(player, Hand(hand)));
+ let pos = p.movement.position.floor().as_ivec2();
+ if let Some(tile) = self.game.tiles.get_mut(&pos)
+ && tile.item.is_none()
+ {
+ self.packet_out.push_back(PacketC::SetItem {
+ location: ItemLocation::Tile(pos),
+ item: Some(item.kind),
+ });
+ tile.item = Some(item);
+ }
}
}
self.packet_out