LiteLevels - 轻量级自定义等级系统
[​IMG]
[​IMG]

为你的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 (用于占位符功能)
安装步骤
  1. 下载插件

    将 LiteLevels.jar 放入服务器的 plugins 文件夹

  2. 启动服务器

    插件会自动生成配置文件和数据库

  3. 配置插件

    编辑 plugins/LiteLevels/config.yml 进行个性化设置

  4. 重载配置

    /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- 重载配置文件"
 
Resource Information
Author:
----------
Total Downloads: 137
First Release: May 29, 2025
Last Update: May 30, 2025
Category: ---------------
All-Time Rating:
0 ratings
Version -----
Released: --------------------
Downloads: ------
Version Rating:
----------------------
-- ratings