diff options
| author | metamuffin <metamuffin@disroot.org> | 2025-11-03 17:44:33 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2025-11-03 17:44:33 +0100 |
| commit | c0342bcbe5f23164f89f4c5246f9e41374325e9e (patch) | |
| tree | 2a02e344b4274be47ee64621763a5be3cc7cb0c3 /server/src/server.rs | |
| parent | 1f91f8aae0fb5e77583625a945c273b85f9a25e3 (diff) | |
| download | hurrycurry-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.rs | 27 |
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 |