API 接口

基本信息

属性 值
主包 serverutils(modGroup = serverutils,gradle.properties:14)
子包 events、api 门面分散在 lib.data、lib.util.permission、lib.config、lib.net、net
源码文件 608 个 .java(git ls-files | grep -c '\.java$')
语言 纯 Java 608 个,.scala 0 个、.kt 0 个
字节码目标 Java 8(enableModernJavaSyntax = jabel,gradle.properties)
扩展方式 6 个注册表 + 8 个事件钩子

本模组不提供 apiPackage(gradle.properties 中 apiPackage = 为空),没有官方划定的 API 边界。以下按「静态门面类」整理实际可从外部调用的入口。

1. ServerUtilitiesRegistry — 6 个注册表

src/main/java/serverutils/ServerUtilitiesRegistry.java:65-95 是模组的中心注册点,持有 5 个公开集合与 6 个注册方法:

集合 类型 注册方法 用途
RELOAD_IDS Map<ResourceLocation, IReloadHandler> registerServerReloadHandler(id, handler)(:81) 参与 /reload
TEAM_GUI_ACTIONS Map<ResourceLocation, TeamAction> registerTeamAction(action)(:89) 队伍 GUI 按钮
ADMIN_PANEL_ACTIONS Map<ResourceLocation, AdminPanelAction> registerAdminPanelAction(action)(:85) 管理面板按钮
CONFIG_VALUE_PROVIDERS Map<String, ConfigValueProvider> registerConfigValueProvider(id, provider)(:73) 自定义配置值来源
SYNCED_DATA Map<String, ISyncData> registerSyncData(mod, data)(:77) 客户端同步数据
— — registerInvseeInventory(inventory)(:94) 直接转发到 InvSeeRegistry

TeamAction 与 AdminPanelAction 都有 getType(ForgePlayer, NBTTagCompound) 与 onAction(ForgePlayer, NBTTagCompound) 两个方法(:152-157、:183-188、:242-247 等),由内建实现分别提供。

2. PermissionAPI — 权限门面

src/main/java/serverutils/lib/util/permission/PermissionAPI.java,5 个静态方法:

方法 行 说明
setPermissionHandler(IPermissionHandler) 23 替换整个处理器(本模组自身安装 ServerUtilitiesPermissionHandler.INSTANCE)
getPermissionHandler() 32 取当前处理器
registerNode(node, level, desc) 44 注册权限节点,返回节点串
hasPermission(GameProfile, node, IContext) 63 带上下文判定
hasPermission(EntityPlayer, node) 75 便捷重载

配套接口与实现:

类型 路径
IPermissionHandler lib/util/permission/IPermissionHandler.java
DefaultPermissionHandler lib/util/permission/DefaultPermissionHandler.java(enum 单例 INSTANCE)
DefaultPermissionLevel lib/util/permission/DefaultPermissionLevel.java(ALL / OP / NONE)
上下文 lib/util/permission/context/:IContext、Context、ContextKey、ContextKeys、AreaContext、BlockPosContext、PlayerContext、TargetContext、WorldContext

3. ServerUtilitiesAPI — 运行时门面

src/main/java/serverutils/lib/data/ServerUtilitiesAPI.java,10 个静态方法:

方法 行 说明
reloadServer(universe, sender, type, id) 36 驱动 /reload,遍历 RELOAD_IDS
editServerConfig(player, group, callback) 104 打开配置编辑 GUI
createConfigValueFromId(id) 110 从字符串 id 构造 ConfigValue
sendCloseGuiPacket(player) 121 通知客户端关闭 GUI
arePlayersInSameTeam(uuid1, uuid2) 128 同队判定
isPlayerInTeam(uuid, String team) 145 按队伍 ID
isPlayerInTeam(uuid, int team) 159 按队伍数字 ID
getTeam(uuid) 173 返回队伍 ID 串
getTeamID(uuid) 182 返回 short 型队伍 ID
reload(MinecraftServer) 191 无参重载,遍历全部 handler

4. RankConfigAPI — rank 值门面

src/main/java/serverutils/lib/config/RankConfigAPI.java,4 个静态方法:

方法 行 说明
getHandler() 25 取 IRankConfigHandler
get(MinecraftServer, GameProfile, node) 36 按 profile 取值
get(EntityPlayerMP, node) 42 按玩家取值
getConfigValue(node, boolean op) 48 不指定玩家,取 OP/普通玩家默认

配套:IRankConfigHandler、RankConfigValueInfo、DefaultRankConfigHandler、RankConfigAPI、ConfigValue 及其 15 个实现类型(ConfigBoolean、ConfigInt、ConfigLong、ConfigDouble、ConfigString、ConfigEnum、ConfigStringEnum、ConfigList、ConfigGroup、ConfigColor、ConfigRGB、ConfigFluid、ConfigItemStack、ConfigNBT、ConfigTextComponent、ConfigTeam、ConfigTeamClient、ConfigTimer、ConfigNull)。

5. InvSeeRegistry — invsee 背包注册

src/main/java/serverutils/invsee/inventories/InvSeeRegistry.java,标注 @ApiStatus.AvailableSince("2.4.0"):

方法 行 说明
registerInventory(IModdedInventory) 48 追加一个可查看背包
getRegisteredInventories() 52 取全部
getMainInventory() 56 取 index 0 强制转 IModdedInventory

详见 Invsee 背包查看。

6. NetworkWrapper — 自建封包通道

src/main/java/serverutils/lib/net/NetworkWrapper.java 基于 FML 的 SimpleNetworkWrapper:

方法 行 说明
NetworkWrapper.newWrapper(String id) 25 按 id 建通道(内部 FMLEmbeddedChannel)
register(MessageToClient) 41 注册 S2C
register(MessageToServer) 53 注册 C2S
registerBlank() 37 注册一个不处理任何消息的占位封包

MessageBase(lib/net/MessageBase.java)是所有封包的基类,实现 IMessage,把 toBytes/fromBytes 转发到自定义的 writeData(DataOut) / readData(DataIn)。

本模组建了 6 条通道(net/ServerUtilitiesNetHandler.java:6-11):

常量 通道 id 封包数
GENERAL serverutilities 17
CLAIMS utilities_claim 7
FILES utilities_files 9
EDIT_CONFIG utilities_config 2
STATS utilities_stats 4
MY_TEAM utilities_my_team 5

合计 44 个封包,45 次注册调用(GENERAL 通道多一次 registerBlank() 占位注册)。这与 net/ 目录下 extends MessageToClient|MessageToServer 的 44 个类一一对应。详见 封包与同步。

7. 排行榜注册

ServerUtilitiesLeaderboards.registerLeaderboard(Leaderboard)(ServerUtilitiesLeaderboards.java:213-219)是 public static,外部模组可直接调用或改用 LeaderboardRegistryEvent。每次注册自动附带一个 ALL 权限节点。

4 个内置排行榜(ServerUtilitiesLeaderboards.java:37-79):

id 排序依据 过滤条件
serverutilities:deaths_per_hour 死亡数 / 游戏小时 游戏时长 ≥ 1 小时,否则显示 -
serverutilities:time_active 游戏时长 − AFK 时长 有效时长 ≠ 0
serverutilities:time_afk_percent AFK / 游戏时长 ≠ 0
serverutilities:last_seen 相对最后在线时间 getLastTimeSeen() != 0;在线者显示绿色「在线」

另有从 config/serverutilities/server/stat_leaderboards.json 加载的统计排行榜,默认种子包含 minecraft.deaths、minecraft.kill_mob、minecraft.play_one_minute、serverutilities.afk_time、minecraft.jump(DEFAULT_STAT_LEADERBOARDS,ServerUtilitiesLeaderboards.java:30-32)。

8. 统计数据

ServerUtilitiesStats.AFK_TIME(ServerUtilitiesStats.java:11-15)是本模组注册的唯一自定义统计项,类型 StatBasic,是 AFK 计时与两个时间排行榜的数据源。init()(:17)负责注册。

9. 配置文件扩展

类 用途
ServerUtilitiesConfig 主配置,GTNHLib @Config 驱动
AuroraConfig Aurora Web 服务器配置,@Config.ExcludeFromAutoGui
ServerUtilitiesClientConfig 客户端配置

三者都在 core/ServerUtilitiesCore 的静态初始化块中注册(ServerUtilitiesCore.java:22-26)—— 即在 FML 最早的 coremod 阶段,而非 mod 构造阶段:

static {
    removeBrigadierExceptions();
    ConfigurationManager.registerConfig(ServerUtilitiesConfig.class);
    ConfigurationManager.registerConfig(AuroraConfig.class);
}

10. 第三方扩展点

扩展点 入口 关联条目
事件钩子(8 个) MinecraftForge.EVENT_BUS 事件 API
权限处理器替换 PermissionAPI.setPermissionHandler 权限节点
rank 处理器替换 RegisterRankConfigHandlerEvent.setHandler 事件 API
物品 / 设备 API 见 InvSeeRegistry Invsee

无 API 边界

gradle.properties 中 apiPackage = 为空,apiPackage 的注释写明「In case your mod provides an API for other mods to implement you may declare its package here. Otherwise, you can leave this property empty.」(gradle.properties)—— 本模组没有声明正式 API 包。

同时 InvSeeRegistry 用 @ApiStatus.AvailableSince("2.4.0") 标注了版本可见性,而 ServerUtilitiesPermissions 里的 public static final Collection<NodeEntry> CUSTOM_PERM_PREFIX(:39)、earlyPermissions(:41)与 4 个白/黑名单 Set(:81-83)均为 public 可变集合,外部模组可直接改写。

相关条目