指令

基本信息

属性 值
指令总数 2
主指令 /randomthings(别名 /rt)
副指令 /exitspectre
权限等级 /rt = 3(OP);/exitspectre = 0(所有人)
注册位置 RandomThings.serverStarting(RandomThings.java:173-174)
作者白名单 用户名 XxsumsumxX(RandomThings.java:68)

功能

两条指令均在服务器启动时注册(RandomThings.java:173-174):

event.registerServerCommand(new RTCommand());
event.registerServerCommand(new ExitSpectreCommand());

/rt

指令名由 Reference.MOD_NAME.toLowerCase() 动态生成(Core/Commands/RTCommand.java:39-41):

public String getCommandName() {
    return Reference.MOD_NAME.toLowerCase();
}

MOD_NAME 来自 gradle.properties 的 modName = RandomThings,因此实际指令名为 /randomthings,别名 /rt(:55-57)。

权限

canCommandSenderUseCommand 允许OP 或作者本人通过(:48-52):

return commandUser.canCommandSenderUseCommand(this.getRequiredPermissionLevel(), this.getCommandName())
        || commandUser.getCommandSenderName().equals(RandomThings.AUTHOR_USERNAME);

getRequiredPermissionLevel() 返回 3(:210-213)。作者用户名常量定义在 RandomThings.java:68:

public static final String AUTHOR_USERNAME = "XxsumsumxX";

7 个子指令

子指令 参数 功能 行
notify <username> <title> <description> <displayduration> <iconstring> [metadata] 向指定玩家发送屏幕通知 :71-113
moon get / set <0-7> 读取或设置月相 :114-135
setItemColor <colorInt> 给手持物品写入 customRTColor NBT :136-145
setBiomeCapsule <biomeID> 设定手持生物群系胶囊的群系 :146-169
spectre <cubeOwner> 把自己设为某玩家的灵魂世界操作者 :170-175
analyze — 输出手持物品的完整调试信息 :176-198
bloodmoon [dimID] 强制触发血月 :199-207

[!NOTE] 无参数时打印的用法提示是 /rt <notify|moon|setItemColor|setBiomeCapsule|analyze|bloodmoon>(:61-62)—— 提示文本漏掉了 spectre,但该分支在 :170 确实存在且可用。同样地 Tab 补全列表把 "spectre" 重复写了两次(:223、:225)。

各子指令细节

notify —— 需要至少 6 个参数,否则抛 WrongUsageException(:74-76)。图标通过 GameData.getItemRegistry().getObject(iconString) 或 getBlockRegistry() 解析(:93-94),两者都失败则报错。displayduration 必须 > 0(:84-86)。最终通过 PacketHandler.INSTANCE.sendTo(packet, receiverEntity) 定向发送(:113)。

moon —— set 只接受 0–7(:126-129),通过 setWorldTime(provider.getWorldTime() % 24000 + 24000 * moonPhase) 实现(:131-132)。

setItemColor —— 直接给手持物品 NBT 写 customRTColor 整数(:143):

is.stackTagCompound.setInteger("customRTColor", Integer.parseInt(args[1]));

这是给幽灵方块等染色物品改色用的底层接口(无任何范围校验,Integer.parseInt 也无 try/catch)。

setBiomeCapsule —— 用 Guava Preconditions 做三重校验(:148-157):手持物必须是 ItemBiomeCapsule、必须指定群系 ID、群系 ID 必须 >= 0。群系必须真实存在(BiomeGenBase.getBiome(biomeID) != null),否则报「This Biome does not exist」(:159-168)。成功后设 is.setItemDamage(biomeID + 1)(:160)。

spectre —— 委托给 RandomThings.instance.spectreHandler.sendOperator(player, args[1])(:174),把玩家设为 cubeOwner 在灵魂世界的操作者。

analyze —— 输出手持物品的 7 项调试信息(:176-198):显示名、类名、metadata、是否有 NBT、注册名、全部矿物辞典名。注册名用 GameRegistry.findUniqueIdentifierFor(:189)。仅玩家可用(instanceof EntityPlayer),无参数。

bloodmoon —— 委托 ServerBloodmoonHandler.INSTANCE.force(dimID)(:202、:204)。给 1 个参数时用该维度 ID,不给时用玩家当前维度。执行后回复 text.bloodmoon.command(中文「血月将在明晚出现」,zh_CN.lang:169)。

/exitspectre

把玩家从灵魂世界送回(Core/Commands/ExitSpectreCommand.java):

public String getCommandName() { return "exitspectre"; }
public String getCommandUsage(ICommandSender p) { return "/exitspectre"; }
  • 无参数(:20)
  • 权限等级 0 —— 所有人可用(:30-32)
  • 双重校验:必须是 EntityPlayer 且 player.dimension == Settings.SPECTRE_DIMENSON_ID(:21-26),否则静默无操作
  • 委托 spectreHandler.teleportPlayerOutOfSpectreWorld((EntityPlayerMP) player)(:25)

无别名、无 Tab 补全。

数值

数值名 值
指令数 2
/rt 子指令数 7
/rt 权限等级 3
/exitspectre 权限等级 0
别名 /rt
作者白名单 1(XxsumsumxX)
/rt 用法提示遗漏的子指令 1(spectre)

相关条目