From c0342bcbe5f23164f89f4c5246f9e41374325e9e Mon Sep 17 00:00:00 2001 From: metamuffin Date: Mon, 3 Nov 2025 17:44:33 +0100 Subject: Fix item location index desync on disconnect --- server/src/server.rs | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) (limited to 'server/src/server.rs') 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 -- cgit v1.3