1. 实现 IPermissionHandler

是的,权限的注册和检查最终都是它来完成的。只需要正确实现它并通过 PermissionAPI 覆盖就可以影响权限检查的行为。

1.1. 但我需要实现 IPermissionHandler 吗?

很显然,IPermissionHandler 其实是用来实现更高级的权限管理的。想想 FTBUtils、LuckPerms、PermissionEX 的功能你就会明白了。如果你只需要支持权限控制,只需要在合适的时候调用 PermissionAPI.hasPermission,然后让用户使用某种专业的权限管理工具即可。即便不使用专业的管理工具,默认的基于 OP 概念的 IPermissionHandler 实现也够用了。

1.2. 装饰器模式

虽说任何 Mod 都可以覆盖当前生效的 IPermissionHandler,但把自己不能处理的行为代理给之前的 IPermissionHandler 总不是件坏事。当然,不走装饰器模式也无妨——这样你可以接管所有的权限控制。

public class MyPermissionHandler implements IPermissionHandler {

    private final IPermissionHandler parent;

    public MyPermissionHandler(IPermissionHandler parent) {
        this.parent = parent;
        // 其他初始化操作
    }
    // TODO Delegated methods
}

1.3. 设定当前 IPermissionHandler

IPermissionHandler 必须在 FMLPreInitializationEvent 发布或更早的时候配置到位。在此之后尝试设定 IPermissionHandler 会报错。

@Mod.EventHandler
public void onPreInit(FMLPreInitializationEvent event) {
    PermissionAPI.setPermissionHandler(new MyPermissionHandler(...));
}