From 7cd89e59fde67977694e6ac8fd9a8bfbd3bf66c0 Mon Sep 17 00:00:00 2001
From: yhy <1763917516@qq.com>
Date: Wed, 3 Jun 2026 07:09:32 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=B9=B6=E6=B7=BB=E5=8A=A0RE?=
=?UTF-8?q?ADME.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 508 +++++++++++++++
README2.md | 604 ------------------
pom.xml | 51 +-
.../java/com/yaohun/petsystem/PetMain.java | 13 +-
.../com/yaohun/petsystem/api/PetExpAPI.java | 59 +-
.../com/yaohun/petsystem/config/Config.java | 24 +-
.../com/yaohun/petsystem/gui/CarryGui.java | 5 +-
.../com/yaohun/petsystem/gui/FeedingGui.java | 9 +-
.../com/yaohun/petsystem/gui/MainGui.java | 5 +-
.../petsystem/listener/PlayerListener.java | 6 +-
.../petsystem/listener/RePetNameListener.java | 26 +-
.../petsystem/manage/LevelExpManager.java | 41 +-
.../petsystem/manage/PlayerManager.java | 11 +-
.../yaohun/petsystem/util/InventoryUtil.java | 24 +
.../petsystem/util/wolf/CustomWolf.java | 222 +++----
src/main/resources/plugin.yml | 8 +-
.../java/com/yaohun/petsystem/PetMain.java | 265 --------
.../com/yaohun/petsystem/api/PetExpAPI.java | 122 ----
.../yaohun/petsystem/command/PetCommand.java | 4 -
.../com/yaohun/petsystem/config/Config.java | 141 ----
.../com/yaohun/petsystem/data/PetData.java | 86 ---
.../com/yaohun/petsystem/data/PetSQL.java | 105 ---
.../com/yaohun/petsystem/data/PlayerData.java | 136 ----
.../com/yaohun/petsystem/data/SkillData.java | 60 --
.../yaohun/petsystem/event/PetCallEvent.java | 47 --
.../com/yaohun/petsystem/gui/CarryGui.java | 89 ---
.../com/yaohun/petsystem/gui/FeedingGui.java | 206 ------
.../com/yaohun/petsystem/gui/MainGui.java | 185 ------
.../petsystem/gui/holder/CarryGuiHolder.java | 12 -
.../gui/holder/FeedingGuiHolder.java | 12 -
.../petsystem/gui/holder/MainGuiHolder.java | 12 -
.../petsystem/listener/PetSkillsListener.java | 94 ---
.../petsystem/listener/PlayerListener.java | 79 ---
.../petsystem/listener/RePetNameListener.java | 62 --
.../petsystem/manage/LevelExpManager.java | 35 -
.../petsystem/manage/PetCallSession.java | 48 --
.../yaohun/petsystem/manage/PetManager.java | 71 --
.../petsystem/manage/PlayerManager.java | 253 --------
.../com/yaohun/petsystem/model/PetNbt.java | 111 ----
.../yaohun/petsystem/model/PetQuality.java | 49 --
.../yaohun/petsystem/util/MessageUtil.java | 78 ---
.../com/yaohun/petsystem/util/PetUtil.java | 178 ------
.../petsystem/util/model/BetterModelUtil.java | 81 ---
.../petsystem/util/wolf/CustomWolf.java | 202 ------
src/src/main/resources/config.yml | 31 -
src/src/main/resources/lang.yml | 0
src/src/main/resources/plugin.yml | 6 -
47 files changed, 750 insertions(+), 3726 deletions(-)
create mode 100644 README.md
delete mode 100644 README2.md
create mode 100644 src/main/java/com/yaohun/petsystem/util/InventoryUtil.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/PetMain.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/api/PetExpAPI.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/command/PetCommand.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/config/Config.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/data/PetData.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/data/PetSQL.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/data/PlayerData.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/data/SkillData.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/event/PetCallEvent.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/gui/CarryGui.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/gui/FeedingGui.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/gui/MainGui.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/gui/holder/CarryGuiHolder.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/gui/holder/FeedingGuiHolder.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/gui/holder/MainGuiHolder.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/listener/PetSkillsListener.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/listener/PlayerListener.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/listener/RePetNameListener.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/manage/LevelExpManager.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/manage/PetCallSession.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/manage/PetManager.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/manage/PlayerManager.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/model/PetNbt.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/model/PetQuality.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/util/MessageUtil.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/util/PetUtil.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/util/model/BetterModelUtil.java
delete mode 100644 src/src/main/java/com/yaohun/petsystem/util/wolf/CustomWolf.java
delete mode 100644 src/src/main/resources/config.yml
delete mode 100644 src/src/main/resources/lang.yml
delete mode 100644 src/src/main/resources/plugin.yml
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..f90fab8
--- /dev/null
+++ b/README.md
@@ -0,0 +1,508 @@
+# AuPet 灵宠系统
+
+AuPet 是一个面向 Minecraft Paper 1.21 系列服务端的灵宠插件。
+
+插件围绕“宠物物品 + 玩家携带数据 + 宠物召唤实体 + GUI 管理”构建,适合用于服务器宠物养成、宠物技能展示、宠物出战和宠物经验成长玩法。
+
+核心功能:
+
+- 玩家通过 GUI 查看当前携带的灵宠、等级、经验、血量和资质
+- 支持将手持宠物物品携带到玩家数据中
+- 支持从玩家数据中取出宠物物品
+- 支持召唤和召回宠物实体
+- 支持 BetterModel 模型展示
+- 支持 MythicMobs 技能触发
+- 支持宠物喂养、经验增加和进化阶段控制
+- 支持宠物改名
+- 支持 MySQL 持久化玩家宠物数据
+- 提供宠物召唤事件,方便其他插件监听
+
+简单理解:
+
+```yml
+AuPet = 灵宠物品管理 + 宠物数据持久化 + 宠物 GUI + 宠物召唤 + 技能触发
+玩家 = 携带、召唤、喂养、改名和培养宠物
+管理员 = 配置宠物类型、模型、技能、等级经验和 GUI 展示
+```
+
+------
+
+# 运行环境
+
+## 服务端版本
+
+```yml
+Minecraft: 1.21.x
+推荐服务端: Paper
+Java: 21
+```
+
+当前构建配置使用:
+
+```yml
+Paper API: 1.21.8-R0.1-SNAPSHOT
+plugin.yml api-version: 1.21
+```
+
+## 前置依赖
+
+插件代码依赖以下组件:
+
+```yml
+DemonAPI
+CraftDataManager
+NBTAPI
+MythicMobs
+BetterModel
+```
+
+服务器启动前应确认这些插件或依赖已正确安装,并且版本与构建配置兼容。
+
+------
+
+# 安装方式
+
+## 第一步:构建插件
+
+在项目根目录执行:
+
+```bash
+mvn -q -DskipTests package
+```
+
+构建成功后会生成:
+
+```yml
+target/AuPet-1.0-SNAPSHOT.jar
+```
+
+## 第二步:放入服务器
+
+将插件 jar 放入服务器插件目录:
+
+```yml
+plugins/AuPet.jar
+```
+
+同时放入前置依赖插件。
+
+## 第三步:启动服务器
+
+首次启动后会生成插件配置目录。
+
+控制台应能看到宠物系统参数、等级经验配置和宠物类型加载日志。
+
+------
+
+# 目录结构
+
+## 插件默认资源
+
+```yml
+config.yml
+lang.yml
+plugin.yml
+```
+
+## 插件数据目录
+
+宠物类型配置读取自:
+
+```yml
+plugins/AuPet/PetData/
+```
+
+玩家携带宠物数据保存到 MySQL 表:
+
+```yml
+aupets_data
+```
+
+表字段:
+
+```yml
+PLAYERNAME: 玩家名
+PETSTACK: 序列化后的宠物 ItemStack
+```
+
+------
+
+# 玩家命令
+
+## 打开主界面
+
+```yml
+/apet
+/apet open
+```
+
+玩家未携带宠物时会打开携带界面;已携带宠物时会打开宠物主界面。
+
+## 携带或取出宠物
+
+```yml
+/apet carry
+```
+
+当玩家未携带宠物时:
+
+- 需要手持带有 `petKey` NBT 的宠物物品
+- 执行后会将手持宠物写入玩家数据
+- 手持栏会被清空
+
+当玩家已携带宠物时:
+
+- 会收回已召唤宠物
+- 刷新宠物物品数据
+- 将宠物物品返还给玩家
+
+如果玩家背包已满,剩余物品会掉落在玩家当前位置。
+
+## 召唤或召回宠物
+
+```yml
+/apet call
+```
+
+当宠物未出战时会召唤宠物;当宠物已出战时会召回宠物。
+
+召唤时会:
+
+- 生成狼实体作为宠物基础实体
+- 应用宠物血量、攻击、移动速度属性
+- 加载 BetterModel 模型
+- 触发配置的出生技能
+- 触发 `PetCallEvent`
+
+------
+
+# 管理员命令
+
+管理员命令需要:
+
+```yml
+admin.use
+```
+
+## 查看帮助
+
+```yml
+/apet
+```
+
+## 重载配置
+
+```yml
+/apet reload
+```
+
+重载内容:
+
+- 语言文件
+- 默认配置
+- 等级经验配置
+- 宠物模板
+- GUI 物品配置
+- 品质显示配置
+- 宠物类型配置
+
+## 给予宠物
+
+```yml
+/apet give 宠物Key 玩家名
+```
+
+示例:
+
+```yml
+/apet give cat Steve
+```
+
+插件会读取 `PetData` 中对应宠物配置,生成默认宠物物品并发放给目标玩家。
+
+## 增加宠物经验
+
+```yml
+/apet addexp 经验 玩家名
+```
+
+给玩家当前携带的宠物增加经验。
+
+## 增加手持宠物经验
+
+```yml
+/apet addexp 经验 玩家名 true
+```
+
+给目标玩家手持的宠物物品增加经验。
+
+------
+
+# 宠物配置
+
+宠物配置文件位于:
+
+```yml
+plugins/AuPet/PetData/宠物Key.yml
+```
+
+示例:
+
+```yml
+PetName: "§a森林灵宠"
+MaxLevel: 30
+ModelId: forest_pet
+CustomIconModelId: 10001
+AccessChannels:
+ - "活动获取"
+ - "商城购买"
+SummonSkill: "pet_spawn_effect"
+DeathSkill: "default"
+Skills:
+ bite:
+ mmSkill: "pet_bite"
+ needLevel: 1
+ trigger: "onAttack"
+ coolDown: 5000
+ item:
+ name: "&a撕咬"
+ lore:
+ - "&7触发条件: 攻击时"
+ - "&7冷却: 5秒"
+```
+
+字段说明:
+
+```yml
+PetName: 宠物显示名
+MaxLevel: 宠物最大等级
+ModelId: BetterModel 模型 ID
+CustomIconModelId: 宠物物品 CustomModelData
+AccessChannels: 获取渠道展示
+SummonSkill: 召唤时触发的 MythicMobs 技能,default 表示不触发
+DeathSkill: 死亡技能预留字段
+Skills: 宠物技能列表
+```
+
+------
+
+# 技能触发器
+
+当前代码支持:
+
+```yml
+onAttack: 玩家攻击实体时触发
+onDamaged: 玩家受到伤害时触发
+onSpawn: 宠物召唤后触发 SummonSkill
+```
+
+技能由 MythicMobs 执行。
+
+技能冷却使用玩家 UUID 和技能名作为冷却键。
+
+------
+
+# 等级经验配置
+
+默认配置节点:
+
+```yml
+NeedExpSettings:
+ 1: 10000
+ 2: 10000
+ 3: 10000
+ 30: -1
+```
+
+说明:
+
+```yml
+正数: 当前等级升到下一级所需经验
+-1: 终止等级,不再继续升级
+```
+
+宠物还会受到进化阶段限制:
+
+```yml
+进化 1: 最高 20 级
+进化 2: 最高 40 级
+进化 3: 最高 60 级
+进化 4: 最高 70 级
+进化 5: 最高 75 级
+```
+
+------
+
+# GUI 功能
+
+## 主界面
+
+主界面展示:
+
+- 宠物物品
+- 宠物技能
+- 宠物资质
+- 召唤或召回按钮
+- 喂养入口
+- 改名入口
+
+## 携带界面
+
+用于携带或取出宠物。
+
+玩家可以通过点击背包中的宠物物品,将其写入当前携带数据。
+
+## 喂养界面
+
+支持放入带有以下 NBT 的道具:
+
+```yml
+petAppleExp: 增加经验
+petAppleUp: 进化阶段要求等级
+```
+
+关闭界面时,如果喂养槽仍有物品,会自动返还玩家。
+
+背包满时,剩余物会掉落到玩家当前位置。
+
+------
+
+# 数据保存机制
+
+玩家数据以序列化 ItemStack 形式保存到 MySQL。
+
+主要保存时机:
+
+- 携带宠物
+- 取出宠物
+- 喂养加经验
+- 宠物改名
+- 玩家退出
+- 插件关闭
+
+注意:
+
+```yml
+当前数据库读写仍是同步模型。
+在线人数较多或数据库延迟较高时,建议后续改造为异步加载和保存队列。
+```
+
+------
+
+# API 与事件
+
+## 宠物经验 API
+
+其他代码可以调用:
+
+```java
+PetExpAPI.addExp(player, 1000);
+```
+
+也可以对手持宠物物品增加经验:
+
+```java
+PetNbt petNbt = PetExpAPI.addExp(playerName, itemStack, 1000);
+```
+
+## 宠物召唤事件
+
+宠物召唤成功后会触发:
+
+```java
+PetCallEvent
+```
+
+可读取:
+
+```java
+event.getOwner();
+event.getCutomName();
+event.getEntityUuid();
+```
+
+------
+
+# 构建验证
+
+本地验证命令:
+
+```bash
+mvn -q test
+mvn -q -DskipTests package
+```
+
+当前验证结果:
+
+```yml
+mvn test: 通过
+mvn package: 通过
+```
+
+------
+
+# 常见问题
+
+## 插件启动时报缺少类
+
+检查前置依赖是否安装:
+
+```yml
+DemonAPI
+CraftDataManager
+NBTAPI
+MythicMobs
+BetterModel
+```
+
+同时检查这些依赖的版本是否与构建配置兼容。
+
+## 执行 /apet give 找不到宠物
+
+检查:
+
+```yml
+plugins/AuPet/PetData/宠物Key.yml 是否存在
+文件名是否与命令中的宠物Key一致
+配置是否能被 YAML 正常读取
+```
+
+## 召唤宠物失败
+
+检查:
+
+```yml
+BetterModel 中是否存在对应 ModelId
+宠物血量是否大于 0
+MythicMobs 技能名是否正确
+```
+
+## 宠物无法升级
+
+检查:
+
+```yml
+NeedExpSettings 当前等级是否为 -1
+宠物是否已达到 MaxLevel
+宠物是否已达到当前进化阶段上限
+```
+
+## GUI 按钮显示异常
+
+检查:
+
+```yml
+config.yml 中 GuiItemData 是否完整
+lang.yml 中语言键是否完整
+```
+
+------
+
+# 维护建议
+
+- 发布前同步检查 `plugin.yml` 版本号。
+- 修改宠物配置后执行 `/apet reload`。
+- 新增宠物前先在测试服验证 BetterModel 模型和 MythicMobs 技能。
+- 不建议在高峰期进行大量玩家数据迁移。
+- 后续优先补充数据库异步队列和 MockBukkit 测试。
+- 每次更新后至少完成一次登录、携带宠物、打开 GUI、召唤宠物、喂养、退出保存的冒烟测试。
diff --git a/README2.md b/README2.md
deleted file mode 100644
index 9827765..0000000
--- a/README2.md
+++ /dev/null
@@ -1,604 +0,0 @@
-# 1.AuOnlineReward 是什么?
-
-AuOnlineReward 是一个 Minecraft 1.12.2 Bukkit / Spigot 在线奖励插件。
-
-它用于根据玩家在线时间发放阶段奖励,并根据阶段奖励领取次数解锁累积奖励。
-
-核心功能:
-
-- 玩家通过 GUI 查看在线信息和奖励状态
-- 支持每日在线阶段奖励
-- 支持累积领取次数奖励
-- 支持每日在线数据刷新
-- 支持月度在线数据刷新
-- 支持配置奖励物品和奖励命令
-- 支持通过 API 获取玩家在线时间
-- 支持奖励领取事件,方便其他插件监听
-
-简单理解:
-
-```yml
-AuOnlineReward = 在线时长统计 + 在线奖励 GUI + 奖励命令执行
-玩家 = 在线积累时间并领取奖励
-管理员 = 配置奖励物品、奖励条件和发奖命令
-```
-
-------
-
-# 2.运行环境
-
-## 服务端版本
-
-```yml
-Minecraft: 1.12.2
-服务端: Bukkit / Spigot / Paper
-Java: 8
-```
-
-## 前置插件
-
-AuOnlineReward 依赖 DemonAPI。
-
-`plugin.yml` 中已经声明:
-
-```yml
-depend:
- - DemonAPI
-```
-
-服务器启动前必须确保 DemonAPI 已放入插件目录。
-
-------
-
-# 3.安装方式
-
-## 第一步:放入插件
-
-将插件 jar 放入服务器插件目录:
-
-```yml
-plugins/AuOnlineReward.jar
-```
-
-同时放入前置插件:
-
-```yml
-plugins/DemonAPI.jar
-```
-
-## 第二步:启动服务器
-
-首次启动后会生成插件配置文件。
-
-## 第三步:检查加载
-
-控制台应能看到插件正常启用,没有缺少 DemonAPI 的报错。
-
-------
-
-# 4.目录结构
-
-## 插件配置目录
-
-默认配置和语言文件位于:
-
-```yml
-plugins/AuOnlineReward/config.yml
-plugins/AuOnlineReward/language.yml
-```
-
-## 玩家数据目录
-
-玩家在线数据会保存到:
-
-```yml
-plugins/AuData/AuOnlineReward/玩家名.yml
-```
-
-玩家数据示例:
-
-```yml
-OnlineData:
- todayOnline: 0
- totalOnline: 0
- monthOnline: 0
- totalSign: 0
- signAmount: 0
- currentReward: MinuteReward_30
- collectionTime: 1717200000000
- offlineTime: 1717200000000
- receivedList: []
- permanentReceived: []
-```
-
-字段说明:
-
-```yml
-todayOnline: 今日在线秒数
-totalOnline: 累积在线秒数
-monthOnline: 本月在线秒数
-totalSign: 总计领取阶段奖励次数
-signAmount: 当前轮累积领取阶段奖励次数
-currentReward: 当前可领取的阶段奖励
-collectionTime: 上次阶段奖励领取时间
-offlineTime: 上次离线时间
-receivedList: 今日已领取阶段奖励
-permanentReceived: 当前轮已领取累积奖励
-```
-
-------
-
-# 5.玩家命令
-
-## 打开在线奖励界面
-
-```yml
-/auonline open
-```
-
-玩家执行后会打开在线福利 GUI。
-
-GUI 中会显示:
-
-- 累积在线时间
-- 本月在线时间
-- 今日在线时间
-- 总计领取奖励次数
-- 阶段奖励状态
-- 累积奖励状态
-
-注意:
-
-```yml
-每日 00:10 前无法打开 GUI
-这是为了避免跨日数据刷新期间领取状态异常
-```
-
-------
-
-# 6.管理员命令
-
-管理员命令需要 OP 权限。
-
-## 查看命令帮助
-
-```yml
-/auonline
-```
-
-## 重载配置
-
-```yml
-/auonline reload
-```
-
-重载内容:
-
-- 奖励配置
-- 语言配置
-- GUI 标题
-- 奖励显示文本
-
-## 刷新所有玩家每日数据
-
-```yml
-/auonline dayrefresh
-```
-
-作用:
-
-- 清空今日在线时间
-- 重置当前阶段奖励
-- 重置今日阶段奖励领取记录
-- 重新载入在线玩家数据
-
-## 刷新指定玩家每日数据
-
-```yml
-/auonline dayrefresh 玩家名
-```
-
-只刷新指定玩家的每日在线奖励数据。
-
-## 查看玩家数据
-
-```yml
-/auonline info 玩家名
-/auonline look 玩家名
-```
-
-不填写玩家名时,默认查看执行者自己的数据。
-
-## 查看今日在线排行
-
-```yml
-/auonline topDay
-/auonline top
-```
-
-显示当前已缓存玩家的今日在线排行。
-
-------
-
-# 7.奖励类型
-
-AuOnlineReward 当前包含两类奖励。
-
-## 阶段奖励
-
-配置节点通常以 `MinuteReward_` 开头。
-
-示例:
-
-```yml
-RewardData:
- MinuteReward_30:
- slot: 10
- needOnline: 1800
- needOnlineTime: 1800
- itemStack:
- ==: org.bukkit.inventory.ItemStack
- type: IRON_INGOT
- commands:
- - eco give %player% 500
-```
-
-字段说明:
-
-```yml
-slot: GUI 中的格子位置
-needOnline: 距离上次阶段奖励领取需要等待的秒数
-needOnlineTime: 今日在线秒数要求
-itemStack: GUI 中展示的奖励物品
-commands: 领取后执行的命令
-```
-
-阶段奖励领取成功后:
-
-- 增加当前轮阶段领取次数
-- 增加总计阶段领取次数
-- 写入今日已领取记录
-- 切换到下一个阶段奖励
-- 执行奖励命令
-- 保存玩家数据
-
-## 累积奖励
-
-配置节点通常以 `SignReward_` 开头。
-
-示例:
-
-```yml
-RewardData:
- SignReward_15:
- slot: 29
- needOnline: 25
- itemStack:
- ==: org.bukkit.inventory.ItemStack
- type: CHEST
- commands:
- - eco give %player% 10000
-```
-
-字段说明:
-
-```yml
-slot: GUI 中的格子位置
-needOnline: 需要累计领取多少次阶段奖励
-itemStack: GUI 中展示的奖励物品
-commands: 领取后执行的命令
-```
-
-累积奖励领取成功后会写入 `permanentReceived`。
-
-当领取 `SignReward_Max` 后:
-
-```yml
-signAmount 会重置为 0
-permanentReceived 会清空
-进入下一轮累积奖励
-```
-
-------
-
-# 8.奖励命令怎么写?
-
-奖励命令写在 `commands` 列表中。
-
-示例:
-
-```yml
-commands:
- - eco give %player% 500
- - points give %player% 10
- - bcm &a玩家 &e%player% &a领取了在线奖励
-```
-
-支持占位符:
-
-```yml
-%player% 玩家名
-%itemName% 奖励物品显示名
-```
-
-如果命令包含 `msg:`,会向玩家发送消息,而不是由控制台执行命令。
-
-示例:
-
-```yml
-commands:
- - "msg:&a你领取了在线奖励"
-```
-
-颜色代码支持:
-
-```yml
-&a &b &c &e &f
-```
-
-插件执行时会转换为 Minecraft 颜色符号。
-
-------
-
-# 9.语言文件怎么写?
-
-语言文件为:
-
-```yml
-plugins/AuOnlineReward/language.yml
-```
-
-主要节点:
-
-```yml
-Online-Gui:
- Title: "§r日常福利 - 累积在线豪礼相赠"
- Received: "§a§l★ §7领取状态: §a已领取"
- Not-Started: "§c§l★ §7领取状态: §c未开始"
- Pending: "§b§l★ §7领取状态: §b待领取"
- Total-Online: "§7累积在线: §a%time%"
- Monthly-Online: "§7本月在线: §a%time%"
- Daily-Online: "§7今日在线: §a%time%"
- Total-Rewards: "§7总计领取奖励: §a%amount%次"
-Message:
- Reward-Progress: "你还需要获取§e[%amount%次]§a阶段奖励才能领取奖励。"
- Wait-Time: "您还需要等待§e[%time%秒]§a才能领取该奖励。"
- Daily-Requirement: "你需要今日在线§e[%time%秒]§a才能领取该奖励。"
- Already-Claimed: "你已经领取过这个累积奖励。"
- Not-Available: "这个阶段奖励尚未开启,暂时无法领取。"
-```
-
-修改语言文件后执行:
-
-```yml
-/auonline reload
-```
-
-------
-
-# 10.在线时间刷新机制
-
-## 在线计时
-
-插件会定时统计在线玩家的在线时长。
-
-统计字段:
-
-```yml
-todayOnline: 今日在线
-monthOnline: 本月在线
-totalOnline: 累积在线
-```
-
-玩家退出时会补算最后一段在线时间,并保存玩家数据。
-
-## 每日刷新
-
-每日刷新会处理:
-
-```yml
-todayOnline = 0
-currentReward = MinuteReward_30
-receivedList = []
-collectionTime = 当前时间
-```
-
-## 月度刷新
-
-月度刷新会处理:
-
-```yml
-monthOnline = 0
-```
-
-## 刷新性能说明
-
-批量刷新玩家文件时,插件会将 YAML 文件读写放到异步任务中执行。
-
-刷新完成后,再回到主线程重新载入在线玩家。
-
-这样可以降低大量玩家数据文件刷新时对主线程的影响。
-
-------
-
-# 11.API 调用
-
-其他插件可以通过 `OnlineAPI` 获取玩家在线时间。
-
-## 获取今日在线分钟数
-
-```java
-int minutes = OnlineAPI.getTime(playerName);
-```
-
-## 获取本月在线分钟数
-
-```java
-int minutes = OnlineAPI.getTimeMonth(playerName);
-```
-
-## 获取累积在线分钟数
-
-```java
-int minutes = OnlineAPI.getTimeTotal(playerName);
-```
-
-注意:
-
-```yml
-API 返回单位是分钟
-底层玩家数据保存单位是秒
-```
-
-------
-
-# 12.事件监听
-
-玩家成功领取奖励后会触发:
-
-```java
-OnlineRewardEvent
-```
-
-监听示例:
-
-```java
-@EventHandler
-public void onOnlineReward(OnlineRewardEvent event) {
- Player player = event.getPlayer();
- String playerName = event.getPlayerName();
- String rewardKey = event.getOnlineData().getRewardKey();
-}
-```
-
-事件可用于:
-
-- 记录领奖日志
-- 触发额外奖励
-- 接入活动系统
-- 接入统计系统
-
-------
-
-# 13.配置示例
-
-## 阶段奖励示例
-
-```yml
-RewardData:
- MinuteReward_30:
- slot: 10
- needOnline: 1800
- needOnlineTime: 1800
- itemStack:
- ==: org.bukkit.inventory.ItemStack
- type: IRON_INGOT
- meta:
- ==: ItemMeta
- meta-type: UNSPECIFIC
- display-name: §6§l阶段奖励 I
- lore:
- - §7还差 §c%time% §7才能领取
- - §e金币 §e*500
- commands:
- - eco give %player% 500
-```
-
-## 累积奖励示例
-
-```yml
-RewardData:
- SignReward_15:
- slot: 29
- needOnline: 25
- itemStack:
- ==: org.bukkit.inventory.ItemStack
- type: CHEST
- meta:
- ==: ItemMeta
- meta-type: TILE_ENTITY
- display-name: §6§l累积打卡奖励 I
- lore:
- - §7还需领取 §c%amounut% §7阶段奖励
- - §e金币 §e*10000
- commands:
- - eco give %player% 10000
-```
-
-注意:
-
-```yml
-阶段奖励 lore 中需要包含 %time%
-累积奖励 lore 中需要包含 %amounut%
-```
-
-------
-
-# 14.常见问题
-
-## 执行 /auonline open 没反应
-
-检查:
-
-```yml
-是否在每日 00:10 之前
-DemonAPI 是否正常加载
-language.yml 中 Title 是否存在
-config.yml 中 RewardData 是否存在
-```
-
-## 奖励无法领取
-
-检查:
-
-```yml
-今日在线秒数是否达到 needOnlineTime
-距离上次领取是否达到 needOnline
-currentReward 是否等于当前点击的阶段奖励
-该奖励是否已经在 receivedList 中
-```
-
-## 累积奖励无法领取
-
-检查:
-
-```yml
-signAmount 是否达到 needOnline
-该奖励是否已经在 permanentReceived 中
-```
-
-## 修改配置后没有变化
-
-执行:
-
-```yml
-/auonline reload
-```
-
-如果删除了奖励节点,重载后旧奖励缓存会被清理。
-
-## 玩家数据异常
-
-可以刷新指定玩家每日数据:
-
-```yml
-/auonline dayrefresh 玩家名
-```
-
-也可以检查玩家数据文件:
-
-```yml
-plugins/AuData/AuOnlineReward/玩家名.yml
-```
-
-------
-
-# 15.维护建议
-
-- 修改奖励配置前,先备份 `config.yml`。
-- 大量玩家数据刷新建议避开服务器高峰期。
-- 奖励命令应先在测试服验证,避免命令拼写错误导致奖励无法发放。
-- 不建议把高耗时命令放入奖励命令列表。
-- 修改语言或奖励配置后,使用 `/auonline reload` 重载。
-- 发布新版本时,应同步检查 `plugin.yml` 的版本号。
-- 每次更新后建议至少完成一次登录、打开 GUI、领取奖励、退出保存的冒烟测试。
diff --git a/pom.xml b/pom.xml
index c811293..87a95c0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,6 +21,10 @@
papermc-repo
https://repo.papermc.io/repository/maven-public/
+
+ public-survive
+ https://repo.aurora-pixels.com/repository/public-survive/
+
@@ -32,46 +36,29 @@
provided
- local
- demon-api
- local
- system
- ${parent.project.dir}/lib/DemonAPI.jar
+ de.tr7zw.nbtapi.plugin
+ NBTAPI
+ 2.15.6
- local
- nbt-api
- local
- system
- ${parent.project.dir}/lib/item-nbt-api-plugin-2.15.1.jar
+ me.Demon.DemonPlugin
+ DemonAPI
+ 2.1.2
- local
- mythicmobs
- local
- system
- ${parent.project.dir}/lib/MythicMobs-5.9.1.jar
+ io.lumine.mythic.bukkit
+ MythicMobs
+ 5.9.1
- local
- bettermodel
- local
- system
- ${parent.project.dir}/lib/BetterModel-2.2.0-paper.jar
+ kr.toxicity.model.paper
+ BetterModel
+ 2.2.0
- local
- craft-data-manager
- local
- system
- ${parent.project.dir}/lib/CraftDataManager.jar
-
-
- local
- paper-1.21.8-mapped-server
- 1.21.8
- system
- ${parent.project.dir}/.gradle/caches/paperweight/taskCache/mappedServerJar.jar
+ com.tianyu.datamanager
+ CraftDataManager
+ 1.0.0
diff --git a/src/main/java/com/yaohun/petsystem/PetMain.java b/src/main/java/com/yaohun/petsystem/PetMain.java
index d9e9ec9..e08884c 100644
--- a/src/main/java/com/yaohun/petsystem/PetMain.java
+++ b/src/main/java/com/yaohun/petsystem/PetMain.java
@@ -16,6 +16,7 @@ import com.yaohun.petsystem.manage.PetManager;
import com.yaohun.petsystem.manage.PlayerManager;
import com.yaohun.petsystem.model.PetNbt;
import com.yaohun.petsystem.util.MessageUtil;
+import com.yaohun.petsystem.util.InventoryUtil;
import com.yaohun.petsystem.util.PetUtil;
import de.tr7zw.nbtapi.NBTItem;
import io.lumine.mythic.bukkit.MythicBukkit;
@@ -65,7 +66,9 @@ public class PetMain extends JavaPlugin {
@Override
public void onDisable() {
- getPlayerManager().closeSaveAllData();
+ if (getPlayerManager() != null) {
+ getPlayerManager().closeSaveAllData();
+ }
}
@Override
@@ -203,6 +206,10 @@ public class PetMain extends JavaPlugin {
return true;
}
PetNbt petNbt = PetExpAPI.addExp(playerName, stack, exp);
+ if (petNbt == null) {
+ sender.sendMessage(prefix + "执行失败,未找到宠物配置.");
+ return true;
+ }
ItemStack petStack = PetUtil.refreshPetStackData(petNbt);
player.getInventory().setItemInMainHand(petNbt.saveIoItem(petStack));
sender.sendMessage(prefix + "给予 §6手持灵宠 §a经验: §d+" + exp);
@@ -234,7 +241,7 @@ public class PetMain extends JavaPlugin {
}
PetNbt petNbt = new PetNbt(petData);
ItemStack petStack = PetUtil.getPetStackDefault(petNbt);
- player.getInventory().addItem(petNbt.saveIoItem(petStack));
+ InventoryUtil.giveOrDrop(player, petNbt.saveIoItem(petStack));
DemonAPI.sendMessage(sender, "玩家: §e" + playerName + " §a宠物: §6" + petKey + " §r[背包]");
return true;
}
@@ -262,4 +269,4 @@ public class PetMain extends JavaPlugin {
return playerManager;
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/yaohun/petsystem/api/PetExpAPI.java b/src/main/java/com/yaohun/petsystem/api/PetExpAPI.java
index 1126330..579ccb4 100644
--- a/src/main/java/com/yaohun/petsystem/api/PetExpAPI.java
+++ b/src/main/java/com/yaohun/petsystem/api/PetExpAPI.java
@@ -29,49 +29,24 @@ public class PetExpAPI {
return;
}
int petLevel = petNbt.level;
- if (petLevel >= petData.getMaxLevel()) {
+ int levelCap = getLevelCap(petData, petNbt.evolution);
+ if (petLevel >= levelCap) {
return;
}
- // 进化阶段判断
- int evolution = petNbt.evolution;
- if (evolution == 1) {
- if (petLevel >= 20) {
- return;
- }
- } else if (evolution == 2) {
- if (petLevel >= 40) {
- return;
- }
- } else if (evolution == 3) {
- if (petLevel >= 60) {
- return;
- }
- } else if (evolution == 4) {
- if (petLevel >= 70) {
- return;
- }
- } else if (evolution == 5) {
- if (petLevel >= 75) {
- return;
- }
- }
int needExp = LevelExpManager.getNeedExpValue(petLevel);
petNbt.setTotalExp(petNbt.totalExp + addExp);
int nowExp = petNbt.exp;
addExp = nowExp + addExp;
- while (addExp >= needExp) {
- if (petLevel < 0) {
- break;
- }
+ while (needExp > 0 && petLevel < levelCap && addExp >= needExp) {
addExp -= needExp;
petLevel++;
needExp = LevelExpManager.getNeedExpValue(petLevel);
bcmupLevelEvant(playerName, petLevel);
- playerData.refreshPetStack();
}
petNbt.setExp(addExp);
petNbt.setLevel(petLevel);
+ playerData.refreshPetStack();
playerData.savePlayerData();
}
@@ -86,7 +61,8 @@ public class PetExpAPI {
PetNbt petNbt = new PetNbt();
petNbt.loadNbtData(nbtItem);
int petLevel = petNbt.level;
- if (petLevel >= petData.getMaxLevel()) {
+ int levelCap = getLevelCap(petData, petNbt.evolution);
+ if (petLevel >= levelCap) {
return petNbt;
}
int needExp = LevelExpManager.getNeedExpValue(petLevel);
@@ -94,10 +70,7 @@ public class PetExpAPI {
int nowExp = petNbt.exp;
addExp = nowExp + addExp;
- while (addExp >= needExp) {
- if (petLevel < 0) {
- break;
- }
+ while (needExp > 0 && petLevel < levelCap && addExp >= needExp) {
addExp -= needExp;
petLevel++;
needExp = LevelExpManager.getNeedExpValue(petLevel);
@@ -108,6 +81,22 @@ public class PetExpAPI {
return petNbt;
}
+ private static int getLevelCap(PetData petData, int evolution) {
+ int maxLevel = petData.getMaxLevel();
+ int evolutionLimit = switch (evolution) {
+ case 1 -> 20;
+ case 2 -> 40;
+ case 3 -> 60;
+ case 4 -> 70;
+ case 5 -> 75;
+ default -> maxLevel;
+ };
+ if (maxLevel <= 0) {
+ return evolutionLimit;
+ }
+ return Math.min(maxLevel, evolutionLimit);
+ }
+
public static void bcmupLevelEvant(String playerName, int level) {
boolean butt = false;
if (level == 10 || level == 20 || level == 30 || level == 40 || level == 50 ||
@@ -119,4 +108,4 @@ public class PetExpAPI {
// Bukkit.broadcastMessage("§f[§c§l公告§f] §a玩家§e"+playName+"§a本月器师手礼达到了 §7[§e§lLv."+level+"§7]");
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/yaohun/petsystem/config/Config.java b/src/main/java/com/yaohun/petsystem/config/Config.java
index 5c44203..75cebcb 100644
--- a/src/main/java/com/yaohun/petsystem/config/Config.java
+++ b/src/main/java/com/yaohun/petsystem/config/Config.java
@@ -44,14 +44,21 @@ public class Config {
}
private static void loadQualityShowMap(FileConfiguration config) {
+ qualityShowMap.clear();
+ qualityShowMap.put(0, "§f普通");
ConfigurationSection section = config.getConfigurationSection("QualityShow");
if (section == null) {
+ Bukkit.getConsoleSender().sendMessage("- 资质稀有度: §f" + qualityShowMap.size() + "个");
return;
}
for (String levelKey : section.getKeys(false)) {
- int level = Integer.parseInt(levelKey);
- String show = section.getString(levelKey).replace("&", "§");
- qualityShowMap.put(level, show);
+ try {
+ int level = Integer.parseInt(levelKey);
+ String show = section.getString(levelKey, "§f普通").replace("&", "§");
+ qualityShowMap.put(level, show);
+ } catch (NumberFormatException e) {
+ Bukkit.getConsoleSender().sendMessage("§c[宠物系统] 资质显示配置无效: " + levelKey);
+ }
}
Bukkit.getConsoleSender().sendMessage("- 资质稀有度: §f" + qualityShowMap.size() + "个");
}
@@ -62,8 +69,8 @@ public class Config {
try {
material = Material.valueOf(stackType.toUpperCase());
} catch (IllegalArgumentException e) {
- Bukkit.getConsoleSender().sendMessage("- 宠物模板载入: §c失败");
- return;
+ material = Material.DIAMOND;
+ Bukkit.getConsoleSender().sendMessage("- 宠物模板载入: §c材质无效,已使用默认材质");
}
String stackName = config.getString("Pet_Stack_Template.name", "§f宠物");
List stringList = config.getStringList("Pet_Stack_Template.lore");
@@ -80,6 +87,9 @@ public class Config {
}
public static ItemStack getPetStackTemplate() {
+ if (petStackTemplate == null) {
+ petStackTemplate = new ItemStack(Material.DIAMOND);
+ }
return petStackTemplate.clone();
}
@@ -119,7 +129,7 @@ public class Config {
public static String getQualityShow(int value) {
Map.Entry entry = qualityShowMap.floorEntry(value);
- return entry != null ? entry.getValue() : qualityShowMap.get(0);
+ return entry != null ? entry.getValue() : "§f普通";
}
public static String getHealthChar(int percent) {
@@ -138,4 +148,4 @@ public class Config {
return "§f";
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/yaohun/petsystem/gui/CarryGui.java b/src/main/java/com/yaohun/petsystem/gui/CarryGui.java
index a3851ad..1716eb0 100644
--- a/src/main/java/com/yaohun/petsystem/gui/CarryGui.java
+++ b/src/main/java/com/yaohun/petsystem/gui/CarryGui.java
@@ -5,6 +5,7 @@ import com.yaohun.petsystem.config.Config;
import com.yaohun.petsystem.data.PlayerData;
import com.yaohun.petsystem.gui.holder.CarryGuiHolder;
import com.yaohun.petsystem.manage.PlayerManager;
+import com.yaohun.petsystem.util.InventoryUtil;
import com.yaohun.petsystem.util.MessageUtil;
import de.tr7zw.nbtapi.NBTItem;
import me.Demon.DemonPlugin.DemonAPI;
@@ -54,7 +55,7 @@ public class CarryGui implements Listener {
playerManager.removePetCall(playerName);
playerData.refreshPetStack();
ItemStack petStack = playerData.getPetStack();
- player.getInventory().addItem(petStack);
+ InventoryUtil.giveOrDrop(player, petStack);
playerData.setPetStack(DemonAPI.getErrItems());
playerData.savePlayerData();
inv.setItem(PET_SLOT, Config.getItemStack("carry_gui"));
@@ -78,7 +79,7 @@ public class CarryGui implements Listener {
playerManager.removePetCall(playerName);
playerData.refreshPetStack();
ItemStack petStack = playerData.getPetStack();
- player.getInventory().addItem(petStack);
+ InventoryUtil.giveOrDrop(player, petStack);
playerData.setPetStack(DemonAPI.getErrItems());
playerData.savePlayerData();
MessageUtil.sendMessageKey(player, "pet_stack_carry_takeOut", Sound.ENTITY_PLAYER_LEVELUP);
diff --git a/src/main/java/com/yaohun/petsystem/gui/FeedingGui.java b/src/main/java/com/yaohun/petsystem/gui/FeedingGui.java
index 88c0211..7fac354 100644
--- a/src/main/java/com/yaohun/petsystem/gui/FeedingGui.java
+++ b/src/main/java/com/yaohun/petsystem/gui/FeedingGui.java
@@ -8,6 +8,7 @@ import com.yaohun.petsystem.gui.holder.FeedingGuiHolder;
import com.yaohun.petsystem.manage.LevelExpManager;
import com.yaohun.petsystem.manage.PlayerManager;
import com.yaohun.petsystem.model.PetNbt;
+import com.yaohun.petsystem.util.InventoryUtil;
import com.yaohun.petsystem.util.MessageUtil;
import com.yaohun.petsystem.util.PetUtil;
import de.tr7zw.nbtapi.NBTItem;
@@ -96,7 +97,7 @@ public class FeedingGui implements Listener {
// 判断槽位内是否已存在物品
ItemStack foodStack = getFooedStack(inv);
if (foodStack != null) {
- player.getInventory().addItem(foodStack);
+ InventoryUtil.giveOrDrop(player, foodStack);
}
e.setCurrentItem(null);
inv.setItem(FOOD_SLOT, clickStack);
@@ -110,7 +111,7 @@ public class FeedingGui implements Listener {
// 判断槽位内是否已存在物品
ItemStack foodStack = getFooedStack(inv);
if (foodStack != null) {
- player.getInventory().addItem(foodStack);
+ InventoryUtil.giveOrDrop(player, foodStack);
inv.setItem(FOOD_SLOT, DemonAPI.getPaperAirItems());
}
player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1, 1);
@@ -199,8 +200,8 @@ public class FeedingGui implements Listener {
ItemStack stack = getFooedStack(inv);
if (stack != null) {
inv.setItem(FOOD_SLOT, DemonAPI.getPaperAirItems());
- player.getInventory().addItem(stack);
+ InventoryUtil.giveOrDrop(player, stack);
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/yaohun/petsystem/gui/MainGui.java b/src/main/java/com/yaohun/petsystem/gui/MainGui.java
index 70f50a8..90de41d 100644
--- a/src/main/java/com/yaohun/petsystem/gui/MainGui.java
+++ b/src/main/java/com/yaohun/petsystem/gui/MainGui.java
@@ -9,6 +9,7 @@ import com.yaohun.petsystem.gui.holder.MainGuiHolder;
import com.yaohun.petsystem.listener.RePetNameListener;
import com.yaohun.petsystem.manage.PlayerManager;
import com.yaohun.petsystem.model.PetNbt;
+import com.yaohun.petsystem.util.InventoryUtil;
import com.yaohun.petsystem.util.MessageUtil;
import com.yaohun.petsystem.util.PetUtil;
import me.Demon.DemonPlugin.DemonAPI;
@@ -150,7 +151,7 @@ public class MainGui implements Listener {
playerManager.removePetCall(playerName);
playerData.refreshPetStack();
ItemStack petStack = playerData.getPetStack();
- player.getInventory().addItem(petStack);
+ InventoryUtil.giveOrDrop(player, petStack);
playerData.setPetStack(DemonAPI.getErrItems());
playerData.savePlayerData();
player.closeInventory();
@@ -182,4 +183,4 @@ public class MainGui implements Listener {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/yaohun/petsystem/listener/PlayerListener.java b/src/main/java/com/yaohun/petsystem/listener/PlayerListener.java
index 90a5b68..bea5f9f 100644
--- a/src/main/java/com/yaohun/petsystem/listener/PlayerListener.java
+++ b/src/main/java/com/yaohun/petsystem/listener/PlayerListener.java
@@ -38,6 +38,10 @@ public class PlayerListener implements Listener {
if (petUUID == null) {
return;
}
+ if (petUUID.equals(e.getEntity().getUniqueId())) {
+ e.setCancelled(true);
+ return;
+ }
Entity entity = Bukkit.getEntity(petUUID);
if (entity instanceof Wolf wolf) {
wolf.setTarget(target);
@@ -74,6 +78,6 @@ public class PlayerListener implements Listener {
Player player = e.getPlayer();
String playerName = player.getName();
PlayerManager playerManager = PetMain.getPlayerManager();
- playerManager.removePetCall(playerName);
+ playerManager.closeSaveData(playerName);
}
}
diff --git a/src/main/java/com/yaohun/petsystem/listener/RePetNameListener.java b/src/main/java/com/yaohun/petsystem/listener/RePetNameListener.java
index de4e730..812f3aa 100644
--- a/src/main/java/com/yaohun/petsystem/listener/RePetNameListener.java
+++ b/src/main/java/com/yaohun/petsystem/listener/RePetNameListener.java
@@ -5,38 +5,39 @@ import com.yaohun.petsystem.config.Config;
import com.yaohun.petsystem.data.PlayerData;
import com.yaohun.petsystem.manage.PlayerManager;
import com.yaohun.petsystem.util.MessageUtil;
+import org.bukkit.Bukkit;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.Collections;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.UUID;
public class RePetNameListener implements Listener {
- private static List reNameList = new ArrayList<>();
+ private static final Set reNameList = Collections.newSetFromMap(new ConcurrentHashMap<>());
public static void addReNameUUID(UUID uuid) {
- if (!reNameList.contains(uuid)) {
- reNameList.add(uuid);
- }
+ reNameList.add(uuid);
}
@EventHandler
public void onChat(AsyncPlayerChatEvent e) {
Player player = e.getPlayer();
UUID uuid = player.getUniqueId();
- if (reNameList.isEmpty()) {
- return;
- }
- if (!reNameList.contains(uuid)) {
+ if (!reNameList.remove(uuid)) {
return;
}
e.setCancelled(true);
- reNameList.remove(uuid);
+ String reName = e.getMessage();
+ Bukkit.getScheduler().runTask(PetMain.inst(), () -> handleRename(player, reName));
+ }
+
+ private void handleRename(Player player, String reName) {
String playerName = player.getName();
PlayerManager playerManager = PetMain.getPlayerManager();
PlayerData playerData = playerManager.getPlayerData(playerName);
@@ -44,7 +45,6 @@ public class RePetNameListener implements Listener {
MessageUtil.sendMessageKey(player, "pet_rename_no_pets", Sound.ENTITY_VILLAGER_NO);
return;
}
- String reName = e.getMessage();
if (reName.isEmpty()) {
MessageUtil.sendMessageKey(player, "pet_rename_empty", Sound.ENTITY_VILLAGER_NO);
return;
@@ -59,4 +59,4 @@ public class RePetNameListener implements Listener {
String message = Config.getLanguage("pet_rename_success");
MessageUtil.sendMessage(player, message.replace("{petName}", newName), Sound.ENTITY_PLAYER_LEVELUP);
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/yaohun/petsystem/manage/LevelExpManager.java b/src/main/java/com/yaohun/petsystem/manage/LevelExpManager.java
index 42133c8..bc637a2 100644
--- a/src/main/java/com/yaohun/petsystem/manage/LevelExpManager.java
+++ b/src/main/java/com/yaohun/petsystem/manage/LevelExpManager.java
@@ -2,6 +2,7 @@ package com.yaohun.petsystem.manage;
import com.yaohun.petsystem.PetMain;
import org.bukkit.Bukkit;
+import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
@@ -13,17 +14,43 @@ public class LevelExpManager {
private static HashMap needExpMap = new HashMap<>();
public static void reloadLevelManager(PetMain plugin) {
+ needExpMap.clear();
+ ConfigurationSection section = plugin.getConfig().getConfigurationSection("NeedExpSettings");
+ if (section != null) {
+ loadNeedExpSection(section);
+ } else {
+ loadLegacyNeedExpFile(plugin);
+ }
+ Bukkit.getConsoleSender().sendMessage("§7- 等级经验配置: §f" + needExpMap.size() + "条");
+ }
+
+ private static void loadNeedExpSection(ConfigurationSection section) {
+ for (String levelKey : section.getKeys(false)) {
+ try {
+ int level = Integer.parseInt(levelKey);
+ int needExp = section.getInt(levelKey);
+ needExpMap.put(level, needExp);
+ } catch (NumberFormatException e) {
+ Bukkit.getConsoleSender().sendMessage("§c[宠物系统] 等级经验配置无效: " + levelKey);
+ }
+ }
+ }
+
+ private static void loadLegacyNeedExpFile(PetMain plugin) {
File file = new File(plugin.getDataFolder() + "/Settings", "needExp.yml");
- if (file.getParentFile().exists()) {
- file.getParentFile().mkdirs();
+ if (!file.exists()) {
+ return;
}
FileConfiguration config = YamlConfiguration.loadConfiguration(file);
for (String levelKey : config.getKeys(false)) {
- int level = Integer.parseInt(levelKey);
- int needExp = config.getInt(levelKey);
- needExpMap.put(level, needExp);
+ try {
+ int level = Integer.parseInt(levelKey);
+ int needExp = config.getInt(levelKey);
+ needExpMap.put(level, needExp);
+ } catch (NumberFormatException e) {
+ Bukkit.getConsoleSender().sendMessage("§c[宠物系统] 旧等级经验配置无效: " + levelKey);
+ }
}
- Bukkit.getConsoleSender().sendMessage("§7- 等级经验配置: §f" + needExpMap.size() + "条");
}
public static int getNeedExpValue(int level) {
@@ -32,4 +59,4 @@ public class LevelExpManager {
}
return 1000000;
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/yaohun/petsystem/manage/PlayerManager.java b/src/main/java/com/yaohun/petsystem/manage/PlayerManager.java
index 5e5e432..7295054 100644
--- a/src/main/java/com/yaohun/petsystem/manage/PlayerManager.java
+++ b/src/main/java/com/yaohun/petsystem/manage/PlayerManager.java
@@ -6,6 +6,7 @@ import com.yaohun.petsystem.data.PetData;
import com.yaohun.petsystem.data.PetSQL;
import com.yaohun.petsystem.data.PlayerData;
import com.yaohun.petsystem.event.PetCallEvent;
+import com.yaohun.petsystem.util.InventoryUtil;
import com.yaohun.petsystem.util.MessageUtil;
import com.yaohun.petsystem.util.model.BetterModelUtil;
import com.yaohun.petsystem.util.wolf.CustomWolf;
@@ -43,10 +44,10 @@ public class PlayerManager {
}
public void closeSaveData(String playerName) {
- PlayerData playerData = getPlayerData(playerName);
- playerData.savePlayerData();
- playerDataMap.remove(playerName);
-
+ PlayerData playerData = playerDataMap.remove(playerName);
+ if (playerData != null) {
+ playerData.savePlayerData();
+ }
removePetCall(playerName);
}
@@ -244,7 +245,7 @@ public class PlayerManager {
if (!nbtItem.hasKey("petKey")) {
Bukkit.getConsoleSender().sendMessage("[日志 - 宠物] 未检测到宠物petKey的Nbt标识.");
}
- player.getInventory().addItem(petStack);
+ InventoryUtil.giveOrDrop(player, petStack);
playerData.setPetStack(DemonAPI.getErrItems());
playerData.savePlayerData();
MessageUtil.sendMessageKey(player, "pet_stack_carry_takeOut", Sound.ENTITY_PLAYER_LEVELUP);
diff --git a/src/main/java/com/yaohun/petsystem/util/InventoryUtil.java b/src/main/java/com/yaohun/petsystem/util/InventoryUtil.java
new file mode 100644
index 0000000..6c5c51a
--- /dev/null
+++ b/src/main/java/com/yaohun/petsystem/util/InventoryUtil.java
@@ -0,0 +1,24 @@
+package com.yaohun.petsystem.util;
+
+import org.bukkit.Sound;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+import java.util.HashMap;
+
+public class InventoryUtil {
+
+ public static void giveOrDrop(Player player, ItemStack itemStack) {
+ if (player == null || itemStack == null) {
+ return;
+ }
+ HashMap leftoverMap = player.getInventory().addItem(itemStack);
+ if (leftoverMap.isEmpty()) {
+ return;
+ }
+ for (ItemStack leftover : leftoverMap.values()) {
+ player.getWorld().dropItemNaturally(player.getLocation(), leftover);
+ }
+ MessageUtil.sendMessage(player, "§e背包空间不足,剩余物品已掉落在当前位置。", Sound.ENTITY_ITEM_PICKUP);
+ }
+}
diff --git a/src/main/java/com/yaohun/petsystem/util/wolf/CustomWolf.java b/src/main/java/com/yaohun/petsystem/util/wolf/CustomWolf.java
index 8e70336..8aad5fe 100644
--- a/src/main/java/com/yaohun/petsystem/util/wolf/CustomWolf.java
+++ b/src/main/java/com/yaohun/petsystem/util/wolf/CustomWolf.java
@@ -1,130 +1,110 @@
package com.yaohun.petsystem.util.wolf;
+import com.yaohun.petsystem.PetMain;
import com.yaohun.petsystem.model.PetNbt;
-import net.minecraft.server.level.ServerLevel;
-import net.minecraft.world.damagesource.DamageSource;
-import net.minecraft.world.entity.Entity;
-import net.minecraft.world.entity.EntityType;
-import net.minecraft.world.entity.animal.wolf.Wolf;
-import net.minecraft.world.level.Level;
-import net.minecraft.world.phys.Vec3;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeInstance;
import org.bukkit.block.Block;
-import org.bukkit.craftbukkit.CraftWorld;
-import org.bukkit.craftbukkit.entity.CraftPlayer;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
+import org.bukkit.entity.Wolf;
+import org.bukkit.scheduler.BukkitRunnable;
import java.util.UUID;
-/**
- * 自定义的狼实体类,用于实现“跟随玩家”的宠物功能。
- * 继承原版 NMS Wolf 实体,通过 tick() 方法控制移动与传送。
- */
-public class CustomWolf extends Wolf {
+public class CustomWolf {
private static final double STOP_DISTANCE_SQ = 9.0D;
private static final double TELEPORT_DISTANCE_SQ = 144.0D;
- private static final double LOOK_DISTANCE_SQ = 256.0D;
private static final double FOLLOW_SPEED = 1.2D;
private static final double DEFAULT_MOVEMENT_SPEED = 0.4D;
- private static final int PATH_RECALC_TICKS = 10;
+ private static final long FOLLOW_INTERVAL_TICKS = 10L;
private final UUID ownerUuid;
+ private final Wolf wolf;
- private int timeToRecalcPath = 0;
-
- /**
- * 构造方法:初始化宠物实体
- *
- * @param world NMS 世界对象
- * @param owner 宠物主人(Bukkit Player)
- */
- public CustomWolf(Level world, Player owner) {
- super(EntityType.WOLF, world);
- this.ownerUuid = owner.getUniqueId();
+ private CustomWolf(UUID ownerUuid, Wolf wolf) {
+ this.ownerUuid = ownerUuid;
+ this.wolf = wolf;
+ startFollowTask();
}
- /**
- * 每 tick 执行的逻辑,控制宠物的移动与状态
- */
- @Override
- public void tick() {
- super.tick();
+ public Wolf getBukkitEntity() {
+ return wolf;
+ }
- Player owner = Bukkit.getPlayer(ownerUuid);
- if (owner == null || !owner.isOnline()) {
- this.discard();
- return;
- }
- if (owner.isDead()) {
- this.getNavigation().stop();
- return;
- }
- if (!owner.getWorld().equals(this.getBukkitEntity().getWorld())) {
- this.getNavigation().stop();
- teleportToOwnerLocation(owner);
- return;
- }
+ public LivingEntity getBukkitLivingEntity() {
+ return wolf;
+ }
- net.minecraft.world.entity.player.Player nmsOwner = ((CraftPlayer) owner).getHandle();
+ public UUID getUUID() {
+ return wolf.getUniqueId();
+ }
- double distanceSq = this.distanceToSqr(nmsOwner);
+ public boolean isRemoved() {
+ return !wolf.isValid();
+ }
- if (distanceSq < STOP_DISTANCE_SQ) {
- this.getNavigation().stop();
- return;
- }
+ public static CustomWolf spawnCustomWolf(Player owner, PetNbt petNbt) {
+ Wolf wolf = owner.getWorld().spawn(owner.getLocation(), Wolf.class, entity -> {
+ entity.setSilent(true);
+ entity.setTamed(true);
+ entity.setOwner(owner);
+ entity.setSitting(false);
+ entity.setRemoveWhenFarAway(false);
- boolean shouldTeleport = distanceSq > TELEPORT_DISTANCE_SQ;
+ double maxHealth = Math.max(1.0D, petNbt.maxHealth);
+ double health = Math.max(1.0D, Math.min(petNbt.health, maxHealth));
+ double damage = Math.max(0.0D, petNbt.damage);
- if (!shouldTeleport && distanceSq <= LOOK_DISTANCE_SQ) {
- this.getLookControl().setLookAt(nmsOwner, 10.0F, this.getMaxHeadXRot());
- }
+ setAttribute(entity, Attribute.MAX_HEALTH, maxHealth);
+ setAttribute(entity, Attribute.MOVEMENT_SPEED, DEFAULT_MOVEMENT_SPEED);
+ setAttribute(entity, Attribute.ATTACK_DAMAGE, damage);
+ entity.setHealth(health);
+ });
+ return new CustomWolf(owner.getUniqueId(), wolf);
+ }
- if (--this.timeToRecalcPath <= 0) {
- this.timeToRecalcPath = PATH_RECALC_TICKS;
-
- if (shouldTeleport) {
- if (!tryTeleportNearOwner(nmsOwner)) {
- this.getNavigation().moveTo(nmsOwner, FOLLOW_SPEED);
+ private void startFollowTask() {
+ new BukkitRunnable() {
+ @Override
+ public void run() {
+ if (!wolf.isValid() || wolf.isDead()) {
+ cancel();
+ return;
+ }
+ Player owner = Bukkit.getPlayer(ownerUuid);
+ if (owner == null || !owner.isOnline()) {
+ wolf.remove();
+ cancel();
+ return;
+ }
+ if (owner.isDead()) {
+ wolf.setTarget(null);
+ return;
+ }
+ if (!owner.getWorld().equals(wolf.getWorld())) {
+ teleportToOwner(owner);
+ return;
+ }
+ double distanceSq = wolf.getLocation().distanceSquared(owner.getLocation());
+ if (distanceSq < STOP_DISTANCE_SQ) {
+ wolf.setTarget(null);
+ return;
+ }
+ if (distanceSq > TELEPORT_DISTANCE_SQ) {
+ teleportToOwner(owner);
}
- } else {
- this.getNavigation().moveTo(nmsOwner, FOLLOW_SPEED);
}
- }
+ }.runTaskTimer(PetMain.inst(), FOLLOW_INTERVAL_TICKS, FOLLOW_INTERVAL_TICKS);
}
- /**
- * 当宠物距离主人太远时,尝试在主人周围随机传送
- *
- * @param nmsOwner 主人 NMS 实体
- */
- private boolean tryTeleportNearOwner(Entity nmsOwner) {
- Vec3 pos = nmsOwner.position();
-
- for (int i = 0; i < 10; i++) {
- int x = (int) Math.floor(pos.x) + (random.nextInt(7) - 3);
- int y = (int) Math.floor(pos.y);
- int z = (int) Math.floor(pos.z) + (random.nextInt(7) - 3);
-
- Location location = new Location(getBukkitEntity().getWorld(), x + 0.5D, y, z + 0.5D);
- if (isSafeTeleportLocation(location)) {
- this.teleportTo(location.getX(), location.getY(), location.getZ());
- this.getNavigation().stop();
- return true;
- }
- }
- return false;
- }
-
- private void teleportToOwnerLocation(Player owner) {
+ private void teleportToOwner(Player owner) {
Location location = owner.getLocation();
if (isSafeTeleportLocation(location)) {
- this.getBukkitEntity().teleport(location);
+ wolf.teleport(location);
}
}
@@ -132,65 +112,7 @@ public class CustomWolf extends Wolf {
Block feet = location.getBlock();
Block head = feet.getRelative(0, 1, 0);
Block ground = feet.getRelative(0, -1, 0);
- if (!feet.isPassable() || !head.isPassable() || !ground.getType().isSolid()) {
- return false;
- }
- if (!location.getWorld().equals(getBukkitEntity().getWorld())) {
- return true;
- }
- return this.level().noCollision(this, this.getBoundingBox().move(
- location.getX() - this.getX(),
- location.getY() - this.getY(),
- location.getZ() - this.getZ()
- ));
- }
-
- /**
- * 重写受伤方法,防止主人伤害到自己的宠物
- *
- * @param source 伤害来源
- * @param amount 伤害数值
- * @return 是否成功造成伤害
- */
- @Override
- public boolean hurtServer(ServerLevel level, DamageSource source, float amount) {
- Entity entity = source.getEntity();
-
- if (entity != null && entity.getUUID().equals(ownerUuid)) {
- return false;
- }
- return super.hurtServer(level, source, amount);
- }
-
- /**
- * 静态方法:用于在 Bukkit 世界中生成并注册一只 CustomWolf
- *
- * @param owner 宠物主人
- * @return 新生成的 CustomWolf 实例
- */
- public static CustomWolf spawnCustomWolf(Player owner, PetNbt petNbt) {
- CraftWorld world = (CraftWorld) owner.getWorld();
- Level nmsWorld = world.getHandle();
-
- CustomWolf wolf = new CustomWolf(nmsWorld, owner);
-
- wolf.setSilent(true);
- wolf.setOrderedToSit(false);
- wolf.setPos(owner.getLocation().getX(), owner.getLocation().getY(), owner.getLocation().getZ());
-
- LivingEntity livingEntity = wolf.getBukkitLivingEntity();
- double maxHealth = Math.max(1.0D, petNbt.maxHealth);
- double health = Math.max(1.0D, Math.min(petNbt.health, maxHealth));
- double damage = Math.max(0.0D, petNbt.damage);
-
- setAttribute(livingEntity, Attribute.MAX_HEALTH, maxHealth);
- setAttribute(livingEntity, Attribute.MOVEMENT_SPEED, DEFAULT_MOVEMENT_SPEED);
- setAttribute(livingEntity, Attribute.ATTACK_DAMAGE, damage);
- livingEntity.setHealth(health);
-
- nmsWorld.addFreshEntity(wolf);
-
- return wolf;
+ return feet.isPassable() && head.isPassable() && ground.getType().isSolid();
}
private static void setAttribute(LivingEntity entity, Attribute attribute, double value) {
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index 66b3172..44a2a9f 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -1,6 +1,12 @@
name: AuPet
main: com.yaohun.petsystem.PetMain
-version: 1.0.1
+version: 1.0.2
api-version: 1.21
+softdepend:
+ - DemonAPI
+ - NBTAPI
+ - MythicMobs
+ - BetterModel
+ - CraftDataManager
commands:
apet:
diff --git a/src/src/main/java/com/yaohun/petsystem/PetMain.java b/src/src/main/java/com/yaohun/petsystem/PetMain.java
deleted file mode 100644
index d9e9ec9..0000000
--- a/src/src/main/java/com/yaohun/petsystem/PetMain.java
+++ /dev/null
@@ -1,265 +0,0 @@
-package com.yaohun.petsystem;
-
-import com.yaohun.petsystem.api.PetExpAPI;
-import com.yaohun.petsystem.config.Config;
-import com.yaohun.petsystem.data.PetData;
-import com.yaohun.petsystem.data.PetSQL;
-import com.yaohun.petsystem.data.PlayerData;
-import com.yaohun.petsystem.data.SkillData;
-import com.yaohun.petsystem.gui.CarryGui;
-import com.yaohun.petsystem.gui.FeedingGui;
-import com.yaohun.petsystem.gui.MainGui;
-import com.yaohun.petsystem.listener.PetSkillsListener;
-import com.yaohun.petsystem.listener.PlayerListener;
-import com.yaohun.petsystem.listener.RePetNameListener;
-import com.yaohun.petsystem.manage.PetManager;
-import com.yaohun.petsystem.manage.PlayerManager;
-import com.yaohun.petsystem.model.PetNbt;
-import com.yaohun.petsystem.util.MessageUtil;
-import com.yaohun.petsystem.util.PetUtil;
-import de.tr7zw.nbtapi.NBTItem;
-import io.lumine.mythic.bukkit.MythicBukkit;
-import me.Demon.DemonPlugin.DemonAPI;
-import me.Demon.DemonPlugin.Util.CDTimeAPI;
-import org.bukkit.Bukkit;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.plugin.java.JavaPlugin;
-
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.UUID;
-import java.util.stream.Collectors;
-
-public class PetMain extends JavaPlugin {
-
- private static PetMain instance;
- private static PlayerManager playerManager;
-
-
- @Override
- public void onEnable() {
- instance = this;
- saveDefaultConfig();
-
- PetSQL.init();
-
- MessageUtil.init(this);
- Config.reloadConfig(this);
- PetManager.reloadPetManager();
- playerManager = new PlayerManager();
-
- getServer().getPluginManager().registerEvents(new MainGui(), this);
- getServer().getPluginManager().registerEvents(new FeedingGui(), this);
- getServer().getPluginManager().registerEvents(new CarryGui(), this);
-
- getServer().getPluginManager().registerEvents(new PlayerListener(), this);
- getServer().getPluginManager().registerEvents(new RePetNameListener(), this);
-
- getServer().getPluginManager().registerEvents(new PetSkillsListener(), this);
- }
-
- @Override
- public void onDisable() {
- getPlayerManager().closeSaveAllData();
- }
-
- @Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
- if (!sender.hasPermission("admin.use")) {
- if(args.length == 0){
- if (sender instanceof Player player) {
- MainGui.openGui(player);
- }
- return true;
- }
- return true;
- }
- String prefix = "§f[§c灵宠§f] §a";
- if (args.length == 0) {
- sender.sendMessage("§r");
- sender.sendMessage("§e==----- ======= §6宠物系统 §e======= -----==");
- sender.sendMessage("§2/" + label + " call §f- §2召唤宠物");
- sender.sendMessage("§2/" + label + " carry §f- §2携带手持宠物");
- if (sender.isOp()) {
- sender.sendMessage("§2/" + label + " addExp §e[经验] §b<玩家> §7true §f- §2给予玩家宠物");
- sender.sendMessage("§2/" + label + " give §e[宠物] §b<玩家> §f- §2给予玩家宠物");
- sender.sendMessage("§2/" + label + " reload §f- §2重载配置文件");
- }
- sender.sendMessage("§e==----- ======= §6宠物系统 §e======= -----==");
- sender.sendMessage("§r");
- return true;
- }
- if ("reload".equalsIgnoreCase(args[0])) {
- MessageUtil.init(this);
- Config.reloadConfig(this);
- PetManager.reloadPetManager();
- sender.sendMessage(prefix + "配置文件已重载完成.");
- return true;
- }
- if ("open".equalsIgnoreCase(args[0])) {
- if (sender instanceof Player player) {
- MainGui.openGui(player);
- }
- return true;
- }
- if ("test".equalsIgnoreCase(args[0])) {
- if (sender instanceof Player player) {
- // 判断玩家是否携带宠物
- String playerName = player.getName();
- PlayerManager playerManager = PetMain.getPlayerManager();
- // 获取宠物相关数据
- PlayerData playerData = playerManager.getPlayerData(playerName);
- if(playerData.isPetStackNull()){
- return true;
- }
- PetData petData = playerData.getPetNbt().petData;
- LinkedHashMap skillDataMap = petData.getSkillDataMap();
- for(SkillData skillData : skillDataMap.values()){
- String cdKey = "skill_"+skillData.getSkillName();
- if ("onAttack".equalsIgnoreCase(skillData.getTrigger())) {
- UUID uuid = player.getUniqueId();
- if(!CDTimeAPI.isCD(uuid,cdKey)) {
- long cooldown = skillData.getCoolDown();
- CDTimeAPI.setPlayerCD(uuid, cdKey, cooldown);
- String mmSkill = skillData.getMmSkill();
- // 执行技能
- MythicBukkit.inst().getAPIHelper().castSkill(
- player,
- mmSkill,
- player.getLocation()
- );
- player.sendMessage("[调试 - 宠物技能] 触发条件: onAttack 触发技能: "+mmSkill);
- break;
- } else {
- sender.sendMessage("# 拦截 冷却中...");
- }
- }
- }
- }
- return true;
- }
- if ("carry".equalsIgnoreCase(args[0])) {
- String playerName = sender.getName();
- if (args.length >= 2) {
- playerName = args[1];
- }
- Player player = Bukkit.getPlayer(playerName);
- if (player == null || !player.isOnline()) {
- sender.sendMessage(prefix + "玩家 " + playerName + " 不在线.");
- return true;
- }
- getPlayerManager().carryPetStackData(player);
- return true;
- }
- if ("call".equalsIgnoreCase(args[0])) {
- String playerName = sender.getName();
- if (args.length >= 2) {
- playerName = args[1];
- }
- Player player = Bukkit.getPlayer(playerName);
- if (player == null || !player.isOnline()) {
- sender.sendMessage(prefix + "玩家 " + playerName + " 不在线.");
- return true;
- }
- if (playerManager.isPetCallExit(playerName)) {
- playerManager.removePetCall(playerName);
- sender.sendMessage(prefix + "已收回 §6" + playerName + " §a的宠物.");
- } else {
- playerManager.callPet(player);
- sender.sendMessage(prefix + "已召唤 §6" + playerName + " §a的宠物.");
- }
- return true;
- }
- if ("addexp".equalsIgnoreCase(args[0])) {
- if (args.length == 1) {
- sender.sendMessage(prefix + "缺少数值参数.");
- return true;
- }
- int exp = Integer.parseInt(args[1]);
- // 获取玩家数据
- String playerName = sender.getName();
- if (args.length >= 3) {
- playerName = args[2];
- }
- Player player = Bukkit.getPlayer(playerName);
- if (player == null || !player.isOnline()) {
- sender.sendMessage(prefix + "玩家 " + playerName + " 不在线.");
- return true;
- }
- if (args.length >= 4) {
- ItemStack stack = player.getInventory().getItemInMainHand();
- if (DemonAPI.itemIsNull(stack) || DemonAPI.itemIsLore(stack)) {
- sender.sendMessage(prefix + "执行失败,你需要将灵宠拿在手中.");
- return true;
- }
- NBTItem nbtItem = new NBTItem(stack);
- if (!nbtItem.hasKey("petKey")) {
- sender.sendMessage(prefix + "执行失败,你需要将灵宠拿在手中.");
- return true;
- }
- PetNbt petNbt = PetExpAPI.addExp(playerName, stack, exp);
- ItemStack petStack = PetUtil.refreshPetStackData(petNbt);
- player.getInventory().setItemInMainHand(petNbt.saveIoItem(petStack));
- sender.sendMessage(prefix + "给予 §6手持灵宠 §a经验: §d+" + exp);
- } else {
- PetExpAPI.addExp(player, exp);
- sender.sendMessage(prefix + "给予 §6" + playerName + " §a的灵宠经验: §d+" + exp);
- }
- return true;
- }
- if ("give".equalsIgnoreCase(args[0])) {
- if (args.length == 1) {
- sender.sendMessage(prefix + "缺少宠物参数.");
- return true;
- }
- String petKey = args[1];
- PetData petData = PetManager.getPetData(petKey);
- if (petData == null) {
- sender.sendMessage(prefix + "未找到 " + petKey + " 的相关配置.");
- return true;
- }
- String playerName = sender.getName();
- if (args.length >= 3) {
- playerName = args[2];
- }
- Player player = Bukkit.getPlayer(playerName);
- if (player == null) {
- sender.sendMessage(prefix + "未找到玩家 " + playerName);
- return true;
- }
- PetNbt petNbt = new PetNbt(petData);
- ItemStack petStack = PetUtil.getPetStackDefault(petNbt);
- player.getInventory().addItem(petNbt.saveIoItem(petStack));
- DemonAPI.sendMessage(sender, "玩家: §e" + playerName + " §a宠物: §6" + petKey + " §r[背包]");
- return true;
- }
- return false;
- }
-
- @Override
- public List onTabComplete(CommandSender sender, Command command, String label, String[] args) {
- if (sender.isOp()) {
- if (args.length == 2 && "give".equalsIgnoreCase(args[0])) {
- return PetManager.getPetDataMap().keySet().stream()
- .filter(s -> s.toLowerCase().startsWith(args[1].toLowerCase()))
- .collect(Collectors.toList());
- }
- }
- // 如果不符合上述条件,则返回空列表
- return Collections.emptyList();
- }
-
- public static PetMain inst() {
- return instance;
- }
-
- public static PlayerManager getPlayerManager() {
- return playerManager;
- }
-
-}
\ No newline at end of file
diff --git a/src/src/main/java/com/yaohun/petsystem/api/PetExpAPI.java b/src/src/main/java/com/yaohun/petsystem/api/PetExpAPI.java
deleted file mode 100644
index 1126330..0000000
--- a/src/src/main/java/com/yaohun/petsystem/api/PetExpAPI.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package com.yaohun.petsystem.api;
-
-import com.yaohun.petsystem.PetMain;
-import com.yaohun.petsystem.data.PetData;
-import com.yaohun.petsystem.data.PlayerData;
-import com.yaohun.petsystem.manage.LevelExpManager;
-import com.yaohun.petsystem.manage.PetManager;
-import com.yaohun.petsystem.manage.PlayerManager;
-import com.yaohun.petsystem.model.PetNbt;
-import de.tr7zw.nbtapi.NBTItem;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-
-public class PetExpAPI {
-
- public static void addExp(Player player, int addExp) {
- String playerName = player.getName();
- PlayerManager playerManager = PetMain.getPlayerManager();
- PlayerData playerData = playerManager.getPlayerData(playerName);
- if (playerData.isPetStackNull()) {
- System.out.println("[日志 - 灵宠] 玩家 " + playerName + " 尚未携带宠物.");
- return;
- }
- PetNbt petNbt = playerData.getPetNbt();
- String petKey = petNbt.petData.getFileName();
- PetData petData = PetManager.getPetData(petKey);
- if (petData == null) {
- System.out.println("[日志 - 灵宠] 未添加 " + petKey + " 的宠物配置.");
- return;
- }
- int petLevel = petNbt.level;
- if (petLevel >= petData.getMaxLevel()) {
- return;
- }
- // 进化阶段判断
- int evolution = petNbt.evolution;
- if (evolution == 1) {
- if (petLevel >= 20) {
- return;
- }
- } else if (evolution == 2) {
- if (petLevel >= 40) {
- return;
- }
- } else if (evolution == 3) {
- if (petLevel >= 60) {
- return;
- }
- } else if (evolution == 4) {
- if (petLevel >= 70) {
- return;
- }
- } else if (evolution == 5) {
- if (petLevel >= 75) {
- return;
- }
- }
- int needExp = LevelExpManager.getNeedExpValue(petLevel);
- petNbt.setTotalExp(petNbt.totalExp + addExp);
-
- int nowExp = petNbt.exp;
- addExp = nowExp + addExp;
- while (addExp >= needExp) {
- if (petLevel < 0) {
- break;
- }
- addExp -= needExp;
- petLevel++;
- needExp = LevelExpManager.getNeedExpValue(petLevel);
- bcmupLevelEvant(playerName, petLevel);
- playerData.refreshPetStack();
- }
- petNbt.setExp(addExp);
- petNbt.setLevel(petLevel);
- playerData.savePlayerData();
- }
-
- public static PetNbt addExp(String playerName, ItemStack stack, int addExp) {
- NBTItem nbtItem = new NBTItem(stack);
- String petKey = nbtItem.getString("petKey");
- PetData petData = PetManager.getPetData(petKey);
- if (petData == null) {
- System.out.println("[日志 - 灵宠] 未添加 " + petKey + " 的宠物配置.");
- return null;
- }
- PetNbt petNbt = new PetNbt();
- petNbt.loadNbtData(nbtItem);
- int petLevel = petNbt.level;
- if (petLevel >= petData.getMaxLevel()) {
- return petNbt;
- }
- int needExp = LevelExpManager.getNeedExpValue(petLevel);
- petNbt.setTotalExp(petNbt.totalExp + addExp);
-
- int nowExp = petNbt.exp;
- addExp = nowExp + addExp;
- while (addExp >= needExp) {
- if (petLevel < 0) {
- break;
- }
- addExp -= needExp;
- petLevel++;
- needExp = LevelExpManager.getNeedExpValue(petLevel);
- bcmupLevelEvant(playerName, petLevel);
- }
- petNbt.setExp(addExp);
- petNbt.setLevel(petLevel);
- return petNbt;
- }
-
- public static void bcmupLevelEvant(String playerName, int level) {
- boolean butt = false;
- if (level == 10 || level == 20 || level == 30 || level == 40 || level == 50 ||
- level == 60 || level == 70 || level == 80 || level == 90 || level == 100
- || level == 105 || level == 110 || level == 115 || level == 120 || level == 125) {
- butt = true;
- }
- if (butt) {
- // Bukkit.broadcastMessage("§f[§c§l公告§f] §a玩家§e"+playName+"§a本月器师手礼达到了 §7[§e§lLv."+level+"§7]");
- }
- }
-}
\ No newline at end of file
diff --git a/src/src/main/java/com/yaohun/petsystem/command/PetCommand.java b/src/src/main/java/com/yaohun/petsystem/command/PetCommand.java
deleted file mode 100644
index 6572657..0000000
--- a/src/src/main/java/com/yaohun/petsystem/command/PetCommand.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.yaohun.petsystem.command;
-
-public class PetCommand {
-}
diff --git a/src/src/main/java/com/yaohun/petsystem/config/Config.java b/src/src/main/java/com/yaohun/petsystem/config/Config.java
deleted file mode 100644
index 5c44203..0000000
--- a/src/src/main/java/com/yaohun/petsystem/config/Config.java
+++ /dev/null
@@ -1,141 +0,0 @@
-package com.yaohun.petsystem.config;
-
-import com.yaohun.petsystem.PetMain;
-import com.yaohun.petsystem.manage.LevelExpManager;
-import com.yaohun.petsystem.util.MessageUtil;
-import me.Demon.DemonPlugin.DemonAPI;
-import me.Demon.DemonPlugin.Util.ColorUtil;
-import me.Demon.DemonPlugin.data.GuiItemData;
-import org.bukkit.Bukkit;
-import org.bukkit.Material;
-import org.bukkit.configuration.ConfigurationSection;
-import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.meta.ItemMeta;
-
-import java.util.*;
-
-public class Config {
-
- private static ItemStack petStackTemplate;
- private static NavigableMap qualityShowMap = new TreeMap<>();
- private static HashMap guiItemDataMap = new HashMap<>();
-
- public static void reloadConfig(PetMain plugin) {
- plugin.reloadConfig();
- plugin.saveConfig();
- FileConfiguration config = plugin.getConfig();
- Bukkit.getConsoleSender().sendMessage("§6[宠物系统] §7参数设定:");
- LevelExpManager.reloadLevelManager(plugin);
- loadPetStackTemplate(config);
- loadGuiItemData(config);
- loadQualityShowMap(config);
- }
-
- private static void loadGuiItemData(FileConfiguration config) {
- guiItemDataMap.clear();
- ConfigurationSection section = config.getConfigurationSection("GuiItemData");
- if (section == null) {
- return;
- }
- for (String itemKey : section.getKeys(false)) {
- guiItemDataMap.put(itemKey, new GuiItemData(itemKey, section));
- }
- }
-
- private static void loadQualityShowMap(FileConfiguration config) {
- ConfigurationSection section = config.getConfigurationSection("QualityShow");
- if (section == null) {
- return;
- }
- for (String levelKey : section.getKeys(false)) {
- int level = Integer.parseInt(levelKey);
- String show = section.getString(levelKey).replace("&", "§");
- qualityShowMap.put(level, show);
- }
- Bukkit.getConsoleSender().sendMessage("- 资质稀有度: §f" + qualityShowMap.size() + "个");
- }
-
- private static void loadPetStackTemplate(FileConfiguration config) {
- String stackType = config.getString("Pet_Stack_Template.type", "DIAMOND");
- Material material;
- try {
- material = Material.valueOf(stackType.toUpperCase());
- } catch (IllegalArgumentException e) {
- Bukkit.getConsoleSender().sendMessage("- 宠物模板载入: §c失败");
- return;
- }
- String stackName = config.getString("Pet_Stack_Template.name", "§f宠物");
- List stringList = config.getStringList("Pet_Stack_Template.lore");
- List stackLore = ColorUtil.listcolor(stringList);
- ItemStack itemStack = new ItemStack(material);
- ItemMeta meta = itemStack.getItemMeta();
- meta.setDisplayName(stackName);
- meta.setLore(stackLore);
- itemStack.setItemMeta(meta);
- petStackTemplate = itemStack;
-
- String itemName = DemonAPI.getItemName(itemStack.clone());
- Bukkit.getConsoleSender().sendMessage("- 宠物模板载入: §f" + itemName);
- }
-
- public static ItemStack getPetStackTemplate() {
- return petStackTemplate.clone();
- }
-
- public static String getLanguage(String key) {
- HashMap hashMap = MessageUtil.getLanguageMap();
- if (hashMap.containsKey(key)) {
- return hashMap.get(key);
- }
- return "缺少参数.§7" + key;
- }
-
- public static ItemStack getItemStack(String itemKey) {
- if (guiItemDataMap.containsKey(itemKey)) {
- ItemStack itemStack = guiItemDataMap.get(itemKey).getItemStack().clone();
- if (itemStack.hasItemMeta()) {
- ItemMeta meta = itemStack.getItemMeta();
- if (meta.hasLore()) {
- List originalLore = meta.getLore();
- if (originalLore != null) {
- // 创建新的lore列表进行处理
- List newLore = new ArrayList<>();
- for (String line : originalLore) {
- // 应用颜色转换或其他处理逻辑
- newLore.add(DemonAPI.convertHexColor(line));
- }
- // 设置处理后的新lore
- meta.setLore(newLore);
- itemStack.setItemMeta(meta);
- }
- }
- }
- return itemStack;
- }
- return DemonAPI.getErrItems();
- }
-
-
- public static String getQualityShow(int value) {
- Map.Entry entry = qualityShowMap.floorEntry(value);
- return entry != null ? entry.getValue() : qualityShowMap.get(0);
- }
-
- public static String getHealthChar(int percent) {
- // 限制范围 [0,100]
- percent = Math.max(0, Math.min(100, percent));
- // 取整到最近的 10 倍数,例如 87 → 80,93 → 90
- int step = (percent / 10) * 10;
- // 处理 100 特殊情况
- if (percent == 100) {
- step = 100;
- }
- return "§f";
- }
-
- public static String getLevelChar(int level) {
- return "§f";
- }
-
-}
\ No newline at end of file
diff --git a/src/src/main/java/com/yaohun/petsystem/data/PetData.java b/src/src/main/java/com/yaohun/petsystem/data/PetData.java
deleted file mode 100644
index ae42937..0000000
--- a/src/src/main/java/com/yaohun/petsystem/data/PetData.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package com.yaohun.petsystem.data;
-
-import org.bukkit.configuration.ConfigurationSection;
-import org.bukkit.configuration.file.FileConfiguration;
-
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-
-public class PetData {
- private String fileName;
- private String petName;
- private int customIconModelId;
- private int maxLevel;
- private String modelId;
- private List accessChannelsList;
- private String summonSkill;
- private String deathSkill;
- private LinkedHashMap skillDataMap = new LinkedHashMap<>();
-
- public PetData(String fileName, FileConfiguration config) {
- this.fileName = fileName;
- this.petName = config.getString("PetName");
- this.maxLevel = config.getInt("MaxLevel");
- this.modelId = config.getString("ModelId");
- this.customIconModelId = config.getInt("CustomIconModelId");
- this.accessChannelsList = config.getStringList("AccessChannels");
- this.summonSkill = config.getString("SummonSkill", "default");
- this.deathSkill = config.getString("DeathSkill", "default");
- loadSkillData(config);
- }
-
- private void loadSkillData(FileConfiguration config) {
- ConfigurationSection section = config.getConfigurationSection("Skills");
- if (section == null) {
- return;
- }
- for (String key : section.getKeys(false)) {
- SkillData skillData = new SkillData(key, section);
- skillDataMap.put(key, skillData);
- }
- }
-
- public String getFileName() {
- return fileName;
- }
-
- public String getPetName() {
- return petName;
- }
-
- public int getMaxLevel() {
- return maxLevel;
- }
-
- public String getModelId() {
- return modelId;
- }
-
- public int getCustomIconModelId() {
- return customIconModelId;
- }
-
- public List getAccessChannelsList() {
- return accessChannelsList;
- }
-
- public String getSummonSkill() {
- return summonSkill;
- }
-
- public String getDeathSkill() {
- return deathSkill;
- }
-
- public LinkedHashMap getSkillDataMap() {
- return skillDataMap;
- }
-
- public SkillData getSkillData(String skillName) {
- if (skillDataMap.containsKey(skillName)) {
- return skillDataMap.get(skillName);
- }
- return null;
- }
-}
\ No newline at end of file
diff --git a/src/src/main/java/com/yaohun/petsystem/data/PetSQL.java b/src/src/main/java/com/yaohun/petsystem/data/PetSQL.java
deleted file mode 100644
index c6074b2..0000000
--- a/src/src/main/java/com/yaohun/petsystem/data/PetSQL.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package com.yaohun.petsystem.data;
-
-import com.tianyu.datamanager.DataAPI;
-import com.zaxxer.hikari.HikariConfig;
-import com.zaxxer.hikari.HikariDataSource;
-import org.bukkit.Bukkit;
-
-import java.sql.*;
-
-public class PetSQL {
-
- private static HikariDataSource dataSource;
- private static String host;
- private static String port;
- private static String database;
- private static String tables;
- private static String username;
- private static String password;
-
- // 初始化数据库连接和表结构
- public static void init() {
- host = DataAPI.getMysql().getHost();
- port = DataAPI.getMysql().getPort();
- database = DataAPI.getMysql().getDatabase();
- tables = "aupets_data";
- username = DataAPI.getMysql().getUser();
- password = DataAPI.getMysql().getPassword();
-
- setupDataSource(); // 初始化连接池
- initTable(); // 确保表结构已经创建
- }
-
- // 配置并初始化 HikariCP 连接池
- private static void setupDataSource() {
- HikariConfig config = new HikariConfig();
- config.setDriverClassName("com.mysql.cj.jdbc.Driver");
- config.setJdbcUrl("jdbc:mysql://" + host + ":" + port + "/" + database + "?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false");
- config.setUsername(username);
- config.setPassword(password);
- config.setMaximumPoolSize(3);
- config.setMinimumIdle(1);
- config.setIdleTimeout(300000L);
- config.setMaxLifetime(0L);
- dataSource = new HikariDataSource(config);
- }
-
- // 初始化表结构(如果表不存在)
- private static void initTable() {
- String createTableSQL = "CREATE TABLE IF NOT EXISTS " + tables + " (" +
- "PLAYERNAME VARCHAR(255) NOT NULL, " +
- "PETSTACK TEXT NOT NULL, " +
- "PRIMARY KEY (PLAYERNAME))";
- try (Connection conn = getConnection(); Statement stmt = conn.createStatement()) {
- stmt.execute(createTableSQL);
- } catch (SQLException e) {
- Bukkit.getLogger().severe("初始化表结构失败: " + e.getMessage());
- }
- }
-
- // 获取玩家宠物信息
- public static String getPetStack(String playerName) {
- String query = "SELECT PETSTACK FROM " + tables + " WHERE PLAYERNAME = ? LIMIT 1";
- try (Connection conn = getConnection();
- PreparedStatement ps = conn.prepareStatement(query)) {
- ps.setString(1, playerName);
- try (ResultSet rs = ps.executeQuery()) {
- if (rs.next()) {
- return rs.getString("PETSTACK");
- }
- }
- } catch (SQLException e) {
- Bukkit.getLogger().severe("获取字符串值失败: " + e.getMessage());
- }
- return null;
- }
-
-
- // 保存数据
- public static void saveData(String playerName, String petStack) {
- String sql = "INSERT INTO " + tables + " (PLAYERNAME, PETSTACK) " +
- "VALUES (?, ?) " + "ON DUPLICATE KEY UPDATE PETSTACK = VALUES(PETSTACK)";
- try (Connection conn = getConnection();
- PreparedStatement ps = conn.prepareStatement(sql)) {
- ps.setString(1, playerName);
- ps.setString(2, petStack);
- ps.executeUpdate();
- } catch (SQLException e) {
- Bukkit.getLogger().severe("保存宠物数据失败: " + e.getMessage());
- }
- }
-
- // 获取数据库连接
- private static Connection getConnection() throws SQLException {
- return dataSource.getConnection();
- }
-
- // 关闭连接池
- public static void closeConnection() {
- if (dataSource != null && !dataSource.isClosed()) {
- dataSource.close();
- Bukkit.getConsoleSender().sendMessage("数据库连接已成功关闭。#1");
- }
- }
-
-}
\ No newline at end of file
diff --git a/src/src/main/java/com/yaohun/petsystem/data/PlayerData.java b/src/src/main/java/com/yaohun/petsystem/data/PlayerData.java
deleted file mode 100644
index a6c999b..0000000
--- a/src/src/main/java/com/yaohun/petsystem/data/PlayerData.java
+++ /dev/null
@@ -1,136 +0,0 @@
-package com.yaohun.petsystem.data;
-
-import com.yaohun.petsystem.model.PetNbt;
-import com.yaohun.petsystem.util.PetUtil;
-import de.tr7zw.nbtapi.NBTItem;
-import me.Demon.DemonPlugin.DemonAPI;
-import net.kyori.adventure.text.Component;
-import net.kyori.adventure.text.format.NamedTextColor;
-import net.kyori.adventure.text.format.TextDecoration;
-import org.bukkit.Bukkit;
-import org.bukkit.Material;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.meta.ItemMeta;
-import org.bukkit.util.io.BukkitObjectInputStream;
-import org.bukkit.util.io.BukkitObjectOutputStream;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.Base64;
-
-public class PlayerData {
-
- private String playerName;
- private ItemStack petStack;
- private PetNbt petNbt;
-
- public PlayerData(String playerName) {
- this.playerName = playerName;
- this.petStack = deserializeItemStack(PetSQL.getPetStack(playerName));
- if (isPetStackNull()) {
- return;
- }
- PetNbt petNbt = new PetNbt();
- NBTItem nbtItem = new NBTItem(petStack);
- petNbt.loadNbtData(nbtItem);
- this.petNbt = petNbt;
- }
-
- public String getPlayerName() {
- return playerName;
- }
-
- public PetNbt getPetNbt() {
- return petNbt;
- }
-
- public ItemStack getPetStack() {
- return petStack;
- }
-
- public void rePetNameStack(String newName) {
- ItemStack stack = petStack.clone();
- ItemMeta meta = stack.getItemMeta();
- meta.displayName(Component.text(newName)
- .color(NamedTextColor.GREEN)
- .decoration(TextDecoration.ITALIC, false));
- stack.setItemMeta(meta);
- setPetStack(stack);
- }
-
- public void setPetStack(ItemStack petStack) {
- this.petStack = petStack;
- if (isPetStackNull()) {
- return;
- }
- PetNbt petNbt = new PetNbt();
- NBTItem nbtItem = new NBTItem(petStack);
- petNbt.loadNbtData(nbtItem);
- this.petNbt = petNbt;
- }
-
- public void refreshPetStack() {
- ItemStack itemStack = PetUtil.getPetStackDefault(petNbt);
- ItemMeta meta = itemStack.getItemMeta();
- meta.displayName(Component.text(petStack.getItemMeta().getDisplayName())
- .color(NamedTextColor.GREEN)
- .decoration(TextDecoration.ITALIC, false));
-
- petStack = petNbt.saveIoItem(itemStack);
- }
-
- public void savePlayerData() {
- if (DemonAPI.itemIsNull(petStack)) {
- PetSQL.saveData(playerName, serializeItemStack(DemonAPI.getErrItems()));
- } else {
- PetSQL.saveData(playerName, serializeItemStack(petStack));
- }
- }
-
- public boolean isPetStackNull() {
- return petStack == null || petStack.getType().equals(Material.BARRIER);
- }
-
- /**
- * 将 ItemStack 序列化为 Base64 字符串
- *
- * @param itemStack 要序列化的 ItemStack
- * @return 序列化后的 Base64 字符串
- */
- private String serializeItemStack(ItemStack itemStack) {
- if (itemStack == null) {
- return "";
- }
- try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
- BukkitObjectOutputStream dataOutput = new BukkitObjectOutputStream(outputStream)) {
- dataOutput.writeObject(itemStack);
- return Base64.getEncoder().encodeToString(outputStream.toByteArray());
- } catch (IOException e) {
- Bukkit.getLogger().warning("[日志 - 灵宠] 序列化 ItemStack 时出错: " + e.getMessage());
- return "";
- }
- }
-
- /**
- * 从 Base64 字符串反序列化为 ItemStack
- *
- * @param data Base64 字符串
- * @return 反序列化后的 ItemStack
- */
- private ItemStack deserializeItemStack(String data) {
- if (data == null || data.isEmpty()) {
- return null;
- }
- try {
- byte[] decodedData = Base64.getDecoder().decode(data);
- try (ByteArrayInputStream inputStream = new ByteArrayInputStream(decodedData);
- BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream)) {
- return (ItemStack) dataInput.readObject();
- }
- } catch (Exception e) {
- Bukkit.getLogger().warning("[日志 - 灵宠] 反序列化 ItemStack 时出错: " + e.getMessage());
- return DemonAPI.getErrItems();
- }
- }
-}
\ No newline at end of file
diff --git a/src/src/main/java/com/yaohun/petsystem/data/SkillData.java b/src/src/main/java/com/yaohun/petsystem/data/SkillData.java
deleted file mode 100644
index 1588fea..0000000
--- a/src/src/main/java/com/yaohun/petsystem/data/SkillData.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.yaohun.petsystem.data;
-
-import me.Demon.DemonPlugin.DemonAPI;
-import org.bukkit.configuration.ConfigurationSection;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class SkillData {
-
- private String skillName; // 技能名
- private String mmSkill; // MM技能
- private int needLevel; // 触发要求等级
- private String trigger; // 触发器
- private long coolDown; // 冷却时间
- private String itemName;
- private List itemLore = new ArrayList<>();
-
- public SkillData(String skillName, ConfigurationSection section) {
- this.skillName = skillName;
- this.mmSkill = section.getString(skillName + ".mmSkill");
- this.needLevel = section.getInt(skillName + ".needLevel");
- this.trigger = section.getString(skillName + ".trigger");
- this.coolDown = section.getLong(skillName + ".coolDown");
- this.itemName = DemonAPI.convertHexColor(section.getString(skillName + ".item.name", "技能 I"));
- List itemlore = section.getStringList(skillName + ".item.lore");
- // Bukkit.getConsoleSender().sendMessage("[调试] name: "+skillName+" itemlore = "+itemlore);
- for (String line : itemlore) {
- this.itemLore.add(DemonAPI.convertHexColor(line));
- }
- }
-
- public String getSkillName() {
- return skillName;
- }
-
- public String getMmSkill() {
- return mmSkill;
- }
-
- public int getNeedLevel() {
- return needLevel;
- }
-
- public String getTrigger() {
- return trigger;
- }
-
- public long getCoolDown() {
- return coolDown;
- }
-
- public String getItemName() {
- return itemName;
- }
-
- public List getItemLore() {
- return itemLore;
- }
-}
\ No newline at end of file
diff --git a/src/src/main/java/com/yaohun/petsystem/event/PetCallEvent.java b/src/src/main/java/com/yaohun/petsystem/event/PetCallEvent.java
deleted file mode 100644
index 629dee4..0000000
--- a/src/src/main/java/com/yaohun/petsystem/event/PetCallEvent.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.yaohun.petsystem.event;
-
-import org.bukkit.entity.Player;
-import org.bukkit.event.Event;
-import org.bukkit.event.HandlerList;
-
-import java.util.UUID;
-
-public class PetCallEvent extends Event {
-
- private final Player owner;
- private final String cutomName;
- private final UUID entityUuid;
- private static final HandlerList handlers = new HandlerList();
-
- public PetCallEvent(Player owner, String cutomName, UUID entityUuid) {
- this.owner = owner;
- this.cutomName = cutomName;
- this.entityUuid = entityUuid;
- }
-
- @Override
- public HandlerList getHandlers() {
- return handlers;
- }
-
- public static HandlerList getHandlerList() {
- return handlers;
- }
-
- public Player getOwner() {
- return owner;
- }
-
- public String getCutomName() {
- return cutomName;
- }
-
- public UUID getEntityUuid() {
- return entityUuid;
- }
-
- @Override
- public String getEventName() {
- return super.getEventName();
- }
-}
diff --git a/src/src/main/java/com/yaohun/petsystem/gui/CarryGui.java b/src/src/main/java/com/yaohun/petsystem/gui/CarryGui.java
deleted file mode 100644
index a3851ad..0000000
--- a/src/src/main/java/com/yaohun/petsystem/gui/CarryGui.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package com.yaohun.petsystem.gui;
-
-import com.yaohun.petsystem.PetMain;
-import com.yaohun.petsystem.config.Config;
-import com.yaohun.petsystem.data.PlayerData;
-import com.yaohun.petsystem.gui.holder.CarryGuiHolder;
-import com.yaohun.petsystem.manage.PlayerManager;
-import com.yaohun.petsystem.util.MessageUtil;
-import de.tr7zw.nbtapi.NBTItem;
-import me.Demon.DemonPlugin.DemonAPI;
-import org.bukkit.Bukkit;
-import org.bukkit.Material;
-import org.bukkit.Sound;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.inventory.InventoryClickEvent;
-import org.bukkit.inventory.Inventory;
-import org.bukkit.inventory.ItemStack;
-
-public class CarryGui implements Listener {
-
- private static final int PET_SLOT = 4;
-
- public static void openGui(Player player) {
- String playerName = player.getName();
- PlayerManager playerManager = PetMain.getPlayerManager();
- PlayerData playerData = playerManager.getPlayerData(playerName);
- Inventory inv = Bukkit.createInventory(new CarryGuiHolder(), 9, Config.getLanguage("carry_gui_title"));
- if (playerData.isPetStackNull()) {
- inv.setItem(PET_SLOT, Config.getItemStack("carry_gui"));
- } else {
- inv.setItem(PET_SLOT, playerData.getPetStack());
- }
- player.openInventory(inv);
- }
-
- @EventHandler
- public void onClick(InventoryClickEvent e) {
- int rawSlot = e.getRawSlot();
- Player player = (Player) e.getWhoClicked();
- Inventory inv = e.getInventory();
- if ((e.getInventory().getHolder() instanceof CarryGuiHolder)) {
- e.setCancelled(true);
- ItemStack stack = e.getCurrentItem();
- if (DemonAPI.itemIsNull(stack)) {
- return;
- }
- String playerName = player.getName();
- PlayerManager playerManager = PetMain.getPlayerManager();
- PlayerData playerData = playerManager.getPlayerData(playerName);
- if (rawSlot == PET_SLOT) {
- if (!playerData.isPetStackNull()) {
- playerManager.removePetCall(playerName);
- playerData.refreshPetStack();
- ItemStack petStack = playerData.getPetStack();
- player.getInventory().addItem(petStack);
- playerData.setPetStack(DemonAPI.getErrItems());
- playerData.savePlayerData();
- inv.setItem(PET_SLOT, Config.getItemStack("carry_gui"));
- }
- return;
- }
- if (playerData.isPetStackNull()) {
- NBTItem nbtItem = new NBTItem(stack);
- if (!nbtItem.hasKey("petKey")) {
- MessageUtil.sendMessageKey(player, "hand_not_pet_stack", Sound.ENTITY_VILLAGER_NO);
- return;
- }
- e.setCurrentItem(new ItemStack(Material.AIR));
- playerData.setPetStack(stack);
- playerData.savePlayerData();
- String itemName = DemonAPI.getItemName(stack);
- String message = Config.getLanguage("pet_stack_carry_success");
- MessageUtil.sendMessage(player, message.replace("{petName}", itemName), Sound.ENTITY_PLAYER_LEVELUP);
- MainGui.openGui(player);
- } else {
- playerManager.removePetCall(playerName);
- playerData.refreshPetStack();
- ItemStack petStack = playerData.getPetStack();
- player.getInventory().addItem(petStack);
- playerData.setPetStack(DemonAPI.getErrItems());
- playerData.savePlayerData();
- MessageUtil.sendMessageKey(player, "pet_stack_carry_takeOut", Sound.ENTITY_PLAYER_LEVELUP);
- }
- }
-
- }
-}
diff --git a/src/src/main/java/com/yaohun/petsystem/gui/FeedingGui.java b/src/src/main/java/com/yaohun/petsystem/gui/FeedingGui.java
deleted file mode 100644
index 88c0211..0000000
--- a/src/src/main/java/com/yaohun/petsystem/gui/FeedingGui.java
+++ /dev/null
@@ -1,206 +0,0 @@
-package com.yaohun.petsystem.gui;
-
-import com.yaohun.petsystem.PetMain;
-import com.yaohun.petsystem.api.PetExpAPI;
-import com.yaohun.petsystem.config.Config;
-import com.yaohun.petsystem.data.PlayerData;
-import com.yaohun.petsystem.gui.holder.FeedingGuiHolder;
-import com.yaohun.petsystem.manage.LevelExpManager;
-import com.yaohun.petsystem.manage.PlayerManager;
-import com.yaohun.petsystem.model.PetNbt;
-import com.yaohun.petsystem.util.MessageUtil;
-import com.yaohun.petsystem.util.PetUtil;
-import de.tr7zw.nbtapi.NBTItem;
-import me.Demon.DemonPlugin.DemonAPI;
-import org.bukkit.Bukkit;
-import org.bukkit.Sound;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.inventory.InventoryClickEvent;
-import org.bukkit.event.inventory.InventoryCloseEvent;
-import org.bukkit.inventory.Inventory;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.meta.ItemMeta;
-
-import java.util.List;
-
-public class FeedingGui implements Listener {
-
- private final static int FOOD_SLOT = 15;
-
- public static void openGui(Player player) {
- String playerName = player.getName();
- PlayerManager playerManager = PetMain.getPlayerManager();
- PlayerData playerData = playerManager.getPlayerData(playerName);
- if (playerData.isPetStackNull()) {
- MessageUtil.sendMessageKey(player, "gui_no_pets_brought", Sound.ENTITY_VILLAGER_NO);
- return;
- }
- String invTitle = Config.getLanguage("main_gui_title");
- if (playerManager.isPetCallExit(playerName)) {
- invTitle = Config.getLanguage("main_gui_title") + Config.getLanguage("call_gui_title");
- }
- Inventory inv = Bukkit.createInventory(new FeedingGuiHolder(), 36, invTitle + Config.getLanguage("feeding_gui_title"));
- // 关闭界面
- inv.setItem(1, Config.getItemStack("close"));
- //食物槽
- inv.setItem(FOOD_SLOT, DemonAPI.getPaperAirItems());
- checkFoodGuiPetState(inv, playerData);
- player.openInventory(inv);
- }
-
- private static void checkFoodGuiPetState(Inventory inv, PlayerData playerData) {
- inv.setItem(23, getFoodButt(playerData.getPetNbt()));
- inv.setItem(24, getFoodButt(playerData.getPetNbt()));
- inv.setItem(25, getFoodButt(playerData.getPetNbt()));
- inv.setItem(11, PetUtil.getPetGuiStack(playerData, "chongwu_feed"));
- }
-
- private static ItemStack getFoodButt(PetNbt petNbt) {
- ItemStack stack = Config.getItemStack("weishibutton");
- ItemMeta meta = stack.getItemMeta();
- List lore = meta.getLore();
- lore.replaceAll(s -> DemonAPI.convertHexColor(s
- .replace("{petlevel}", String.valueOf(petNbt.level))
- .replace("{exp}", String.valueOf(petNbt.exp))
- .replace("{maxExp}", String.valueOf(LevelExpManager.getNeedExpValue(petNbt.level)))));
- meta.setLore(lore);
- stack.setItemMeta(meta);
- return stack;
- }
-
- private ItemStack getFooedStack(Inventory inv) {
- ItemStack foodStack = inv.getItem(FOOD_SLOT);
- if (DemonAPI.itemIsNull(foodStack) || DemonAPI.itemIsLore(foodStack)) {
- return null;
- }
- return foodStack;
- }
-
- @EventHandler
- public void onClick(InventoryClickEvent e) {
- int rawSlot = e.getRawSlot();
- Player player = (Player) e.getWhoClicked();
- String playerName = player.getName();
- Inventory inv = e.getInventory();
- if ((e.getInventory().getHolder() instanceof FeedingGuiHolder)) {
- e.setCancelled(true);
- if (rawSlot > 35) {
- ItemStack clickStack = e.getCurrentItem();
- if (DemonAPI.itemIsNull(clickStack) || DemonAPI.itemIsLore(clickStack)) {
- return;
- }
- NBTItem nbtItem = new NBTItem(clickStack);
- if (nbtItem.hasKey("petAppleExp") || nbtItem.hasKey("petAppleUp")) {
- // 判断槽位内是否已存在物品
- ItemStack foodStack = getFooedStack(inv);
- if (foodStack != null) {
- player.getInventory().addItem(foodStack);
- }
- e.setCurrentItem(null);
- inv.setItem(FOOD_SLOT, clickStack);
- player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1, 1);
- } else {
- MessageUtil.sendMessageKey(player, "pet_feed_not_apple", Sound.ENTITY_VILLAGER_NO);
- }
- return;
- }
- if (rawSlot == FOOD_SLOT) {
- // 判断槽位内是否已存在物品
- ItemStack foodStack = getFooedStack(inv);
- if (foodStack != null) {
- player.getInventory().addItem(foodStack);
- inv.setItem(FOOD_SLOT, DemonAPI.getPaperAirItems());
- }
- player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1, 1);
- }
- if (rawSlot == 1) {
- MainGui.openGui(player);
- player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1, 1);
- }
- if (rawSlot == 23 || rawSlot == 24 || rawSlot == 25) {
- // 获取实物槽位中的物品
- ItemStack foodStack = inv.getItem(FOOD_SLOT);
- if (DemonAPI.itemIsNull(foodStack) || DemonAPI.itemIsLore(foodStack)) {
- return;
- }
- PlayerManager playerManager = PetMain.getPlayerManager();
- PlayerData playerData = playerManager.getPlayerData(playerName);
- player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1, 1);
- String itemName = DemonAPI.getItemName(foodStack);
- NBTItem nbtItem = new NBTItem(foodStack);
- if (nbtItem.hasKey("petAppleExp")) {
- // 扣除果实
- if (foodStack.getAmount() == 1) {
- inv.setItem(FOOD_SLOT, DemonAPI.getPaperAirItems());
- } else {
- foodStack.setAmount(foodStack.getAmount() - 1);
- }
- // 获取增加经验
- int addExp = Integer.parseInt(nbtItem.getString("petAppleExp"));
- PetExpAPI.addExp(player, addExp);
- String message = Config.getLanguage("pet_feed_exp_success");
- message = message.replace("{itemName}", itemName);
- message = message.replace("{exp}", String.valueOf(addExp));
- MessageUtil.sendMessage(player, message, Sound.ENTITY_EXPERIENCE_ORB_PICKUP);
- // 刷新宠物经验
- checkFoodGuiPetState(inv, playerData);
- playerData.refreshPetStack();
- } else if (nbtItem.hasKey("petAppleUp")) {
- PetNbt petNbt = playerData.getPetNbt();
- // 获取进化阶段
- int needLevel = Integer.parseInt(nbtItem.getString("petAppleUp"));
- if (needLevel == 20) {
- feedEvolutionEvent(player, needLevel, petNbt, 1, 2, itemName);
- } else if (needLevel == 40) {
- feedEvolutionEvent(player, needLevel, petNbt, 2, 3, itemName);
- } else if (needLevel == 60) {
- feedEvolutionEvent(player, needLevel, petNbt, 3, 4, itemName);
- } else if (needLevel == 70) {
- feedEvolutionEvent(player, needLevel, petNbt, 4, 5, itemName);
- } else if (needLevel == 75) {
- feedEvolutionEvent(player, needLevel, petNbt, 5, 6, itemName);
- }
- } else {
- MessageUtil.sendMessageKey(player, "pet_feed_not_apple", Sound.ENTITY_VILLAGER_NO);
- }
- }
- }
- }
-
- private void feedEvolutionEvent(Player player, int appleLevel, PetNbt petNbt, int needEvolution, int nextEvolution, String itemName) {
- int evolution = petNbt.evolution;
- int petLevel = petNbt.level;
- if (evolution == nextEvolution) {
- MessageUtil.sendMessageKey(player, "pet_feed_evolution_already", Sound.ENTITY_VILLAGER_NO);
- return;
- }
- if (evolution == needEvolution) {
- // 判断宠物等级是否满足要求
- if (petLevel < appleLevel) {
- String message = Config.getLanguage("pet_feed_evolution_need_level");
- MessageUtil.sendMessage(player, message.replace("{level}", Config.getLevelChar(appleLevel)), Sound.ENTITY_VILLAGER_NO);
- return;
- }
- petNbt.setEvolution(nextEvolution);
- String message = Config.getLanguage("pet_feed_evolution_success");
- MessageUtil.sendMessage(player, message.replace("{itemName}", itemName), Sound.ENTITY_EXPERIENCE_ORB_PICKUP);
- } else {
- MessageUtil.sendMessageKey(player, "pet_feed_evolution_request", Sound.ENTITY_VILLAGER_NO);
- }
- }
-
- @EventHandler
- public void onClose(InventoryCloseEvent e) {
- Inventory inv = e.getInventory();
- if ((e.getInventory().getHolder() instanceof FeedingGuiHolder)) {
- Player player = (Player) e.getPlayer();
- ItemStack stack = getFooedStack(inv);
- if (stack != null) {
- inv.setItem(FOOD_SLOT, DemonAPI.getPaperAirItems());
- player.getInventory().addItem(stack);
- }
- }
- }
-}
\ No newline at end of file
diff --git a/src/src/main/java/com/yaohun/petsystem/gui/MainGui.java b/src/src/main/java/com/yaohun/petsystem/gui/MainGui.java
deleted file mode 100644
index 70f50a8..0000000
--- a/src/src/main/java/com/yaohun/petsystem/gui/MainGui.java
+++ /dev/null
@@ -1,185 +0,0 @@
-package com.yaohun.petsystem.gui;
-
-import com.yaohun.petsystem.PetMain;
-import com.yaohun.petsystem.config.Config;
-import com.yaohun.petsystem.data.PetData;
-import com.yaohun.petsystem.data.PlayerData;
-import com.yaohun.petsystem.data.SkillData;
-import com.yaohun.petsystem.gui.holder.MainGuiHolder;
-import com.yaohun.petsystem.listener.RePetNameListener;
-import com.yaohun.petsystem.manage.PlayerManager;
-import com.yaohun.petsystem.model.PetNbt;
-import com.yaohun.petsystem.util.MessageUtil;
-import com.yaohun.petsystem.util.PetUtil;
-import me.Demon.DemonPlugin.DemonAPI;
-import net.kyori.adventure.text.Component;
-import net.kyori.adventure.text.format.NamedTextColor;
-import net.kyori.adventure.text.format.TextDecoration;
-import org.bukkit.Bukkit;
-import org.bukkit.Material;
-import org.bukkit.Sound;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.inventory.InventoryClickEvent;
-import org.bukkit.inventory.Inventory;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.meta.ItemMeta;
-
-import java.util.List;
-
-public class MainGui implements Listener {
-
- public static void openGui(Player player) {
- String playerName = player.getName();
- PlayerManager playerManager = PetMain.getPlayerManager();
- PlayerData playerData = playerManager.getPlayerData(playerName);
- if (playerData.isPetStackNull()) {
- CarryGui.openGui(player);
- // MessageUtil.sendMessageKey(player, "gui_no_pets_brought", Sound.ENTITY_VILLAGER_NO);
- return;
- }
- String invTitle = Config.getLanguage("main_gui_title");
- String buttonKey = "zhaohuan";
- if (playerManager.isPetCallExit(playerName)) {
- invTitle = Config.getLanguage("main_gui_title") + Config.getLanguage("call_gui_title");
- buttonKey = "zhaohui";
- }
- Inventory inv = Bukkit.createInventory(new MainGuiHolder(), 36, invTitle);
- // 关闭界面
- inv.setItem(0, Config.getItemStack("close"));
- // 宠物图鉴
- inv.setItem(1, Config.getItemStack("pettujian"));
- // 宠物物品显示
- inv.setItem(11, PetUtil.getPetGuiStack(playerData, "chongwu"));
- // 宠物技能显示
- PetData petData = playerData.getPetNbt().petData;
- int slot = 13;
- for (SkillData skillData : petData.getSkillDataMap().values()) {
- inv.setItem(slot, getSkillGoldenApple(skillData));
- slot++;
- }
- // 宠物召唤按钮
- ItemStack zhaohuanStack = Config.getItemStack(buttonKey);
- inv.setItem(29, zhaohuanStack);
- inv.setItem(30, zhaohuanStack);
- // 宠物喂养按钮
- inv.setItem(31, Config.getItemStack("weiyang"));
- // 宠物工作按钮
- inv.setItem(32, Config.getItemStack("gongzuo"));
- inv.setItem(33, Config.getItemStack("gongzuo"));
- // 宠物品质数据查询
- inv.setItem(22, getQualificationStack(playerData, "fangs"));
- inv.setItem(23, getQualificationStack(playerData, "survive"));
- inv.setItem(24, getQualificationStack(playerData, "efficiency"));
- // 仓库、Wiki按钮
- inv.setItem(7, Config.getItemStack("cangku"));
- inv.setItem(8, Config.getItemStack("wiki"));
- player.openInventory(inv);
- }
-
- private static ItemStack getSkillGoldenApple(SkillData skillData) {
- ItemStack stack = new ItemStack(Material.GOLDEN_APPLE);
- ItemMeta meta = stack.getItemMeta();
- meta.displayName(Component.text(skillData.getItemName())
- .color(NamedTextColor.GREEN)
- .decoration(TextDecoration.ITALIC, false));
- meta.setLore(skillData.getItemLore());
- stack.setItemMeta(meta);
- return stack;
- }
-
- private static ItemStack getQualificationStack(PlayerData playerData, String type) {
- PetNbt petNbt = playerData.getPetNbt();
- int value = 0;
- if ("fangs".equalsIgnoreCase(type)) {
- value = petNbt.quality.getFangs();
- } else if ("survive".equalsIgnoreCase(type)) {
- value = petNbt.quality.getSurvive();
- } else if ("efficiency".equalsIgnoreCase(type)) {
- value = petNbt.quality.getEfficiency();
- }
- ItemStack stack = Config.getItemStack(type);
- ItemMeta meta = stack.getItemMeta();
- List lore = meta.getLore();
- for (int i = 0; i < lore.size(); i++) {
- String line = lore.get(i);
- if (line.contains("{qualityShow}")) {
- lore.set(i, DemonAPI.convertHexColor(line).replace("{qualityShow}", Config.getQualityShow(value)));
- break;
- }
- }
- meta.setLore(lore);
- stack.setItemMeta(meta);
- return stack;
- }
-
- @EventHandler
- public void onClick(InventoryClickEvent e) {
- int rawSlot = e.getRawSlot();
- Player player = (Player) e.getWhoClicked();
- if ((e.getInventory().getHolder() instanceof MainGuiHolder)) {
- e.setCancelled(true);
- // 关闭界面按钮
- if (rawSlot == 0) {
- player.closeInventory();
- player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1, 1);
- }
- if (rawSlot == 1) {
- player.closeInventory();
- // 打开宠物图鉴操作
- player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1, 1);
- }
- // Wiki按钮
- if (rawSlot == 8) {
- player.closeInventory();
- MessageUtil.sendMessageKey(player, "gui_wiki_message", Sound.UI_BUTTON_CLICK);
- }
- // 仓库按钮
- if (rawSlot == 7) {
- player.closeInventory();
- // 打开便捷仓库操作
- player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1, 1);
- }
- PlayerManager playerManager = PetMain.getPlayerManager();
- if (rawSlot == 11) {
- if (e.isShiftClick()) {
- String playerName = player.getName();
- PlayerData playerData = playerManager.getPlayerData(playerName);
- if (!playerData.isPetStackNull()) {
- playerManager.removePetCall(playerName);
- playerData.refreshPetStack();
- ItemStack petStack = playerData.getPetStack();
- player.getInventory().addItem(petStack);
- playerData.setPetStack(DemonAPI.getErrItems());
- playerData.savePlayerData();
- player.closeInventory();
- Bukkit.getScheduler().runTaskLater(PetMain.inst(), player::updateInventory, 2L);
- MessageUtil.sendMessageKey(player, "pet_stack_carry_takeOut", Sound.ENTITY_PLAYER_LEVELUP);
- }
- return;
- }
- if (e.isLeftClick()) {
- player.closeInventory();
- RePetNameListener.addReNameUUID(player.getUniqueId());
- MessageUtil.sendMessageKey(player, "pet_rename_add", Sound.UI_BUTTON_CLICK);
- }
- }
- // 召唤宠物操作按钮
- if (rawSlot == 29 || rawSlot == 30) {
- player.closeInventory();
- playerManager.callPet(player);
- }
- // 打开投喂宠物界面
- if (rawSlot == 31) {
- FeedingGui.openGui(player);
- player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1, 1);
- }
- // 打开打工系统
- if (rawSlot == 32 || rawSlot == 33) {
- player.closeInventory();
- MessageUtil.sendMessageKey(player, "imperfect_function", Sound.ENTITY_VILLAGER_NO);
- }
- }
- }
-}
\ No newline at end of file
diff --git a/src/src/main/java/com/yaohun/petsystem/gui/holder/CarryGuiHolder.java b/src/src/main/java/com/yaohun/petsystem/gui/holder/CarryGuiHolder.java
deleted file mode 100644
index 9ae4857..0000000
--- a/src/src/main/java/com/yaohun/petsystem/gui/holder/CarryGuiHolder.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.yaohun.petsystem.gui.holder;
-
-import org.bukkit.inventory.Inventory;
-import org.bukkit.inventory.InventoryHolder;
-
-public class CarryGuiHolder implements InventoryHolder {
-
- @Override
- public Inventory getInventory() {
- return null;
- }
-}
diff --git a/src/src/main/java/com/yaohun/petsystem/gui/holder/FeedingGuiHolder.java b/src/src/main/java/com/yaohun/petsystem/gui/holder/FeedingGuiHolder.java
deleted file mode 100644
index a97e280..0000000
--- a/src/src/main/java/com/yaohun/petsystem/gui/holder/FeedingGuiHolder.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.yaohun.petsystem.gui.holder;
-
-import org.bukkit.inventory.Inventory;
-import org.bukkit.inventory.InventoryHolder;
-
-public class FeedingGuiHolder implements InventoryHolder {
-
- @Override
- public Inventory getInventory() {
- return null;
- }
-}
diff --git a/src/src/main/java/com/yaohun/petsystem/gui/holder/MainGuiHolder.java b/src/src/main/java/com/yaohun/petsystem/gui/holder/MainGuiHolder.java
deleted file mode 100644
index 496777d..0000000
--- a/src/src/main/java/com/yaohun/petsystem/gui/holder/MainGuiHolder.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.yaohun.petsystem.gui.holder;
-
-import org.bukkit.inventory.Inventory;
-import org.bukkit.inventory.InventoryHolder;
-
-public class MainGuiHolder implements InventoryHolder {
-
- @Override
- public Inventory getInventory() {
- return null;
- }
-}
diff --git a/src/src/main/java/com/yaohun/petsystem/listener/PetSkillsListener.java b/src/src/main/java/com/yaohun/petsystem/listener/PetSkillsListener.java
deleted file mode 100644
index 3e89c8d..0000000
--- a/src/src/main/java/com/yaohun/petsystem/listener/PetSkillsListener.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package com.yaohun.petsystem.listener;
-
-import com.yaohun.petsystem.PetMain;
-import com.yaohun.petsystem.data.PetData;
-import com.yaohun.petsystem.data.PlayerData;
-import com.yaohun.petsystem.data.SkillData;
-import com.yaohun.petsystem.manage.PlayerManager;
-import io.lumine.mythic.bukkit.MythicBukkit;
-import me.Demon.DemonPlugin.Util.CDTimeAPI;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.entity.EntityDamageByEntityEvent;
-
-import java.util.LinkedHashMap;
-import java.util.UUID;
-
-public class PetSkillsListener implements Listener {
-
- @EventHandler
- public void onDamager(EntityDamageByEntityEvent e){
- if(e.getDamager() instanceof Player player){
- // 判断玩家是否携带宠物
- String playerName = player.getName();
- PlayerManager playerManager = PetMain.getPlayerManager();
- // 获取宠物相关数据
- PlayerData playerData = playerManager.getPlayerData(playerName);
- if(playerData.isPetStackNull()){
- return;
- }
- PetData petData = playerData.getPetNbt().petData;
- int petLevel = playerData.getPetNbt().level;
- LinkedHashMap skillDataMap = petData.getSkillDataMap();
- for(SkillData skillData : skillDataMap.values()){
- if(petLevel >= skillData.getNeedLevel()) {
- String cdKey = "skill_"+skillData.getSkillName();
- if ("onAttack".equalsIgnoreCase(skillData.getTrigger())) {
- UUID uuid = player.getUniqueId();
- if(!CDTimeAPI.isCD(uuid,cdKey)) {
- long cooldown = skillData.getCoolDown();
- CDTimeAPI.setPlayerCD(uuid, cdKey, cooldown);
- String mmSkill = skillData.getMmSkill();
- // 执行技能
- MythicBukkit.inst().getAPIHelper().castSkill(
- player,
- mmSkill,
- player.getLocation()
- );
- player.sendMessage("[调试 - 宠物技能] 触发条件: onAttack 触发技能: "+skillData.getSkillName());
- }
- }
- }
- }
- }
- if(e.getEntity() instanceof Player player){
- String playerName = player.getName();
- PlayerManager playerManager = PetMain.getPlayerManager();
-
- PlayerData playerData = playerManager.getPlayerData(playerName);
- if(playerData.isPetStackNull()){
- return;
- }
- PetData petData = playerData.getPetNbt().petData;
- int petLevel = playerData.getPetNbt().level;
- LinkedHashMap skillDataMap = petData.getSkillDataMap();
- for(SkillData skillData : skillDataMap.values()){
- if(petLevel >= skillData.getNeedLevel()) {
- String cdKey = "skill_"+skillData.getSkillName();
- if ("onDamaged".equalsIgnoreCase(skillData.getTrigger())) {
- UUID uuid = player.getUniqueId();
- if(!CDTimeAPI.isCD(uuid,cdKey)) {
- long cooldown = skillData.getCoolDown();
- CDTimeAPI.setPlayerCD(uuid, cdKey, cooldown);
- String mmSkill = skillData.getMmSkill();
- // 执行技能
- MythicBukkit.inst().getAPIHelper().castSkill(player, mmSkill, player.getLocation());
- player.sendMessage("[调试 - 宠物技能] 触发条件: onDamaged 触发技能: "+skillData.getSkillName());
- }
- }
- }
- }
- }
- }
-
- /*public boolean runSkills(SkillCaster caster, SkillTrigger cause, AbstractLocation origin, AbstractEntity trigger, Consumer transformer) {
- return new TriggeredSkill(cause, caster, origin, trigger, this.artifact.getMechanics(cause), true, meta -> {
- transformer.getVariables().putString("equip-slot", this.equippedSlot);
- transformer.getVariables().putObject("equip-item", this.itemStack);
- if (r5 != null) {
- r5.accept(transformer);
- }
- }, new Pair[0]).getCancelled();
- }*/
-}
diff --git a/src/src/main/java/com/yaohun/petsystem/listener/PlayerListener.java b/src/src/main/java/com/yaohun/petsystem/listener/PlayerListener.java
deleted file mode 100644
index 90a5b68..0000000
--- a/src/src/main/java/com/yaohun/petsystem/listener/PlayerListener.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package com.yaohun.petsystem.listener;
-
-import com.yaohun.petsystem.PetMain;
-import com.yaohun.petsystem.data.PlayerData;
-import com.yaohun.petsystem.manage.PlayerManager;
-import com.yaohun.petsystem.model.PetNbt;
-import com.yaohun.petsystem.util.PetUtil;
-import org.bukkit.Bukkit;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.LivingEntity;
-import org.bukkit.entity.Player;
-import org.bukkit.entity.Wolf;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.entity.EntityDamageByEntityEvent;
-import org.bukkit.event.entity.EntityDeathEvent;
-import org.bukkit.event.player.PlayerQuitEvent;
-
-import java.util.UUID;
-
-public class PlayerListener implements Listener {
-
- @EventHandler
- public void onDamage(EntityDamageByEntityEvent e) {
- if (e.getEntity() instanceof Player) {
- return;
- }
- if (!(e.getEntity() instanceof LivingEntity target)) {
- return;
- }
- if (e.getDamager() instanceof Player player) {
- String playerName = player.getName();
- PlayerManager playerManager = PetMain.getPlayerManager();
- if (!playerManager.isPetCallExit(playerName)) {
- return;
- }
- UUID petUUID = playerManager.getPetUUID(playerName);
- if (petUUID == null) {
- return;
- }
- Entity entity = Bukkit.getEntity(petUUID);
- if (entity instanceof Wolf wolf) {
- wolf.setTarget(target);
- }
- }
- }
-
- // 检查伤害 狼造成的伤害
- @EventHandler
- public void onDamageCheck(EntityDamageByEntityEvent e) {
- if (e.getDamager() instanceof Wolf wolf) {
- PlayerData playerData = PetUtil.updatePetNameTag(wolf);
- if (playerData != null) {
- double health = wolf.getHealth();
- PetNbt petNbt = playerData.getPetNbt();
- petNbt.setHealth((int) health);
- }
- }
- }
-
- @EventHandler
- public void onDeath(EntityDeathEvent e) {
- String ownerName = PetMain.getPlayerManager().getPetOwnerName(e.getEntity().getUniqueId());
- if (ownerName == null) {
- return;
- }
- PlayerData playerData = PetMain.getPlayerManager().getPlayerData(ownerName);
- playerData.getPetNbt().setHealth(0);
- PetMain.getPlayerManager().removePetCall(ownerName);
- }
-
- @EventHandler
- public void onQuit(PlayerQuitEvent e){
- Player player = e.getPlayer();
- String playerName = player.getName();
- PlayerManager playerManager = PetMain.getPlayerManager();
- playerManager.removePetCall(playerName);
- }
-}
diff --git a/src/src/main/java/com/yaohun/petsystem/listener/RePetNameListener.java b/src/src/main/java/com/yaohun/petsystem/listener/RePetNameListener.java
deleted file mode 100644
index de4e730..0000000
--- a/src/src/main/java/com/yaohun/petsystem/listener/RePetNameListener.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.yaohun.petsystem.listener;
-
-import com.yaohun.petsystem.PetMain;
-import com.yaohun.petsystem.config.Config;
-import com.yaohun.petsystem.data.PlayerData;
-import com.yaohun.petsystem.manage.PlayerManager;
-import com.yaohun.petsystem.util.MessageUtil;
-import org.bukkit.Sound;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.player.AsyncPlayerChatEvent;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-
-public class RePetNameListener implements Listener {
-
- private static List reNameList = new ArrayList<>();
-
- public static void addReNameUUID(UUID uuid) {
- if (!reNameList.contains(uuid)) {
- reNameList.add(uuid);
- }
- }
-
- @EventHandler
- public void onChat(AsyncPlayerChatEvent e) {
- Player player = e.getPlayer();
- UUID uuid = player.getUniqueId();
- if (reNameList.isEmpty()) {
- return;
- }
- if (!reNameList.contains(uuid)) {
- return;
- }
- e.setCancelled(true);
- reNameList.remove(uuid);
- String playerName = player.getName();
- PlayerManager playerManager = PetMain.getPlayerManager();
- PlayerData playerData = playerManager.getPlayerData(playerName);
- if (playerData.isPetStackNull()) {
- MessageUtil.sendMessageKey(player, "pet_rename_no_pets", Sound.ENTITY_VILLAGER_NO);
- return;
- }
- String reName = e.getMessage();
- if (reName.isEmpty()) {
- MessageUtil.sendMessageKey(player, "pet_rename_empty", Sound.ENTITY_VILLAGER_NO);
- return;
- }
- if (reName.length() < 3) {
- MessageUtil.sendMessageKey(player, "pet_rename_length", Sound.ENTITY_VILLAGER_NO);
- return;
- }
- String newName = reName.replace("&", "§");
- playerData.rePetNameStack(newName);
- playerData.savePlayerData();
- String message = Config.getLanguage("pet_rename_success");
- MessageUtil.sendMessage(player, message.replace("{petName}", newName), Sound.ENTITY_PLAYER_LEVELUP);
- }
-}
\ No newline at end of file
diff --git a/src/src/main/java/com/yaohun/petsystem/manage/LevelExpManager.java b/src/src/main/java/com/yaohun/petsystem/manage/LevelExpManager.java
deleted file mode 100644
index 42133c8..0000000
--- a/src/src/main/java/com/yaohun/petsystem/manage/LevelExpManager.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.yaohun.petsystem.manage;
-
-import com.yaohun.petsystem.PetMain;
-import org.bukkit.Bukkit;
-import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.configuration.file.YamlConfiguration;
-
-import java.io.File;
-import java.util.HashMap;
-
-public class LevelExpManager {
-
- private static HashMap needExpMap = new HashMap<>();
-
- public static void reloadLevelManager(PetMain plugin) {
- File file = new File(plugin.getDataFolder() + "/Settings", "needExp.yml");
- if (file.getParentFile().exists()) {
- file.getParentFile().mkdirs();
- }
- FileConfiguration config = YamlConfiguration.loadConfiguration(file);
- for (String levelKey : config.getKeys(false)) {
- int level = Integer.parseInt(levelKey);
- int needExp = config.getInt(levelKey);
- needExpMap.put(level, needExp);
- }
- Bukkit.getConsoleSender().sendMessage("§7- 等级经验配置: §f" + needExpMap.size() + "条");
- }
-
- public static int getNeedExpValue(int level) {
- if (needExpMap.containsKey(level)) {
- return needExpMap.get(level);
- }
- return 1000000;
- }
-}
\ No newline at end of file
diff --git a/src/src/main/java/com/yaohun/petsystem/manage/PetCallSession.java b/src/src/main/java/com/yaohun/petsystem/manage/PetCallSession.java
deleted file mode 100644
index df1db1e..0000000
--- a/src/src/main/java/com/yaohun/petsystem/manage/PetCallSession.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.yaohun.petsystem.manage;
-
-import kr.toxicity.model.api.tracker.Tracker;
-import org.bukkit.Bukkit;
-import org.bukkit.entity.Entity;
-
-import java.util.UUID;
-
-public class PetCallSession {
-
- private final UUID ownerUuid;
- private final UUID entityUuid;
- private final Tracker tracker;
-
- public PetCallSession(UUID ownerUuid, UUID entityUuid, Tracker tracker) {
- this.ownerUuid = ownerUuid;
- this.entityUuid = entityUuid;
- this.tracker = tracker;
- }
-
- public UUID getOwnerUuid() {
- return ownerUuid;
- }
-
- public UUID getEntityUuid() {
- return entityUuid;
- }
-
- public Entity getEntity() {
- return Bukkit.getEntity(entityUuid);
- }
-
- public boolean isAlive() {
- Entity entity = getEntity();
- return entity != null && !entity.isDead();
- }
-
- public void close() {
- if (tracker != null && !tracker.isClosed()) {
- tracker.despawn();
- tracker.close();
- }
- Entity entity = getEntity();
- if (entity != null && !entity.isDead()) {
- entity.remove();
- }
- }
-}
diff --git a/src/src/main/java/com/yaohun/petsystem/manage/PetManager.java b/src/src/main/java/com/yaohun/petsystem/manage/PetManager.java
deleted file mode 100644
index 5996459..0000000
--- a/src/src/main/java/com/yaohun/petsystem/manage/PetManager.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package com.yaohun.petsystem.manage;
-
-import com.yaohun.petsystem.PetMain;
-import com.yaohun.petsystem.data.PetData;
-import me.Demon.DemonPlugin.DemonAPI;
-import org.bukkit.Bukkit;
-import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.configuration.file.YamlConfiguration;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-public class PetManager {
-
- private static HashMap petDataMap = new HashMap<>();
-
- public static void reloadPetManager() {
- petDataMap.clear();
- Bukkit.getConsoleSender().sendMessage("§6[宠物系统] §7宠物类型:");
- String folderPath = PetMain.inst().getDataFolder().getPath() + "/PetData";
- File folder = new File(folderPath);
- if (!folder.exists() || !folder.isDirectory()) {
- System.out.println("[日志 - 灵宠] 未检测到任何宠物配置: " + folderPath);
- return;
- }
- List ymlFiles = new ArrayList<>();
- DemonAPI.collectYmlFiles(folder, ymlFiles);
- if (ymlFiles.isEmpty()) {
- System.out.println("[日志 - 灵宠] 未检测到任何宠物配置: " + folderPath);
- return;
- }
- for (File file : ymlFiles) {
- String fileName = file.getName().replace(".yml", "");
- FileConfiguration config = YamlConfiguration.loadConfiguration(file);
- PetData petData = new PetData(fileName, config);
- petDataMap.put(fileName, petData);
- Bukkit.getConsoleSender().sendMessage("- 宠物: §f" + petData.getPetName() + " §7MaxLevel: §f" + petData.getMaxLevel());
- }
- }
-
- public static HashMap getPetDataMap() {
- return petDataMap;
- }
-
- public static PetData getItemNameToPetData(String itemName) {
- for (PetData petData : petDataMap.values()) {
- if (petData.getPetName().contains(itemName)) {
- return petData;
- }
- }
- return null;
- }
-
- public static PetData getPetData(String petKey) {
- if (petDataMap.containsKey(petKey)) {
- return petDataMap.get(petKey);
- }
- return null;
- }
-
- // 获取宠物获取渠道
- public static List getPetAccessChannels(String petKey) {
- PetData petData = PetManager.getPetData(petKey);
- if (petData == null) {
- return new ArrayList<>();
- }
- return petData.getAccessChannelsList();
- }
-}
\ No newline at end of file
diff --git a/src/src/main/java/com/yaohun/petsystem/manage/PlayerManager.java b/src/src/main/java/com/yaohun/petsystem/manage/PlayerManager.java
deleted file mode 100644
index 5e5e432..0000000
--- a/src/src/main/java/com/yaohun/petsystem/manage/PlayerManager.java
+++ /dev/null
@@ -1,253 +0,0 @@
-package com.yaohun.petsystem.manage;
-
-import com.yaohun.petsystem.PetMain;
-import com.yaohun.petsystem.config.Config;
-import com.yaohun.petsystem.data.PetData;
-import com.yaohun.petsystem.data.PetSQL;
-import com.yaohun.petsystem.data.PlayerData;
-import com.yaohun.petsystem.event.PetCallEvent;
-import com.yaohun.petsystem.util.MessageUtil;
-import com.yaohun.petsystem.util.model.BetterModelUtil;
-import com.yaohun.petsystem.util.wolf.CustomWolf;
-import de.tr7zw.nbtapi.NBTItem;
-import io.lumine.mythic.bukkit.MythicBukkit;
-import kr.toxicity.model.api.tracker.Tracker;
-import me.Demon.DemonPlugin.DemonAPI;
-import me.Demon.DemonPlugin.Util.CDTimeAPI;
-import org.bukkit.Bukkit;
-import org.bukkit.Sound;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-
-import java.util.HashMap;
-import java.util.UUID;
-
-public class PlayerManager {
-
- private HashMap playerDataMap = new HashMap<>();
- private HashMap petCallMap = new HashMap<>();
- // private HashMap petEntityModelMap = new HashMap<>();
-
- public PlayerData getPlayerData(String name) {
- if (!playerDataMap.containsKey(name)) {
- playerDataMap.put(name, new PlayerData(name));
- }
- return playerDataMap.get(name);
- }
-
- public void saveAllData() {
- for (PlayerData playerData : playerDataMap.values()) {
- playerData.savePlayerData();
- }
- }
-
- public void closeSaveData(String playerName) {
- PlayerData playerData = getPlayerData(playerName);
- playerData.savePlayerData();
- playerDataMap.remove(playerName);
-
- removePetCall(playerName);
- }
-
- public void closeSaveAllData() {
- for (PlayerData playerData : playerDataMap.values()) {
- playerData.savePlayerData();
- }
- playerDataMap.clear();
- for (PetCallSession session : petCallMap.values()) {
- session.close();
- }
- PetSQL.closeConnection();
- petCallMap.clear();
- }
-
- public void setPetCall(String name, UUID ownerUuid, UUID entityUuid, Tracker tracker) {
- petCallMap.put(name, new PetCallSession(ownerUuid, entityUuid, tracker));
- }
-
- public void removePetCall(String name) {
- PetCallSession session = petCallMap.remove(name);
- if (session != null) {
- session.close();
- }
- }
-
- public boolean isPetCallExit(String name) {
- PetCallSession session = petCallMap.get(name);
- if (session == null) {
- return false;
- }
- if (!session.isAlive()) {
- petCallMap.remove(name);
- session.close();
- return false;
- }
- return true;
- }
-
- public String getPetOwnerName(UUID entityUuid) {
- for (String name : petCallMap.keySet()) {
- PetCallSession session = petCallMap.get(name);
- if (session.getEntityUuid().equals(entityUuid)) {
- return name;
- }
- }
- return null;
- }
-
- public UUID getPetUUID(String name) {
- if (isPetCallExit(name)) {
- return petCallMap.get(name).getEntityUuid();
- }
- return null;
- }
-/*
- public ModeledEntity getPetEntityModel(UUID entityUuid) {
- for (ModeledEntity entity : petEntityModelMap.values()) {
- if (entity.getBase().getUUID().equals(entityUuid)) {
- return entity;
- }
- }
- return null;
- }
-
- public void setPetEntityModelMap(UUID entityUUID, ModeledEntity entityModel) {
- petEntityModelMap.put(entityUUID, entityModel);
- }*/
-
- public void callPet(Player player) {
- String carryCdKey = "callPetStackCD";
- UUID uuid = player.getUniqueId();
- if (CDTimeAPI.isCD(uuid, carryCdKey)) {
- MessageUtil.sendMessageKey(player, "system_coolingDown", Sound.ENTITY_VILLAGER_NO);
- return;
- }
- CDTimeAPI.setPlayerCD(uuid, carryCdKey, 1000 * 5);
- String playerName = player.getName();
- PlayerData playerData = getPlayerData(playerName);
- if (playerData == null) {
- return;
- }
- if (playerData.isPetStackNull()) {
- MessageUtil.sendMessageKey(player, "no_summons_pets_brought", Sound.ENTITY_VILLAGER_NO);
- return;
- }
- // 判断玩家是否已经召唤宠物
- if (isPetCallExit(playerName)) {
- removePetCall(playerName);
- MessageUtil.sendMessageKey(player, "pet_summons_recovers", Sound.UI_BUTTON_CLICK);
- return;
- }
- int health = playerData.getPetNbt().health;
- if (health < 1) {
- MessageUtil.sendMessageKey(player, "no_summons_pets_health", Sound.ENTITY_VILLAGER_NO);
- return;
- }
- String petStackName = DemonAPI.getItemName(playerData.getPetStack());
- CustomWolf wolf = CustomWolf.spawnCustomWolf(player, playerData.getPetNbt());
- PetData petData = playerData.getPetNbt().petData;
- String modelID = petData.getModelId();
- Tracker tracker = BetterModelUtil.spawnModel(player, wolf.getBukkitEntity(), modelID);
- if (tracker == null) {
- wolf.getBukkitEntity().remove();
- MessageUtil.sendMessage(player, "§c宠物模型载入失败,召唤已取消。", Sound.ENTITY_VILLAGER_NO);
- return;
- }
- setPetCall(playerName, player.getUniqueId(), wolf.getUUID(), tracker);
- /*ActiveModel model = ModelEngineAPI.createActiveModel(modelID);
- if (model != null) {
- ModeledEntity modeledEntity = ModelEngineAPI.createModeledEntity(wolf.getBukkitEntity());
- setPetEntityModelMap(wolf.getUUID(), modeledEntity);
- modeledEntity.addModel(model, true);
- modeledEntity.setBaseEntityVisible(false);
- model.setHitboxVisible(true);
- model.setShadowVisible(true);
- String text = Config.getLanguage("pet_name_tag")
- .replace("{name}", playerName)
- .replace("{petName}", petStackName);
-
- wolf.setCustomName(Component.literal(text));
- wolf.setCustomNameVisible(true);
-
- NameTag tag = PetUtil.getNameBone(modeledEntity, "name");
- if (tag != null) {
- tag.setString(text);
- tag.setVisible(true);
- }
- int petLevel = playerData.getPetNbt().level;
- double healthNow = wolf.getHealth();
- double healthMax = wolf.getMaxHealth();
- // 计算获得血量百分比
- int percent = (int) Math.round((healthNow / healthMax) * 100.0);
- String levelText = Config.getLanguage("pet_level_tag")
- .replace("{level}", Config.getLevelChar(petLevel))
- .replace("{health}", Config.getHealthChar(percent));
- NameTag levelTag = PetUtil.getNameBone(modeledEntity, "level");
- if (levelTag != null) {
- levelTag.setString(levelText);
- levelTag.setVisible(true);
- }
- Bukkit.getConsoleSender().sendMessage("[日志 - 宠物] 模型资源 " + modelID + " 载入成功!");
- } else {
- Bukkit.getConsoleSender().sendMessage("[日志 - 宠物] 模型资源 " + modelID + " 载入失败!");
- }*/
- String summonSkill = petData.getSummonSkill();
- if (!"default".equalsIgnoreCase(summonSkill)) {
- Bukkit.getScheduler().runTaskLater(PetMain.inst(), () -> {
- if (wolf.isRemoved() || wolf.getBukkitLivingEntity().isDead()) {
- return;
- }
- MythicBukkit.inst().getAPIHelper().castSkill(wolf.getBukkitLivingEntity(), summonSkill, wolf.getBukkitLivingEntity().getLocation());
- player.sendMessage("[调试 - 宠物技能] 触发条件: onSpawn 触发技能: "+summonSkill);
- }, 2L);
- }
- // 设置宠物召唤状态
- MessageUtil.sendMessageKey(player, "pet_summons_success", Sound.UI_BUTTON_CLICK);
- // 发布事件
- PetCallEvent event = new PetCallEvent(player, wolf.getBukkitEntity().getCustomName(), wolf.getUUID());
- Bukkit.getPluginManager().callEvent(event);
- }
-
- public void carryPetStackData(Player player) {
- String carryCdKey = "carryPetStackCD";
- UUID uuid = player.getUniqueId();
- if (CDTimeAPI.isCD(uuid, carryCdKey)) {
- MessageUtil.sendMessageKey(player, "system_coolingDown", Sound.ENTITY_VILLAGER_NO);
- return;
- }
- CDTimeAPI.setPlayerCD(uuid, carryCdKey, 1000 * 5);
- String playerName = player.getName();
- PlayerData playerData = getPlayerData(playerName);
- if (playerData.isPetStackNull()) {
- ItemStack stack = player.getInventory().getItemInMainHand();
- if (DemonAPI.itemIsNull(stack)) {
- MessageUtil.sendMessageKey(player, "error_empty_hand", Sound.ENTITY_VILLAGER_NO);
- return;
- }
- NBTItem nbtItem = new NBTItem(stack);
- if (!nbtItem.hasKey("petKey")) {
- MessageUtil.sendMessageKey(player, "hand_not_pet_stack", Sound.ENTITY_VILLAGER_NO);
- return;
- }
- player.getInventory().setItemInMainHand(null);
- playerData.setPetStack(stack);
- playerData.savePlayerData();
- String itemName = DemonAPI.getItemName(stack);
- String message = Config.getLanguage("pet_stack_carry_success");
- MessageUtil.sendMessage(player, message.replace("{petName}", itemName), Sound.ENTITY_PLAYER_LEVELUP);
- } else {
- removePetCall(playerName);
- playerData.refreshPetStack();
- ItemStack petStack = playerData.getPetStack();
- NBTItem nbtItem = new NBTItem(petStack);
- if (!nbtItem.hasKey("petKey")) {
- Bukkit.getConsoleSender().sendMessage("[日志 - 宠物] 未检测到宠物petKey的Nbt标识.");
- }
- player.getInventory().addItem(petStack);
- playerData.setPetStack(DemonAPI.getErrItems());
- playerData.savePlayerData();
- MessageUtil.sendMessageKey(player, "pet_stack_carry_takeOut", Sound.ENTITY_PLAYER_LEVELUP);
- }
- }
-}
diff --git a/src/src/main/java/com/yaohun/petsystem/model/PetNbt.java b/src/src/main/java/com/yaohun/petsystem/model/PetNbt.java
deleted file mode 100644
index b156afa..0000000
--- a/src/src/main/java/com/yaohun/petsystem/model/PetNbt.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package com.yaohun.petsystem.model;
-
-import com.yaohun.petsystem.data.PetData;
-import com.yaohun.petsystem.manage.LevelExpManager;
-import com.yaohun.petsystem.manage.PetManager;
-import de.tr7zw.nbtapi.NBTItem;
-import org.bukkit.inventory.ItemStack;
-
-public class PetNbt {
-
- private String petKey;
- public PetData petData;
- public int level;
- public int exp;
- public int maxExp;
- public int totalExp;
- public int damage;
- public int health;
- public int maxHealth;
- public int evolution;
- public PetQuality quality;
-
- public PetNbt(PetData petData) {
- this.petKey = petData.getFileName();
- this.petData = petData;
- this.level = 1;
- this.maxExp = LevelExpManager.getNeedExpValue(level);
- this.exp = 0;
- this.totalExp = 0;
- this.damage = 7;
- this.health = 20;
- this.maxHealth = 20;
- this.evolution = 1;
- this.quality = PetQuality.random();
- }
-
- public PetNbt() {
- }
-
- public void loadNbtData(NBTItem nbtItem) {
- petKey = nbtItem.getString("petKey");
- petData = PetManager.getPetData(petKey);
- level = nbtItem.getInteger("level");
- exp = nbtItem.getInteger("exp");
- totalExp = nbtItem.getInteger("totalExp");
- maxExp = LevelExpManager.getNeedExpValue(level);
- damage = nbtItem.getInteger("damage");
- health = nbtItem.getInteger("health");
- maxHealth = nbtItem.getInteger("maxHealth");
- evolution = nbtItem.getInteger("evolution");
- int qualityFangs = nbtItem.getInteger("quality_fangs");
- int qualitySurvive = nbtItem.getInteger("quality_survive");
- int qualityEfficiency = nbtItem.getInteger("quality_efficiency");
- quality = new PetQuality(qualityFangs, qualitySurvive, qualityEfficiency);
- }
-
- public ItemStack saveIoItem(ItemStack stack) {
- NBTItem nbtItem = new NBTItem(stack);
- nbtItem.setString("petKey", petKey);
- nbtItem.setInteger("level", level);
- nbtItem.setInteger("exp", exp);
- nbtItem.setInteger("totalExp", totalExp);
- nbtItem.setInteger("maxExp", LevelExpManager.getNeedExpValue(level));
- nbtItem.setInteger("damage", damage);
- nbtItem.setInteger("health", health);
- nbtItem.setInteger("maxHealth", maxHealth);
- nbtItem.setInteger("evolution", evolution);
- nbtItem.setInteger("quality_fangs", quality.getFangs());
- nbtItem.setInteger("quality_survive", quality.getSurvive());
- nbtItem.setInteger("quality_efficiency", quality.getEfficiency());
- return nbtItem.getItem();
- }
-
- public void setLevel(int level) {
- this.level = level;
- }
-
- public void setExp(int exp) {
- this.exp = exp;
- }
-
- public void setTotalExp(int totalExp) {
- this.totalExp = totalExp;
- }
-
- public void setDamage(int damage) {
- this.damage = damage;
- }
-
- public void setHealth(int health) {
- this.health = health;
- }
-
- public void setMaxHealth(int maxHealth) {
- this.maxHealth = maxHealth;
- }
-
- public void setEvolution(int evolution) {
- this.evolution = evolution;
- }
-
- public void setQuality(String qualityType, int value) {
- if ("quality_fangs".equals(qualityType)) {
- this.quality.setFangs(value);
- } else if ("quality_survive".equals(qualityType)) {
- this.quality.setSurvive(value);
- } else if ("quality_efficiency".equals(qualityType)) {
- this.quality.setEfficiency(value);
- }
- }
-}
\ No newline at end of file
diff --git a/src/src/main/java/com/yaohun/petsystem/model/PetQuality.java b/src/src/main/java/com/yaohun/petsystem/model/PetQuality.java
deleted file mode 100644
index 5abfcf6..0000000
--- a/src/src/main/java/com/yaohun/petsystem/model/PetQuality.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.yaohun.petsystem.model;
-
-import me.Demon.DemonPlugin.Util.RandomUtil;
-
-public class PetQuality {
-
- private int fangs;
-
- private int survive;
-
- private int efficiency;
-
- public PetQuality(int fangs, int survive, int efficiency) {
- this.fangs = fangs;
- this.survive = survive;
- this.efficiency = efficiency;
- }
-
- public static PetQuality random() {
- int fangs = RandomUtil.getRandomInt(1, 100);
- int survive = RandomUtil.getRandomInt(1, 100);
- int efficiency = RandomUtil.getRandomInt(1, 100);
- return new PetQuality(fangs, survive, efficiency);
- }
-
- public int getFangs() {
- return fangs;
- }
-
- public void setFangs(int fangs) {
- this.fangs = fangs;
- }
-
- public int getSurvive() {
- return survive;
- }
-
- public void setSurvive(int survive) {
- this.survive = survive;
- }
-
- public int getEfficiency() {
- return efficiency;
- }
-
- public void setEfficiency(int efficiency) {
- this.efficiency = efficiency;
- }
-}
\ No newline at end of file
diff --git a/src/src/main/java/com/yaohun/petsystem/util/MessageUtil.java b/src/src/main/java/com/yaohun/petsystem/util/MessageUtil.java
deleted file mode 100644
index 2d67c53..0000000
--- a/src/src/main/java/com/yaohun/petsystem/util/MessageUtil.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.yaohun.petsystem.util;
-
-import com.yaohun.petsystem.PetMain;
-import com.yaohun.petsystem.config.Config;
-import org.bukkit.Sound;
-import org.bukkit.command.CommandSender;
-import org.bukkit.configuration.ConfigurationSection;
-import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.configuration.file.YamlConfiguration;
-import org.bukkit.entity.Player;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class MessageUtil {
-
- private static HashMap languageMap = new HashMap<>();
-
- public static HashMap getLanguageMap() {
- return languageMap;
- }
-
- public static void init(PetMain plugin) {
- File file = new File(plugin.getDataFolder(), "lang.yml");
- if (!file.exists()) {
- plugin.saveResource("lang.yml", false);
- }
- FileConfiguration config = YamlConfiguration.loadConfiguration(file);
- for (String key : config.getKeys(false)) {
- ConfigurationSection section = config.getConfigurationSection(key);
- for (String key2 : section.getKeys(false)) {
- String message = section.getString(key2).replace("&", "§");
- languageMap.put(key2, message);
- }
- }
- }
-
- public static void sendMessageKey(CommandSender sender, String key, Sound sound) {
- String message = Config.getLanguage(key);
- sender.sendMessage(convertHexColor(message));
- if (sender instanceof Player) {
- Player player = (Player) sender;
- player.playSound(player.getLocation(), sound, 0.8f, 1.2f);
- }
- }
-
- public static void sendMessage(CommandSender sender, String message, Sound sound) {
- message = convertHexColor(message);
- sender.sendMessage(message);
- if (sender instanceof Player) {
- Player player = (Player) sender;
- player.playSound(player.getLocation(), sound, 0.8f, 1.2f);
- }
- }
-
- public static String convertHexColor(String text) {
- if (text == null) return "";
-
- // 匹配形如 #FFFFFF 的十六进制颜色代码
- Pattern pattern = Pattern.compile("#[A-Fa-f0-9]{6}");
- Matcher matcher = pattern.matcher(text);
- StringBuffer buffer = new StringBuffer();
- // 去掉#
- while (matcher.find()) {
- String hex = matcher.group().substring(1);
- StringBuilder colorBuilder = new StringBuilder("§x");
- for (char c : hex.toCharArray()) {
- colorBuilder.append('§').append(c);
- }
- matcher.appendReplacement(buffer, colorBuilder.toString());
- }
- matcher.appendTail(buffer);
- return buffer.toString();
- }
-
-}
diff --git a/src/src/main/java/com/yaohun/petsystem/util/PetUtil.java b/src/src/main/java/com/yaohun/petsystem/util/PetUtil.java
deleted file mode 100644
index 025cf8c..0000000
--- a/src/src/main/java/com/yaohun/petsystem/util/PetUtil.java
+++ /dev/null
@@ -1,178 +0,0 @@
-package com.yaohun.petsystem.util;
-
-import com.yaohun.petsystem.PetMain;
-import com.yaohun.petsystem.config.Config;
-import com.yaohun.petsystem.data.PlayerData;
-import com.yaohun.petsystem.manage.LevelExpManager;
-import com.yaohun.petsystem.manage.PlayerManager;
-import com.yaohun.petsystem.model.PetNbt;
-import net.kyori.adventure.text.Component;
-import net.kyori.adventure.text.format.NamedTextColor;
-import net.kyori.adventure.text.format.TextDecoration;
-import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
-import org.bukkit.entity.Wolf;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.meta.ItemMeta;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-import java.util.UUID;
-
-public class PetUtil {
-
- public static ItemStack refreshPetStackData(PetNbt petNbt) {
- return getPetStackDefault(petNbt);
- }
-
- public static ItemStack getPetStackDefault(PetNbt petNbt) {
- // 获取相关默认参数
- String petName = petNbt.petData.getPetName();
- ItemStack stack = Config.getPetStackTemplate();
- ItemMeta meta = stack.getItemMeta();
- // 获取当前显示名
- String templateName = "{name}";
- if (meta.hasDisplayName()) {
- Component comp = meta.displayName();
- if (comp != null) {
- // 将组件转换为普通字符串
- templateName = PlainTextComponentSerializer.plainText().serialize(comp);
- }
- }
- // 替换占位符
- String replaced = templateName.replace("{name}", petName);
- // 正确方式:直接用 Adventure Component 设置显示名
- // 设置新的显示名(新版 Adventure API)
- meta.displayName(Component.text(replaced)
- .color(NamedTextColor.GREEN)
- .decoration(TextDecoration.ITALIC, false));
-
- List newLore = new ArrayList<>();
- List rawLore = meta.getLore();
- if (rawLore == null) {
- rawLore = new ArrayList<>();
- }
-
- for (String line : rawLore) {
- String string = line
- .replace("{name}", petName)
- .replace("{fangs}", String.valueOf(petNbt.quality.getFangs()))
- .replace("{survive}", String.valueOf(petNbt.quality.getSurvive()))
- .replace("{efficiency}", String.valueOf(petNbt.quality.getEfficiency()))
- .replace("{level}", String.valueOf(petNbt.level))
- .replace("{exp}", String.valueOf(petNbt.exp))
- .replace("{maxExp}", String.valueOf(LevelExpManager.getNeedExpValue(petNbt.level)))
- .replace("{damage}", String.valueOf(petNbt.damage))
- .replace("{health}", String.valueOf(petNbt.health))
- .replace("{maxHealth}", String.valueOf(petNbt.maxHealth));
- newLore.add(Component.text(MessageUtil.convertHexColor(string)).decoration(TextDecoration.ITALIC, false));
- }
- meta.lore(newLore);
- meta.setCustomModelData(petNbt.petData.getCustomIconModelId());
- stack.setItemMeta(meta);
- return stack;
- }
-
- public static ItemStack getPetGuiStack(PlayerData playerData, String guiStackID) {
- // 1.获取玩家数据
- PetNbt petNbt = playerData.getPetNbt();
- ItemStack petStack = playerData.getPetStack();
-
- ItemStack stack = Config.getItemStack(guiStackID);
- ItemMeta meta = stack.getItemMeta();
- // 设置新的显示名(新版 Adventure API)
- meta.displayName(Component.text(petStack.getItemMeta().getDisplayName())
- .color(NamedTextColor.GREEN)
- .decoration(TextDecoration.ITALIC, false));
-
- List newLore = new ArrayList<>();
- List rawLore = meta.getLore();
- if (rawLore == null) {
- rawLore = new ArrayList<>();
- }
-
- String statsName = "休息中";
- PlayerManager playerManager = PetMain.getPlayerManager();
- if (playerManager.isPetCallExit(playerData.getPlayerName())) {
- statsName = "出战中";
- }
- for (String line : rawLore) {
- String string = line
- .replace("{stats}", statsName)
- .replace("{fangs}", String.valueOf(petNbt.quality.getFangs()))
- .replace("{survive}", String.valueOf(petNbt.quality.getSurvive()))
- .replace("{efficiency}", String.valueOf(petNbt.quality.getEfficiency()))
- .replace("{level}", String.valueOf(petNbt.level))
- .replace("{exp}", String.valueOf(petNbt.exp))
- .replace("{maxExp}", String.valueOf(LevelExpManager.getNeedExpValue(petNbt.level)))
- .replace("{damage}", String.valueOf(petNbt.damage))
- .replace("{health}", String.valueOf(petNbt.health))
- .replace("{maxHealth}", String.valueOf(petNbt.maxHealth));
- newLore.add(Component.text(MessageUtil.convertHexColor(string)).decoration(TextDecoration.ITALIC, false));
- }
- meta.lore(newLore);
- meta.setCustomModelData(petNbt.petData.getCustomIconModelId());
- stack.setItemMeta(meta);
- return stack;
- }
-
- /*public static NameTag getNameBone(ModeledEntity model, String stringType) {
- if (model == null) {
- return null;
- }
- if (model.getModels().size() == 0) {
- return null;
- }
- Optional opt = model.getModels().values().stream().findFirst();
- ActiveModel activeModel = null;
- if (opt.isPresent()) {
- activeModel = opt.get();
- } else {
- return null;
- }
- ModelBone bone = activeModel.getBone(stringType)
- .stream()
- .filter(modelBone -> modelBone.getBoneBehavior(BoneBehaviorTypes.NAMETAG).orElse(null) != null)
- .findFirst().orElse(null);
- if (bone == null) {
- return null;
- }
- NameTag nameTag = bone.getBoneBehavior(BoneBehaviorTypes.NAMETAG).orElse(null);
- return nameTag;
- }*/
- public static PlayerData updatePetNameTag(Wolf wolf) {
- PlayerManager playerManager = PetMain.getPlayerManager();
- if (wolf == null || wolf.isDead()) {
- return null;
- }
- UUID petUuid = wolf.getUniqueId();
- String ownerName = playerManager.getPetOwnerName(petUuid);
- if (ownerName == null) {
- return null;
- }
- PlayerData playerData = playerManager.getPlayerData(ownerName);
- // 判断玩家是否召唤宠物
- if (playerManager.isPetCallExit(ownerName)) {
- /*// 获取宠物的的模型文件
- ModeledEntity modeledEntity = playerManager.getPetEntityModel(petUuid);
- if (modeledEntity == null) {
- return null;
- }
- int petLevel = playerData.getPetNbt().level;
- double healthNow = wolf.getHealth();
- double healthMax = wolf.getMaxHealth();
- // 计算获得血量百分比
- int percent = (int) Math.round((healthNow / healthMax) * 100.0);
- String levelText = Config.getLanguage("pet_level_tag")
- .replace("{level}", Config.getLevelChar(petLevel))
- .replace("{health}", Config.getHealthChar(percent));
- NameTag levelTag = PetUtil.getNameBone(modeledEntity, "level");
- if (levelTag != null) {
- levelTag.setString(levelText);
- levelTag.setVisible(true);
- }*/
- return playerData;
- }
- return null;
- }
-}
diff --git a/src/src/main/java/com/yaohun/petsystem/util/model/BetterModelUtil.java b/src/src/main/java/com/yaohun/petsystem/util/model/BetterModelUtil.java
deleted file mode 100644
index 716e9d0..0000000
--- a/src/src/main/java/com/yaohun/petsystem/util/model/BetterModelUtil.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package com.yaohun.petsystem.util.model;
-
-import kr.toxicity.model.api.BetterModel;
-import kr.toxicity.model.api.bukkit.platform.BukkitAdapter;
-import kr.toxicity.model.api.data.renderer.ModelRenderer;
-import kr.toxicity.model.api.tracker.EntityTracker;
-import kr.toxicity.model.api.tracker.Tracker;
-import kr.toxicity.model.api.tracker.TrackerModifier;
-import org.bukkit.Bukkit;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.Player;
-
-public class BetterModelUtil {
-
- public static Tracker spawnModel(Player owner, Entity entity, String modelId) {
- if (entity == null || entity.isDead()) {
- Bukkit.getLogger().warning("宠物模型载入失败: 实体不存在");
- return null;
- }
- if (modelId == null || modelId.isBlank()) {
- Bukkit.getLogger().warning("宠物模型载入失败: 模型ID为空");
- return null;
- }
-
- ModelRenderer renderer = BetterModel.modelOrNull(modelId);
- if (renderer == null) {
- Bukkit.getLogger().warning("宠物模型不存在: " + modelId);
- return null;
- }
-
- EntityTracker tracker = renderer.create(
- BukkitAdapter.adapt(entity),
- getPetTrackerModifier(),
- BetterModelUtil::refreshModelTracker
- );
-
- refreshModelTracker(tracker);
- spawnVisiblePlayers(tracker, entity);
- Bukkit.getLogger().info("宠物模型载入成功: 玩家=" + owner.getName() + ", 模型=" + modelId + ", 实体=" + entity.getUniqueId());
-
- return tracker;
- }
-
- public static void spawnVisiblePlayers(Tracker tracker, Entity entity) {
- if (tracker == null || tracker.isClosed() || entity == null) {
- return;
- }
- for (Player viewer : Bukkit.getOnlinePlayers()) {
- if (!viewer.isOnline()) {
- continue;
- }
- if (!viewer.getWorld().equals(entity.getWorld())) {
- continue;
- }
- if (tracker instanceof EntityTracker entityTracker) {
- entityTracker.registry().spawnIfNotSpawned(BukkitAdapter.adapt(viewer));
- } else {
- tracker.show(BukkitAdapter.adapt(viewer));
- }
- }
- }
-
- public static void refreshModelTracker(Tracker tracker) {
- if (tracker == null || tracker.isClosed()) {
- return;
- }
- if (tracker instanceof EntityTracker entityTracker) {
- entityTracker.updateBaseEntity();
- entityTracker.refresh();
- }
- tracker.forceUpdate(true);
- }
-
- private static TrackerModifier getPetTrackerModifier() {
- return TrackerModifier.DEFAULT.toBuilder()
- .sightTrace(false)
- .damageAnimation(false)
- .damageTint(false)
- .build();
- }
-}
diff --git a/src/src/main/java/com/yaohun/petsystem/util/wolf/CustomWolf.java b/src/src/main/java/com/yaohun/petsystem/util/wolf/CustomWolf.java
deleted file mode 100644
index 8e70336..0000000
--- a/src/src/main/java/com/yaohun/petsystem/util/wolf/CustomWolf.java
+++ /dev/null
@@ -1,202 +0,0 @@
-package com.yaohun.petsystem.util.wolf;
-
-import com.yaohun.petsystem.model.PetNbt;
-import net.minecraft.server.level.ServerLevel;
-import net.minecraft.world.damagesource.DamageSource;
-import net.minecraft.world.entity.Entity;
-import net.minecraft.world.entity.EntityType;
-import net.minecraft.world.entity.animal.wolf.Wolf;
-import net.minecraft.world.level.Level;
-import net.minecraft.world.phys.Vec3;
-import org.bukkit.Bukkit;
-import org.bukkit.Location;
-import org.bukkit.attribute.Attribute;
-import org.bukkit.attribute.AttributeInstance;
-import org.bukkit.block.Block;
-import org.bukkit.craftbukkit.CraftWorld;
-import org.bukkit.craftbukkit.entity.CraftPlayer;
-import org.bukkit.entity.LivingEntity;
-import org.bukkit.entity.Player;
-
-import java.util.UUID;
-
-/**
- * 自定义的狼实体类,用于实现“跟随玩家”的宠物功能。
- * 继承原版 NMS Wolf 实体,通过 tick() 方法控制移动与传送。
- */
-public class CustomWolf extends Wolf {
-
- private static final double STOP_DISTANCE_SQ = 9.0D;
- private static final double TELEPORT_DISTANCE_SQ = 144.0D;
- private static final double LOOK_DISTANCE_SQ = 256.0D;
- private static final double FOLLOW_SPEED = 1.2D;
- private static final double DEFAULT_MOVEMENT_SPEED = 0.4D;
- private static final int PATH_RECALC_TICKS = 10;
-
- private final UUID ownerUuid;
-
- private int timeToRecalcPath = 0;
-
- /**
- * 构造方法:初始化宠物实体
- *
- * @param world NMS 世界对象
- * @param owner 宠物主人(Bukkit Player)
- */
- public CustomWolf(Level world, Player owner) {
- super(EntityType.WOLF, world);
- this.ownerUuid = owner.getUniqueId();
- }
-
- /**
- * 每 tick 执行的逻辑,控制宠物的移动与状态
- */
- @Override
- public void tick() {
- super.tick();
-
- Player owner = Bukkit.getPlayer(ownerUuid);
- if (owner == null || !owner.isOnline()) {
- this.discard();
- return;
- }
- if (owner.isDead()) {
- this.getNavigation().stop();
- return;
- }
- if (!owner.getWorld().equals(this.getBukkitEntity().getWorld())) {
- this.getNavigation().stop();
- teleportToOwnerLocation(owner);
- return;
- }
-
- net.minecraft.world.entity.player.Player nmsOwner = ((CraftPlayer) owner).getHandle();
-
- double distanceSq = this.distanceToSqr(nmsOwner);
-
- if (distanceSq < STOP_DISTANCE_SQ) {
- this.getNavigation().stop();
- return;
- }
-
- boolean shouldTeleport = distanceSq > TELEPORT_DISTANCE_SQ;
-
- if (!shouldTeleport && distanceSq <= LOOK_DISTANCE_SQ) {
- this.getLookControl().setLookAt(nmsOwner, 10.0F, this.getMaxHeadXRot());
- }
-
- if (--this.timeToRecalcPath <= 0) {
- this.timeToRecalcPath = PATH_RECALC_TICKS;
-
- if (shouldTeleport) {
- if (!tryTeleportNearOwner(nmsOwner)) {
- this.getNavigation().moveTo(nmsOwner, FOLLOW_SPEED);
- }
- } else {
- this.getNavigation().moveTo(nmsOwner, FOLLOW_SPEED);
- }
- }
- }
-
- /**
- * 当宠物距离主人太远时,尝试在主人周围随机传送
- *
- * @param nmsOwner 主人 NMS 实体
- */
- private boolean tryTeleportNearOwner(Entity nmsOwner) {
- Vec3 pos = nmsOwner.position();
-
- for (int i = 0; i < 10; i++) {
- int x = (int) Math.floor(pos.x) + (random.nextInt(7) - 3);
- int y = (int) Math.floor(pos.y);
- int z = (int) Math.floor(pos.z) + (random.nextInt(7) - 3);
-
- Location location = new Location(getBukkitEntity().getWorld(), x + 0.5D, y, z + 0.5D);
- if (isSafeTeleportLocation(location)) {
- this.teleportTo(location.getX(), location.getY(), location.getZ());
- this.getNavigation().stop();
- return true;
- }
- }
- return false;
- }
-
- private void teleportToOwnerLocation(Player owner) {
- Location location = owner.getLocation();
- if (isSafeTeleportLocation(location)) {
- this.getBukkitEntity().teleport(location);
- }
- }
-
- private boolean isSafeTeleportLocation(Location location) {
- Block feet = location.getBlock();
- Block head = feet.getRelative(0, 1, 0);
- Block ground = feet.getRelative(0, -1, 0);
- if (!feet.isPassable() || !head.isPassable() || !ground.getType().isSolid()) {
- return false;
- }
- if (!location.getWorld().equals(getBukkitEntity().getWorld())) {
- return true;
- }
- return this.level().noCollision(this, this.getBoundingBox().move(
- location.getX() - this.getX(),
- location.getY() - this.getY(),
- location.getZ() - this.getZ()
- ));
- }
-
- /**
- * 重写受伤方法,防止主人伤害到自己的宠物
- *
- * @param source 伤害来源
- * @param amount 伤害数值
- * @return 是否成功造成伤害
- */
- @Override
- public boolean hurtServer(ServerLevel level, DamageSource source, float amount) {
- Entity entity = source.getEntity();
-
- if (entity != null && entity.getUUID().equals(ownerUuid)) {
- return false;
- }
- return super.hurtServer(level, source, amount);
- }
-
- /**
- * 静态方法:用于在 Bukkit 世界中生成并注册一只 CustomWolf
- *
- * @param owner 宠物主人
- * @return 新生成的 CustomWolf 实例
- */
- public static CustomWolf spawnCustomWolf(Player owner, PetNbt petNbt) {
- CraftWorld world = (CraftWorld) owner.getWorld();
- Level nmsWorld = world.getHandle();
-
- CustomWolf wolf = new CustomWolf(nmsWorld, owner);
-
- wolf.setSilent(true);
- wolf.setOrderedToSit(false);
- wolf.setPos(owner.getLocation().getX(), owner.getLocation().getY(), owner.getLocation().getZ());
-
- LivingEntity livingEntity = wolf.getBukkitLivingEntity();
- double maxHealth = Math.max(1.0D, petNbt.maxHealth);
- double health = Math.max(1.0D, Math.min(petNbt.health, maxHealth));
- double damage = Math.max(0.0D, petNbt.damage);
-
- setAttribute(livingEntity, Attribute.MAX_HEALTH, maxHealth);
- setAttribute(livingEntity, Attribute.MOVEMENT_SPEED, DEFAULT_MOVEMENT_SPEED);
- setAttribute(livingEntity, Attribute.ATTACK_DAMAGE, damage);
- livingEntity.setHealth(health);
-
- nmsWorld.addFreshEntity(wolf);
-
- return wolf;
- }
-
- private static void setAttribute(LivingEntity entity, Attribute attribute, double value) {
- AttributeInstance instance = entity.getAttribute(attribute);
- if (instance != null) {
- instance.setBaseValue(value);
- }
- }
-}
diff --git a/src/src/main/resources/config.yml b/src/src/main/resources/config.yml
deleted file mode 100644
index 75039dc..0000000
--- a/src/src/main/resources/config.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-NeedExpSettings:
- 1: 10000
- 2: 10000
- 3: 10000
- 4: 10000
- 5: 10000
- 6: 10000
- 7: 10000
- 8: 10000
- 9: 10000
- 10: 10000
- 11: 10000
- 12: 10000
- 13: 10000
- 14: 10000
- 15: 10000
- 16: 10000
- 17: 10000
- 18: 10000
- 19: 10000
- 20: 10000
- 21: 10000
- 22: 10000
- 23: 10000
- 24: 10000
- 25: 10000
- 26: 10000
- 27: 10000
- 28: 10000
- 29: 10000
- 30: -1
\ No newline at end of file
diff --git a/src/src/main/resources/lang.yml b/src/src/main/resources/lang.yml
deleted file mode 100644
index e69de29..0000000
diff --git a/src/src/main/resources/plugin.yml b/src/src/main/resources/plugin.yml
deleted file mode 100644
index 66b3172..0000000
--- a/src/src/main/resources/plugin.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-name: AuPet
-main: com.yaohun.petsystem.PetMain
-version: 1.0.1
-api-version: 1.21
-commands:
- apet: