LiteLevels - 轻量级自定义等级系统
为你的Minecraft服务器打造独特的RPG体验!
插件简介
LiteLevels是一个功能强大且轻量级的自定义等级系统插件,专为Paper 1.20.1服务器设计。它完全替代了原版的经验系统,为玩家提供更加丰富和有趣的成长体验。
✨ 核心特色
完全自定义的等级系统
- 替代原版经验机制,提供更灵活的等级设计
- 支持自定义每级所需经验值
- 智能拦截原版经验获取,无缝转换为自定义系统
独特的魔法值系统
- 每个等级拥有不同的魔法值上限
- 支持魔法值加成和动态调整
- 为魔法类插件提供完美的数值基础
❤️
生命值加成系统
- 等级越高,生命值越多
- 可配置的生命值加成曲线
- 让玩家真正感受到成长的力量
强大的数据持久化
- 支持SQLite和MySQL双数据库
- 自动保存机制,数据安全有保障
完善的API支持
- 为其他插件提供丰富的API接口
- 集成PlaceholderAPI,支持7个实用占位符
- 模块化设计,易于扩展和集成
游戏体验
玩家成长之旅
新手阶段 (1-3级)
- 快速成长,体验升级的乐趣
- 每次升级都有明显的属性提升
- 精美的升级提示和音效
进阶阶段 (4-7级)
- ⚔️ 更强的战斗能力
- 丰富的魔法值支持
- ️ 显著的生命值加成
大师阶段 (8-10级)
- 成为服务器的顶尖玩家
- 强大的属性加成
- 独特的成就感和荣誉
数值系统设计
等级
所需经验
魔法值上限
生命值加成
1级 100 50 +2❤️
2级 200 60 +4❤️
3级 300 70 +6❤️
5级 800 100 +10❤️
10级 4000 220 +20❤️
快速开始
系统要求
- ✅ 服务端: Paper 1.20.1 或更高版本
- ✅ Java版本: Java 17+
- ✅ 可选依赖: PlaceholderAPI (用于占位符功能)
安装步骤
- 下载插件
将 LiteLevels.jar 放入服务器的 plugins 文件夹
- 启动服务器
插件会自动生成配置文件和数据库
- 配置插件
编辑 plugins/LiteLevels/config.yml 进行个性化设置
- 重载配置
/ll reload
⚙️ 基础配置
config.yml 核心设置
Code (YAML):
# LiteLevels 配置文件
# 版本: 1.0.0
# 调试模式
debug
: false
# 等级系统设置
level-system
:
# 每级所需经验值列表 (从1级开始)
exp-requirements
:
- 100.0
# 1级需要100经验
- 200.0
# 2级需要200经验
- 300.0
# 3级需要300经验
- 500.0
# 4级需要500经验
- 800.0
# 5级需要800经验
- 1200.0
# 6级需要1200经验
- 1700.0
# 7级需要1700经验
- 2300.0
# 8级需要2300经验
- 3000.0
# 9级需要3000经验
- 4000.0
# 10级需要4000经验
# 每级魔法值上限列表
magic-limits
:
- 50.0
# 1级魔法值上限50
- 60.0
# 2级魔法值上限60
- 70.0
# 3级魔法值上限70
- 85.0
# 4级魔法值上限85
- 100.0
# 5级魔法值上限100
- 120.0
# 6级魔法值上限120
- 140.0
# 7级魔法值上限140
- 165.0
# 8级魔法值上限165
- 190.0
# 9级魔法值上限190
- 220.0
# 10级魔法值上限220
# 每级生命值加成列表
health-bonus
:
- 2.0
# 1级生命值加成2
- 4.0
# 2级生命值加成4
- 6.0
# 3级生命值加成6
- 8.0
# 4级生命值加成8
- 10.0
# 5级生命值加成10
- 12.0
# 6级生命值加成12
- 14.0
# 7级生命值加成14
- 16.0
# 8级生命值加成16
- 18.0
# 9级生命值加成18
- 20.0
# 10级生命值加成20
# 是否启用生命值加成
enable-health-bonus
: false
# 最大等级
max-level
: 10
# 数据库配置
database
:
# 数据库类型: sqlite 或 mysql (默认: sqlite)
type
:
"sqlite"
# SQLite配置
sqlite
:
# 数据库文件名
file
:
"litelevels.db"
# MySQL配置
mysql
:
# 主机地址
host
:
"localhost"
# 端口
port
: 3306
# 数据库名
database
:
"litelevels"
# 用户名
username
:
"root"
# 密码
password
:
"password"
# 是否使用SSL
use-ssl
: false
# 连接池配置
pool
:
# 最大连接数
max-connections
: 10
# 最小连接数
min-connections
: 2
# 连接超时时间(秒)
connection-timeout
: 30
# 数据保存设置
data-save
:
# 自动保存间隔(秒) - 0表示禁用自动保存
auto-save-interval
: 300
# 玩家退出时是否立即保存
save-on-quit
: true
# 服务器关闭时是否保存所有数据
save-on-shutdown
: true
功能详解
玩家命令
命令
描述
权限
/ll info 查看自己的等级信息 litelevels.use
/ll give <经验值> 给自己添加经验 litelevels.give
管理员命令
命令
描述
权限
/ll set <玩家> <等级> [经验%] 设置玩家等级 litelevels.admin
/ll reload 重载配置文件 litelevels.admin
/ll save 手动保存所有数据 litelevels.admin
️ PlaceholderAPI占位符
占位符
描述
示例
%ll_currentexp% 当前经验值 150
%ll_currentlevel% 当前等级 5
%ll_currentmagic% 当前魔法值 80
%ll_currenthealth% 当前生命值 24
%ll_maxexp% 最大经验值 800
%ll_maxmagic% 最大魔法值 100
%ll_maxhealth% 最大生命值 30
开发者API
API使用示例
Code (Java):
public
class LiteLevelsAPI
{
private
static ConfigManager configManager
;
/**
* 初始化API(内部使用)
*/
static
{
if
(LiteLevels.
getInstance
(
)
!=
null
)
{
configManager
= LiteLevels.
getInstance
(
).
getConfigManager
(
)
;
}
}
// ==================== 数据获取方法 ====================
/**
* 获取玩家等级数据
* 统一的数据获取方法,供所有其他方法调用
*
* @param player 玩家
* @return 玩家等级数据,如果玩家不在线或数据不存在则返回null
*/
public
static PlayerLevelData getPlayerData
(Player player
)
{
if
(player
==
null
||
!player.
isOnline
(
)
)
{
return
null
;
}
UUID playerId
= player.
getUniqueId
(
)
;
return PlayerLevelData.
playerDataMap.
get
(playerId
)
;
}
/**
* 检查玩家数据是否已加载
*
* @param player 玩家
* @return 如果数据已加载则返回true
*/
public
static
boolean isDataLoaded
(Player player
)
{
return getPlayerData
(player
)
!=
null
;
}
// ==================== 等级相关方法 ====================
/**
* 获取玩家等级
*
* @param player 玩家
* @return 玩家等级,如果数据不存在则返回0
*/
public
static
int getLevel
(Player player
)
{
PlayerLevelData data
= getPlayerData
(player
)
;
return data
!=
null
? data.
getLevel
(
)
:
0
;
}
/**
* 设置玩家等级
* 使用统一的LevelUtil方法
*
* @param player 玩家
* @param level 等级
*/
public
static
void setLevel
(Player player,
int level
)
{
if
(
!isDataLoaded
(player
)
)
{
MessageUtil.
logWarning
(
"尝试为未加载数据的玩家设置等级: "
+ player.
getName
(
)
)
;
return
;
}
LevelUtil.
setLevel
(player, level
)
;
}
/**
* 获取最大等级
*
* @return 系统设定的最大等级
*/
public
static
int getMaxLevel
(
)
{
return configManager
!=
null
? configManager.
getMaxLevel
(
)
:
10
;
}
// ==================== 经验相关方法 ====================
/**
* 获取玩家当前经验值
*
* @param player 玩家
* @return 当前经验值,如果数据不存在则返回0
*/
public
static
double getCurrentExp
(Player player
)
{
PlayerLevelData data
= getPlayerData
(player
)
;
return data
!=
null
? data.
getCurrentExp
(
)
:
0.0
;
}
/**
* 获取指定等级所需的经验值
*
* @param level 等级
* @return 所需经验值
*/
public
static
double getRequiredExp
(
int level
)
{
return configManager
!=
null
? configManager.
getRequiredExp
(level
)
:
100.0
;
}
/**
* 获取玩家当前等级所需的经验值
*
* @param player 玩家
* @return 当前等级所需经验值
*/
public
static
double getRequiredExp
(Player player
)
{
int level
= getLevel
(player
)
;
return getRequiredExp
(level
)
;
}
/**
* 设置玩家当前经验值
* 使用统一的LevelUtil方法
*
* @param player 玩家
* @param exp 经验值
*/
public
static
void setCurrentExp
(Player player,
double exp
)
{
if
(
!isDataLoaded
(player
)
)
{
MessageUtil.
logWarning
(
"尝试为未加载数据的玩家设置经验: "
+ player.
getName
(
)
)
;
return
;
}
LevelUtil.
setCurrentExp
(player, exp
)
;
}
/**
* 给玩家添加经验值
* 使用统一的LevelUtil方法
*
* @param player 玩家
* @param exp 经验值
*/
public
static
void addExp
(Player player,
double exp
)
{
if
(
!isDataLoaded
(player
)
)
{
MessageUtil.
logWarning
(
"尝试为未加载数据的玩家添加经验: "
+ player.
getName
(
)
)
;
return
;
}
LevelUtil.
addExp
(player, exp,
false
)
;
}
/**
* 给玩家添加经验值(强制,跳过事件检查)
* 使用统一的LevelUtil方法
*
* @param player 玩家
* @param exp 经验值
*/
public
static
void addExpForce
(Player player,
double exp
)
{
if
(
!isDataLoaded
(player
)
)
{
MessageUtil.
logWarning
(
"尝试为未加载数据的玩家强制添加经验: "
+ player.
getName
(
)
)
;
return
;
}
LevelUtil.
addExp
(player, exp,
true
)
;
}
// ==================== 魔法相关方法 ====================
/**
* 获取玩家魔法值
*
* @param player 玩家
* @return 魔法值,如果数据不存在则返回0
*/
public
static
double getMagic
(Player player
)
{
PlayerLevelData data
= getPlayerData
(player
)
;
return data
!=
null
? data.
getMagic
(
)
:
0.0
;
}
/**
* 获取玩家最大魔法值
* 使用统一的LevelUtil方法
*
* @param player 玩家
* @return 最大魔法值
*/
public
static
double getMaxMagic
(Player player
)
{
return LevelUtil.
getMaxMagic
(player
)
;
}
/**
* 获取指定等级的魔法值上限
*
* @param level 等级
* @return 魔法值上限
*/
public
static
double getMagicLimit
(
int level
)
{
return configManager
!=
null
? configManager.
getMagicLimit
(level
)
:
50.0
;
}
/**
* 设置玩家魔法值
* 使用统一的LevelUtil方法
*
* @param player 玩家
* @param magic 魔法值
*/
public
static
void setMagic
(Player player,
double magic
)
{
if
(
!isDataLoaded
(player
)
)
{
MessageUtil.
logWarning
(
"尝试为未加载数据的玩家设置魔法值: "
+ player.
getName
(
)
)
;
return
;
}
LevelUtil.
setMagic
(player, magic
)
;
}
/**
* 给玩家添加魔法值
* 使用统一的LevelUtil方法
*
* @param player 玩家
* @param magic 魔法值
*/
public
static
void addMagic
(Player player,
double magic
)
{
if
(
!isDataLoaded
(player
)
)
{
MessageUtil.
logWarning
(
"尝试为未加载数据的玩家添加魔法值: "
+ player.
getName
(
)
)
;
return
;
}
LevelUtil.
addMagic
(player, magic
)
;
}
// ==================== 生命值相关方法 ====================
/**
* 获取玩家最大血量
* 使用统一的LevelUtil方法
*
* @param player 玩家
* @return 最大血量
*/
public
static
double getMaxHealth
(Player player
)
{
return LevelUtil.
getMaxHealth
(player
)
;
}
/**
* 获取指定等级的生命值加成
*
* @param level 等级
* @return 生命值加成
*/
public
static
double getHealthBonus
(
int level
)
{
return configManager
!=
null
? configManager.
getHealthBonus
(level
)
:
0.0
;
}
/**
* 检查是否启用生命值加成
*
* @return 如果启用生命值加成则返回true
*/
public
static
boolean isHealthBonusEnabled
(
)
{
return configManager
!=
null
&& configManager.
isEnableHealthBonus
(
)
;
}
// ==================== 显示更新方法 ====================
/**
* 更新玩家经验条显示
* 使用统一的LevelUtil方法
*
* @param player 玩家
*/
public
static
void updateExpDisplay
(Player player
)
{
if
(
!isDataLoaded
(player
)
)
{
return
;
}
LevelUtil.
updateExpDisplay
(player
)
;
}
/**
* 更新玩家生命值
* 使用统一的LevelUtil方法
*
* @param player 玩家
*/
public
static
void updatePlayerHealth
(Player player
)
{
PlayerLevelData data
= getPlayerData
(player
)
;
if
(data
!=
null
)
{
LevelUtil.
updatePlayerHealth
(player, data
)
;
}
}
// ==================== 工具方法 ====================
/**
* 获取玩家等级进度百分比
*
* @param player 玩家
* @return 进度百分比 (0.0 - 100.0)
*/
public
static
double getLevelProgress
(Player player
)
{
PlayerLevelData data
= getPlayerData
(player
)
;
if
(data
==
null
)
{
return
0.0
;
}
double currentExp
= data.
getCurrentExp
(
)
;
double requiredExp
= getRequiredExp
(player
)
;
if
(requiredExp
<=
0
)
{
return
100.0
;
}
return
Math.
min
(
100.0,
(currentExp
/ requiredExp
)
*
100.0
)
;
}
/**
* 检查玩家是否达到最大等级
*
* @param player 玩家
* @return 如果达到最大等级则返回true
*/
public
static
boolean isMaxLevel
(Player player
)
{
return getLevel
(player
)
>= getMaxLevel
(
)
;
}
/**
* 获取升级到下一级还需要的经验值
*
* @param player 玩家
* @return 还需要的经验值,如果已达到最大等级则返回0
*/
public
static
double getExpToNextLevel
(Player player
)
{
if
(isMaxLevel
(player
)
)
{
return
0.0
;
}
double currentExp
= getCurrentExp
(player
)
;
double requiredExp
= getRequiredExp
(player
)
;
return
Math.
max
(
0.0, requiredExp
- currentExp
)
;
}
}
个性化定制
消息自定义
所有玩家可见的消息都可以在 message.yml 中自定义:
Code (YAML):
# LiteLevels 消息配置文件
# 版本: 1.0.0
# 系统消息
system:
plugin-enabled
:
"&a[LiteLevels] 插件已成功启动!"
plugin-disabled
:
"&c[LiteLevels] 插件已关闭!"
reload-success
:
"&a[LiteLevels] 配置文件重载成功!"
reload-failed
:
"&c[LiteLevels] 配置文件重载失败!"
data-loaded
:
"&a玩家数据已加载完成!"
data-saved
:
"&a玩家数据已保存!"
# 等级系统消息
level:
level-up
:
"&c[系统]&a恭喜你升级到了&b&l{level}&a级!"
max-level-reached
:
"&c[系统]&a已经达到系统设定的最大等级!"
exp-gained
:
"&a获得经验值: &e&l{exp}"
current-level
:
"&a当前等级: &b&l{level}"
current-exp
:
"&a当前经验: &e&l{current_exp}&a/&e&l{required_exp}"
current-magic
:
"&a当前魔法值: &d&l{current_magic}&a/&d&l{max_magic}"
# 命令消息
command:
no-permission
:
"&c你没有权限执行此命令!"
player-only
:
"&c此命令只能由玩家执行!"
unknown-command
:
"&c未知命令! 使用 /litelevels help 查看帮助"
player-not-found
:
"&c玩家不存在或不在线!"
invalid-number
:
"&c请输入有效的数字!"
level-set-success
:
"&a已成功设置玩家&c&l{player}&a的等级为&b&l{level}&a级!"
exp-set-success
:
"&a已成功设置玩家&c&l{player}&a的经验为&e&l{exp}!"
exp-give-success
:
"&a已为你添加经验&e&l{exp}!"
magic-set-success
:
"&a已成功设置玩家&c&l{player}&a的魔法值为&d&l{magic}!"
# 帮助信息
help:
header
:
"&6========== LiteLevels 帮助 =========="
footer
:
"&6=================================="
commands
:
-
"&a/ll info &7- 查看自己的等级信息"
-
"&a/ll set <玩家> <等级> [经验百分比] &7- 设置玩家等级"
-
"&a/ll give <经验值> &7- 给自己添加经验"
-
"&a/ll reload &7- 重载配置文件"