From 4083df5cfe76e42506c5356cf23d3dc9f3b6e6bf Mon Sep 17 00:00:00 2001 From: metamuffin Date: Wed, 25 Dec 2024 19:37:20 +0100 Subject: variable hand count --- server/src/data/mod.rs | 1 + server/src/entity/bot.rs | 2 +- server/src/server.rs | 33 +++++++++++++++++++++------------ 3 files changed, 23 insertions(+), 13 deletions(-) (limited to 'server/src') diff --git a/server/src/data/mod.rs b/server/src/data/mod.rs index 57051fe9..15fdfa6b 100644 --- a/server/src/data/mod.rs +++ b/server/src/data/mod.rs @@ -314,6 +314,7 @@ pub fn build_data( item_names, demands, tile_names, + hand_count: 2, }, Serverdata { initial_map, diff --git a/server/src/entity/bot.rs b/server/src/entity/bot.rs index 368f8c9d..6e6c9162 100644 --- a/server/src/entity/bot.rs +++ b/server/src/entity/bot.rs @@ -72,7 +72,7 @@ impl Entity for BotDriver { c.packet_in.push_back(PacketS::Interact { player: self.id, pos: input.interact, - hand: Hand::Left, + hand: Hand(0), }) } c.packet_in.push_back(PacketS::Movement { diff --git a/server/src/server.rs b/server/src/server.rs index 19153864..0889cd71 100644 --- a/server/src/server.rs +++ b/server/src/server.rs @@ -164,10 +164,9 @@ impl GameServerExt for Game { name: player.name.clone(), }); for (i, item) in player.items.iter().enumerate() { - let hand = Hand::from_index(i); if let Some(item) = &item { out.push(PacketC::SetItem { - location: ItemLocation::Player(id, hand), + location: ItemLocation::Player(id, Hand(i)), item: Some(item.kind), }); if let Some(Involvement { @@ -180,7 +179,7 @@ impl GameServerExt for Game { { out.push(PacketC::SetProgress { player, - item: ItemLocation::Player(id, hand), + item: ItemLocation::Player(id, Hand(i)), position, speed, warn, @@ -255,7 +254,7 @@ impl GameServerExt for Game { self.players.insert( id, Player { - items: [const { None }; 2], + items: (0..self.data.hand_count).map(|_| None).collect(), character, class, movement: MovementBase::new(position), @@ -531,14 +530,17 @@ impl Server { return Err(tre!("s.error.customer_interact")); } + let this_hslot = this.items.get_mut(hand.0).ok_or(tre!("s.error.no_hand"))?; + let other_hslot = other.items.get_mut(hand.0).ok_or(tre!("s.error.no_hand"))?; + interact( &self.game.data, edge, None, Some(pid), - &mut this.items[hand.index()], + this_hslot, ItemLocation::Player(base_pid, hand), - &mut other.items[hand.index()], + other_hslot, ItemLocation::Player(pid, hand), &mut self.game.score, &mut self.score_changed, @@ -552,6 +554,11 @@ impl Server { .get_mut(&pid) .ok_or(tre!("s.error.no_player"))?; + let hslot = player + .items + .get_mut(hand.0) + .ok_or(tre!("s.error.no_hand"))?; + interact( &self.game.data, edge, @@ -559,7 +566,7 @@ impl Server { Some(pid), &mut tile.item, ItemLocation::Tile(pos), - &mut player.items[hand.index()], + hslot, ItemLocation::Player(pid, hand), &mut self.game.score, &mut self.score_changed, @@ -602,10 +609,12 @@ impl Server { } PacketS::ReplaceHand { item, player, hand } => { let pdata = self.game.players.get_mut(&player).ok_or(tre!(""))?; - pdata.items[hand.index()] = item.map(|i| Item { - kind: i, - active: None, - }); + if let Some(slot) = pdata.items.get_mut(hand.0) { + *slot = item.map(|i| Item { + kind: i, + active: None, + }); + } self.packet_out.push_back(PacketC::SetItem { location: ItemLocation::Player(player, hand), item, @@ -680,7 +689,7 @@ impl Server { &self.gamedata_index, None, item, - ItemLocation::Player(pid, Hand::from_index(i)), + ItemLocation::Player(pid, Hand(i)), &mut self.game.score, &mut self.score_changed, &mut self.packet_out, -- cgit v1.2.3-70-g09d2