Pumpkin/pumpkin/src/command/commands/mod.rs
2025-12-07 22:43:26 +01:00

508 lines
17 KiB
Rust

use pumpkin_config::BasicConfiguration;
use pumpkin_util::{
PermissionLvl,
permission::{Permission, PermissionDefault, PermissionRegistry},
};
use crate::PERMISSION_REGISTRY;
use super::dispatcher::CommandDispatcher;
mod ban;
mod banip;
mod banlist;
mod bossbar;
mod clear;
mod damage;
mod data;
pub mod defaultgamemode;
mod deop;
mod difficulty;
mod effect;
mod enchant;
mod experience;
mod fill;
mod gamemode;
mod gamerule;
mod give;
mod help;
mod kick;
mod kill;
mod list;
mod me;
mod msg;
mod op;
mod pardon;
mod pardonip;
mod particle;
mod playsound;
mod plugin;
mod plugins;
mod pumpkin;
mod say;
mod seed;
mod setblock;
mod setworldspawn;
mod stop;
mod stopsound;
mod summon;
mod teleport;
mod tellraw;
mod tick;
mod time;
mod title;
mod transfer;
mod weather;
mod whitelist;
mod worldborder;
#[must_use]
pub async fn default_dispatcher(basic_config: &BasicConfiguration) -> CommandDispatcher {
let mut dispatcher = CommandDispatcher::default();
register_permissions().await;
// Zero
dispatcher.register(pumpkin::init_command_tree(), "pumpkin:command.pumpkin");
dispatcher.register(help::init_command_tree(), "minecraft:command.help");
dispatcher.register(list::init_command_tree(), "minecraft:command.list");
dispatcher.register(me::init_command_tree(), "minecraft:command.me");
dispatcher.register(msg::init_command_tree(), "minecraft:command.msg");
// Two
dispatcher.register(kill::init_command_tree(), "minecraft:command.kill");
dispatcher.register(
worldborder::init_command_tree(),
"minecraft:command.worldborder",
);
dispatcher.register(effect::init_command_tree(), "minecraft:command.effect");
dispatcher.register(teleport::init_command_tree(), "minecraft:command.teleport");
dispatcher.register(time::init_command_tree(), "minecraft:command.time");
dispatcher.register(
tick::init_command_tree(basic_config.tps),
"minecraft:command.tick",
);
dispatcher.register(give::init_command_tree(), "minecraft:command.give");
dispatcher.register(enchant::init_command_tree(), "minecraft:command.enchant");
dispatcher.register(clear::init_command_tree(), "minecraft:command.clear");
dispatcher.register(setblock::init_command_tree(), "minecraft:command.setblock");
dispatcher.register(seed::init_command_tree(), "minecraft:command.seed");
dispatcher.register(fill::init_command_tree(), "minecraft:command.fill");
dispatcher.register(
playsound::init_command_tree(),
"minecraft:command.playsound",
);
dispatcher.register(tellraw::init_command_tree(), "minecraft:command.tellraw");
dispatcher.register(title::init_command_tree(), "minecraft:command.title");
dispatcher.register(summon::init_command_tree(), "minecraft:command.summon");
dispatcher.register(
experience::init_command_tree(),
"minecraft:command.experience",
);
dispatcher.register(weather::init_command_tree(), "minecraft:command.weather");
dispatcher.register(particle::init_command_tree(), "minecraft:command.particle");
dispatcher.register(damage::init_command_tree(), "minecraft:command.damage");
dispatcher.register(bossbar::init_command_tree(), "minecraft:command.bossbar");
dispatcher.register(say::init_command_tree(), "minecraft:command.say");
dispatcher.register(gamemode::init_command_tree(), "minecraft:command.gamemode");
dispatcher.register(gamerule::init_command_tree(), "minecraft:command.gamerule");
dispatcher.register(
difficulty::init_command_tree(),
"minecraft:command.difficulty",
);
dispatcher.register(
stopsound::init_command_tree(),
"minecraft:command.stopsound",
);
dispatcher.register(
defaultgamemode::init_command_tree(),
"minecraft:command.defaultgamemode",
);
dispatcher.register(
setworldspawn::init_command_tree(),
"minecraft:command.setworldspawn",
);
dispatcher.register(data::init_command_tree(), "minecraft:command.data");
// Three
dispatcher.register(op::init_command_tree(), "minecraft:command.op");
dispatcher.register(deop::init_command_tree(), "minecraft:command.deop");
dispatcher.register(kick::init_command_tree(), "minecraft:command.kick");
dispatcher.register(plugin::init_command_tree(), "pumpkin:command.plugin");
dispatcher.register(plugins::init_command_tree(), "pumpkin:command.plugins");
dispatcher.register(ban::init_command_tree(), "minecraft:command.ban");
dispatcher.register(banip::init_command_tree(), "minecraft:command.banip");
dispatcher.register(banlist::init_command_tree(), "minecraft:command.banlist");
dispatcher.register(pardon::init_command_tree(), "minecraft:command.pardon");
dispatcher.register(pardonip::init_command_tree(), "minecraft:command.pardonip");
dispatcher.register(
whitelist::init_command_tree(),
"minecraft:command.whitelist",
);
dispatcher.register(transfer::init_command_tree(), "minecraft:command.transfer");
// Four
dispatcher.register(stop::init_command_tree(), "minecraft:command.stop");
dispatcher
}
async fn register_permissions() {
let mut registry = PERMISSION_REGISTRY.write().await;
// Register level 0 permissions (allowed by default)
register_level_0_permissions(&mut registry);
// Register level 2 permissions (OP level 2)
register_level_2_permissions(&mut registry);
// Register level 3 permissions (OP level 3)
register_level_3_permissions(&mut registry);
// Register level 4 permissions (OP level 4)
register_level_4_permissions(&mut registry);
}
fn register_level_0_permissions(registry: &mut PermissionRegistry) {
// Register permissions for builtin commands that are allowed for everyone
registry
.register_permission(Permission::new(
"pumpkin:command.pumpkin",
"Shows information about the Pumpkin server",
PermissionDefault::Allow,
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.help",
"Lists available commands and their usage",
PermissionDefault::Allow,
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.list",
"Lists players that are currently online",
PermissionDefault::Allow,
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.me",
"Broadcasts a narrative message about the player",
PermissionDefault::Allow,
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.msg",
"Sends a private message to another player",
PermissionDefault::Allow,
))
.unwrap();
}
#[allow(clippy::too_many_lines)]
fn register_level_2_permissions(registry: &mut PermissionRegistry) {
// Register permissions for commands with PermissionLvl::Two
registry
.register_permission(Permission::new(
"minecraft:command.kill",
"Kills entities (players, mobs, items, etc.)",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.worldborder",
"Manages the world border",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.effect",
"Adds or removes status effects",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.teleport",
"Teleports entities to other locations",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.time",
"Changes or queries the world's game time",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.give",
"Gives an item to a player",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.clear",
"Clears items from player inventory",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.setblock",
"Changes a block to another block",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.seed",
"Displays the world seed",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.fill",
"Fills a region with a specific block",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.playsound",
"Plays a sound to players",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.tellraw",
"Displays a JSON message to players",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.title",
"Controls screen titles displayed to players",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.summon",
"Summons an entity",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.experience",
"Adds, removes or queries player experience",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.weather",
"Sets the weather in the server",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.particle",
"Creates particles in the world",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.damage",
"Damages entities",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.bossbar",
"Creates and manages boss bars",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.say",
"Broadcasts a message to multiple players",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.gamemode",
"Sets a player's game mode",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.gamerule",
"Sets a player's game mode",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.stopsound",
"Stops sounds from playing",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.defaultgamemode",
"Sets the default game mode for new players",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.difficulty",
"Sets the difficulty of the world",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.data",
"Query and modify data of entities and blocks",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.enchant",
"Adds an enchantment to a player's selected item, subject to the same restrictions as an anvil. Also works on any mob or entity holding a weapon/tool/armor in its main hand.",
PermissionDefault::Op(PermissionLvl::Two),
))
.unwrap();
}
fn register_level_3_permissions(registry: &mut PermissionRegistry) {
// Register permissions for commands with PermissionLvl::Three
registry
.register_permission(Permission::new(
"minecraft:command.setworldspawn",
"Sets the world spawn point",
PermissionDefault::Op(PermissionLvl::Three),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.op",
"Grants operator status to a player",
PermissionDefault::Op(PermissionLvl::Three),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.deop",
"Revokes operator status from a player",
PermissionDefault::Op(PermissionLvl::Three),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.kick",
"Removes players from the server",
PermissionDefault::Op(PermissionLvl::Three),
))
.unwrap();
registry
.register_permission(Permission::new(
"pumpkin:command.plugin",
"Manages server plugins",
PermissionDefault::Op(PermissionLvl::Three),
))
.unwrap();
registry
.register_permission(Permission::new(
"pumpkin:command.plugins",
"Lists all plugins loaded on the server",
PermissionDefault::Op(PermissionLvl::Three),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.ban",
"Adds players to banlist",
PermissionDefault::Op(PermissionLvl::Three),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.banip",
"Adds IP addresses to banlist",
PermissionDefault::Op(PermissionLvl::Three),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.banlist",
"Displays banned players or IP addresses",
PermissionDefault::Op(PermissionLvl::Three),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.pardon",
"Removes entries from the player banlist",
PermissionDefault::Op(PermissionLvl::Three),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.pardonip",
"Removes entries from the IP banlist",
PermissionDefault::Op(PermissionLvl::Three),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.whitelist",
"Manages server whitelist",
PermissionDefault::Op(PermissionLvl::Three),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.tick",
"Triggers the tick event",
PermissionDefault::Op(PermissionLvl::Three),
))
.unwrap();
registry
.register_permission(Permission::new(
"minecraft:command.transfer",
"Transfers the player to another server",
PermissionDefault::Op(PermissionLvl::Three),
))
.unwrap();
}
fn register_level_4_permissions(registry: &mut PermissionRegistry) {
// Register permissions for commands with PermissionLvl::Four
registry
.register_permission(Permission::new(
"minecraft:command.stop",
"Stops the server",
PermissionDefault::Op(PermissionLvl::Four),
))
.unwrap();
}