diff options
-rw-r--r-- | Cargo.lock | 229 | ||||
-rw-r--r-- | Cargo.toml | 2 | ||||
-rw-r--r-- | client/game.gd | 7 | ||||
-rw-r--r-- | client/multiplayer.gd | 8 | ||||
-rw-r--r-- | server/Cargo.toml | 3 | ||||
-rw-r--r-- | server/examples/client.rs | 4 | ||||
-rw-r--r-- | server/protocol/Cargo.toml | 9 | ||||
-rw-r--r-- | server/protocol/src/lib.rs (renamed from server/src/protocol.rs) | 23 | ||||
-rw-r--r-- | server/replaytool/Cargo.toml | 18 | ||||
-rw-r--r-- | server/replaytool/src/main.rs | 153 | ||||
-rw-r--r-- | server/src/bin/graph.rs | 2 | ||||
-rw-r--r-- | server/src/customer/mod.rs | 8 | ||||
-rw-r--r-- | server/src/customer/movement.rs | 3 | ||||
-rw-r--r-- | server/src/customer/pathfinding.rs | 6 | ||||
-rw-r--r-- | server/src/data.rs | 6 | ||||
-rw-r--r-- | server/src/entity/conveyor.rs | 3 | ||||
-rw-r--r-- | server/src/entity/mod.rs | 4 | ||||
-rw-r--r-- | server/src/game.rs | 19 | ||||
-rw-r--r-- | server/src/interaction.rs | 2 | ||||
-rw-r--r-- | server/src/lib.rs | 1 | ||||
-rw-r--r-- | server/src/main.rs | 7 | ||||
-rw-r--r-- | server/src/state.rs | 7 |
22 files changed, 479 insertions, 45 deletions
@@ -188,6 +188,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" [[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] name = "cpufeatures" version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -258,6 +274,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] name = "fake" version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -268,12 +294,33 @@ dependencies = [ ] [[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + +[[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] name = "futures-core" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -395,6 +442,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] +name = "hurrycurry-protocol" +version = "0.1.0" +dependencies = [ + "glam", + "serde", +] + +[[package]] +name = "hurrycurry-replaytool" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap", + "env_logger", + "futures-util", + "hurrycurry-protocol", + "log", + "rand 0.9.0-alpha.1", + "serde", + "serde_json", + "tokio", + "tokio-tungstenite", +] + +[[package]] name = "hurrycurry-server" version = "0.2.0" dependencies = [ @@ -403,7 +475,7 @@ dependencies = [ "env_logger", "fake", "futures-util", - "glam", + "hurrycurry-protocol", "log", "pollster", "rand 0.9.0-alpha.1", @@ -444,6 +516,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] name = "lock_api" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -486,6 +564,23 @@ dependencies = [ ] [[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] name = "num_cpus" version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -505,6 +600,56 @@ dependencies = [ ] [[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "openssl" +version = "0.10.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] name = "parking_lot" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -540,6 +685,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] name = "pollster" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -675,18 +826,63 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] name = "ryu" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] +name = "security-framework" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] name = "serde" version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -799,6 +995,18 @@ dependencies = [ ] [[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] name = "thiserror" version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -849,6 +1057,16 @@ dependencies = [ ] [[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] name = "tokio-tungstenite" version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -856,7 +1074,9 @@ checksum = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd" dependencies = [ "futures-util", "log", + "native-tls", "tokio", + "tokio-native-tls", "tungstenite", ] @@ -872,6 +1092,7 @@ dependencies = [ "http", "httparse", "log", + "native-tls", "rand 0.8.5", "sha1", "thiserror", @@ -909,6 +1130,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1,3 +1,3 @@ [workspace] -members = ["server"] +members = ["server/replaytool", "server", "server/protocol"] resolver = "2" diff --git a/client/game.gd b/client/game.gd index 4e0bfe52..b6646407 100644 --- a/client/game.gd +++ b/client/game.gd @@ -33,6 +33,7 @@ var tile_collide: Array = [] var tile_interact: Array = [] var map_names: Array = [] var in_lobby := false +var is_replay := false var is_joined := false var join_sent := false @@ -53,6 +54,7 @@ func _ready(): if !Global.on_vulkan(): environment.environment.tonemap_exposure = 0.5 + mp.replay_start.connect(func(): is_replay = true) mp.connection_closed.connect(func(reason: String): Global.error_message = reason; get_parent().replace_menu("res://menu/error.tscn") @@ -249,11 +251,12 @@ func _process(delta): marker.position = Global.interpolate(marker.position, marker_target, delta * 30.) update_center() + if is_replay: mp.send_replay_tick(delta) + if Global.get_setting("debug_info"): debug_label.show() debug_label.text = "%d FPS" % Engine.get_frames_per_second() - else: - debug_label.hide() + else: debug_label.hide() func get_tile_collision(pos: Vector2i) -> bool: var t = map.get_tile_name(pos) diff --git a/client/multiplayer.gd b/client/multiplayer.gd index 8df00034..aa895b69 100644 --- a/client/multiplayer.gd +++ b/client/multiplayer.gd @@ -51,6 +51,7 @@ signal set_ingame(state: bool, lobby: bool) signal score(demands_failed: int, demands_completed: int, points: int, time_remaining: float) signal hide_score() signal server_message(text: String) +signal replay_start() signal connection_closed(reason: String) @@ -242,6 +243,7 @@ func handle_packet(bytes: PackedByteArray): "server_message": var text = decoded["text"] server_message.emit(text) + "replay_start": replay_start.emit() _: push_error("Unrecognized packet type: %s" % packet_type) @@ -279,6 +281,12 @@ func send_chat(message: String): } }) +func send_replay_tick(dt: float): + send_packet({ + "type": "replay_tick", + "dt": dt + }) + func send_leave(): send_packet({ "type": "leave", diff --git a/server/Cargo.toml b/server/Cargo.toml index 6b9037ac..da084855 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -5,7 +5,6 @@ edition = "2021" default-run = "hurrycurry-server" [dependencies] -glam = { version = "0.28.0", features = ["serde"] } log = "0.4.22" env_logger = "0.11.3" anyhow = "1.0.86" @@ -20,3 +19,5 @@ shlex = "1.3.0" clap = { version = "4.5.8", features = ["derive"] } fake = "2.9.2" pollster = "0.3.0" + +hurrycurry-protocol = { path = "protocol" } diff --git a/server/examples/client.rs b/server/examples/client.rs index 487c9738..70b1bb00 100644 --- a/server/examples/client.rs +++ b/server/examples/client.rs @@ -15,15 +15,13 @@ along with this program. If not, see <https://www.gnu.org/licenses/>. */ +use hurrycurry_protocol::{glam::Vec2, PacketC, PacketS}; use std::{ io::{stdin, BufRead, BufReader, Write}, net::TcpStream, thread, }; -use glam::Vec2; -use hurrycurry_server::protocol::{PacketC, PacketS}; - fn main() { let mut sock = TcpStream::connect("127.0.0.1:27031").unwrap(); diff --git a/server/protocol/Cargo.toml b/server/protocol/Cargo.toml new file mode 100644 index 00000000..8fc63121 --- /dev/null +++ b/server/protocol/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "hurrycurry-protocol" +version = "0.1.0" +edition = "2021" + +[dependencies] +serde = { version = "1.0.204", features = ["derive"] } +glam = { version = "0.28.0", features = ["serde"] } + diff --git a/server/src/protocol.rs b/server/protocol/src/lib.rs index fc8abda4..36a496a0 100644 --- a/server/src/protocol.rs +++ b/server/protocol/src/lib.rs @@ -15,9 +15,11 @@ along with this program. If not, see <https://www.gnu.org/licenses/>. */ -use crate::data::Gamedata; use glam::{IVec2, Vec2}; use serde::{Deserialize, Serialize}; +use std::collections::HashSet; + +pub use glam; #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)] #[serde(transparent)] @@ -36,6 +38,16 @@ pub struct RecipeIndex(pub usize); #[serde(transparent)] pub struct DemandIndex(pub usize); +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[rustfmt::skip] +pub struct ClientGamedata { + pub item_names: Vec<String>, + pub tile_names: Vec<String>, + pub tile_collide: Vec<bool>, + pub tile_interact: Vec<bool>, + pub map_names: HashSet<String>, +} + #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "snake_case", tag = "type")] pub enum PacketS { @@ -67,6 +79,10 @@ pub enum PacketS { ReplaceHand { item: Option<ItemIndex>, }, + /// For use in replay sessions only + ReplayTick { + dt: f64, + }, } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -84,7 +100,7 @@ pub enum PacketC { id: PlayerID, }, Data { - data: Gamedata, + data: ClientGamedata, }, AddPlayer { id: PlayerID, @@ -144,6 +160,9 @@ pub enum PacketC { Error { message: String, }, + + /// For use in replay sessions only + ReplayStart, } #[derive(Debug, Clone, Serialize, Deserialize, Copy)] diff --git a/server/replaytool/Cargo.toml b/server/replaytool/Cargo.toml new file mode 100644 index 00000000..e6c1cc23 --- /dev/null +++ b/server/replaytool/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "hurrycurry-replaytool" +version = "0.1.0" +edition = "2021" + +[dependencies] +log = "0.4.22" +env_logger = "0.11.3" +anyhow = "1.0.86" +serde = { version = "1.0.204", features = ["derive"] } +tokio = { version = "1.38.0", features = ["full"] } +serde_json = "1.0.120" +tokio-tungstenite = { version = "0.23.1", features = ["native-tls"] } +futures-util = "0.3.30" +rand = "0.9.0-alpha.1" +clap = { version = "4.5.8", features = ["derive"] } + +hurrycurry-protocol = { path = "../protocol" } diff --git a/server/replaytool/src/main.rs b/server/replaytool/src/main.rs new file mode 100644 index 00000000..eae75676 --- /dev/null +++ b/server/replaytool/src/main.rs @@ -0,0 +1,153 @@ +/* + Hurry Curry! - a game about cooking + Copyright 2024 metamuffin + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, version 3 of the License only. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. + +*/ +use anyhow::anyhow; +use clap::Parser; +use futures_util::{SinkExt, StreamExt}; +use hurrycurry_protocol::{PacketC, PacketS}; +use log::{debug, info, warn, LevelFilter}; +use serde::{Deserialize, Serialize}; +use std::{path::PathBuf, time::Instant}; +use tokio::{ + fs::File, + io::{AsyncBufReadExt, AsyncWriteExt, BufReader, BufWriter}, + net::TcpListener, +}; +use tokio_tungstenite::tungstenite::Message; + +#[derive(Parser)] +enum Args { + Record { url: String, output: PathBuf }, + Replay { input: PathBuf }, +} + +#[derive(Serialize, Deserialize)] +struct Event { + ts: f64, + packet: PacketC, +} + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + env_logger::builder() + .filter_level(LevelFilter::Info) + .parse_env("LOG") + .init(); + + let args = Args::parse(); + + match args { + Args::Record { url, output } => { + let mut file = BufWriter::new(File::create(&output).await?); + info!("connecting to {url:?}..."); + let (mut sock, _) = tokio_tungstenite::connect_async(url).await?; + info!("starting recording."); + let start = Instant::now(); + + while let Some(Ok(message)) = sock.next().await { + match message { + Message::Text(line) => { + let packet: PacketC = match serde_json::from_str(&line) { + Ok(p) => p, + Err(e) => { + warn!("invalid packet: {e}"); + break; + } + }; + debug!("<- {packet:?}"); + file.write_all( + format!( + "{}\n", + serde_json::to_string(&Event { + ts: start.elapsed().as_secs_f64(), + packet: packet + }) + .unwrap() + ) + .as_bytes(), + ) + .await? + } + Message::Close(_) => break, + _ => (), + } + } + } + Args::Replay { input } => { + let ws_listener = TcpListener::bind("0.0.0.0:27032").await?; + info!("listening for websockets on {}", ws_listener.local_addr()?); + + loop { + let mut file = BufReader::new(File::open(&input).await?).lines(); + let mut next_event = + serde_json::from_str::<Event>(&file.next_line().await?.ok_or(anyhow!("eof"))?)?; + let mut time = 0.; + + info!("ready"); + let (sock, addr) = ws_listener.accept().await?; + let Ok(mut sock) = tokio_tungstenite::accept_async(sock).await else { + warn!("invalid ws handshake"); + continue; + }; + info!("{addr} connected via ws"); + + sock.send(tokio_tungstenite::tungstenite::Message::Text( + serde_json::to_string(&PacketC::ReplayStart).unwrap(), + )) + .await?; + while let Some(Ok(message)) = sock.next().await { + match message { + Message::Text(line) => { + let packet: PacketS = match serde_json::from_str(&line) { + Ok(p) => p, + Err(e) => { + warn!("invalid packet: {e}"); + break; + } + }; + debug!("<- {packet:?}"); + + match packet { + PacketS::ReplayTick { dt } => { + time += dt; + while next_event.ts < time { + debug!("<- {:?}", next_event.packet); + sock.send(tokio_tungstenite::tungstenite::Message::Text( + serde_json::to_string(&next_event.packet).unwrap(), + )) + .await?; + + let Some(next) = &file.next_line().await? else { + info!("reached end"); + break; + }; + next_event = serde_json::from_str::<Event>(next)?; + } + } + _ => (), + } + } + Message::Close(_) => break, + _ => (), + } + } + info!("{addr} left"); + } + } + } + Ok(()) +} diff --git a/server/src/bin/graph.rs b/server/src/bin/graph.rs index ace1b676..888119aa 100644 --- a/server/src/bin/graph.rs +++ b/server/src/bin/graph.rs @@ -16,10 +16,10 @@ */ use anyhow::{anyhow, Result}; +use hurrycurry_protocol::{ItemIndex, RecipeIndex}; use hurrycurry_server::{ data::{DataIndex, Demand}, interaction::Recipe, - protocol::{ItemIndex, RecipeIndex}, }; #[tokio::main] diff --git a/server/src/customer/mod.rs b/server/src/customer/mod.rs index 191f9e3b..10788206 100644 --- a/server/src/customer/mod.rs +++ b/server/src/customer/mod.rs @@ -18,14 +18,10 @@ pub mod movement; mod pathfinding; -use crate::{ - data::Gamedata, - game::Tile, - protocol::{DemandIndex, Message, PacketS, PlayerID}, -}; +use crate::{data::Gamedata, game::Tile}; use anyhow::{anyhow, Result}; use fake::{faker, Fake}; -use glam::IVec2; +use hurrycurry_protocol::{glam::IVec2, DemandIndex, Message, PacketS, PlayerID}; use log::debug; use movement::MovementBase; use pathfinding::{find_path, Path}; diff --git a/server/src/customer/movement.rs b/server/src/customer/movement.rs index ca7afdbe..34ed5b16 100644 --- a/server/src/customer/movement.rs +++ b/server/src/customer/movement.rs @@ -16,8 +16,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>. */ -use crate::protocol::PacketS; -use glam::{IVec2, Vec2}; +use hurrycurry_protocol::{glam::{IVec2, Vec2}, PacketS}; use std::collections::HashSet; const PLAYER_SIZE: f32 = 0.4; diff --git a/server/src/customer/pathfinding.rs b/server/src/customer/pathfinding.rs index 743515b9..29ee4e00 100644 --- a/server/src/customer/pathfinding.rs +++ b/server/src/customer/pathfinding.rs @@ -16,8 +16,10 @@ */ use super::movement::MovementBase; -use crate::protocol::PacketS; -use glam::{IVec2, Vec2}; +use hurrycurry_protocol::{ + glam::{IVec2, Vec2}, + PacketS, +}; use log::debug; use std::{ cmp::Ordering, diff --git a/server/src/data.rs b/server/src/data.rs index bca7f543..9fd3e95c 100644 --- a/server/src/data.rs +++ b/server/src/data.rs @@ -19,10 +19,12 @@ use crate::{ entity::{construct_entity, Entity, EntityDecl}, interaction::Recipe, - protocol::{DemandIndex, ItemIndex, RecipeIndex, TileIndex}, }; use anyhow::{anyhow, bail, Result}; -use glam::{IVec2, Vec2}; +use hurrycurry_protocol::{ + glam::{IVec2, Vec2}, + DemandIndex, ItemIndex, RecipeIndex, TileIndex, +}; use serde::{Deserialize, Serialize}; use std::{ collections::{HashMap, HashSet}, diff --git a/server/src/entity/conveyor.rs b/server/src/entity/conveyor.rs index 0a73b55c..4d11ffe1 100644 --- a/server/src/entity/conveyor.rs +++ b/server/src/entity/conveyor.rs @@ -19,10 +19,9 @@ use super::EntityT; use crate::{ data::Gamedata, game::{interact_effect, Tile}, - protocol::{ItemLocation, PacketC}, }; use anyhow::{anyhow, Result}; -use glam::IVec2; +use hurrycurry_protocol::{glam::IVec2, ItemLocation, PacketC}; use std::collections::{HashMap, VecDeque}; #[derive(Debug, Default, Clone)] diff --git a/server/src/entity/mod.rs b/server/src/entity/mod.rs index 5cb3ed0f..925ed5f4 100644 --- a/server/src/entity/mod.rs +++ b/server/src/entity/mod.rs @@ -16,10 +16,10 @@ */ pub mod conveyor; -use crate::{data::Gamedata, game::Tile, protocol::PacketC}; +use crate::{data::Gamedata, game::Tile}; use anyhow::{anyhow, Result}; use conveyor::Conveyor; -use glam::IVec2; +use hurrycurry_protocol::{glam::IVec2, PacketC}; use serde::{Deserialize, Serialize}; use std::collections::{HashMap, VecDeque}; diff --git a/server/src/game.rs b/server/src/game.rs index 851d485c..32fb7ac9 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -20,16 +20,16 @@ use crate::{ data::Gamedata, entity::{Entity, EntityT}, interaction::{interact, tick_slot, InteractEffect, TickEffect}, - protocol::{ - ItemIndex, ItemLocation, Message, PacketC, PacketS, PlayerID, RecipeIndex, TileIndex, - }, }; use anyhow::{anyhow, bail, Result}; -use glam::{IVec2, Vec2}; +use hurrycurry_protocol::{ + glam::{IVec2, Vec2}, + ClientGamedata, ItemIndex, ItemLocation, Message, PacketC, PacketS, PlayerID, RecipeIndex, + TileIndex, +}; use log::{info, warn}; use std::{ collections::{HashMap, VecDeque}, - ops::Deref, sync::Arc, time::{Duration, Instant}, }; @@ -164,7 +164,13 @@ impl Game { pub fn prime_client(&self) -> Vec<PacketC> { let mut out = Vec::new(); out.push(PacketC::Data { - data: self.data.deref().to_owned(), + data: ClientGamedata { + item_names: self.data.item_names.clone(), + tile_names: self.data.tile_names.clone(), + tile_collide: self.data.tile_collide.clone(), + tile_interact: self.data.tile_interact.clone(), + map_names: self.data.map_names.clone(), + }, }); for (&id, player) in &self.players { out.push(PacketC::AddPlayer { @@ -408,6 +414,7 @@ impl Game { item, }) } + PacketS::ReplayTick { .. } => bail!("packet not supported in this session"), } if self.points != points_before { diff --git a/server/src/interaction.rs b/server/src/interaction.rs index 25b96813..b3f6af8c 100644 --- a/server/src/interaction.rs +++ b/server/src/interaction.rs @@ -18,8 +18,8 @@ use crate::{ data::Gamedata, game::{Involvement, Item}, - protocol::{ItemIndex, TileIndex}, }; +use hurrycurry_protocol::{ItemIndex, TileIndex}; use log::info; use serde::{Deserialize, Serialize}; diff --git a/server/src/lib.rs b/server/src/lib.rs index a6d29c03..6d0d4e26 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -21,5 +21,4 @@ pub mod data; pub mod entity; pub mod game; pub mod interaction; -pub mod protocol; pub mod state; diff --git a/server/src/main.rs b/server/src/main.rs index 99834fbd..4c6bcc34 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -18,6 +18,8 @@ use anyhow::{anyhow, Result}; use clap::Parser; use futures_util::{SinkExt, StreamExt}; +use hurrycurry_protocol::{PacketC, PacketS, PlayerID}; +use hurrycurry_server::{data::DATA_DIR, state::State}; use log::{debug, info, warn, LevelFilter}; use std::{path::PathBuf, process::exit, str::FromStr, sync::Arc, time::Duration}; use tokio::{ @@ -27,11 +29,6 @@ use tokio::{ time::interval, }; use tokio_tungstenite::tungstenite::Message; -use hurrycurry_server::{ - data::DATA_DIR, - protocol::{PacketC, PacketS, PlayerID}, - state::State, -}; #[derive(Parser)] struct Args { diff --git a/server/src/state.rs b/server/src/state.rs index 72d3e911..5af6f181 100644 --- a/server/src/state.rs +++ b/server/src/state.rs @@ -17,13 +17,10 @@ */ use std::time::Duration; -use crate::{ - data::DataIndex, - game::Game, - protocol::{Message, PacketC, PacketS, PlayerID}, -}; +use crate::{data::DataIndex, game::Game}; use anyhow::{anyhow, bail, Result}; use clap::{Parser, ValueEnum}; +use hurrycurry_protocol::{Message, PacketC, PacketS, PlayerID}; use log::debug; use tokio::sync::broadcast::Sender; |