排名查询

四条把当前采集结果打到聊天框的排名指令,以及一条实体追踪开关。

基本信息

指令 实现类 权限等级 输出内容
/opis_te CommandTimingTileEntities 0 TileEntity tick 耗时排名
/opis_ent CommandTimingEntities 0 实体 tick 耗时排名
/opis_chunk CommandChunkList 0 区块 TileEntity 耗时排名
/opis_nent CommandAmountEntities 0 按类型统计的实体总数
/opis_enttrace CommandEntityCreate 3 实体创建栈追踪日志开关

注册位置:modOpis.java:217、:219、:213、:220、:224。前四条均被 CommandHelp 列出(CommandHelp.java:25-28),/opis_enttrace 不在帮助列表中。

功能

四条排名指令的共同前置

前四条都在 processCommand 开头做同一个判断:若发送者是 EntityPlayerMP,回复 DEPRECATED ! Please run /opis instead. 并返回(CommandChunkList.java:35-38、CommandTimingTileEntities.java:32-35、CommandTimingEntities.java:32-35、CommandAmountEntities.java:32-35)。因此这四条只能从服务端控制台使用,在游戏里输入只会得到这句提示。/opis_enttrace 没有这个分支。

/opis_te [n]

调用 TileEntityManager.INSTANCE.getWorses(20)(无参时)或 getWorses(Integer.valueOf(astring[0]))(带参时),逐行 stat.toString() 输出。astring[0] 解析失败时 catch 后直接 return,无输出。

/opis_ent [n]

与 /opis_te 同构,改用 EntityManager.INSTANCE.getWorses(...)。输出前先打一行表头 [DIM X Z] Time NTEs。

/opis_chunk [n]

调用 ChunkManager.INSTANCE.getTopChunks(20) 或 getTopChunks(...),输出前打表头 [DIM X Z] Time NTEs。

这条指令带参时存在实际缺陷:CommandChunkList.java:42 写的是

chunks = ChunkManager.INSTANCE.getTopChunks(Integer.valueOf(astring.length));

传入的是参数个数(astring.length)而不是参数值本身。因此 /opis_chunk 5 与 /opis_chunk 1 2 3 4 5 都会取 Top 1,而 /opis_chunk 500(个数为 1)只会取 Top 1 —— 参数值被完全忽略。/opis_chunk(无参)才正确走 getTopChunks(20) 分支。对照 /opis_te、/opis_ent 用的是 Integer.valueOf(astring[0]),是正确写法。

/opis_nent [all]

astring[0] 等于 all 时调用 EntityManager.INSTANCE.getCumulativeEntities(false),否则调用 getCumulativeEntities(true)。逐行输出 key : value 格式的 AmountHolder。

该指令的 all 参数目前没有实际效果:EntityManager.getCumulativeEntities(boolean filtered)(EntityManager.java:139-159)的方法体完全没有读取 filtered 这个形参,两种取值返回的内容完全相同。/opis_nent 与 /opis_nent all 输出等价。

/opis_enttrace [full]

切换 OpisServerEventHandler.printEntityTrace 布尔量(CommandEntityCreate.java:25-33):

  • 参数恰为 full:printEntityFull = true 且 printEntityTrace = true
  • 其它情况(含无参):printEntityTrace 取反,并强制 printEntityFull = false

回复 Entity trace is %s。该类只 extends CommandBase,没有实现 IOpisCommand,因此没有 getDescription(),也无法被 CommandHelp 列出;getCommandUsage() 还是一个空实现的 // TODO Auto-generated method stub(CommandEntityCreate.java:20-23)。

数值

指令 默认条数 可传参数
/opis_te 20 第 1 个参数为条数
/opis_ent 20 第 1 个参数为条数
/opis_chunk 20 取值被忽略,实际生效的是参数个数
/opis_nent 全部 all 目前无效果(形参未被读取)
/opis_enttrace 无 full 或无参

这些是控制台排名的条数。走面板请求时的条数是硬编码的 100:ServerMessageHandler.java:128 与 :133 均调用 getWorses(100),:146 的 getTopChunks(100) 同理。

交互

触发 行为
控制台 /opis_te 50 列出最耗时的 50 个 TileEntity
玩家 /opis_te 50 回复 DEPRECATED ! Please run /opis instead.
控制台 /opis_chunk 5 只取 Top 1(参数被忽略,见上)
控制台 /opis_enttrace full 打开完整实体创建栈追踪
控制台 /opis_enttrace 反转实体栈追踪开关,并关闭 full 模式
控制台 /opis_nent 与 /opis_nent all 输出相同(filtered 形参未被使用)

相关条目