👗 AdventureSkins

一、简介

AdventureSkins —— 一款功能完善的物品皮肤系统插件

AdventureSkins 让玩家通过 GUI 界面为手中的武器、工具、盔甲应用自定义皮肤外观,无需改变物品本身。支持虚拟皮肤(GUI点选应用)和物理皮肤(可交易的实体包装物品),以及拆包器移除皮肤。

AdventureSkins 支持 Paper 1.21.4+ 服务器(Java 21),完全自包含,不依赖外部库插件。

核心功能

  • 虚拟皮肤 > GUI 点选即可应用,权限控制
  • 卷轴皮肤 > 可交易的包装物品,拖放应用
  • 移除器 > 拖放到已装扮物品上移除皮肤
  • 皮肤预览 > 浮空旋转预览 / 手持预览
  • 盔甲仿冒 > 铁甲伪装钻石甲外观 + 假耐久
  • CraftEngine 集成 > 穿戴时显示自定义盔甲模型
  • Equippable 组件 > 1.21.4 原生装备模型替换
  • 纹饰 (Trim) > 皮肤可附加/移除盔甲纹饰
  • 动作系统 > 16 种动作类型,交互/攻击触发
  • 物品分组 > 一个皮肤覆盖多种物品类型
  • 收藏/过滤 > 玩家个性化 GUI 显示
  • MySQL + Redis > Velocity 跨服同步玩家偏好
  • 权限保护 > 12 个 Listener 全方位防护
  • PlaceholderAPI > 皮肤信息变量
  • ItemsAdder / Oraxen / Nexo > 第三方物品 Hook

二、插件前置说明

全部为可选,AdventureSkins 自身无硬性前置依赖

  • PlaceholderAPI — PAPI 变量支持
  • ItemsAdder — IA 自定义物品模型
  • Oraxen — Oraxen 自定义物品模型
  • Nexo — Nexo 自定义物品模型
  • CraftEngine — 自定义盔甲穿戴模型

📥 安装教程

  1. AdventureSkins-1.2.0.jar 放入 plugins/
  2. 启动服务器,自动生成默认配置和示例皮肤文件
  3. 编辑配置后 /skins reload 热重载
  4. 用 LuckPerms 为玩家/组分配皮肤权限

依赖说明

插件必需说明
Paper必需1.21.4+ 服务端
PlaceholderAPI可选占位符变量
ItemsAdder / Oraxen / Nexo可选自定义物品模型 Hook
CraftEngine可选穿戴自定义盔甲模型

文件结构

plugins/AdventureSkins/
├── config.yml              ← 全局设置 (含 storage 数据库配置)
├── messages.yml            ← 消息文本 (MiniMessage)
├── cosmetics/              ← 皮肤定义
│   └── allay.yml           ← 悦灵系列 (默认)
└── groups/                 ← 物品分组
    └── default_groups.yml  ← 默认分组

🚀 快速上手

第一步:创建皮肤配置

plugins/AdventureSkins/cosmetics/ 下创建 YAML 文件:

# my_skins.yml
enabled: true
items:
  DIAMOND_SWORD:
    styles:
      fire_sword:
        name: '<red>烈焰之剑 <gray>皮肤'
        id: '1001'
        permission: 'adventureskins.skin.fire_sword'
        lore:
          - '<gray>点击应用火焰剑皮肤'

第二步:设置权限

# LuckPerms 示例
lp group vip permission set adventureskins.gui true
lp group vip permission set adventureskins.skin.fire_sword true

第三步:使用

  1. 玩家手持钻石剑,输入 /skinsShift+右键
  2. 在 GUI 中点击皮肤图标即可应用
  3. 再次点击或使用移除器可移除皮肤

管理命令速查

/skins reload                    — 重载所有配置
/skins give <玩家> <皮肤ID>       — 给予卷轴皮肤
/skins remover <玩家>             — 给予移除器
/skins wrap <玩家> <皮肤ID>       — 直接为玩家应用皮肤
/skins unwrap <玩家>              — 直接移除玩家皮肤
/skins create                    — 从手持物品生成皮肤配置

