/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(后者只管自动触发路径)。
相关条目
- 曲曲效果注册表 - 50 个事件名
- 曲曲机制 - 自动触发路径与门槛
- Warptheory 配置 - 总开关