summaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
Diffstat (limited to 'server/src')
-rw-r--r--server/src/commands.rs3
-rw-r--r--server/src/entity/bot.rs11
-rw-r--r--server/src/entity/customers.rs4
-rw-r--r--server/src/main.rs3
-rw-r--r--server/src/server.rs41
5 files changed, 40 insertions, 22 deletions
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<DynBotAlgo>;
pub struct BotDriver<T> {
algo: T,
- join_data: Option<(String, i32)>,
+ join_data: Option<(String, i32, PlayerClass)>,
id: PlayerID,
interacting: bool,
left: bool,
}
impl<T: BotAlgo> BotDriver<T> {
- 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<T: BotAlgo + Any> Entity for BotDriver<T> {
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::<f32>() * 10.;
let bot = BotDriver::new(
"".to_string(),
- -1 - (random::<u16>() as i32),
+ random::<u16>() 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<PacketC>>,
);
@@ -105,11 +107,12 @@ impl GameServerExt for Game {
timer: Option<Duration>,
packet_out: &mut VecDeque<PacketC>,
) {
+ // 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::<HashMap<_, _>>();
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<PacketC>>,
) {
- 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()
}
}