⌨️ 命令列表

主命令 /skins

别名: /skin, /askins

命令权限说明
/skins help显示帮助
/skins reloadadventureskins.command.reload重载所有配置
/skins listadventureskins.command.list列出所有注册皮肤
/skins give <玩家> <皮肤ID>adventureskins.command.give给予卷轴皮肤
/skins remover <玩家>adventureskins.command.give给予皮肤移除器
/skins wrap <玩家> <皮肤ID>adventureskins.command.wrap为玩家手持物品应用皮肤
/skins unwrap <玩家>adventureskins.command.unwrap为玩家手持物品移除皮肤
/skins open <玩家>adventureskins.command.open为指定玩家打开皮肤GUI
/skins preview <皮肤ID>adventureskins.preview预览指定皮肤
/skins createadventureskins.command.create从手持物品反向生成配置

🔑 权限节点

基础权限

权限默认说明
adventureskins.gui所有人打开皮肤 GUI
adventureskins.shortcut所有人Shift+右键快捷打开
adventureskins.preview所有人预览皮肤

管理权限

权限默认说明
adventureskins.adminOP管理员总权限
adventureskins.command.reloadOP重载配置
adventureskins.command.giveOP给予卷轴皮肤/移除器
adventureskins.command.wrapOP为他人应用皮肤
adventureskins.command.unwrapOP为他人移除皮肤
adventureskins.command.listOP列出所有皮肤
adventureskins.command.openOP为他人打开GUI
adventureskins.command.createOP从手持物品生成配置

皮肤专属权限

每个皮肤可单独设置 permission 字段,格式自定义:

permission: 'adventureskins.skin.fire_sword'

玩家必须拥有该权限才能使用对应皮肤。未设置 permission 的皮肤任何人可用。

🖥️ GUI 界面

打开方式

  • 手持物品输入 /skins
  • 手持物品 Shift+右键 (可在 config 中关闭)
  • 管理员 /skins open <玩家>

GUI 功能

  • 分页浏览 — 皮肤数量多时自动分页
  • 目标物品槽 — 底部中间展示当前物品
  • 左键应用 — 点击皮肤图标立即应用
  • 右键预览 — 右键点击浮空预览效果
  • 收藏功能 — 标记常用皮肤,快速找到
  • 过滤功能 — 隐藏不想看的皮肤
  • 权限锁定 — 无权限的皮肤显示为锁定样式
  • 更换物品 — 拖入新物品切换目标

配置项

配置默认说明
inventory.title<red><bold>皮肤GUI 标题
inventory.rows6GUI 行数 (1-6)
inventory.target-item-slot49目标物品展示槽位
inventory.shortcut.enabledtrueShift+右键快捷开关
inventory.item-change-enabledtrueGUI 内更换目标物品
inventory.sort-orderPERMISSION, SORT_ID, MODEL_ID排序规则

🎨 皮肤配置

文件位置

皮肤定义文件放在 plugins/AdventureSkins/cosmetics/ 目录下,支持子目录。

每个 .yml 文件可包含多种物品类型的皮肤,顶层需有 enabled: trueitems: 节点。

完整字段参考

字段类型必填说明
nameStringGUI 中显示的名称 (MiniMessage)
idStringCustomModelData 数字 或 Hook ID
item-modelString1.21.4 item_model 标识符 (优先于 id)
permissionString使用权限节点
loreListGUI 图标描述
glowBooleanGUI 图标附魔发光
flagsListGUI 图标隐藏标志
sortInteger排序值 (越小越前)
previewBoolean允许预览 (默认 true)
locked-nameString无权限时的替代名称
locked-loreList无权限时的替代描述
colorString皮革甲染色 "R,G,B"
glint-overrideBoolean附魔光效覆盖
styled-nameString装扮后物品名称
styled-loreList装扮后物品描述
styled-lore-modeStringREPLACE / PREPEND / APPEND
styled-flagsList装扮后隐藏标志
styled-durabilityInteger装扮后假耐久值
tooltip-styleStringTooltip 样式 (1.21.4+)
craftengine-idStringCraftEngine 穿戴模型 ID
equippable-modelStringEquippable 装备模型
equippable-slotString装备槽位 (HEAD/CHEST/LEGS/FEET)
armor-imitationString盔甲仿冒材质
trimString纹饰图案
trim-materialString纹饰材质
remove-trimBoolean移除原有纹饰

