From 488712b71cfdca017bf8ce179cea3387489052e4 Mon Sep 17 00:00:00 2001 From: illegitimate-egg Date: Mon, 17 Mar 2025 00:38:36 +0000 Subject: [PATCH] Add config files (and refactor parts of RTE) --- .actrc | 1 - .cargo/config.toml | 2 + .cargo/runner.sh | 2 + Cargo.lock | 84 +++++++++++++++++++++++-- Cargo.toml | 12 ++-- rte/config.toml | 11 ++++ {src => rte}/extensions/fill.rhai | 0 {src => rte}/extensions/ping-pong.rhai | 0 {src => rte}/extensions/utils.rhai | 0 {src => rte}/world.wrld.back | Bin src/config.rs | 66 +++++++++++++++++++ src/main.rs | 12 +++- src/network.rs | 9 ++- src/utils.rs | 13 ++-- src/world.rs | 23 +++---- src/world.wrld | Bin 131078 -> 0 bytes 16 files changed, 200 insertions(+), 35 deletions(-) delete mode 100644 .actrc create mode 100644 .cargo/config.toml create mode 100755 .cargo/runner.sh create mode 100644 rte/config.toml rename {src => rte}/extensions/fill.rhai (100%) rename {src => rte}/extensions/ping-pong.rhai (100%) rename {src => rte}/extensions/utils.rhai (100%) rename {src => rte}/world.wrld.back (100%) create mode 100644 src/config.rs delete mode 100644 src/world.wrld diff --git a/.actrc b/.actrc deleted file mode 100644 index 7d20899..0000000 --- a/.actrc +++ /dev/null @@ -1 +0,0 @@ --P ubuntu-latest=ghcr.io/catthehacker/ubuntu:rust-latest diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..5c2399a --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,2 @@ +[target.'cfg(all())'] +runner = "./.cargo/runner.sh" diff --git a/.cargo/runner.sh b/.cargo/runner.sh new file mode 100755 index 0000000..0f3076e --- /dev/null +++ b/.cargo/runner.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cd ../rte && exec "$@" diff --git a/Cargo.lock b/Cargo.lock index 9a25e63..4ee6166 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -125,6 +125,12 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + [[package]] name = "flate2" version = "1.1.0" @@ -146,6 +152,22 @@ dependencies = [ "wasi", ] +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + +[[package]] +name = "indexmap" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" +dependencies = [ + "equivalent", + "hashbrown", +] + [[package]] name = "instant" version = "0.1.13" @@ -189,7 +211,9 @@ dependencies = [ "regex", "rhai", "rhai-rand", + "serde", "simple_logger", + "toml", ] [[package]] @@ -408,18 +432,18 @@ checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "serde" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", @@ -438,6 +462,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + [[package]] name = "simple_logger" version = "5.0.0" @@ -538,6 +571,40 @@ dependencies = [ "crunchy", ] +[[package]] +name = "toml" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "unicode-ident" version = "1.0.17" @@ -695,6 +762,15 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winnow" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" +dependencies = [ + "memchr", +] + [[package]] name = "zerocopy" version = "0.7.35" diff --git a/Cargo.toml b/Cargo.toml index 387e02d..52cf0af 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,11 +13,7 @@ flate2 = "1.0.30" log = "0.4.26" regex = "1.11.1" rhai-rand = "0.1.6" - -[dependencies.simple_logger] -version = "5.0.0" -features = ["threads", "nightly"] - -[dependencies.rhai] -version = "1.21.0" -features = ["sync"] +serde = { version = "1.0.219", features = ["derive"] } +toml = "0.8.20" +simple_logger = { version = "5.0.0", features = ["threads", "nightly"] } +rhai = { version = "1.21.0", features = ["sync"] } diff --git a/rte/config.toml b/rte/config.toml new file mode 100644 index 0000000..449e679 --- /dev/null +++ b/rte/config.toml @@ -0,0 +1,11 @@ +[server] +name = "mcrizzledizzle default" +motd = "For shits and giggles" +port = 25565 + +[world] +world = "world.wrld" # Custom world type, not interchangable +# Generation parameters, when a world is read these are ignored +size_x = 64 +size_y = 32 +size_z = 64 diff --git a/src/extensions/fill.rhai b/rte/extensions/fill.rhai similarity index 100% rename from src/extensions/fill.rhai rename to rte/extensions/fill.rhai diff --git a/src/extensions/ping-pong.rhai b/rte/extensions/ping-pong.rhai similarity index 100% rename from src/extensions/ping-pong.rhai rename to rte/extensions/ping-pong.rhai diff --git a/src/extensions/utils.rhai b/rte/extensions/utils.rhai similarity index 100% rename from src/extensions/utils.rhai rename to rte/extensions/utils.rhai diff --git a/src/world.wrld.back b/rte/world.wrld.back similarity index 100% rename from src/world.wrld.back rename to rte/world.wrld.back diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..1534293 --- /dev/null +++ b/src/config.rs @@ -0,0 +1,66 @@ +use log::warn; +use serde::Deserialize; +use std::{ + fs::File, + io::{Read, Write}, +}; + +use crate::error::AppError; + +#[derive(Clone, Debug, Deserialize)] +pub struct Config { + pub server: ServerConfig, + pub world: WorldConfig, +} + +// Hmm hmm hmm hmm... the great, iconic, symbol of nobility. My sibilantic friend, ServerSonfig. +// Your hour has passed and +#[derive(Clone, Debug, Deserialize)] +pub struct ServerConfig { + pub port: u16, + pub name: String, + pub motd: String, +} + +#[derive(Clone, Debug, Deserialize)] +pub struct WorldConfig { + pub world: String, + pub size_x: i16, + pub size_y: i16, + pub size_z: i16, +} + +impl Config { + pub fn load() -> Result { + // Load the config file + let mut config_file = match File::open("config.toml") { + Ok(result) => result, + Err(_) => { + const CONFIG_FILE_DATA: &str = r#"[server] +name = "mcrizzledizzle default" +motd = "For shits and giggles" +port = 25565 + +[world] +world = "world.wrld" # Custom world type, not interchangable +# Generation parameters, when a world is read these are ignored +size_x = 64 +size_y = 32 +size_z = 64 +"#; + + warn!("No config file was present! Generating one now."); + let mut config_file = File::create("config.toml")?; + config_file.write_all(CONFIG_FILE_DATA.as_bytes())?; + File::open("config.toml").expect("Failed to create config.toml") + } + }; + + let mut config_data = String::new(); + config_file + .read_to_string(&mut config_data) + .expect("Failed to read config file"); + + Ok(toml::from_str(&config_data).expect("Failed to deserialize config.toml")) + } +} diff --git a/src/main.rs b/src/main.rs index 71e539e..ac6fb69 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,6 +4,7 @@ use std::net::{SocketAddr, TcpListener}; use std::sync::{Arc, Mutex}; mod command; +mod config; mod error; mod extensions; mod network; @@ -11,6 +12,7 @@ mod player; mod utils; mod world; +use config::Config; use error::AppError; use extensions::{Extensions, PlayersWrapper, WorldWrapper}; use network::handle_client; @@ -27,22 +29,25 @@ fn main() { } fn run() -> Result<(), AppError> { + let config = Config::load()?; + let players: [Player; 255] = core::array::from_fn(|_| Player::default()); let players_arc = Arc::new(Mutex::new(players)); - let world_instance: World = World::load()?; + let world_instance: World = World::load(&config.world)?; let world_arc = Arc::new(Mutex::new(world_instance)); - let addr = SocketAddr::from(([0, 0, 0, 0], 25565)); + let addr = SocketAddr::from(([0, 0, 0, 0], config.server.port)); let listener = TcpListener::bind(addr)?; let mut thread_number: u8 = 0; let world_arc_clone_main_thread = Arc::clone(&world_arc); + let world_config_clone = config.clone().world; ctrlc::set_handler(move || { println!(); info!("SAVING"); - World::save(world_arc_clone_main_thread.clone()).unwrap(); // Fortnite save the world + World::save(&world_config_clone, world_arc_clone_main_thread.clone()).unwrap(); // Fortnite save the world std::process::exit(0); }) .expect("Error handling control C, save on exit will not work"); @@ -59,6 +64,7 @@ fn run() -> Result<(), AppError> { let world_arc_clone = Arc::clone(&world_arc); let extensions_arc_clone = Arc::clone(&extensions); handle_client( + config.clone().server, stream?, thread_number, players_arc_clone, diff --git a/src/network.rs b/src/network.rs index 57f8cf2..0f3a8f2 100644 --- a/src/network.rs +++ b/src/network.rs @@ -7,12 +7,14 @@ use std::thread::sleep; use std::time::Duration; use crate::command::handle_command; +use crate::config::ServerConfig; use crate::extensions::{Event, EventType, Extensions}; use crate::player::{Player, PlayerStatus, SpecialPlayers}; use crate::utils::*; use crate::world::World; pub fn handle_client( + config: ServerConfig, mut stream: TcpStream, client_number: u8, players_arc_clone: Arc>, @@ -90,7 +92,12 @@ pub fn handle_client( current_player.pitch = 0; current_player.operator = true; - let _ = bomb_server_details(&mut stream, current_player, &world_arc_clone); + let _ = bomb_server_details( + config.clone(), + &mut stream, + current_player, + &world_arc_clone, + ); for i in 0..immediate_join.len() { if immediate_join[i] { diff --git a/src/utils.rs b/src/utils.rs index 8a88ec3..ac5f2cd 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -5,6 +5,7 @@ use std::io::prelude::*; use std::net::TcpStream; use std::sync::{Arc, Mutex}; +use crate::config::ServerConfig; use crate::error::AppError; use crate::Player; use crate::SpecialPlayers; @@ -32,16 +33,13 @@ pub fn client_disconnect(text: &str) -> Vec { ret_val } -pub fn server_identification(is_op: bool) -> Vec { +pub fn server_identification(config: ServerConfig, is_op: bool) -> Vec { let mut ret_val: Vec = vec![]; ret_val.push(0x00); ret_val.push(0x07); - let server_name = "Erm... what the sigma?"; - ret_val.append(&mut to_mc_string(server_name).to_vec()); - - let server_motd = "Pragmatism not idealism"; - ret_val.append(&mut to_mc_string(server_motd).to_vec()); + ret_val.append(&mut to_mc_string(&config.name).to_vec()); + ret_val.append(&mut to_mc_string(&config.motd).to_vec()); if is_op { ret_val.push(0x64); @@ -212,12 +210,13 @@ pub fn send_level_data(world_arc_clone: &Arc>) -> Result, A } pub fn bomb_server_details( + config: ServerConfig, stream: &mut TcpStream, current_player: &Player, world_arc_clone: &Arc>, ) -> Result<(), AppError> { let mut compound_data: Vec = vec![]; - compound_data.append(&mut server_identification(current_player.operator)); + compound_data.append(&mut server_identification(config, current_player.operator)); compound_data.append(&mut init_level()); diff --git a/src/world.rs b/src/world.rs index 6550c1a..557485f 100644 --- a/src/world.rs +++ b/src/world.rs @@ -4,6 +4,7 @@ use std::sync::{Arc, Mutex}; use log::info; +use crate::config::WorldConfig; use crate::error::AppError; #[derive(Debug)] @@ -32,8 +33,8 @@ impl World { world_dat } - pub fn load() -> Result { - if fs::metadata("world.wrld").is_ok() { + pub fn load(config: &WorldConfig) -> Result { + if fs::metadata(&config.world).is_ok() { let mut world: World = World { size_x: 0, size_y: 0, @@ -41,7 +42,7 @@ impl World { data: Vec::new(), }; - let world_data_raw = fs::read("world.wrld")?; + let world_data_raw = fs::read(&config.world)?; if world_data_raw.len() < 6 { return Err(AppError::InvalidWorldFile); } @@ -61,20 +62,20 @@ impl World { } world.data = world_data_raw[6..].to_vec(); - info!("Loaded world {}", "world.wrld"); + info!("Loaded world {}", &config.world); Ok(world) } else { - info!("Creating word {}", "world.wrld"); + info!("Creating word {}", &config.world); Ok(World { - size_x: 64, - size_y: 32, - size_z: 64, - data: World::build(64, 32, 64), + size_x: config.size_x, + size_y: config.size_y, + size_z: config.size_z, + data: World::build(config.size_x, config.size_y, config.size_z), }) } } - pub fn save(world_arc_clone: Arc>) -> Result<(), AppError> { + pub fn save(config: &WorldConfig, world_arc_clone: Arc>) -> Result<(), AppError> { let mut to_write: Vec = Vec::new(); { let mut world_dat = world_arc_clone.lock()?; @@ -88,7 +89,7 @@ impl World { to_write.append(&mut world_dat.data); } - let mut file = File::create("world.wrld")?; + let mut file = File::create(&config.world)?; Ok(file.write_all(&to_write)?) } } diff --git a/src/world.wrld b/src/world.wrld deleted file mode 100644 index 8f8d6ace46ea73f281e65bb6a2b12fcd4c08c8c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131078 zcmeI*(Qe{66vpw0mdjp%I$Di17kk03gn(@yVc!3#)^ zhvpEPX?{0{_={U3Wc z*k6?b)c;iuE1g0B0R&bmkf@(?B&h#$wAdB_1P~ZmK&*eM|3@AVc2}bS^?!|{N}muw z0D-j%Q2)mx&-MSGB#li0tn1gfcl?T?0L@2nzEw) zuW2;t3jzoruyz6J|9A#)HW{0+1_1=-DM0g|HH0B?8p{w%-^fw!|RN3Q+$u z6A(ZE0R(0t;7*xQA;R!?l0R+YpP<{!x9QgbH zu?B+uR4hRKuMh5q1px#QK)?xH{8BCv!i61#`1kSzeEfU!UfhAf_>*my1Nk2gjco@Z zKK45t4z~6;o0pf(OSElPd>p>Xh)=Y>$%%h)9r#?HH=F0@XV<*B{|?~m4mQtj2RZRB zxECLC$!kB}K~B8f{-@r@ci-9mN27eRUV-pFrqKOR|1UY-0|@yOihx1jXxN5L?hAwu zeDV(h2p}-Az{lsuOY_*aOKEr`#_zX>A3xsSw)?^a_S+CRa(t`W+1^Vn-TppQ<@e&c z=Z50l^OtU$yN}M_k3oN%y^l4;?;0<^Z~A?;$6wq1x3vA{8u?Fe2fL7eKd0UXUw-IE zetE*w|8D!64*1o^_*4hf{ImT##%p(S;uAe@a^l-2`=gK*-wzGDvmZa#4&OZ3kKda> zenbEP1S%CcHb<#vE?V1x)H=ZkAb(lnt)&K6RznJ5@dDA^!cVmw4H~aBZsNX++ z%Kj#&ejePp&2KQ==%0+2^B4U>?n?jF@mJ&R$4}Znti74j$t_ul00IcCML;XxssGn9 zPv|EC2+UugJIC!FvoqG~|6jlUy1o9KkwvIdsQ+)o?DdnY{kPQrH+9WSVZ@{Q3W8Al`M{R{y2P&wTy3>tpwL1vkeJ43HQ< z`StUa=O5;tHz-|1zs7$2Bs0u7ev|R6L;wK<>Jy;;uWwB05dsJ-Q{a5Pf7`h*{pH7p z8$Vsj`~Qge-PtcUHF0u;&X-jC?WkD#G!*adzh*KyU)ox!-`4qJk8da7RPjmFW*73e z_^0FT{eMjS((|9%&wl)*$IpKJrsG+Q00IcqCqVsQ-;E}^siRGeSMyi>)cmK8=lXwYRglIc`7i{%tdi&v^eLHDGf6Jn`SZ z%lV6bdGjYR0u%c+S;tSDf8OyM$Fl|j1Q0-=FF^g@_uwZ45I_KdSqWVKCcgZxgmV2L z)-TJi-`srgHEiJ`*UuBzuX6s>|JMIMBRRvw<5zzDNG8Qf1Q0-A!2;C(3m!aDM*sl? z5crdTeEz=+pZ{;GkUuq+dR~urd%Y;_i}AiwO8aVjsGsS-XDnIN_b>GM>kpvf@sp3= z5;I~DKmdW71*rdP9$or|00IagAPVU9N4Wo;kj28|)%)i)6Ze1V`A_VpA3wsOLns0W zAb>z5;LCq*01&aT0s#aNKmdVJ1oZkx{rvdE@#^(w_5OKk{L=Fm`>)U6Q4S+^f&c;t zATXK$)&FRe><9q_5I_Kdkp=Yni~4`s`xi{>ug{;6Cp5c5009ILm{@@Nf8qh4c?1wZ z009IZCZN}UV*R@G>*o{auaDourWQL!009ILKmY**5I_I{1Q4i5K(0S0uAkd$|NcFU z!bQwq_A5-AFa!`l009ILKmY**5I_I{1in*1uYbkQAMp3@-#Og0g#ZEwAb