/warptheory 指令

[!INFO] 实现类:shukaro.warptheory.handlers.WarpCommand 注册:WarpTheory.serverStarting() → evt.registerServerCommand(new WarpCommand()) 类型:服务器指令(非 ClientCommandHandler)

基本信息

属性 值
指令名 warptheory
用法 /warptheory <event> [player]
别名 getCommandAliases() 返回 null(无别名)
注册时机 FMLServerStartingEvent

⚠️ 与 CoreTweaks 的 /coretweaks 不同, 本指令走 FMLServerStartingEvent 的 registerServerCommand, 是服务端指令,有 Tab 补全:

@Override public List<String> addTabCompletionOptions(ICommandSender sender, String[] args) { … }
@Override public boolean isUsernameIndex(String[] args, int i) { … }

isUsernameIndex 表明第 2 个参数被识别为玩家名, 可补全在线玩家。

权限:OP 或 创造模式

WarpCommand 显式覆写了 canCommandSenderUseCommand(而非依赖 getRequiredPermissionLevel 默认值):

@Override public boolean canCommandSenderUseCommand(ICommandSender sender) {
    if (sender instanceof EntityPlayerMP) {
        EntityPlayer player = MiscHelper.getPlayerByName(sender.getCommandSenderName());
        return player.capabilities.isCreativeMode || MiscHelper.isOp(sender.getCommandSenderName());
    } else {
        return sender instanceof MinecraftServer;
    }
}
发送者 允许条件
EntityPlayerMP 创造模式 或 OP(MiscHelper.isOp)
其它(控制台等) 必须是 MinecraftServer 实例

即创造模式玩家也能用,这比纯 OP 限制宽松。 ⚠️ 未覆写 getRequiredPermissionLevel() —— 真正的门控在 canCommandSenderUseCommand,只读权限等级会误判。

三类子命令,不止事件名

processCommand 先校验参数个数(必须 1 或 2),否则报错并 动态列出全部可用名:

if (args.length == 0 || args.length > 2) {
    String events = "";
    for (String name : nameMap.get().keySet()) events += name + " ";
    sender.addChatMessage(new ChatComponentText("Invalid Syntax, available events are: " + events));
    sender.addChatMessage(new ChatComponentText("Additional commands: print purge"));
}

第 1 个参数有 3 类取值:

args[0] 作用 玩家参数
print 列出该玩家所有 >0 的曲曲标签(含定时器) 可选,默认自己
purge 移除该玩家所有 >0 的曲曲标签 可选,默认自己
事件名 立即触发该曲曲效果 可选,默认自己

⚠️ print / purge 这两个字面量不在 getCommandUsage 里 (用法串只写了 /warptheory <event> [player]), 只在报错信息里以 Additional commands: print purge 形式出现。

print / purge 遍历两个集合:

  • nameMap.get().keySet() —— 50 个事件名;
  • timers.get() —— 定时器标签名(对应 数据包 中 DecrementPacket 递减的 ears 之类)。

无任何活动效果时输出 No active warp effects!。

事件触发路径

IWarpEvent event = nameMap.get().get(args[0]);
if (event == null) {
    sender.addChatMessage(new ChatComponentText("Could not find warp event: " + args[0]));
    return;
}

if (event instanceof IMultiWarpEvent) {
    ((IMultiWarpEvent) event).doEvent(args[0], sender.getEntityWorld(), player);
} else {
    event.doEvent(sender.getEntityWorld(), player);
}
sender.addChatMessage(new ChatComponentText("Triggered warp event: " + args[0]));
  • IMultiWarpEvent 走带事件名参数的 doEvent(String, World, EntityPlayer) 重载;
  • 其余走标准 doEvent(World, EntityPlayer)。
  • 事件名不存在时只发聊天消息并 return,不抛异常(对比 /coretweaks 抛 WrongUsageException)。

⚠️ 事件名查找是 nameMap.get().get(args[0]) 大小写敏感的精确匹配。

与曲曲值门槛的关系

指令路径绕过 曲曲机制 中的 「100 秒一次 + sqrt 概率 + minWarp 门槛」判定 —— 查到事件即 doEvent。因此可以要求一个曲曲值为 0 的玩家 立刻看到凋灵。

真正能压制的是 purge(清除所有标签)与配置总开关 ConfigHandler.allowWarpEffects(后者只管自动触发路径)。

相关条目