From bfdd57b88ffd332da8f0684dd2d9271a24cdac5f Mon Sep 17 00:00:00 2001 From: Alexander Medvedev Date: Tue, 1 Apr 2025 15:45:23 +0200 Subject: [PATCH] added some fun :wink: --- pumpkin-config/src/fun.rs | 14 ++++++++++++++ pumpkin-config/src/lib.rs | 3 +++ pumpkin/src/net/packet/play.rs | 8 +++++++- pumpkin/src/server/mod.rs | 1 + pumpkin/src/server/seasonal_events.rs | 26 ++++++++++++++++++++++++++ 5 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 pumpkin-config/src/fun.rs create mode 100644 pumpkin/src/server/seasonal_events.rs diff --git a/pumpkin-config/src/fun.rs b/pumpkin-config/src/fun.rs new file mode 100644 index 000000000..4acac332b --- /dev/null +++ b/pumpkin-config/src/fun.rs @@ -0,0 +1,14 @@ +use serde::{Deserialize, Serialize}; + +// Lets face it, the only reason we play this game is because of fun 🙃 +#[derive(Deserialize, Serialize)] +#[serde(default)] +pub struct FunConfig { + pub april_fools: bool, +} + +impl Default for FunConfig { + fn default() -> Self { + Self { april_fools: true } + } +} diff --git a/pumpkin-config/src/lib.rs b/pumpkin-config/src/lib.rs index 9cbd43910..3ebd0685d 100644 --- a/pumpkin-config/src/lib.rs +++ b/pumpkin-config/src/lib.rs @@ -1,4 +1,5 @@ use chunk::ChunkConfig; +use fun::FunConfig; use log::warn; use logging::LoggingConfig; use pumpkin_util::{Difficulty, GameMode, PermissionLvl}; @@ -12,6 +13,7 @@ use std::{ path::Path, sync::LazyLock, }; +pub mod fun; pub mod logging; pub mod networking; @@ -99,6 +101,7 @@ pub struct AdvancedConfiguration { pub pvp: PVPConfig, pub server_links: ServerLinksConfig, pub player_data: PlayerDataConfig, + pub fun: FunConfig, } #[derive(Serialize, Deserialize)] diff --git a/pumpkin/src/net/packet/play.rs b/pumpkin/src/net/packet/play.rs index e70396344..2c1e2f526 100644 --- a/pumpkin/src/net/packet/play.rs +++ b/pumpkin/src/net/packet/play.rs @@ -9,6 +9,7 @@ use crate::net::PlayerConfig; use crate::plugin::player::player_chat::PlayerChatEvent; use crate::plugin::player::player_command_send::PlayerCommandSendEvent; use crate::plugin::player::player_move::PlayerMoveEvent; +use crate::server::seasonal_events; use crate::world::BlockFlags; use crate::{ command::CommandSender, @@ -688,10 +689,15 @@ impl Player { let config = advanced_config(); + let message = match seasonal_events::modify_chat_message(&event.message) { + Some(m) => m, + None => event.message.clone(), + }; + let decorated_message = &TextComponent::chat_decorated( config.chat.format.clone(), gameprofile.name.clone(), - event.message.clone(), + message, ); let entity = &self.living_entity.entity; diff --git a/pumpkin/src/server/mod.rs b/pumpkin/src/server/mod.rs index 5ff9eb13a..26700d700 100644 --- a/pumpkin/src/server/mod.rs +++ b/pumpkin/src/server/mod.rs @@ -40,6 +40,7 @@ use tokio_util::task::TaskTracker; mod connection_cache; mod key_store; +pub mod seasonal_events; pub mod ticker; pub const CURRENT_MC_VERSION: &str = "1.21.5"; diff --git a/pumpkin/src/server/seasonal_events.rs b/pumpkin/src/server/seasonal_events.rs new file mode 100644 index 000000000..870d0a653 --- /dev/null +++ b/pumpkin/src/server/seasonal_events.rs @@ -0,0 +1,26 @@ +use chrono::{Datelike, Local}; +use pumpkin_config::advanced_config; +use rand::{seq::SliceRandom, thread_rng}; + +// Infact Mojang also has some Seasonal Events, so we can use that later to match Vanilla :D + +#[must_use] +pub fn is_april() -> bool { + let data = Local::now(); + data.day() == 1 && data.month() == 4 +} + +#[must_use] +pub fn modify_chat_message(message: &str) -> Option { + if !advanced_config().fun.april_fools && is_april() { + return None; + } + let mut words: Vec<&str> = message.split_whitespace().collect(); + if words.is_empty() { + return None; + } + let mut rng = thread_rng(); + words.shuffle(&mut rng); + let result = words.join(" "); + Some(result) +}