欢迎查阅 AkariLevel 公开文档
A1: 请先追踪你想要在经验条上显示的等级组。
使用命令 /AkariLevel Trace 等级组编辑名
可以将指定等级组的升级进度显示在原版经验条上。
在 settings.yml
中,你可以设置玩家在进入服务器时默认追踪的等级组。
只需将 Trace.Default
配置项的值更改为指定等级组的编辑名(示例配置为Example)即可。
#########
# Trace #
#########
# 等级组追踪设置
Trace:
# 是否保留原版等级系统
# 该功能开启后将不会取消原版经验变化事件,但需注意关闭等级组的追踪功能
Vanilla: false
# 失去追踪焦点时返回的默认等级组 (此项留空则不会进行追踪)
# Default: "Example"
Default: "Example"
# 是否在玩家每次进入服务器时重置追踪的等级组
Auto-Reset: true
A2: 等级组编辑名
是等级组的唯一标识符。
它是 level 文件夹中每个配置文件第一级节点的名称。
例如,在名为 CustomLevel.yml
的配置文件中创建一个名为 LevelGroup
的等级组。
LevelGroup:
Display: "等级组展示名"
...
该等级组的编辑名是 LevelGroup
而非 CustomLevel
或 等级组展示名
。
A3: 请使用解压软件打开 AkariLevel.jar
,删除其中的 kotlin
、kotlin1922
文件夹并保存。
A4: Kether 是 TabooLib 框架中内置的脚本语言,由 海螺先生 创造。
可以轻松实现诸多功能(如:发送动作栏或标题信息、改变玩家游戏模式、获取变量等等),它还拥有良好的拓展
API,能让其他开发者更加轻松地开发出自己的动作语句。
想要在 Kether 中执行命令,你可以尝试像这样写:
command inline "give {{ sender }} apple 1" as op
inline
是内联脚本语句,可以在一条语句中执行另一条语句并返回结果。sender
是一条语句,它会返回脚本执行者的名称。papi "%player_name%"
是一条语句,它会返回变量 %player_name%
的值。title inline "玩家名称:{{ papi %player_name% }}"
A5: 使用 color
语句处理文本,例如:
tell inline "{{ color '&{#4C88E4}Hex&{#98F5F9}Color' }}"
A6: 使用 if-else
语句进行更复杂的逻辑判断,例如:
Condition:
- |
if permission level.premium then {
if xxx then {
xxx
true
} else {
xxx
false
}
} else {
if xxx then {
xxx
true
} else {
xxx
false
}
}
A7: 使用 toFixed()
函数进行四舍五入运算,例如:
(12.5).toFixed()
(Math.sin(1)*100).toFixed()
<> - 必填项 [] - 选填项
/akarilevel - 插件主命令
/akarilevel exp add <玩家名称> <等级组编辑名> <数值> [命令参数] - 给予玩家指定数值的经验
/akarilevel exp remove <玩家名称> <等级组编辑名> <数值> [命令参数] - 移除玩家指定数值的经验
/akarilevel exp set <玩家名称> <等级组编辑名> <数值> [命令参数] - 设置玩家指定数值的经验
/akarilevel exp check <玩家名称> <等级组编辑名> - 查询玩家经验
/akarilevel level add <玩家名称> <等级组编辑名> <数值> [命令参数] - 给予玩家指定数值的等级
/akarilevel level remove <玩家名称> <等级组编辑名> <数值> [命令参数] - 移除玩家指定数值的等级
/akarilevel level set <玩家名称> <等级组编辑名> <数值> [命令参数] - 设置玩家指定数值的等级
/akarilevel level check <玩家名称> <等级组编辑名> - 查询玩家等级
/akarilevel data get <表> <索引> <键> - 获取指定表中某索引下某键的值
/akarilevel data set <表> <索引> <键> <值> - 设置指定表中某索引下某键的值
/akarilevel levelup [等级组编辑名] - 尝试进行升级
/akarilevel trace <等级组编辑名> [命令参数] - 尝试追踪指定等级组
/akarilevel reload - 重载插件配置
命令参数格式:
-k
-k v
-k=v
--key
--key value
--key=value
(其中 k 及 key 是参数名,v 及 value 是参数值)
/akarilevel exp
· silent - 关闭命令提示
· source - PlayerExpChangeEvent 经验来源
/akarilevel exp add
· sourceCheck - 检查指定经验来源是否在等级组订阅来源列表中
· toAllLevelGroup - 将该经验给予操作的等级组参数由指定等级组更改为所有等级组 (带有来源检查)
/akarilevel level
· silent - 关闭命令提示
· noAction - 修改等级而不执行对应等级的 Kether 动作
· source - PlayerLevelChangeEvent 等级来源
/akarilevel trace
· silent - 关闭命令提示
例如:
/akarilevel exp add PlayerName Example 100 --source=VANILLA_EXP_CHANGE --sourceCheck
该命令将会检查 Example 等级组是否订阅了 VANILLA_EXP_CHANGE
经验来源。
如果指定来源在订阅列表中,则会为玩家 PlayerName 增加 100 点 Example 等级组的经验。否则将不会执行经验给予操作。
akarilevel.command.akarilevel.use - 命令使用权限
akarilevel.admin - 管理员命令权限
akarilevel.default - 玩家命令权限
%AkariLevel_<等级组编辑名>_Display% - 等级组展示名
%AkariLevel_<等级组编辑名>_MaxLevel% - 等级组最高等级
%AkariLevel_<等级组编辑名>_Level% - 玩家当前等级
%AkariLevel_<等级组编辑名>_LastLevel% - 玩家当前等级的上一个等级
%AkariLevel_<等级组编辑名>_NextLevel% - 玩家当前等级的下一个等级
%AkariLevel_<等级组编辑名>_Exp% - 玩家当前经验值
%AkariLevel_<等级组编辑名>_LevelName% - 玩家当前等级名称
%AkariLevel_<等级组编辑名>_LastLevelName% - 玩家当前等级上一个等级的名称
%AkariLevel_<等级组编辑名>_NextLevelName% - 玩家当前等级下一个等级的名称
%AkariLevel_<等级组编辑名>_LevelExp% - 升级到玩家当前等级所需经验值
%AkariLevel_<等级组编辑名>_LastLevelExp% - 升级到玩家当前等级的上一个等级所需经验值
%AkariLevel_<等级组编辑名>_NextLevelExp% - 升级到玩家当前等级的下一个等级所需经验值
%AkariLevel_<等级组编辑名>_ExpProgressBar% - 玩家当前经验 / 升至下一级所需经验 的进度条
%AkariLevel_<等级组编辑名>_LevelProgressBar% - 玩家当前等级 / 最高等级 的进度条
%AkariLevel_<等级组编辑名>_ExpProgressPercent% - 玩家当前经验 / 升至下一级所需经验 的进度百分比 (0 到 100 之间的整数)
%AkariLevel_<等级组编辑名>_LevelProgressPercent% - 玩家当前等级 / 最高等级 的进度百分比 (0 到 100 之间的整数)
其中,可使用 Trace
代替 <等级组编辑名>
以获取玩家正在追踪的等级组相应变量。
例如:%AkariLevel_Trace_Level%
您可以在 MythicMobs 中配置 AkariExp 经验的掉落:
Drops:
- AkariExp.<等级组编辑名> 经验值数量 掉落几率
完整示例:
示例怪物:
Type: ZOMBIE
Display: '示例怪物'
Health: 5
Damage: 0
Drops:
- AkariExp.Example 10 1
- AkariExp.Example 5 0.5
Options:
MovementSpeed: 0.1
AlwaysShowName: true
PreventOtherDrops: true
MaxCombatDistance: 12
FollowRange: 6
Modules:
ThreatTable: true
需要注意的是,对应等级组需要订阅 MYTHICMOBS_DROP_EXP
经验来源才可以接收到 MythicMobs 掉落的经验。
Source:
Subscribe:
- "MYTHICMOBS_DROP_EXP"
插件反馈交流群: 704109949
插件下载: https://qm.qq.com/q/2Ii6fBsicE
Kether脚本动作列表: https://kether.tabooproject.org/list.html
com.github.cpjinan.plugin.akarilevel.api.PlayerAPI
/**
* 获取指定玩家某等级组下的数据
* @param player 玩家
* @param levelGroup 等级组编辑名
* @return 玩家数据
*/
fun getPlayerData(player: Player, levelGroup: String): PlayerData = getData(player, levelGroup)
/**
* 设置指定玩家某等级组下的数据
* @param player 玩家
* @param levelGroup 等级组编辑名
* @param playerData 玩家数据
*/
fun setPlayerData(player: Player, levelGroup: String, playerData: PlayerData) {
setData(player, levelGroup, playerData)
}
/**
* 获取指定玩家某等级组下的等级
* @param player 玩家
* @param levelGroup 等级组编辑名
* @return 等级数值
*/
fun getPlayerLevel(player: Player, levelGroup: String): Long = getLevel(player, levelGroup)
/**
* 获取指定玩家某等级组下的经验
* @param player 玩家
* @param levelGroup 等级组编辑名
* @return 经验数值
*/
fun getPlayerExp(player: Player, levelGroup: String): Long = getExp(player, levelGroup)
/**
* 设置指定玩家某等级组下的等级并触发该等级升级执行动作
* @param player 玩家
* @param levelGroup 等级组编辑名
* @param amount 等级数值
* @param source PlayerLevelChangeEvent 事件来源
*/
fun setPlayerLevel(player: Player, levelGroup: String, amount: Long, source: String) {
setLevel(player, levelGroup, amount, source)
runAction(player, levelGroup, amount)
refreshLevel(player, levelGroup)
}
/**
* 增加指定玩家某等级组下的等级并触发该等级升级执行动作
* @param player 玩家
* @param levelGroup 等级组编辑名
* @param amount 等级数值
* @param source PlayerLevelChangeEvent 事件来源
*/
fun addPlayerLevel(player: Player, levelGroup: String, amount: Long, source: String) {
val targetLevel = (getLevel(player, levelGroup) + amount).coerceAtMost(getLevelGroupData(levelGroup).maxLevel)
setLevel(player, levelGroup, targetLevel, source)
runAction(player, levelGroup, targetLevel)
refreshLevel(player, levelGroup)
}
/**
* 移除指定玩家某等级组下的等级并触发该等级升级执行动作
* @param player 玩家
* @param levelGroup 等级组编辑名
* @param amount 等级数值
* @param source PlayerLevelChangeEvent 事件来源
*/
fun removePlayerLevel(player: Player, levelGroup: String, amount: Long, source: String) {
val targetLevel = (getLevel(player, levelGroup) - amount).coerceAtLeast(0)
setLevel(player, levelGroup, targetLevel, source)
runAction(player, levelGroup, targetLevel)
refreshLevel(player, levelGroup)
}
/**
* 设置指定玩家某等级组下的等级而不触发该等级升级执行动作
* @param player 玩家
* @param levelGroup 等级组编辑名
* @param amount 等级数值
* @param source PlayerLevelChangeEvent 事件来源
*/
fun setPlayerLevelWithoutAction(player: Player, levelGroup: String, amount: Long, source: String) {
setLevel(player, levelGroup, amount, source)
refreshLevel(player, levelGroup)
}
/**
* 增加指定玩家某等级组下的等级而不触发该等级升级执行动作
* @param player 玩家
* @param levelGroup 等级组编辑名
* @param amount 等级数值
* @param source PlayerLevelChangeEvent 事件来源
*/
fun addPlayerLevelWithoutAction(player: Player, levelGroup: String, amount: Long, source: String) {
setLevel(player, levelGroup, getLevel(player, levelGroup) + amount, source)
refreshLevel(player, levelGroup)
}
/**
* 移除指定玩家某等级组下的等级的而不触发该等级升级执行动作
* @param player 玩家
* @param levelGroup 等级组编辑名
* @param amount 等级数值
* @param source PlayerLevelChangeEvent 事件来源
*/
fun removePlayerLevelWithoutAction(player: Player, levelGroup: String, amount: Long, source: String) {
setLevel(player, levelGroup, (getLevel(player, levelGroup) - amount).coerceAtLeast(0), source)
refreshLevel(player, levelGroup)
}
/**
* 设置指定玩家某等级组下的经验
* @param player 玩家
* @param levelGroup 等级组编辑名
* @param amount 经验数值
* @param source PlayerExpChangeEvent 事件来源
*/
fun setPlayerExp(player: Player, levelGroup: String, amount: Long, source: String) {
setExp(player, levelGroup, amount, source)
refreshLevel(player, levelGroup)
}
/**
* 增加指定玩家所有等级组下的经验 (带有等级组是否订阅事件来源检查)
* @param player 玩家
* @param amount 经验数值
* @param source PlayerExpChangeEvent 事件来源
*/
fun addPlayerExp(player: Player, amount: Long, source: String) {
getLevelGroupNames().forEach {
if (source in getLevelGroupData(it).subscribeSource) {
setExp(player, it, getExp(player, it) + amount, source)
refreshLevel(player, it)
}
}
}
/**
* 增加指定玩家某等级组下的经验 (带有等级组是否订阅事件来源检查)
* @param player 玩家
* @param levelGroup 等级组编辑名
* @param amount 经验数值
* @param source PlayerExpChangeEvent 事件来源
*/
fun addPlayerExp(player: Player, levelGroup: String, amount: Long, source: String) {
if (source in getLevelGroupData(levelGroup).subscribeSource) {
setExp(player, levelGroup, getExp(player, levelGroup) + amount, source)
refreshLevel(player, levelGroup)
}
}
/**
* 增加指定玩家某等级组下的经验 (跳过等级组是否订阅事件来源检查)
* @param player 玩家
* @param levelGroup 等级组编辑名
* @param amount 经验数值
* @param source PlayerExpChangeEvent 事件来源
*/
fun addPlayerExpForce(player: Player, levelGroup: String, amount: Long, source: String) {
setExp(player, levelGroup, getExp(player, levelGroup) + amount, source)
refreshLevel(player, levelGroup)
}
/**
* 移除指定玩家某等级组下的经验
* @param player 玩家
* @param levelGroup 等级组编辑名
* @param amount 经验数值
* @param source PlayerExpChangeEvent 事件来源
*/
fun removePlayerExp(player: Player, levelGroup: String, amount: Long, source: String) {
setExp(player, levelGroup, (getExp(player, levelGroup) - amount).coerceAtLeast(0), source)
refreshLevel(player, levelGroup)
}
/**
* 刷新玩家所有等级组下的等级
* @param player 玩家
*/
fun refreshPlayerLevel(player: Player) {
getLevelGroupNames().forEach {
refreshLevel(player, it)
}
}
/**
* 刷新玩家指定等级组下的等级
* @param player 玩家
* @param levelGroup 等级组编辑名
*/
fun refreshPlayerLevel(player: Player, levelGroup: String) {
refreshLevel(player, levelGroup)
}
/**
* 检查玩家所有等级组是否满足升级条件并尝试升级
* @param player 玩家
*/
fun levelupPlayer(player: Player) {
getLevelGroupNames().forEach {
levelup(player, it)
}
}
/**
* 检查玩家指定等级组是否满足升级条件并尝试升级
* @param player 玩家
* @param levelGroup 等级组编辑名
*/
fun levelupPlayer(player: Player, levelGroup: String) {
levelup(player, levelGroup)
}
/**
* 获取玩家是否满足指定等级组升级条件
* @param player 玩家
* @param levelGroup 等级组编辑名
* @return 玩家是否满足指定等级组升级条件
*/
fun checkPlayerLevelupCondition(player: Player, levelGroup: String): Boolean = checkCondition(player, levelGroup)
/**
* 为玩家执行指定等级组下的某等级升级动作
* @param player 玩家
* @param levelGroup 等级组编辑名
* @param level 等级数值
*/
fun runPlayerLevelAction(player: Player, levelGroup: String, level: Long) {
runAction(player, levelGroup, level)
}
/**
* 获取玩家正在追踪的等级组
* @param player 玩家
* @return 等级组编辑名
*/
fun getPlayerTraceLevelGroup(player: Player): String = getTraceLvlGroup(player)
/**
* 设置玩家正在追踪的等级组
* @param player 玩家
* @param levelGroup 等级组编辑名
*/
fun setPlayerTraceLevelGroup(player: Player, levelGroup: String) {
setTraceLvlGroup(player, levelGroup)
}
/**
* 检查玩家是否满足指定等级组追踪条件
* @param player 玩家
* @param levelGroup 等级组编辑名
*/
fun checkPlayerTraceCondition(player: Player, levelGroup: String): Boolean = checkTraceCondition(player, levelGroup)
/**
* 为玩家执行指定等级组下的追踪动作
* @param player 玩家
* @param levelGroup 等级组编辑名
*/
fun runPlayerTraceAction(player: Player, levelGroup: String) {
runTraceAction(player, levelGroup)
}
com.github.cpjinan.plugin.akarilevel.api.LevelAPI
/**
* 获取等级组配置列表
* @return 等级组配置列表
*/
fun getLevelGroups(): HashMap<String, ConfigurationSection> = getLvlGroups()
/**
* 获取等级组编辑名列表
* @return 等级组名称列表
*/
fun getLevelGroupNames(): ArrayList<String> = getLvlGroupNames()
/**
* 获取等级组数据列表
* @return 等级组数据列表
*/
fun getLevelGroupData(): HashMap<String, LevelGroupData> = getLvlGroupData()
/**
* 获取指定等级组数据
* @param levelGroup 等级组编辑名
* @return 等级组数据
*/
fun getLevelGroupData(levelGroup: String): LevelGroupData = getLvlGroupData(levelGroup)
/**
* 获取指定等级组关键等级数据列表
* @param levelGroup 等级组编辑名
* @return 关键等级数据列表
*/
fun getKeyLevelData(levelGroup: String): HashMap<Long, LevelData> = getKeyLvlData(levelGroup)
/**
* 获取指定等级组某等级数据
* @param levelGroup 等级组编辑名
* @param level 等级
* @return 等级数据
*/
fun getLevelData(levelGroup: String, level: Long): LevelData = getLvlData(levelGroup, level)
/**
* 获取指定等级组某等级名称
* @param levelGroup 等级组编辑名
* @param level 等级
* @return 等级名称
*/
fun getLevelName(levelGroup: String, level: Long): String = getLvlName(levelGroup, level)
/**
* 获取指定等级组升级到某等级所需经验
* @param levelGroup 等级组编辑名
* @param level 等级
* @return 等级名称
*/
fun getLevelExp(levelGroup: String, level: Long): Long = getLvlExp(levelGroup, level)
/**
* 获取指定等级组升级到某等级所需条件列表
* @param levelGroup 等级组编辑名
* @param level 等级
* @return 升级条件列表
*/
fun getLevelCondition(levelGroup: String, level: Long): List<String> = getLvlCondition(levelGroup, level)
/**
* 获取指定等级组升级到某等级执行动作列表
* @param levelGroup 等级组编辑名
* @param level 等级
* @return 升级执行动作列表
*/
fun getLevelAction(levelGroup: String, level: Long): List<String> = getLvlAction(levelGroup, level)
com.github.cpjinan.plugin.akarilevel.api.DataAPI
/**
* 获取指定表中某索引下某键的值
* @param table 表名
* @param index 索引名
* @param key 键名
* @return 数据值
*/
fun getDataValue(table: String, index: String, key: String): String = getValue(table, index, key)
/**
* 设置指定表中某索引下某键的值
* @param table 表名
* @param index 索引名
* @param key 键名
* @param value 数据值
*/
fun setDataValue(table: String, index: String, key: String, value: String) {
setValue(table, index, key, value)
}
/**
* 保存数据 (使用 setDataValue 修改数据后会自动保存)
*/
fun saveData() {
save()
}
com.github.cpjinan.plugin.akarilevel.common.event
请使用开发版本作为依赖编写插件,否则可能会无法监听 AkariLevel 声明的事件。
/**
* 玩家经验变更事件
* @param player 玩家
* @param levelGroup 等级组编辑名
* @param expAmount 经验变化量 (经验减少时为负值)
* @param source 事件来源
* @author CPJiNan
* @since 2024/06/23
*/
class PlayerExpChangeEvent(
val player: Player,
var levelGroup: String,
var expAmount: Int,
var source: String
) :
BukkitProxyEvent()
/**
* 玩家经验变更事件
* @param player 玩家
* @param levelGroup 等级组编辑名
* @param oldLevel 更改前等级
* @param newLevel 更改后等级
* @param source 事件来源
* @author CPJiNan
* @since 2024/06/23
*/
class PlayerLevelChangeEvent(
val player: Player,
var levelGroup: String,
var oldLevel: Int,
var newLevel: Int,
var source: String
) :
BukkitProxyEvent()
💡 当你调用插件API时,通常需要声明该操作的来源,用于辨别事件发生的不同场景。
AkariLevel 中定义了部分事件来源:
PlayerExpChangeEvent
PlayerLevelChangeEvent
同时你也可以在自己编写的插件中声明其他来源,例如: