开放 API
KaLogin 向其他插件开放登录、注册、改密、登出等认证事件,供接入方在不直接操作数据库的前提下感知认证状态。
注意:KaLogin 的认证回调不是 Bukkit Event 子类,必须通过
KaLoginListener接口实现,不能使用@EventHandler。唯一的例外是跨服落点用的 Bukkit 事件PlayerAuthenticationReadyEvent,见下文。
引入方式#
把 KaLogin 作为软依赖引入,不要打包进你的插件:
dependencies {
compileOnly(fileTree("libs") { include("KaLogin-1.5.2.jar") })
}
在你的插件的 plugin.yml 中添加软依赖:
softdepend:
- KaLogin
获取 API 实例#
KaLoginAPI 是惰性单例,getInstance() 永远不返回 null;是否可用请用 isEnabled() 判断:
val api = KaLoginAPI.getInstance()
if (api != null && api.isEnabled()) {
// KaLogin 已启用
}
注册监听器#
在 onEnable() 中注册,在 onDisable() 中注销:
class MyPlugin(private val plugin: Plugin) : Listener {
private var listener: MyKaLoginListener? = null
override fun onEnable() {
val api = KaLoginAPI.getInstance() ?: return
if (!api.isEnabled()) return
listener = MyKaLoginListener(plugin)
api.registerListener(this, listener!!)
}
override fun onDisable() {
val api = KaLoginAPI.getInstance() ?: return
listener?.let { api.unregisterListener(this, it) }
}
}
class MyKaLoginListener(private val plugin: Plugin) : KaLoginListener {
override fun onPlayerLoginSuccess(event: PlayerLoginSuccessEvent) {
plugin.logger.info("玩家 ${event.player.name} 登录成功")
}
override fun onPlayerProxyRestore(event: PlayerProxyRestoreEvent) {
plugin.logger.info("玩家 ${event.player.name} 通过群组会话恢复登录")
}
}
监听器回调#
KaLoginListener 的所有方法都有默认空实现,只覆写你需要的即可。
| 回调 | 触发时机 |
|---|---|
onPlayerLoginSuccess |
密码校验通过、登录成功 |
onPlayerLoginFailed |
密码错误导致本次登录失败 |
onPlayerAutoLogin |
同 IP 自动登录成功 |
onPlayerProxyRestore |
通过 KaProxy 群组会话在目标服免密恢复登录态 |
onPlayerRegisterSuccess |
注册成功 |
onPlayerRegisterFailed |
注册失败 |
onPlayerChangePasswordSuccess |
修改密码成功 |
onPlayerChangePasswordFailed |
修改密码失败 |
onPlayerLogout |
玩家登出 |
onPlayerUnregister |
玩家注销自己的账户 |
onPlayerAdminUnregister |
管理员注销玩家账户 |
事件对象#
| 事件 | 字段 |
|---|---|
PlayerLoginSuccessEvent |
player、ip、isAutoLogin |
PlayerLoginFailedEvent |
player、remainingAttempts |
PlayerAutoLoginEvent |
player、ip |
PlayerProxyRestoreEvent |
player、ip |
PlayerRegisterSuccessEvent |
player、ip |
PlayerRegisterFailedEvent |
player、reason |
PlayerChangePasswordSuccessEvent |
player |
PlayerChangePasswordFailedEvent |
player、reason |
PlayerLogoutEvent |
player |
PlayerUnregisterEvent |
player |
PlayerAdminUnregisterEvent |
playerName |
认证就绪事件(跨服落点用)#
PlayerAuthenticationReadyEvent 是标准的 Bukkit 事件,在认证收尾(含可选的上次位置本地应用)完成后触发,适合跨服落点、传送类插件等待认证结束:
class MyArrivalListener : Listener {
@EventHandler
fun onAuthenticationReady(event: PlayerAuthenticationReadyEvent) {
val player = event.player
// 此时认证已完成,可以安全执行传送等操作
}
}
它在内置模式、AuthMe 模式、手动登录、自动登录与跨服恢复五种情况下都会触发,未启用 last-seen 时同样触发。
该事件只表示本服认证收尾完成,不保证代理端异步的 last-seen 后续切服已结束;跨服落点仍需各自的确认机制。
常用 API 方法#
| 方法 | 说明 |
|---|---|
isPlayerLoggedIn(player: Player) |
判断玩家是否已通过认证;AuthMe 模式下按 AuthMe 的登录态判断 |
isPlayerLoggedIn(playerName: String) |
同上,按玩家名判断 |
logout(player: Player, kickMessage: Component? = null) |
执行登出:触发登出事件、关闭同 IP 自动登录、在群组模式下由代理断开整组连接,未被代理接管时在本服踢出玩家 |
registerListener(plugin, listener) / unregisterListener(plugin, listener) |
注册与注销监听器 |
getListenerCount() |
当前已注册的监听器数量 |
isEnabled() |
KaLogin 是否处于启用状态 |
注意事项#
- 认证回调在玩家线程触发,回调里不要执行耗时数据库或网络操作。
events.login动作队列与KaLoginListener回调是两套机制:前者由config.yml的events配置驱动,后者供代码调用;是否执行同 IP 自动登录的动作由login.execute-events-on-auto-login决定,是否重放跨服恢复的动作由proxy.replay-login-actions决定。- 跨服恢复与同 IP 自动登录是两个不同事件:前者是
onPlayerProxyRestore,后者是onPlayerAutoLogin。