summaryrefslogtreecommitdiff
path: root/server/src/server.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/server.rs')
-rw-r--r--server/src/server.rs40
1 files changed, 30 insertions, 10 deletions
diff --git a/server/src/server.rs b/server/src/server.rs
index faac080f..49d0b461 100644
--- a/server/src/server.rs
+++ b/server/src/server.rs
@@ -40,6 +40,7 @@ pub struct ServerState {
pub lobby: bool,
pub player_id_counter: PlayerID,
pub score_changed: bool,
+ pub packet_loopback: VecDeque<PacketS>,
}
pub struct Server<'a> {
@@ -218,6 +219,7 @@ impl ServerState {
entities: vec![],
player_id_counter: PlayerID(1),
score_changed: false,
+ packet_loopback: VecDeque::new(),
}
}
}
@@ -230,17 +232,25 @@ impl Server<'_> {
) {
self.game.load(gamedata, &serverdata, timer, packet_out);
self.state.data = serverdata.into();
+ for mut e in self.state.entities.drain(..) {
+ e.destructor(EntityContext {
+ game: self.game,
+ packet_out,
+ packet_in: &mut self.state.packet_loopback,
+ score_changed: &mut self.state.score_changed,
+ dt: 0.,
+ });
+ }
self.state.entities = entities;
}
pub fn join_player(
&mut self,
+ id: PlayerID,
name: String,
character: i32,
packet_out: &mut VecDeque<PacketC>,
- ) -> PlayerID {
- let id = self.state.player_id_counter;
- self.state.player_id_counter.0 += 1;
+ ) {
let position = if character < 0 {
self.state.data.customer_spawn
} else {
@@ -274,7 +284,6 @@ impl Server<'_> {
position,
character,
});
- id
}
pub fn packet_in(
@@ -284,8 +293,17 @@ impl Server<'_> {
packet_out: &mut VecDeque<PacketC>,
) -> Result<()> {
match packet {
- PacketS::Join { name, character } => {
- let id = self.join_player(name, character, packet_out);
+ PacketS::Join {
+ name,
+ character,
+ id,
+ } => {
+ let id = id.unwrap_or_else(|| {
+ let id = self.state.player_id_counter;
+ self.state.player_id_counter.0 += 1;
+ id
+ });
+ self.join_player(id, name, character, packet_out);
replies.push(PacketC::Joined { id })
}
PacketS::Leave { player } => {
@@ -586,20 +604,22 @@ impl Server<'_> {
);
}
- let mut packet_in = VecDeque::new();
for entity in self.state.entities.iter_mut() {
if let Err(e) = entity.tick(EntityContext {
game: self.game,
packet_out,
score_changed: &mut self.state.score_changed,
- packet_in: &mut packet_in,
+ packet_in: &mut self.state.packet_loopback,
dt,
}) {
warn!("entity tick failed: {e}")
}
}
- for p in packet_in.drain(..) {
- let _ = self.packet_in(p, &mut vec![], packet_out);
+
+ while let Some(p) = self.state.packet_loopback.pop_front() {
+ if let Err(e) = self.packet_in(p, &mut vec![], packet_out) {
+ warn!("internal packet errored: {e}");
+ }
}
let now = Instant::now();