summaryrefslogtreecommitdiff
path: root/server/src/entity
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-08-10 20:57:06 +0200
committermetamuffin <metamuffin@disroot.org>2024-08-10 20:57:06 +0200
commit7dbb34febaf75572f99fee459a77cf917de05d8f (patch)
tree72ba067aa5003d110f2bb707fb3e9c429388505b /server/src/entity
parent3d13c85ec2e3acbee249b4baf20797cc38a8a121 (diff)
downloadhurrycurry-7dbb34febaf75572f99fee459a77cf917de05d8f.tar
hurrycurry-7dbb34febaf75572f99fee459a77cf917de05d8f.tar.bz2
hurrycurry-7dbb34febaf75572f99fee459a77cf917de05d8f.tar.zst
Change protocol and server to allow multiple players per connection (untested)
Diffstat (limited to 'server/src/entity')
-rw-r--r--server/src/entity/customers/mod.rs129
1 files changed, 61 insertions, 68 deletions
diff --git a/server/src/entity/customers/mod.rs b/server/src/entity/customers/mod.rs
index b5b9fa42..e6067110 100644
--- a/server/src/entity/customers/mod.rs
+++ b/server/src/entity/customers/mod.rs
@@ -31,7 +31,7 @@ use std::collections::{HashMap, VecDeque};
#[derive(Debug, Clone)]
pub struct Customers {
demands: Vec<Demand>,
- cpackets: VecDeque<(PlayerID, PacketS)>,
+ cpackets: VecDeque<PacketS>,
chairs: HashMap<IVec2, bool>,
customer_id_counter: PlayerID,
customers: HashMap<PlayerID, CustomerState>,
@@ -84,13 +84,10 @@ impl EntityT for Customers {
self.spawn_cooldown = 10. + random::<f32>() * 10.;
self.customer_id_counter.0 -= 1;
let id = self.customer_id_counter;
- self.cpackets.push_back((
- id,
- PacketS::Join {
- name: faker::name::fr_fr::Name().fake(),
- character: -1 - (random::<u16>() as i32),
- },
- ));
+ self.cpackets.push_back(PacketS::Join {
+ name: faker::name::fr_fr::Name().fake(),
+ character: -1 - (random::<u16>() as i32),
+ });
let chair = self.select_chair().ok_or(anyhow!("no free chair found"))?;
let from = game.data.customer_spawn.as_ivec2();
let path = find_path(&game.walkable, from, chair)
@@ -100,24 +97,22 @@ impl EntityT for Customers {
.insert(id, CustomerState::Entering { path, chair });
}
let mut customers_to_remove = Vec::new();
- for (&id, state) in &mut self.customers {
- let Some(player) = game.players.get_mut(&id) else {
+ for (&player, state) in &mut self.customers {
+ let Some(playerdata) = game.players.get_mut(&player) else {
continue;
};
match state {
CustomerState::Entering { path, chair } => {
- player.direction = path.next_direction(player.position());
+ playerdata.direction = path.next_direction(playerdata.position());
if path.is_done() {
let demand = DemandIndex(random::<usize>() % self.demands.len());
- self.cpackets.push_back((
- id,
- PacketS::Communicate {
- message: Some(Message::Item(self.demands[demand.0].from)),
- persist: true,
- },
- ));
- info!("{id:?} -> waiting");
+ self.cpackets.push_back(PacketS::Communicate {
+ message: Some(Message::Item(self.demands[demand.0].from)),
+ persist: true,
+ player,
+ });
+ info!("{player:?} -> waiting");
*state = CustomerState::Waiting {
chair: *chair,
timeout: 90. + random::<f32>() * 60.,
@@ -130,26 +125,22 @@ impl EntityT for Customers {
demand,
timeout,
} => {
- player.direction = (chair.as_vec2() + 0.5) - player.position();
+ playerdata.direction = (chair.as_vec2() + 0.5) - playerdata.position();
*timeout -= dt;
if *timeout <= 0. {
- self.cpackets.push_back((
- id,
- PacketS::Communicate {
- message: None,
- persist: true,
- },
- ));
- self.cpackets.push_back((
- id,
- PacketS::Communicate {
- message: Some(Message::Effect("angry".to_string())),
- persist: false,
- },
- ));
+ self.cpackets.push_back(PacketS::Communicate {
+ message: None,
+ persist: true,
+ player,
+ });
+ self.cpackets.push_back(PacketS::Communicate {
+ message: Some(Message::Effect("angry".to_string())),
+ persist: false,
+ player,
+ });
let path = find_path(
&game.walkable,
- player.position().as_ivec2(),
+ playerdata.position().as_ivec2(),
game.data.customer_spawn.as_ivec2(),
)
.expect("no path to exit");
@@ -157,7 +148,7 @@ impl EntityT for Customers {
game.score.demands_failed += 1;
game.score.points -= 1;
game.score_changed = true;
- info!("{id:?} -> exiting");
+ info!("{player:?} -> exiting");
*state = CustomerState::Exiting { path }
} else {
let demand_data = &self.demands[demand.0];
@@ -182,25 +173,23 @@ impl EntityT for Customers {
}
});
if let Some(pos) = demand_pos {
- self.cpackets.push_back((
- id,
- PacketS::Communicate {
- persist: true,
- message: None,
- },
- ));
- self.cpackets.push_back((
- id,
- PacketS::Communicate {
- message: Some(Message::Effect("satisfied".to_string())),
- persist: false,
- },
- ));
- self.cpackets
- .push_back((id, PacketS::Interact { pos: Some(pos) }));
+ self.cpackets.push_back(PacketS::Communicate {
+ persist: true,
+ message: None,
+ player,
+ });
+ self.cpackets.push_back(PacketS::Communicate {
+ message: Some(Message::Effect("satisfied".to_string())),
+ persist: false,
+ player,
+ });
+ self.cpackets.push_back(PacketS::Interact {
+ pos: Some(pos),
+ player,
+ });
self.cpackets
- .push_back((id, PacketS::Interact { pos: None }));
- info!("{id:?} -> eating");
+ .push_back(PacketS::Interact { pos: None, player });
+ info!("{player:?} -> eating");
*state = CustomerState::Eating {
demand: *demand,
target: pos,
@@ -216,21 +205,25 @@ impl EntityT for Customers {
progress,
chair,
} => {
- player.direction = (chair.as_vec2() + 0.5) - player.position();
+ playerdata.direction = (chair.as_vec2() + 0.5) - playerdata.position();
let demand = &self.demands[demand.0];
*progress += dt / demand.duration;
if *progress >= 1. {
- self.cpackets
- .push_back((id, PacketS::ReplaceHand { item: demand.to }));
+ self.cpackets.push_back(PacketS::ReplaceHand {
+ player,
+ item: demand.to,
+ });
if demand.to.is_some() {
+ self.cpackets.push_back(PacketS::Interact {
+ player,
+ pos: Some(*target),
+ });
self.cpackets
- .push_back((id, PacketS::Interact { pos: Some(*target) }));
- self.cpackets
- .push_back((id, PacketS::Interact { pos: None }));
+ .push_back(PacketS::Interact { player, pos: None });
}
let path = find_path(
&game.walkable,
- player.position().as_ivec2(),
+ playerdata.position().as_ivec2(),
game.data.customer_spawn.as_ivec2(),
)
.ok_or(anyhow!("no path to exit"))?;
@@ -238,16 +231,16 @@ impl EntityT for Customers {
game.score.demands_completed += 1;
game.score.points += demand.points;
game.score_changed = true;
- info!("{id:?} -> exiting");
+ info!("{player:?} -> exiting");
*state = CustomerState::Exiting { path }
}
}
CustomerState::Exiting { path } => {
- player.direction = path.next_direction(player.position());
+ playerdata.direction = path.next_direction(playerdata.position());
if path.is_done() {
- info!("{id:?} -> leave");
- self.cpackets.push_back((id, PacketS::Leave));
- customers_to_remove.push(id);
+ info!("{player:?} -> leave");
+ self.cpackets.push_back(PacketS::Leave { player });
+ customers_to_remove.push(player);
}
}
}
@@ -255,8 +248,8 @@ impl EntityT for Customers {
for c in customers_to_remove {
self.customers.remove(&c).unwrap();
}
- for (player, packet) in self.cpackets.drain(..) {
- if let Err(err) = game.packet_in(player, packet, &mut vec![], packet_out) {
+ for packet in self.cpackets.drain(..) {
+ if let Err(err) = game.packet_in(packet, &mut vec![], packet_out) {
warn!("demand packet {err}");
}
}