通用皮肤 vs 单一皮肤

核心概念

皮肤分为通用皮肤(跨材质,如所有剑都能用)和单一皮肤(仅限指定材质)。两者在 AdventureSkins 和 CraftEngine 侧的配置要求不同。

通用皮肤(跨材质)

适用于一组物品(如木剑/石剑/铁剑/金剑),无论基础材质是什么都能正确显示模型。

配置项位置必须说明
item-modelASkins必须1.21.4 item_model 组件,材质无关,客户端按此路径渲染模型
材质键用分组名ASkins必须ALL_SWORDSBASIC_SWORDS,对应 groups/ 中定义的组
craftengine-idASkins盔甲必须让 CraftEngine 识别物品身份;盔甲穿戴渲染需要,武器可选
id (CMD)ASkins可选CustomModelData 兜底,本身材质绑定,不能单独实现跨材质
物品定义CraftEngine必须resources/<pack>/configuration/ 中定义物品及贴图
items/*.json资源包必须CraftEngine 自动生成 assets/<ns>/items/<id>.json,即 item-model 引用的目标

示例 — 通用剑皮肤:

# groups/default_groups.yml
collections:
  BASIC_SWORDS:
    - 'WOODEN_SWORD'
    - 'STONE_SWORD'
    - 'IRON_SWORD'
    - 'GOLDEN_SWORD'

# cosmetics/allay.yml
items:
  BASIC_SWORDS:              # <-- 使用分组名
    styles:
      allay_sword:
        name: '<aqua>悦灵之剑'
        id: 5001
        item-model: 'hmcwraps:allay_sword'       # <-- 跨材质核心
        craftengine-id: 'inkless:allay_sword'     # <-- CE 物品标识
        permission: 'adventureskins.allay.sword'
为什么 item-model 是核心?

1.21.4 的 item_model 组件直接告诉客户端用哪个模型渲染,完全不看物品底层材质。而 CustomModelData (id) 的模型覆盖是按材质分别定义的,铁剑上的 CMD 5001 和钻石剑上的 CMD 5001 指向不同模型——这就是为什么只用 id 无法跨材质。

单一皮肤(指定材质)

仅限特定材质使用,如"暗影悦灵之剑"只给钻石剑和下界合金剑。

配置项位置必须说明
材质键用具体材质ASkins必须DIAMOND_SWORDNETHERITE_SWORD
id (CMD)ASkins可单独使用资源包中同材质的 CMD 覆盖一定能匹配
item-modelASkins推荐更可靠,但单一材质下 CMD 也够用
craftengine-idASkins可选武器可选,盔甲推荐

示例 — 钻石剑专属皮肤:

items:
  DIAMOND_SWORD:              # <-- 直接用材质名
    styles:
      dark_allay_sword:
        name: '<dark_purple>暗影悦灵之剑'
        id: 5001                                  # <-- CMD 就够了
        item-model: 'hmcwraps:allay_sword'        # <-- 推荐但可选
        permission: 'adventureskins.dark_allay.sword'

对照速查表

通用皮肤单一皮肤
ASkins 材质键分组名 (BASIC_SWORDS)具体材质 (DIAMOND_SWORD)
item-model必须推荐但可选
id (CMD)兜底可单独使用
craftengine-id盔甲必须 / 武器可选可选
CE 物品定义必须 (生成 item model)必须 或 传统 CMD 覆盖
跨材质渲染item_model 组件驱动不需要 (固定材质)

基础示例

items:
  DIAMOND_SWORD:
    styles:
      fire_sword:
        name: '<red>烈焰之剑 <gray>皮肤'
        id: '1001'
        permission: 'adventureskins.skin.fire_sword'
        lore:
          - '<gray>让你的剑燃烧起来!'
        glow: true
        sort: 10
        locked-name: '<red><bold>未解锁'
        locked-lore:
          - '<gray>在商城购买后解锁'
        styled-lore:
          - '<red>烈焰系列皮肤'
        styled-lore-mode: 'APPEND'

📦 物品分组

物品分组将多种 Material 归为一组,一个皮肤即可同时适用于组内所有物品。配合 item-model 可实现跨材质通用皮肤

定义方式

groups/*.yml 文件的 collections: 节点中定义(也可在 config.ymlgroups: 中):

# groups/default_groups.yml
collections:
  ALL_SWORDS:
    - 'WOODEN_SWORD'
    - 'STONE_SWORD'
    - 'IRON_SWORD'
    - 'GOLDEN_SWORD'
    - 'DIAMOND_SWORD'
    - 'NETHERITE_SWORD'

  BASIC_SWORDS:          # 不含钻石/下界合金
    - 'WOODEN_SWORD'
    - 'STONE_SWORD'
    - 'IRON_SWORD'
    - 'GOLDEN_SWORD'

预定义分组

默认 default_groups.yml 提供以下分组:

分组名包含物品
ALL_SWORDS全部 6 种剑
BASIC_SWORDS木/石/铁/金剑(不含钻石/下界合金)
ALL_PICKAXES全部 6 种镐
ALL_AXES全部 6 种斧
ALL_SHOVELS全部 6 种铲
ALL_HOES全部 6 种锄
ALL_TOOLS镐+斧+铲+锄(不含剑)
ALL_HELMETS全部 6 种头盔
ALL_CHESTPLATES全部 6 种胸甲
ALL_LEGGINGS全部 6 种护腿
ALL_BOOTS全部 6 种靴子
ALL_ARMOR全部 24 种盔甲
ALL_WEAPONS全部剑+弓+弩+三叉戟
RANGED_WEAPONS弓+弩+三叉戟
自定义分组

可以创建任意分组以满足特定需求。例如 BASIC_SWORDS 排除了钻石和下界合金剑,让这两种剑使用专属皮肤,其余剑使用通用皮肤。

使用方式

在皮肤文件中,用分组名替代 Material 名:

items:
  BASIC_SWORDS:        # <-- 通用皮肤:木/石/铁/金剑
    styles:
      allay_sword:
        name: '<aqua>悦灵之剑'
        id: 5001
        item-model: 'hmcwraps:allay_sword'

  DIAMOND_SWORD:       # <-- 专属皮肤:仅钻石剑
    styles:
      dark_allay_sword:
        name: '<dark_purple>暗影悦灵之剑'
        id: 5001
        item-model: 'hmcwraps:allay_sword'

也可用逗号分隔直接指定多个 Material:

items:
  'DIAMOND_AXE, IRON_AXE, NETHERITE_AXE':
    styles:
      lumberjack_axe:
        name: '<dark_green>伐木者'
        id: '4002'

📜 卷轴皮肤

卷轴皮肤是可交易的实体物品,玩家将其拖放到目标物品上即可应用皮肤。

配置

fire_sword:
  name: '<red>烈焰之剑'
  id: '1001'
  scroll:
    id: 'PAPER'                  # 卷轴材质
    model-id: 2001               # CustomModelData
    name: '<red>烈焰 <gray>剑皮肤卷轴'
    lore:
      - '<gray>拖放到剑上应用皮肤'
    keep-after-remove: false     # 移除后是否保留

给予命令

/skins give <玩家> fire_sword

移除器

移除器在 config.ymlremover 节点配置,可自定义材质、模型和描述。

/skins remover <玩家>

🛡️ 盔甲系统

AdventureSkins 提供多种盔甲外观修改方式,满足不同需求。

CraftEngine 集成

服务器安装 CraftEngine 时,可通过 craftengine-id 让穿戴的盔甲显示自定义 3D 模型:

DIAMOND_HELMET:
  styles:
    frost_helmet:
      name: '<aqua>冰霜头盔'
      id: '5001'
      craftengine-id: 'mynamespace:frost_helmet'

原理:在物品的 custom_data 组件中写入 craftengine:id 标签,CraftEngine 读取后替换穿戴模型。

Equippable 组件 (1.21.4+)

使用原版 equippable 组件替换装备模型,无需第三方插件:

equippable-model: 'mynamespace:frost_armor'
equippable-slot: 'HEAD'    # 可选, 盔甲自动使用默认槽

盔甲仿冒 (Armor Imitation)

将物品材质临时伪装为另一种盔甲,用于皮革甲染色方案:

armor-imitation: 'LEATHER'    # 伪装为皮革甲
color: '100,200,255'          # 染色 (R,G,B)
ℹ️ 提示

仿冒盔甲会禁止放入附魔台/砧/研磨石,防止玩家利用材质差异。下界合金仿冒还会防止在熔岩中燃烧。

纹饰 (Trim)

trim: 'rib'               # 纹饰图案
trim-material: 'diamond'   # 纹饰材质
remove-trim: false          # 是否移除原有纹饰

动作系统

手持已包装物品进行交互/攻击时可触发自定义动作。

触发类型

类型说明
interact右键交互
hit-any攻击任何实体
hit-player攻击玩家
hit-entity攻击生物

动作类型 (16种)

动作说明示例
message发送消息'<red>你挥出了火焰!'
actionbarActionBar 消息'<gold>⚔ 攻击!'
title标题消息'<red>标题;副标题;10;40;10'
sound播放音效'minecraft:entity.blaze.shoot 1.0 1.2'
command玩家执行命令'spawn'
console-command控制台执行命令'give %player% diamond 1'
particle粒子效果'FLAME 0.5 0.5 0.5 0.01 20'
effect药水效果'SPEED 100 1'

配置示例

actions:
  interact:
    message:
      - '<gold>⚒ 你挥舞着武器!'
    sound:
      - 'minecraft:block.anvil.use 1.0 1.2'
  hit-player:
    message:
      - '<red>你攻击了一名玩家!'

👁️ 预览系统

预览模式

模式说明
FLOATING物品在玩家面前浮空旋转展示
HAND临时替换手持物品,预览结束自动恢复

配置

preview:
  type: 'FLOATING'      # 预览模式
  duration: 5            # 持续时间 (秒)
  rotation: 5            # 旋转速度 (度/tick)
  sneak-cancel:
    enabled: true        # 蹲下取消预览
    action-bar: true     # ActionBar 提示
  bobbing:
    enabled: true        # 上下浮动
    speed: 7             # 浮动速度
    intensity: 0.25      # 浮动幅度

⚙️ config.yml

主配置文件位于 plugins/AdventureSkins/config.yml,包含以下模块:

  • permissions — 权限检查控制
  • preview — 预览系统设置
  • inventory — GUI 界面设置
  • remover — 移除器物品配置
  • applying — 装扮/重新装扮规则
  • preservation — 原始属性保留
  • favorites / filter — 收藏与过滤
  • global-disable — 全局禁用黑名单
  • groups — 物品分组定义
  • storage — MySQL / Redis 跨服同步
  • items — 皮肤定义 (建议放 cosmetics/ 目录)

详细注释已内置于配置文件中,请直接参阅 config.yml

🗄️ 跨服数据同步

AdventureSkins v1.2.0 支持通过 MySQL + Redis 在 Velocity 群组服中同步玩家偏好数据。

同步内容

数据说明
收藏列表玩家收藏的皮肤 ID 列表
过滤偏好是否仅显示已拥有权限的皮肤

架构

  • MySQL — 持久化存储,玩家加入时异步加载,变更时异步写入
  • Redis — Pub/Sub 实时通知其他子服刷新缓存,无需等待玩家重新登录
ℹ️ 提示

两者均为可选。不启用则仅使用内存缓存,重启/切服后丢失。建议多服场景同时启用两者。

配置

storage:
  mysql:
    enabled: true
    host: 'localhost'
    port: 3306
    database: 'adventureskins'
    username: 'root'
    password: 'your_password'
    table-prefix: 'askins_'     # 表名前缀
  redis:
    enabled: true
    host: 'localhost'
    port: 6379
    password: ''

数据库表 (自动创建)

表名说明
askins_player_prefs玩家过滤偏好 (uuid, filter_enabled)
askins_player_favorites玩家收藏列表 (uuid, skin_id)

MySQL 表在插件首次连接时自动创建,无需手动建表。

数据流

玩家修改收藏/过滤 → 更新内存缓存 → 异步写 MySQL → Redis publish
                                                         ↓
其他子服 Redis subscribe → 收到通知 → 异步从 MySQL 重新加载到缓存

💬 messages.yml

消息配置文件位于 plugins/AdventureSkins/messages.yml

所有消息支持 MiniMessage 格式,变量用 <xxx> 占位。

可用变量

变量说明出现位置
<uuid>皮肤 ID命令消息
<name>皮肤名称列表消息
<player>玩家名称命令消息
<time>耗时 (ms)重载消息
<skins>皮肤总数重载消息
<permission>权限节点列表消息
<file>文件路径创建命令
<argument>缺少的参数错误消息

🔗 插件联动

CraftEngine

CraftEngine 是一款资源包管理插件,可为物品定义自定义模型和贴图。AdventureSkins 通过两种方式与其协作:

武器/工具 — item-model(推荐)

CraftEngine 生成资源包时会在 assets/<namespace>/items/ 目录下创建 1.21.4 item model 定义文件。AdventureSkins 通过 item-model 字段设置 item_model 组件,客户端直接按路径渲染模型,无视底层材质

# 武器/工具:item-model 是跨材质的核心
allay_sword:
  id: 5001
  item-model: 'hmcwraps:allay_sword'       # 设置 item_model 组件
  craftengine-id: 'inkless:allay_sword'     # CE 物品标识(可选)
注意

craftengine-id 写入 NBT 的 craftengine:id 标签仅用于 CraftEngine 识别物品身份,不会自动为武器/工具设置模型渲染。武器跨材质必须依赖 item-model

盔甲 — craftengine-id + item-model

盔甲的穿戴外观需要 CraftEngine 拦截装备渲染数据包。通过 craftengine-id 写入 NBT,CraftEngine 识别后替换穿戴模型(equipment asset)。同时配合 item-model 控制手持/物品栏中的模型显示。

# 盔甲:craftengine-id 控制穿戴渲染,item-model 控制手持渲染
allay_helmet:
  id: 5001
  item-model: 'inkless:allay_helmet'        # 手持/物品栏模型
  craftengine-id: 'inkless:allay_helmet'    # 穿戴渲染(必须)

CraftEngine 配置侧

需要在 CraftEngine 的 resources/<pack>/configuration/ 目录下定义物品:

# CraftEngine 物品定义
items:
  inkless:allay_sword:
    material: IRON_SWORD           # 基础材质(仅用于 /ce give)
    textures:
      - inkless:vanillasets/allay_sword

  inkless:allay_helmet:
    material: DIAMOND_HELMET
    textures:
      - inkless:vanillasets/allay_helmet
    settings:
      equipment:
        asset-id: inkless:allay    # 穿戴模型资产
        slot: head

ItemsAdder / Oraxen / Nexo

通过 id 字段填写对应插件的物品 ID (如 itemsadder:custom_sword),插件自动 Hook 模型。

PlaceholderAPI

安装 PAPI 后自动注册占位符,可在计分板/聊天/全息图中使用。

🏷️ PAPI 变量

需安装 PlaceholderAPI,插件自动注册以下占位符:

变量说明
%adventureskins_skin%当前手持物品的皮肤ID
%adventureskins_skin_name%当前手持物品的皮肤名称
%adventureskins_has_skin%手持物品是否有皮肤 (true/false)

🔧 开发者 API

自定义事件

事件说明可取消
ItemSkinEvent皮肤即将应用到物品
ItemUnskinEvent皮肤即将从物品移除
ItemPreviewEvent玩家即将预览皮肤

使用示例

@EventHandler
public void onSkin(ItemSkinEvent event) {
    Player player = event.getPlayer();
    String skinId = event.getSkinId();
    // 自定义逻辑...
    // event.setCancelled(true); // 取消应用
}

常见问题

Q: 皮肤应用后手持物品外观没变?

A: 确认资源包已正确加载,且 iditem-model 对应的模型在资源包中存在。

Q: 盔甲穿戴后没有显示自定义模型?

A: 需要配置 craftengine-id(需 CraftEngine 插件)或 equippable-model(1.21.4+ 原生)。仅 id 只改变手持外观。

Q: 如何让一个皮肤适用于多种物品?

A: 使用物品分组(groups)或逗号分隔的 Material 列表。详见"物品分组"页。

Q: 皮肤在钻石剑上有效,但铁剑/石剑上无效?

A: 这是因为只配置了 id(CustomModelData),CMD 是材质绑定的。要跨材质必须添加 item-model 字段(1.21.4 item_model 组件),它直接告诉客户端用哪个模型渲染,不受底层材质影响。详见"皮肤配置 > 通用皮肤 vs 单一皮肤"。

Q: craftengine-id 和 item-model 有什么区别?

A: item-model 设置 1.21.4 的 item_model 组件,直接控制客户端渲染模型(武器/工具核心)。craftengine-id 写入 NBT 标签让 CraftEngine 识别物品身份,主要用于盔甲穿戴渲染。武器跨材质只需 item-model,盔甲穿戴需要两者配合。

Q: 物理皮肤和虚拟皮肤有什么区别?

A: 虚拟皮肤通过 GUI 直接应用,物理皮肤是可交易的实体物品(PAPER + CustomModelData),拖放到目标物品上应用。

Q: 仿冒盔甲为什么不能放进附魔台?

A: 这是安全保护机制,防止玩家利用材质差异获取不当附魔。移除皮肤恢复原材质后即可正常使用。

Q: 支持热重载吗?

A: 支持。/skins reload 可重载所有配置和皮肤文件,无需重启服务器。

📝 更新日志

v1.2.0 最新

  • NEW 通用皮肤机制 — 物品分组 + item-model 实现跨材质皮肤,一个皮肤覆盖所有材质
  • NEW 预定义分组 — ALL_SWORDS, BASIC_SWORDS, ALL_PICKAXES 等 14 个开箱即用分组
  • NEW CraftEngine 深度集成 — item-model 跨材质武器渲染 + craftengine-id 盔甲穿戴渲染
  • NEW MySQL + Redis 跨服同步 — Velocity 群组服玩家收藏/过滤偏好实时同步
  • NEW 配置命名重构 — wraps→styles, unwrapper→remover, physical→scroll, collections→groups
  • NEW 文件夹重命名 — skins/→cosmetics/, collections/→groups/
  • NEW 默认悦灵皮肤 — cosmetics/allay.yml 含通用悦灵 + 暗影悦灵系列
  • NEW 向后兼容 — 旧配置键名自动回退读取

v1.1.0

  • NEW CraftEngine 集成 — craftengine-id 支持穿戴自定义盔甲模型
  • NEW Equippable 改进 — equippable-model 可独立使用,无需指定 slot
  • NEW 配置注释 — 所有配置文件添加详细中文注释
  • NEW 示例文件 — 新增 example_skins.yml 展示全部可用字段

v1.0.0

  • NEW 初始发布 — 完整的物品皮肤系统
  • NEW 虚拟/物理皮肤 + 拆包器 + GUI + 预览
  • NEW 16 种动作类型 + 自定义事件 API
  • NEW 盔甲仿冒 + 假耐久 + Trim + Equippable
  • NEW 物品集合 + 收藏/过滤 + 权限保护
  • NEW PlaceholderAPI + ItemsAdder/Oraxen/Nexo Hook