summaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
Diffstat (limited to 'server/src')
-rw-r--r--server/src/server.rs33
-rw-r--r--server/src/state.rs6
2 files changed, 28 insertions, 11 deletions
diff --git a/server/src/server.rs b/server/src/server.rs
index 41931ef7..2f93246d 100644
--- a/server/src/server.rs
+++ b/server/src/server.rs
@@ -25,7 +25,7 @@ use hurrycurry_client_lib::{Game, Item, Player, Tile};
use hurrycurry_protocol::{
glam::{IVec2, Vec2},
movement::MovementBase,
- Gamedata, ItemLocation, Menu, PacketC, PacketS, PlayerID, Score, TileIndex,
+ Gamedata, ItemLocation, Menu, MessageTimeout, PacketC, PacketS, PlayerID, Score, TileIndex,
};
use log::{info, warn};
use std::{
@@ -177,11 +177,11 @@ impl GameServerExt for Game {
item: Some(item.kind),
})
}
- if let Some(c) = &player.communicate_persist {
+ if let Some((message, timeout)) = &player.communicate_persist {
out.push(PacketC::Communicate {
player: id,
- message: Some(c.to_owned()),
- persist: true,
+ message: Some(message.to_owned()),
+ timeout: Some(*timeout),
})
}
}
@@ -449,19 +449,30 @@ impl Server<'_> {
}
PacketS::Communicate {
message,
- persist,
+ timeout,
player,
} => {
info!("{player:?} message {message:?}");
- if persist {
+ if let Some(timeout) = timeout {
if let Some(player) = self.game.players.get_mut(&player) {
- player.communicate_persist = message.clone()
+ player.communicate_persist = message.clone().map(|m| {
+ (
+ m,
+ MessageTimeout {
+ initial: timeout,
+ remaining: timeout,
+ },
+ )
+ });
}
}
packet_out.push_back(PacketC::Communicate {
player,
message,
- persist,
+ timeout: timeout.map(|t| MessageTimeout {
+ initial: t,
+ remaining: t,
+ }),
})
}
PacketS::ReplaceHand { item, player } => {
@@ -595,6 +606,12 @@ impl Server<'_> {
let mut players_auto_release = Vec::new();
for (pid, player) in &mut self.game.players {
+ if let Some((_, timeout)) = &mut player.communicate_persist {
+ timeout.remaining -= dt;
+ if timeout.remaining < 0. {
+ player.communicate_persist = None;
+ }
+ }
if let Some(pos) = player.interacting {
if let Some(tile) = self.game.tiles.get(&pos) {
if let Some(item) = &tile.item {
diff --git a/server/src/state.rs b/server/src/state.rs
index 54beb3f7..f6304db5 100644
--- a/server/src/state.rs
+++ b/server/src/state.rs
@@ -148,7 +148,7 @@ impl State {
match &packet {
PacketS::Communicate {
message: Some(Message::Text(text)),
- persist: false,
+ timeout: None,
player,
} if let Some(command) = text.strip_prefix("/") => {
match self.handle_command_parse(*player, command).await {
@@ -288,7 +288,7 @@ impl State {
.send(PacketC::Communicate {
player,
message: Some(Message::Effect(name)),
- persist: false,
+ timeout: None,
})
.ok();
}
@@ -302,7 +302,7 @@ impl State {
.send(PacketC::Communicate {
player,
message: Some(Message::Item(item)),
- persist: false,
+ timeout: None,
})
.ok();
}