Pumpkin/crates/pumpkin/src/net/java/play/set_game_rule.rs
2026-09-10 21:04:33 +02:00

83 lines
3.2 KiB
Rust

#[allow(clippy::wildcard_imports)]
use super::*;
use pumpkin_data::game_rules::{GameRule, GameRuleValue};
use pumpkin_protocol::java::server::play::SSetGameRule;
impl JavaClient {
pub fn handle_set_game_rule(&self, player: &Player, packet: &SSetGameRule<'_>) {
if player.permission_lvl.load() < PermissionLvl::Two {
warn!(
"Player {} tried to set game rules without required permissions",
player.gameprofile.name
);
return;
}
let world = player.world();
let minecart_improvements_enabled = world.server.upgrade().map_or_else(
|| {
world
.level_info
.load()
.data_packs
.enabled
.iter()
.any(|p| p == "minecart_improvements" || p == "file/minecart_improvements")
},
|s| s.is_feature_enabled("minecraft:minecart_improvements"),
);
for entry in &packet.entries {
let key = entry
.game_rule_key
.strip_prefix("minecraft:")
.unwrap_or(entry.game_rule_key);
let Some(rule) = GameRule::all().iter().find(|r| r.to_string() == key) else {
warn!("Unknown game rule: {}", entry.game_rule_key);
continue;
};
if *rule == GameRule::MaxMinecartSpeed && !minecart_improvements_enabled {
warn!(
"Player {} tried to set game rule {} which is not enabled by feature flags",
player.gameprofile.name, entry.game_rule_key
);
continue;
}
let level_info = player.world().level_info.load();
let current_val = level_info.game_rules.get(rule);
match current_val {
GameRuleValue::Int(_) => {
if let Ok(val) = entry.value.parse::<i64>() {
player.world().set_game_rule(rule, GameRuleValue::Int(val));
info!(
"Player {} set gamerule {} to {}",
player.gameprofile.name, key, val
);
} else {
warn!(
"Player {} tried to set invalid int value '{}' for gamerule {}",
player.gameprofile.name, entry.value, key
);
}
}
GameRuleValue::Bool(_) => {
if let Ok(val) = entry.value.parse::<bool>() {
player.world().set_game_rule(rule, GameRuleValue::Bool(val));
info!(
"Player {} set gamerule {} to {}",
player.gameprofile.name, key, val
);
} else {
warn!(
"Player {} tried to set invalid bool value '{}' for gamerule {}",
player.gameprofile.name, entry.value, key
);
}
}
}
}
}
}