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 | |
| 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')
| -rw-r--r-- | server/src/server.rs | 27 | ||||
| -rw-r--r-- | server/src/state.rs | 3 |
2 files changed, 18 insertions, 12 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 diff --git a/server/src/state.rs b/server/src/state.rs index c9b7e8d4..1bddf33c 100644 --- a/server/src/state.rs +++ b/server/src/state.rs @@ -48,10 +48,11 @@ impl Server { } } for cid in keepalive_kick { - warn!("{cid} Client did not send keepalive in time"); + info!("{cid} Client did not send keepalive in time"); self.disconnect(cid, Some(trm!("s.disconnect_reason.keepalive_timer"))); } for (cid, pid) in inactivity_kick { + info!("{cid} Removing {pid} because of inactivity"); if let Some(conn) = self.connections.get(&cid) { let _ = conn.replies.try_send(PacketC::ServerMessage { message: trm!("s.leave_inactivity"), |