EffectShop-简单的效果商店
[MD] # EffectShop — 效果商店插件文档 ## 📖 插件概述 **EffectShop** 是一款适用于 **LeviLamina (lse-quickjs)** 平台的轻量高性能效果商店插件。玩家可通过 `/eshop` 指令打开 GUI 界面,使用 **LLMoney** 经济系统购买药水效果与无敌状态。 | 项目 | 内容 | |------|------| | 插件名称 | EffectShop | | 当前版本 | v1.2.0 | | 运行平台 | LeviLamina (lse-quickjs) | | 经济系统 | LLMoney | | 核心标签 | 轻量 / 高性能 / 药水效果 / 无敌 / 真实时间计费 | --- ## 🚀 快速开始 ### 安装步骤 1. 将 `EffectShop.js` 放入服务端 `plugins/` 目录 2. 首次启动会自动生成以下文件: ``` plugins/EffectShop/ ├── config.json # 插件配置文件 ├── playerEffects.json # 药水效果数据(自动生成) └── playerInvincibility.json # 无敌效果数据(自动生成) ``` 3. 配置文件可手动修改,修改后重载插件生效 4. 使用 `/eshop` 或 `/effectshop` 打开商店 ### 玩家指令 | 指令 | 别名 | 权限 | 功能 | |------|------|------|------| | `/eshop` | `/effectshop` | 所有玩家 | 打开效果商店GUI | --- ## ⚙️ 配置说明 配置文件位于 `plugins/EffectShop/config.json`,首次启动自动生成。 ```json { "currencyName": "土豆币", "saveInterval": 60, "enableToast": true, "expireWarningTime": 60, "enableRenewReminder": true, "invincibleExpireWarningTime": 300 } ``` ### 配置项详解 | 键名 | 类型 | 默认值 | 说明 | |------|------|--------|------| | `currencyName` | string | `"土豆币"` | 经济系统中货币的显示名称 | | `saveInterval` | number | `60` | 数据自动保存间隔(秒) | | `enableToast` | boolean | `true` | 是否开启购买成功的 Toast 通知 | | `expireWarningTime` | number | `60` | 药水效果到期前多少秒发送提醒(0=不提醒) | | `enableRenewReminder` | boolean | `true` | 是否开启自动续费功能提示 | | `invincibleExpireWarningTime` | number | `300` | 无敌效果到期前多少秒发送提醒(0=不提醒) | --- ## 🛒 效果商品列表 ### 药水效果(Potion Effects) | 效果名称 | 效果ID | 等级 | 小时价格 | 天价格 | 描述 | |----------|--------|------|----------|--------|------| | **夜视** | 16 (NightVision) | I 级 | ¥10,000 | ¥68,888 | 永久夜视能力 | | **急迫 II** | 3 (Haste) | II 级 | ¥13,888 | ¥139,999 | 大幅提升挖掘速度 | | **迅捷** | 1 (Speed) | I 级 | ¥8,888 | ¥11,888 | 提升移动速度 | | **生命恢复** | 10 (Regeneration) | I 级 | ¥23,888 | ¥166,888 | 持续恢复生命值 | ### 无敌效果(Invincibility — v1.2.0 新增) | 效果名称 | 实现方式 | 小时价格 | 天价格 | 月价格 | |----------|----------|----------|--------|--------| | **无敌** | 抗性提升 V | ¥5,888 | ¥38,888 | ¥399,999 | **无敌特性:** - ✅ 免疫所有伤害(通过抗性提升 V 实现,100% 伤害减免) - ✅ 免疫所有击退效果 - ✅ 阻止 48 格半径内敌对生物生成 - ✅ 每 5 秒自动清除附近 48 格内已生成的怪物 - ✅ 真实时间计费(离线也计时) - ✅ 可手动开关,计时器不中断 - ✅ 跨服重启后自动恢复 --- ## 🎮 使用流程 ### 购买流程(药水效果) ``` /eshop → 选择效果 → 选择时长(1小时/1天) → 确认购买 ``` 1. 输入 `/eshop` 打开主菜单 2. 点击目标效果按钮(如「急迫 II」) 3. 选择购买时长(1小时 / 1天) 4. 确认购买 5. 扣款成功 → 效果立即生效 → 获得 Toast 通知 ### 购买与使用流程(无敌效果) ``` /eshop → 选择「无敌」→ 购买(时/天/月) → 自动开启 ``` **已购买后的操作:** - **关闭:** `/eshop` → 无敌 → 点击「关闭无敌」 - **开启:** `/eshop` → 无敌 → 点击「开启无敌」 - **延长:** `/eshop` → 无敌 → 点击「购买延长」 --- ## 🏗️ 系统架构 ### 核心模块关系图 ``` ┌─────────────────────────────────────────────┐ │ onTick │ │ (每秒一次,由单一 tick 监听器驱动) │ └────────────────┬────────────────────────────┘ │ ┌───────────┴───────────┐ ▼ ▼ ┌─────────────┐ ┌──────────────────┐ │ EffectManager │ │ InvincibilityManager │ │ │ │ │ │ · 缓存Map │ │ · 缓存Map │ │ · 过期清理 │ │ · 抗性刷新(20s) │ │ · 到期提醒 │ │ · 怪物清理(5s) │ │ · 自动保存 │ │ · 真实时间计费 │ └───────┬───────┘ └────────┬───────────┘ │ │ ▼ ▼ ┌──────────────────────────────────────────┐ │ 文件 I/O (JSON) │ │ playerEffects.json / playerInvincibility.json │ └──────────────────────────────────────────┘ ``` ### 模块说明 | 模块 | 说明 | |------|------| | **Config** | 配置管理器,读取/合并 `config.json` | | **Economy** | LLMoney 经济接口,封装查询、扣款操作 | | **EffectManager** | 药水效果管理器,Map 缓存 + 过期心跳 + 自动保存 | | **InvincibilityManager** | 无敌管理器,真实时间计费 + 抗性刷新 + 怪物阻止 | | **EffectApplier** | 效果应用器,优先命令回退 API | | **ShopUI** | 商店 GUI,SimpleForm 表单全部逻辑 | --- ## 🎯 事件系统 | 事件 | 处理器 | 用途 | |------|--------|------| | `onTick` | `EffectManager._cleanupExpiredEffects()` | 每秒检查过期药水效果 | | `onTick` | `InvincibilityManager._heartbeat()` | 每秒心跳:过期检查、警告、抗性刷新、怪物清理 | | `onLeft` | `EffectManager.onPlayerQuit()` | 玩家退出时保存脏数据 | | `onLeft` | `InvincibilityManager.onPlayerQuit()` | 玩家退出时保存脏数据 | | `onJoin` | `InvincibilityManager.onPlayerJoin()` | 玩家加入时恢复无敌状态 | | `onServerStop` | `EffectManager.save(true)` | 服务器关闭时强制保存 | | `onServerStop` | `InvincibilityManager.save(true)` | 服务器关闭时强制保存 | | `onServerStarted` | `init()` | 服务器完全启动后初始化插件 | | `onMobSpawn` | 怪物生成拦截 | 阻止无敌玩家48格内生成怪物 | | `onMobHurt` | 伤害兜底 | 拦截无敌玩家受到的伤害 | --- ## ⚡ 性能设计 | 设计要点 | 说明 | |----------|------| | **Map 缓存** | 所有玩家数据通过 `Map<xuid, ...>` 管理,O(1) 查找 | | **单一 tick 监听** | 全局仅注册一个 `onTick`,统一管理所有计时器 | | **脏数据标记** | `_dirty` Set 跟踪已修改数据,批量保存避免全量 I/O | | **异步保存** | `setInterval` 定时批量写入,`onLeft` / `onServerStop` 强制保存 | | **延迟初始化** | 在 `onServerStarted` 中初始化,避免服务器未就绪时报错 | | **快速退出** | 无敌玩家数量为 0 时,`onMobSpawn` 快速返回 | --- ## 📦 数据文件格式 ### playerEffects.json ```json { "xuid_123456": { "effects": [ [11, 1734567890123], [1, 1734567894123] ], "playerName": "Steve" } } ``` - `effects`: `[effectId, expireTimestamp(ms)]` 数组 - expireTimestamp < Date.now() 时自动清理 ### playerInvincibility.json ```json { "xuid_123456": { "expireTime": 1734567890123, "active": true, "playerName": "Steve" } } ``` - `expireTime`: 到期时间戳(毫秒) - `active`: 是否已开启无敌(true=抗性V已应用) --- ## 🔧 开发者扩展指南 ### 添加新药水效果 在 `EFFECT_CONFIG` 中添加条目: ```javascript const EFFECT_CONFIG = { // ... 现有效果 newEffect: { id: "newEffect", name: "新效果名称", effectId: 12, // MC 药水效果 ID level: 0, // 0=I级, 1=II级 icon: "textures/items/potion_bottle_splash_xxx", hourlyPrice: 5000, // 1小时价格 dailyPrice: 50000 // 1天价格 } }; ``` ### 调整无敌参数 直接修改 `InvincibilityManager` 中的常量: ```javascript // _heartbeat() 内 this._resistanceTick >= 20 // 抗性刷新间隔(20 tick = 1秒) this._cleanupTick >= 5 // 怪物清理间隔(5 tick) ``` 怪物生成检测半径: ```javascript // onMobSpawn 监听内 dx * dx + dy * dy + dz * dz < 2304 // sqrt(2304) = 48 格半径 ``` --- ## 🛡️ 防护机制 | 防护层 | 实现方式 | 说明 | |--------|----------|------| | **第一层:抗性提升 V** | `/effect` 命令持续应用 | 100% 伤害减免,免疫击退 | | **第二层:怪物生成拦截** | `onMobSpawn` 返回 false | 阻止 48 格内敌对生物生成 | | **第三层:怪物清理** | `/kill @e[family=monster,r=48]` | 每 5 秒清理已有怪物 | | **第四层:伤害兜底** | `onMobHurt` 返回 false | 拦截所有伤害来源 | --- ## ⚠️ 注意事项 1. **无敌计费:** 采用真实时间计费,玩家离线期间时间照常扣除,建议设置非过高价格 2. **抗性刷新:** 每 20 秒刷新一次抗性提升 V(效果持续 30 秒),10 秒安全余量 3. **怪物清理:** 每 5 秒执行一次 `kill` 清理 48 格内怪物,对服务器性能影响极小 4. **跨版本兼容:** 效果应用采用命令回退 API 的双重机制,兼容多种 LSE 版本 5. **数据安全:** 提供多重保存机制(定时 + 退出 + 关闭),防止数据丢失 --- ## 💬 常见问题 **Q: 为什么无敌玩家下单后没立刻生效?** A: 购买无敌后会自动开启,无需手动激活。如果未自动开启,可用 `/eshop` → 无敌 → 开启无敌。 **Q: 无敌时间为什么在离线也在减少?** A: 无敌采用真实时间计费,与传统药水效果不同,可有效防止玩家利用下线策略卡时间。 **Q: 如何查看还剩多少时间?** A: 使用 `/eshop` 打开主菜单,所有效果剩余时间一目了然,也可点击「查看已购效果」。 **Q: 我买了无敌但不想一直开着怎么办?** A: 可以在 `/eshop` → 无敌菜单中手动关闭。关闭后时间仍正常流逝,再次开启即可使用剩余时间。 [/MD]
[MD] # EffectShop — 效果商店插件文档 ## 📖 插件概述 **EffectShop** 是一款适用于 **LeviLamina (lse-quickjs)** 平台的轻量高性能效果商店插件。玩家可通过 `/eshop` 指令打开 GUI 界面,使用 **LLMoney** 经济系统购买药水效果与无敌状态。 | 项目 | 内容 | |------|------| | 插件名称 | EffectShop | | 当前版本 | v1.2.0 | | 运行平台 | LeviLamina (lse-quickjs) | | 经济系统 | LLMoney | | 核心标签 | 轻量 / 高性能 / 药水效果 / 无敌 / 真实时间计费 | --- ## 🚀 快速开始 ### 安装步骤 1. 将 `EffectShop.js` 放入服务端 `plugins/` 目录 2. 首次启动会自动生成以下文件: ``` plugins/EffectShop/ ├── config.json # 插件配置文件 ├── playerEffects.json # 药水效果数据(自动生成) └── playerInvincibility.json # 无敌效果数据(自动生成) ``` 3. 配置文件可手动修改,修改后重载插件生效 4. 使用 `/eshop` 或 `/effectshop` 打开商店 ### 玩家指令 | 指令 | 别名 | 权限 | 功能 | |------|------|------|------| | `/eshop` | `/effectshop` | 所有玩家 | 打开效果商店GUI | --- ## ⚙️ 配置说明 配置文件位于 `plugins/EffectShop/config.json`,首次启动自动生成。 ```json { "currencyName": "土豆币", "saveInterval": 60, "enableToast": true, "expireWarningTime": 60, "enableRenewReminder": true, "invincibleExpireWarningTime": 300 } ``` ### 配置项详解 | 键名 | 类型 | 默认值 | 说明 | |------|------|--------|------| | `currencyName` | string | `"土豆币"` | 经济系统中货币的显示名称 | | `saveInterval` | number | `60` | 数据自动保存间隔(秒) | | `enableToast` | boolean | `true` | 是否开启购买成功的 Toast 通知 | | `expireWarningTime` | number | `60` | 药水效果到期前多少秒发送提醒(0=不提醒) | | `enableRenewReminder` | boolean | `true` | 是否开启自动续费功能提示 | | `invincibleExpireWarningTime` | number | `300` | 无敌效果到期前多少秒发送提醒(0=不提醒) | --- ## 🛒 效果商品列表 ### 药水效果(Potion Effects) | 效果名称 | 效果ID | 等级 | 小时价格 | 天价格 | 描述 | |----------|--------|------|----------|--------|------| | **夜视** | 16 (NightVision) | I 级 | ¥10,000 | ¥68,888 | 永久夜视能力 | | **急迫 II** | 3 (Haste) | II 级 | ¥13,888 | ¥139,999 | 大幅提升挖掘速度 | | **迅捷** | 1 (Speed) | I 级 | ¥8,888 | ¥11,888 | 提升移动速度 | | **生命恢复** | 10 (Regeneration) | I 级 | ¥23,888 | ¥166,888 | 持续恢复生命值 | ### 无敌效果(Invincibility — v1.2.0 新增) | 效果名称 | 实现方式 | 小时价格 | 天价格 | 月价格 | |----------|----------|----------|--------|--------| | **无敌** | 抗性提升 V | ¥5,888 | ¥38,888 | ¥399,999 | **无敌特性:** - ✅ 免疫所有伤害(通过抗性提升 V 实现,100% 伤害减免) - ✅ 免疫所有击退效果 - ✅ 阻止 48 格半径内敌对生物生成 - ✅ 每 5 秒自动清除附近 48 格内已生成的怪物 - ✅ 真实时间计费(离线也计时) - ✅ 可手动开关,计时器不中断 - ✅ 跨服重启后自动恢复 --- ## 🎮 使用流程 ### 购买流程(药水效果) ``` /eshop → 选择效果 → 选择时长(1小时/1天) → 确认购买 ``` 1. 输入 `/eshop` 打开主菜单 2. 点击目标效果按钮(如「急迫 II」) 3. 选择购买时长(1小时 / 1天) 4. 确认购买 5. 扣款成功 → 效果立即生效 → 获得 Toast 通知 ### 购买与使用流程(无敌效果) ``` /eshop → 选择「无敌」→ 购买(时/天/月) → 自动开启 ``` **已购买后的操作:** - **关闭:** `/eshop` → 无敌 → 点击「关闭无敌」 - **开启:** `/eshop` → 无敌 → 点击「开启无敌」 - **延长:** `/eshop` → 无敌 → 点击「购买延长」 --- ## 🏗️ 系统架构 ### 核心模块关系图 ``` ┌─────────────────────────────────────────────┐ │ onTick │ │ (每秒一次,由单一 tick 监听器驱动) │ └────────────────┬────────────────────────────┘ │ ┌───────────┴───────────┐ ▼ ▼ ┌─────────────┐ ┌──────────────────┐ │ EffectManager │ │ InvincibilityManager │ │ │ │ │ │ · 缓存Map │ │ · 缓存Map │ │ · 过期清理 │ │ · 抗性刷新(20s) │ │ · 到期提醒 │ │ · 怪物清理(5s) │ │ · 自动保存 │ │ · 真实时间计费 │ └───────┬───────┘ └────────┬───────────┘ │ │ ▼ ▼ ┌──────────────────────────────────────────┐ │ 文件 I/O (JSON) │ │ playerEffects.json / playerInvincibility.json │ └──────────────────────────────────────────┘ ``` ### 模块说明 | 模块 | 说明 | |------|------| | **Config** | 配置管理器,读取/合并 `config.json` | | **Economy** | LLMoney 经济接口,封装查询、扣款操作 | | **EffectManager** | 药水效果管理器,Map 缓存 + 过期心跳 + 自动保存 | | **InvincibilityManager** | 无敌管理器,真实时间计费 + 抗性刷新 + 怪物阻止 | | **EffectApplier** | 效果应用器,优先命令回退 API | | **ShopUI** | 商店 GUI,SimpleForm 表单全部逻辑 | --- ## 🎯 事件系统 | 事件 | 处理器 | 用途 | |------|--------|------| | `onTick` | `EffectManager._cleanupExpiredEffects()` | 每秒检查过期药水效果 | | `onTick` | `InvincibilityManager._heartbeat()` | 每秒心跳:过期检查、警告、抗性刷新、怪物清理 | | `onLeft` | `EffectManager.onPlayerQuit()` | 玩家退出时保存脏数据 | | `onLeft` | `InvincibilityManager.onPlayerQuit()` | 玩家退出时保存脏数据 | | `onJoin` | `InvincibilityManager.onPlayerJoin()` | 玩家加入时恢复无敌状态 | | `onServerStop` | `EffectManager.save(true)` | 服务器关闭时强制保存 | | `onServerStop` | `InvincibilityManager.save(true)` | 服务器关闭时强制保存 | | `onServerStarted` | `init()` | 服务器完全启动后初始化插件 | | `onMobSpawn` | 怪物生成拦截 | 阻止无敌玩家48格内生成怪物 | | `onMobHurt` | 伤害兜底 | 拦截无敌玩家受到的伤害 | --- ## ⚡ 性能设计 | 设计要点 | 说明 | |----------|------| | **Map 缓存** | 所有玩家数据通过 `Map<xuid, ...>` 管理,O(1) 查找 | | **单一 tick 监听** | 全局仅注册一个 `onTick`,统一管理所有计时器 | | **脏数据标记** | `_dirty` Set 跟踪已修改数据,批量保存避免全量 I/O | | **异步保存** | `setInterval` 定时批量写入,`onLeft` / `onServerStop` 强制保存 | | **延迟初始化** | 在 `onServerStarted` 中初始化,避免服务器未就绪时报错 | | **快速退出** | 无敌玩家数量为 0 时,`onMobSpawn` 快速返回 | --- ## 📦 数据文件格式 ### playerEffects.json ```json { "xuid_123456": { "effects": [ [11, 1734567890123], [1, 1734567894123] ], "playerName": "Steve" } } ``` - `effects`: `[effectId, expireTimestamp(ms)]` 数组 - expireTimestamp < Date.now() 时自动清理 ### playerInvincibility.json ```json { "xuid_123456": { "expireTime": 1734567890123, "active": true, "playerName": "Steve" } } ``` - `expireTime`: 到期时间戳(毫秒) - `active`: 是否已开启无敌(true=抗性V已应用) --- ## 🔧 开发者扩展指南 ### 添加新药水效果 在 `EFFECT_CONFIG` 中添加条目: ```javascript const EFFECT_CONFIG = { // ... 现有效果 newEffect: { id: "newEffect", name: "新效果名称", effectId: 12, // MC 药水效果 ID level: 0, // 0=I级, 1=II级 icon: "textures/items/potion_bottle_splash_xxx", hourlyPrice: 5000, // 1小时价格 dailyPrice: 50000 // 1天价格 } }; ``` ### 调整无敌参数 直接修改 `InvincibilityManager` 中的常量: ```javascript // _heartbeat() 内 this._resistanceTick >= 20 // 抗性刷新间隔(20 tick = 1秒) this._cleanupTick >= 5 // 怪物清理间隔(5 tick) ``` 怪物生成检测半径: ```javascript // onMobSpawn 监听内 dx * dx + dy * dy + dz * dz < 2304 // sqrt(2304) = 48 格半径 ``` --- ## 🛡️ 防护机制 | 防护层 | 实现方式 | 说明 | |--------|----------|------| | **第一层:抗性提升 V** | `/effect` 命令持续应用 | 100% 伤害减免,免疫击退 | | **第二层:怪物生成拦截** | `onMobSpawn` 返回 false | 阻止 48 格内敌对生物生成 | | **第三层:怪物清理** | `/kill @e[family=monster,r=48]` | 每 5 秒清理已有怪物 | | **第四层:伤害兜底** | `onMobHurt` 返回 false | 拦截所有伤害来源 | --- ## ⚠️ 注意事项 1. **无敌计费:** 采用真实时间计费,玩家离线期间时间照常扣除,建议设置非过高价格 2. **抗性刷新:** 每 20 秒刷新一次抗性提升 V(效果持续 30 秒),10 秒安全余量 3. **怪物清理:** 每 5 秒执行一次 `kill` 清理 48 格内怪物,对服务器性能影响极小 4. **跨版本兼容:** 效果应用采用命令回退 API 的双重机制,兼容多种 LSE 版本 5. **数据安全:** 提供多重保存机制(定时 + 退出 + 关闭),防止数据丢失 --- ## 💬 常见问题 **Q: 为什么无敌玩家下单后没立刻生效?** A: 购买无敌后会自动开启,无需手动激活。如果未自动开启,可用 `/eshop` → 无敌 → 开启无敌。 **Q: 无敌时间为什么在离线也在减少?** A: 无敌采用真实时间计费,与传统药水效果不同,可有效防止玩家利用下线策略卡时间。 **Q: 如何查看还剩多少时间?** A: 使用 `/eshop` 打开主菜单,所有效果剩余时间一目了然,也可点击「查看已购效果」。 **Q: 我买了无敌但不想一直开着怎么办?** A: 可以在 `/eshop` → 无敌菜单中手动关闭。关闭后时间仍正常流逝,再次开启即可使用剩余时间。 [/MD]