diff options
| author | metamuffin <metamuffin@disroot.org> | 2024-09-24 00:38:16 +0200 | 
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2024-09-24 00:38:46 +0200 | 
| commit | e00492214438711c3af7fcad75505539d41e2285 (patch) | |
| tree | faf8d44a5282846b537ed347b2f839607aa9df89 /server | |
| parent | f1f0ae07172c24deb5815f8ee7926018db6d7dbc (diff) | |
| download | hurrycurry-e00492214438711c3af7fcad75505539d41e2285.tar hurrycurry-e00492214438711c3af7fcad75505539d41e2285.tar.bz2 hurrycurry-e00492214438711c3af7fcad75505539d41e2285.tar.zst | |
pinned orders
Diffstat (limited to 'server')
| -rw-r--r-- | server/bot/src/algos/customer.rs | 59 | ||||
| -rw-r--r-- | server/bot/src/algos/frank.rs | 1 | ||||
| -rw-r--r-- | server/protocol/src/lib.rs | 2 | ||||
| -rw-r--r-- | server/src/commands.rs | 7 | ||||
| -rw-r--r-- | server/src/interaction.rs | 3 | ||||
| -rw-r--r-- | server/src/server.rs | 4 | ||||
| -rw-r--r-- | server/src/state.rs | 1 | 
7 files changed, 60 insertions, 17 deletions
| diff --git a/server/bot/src/algos/customer.rs b/server/bot/src/algos/customer.rs index ec8f2283..e602addc 100644 --- a/server/bot/src/algos/customer.rs +++ b/server/bot/src/algos/customer.rs @@ -39,6 +39,8 @@ pub enum Customer {          chair: IVec2,          timeout: f32,          origin: IVec2, +        check: u8, +        pinned: bool,      },      Eating {          demand: DemandIndex, @@ -104,12 +106,15 @@ impl BotAlgo for Customer {                          timeout,                          demand,                          origin: *origin, +                        check: 0, +                        pinned: false,                      };                      BotInput {                          extra: vec![PacketS::Communicate {                              message: Some(Message::Item(game.data.demands[demand.0].input)),                              timeout: Some(timeout),                              player: me, +                            pin: Some(false),                          }],                          ..Default::default()                      } @@ -144,19 +149,23 @@ impl BotAlgo for Customer {                  demand,                  timeout,                  origin, +                check, +                pinned,              } => {                  *timeout -= dt; +                *check += 1;                  if *timeout <= 0. {                      let path = find_path(&game.walkable, pos.as_ivec2(), *origin)                          .expect("no path to exit");                      info!("{me:?} -> exiting");                      *self = Customer::Exiting { path }; -                    BotInput { +                    return BotInput {                          extra: vec![                              PacketS::Communicate {                                  message: None,                                  timeout: Some(0.),                                  player: me, +                                pin: Some(false),                              },                              PacketS::ApplyScore(Score {                                  points: -1, @@ -169,9 +178,32 @@ impl BotAlgo for Customer {                              },                          ],                          ..Default::default() -                    } -                } else { +                    }; +                } else if *check > 10 {                      let demand_data = &game.data.demands[demand.0]; +                    *check = 0; + +                    if !*pinned { +                        let mut pin = false; +                        game.players_spatial_index.query(pos, 3., |pid, _| { +                            if game.players.get(&pid).map_or(false, |p| p.character >= 0) { +                                pin = true +                            } +                        }); +                        if pin { +                            *pinned = true; +                            return BotInput { +                                extra: vec![PacketS::Communicate { +                                    player: me, +                                    message: Some(Message::Item(demand_data.input)), +                                    timeout: Some(*timeout), +                                    pin: Some(true), +                                }], +                                ..Default::default() +                            }; +                        } +                    } +                      let demand_pos = [IVec2::NEG_X, IVec2::NEG_Y, IVec2::X, IVec2::Y]                          .into_iter()                          .find_map(|off| { @@ -201,12 +233,19 @@ impl BotAlgo for Customer {                              chair: *chair,                              origin: *origin,                          }; -                        BotInput { +                        return BotInput {                              extra: vec![                                  PacketS::Communicate {                                      message: None,                                      timeout: Some(0.),                                      player: me, +                                    pin: Some(false), +                                }, +                                PacketS::Communicate { +                                    message: None, +                                    timeout: Some(0.), +                                    player: me, +                                    pin: Some(true),                                  },                                  PacketS::Effect {                                      name: "satisfied".to_string(), @@ -222,15 +261,15 @@ impl BotAlgo for Customer {                                  },                              ],                              ..Default::default() -                        } -                    } else { -                        BotInput { -                            direction: (chair.as_vec2() + 0.5) - pos, -                            ..Default::default() -                        } +                        };                      }                  } +                BotInput { +                    direction: (chair.as_vec2() + 0.5) - pos, +                    ..Default::default() +                }              } +              Customer::Eating {                  demand,                  target, diff --git a/server/bot/src/algos/frank.rs b/server/bot/src/algos/frank.rs index 95718d4c..854c73bb 100644 --- a/server/bot/src/algos/frank.rs +++ b/server/bot/src/algos/frank.rs @@ -84,6 +84,7 @@ impl BotAlgo for Frank {                                      player: me,                                      message: Some(Message::Text(message)),                                      timeout: Some(3.), +                                    pin: Some(false),                                  }],                                  ..Default::default()                              }; diff --git a/server/protocol/src/lib.rs b/server/protocol/src/lib.rs index b826edae..0203107d 100644 --- a/server/protocol/src/lib.rs +++ b/server/protocol/src/lib.rs @@ -118,6 +118,7 @@ pub enum PacketS {          player: PlayerID,          message: Option<Message>,          timeout: Option<f32>, +        pin: Option<bool>,      },      /// For use in replay sessions only @@ -266,6 +267,7 @@ pub enum Menu {  pub struct MessageTimeout {      pub remaining: f32,      pub initial: f32, +    pub pinned: bool,  }  #[derive(Debug, Clone, Serialize, Deserialize, Encode, Decode, Default)] diff --git a/server/src/commands.rs b/server/src/commands.rs index c03c8bcd..6fd95eac 100644 --- a/server/src/commands.rs +++ b/server/src/commands.rs @@ -23,7 +23,7 @@ use crate::{  use anyhow::{anyhow, bail, Result};  use clap::{Parser, ValueEnum};  use hurrycurry_bot::algos::ALGO_CONSTRUCTORS; -use hurrycurry_protocol::{Menu, Message, MessageTimeout, PacketC, PlayerID}; +use hurrycurry_protocol::{Menu, Message, PacketC, PlayerID};  use std::{fmt::Write, time::Duration};  #[derive(Parser)] @@ -294,10 +294,7 @@ impl Server {                          id: message_id,                          params: arguments.into_iter().map(|c| Message::Text(c)).collect(),                      }), -                    timeout: Some(MessageTimeout { -                        initial: 5., -                        remaining: 5., -                    }), +                    timeout: None,                  });              }          } diff --git a/server/src/interaction.rs b/server/src/interaction.rs index 7a8c2e9d..74d31cd8 100644 --- a/server/src/interaction.rs +++ b/server/src/interaction.rs @@ -15,13 +15,12 @@      along with this program.  If not, see <https://www.gnu.org/licenses/>.  */ +use crate::data::index::GamedataIndex;  use hurrycurry_client_lib::{Involvement, Item};  use hurrycurry_protocol::{Gamedata, ItemLocation, PacketC, PlayerID, Recipe, Score, TileIndex};  use log::info;  use std::collections::VecDeque; -use crate::data::index::GamedataIndex; -  #[allow(clippy::too_many_arguments)]  pub fn interact(      data: &Gamedata, diff --git a/server/src/server.rs b/server/src/server.rs index 06b6e5fd..0c3df634 100644 --- a/server/src/server.rs +++ b/server/src/server.rs @@ -528,8 +528,10 @@ impl Server {                  message,                  timeout,                  player, +                pin,              } => {                  info!("{player:?} message {message:?}"); +                let pin = pin.unwrap_or(false);                  if let Some(timeout) = timeout {                      if let Some(player) = self.game.players.get_mut(&player) {                          player.communicate_persist = message.clone().map(|m| { @@ -538,6 +540,7 @@ impl Server {                                  MessageTimeout {                                      initial: timeout,                                      remaining: timeout, +                                    pinned: pin,                                  },                              )                          }); @@ -549,6 +552,7 @@ impl Server {                      timeout: timeout.map(|t| MessageTimeout {                          initial: t,                          remaining: t, +                        pinned: pin,                      }),                  })              } diff --git a/server/src/state.rs b/server/src/state.rs index 9009d4a1..65e6dfd2 100644 --- a/server/src/state.rs +++ b/server/src/state.rs @@ -53,6 +53,7 @@ impl Server {                  message: Some(Message::Text(text)),                  timeout: None,                  player, +                ..              } if let Some(command) = text.strip_prefix("/") => {                  match self.handle_command_parse(*player, command).await {                      Ok(packets) => return Ok(packets), | 
