MCDR plugin: item share, hat, player head, calculator, join MOTD. All rights reserved. Author: 云镜之端/SKYMirror
53 lines
1.8 KiB
Python
53 lines
1.8 KiB
Python
from mcdreforged.api.all import *
|
|
|
|
from iridium.config import config
|
|
from iridium.utils import (
|
|
check_cooldown,
|
|
check_permission,
|
|
mark_cooldown,
|
|
require_player,
|
|
safe_execute,
|
|
sanitize_name,
|
|
)
|
|
from iridium.version_util import is_at_least, require_version, tr
|
|
|
|
|
|
def _give_head_command(player: str, target: str, version: Version) -> str:
|
|
# Defense in depth: never interpolate an unsanitized name
|
|
safe_player = sanitize_name(player) or "Steve"
|
|
safe_target = sanitize_name(target) or safe_player
|
|
if is_at_least(version, "1.20.5"):
|
|
return f'give {safe_player} minecraft:player_head[minecraft:profile="{safe_target}"] 1'
|
|
if is_at_least(version, "1.13"):
|
|
return f'give {safe_player} minecraft:player_head{{SkullOwner:"{safe_target}"}} 1'
|
|
return f'give {safe_player} minecraft:skull 1 3 {{SkullOwner:"{safe_target}"}}'
|
|
|
|
|
|
def do_head(server: PluginServerInterface, src: CommandSource, context: dict) -> None:
|
|
player = require_player(src)
|
|
if player is None:
|
|
return
|
|
if not check_permission(src, config.permission):
|
|
return
|
|
version = require_version(server, src)
|
|
if version is None:
|
|
return
|
|
|
|
target = context.get("player_name") or player
|
|
safe_target = sanitize_name(target) or sanitize_name(player) or player
|
|
if not check_cooldown(src, player, "head", config.head_cooldown_seconds):
|
|
return
|
|
|
|
safe_execute(server, _give_head_command(player, safe_target, version))
|
|
mark_cooldown(player, "head")
|
|
src.reply(RText(tr("head_success", safe_target), RColor.green))
|
|
|
|
|
|
def register(server: PluginServerInterface) -> None:
|
|
builder = SimpleCommandBuilder()
|
|
builder.command("!!head", lambda src: do_head(server, src, {}))
|
|
builder.command("!!head <player_name>", lambda src, ctx: do_head(server, src, ctx))
|
|
builder.arg("player_name", Text)
|
|
builder.register(server)
|
|
server.register_help_message("!!head [player]", tr("head_help", config.head_cooldown_seconds))
|