From 9587d6b4d4389f6108e2be0ff5c0f4a495ff842d Mon Sep 17 00:00:00 2001 From: metamuffin Date: Wed, 25 Sep 2024 15:30:09 +0200 Subject: player class decoupled from character id --- server/src/commands.rs | 3 ++- server/src/entity/bot.rs | 11 ++++++----- server/src/entity/customers.rs | 4 +++- server/src/main.rs | 3 ++- server/src/server.rs | 41 +++++++++++++++++++++++++++-------------- 5 files changed, 40 insertions(+), 22 deletions(-) (limited to 'server/src') diff --git a/server/src/commands.rs b/server/src/commands.rs index 9d34c28c..06659161 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, PacketC, PlayerID}; +use hurrycurry_protocol::{Menu, Message, PacketC, PlayerClass, PlayerID}; use std::{fmt::Write, time::Duration}; #[derive(Parser)] @@ -218,6 +218,7 @@ impl Server { self.entities.push(Box::new(BotDriver::new( format!("{}-bot", name.unwrap_or((*aname).to_owned())), 51, + PlayerClass::Bot, algo, ))); } diff --git a/server/src/entity/bot.rs b/server/src/entity/bot.rs index cd505c4f..fe4d711f 100644 --- a/server/src/entity/bot.rs +++ b/server/src/entity/bot.rs @@ -18,7 +18,7 @@ use super::{Entity, EntityContext}; use anyhow::Result; use hurrycurry_bot::{BotAlgo, DynBotAlgo}; -use hurrycurry_protocol::{PacketS, PlayerID}; +use hurrycurry_protocol::{PacketS, PlayerClass, PlayerID}; use log::info; use rand::random; use std::any::Any; @@ -27,19 +27,19 @@ pub type DynBotDriver = BotDriver; pub struct BotDriver { algo: T, - join_data: Option<(String, i32)>, + join_data: Option<(String, i32, PlayerClass)>, id: PlayerID, interacting: bool, left: bool, } impl BotDriver { - pub fn new(name: String, character: i32, algo: T) -> Self { + pub fn new(name: String, character: i32, class: PlayerClass, algo: T) -> Self { Self { algo, id: PlayerID(0), interacting: false, - join_data: Some((name, character)), + join_data: Some((name, character, class)), left: false, } } @@ -49,13 +49,14 @@ impl Entity for BotDriver { self.left } fn tick(&mut self, c: EntityContext<'_>) -> Result<()> { - if let Some((name, character)) = self.join_data.take() { + if let Some((name, character, class)) = self.join_data.take() { self.id = PlayerID(random()); // TODO bad code, can collide info!("spawn {:?} ({name:?}, {character})", self.id); c.packet_in.push_back(PacketS::Join { name, character, id: Some(self.id), + class, }) } diff --git a/server/src/entity/customers.rs b/server/src/entity/customers.rs index aaf6995f..388f7b26 100644 --- a/server/src/entity/customers.rs +++ b/server/src/entity/customers.rs @@ -18,6 +18,7 @@ use super::{bot::BotDriver, Entity, EntityContext}; use anyhow::Result; use hurrycurry_bot::algos::Customer; +use hurrycurry_protocol::PlayerClass; use rand::random; pub struct Customers { @@ -53,7 +54,8 @@ impl Entity for Customers { self.spawn_cooldown = 10. + random::() * 10.; let bot = BotDriver::new( "".to_string(), - -1 - (random::() as i32), + random::() as i32, + PlayerClass::Customer, Customer::default(), ); self.customers.push(bot) diff --git a/server/src/main.rs b/server/src/main.rs index b72a961b..23c14e60 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -300,7 +300,7 @@ async fn run(args: Args) -> anyhow::Result<()> { #[cfg(test)] mod test { - use hurrycurry_protocol::{PacketS, PlayerID}; + use hurrycurry_protocol::{PacketS, PlayerClass, PlayerID}; use hurrycurry_server::{data::DATA_DIR, server::Server, ConnectionID}; use std::future::Future; use tokio::sync::broadcast; @@ -357,6 +357,7 @@ mod test { PacketS::Join { name: format!("test {conn}"), character: 1, + class: PlayerClass::Chef, id: None, }, ) diff --git a/server/src/server.rs b/server/src/server.rs index 5d31bd58..d44a949b 100644 --- a/server/src/server.rs +++ b/server/src/server.rs @@ -28,7 +28,8 @@ use hurrycurry_client_lib::{Game, Involvement, Item, Player, Tile}; use hurrycurry_protocol::{ glam::{IVec2, Vec2}, movement::MovementBase, - Gamedata, ItemLocation, Menu, MessageTimeout, PacketC, PacketS, PlayerID, Score, TileIndex, + Gamedata, ItemLocation, Menu, MessageTimeout, PacketC, PacketS, PlayerClass, PlayerID, Score, + TileIndex, }; use log::{info, warn}; use rand::random; @@ -71,6 +72,7 @@ pub trait GameServerExt { id: PlayerID, name: String, character: i32, + class: PlayerClass, serverdata: &Serverdata, packet_out: Option<&mut VecDeque>, ); @@ -105,11 +107,12 @@ impl GameServerExt for Game { timer: Option, packet_out: &mut VecDeque, ) { + // TODO cleanup let players = self .players .iter() - .filter(|(_, p)| p.character >= 0) - .map(|(id, p)| (*id, (p.name.to_owned(), p.character))) + .filter(|(_, p)| p.class == PlayerClass::Chef) + .map(|(id, p)| (*id, (p.name.to_owned(), p.character, p.class))) .collect::>(); self.unload(packet_out); @@ -137,8 +140,8 @@ impl GameServerExt for Game { self.walkable.insert(p); } } - for (id, (name, character)) in players { - self.join_player(id, name, character, serverdata, None); + for (id, (name, character, class)) in players { + self.join_player(id, name, character, class, serverdata, None); } packet_out.extend(self.prime_client()); @@ -155,6 +158,7 @@ impl GameServerExt for Game { for (&id, player) in &self.players { out.push(PacketC::AddPlayer { id, + class: player.class, position: player.movement.position, character: player.character, name: player.name.clone(), @@ -236,19 +240,20 @@ impl GameServerExt for Game { id: PlayerID, name: String, character: i32, + class: PlayerClass, serverdata: &Serverdata, packet_out: Option<&mut VecDeque>, ) { - let position = if character < 0 { - serverdata.customer_spawn - } else { - serverdata.chef_spawn + let position = match class { + PlayerClass::Customer => serverdata.customer_spawn, + PlayerClass::Bot | PlayerClass::Chef => serverdata.chef_spawn, } + (Vec2::new(random(), random()) - 0.5); self.players.insert( id, Player { item: None, character, + class, movement: MovementBase::new(position), communicate_persist: None, interacting: None, @@ -260,6 +265,7 @@ impl GameServerExt for Game { packet_out.push_back(PacketC::AddPlayer { id, name, + class, position, character, }); @@ -357,14 +363,21 @@ impl Server { name, character, id, + class, } => { let id = id.unwrap_or_else(|| { let id = self.player_id_counter; self.player_id_counter.0 += 1; id }); - self.game - .join_player(id, name, character, &self.data, Some(&mut self.packet_out)); + self.game.join_player( + id, + name, + character, + class, + &self.data, + Some(&mut self.packet_out), + ); replies.push(PacketC::Joined { id }) } PacketS::Leave { player } => { @@ -488,7 +501,7 @@ impl Server { .get_many_mut([&pid, &base_pid]) .ok_or(tre!("s.error.self_interact"))?; - if this.character < 0 || other.character < 0 { + if this.class == PlayerClass::Customer || other.class == PlayerClass::Customer { return Err(tre!("s.error.customer_interact")); } @@ -730,7 +743,7 @@ impl Server { self.game .players .values() - .filter(|m| m.character >= 0) + .filter(|m| m.class == PlayerClass::Chef) .map(|m| m.name.clone()) .collect(), self.game.score.clone(), @@ -748,7 +761,7 @@ impl Server { self.game .players .values() - .map(|p| if p.character >= 0 { 1 } else { 0 }) + .map(|p| if p.class == PlayerClass::Chef { 1 } else { 0 }) .sum() } } -- cgit v1.2.3-70-g09d2