From 3a5b4e8db5f5ba3c12c1dac98c8eeee20a625005 Mon Sep 17 00:00:00 2001 From: waynebian01 Date: Tue, 1 Sep 2026 16:19:20 +0800 Subject: [PATCH] Refactor configuration for Shaman, Warlock, and Warrior classes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Adjusted step values for various configuration options to maintain order and consistency. - Reintroduced "治疗药水" and "治疗石" for Warlock and Shaman with updated steps and properties. - Removed "鲁莽药水" from Warrior configuration and added it back with updated properties. - Ensured all changes maintain the integrity of the configuration structure. --- CLAUDE.md | 2 +- Fuyutsui/Fuyutsui.toc | 2 +- Fuyutsui/class/DeathKnight.lua | 27 +- Fuyutsui/class/DemonHunter.lua | 10 +- Fuyutsui/class/Paladin.lua | 24 +- Fuyutsui/class/Priest.lua | 18 +- Fuyutsui/class/Shaman.lua | 6 +- Fuyutsui/class/Warlock.lua | 8 +- Fuyutsui/class/Warrior.lua | 6 +- Fuyutsui/core/curves.lua | 1 + Fuyutsui/core/events.lua | 1 + Fuyutsui/core/spells.lua | 14 +- Fuyutsui/core/stateblocks.lua | 14 +- Fuyutsui/main.lua | 83 ++-- Infrastructure/ClassBlocksStore.cs | 121 +++--- Infrastructure/ClassStateCatalog.cs | 7 +- Infrastructure/FuyutsuiConfigConverter.cs | 85 ++-- Infrastructure/ModuleDependencyService.cs | 63 +-- Modules/ModuleDependencies.cs | 1 + .../00-导航/01-Shigure-AI阅读顺序与术语.md | 4 +- Obsidian/10-系统/00-Shigure-双项目系统全景.md | 2 +- .../03-Fuyutsui-状态块与编码入口.md | 13 +- .../20-Fuyutsui/06-Fuyutsui-法术与物品冷却.md | 7 +- .../40-跨项目/00-Shigure-跨项目契约-MOC.md | 4 +- .../02-Shigure-ClassBlocks到config同步契约.md | 14 +- .../04-Shigure-兼容性变更检查清单.md | 2 +- Obsidian/50-参考资料/TEXTURE_LAYOUT_zh-CN.md | 18 +- README.md | 4 +- Shigure.csproj | 6 +- UI/ClassConfigEditorControl.cs | 213 ++++++---- UI/ModuleEditorControl.cs | 61 ++- UI/StatusForm.cs | 2 +- config/DeathKnight.json | 383 +++++++++--------- config/DemonHunter.json | 163 ++++---- config/Paladin.json | 378 ++++++++--------- config/Priest.json | 261 ++++++------ config/Shaman.json | 143 +++---- config/Warlock.json | 108 ++--- config/Warrior.json | 157 +++---- 39 files changed, 1278 insertions(+), 1158 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index ef18138d..e2fb6f09 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -99,7 +99,7 @@ wow_process.txt 目标游戏进程名列表;构建时复制,运行期间每 ### UI 编辑器 -- [UI/ClassConfigEditorControl.cs](UI/ClassConfigEditorControl.cs):左侧职业列表 + 右侧按专精切换的四页编辑器(状态/光环/法术/队伍),状态字段用 `ClassStateCatalog` 驱动的 `ComboBoxColumn`。 +- [UI/ClassConfigEditorControl.cs](UI/ClassConfigEditorControl.cs):左侧职业列表 + 右侧按专精切换的六页编辑器(状态/光环/法术/物品/队伍/技能列表),状态字段用 `ClassStateCatalog` 驱动的 `ComboBoxColumn`。 - [UI/ClassMacrosEditorControl.cs](UI/ClassMacrosEditorControl.cs):左侧职业列表 + 右侧三页编辑器(动态宏/静态宏/特殊宏),偏移提示显示槽位编号计算。 - 两个编辑器均接受 `Func` 项目路径解析器 + `Func>` 保存回调,由 `MainForm` 在构造时注入。保存流程:编辑器调 `Store.Save()` → 传入已保存文件路径 → 重新生成 config/keymap → 单文件部署游戏 → 重启运行时;部署失败返回说明,但不回滚本地文件。 - 配置更新的多个入口通过任务尾队列串行执行;运行时重启会等待该队列稳定,主窗口关闭也会等待正在写盘的转换和部署完成。新增同步入口必须继续走这条队列。 diff --git a/Fuyutsui/Fuyutsui.toc b/Fuyutsui/Fuyutsui.toc index 35e569ad..fcf384c7 100644 --- a/Fuyutsui/Fuyutsui.toc +++ b/Fuyutsui/Fuyutsui.toc @@ -1,7 +1,7 @@ ## Interface: 120100 ## Title: Fuyutsui -## Version: 1.2.1.18 +## Version: 1.2.1.19 ## Author: Wayne ## IconTexture: Interface\AddOns\Fuyutsui\core\Spell_Misc_EmotionHappy.blp ## OptionalDeps: LibRangeCheck-3.0 diff --git a/Fuyutsui/class/DeathKnight.lua b/Fuyutsui/class/DeathKnight.lua index 0b7644f4..53555fd7 100644 --- a/Fuyutsui/class/DeathKnight.lua +++ b/Fuyutsui/class/DeathKnight.lua @@ -34,12 +34,7 @@ Fuyutsui.ClassBlocks = { "符文能量", "符文", }, - ["物品"] = { - [5512] = "治疗石", - [123456] = "物品名称", - [241288] = "鲁莽药水", - [241308] = "圣光潜力", - }, + ["配置开关"] = { "爆发开关", "爆发药水开关", @@ -116,6 +111,12 @@ Fuyutsui.ClassBlocks = { { spellId = 43265, name = "枯萎凋零", charge = true, maxCharge = 2 }, { spellId = 49028, name = "符文刃舞" }, }, + items = { + [5512] = { name = "治疗石", isEquipped = false }, + [123456] = { name = "物品名称", isEquipped = true }, + [241288] = { name = "鲁莽药水", isEquipped = false }, + [241308] = { name = "圣光潜力", isEquipped = false }, + }, }, [2] = { states = { @@ -146,9 +147,6 @@ Fuyutsui.ClassBlocks = { "符文能量", "符文", }, - ["物品"] = { - [241288] = "鲁莽药水", - }, ["配置开关"] = { "爆发开关", "输出模式", @@ -211,6 +209,9 @@ Fuyutsui.ClassBlocks = { { spellId = 1249658, name = "冰龙吐息" }, { spellId = 47528, name = "心灵冰冻" }, }, + items = { + [241288] = { name = "鲁莽药水", isEquipped = false }, + }, }, [3] = { states = { @@ -243,10 +244,6 @@ Fuyutsui.ClassBlocks = { "符文", "符文能量", }, - ["物品"] = { - [241288] = "鲁莽药水", - [241304] = "治疗药水", - }, ["配置开关"] = { "延迟", "爆发开关", @@ -301,6 +298,10 @@ Fuyutsui.ClassBlocks = { { spellId = 43265, name = "枯萎凋零", charge = true, maxCharge = 2 }, { spellId = 55090, name = "天灾打击", castCount = 20 }, }, + items = { + [241288] = { name = "鲁莽药水", isEquipped = false }, + [241304] = { name = "治疗药水", isEquipped = false }, + }, }, } diff --git a/Fuyutsui/class/DemonHunter.lua b/Fuyutsui/class/DemonHunter.lua index 41d2dc49..96185a40 100644 --- a/Fuyutsui/class/DemonHunter.lua +++ b/Fuyutsui/class/DemonHunter.lua @@ -107,11 +107,6 @@ Fuyutsui.ClassBlocks = { ["能量"] = { "恶魔之怒", }, - ["物品"] = { - [5512] = "治疗石", - [241288] = "鲁莽药水", - [241308] = "圣光潜力", - }, ["配置开关"] = { "爆发开关", "爆发药水开关", @@ -191,6 +186,11 @@ Fuyutsui.ClassBlocks = { { spellId = 207407, name = "灵魂切削" }, { spellId = 202137, name = "沉默咒符" }, }, + items = { + [5512] = { name = "治疗石", isEquipped = false }, + [241288] = { name = "鲁莽药水", isEquipped = false }, + [241308] = { name = "圣光潜力", isEquipped = false }, + }, }, [3] = { states = { diff --git a/Fuyutsui/class/Paladin.lua b/Fuyutsui/class/Paladin.lua index 078219e7..bfccc7e7 100644 --- a/Fuyutsui/class/Paladin.lua +++ b/Fuyutsui/class/Paladin.lua @@ -34,9 +34,6 @@ Fuyutsui.ClassBlocks = { "法力值", "神圣能量", }, - ["物品"] = { - [241304] = "治疗药水", - }, ["配置开关"] = { "爆发开关", "延迟", @@ -114,6 +111,9 @@ Fuyutsui.ClassBlocks = { { spellId = 432459, name = "神圣壁垒", charge = true, maxCharge = 2 }, { spellId = 391054, name = "代祷" }, }, + items = { + [241304] = { name = "治疗药水", isEquipped = false }, + }, group = { num = 6, healthPercent = 1, @@ -154,12 +154,6 @@ Fuyutsui.ClassBlocks = { "法力值", "神圣能量", }, - ["物品"] = { - [5512] = "治疗石", - [241288] = "鲁莽药水", - [241304] = "治疗药水", - [241308] = "圣光潜力", - }, ["配置开关"] = { "延迟", "爆发开关", @@ -230,6 +224,12 @@ Fuyutsui.ClassBlocks = { { spellId = 633, name = "圣疗术" }, { spellId = 24275, name = "愤怒之锤" }, }, + items = { + [5512] = { name = "治疗石", isEquipped = false }, + [241288] = { name = "鲁莽药水", isEquipped = false }, + [241304] = { name = "治疗药水", isEquipped = false }, + [241308] = { name = "圣光潜力", isEquipped = false }, + }, group = { num = 3, healthPercent = 1, @@ -265,9 +265,6 @@ Fuyutsui.ClassBlocks = { "法力值", "神圣能量", }, - ["物品"] = { - [241304] = "治疗药水", - }, ["配置开关"] = { "爆发开关", "AOE开关", @@ -318,6 +315,9 @@ Fuyutsui.ClassBlocks = { { spellId = 255937, name = "灰烬觉醒" }, { spellId = 31884, name = "复仇之怒" }, }, + items = { + [241304] = { name = "治疗药水", isEquipped = false }, + }, group = { num = 3, healthPercent = 1, diff --git a/Fuyutsui/class/Priest.lua b/Fuyutsui/class/Priest.lua index ac17d231..a13fce01 100644 --- a/Fuyutsui/class/Priest.lua +++ b/Fuyutsui/class/Priest.lua @@ -30,12 +30,6 @@ Fuyutsui.ClassBlocks = { ["能量"] = { "法力值", }, - ["物品"] = { - [5512] = "治疗石", - [241288] = "鲁莽药水", - [241301] = "魔法药水", - [241304] = "治疗药水", - }, ["配置开关"] = { "延迟", }, @@ -108,6 +102,12 @@ Fuyutsui.ClassBlocks = { { spellId = 1235211, name = "暗影分流" }, { spellId = 586, name = "渐隐术" }, }, + items = { + [5512] = { name = "治疗石", isEquipped = false }, + [241288] = { name = "鲁莽药水", isEquipped = false }, + [241301] = { name = "魔法药水", isEquipped = false }, + [241304] = { name = "治疗药水", isEquipped = false }, + }, group = { num = 5, healthPercent = 1, @@ -147,9 +147,6 @@ Fuyutsui.ClassBlocks = { ["能量"] = { "法力值", }, - ["物品"] = { - [241304] = "治疗药水", - }, ["配置开关"] = { "延迟", "爆发开关", @@ -227,6 +224,9 @@ Fuyutsui.ClassBlocks = { { spellId = 586, name = "渐隐术" }, { spellId = 528, name = "驱散魔法" }, }, + items = { + [241304] = { name = "治疗药水", isEquipped = false }, + }, group = { num = 5, healthPercent = 1, diff --git a/Fuyutsui/class/Shaman.lua b/Fuyutsui/class/Shaman.lua index 9dc1a6c8..abdecc0f 100644 --- a/Fuyutsui/class/Shaman.lua +++ b/Fuyutsui/class/Shaman.lua @@ -29,9 +29,6 @@ Fuyutsui.ClassBlocks = { ["能量"] = { "漩涡值", }, - ["物品"] = { - [241304] = "治疗药水", - }, ["配置开关"] = { "爆发开关", "延迟", @@ -117,6 +114,9 @@ Fuyutsui.ClassBlocks = { { spellId = 191634, name = "风暴守护者" }, { spellId = 443454, name = "先祖迅捷" }, }, + items = { + [241304] = { name = "治疗药水", isEquipped = false }, + }, }, [2] = { states = { diff --git a/Fuyutsui/class/Warlock.lua b/Fuyutsui/class/Warlock.lua index a713e9ef..db625132 100644 --- a/Fuyutsui/class/Warlock.lua +++ b/Fuyutsui/class/Warlock.lua @@ -102,10 +102,6 @@ Fuyutsui.ClassBlocks = { "法力值", "灵魂碎片", }, - ["物品"] = { - [5512] = "治疗石", - [241304] = "治疗药水", - }, ["目标"] = { "类型", "施法(倒计时)", @@ -156,6 +152,10 @@ Fuyutsui.ClassBlocks = { { spellId = 388215, name = "吞噬魔法" }, { spellId = 30146, name = "召唤恶魔卫士" }, }, + items = { + [5512] = { name = "治疗石", isEquipped = false }, + [241304] = { name = "治疗药水", isEquipped = false }, + }, }, [3] = { states = { diff --git a/Fuyutsui/class/Warrior.lua b/Fuyutsui/class/Warrior.lua index 70b48716..8efae081 100644 --- a/Fuyutsui/class/Warrior.lua +++ b/Fuyutsui/class/Warrior.lua @@ -26,9 +26,6 @@ Fuyutsui.ClassBlocks = { ["能量"] = { "怒气值", }, - ["物品"] = { - [241288] = "鲁莽药水", - }, ["配置开关"] = { "爆发开关", "输出模式", @@ -125,6 +122,9 @@ Fuyutsui.ClassBlocks = { { spellId = 260708, name = "横扫攻击" }, { spellId = 228920, name = "破坏者" }, }, + items = { + [241288] = { name = "鲁莽药水", isEquipped = false }, + }, }, [2] = { states = { diff --git a/Fuyutsui/core/curves.lua b/Fuyutsui/core/curves.lua index 7d79cedd..c4859dc5 100644 --- a/Fuyutsui/core/curves.lua +++ b/Fuyutsui/core/curves.lua @@ -53,3 +53,4 @@ Fuyutsui.groupHealthCurves = { } Fuyutsui.curve255 = Fuyutsui:CreateColorCurve(255, 255) Fuyutsui.castCurve = Fuyutsui:CreateColorCurve(25.5, 255) +Fuyutsui.curveMs = Fuyutsui:CreateColorCurve(0.255, 255) diff --git a/Fuyutsui/core/events.lua b/Fuyutsui/core/events.lua index 6aa62345..3bfbf4ca 100644 --- a/Fuyutsui/core/events.lua +++ b/Fuyutsui/core/events.lua @@ -528,6 +528,7 @@ function Fuyutsui:OnUpdate(elapsed) end RunUpdateSafely(self, "RefreshPlayerCastStateBlocks") + RunUpdateSafely(self, "UpdateStateBlock", "状态", "公共冷却") RunUpdateSafely(self, "RefreshUnitCastStateBlocks", "target") RunUpdateSafely(self, "RefreshUnitCastStateBlocks", "focus") RunUpdateSafely(self, "RefreshUnitCastStateBlocks", "mouseover") diff --git a/Fuyutsui/core/spells.lua b/Fuyutsui/core/spells.lua index 21aac72d..d1756e34 100644 --- a/Fuyutsui/core/spells.lua +++ b/Fuyutsui/core/spells.lua @@ -273,9 +273,15 @@ function Fuyutsui:UpdateSpellCooldown() end end -function Fuyutsui:GetItemRemainingTime(itemID) - local itemCount = itemID and C_Item.GetItemCount(itemID) - if not itemCount or itemCount <= 0 then +function Fuyutsui:GetItemRemainingTime(itemID, isEquipped) + local itemExists + if isEquipped then + itemExists = itemID and C_Item.IsEquippedItem(itemID) + else + local itemCount = itemID and C_Item.GetItemCount(itemID) + itemExists = itemCount and itemCount > 0 + end + if not itemExists then return 255 end local startTimeSeconds, durationSeconds, enableCooldownTimer = C_Item.GetItemCooldown(itemID) @@ -295,6 +301,6 @@ function Fuyutsui:UpdateItemCooldown() local items = self.blocks and self.blocks.items if not items then return end for itemID, info in pairs(items) do - self:CreateTexture(info.index, self:GetItemRemainingTime(itemID) / 255) + self:CreateTexture(info.index, self:GetItemRemainingTime(itemID, info.isEquipped) / 255) end end diff --git a/Fuyutsui/core/stateblocks.lua b/Fuyutsui/core/stateblocks.lua index 7d22527e..5d646a5b 100644 --- a/Fuyutsui/core/stateblocks.lua +++ b/Fuyutsui/core/stateblocks.lua @@ -84,7 +84,6 @@ end local bareKeyCategories = { ["状态"] = true, ["能量"] = true, - ["物品"] = true, ["配置开关"] = true, } @@ -98,6 +97,15 @@ local function GetConfigPixel(self, key) return c and (c[key] / 255) or 0 end +local function GetSpellCooldownPixel(spellID, curve) + local cooldown = C_Spell.GetSpellCooldownDuration(spellID) + if not cooldown then return 0 end + local color = cooldown:EvaluateRemainingDuration(curve) + ---@diagnostic disable-next-line: param-type-mismatch + local _, _, b = color:GetRGB() + return b +end + -- stateBlockGetters[分类][名称] local stateBlockGetters = { ["状态"] = { @@ -130,6 +138,7 @@ local stateBlockGetters = { ["天启骑士数量"] = function() return state.knightCount or 0 end, ["自律"] = function() return state.forbearance or 0 end, ["上个技能"] = function() return state.PreviousSkill or 0 end, + ["公共冷却"] = function(self) return GetSpellCooldownPixel(61304, self.curveMs) end, ["爆发开关"] = function(self) return GetConfigPixel(self, "cooldowns") end, ["AOE开关"] = function(self) return GetConfigPixel(self, "aoeMode") end, @@ -197,7 +206,6 @@ local stateBlockGetters = { ["符文"] = function() return GetRunePixel() end, ["增压层数"] = function() return state.chargedComboPoints or 0 end, }, - ["物品"] = {}, ["配置开关"] = { ["爆发开关"] = function(self) return GetConfigPixel(self, "cooldowns") end, ["AOE开关"] = function(self) return GetConfigPixel(self, "aoeMode") end, @@ -310,7 +318,7 @@ function Fuyutsui:UpdateStateBlock(category, name) end end ---- 同一名称可能落在 状态 / 能量 / 物品 / 配置开关;无对应索引时会直接跳过 +--- 同一名称可能落在 状态 / 能量 / 配置开关;无对应索引时会直接跳过 function Fuyutsui:UpdateBareStateBlock(name, categories) for i = 1, #categories do self:UpdateStateBlock(categories[i], name) diff --git a/Fuyutsui/main.lua b/Fuyutsui/main.lua index 0753264f..4d76b537 100644 --- a/Fuyutsui/main.lua +++ b/Fuyutsui/main.lua @@ -53,71 +53,33 @@ function Fuyutsui:LoadPlayerBlocks(specIndex) local index = 1 - -- states 支持分类表:状态/能量/物品/配置开关/目标/焦点/鼠标/宠物/首领1-5 + -- states 支持分类表:状态/能量/配置开关/目标/焦点/鼠标/宠物/首领1-5 -- blocks.state 键:基础分类用名称本身;单位分类用 分类..名称(如 目标生命值) if type(t.states) == "table" then local stateCategoryOrder = { - "状态", "能量", "物品", "配置开关", "目标", "焦点", "鼠标", "宠物", + "状态", "能量", "配置开关", "目标", "焦点", "鼠标", "宠物", "首领1", "首领2", "首领3", "首领4", "首领5", } local bareKeyCategories = { ["状态"] = true, ["能量"] = true, - ["物品"] = true, ["配置开关"] = true, } - local nested = t.states["状态"] or t.states["能量"] or t.states["物品"] + local nested = t.states["状态"] or t.states["能量"] or t.states["配置开关"] or t.states["目标"] or t.states["焦点"] or t.states["鼠标"] or t.states["宠物"] or t.states["首领1"] or t.states["首领2"] or t.states["首领3"] or t.states["首领4"] or t.states["首领5"] if nested then - local legacyItemIDs = { - ["治疗药水"] = 241304, - ["魔法药水"] = 241301, - ["治疗石"] = 5512, - ["鲁莽药水"] = 241288, - ["圣光潜力"] = 241308, - } for _, category in ipairs(stateCategoryOrder) do local list = t.states[category] if type(list) == "table" then - if category == "物品" then - local itemEntries = {} - local seenItemIDs = {} - local legacyItemCount = #list - for itemID, name in pairs(list) do - if type(itemID) == "number" and itemID > legacyItemCount and itemID % 1 == 0 - and type(name) == "string" and name ~= "" then - itemEntries[#itemEntries + 1] = { itemID = itemID, name = name } - seenItemIDs[itemID] = true - end - end - for _, name in ipairs(list) do - local itemID = legacyItemIDs[name] - if itemID and not seenItemIDs[itemID] then - itemEntries[#itemEntries + 1] = { itemID = itemID, name = name } - seenItemIDs[itemID] = true - elseif not itemID then - print("LoadPlayerBlocks: 旧物品“" .. tostring(name) .. "”缺少 itemId,已跳过") - end - end - table.sort(itemEntries, function(left, right) - return left.itemID < right.itemID - end) - for _, item in ipairs(itemEntries) do - blocks.state[item.name] = index - blocks.items[item.itemID] = { index = index, name = item.name } + for _, name in ipairs(list) do + if name then + local key = bareKeyCategories[category] and name or (category .. name) + blocks.state[key] = index index = index + 1 end - else - for _, name in ipairs(list) do - if name then - local key = bareKeyCategories[category] and name or (category .. name) - blocks.state[key] = index - index = index + 1 - end - end end end end @@ -213,6 +175,37 @@ function Fuyutsui:LoadPlayerBlocks(specIndex) end end + if type(t.items) == "table" then + local itemIDs = {} + for itemID, info in pairs(t.items) do + if type(itemID) == "number" and itemID > 0 and itemID % 1 == 0 + and type(info) == "table" and type(info.name) == "string" and info.name ~= "" then + itemIDs[#itemIDs + 1] = itemID + else + print("LoadPlayerBlocks: item 缺少有效 itemId/name,已跳过") + end + end + table.sort(itemIDs) + local seenNames = {} + for _, itemID in ipairs(itemIDs) do + local info = t.items[itemID] + if seenNames[info.name] then + print("LoadPlayerBlocks: item 名称“" .. info.name .. "”重复,已跳过") + elseif blocks.state[info.name] then + print("LoadPlayerBlocks: item 名称“" .. info.name .. "”与状态字段重复,已跳过") + else + seenNames[info.name] = true + blocks.state[info.name] = index + blocks.items[itemID] = { + index = index, + name = info.name, + isEquipped = info.isEquipped == true, + } + index = index + 1 + end + end + end + if type(t.group) == "table" then blocks.groups = { start = index, diff --git a/Infrastructure/ClassBlocksStore.cs b/Infrastructure/ClassBlocksStore.cs index af1ece4b..51a25981 100644 --- a/Infrastructure/ClassBlocksStore.cs +++ b/Infrastructure/ClassBlocksStore.cs @@ -6,7 +6,7 @@ using static Shigure.LuaLiteParser; namespace Shigure; /// -/// 读写 Fuyutsui class/*.lua 中的 ClassBlocks(states/auras/spells/group), +/// 读写 Fuyutsui class/*.lua 中的 ClassBlocks(states/auras/spells/items/group), /// 同时读写 spellsList;保存时替换 ClassBlocks 表字面量,并原位更新 spellsList 中已编辑的条目。 /// internal static class ClassBlocksStore @@ -17,7 +17,6 @@ internal static class ClassBlocksStore [ ClassStateCatalog.CategoryState, ClassStateCatalog.CategoryResource, - ClassStateCatalog.CategoryItem, ClassStateCatalog.CategoryConfig, ClassStateCatalog.CategoryTarget, ClassStateCatalog.CategoryFocus, @@ -60,7 +59,6 @@ internal static class ClassBlocksStore { [ClassStateCatalog.CategoryState] = new List(), [ClassStateCatalog.CategoryResource] = new List(), - [ClassStateCatalog.CategoryItem] = new List(), [ClassStateCatalog.CategoryConfig] = new List(), [ClassStateCatalog.CategoryTarget] = new List(), [ClassStateCatalog.CategoryFocus] = new List(), @@ -238,6 +236,7 @@ internal static class ClassBlocksStore { public long? ItemId { get; set; } public string Name { get; set; } = string.Empty; + public bool IsEquipped { get; set; } } private static string UpdateSpellsListEntries( @@ -365,6 +364,7 @@ internal static class ClassBlocksStore isModern = spec.GetTable("states") is not null || spec.GetTable("auras") is not null || spec.GetTable("spells") is not null + || spec.GetTable("items") is not null || spec.GetTable("group") is not null; if (!isModern) @@ -385,12 +385,6 @@ internal static class ClassBlocksStore continue; } - if (string.Equals(category, ClassStateCatalog.CategoryItem, StringComparison.Ordinal)) - { - AppendItems(list, result.Items); - continue; - } - var target = result.CategorizedStates[category]; foreach (var item in list.IPairs()) { @@ -467,6 +461,11 @@ internal static class ClassBlocksStore } } + if (spec.GetTable("items") is { } items) + { + AppendItems(items, result.Items); + } + if (spec.GetTable("group") is { } group) { var groupBlocks = new GroupBlocks @@ -521,34 +520,30 @@ internal static class ClassBlocksStore private static void AppendItems(TableValue list, List target) { - var arrayValues = list.IPairs().ToList(); var seenIds = new HashSet(); - foreach (var item in arrayValues) - { - if (item is not StringValue nameValue || string.IsNullOrWhiteSpace(nameValue.Value)) - { - continue; - } - - var name = nameValue.Value.Trim(); - long? itemId = ClassStateCatalog.TryGetLegacyItemId(name, out var knownId) ? knownId : null; - if (itemId is null || seenIds.Add(itemId.Value)) - { - target.Add(new ItemEntry { ItemId = itemId, Name = name }); - } - } - - var arrayCount = arrayValues.Count; foreach (var (key, value) in list.Entries) { - if (key is not long itemId || itemId <= arrayCount - || value is not StringValue nameValue || string.IsNullOrWhiteSpace(nameValue.Value) + if (key is not long itemId + || itemId <= 0 + || value is not TableValue itemTable || !seenIds.Add(itemId)) { continue; } - target.Add(new ItemEntry { ItemId = itemId, Name = nameValue.Value.Trim() }); + var name = itemTable.GetString("name")?.Trim(); + if (string.IsNullOrWhiteSpace(name)) + { + seenIds.Remove(itemId); + continue; + } + + target.Add(new ItemEntry + { + ItemId = itemId, + Name = name, + IsEquipped = itemTable.GetBool("isEquipped") == true + }); } target.Sort((left, right) => CompareItemIds(left.ItemId, right.ItemId)); @@ -627,29 +622,6 @@ internal static class ClassBlocksStore { foreach (var category in StateCategories) { - if (string.Equals(category, ClassStateCatalog.CategoryItem, StringComparison.Ordinal)) - { - if (spec.Items.Count == 0) - { - continue; - } - - sb.Append(indent).Append(" [\"").Append(Escape(category)).AppendLine("\"] = {"); - foreach (var item in spec.Items.OrderBy(item => item.ItemId)) - { - if (item.ItemId is not { } itemId || itemId <= 0 || string.IsNullOrWhiteSpace(item.Name)) - { - throw new InvalidOperationException("物品配置包含无效的 itemId 或空名称。"); - } - - sb.Append(indent).Append(" [").Append(itemId).Append("] = \"") - .Append(Escape(item.Name)).AppendLine("\","); - } - - sb.Append(indent).AppendLine(" },"); - continue; - } - var list = spec.CategorizedStates.GetValueOrDefault(category); if (list is null || list.Count == 0) { @@ -733,6 +705,25 @@ internal static class ClassBlocksStore sb.Append(indent).AppendLine("},"); } + // items + if (spec.Items.Count > 0) + { + sb.Append(indent).AppendLine("items = {"); + foreach (var item in spec.Items.OrderBy(item => item.ItemId)) + { + if (item.ItemId is not { } itemId || itemId <= 0 || string.IsNullOrWhiteSpace(item.Name)) + { + throw new InvalidOperationException("物品配置包含无效的 itemId 或空名称。"); + } + + sb.Append(indent).Append(" [").Append(itemId).Append("] = { name = \"") + .Append(Escape(item.Name)).Append("\", isEquipped = ") + .Append(item.IsEquipped ? "true" : "false").AppendLine(" },"); + } + + sb.Append(indent).AppendLine("},"); + } + // group if (spec.Group is { } group) { @@ -782,22 +773,24 @@ internal static class ClassBlocksStore return; } - if (!spec.NestedStates) - { - throw new InvalidOperationException("平面 states 无法保存 itemId 物品配置。"); - } - var ids = new HashSet(); var names = new HashSet(StringComparer.Ordinal); var bareNames = new HashSet(StringComparer.Ordinal); - foreach (var category in new[] - { - ClassStateCatalog.CategoryState, - ClassStateCatalog.CategoryResource, - ClassStateCatalog.CategoryConfig - }) + if (spec.NestedStates) { - bareNames.UnionWith(spec.CategorizedStates.GetValueOrDefault(category) ?? []); + foreach (var category in new[] + { + ClassStateCatalog.CategoryState, + ClassStateCatalog.CategoryResource, + ClassStateCatalog.CategoryConfig + }) + { + bareNames.UnionWith(spec.CategorizedStates.GetValueOrDefault(category) ?? []); + } + } + else + { + bareNames.UnionWith(spec.FlatStates); } foreach (var item in spec.Items) diff --git a/Infrastructure/ClassStateCatalog.cs b/Infrastructure/ClassStateCatalog.cs index 99470177..f47fb2e3 100644 --- a/Infrastructure/ClassStateCatalog.cs +++ b/Infrastructure/ClassStateCatalog.cs @@ -35,7 +35,6 @@ internal static class ClassStateCatalog [ CategoryState, CategoryResource, - CategoryItem, CategoryConfig, CategoryTarget, CategoryFocus, @@ -57,16 +56,12 @@ internal static class ClassStateCatalog "首领战", "难度", "英雄天赋", "施法目标", "施法技能", "敌人数量", "敌人数-无仇恨", "敌人数-有仇恨", "施法(正计时)", "施法(倒计时)", "引导", "蓄力", "蓄力层数", - "酒池", "符文", "姿态", "神圣军备", "自律", "上个技能", "英勇打击", "吸血鬼打击", "收割者战刃", + "酒池", "符文", "姿态", "神圣军备", "自律", "上个技能", "公共冷却", "英勇打击", "吸血鬼打击", "收割者战刃", ]), (CategoryConfig, [ "爆发开关", "AOE开关", "输出模式", "爆发药水开关", "延迟" ]), - (CategoryItem, - [ - "治疗药水", "魔法药水", "治疗石", "鲁莽药水", "圣光潜力" - ]), (CategoryResource, [ "法力值", "怒气值", "集中值", "能量值", "符文", "符文能量", diff --git a/Infrastructure/FuyutsuiConfigConverter.cs b/Infrastructure/FuyutsuiConfigConverter.cs index d2eb62d8..39ccf0c9 100644 --- a/Infrastructure/FuyutsuiConfigConverter.cs +++ b/Infrastructure/FuyutsuiConfigConverter.cs @@ -30,7 +30,6 @@ internal static class FuyutsuiConfigConverter [ ClassStateCatalog.CategoryState, ClassStateCatalog.CategoryResource, - ClassStateCatalog.CategoryItem, ClassStateCatalog.CategoryConfig, ClassStateCatalog.CategoryTarget, ClassStateCatalog.CategoryFocus, @@ -255,27 +254,6 @@ internal static class FuyutsuiConfigConverter continue; } - if (string.Equals(category, ClassStateCatalog.CategoryItem, StringComparison.Ordinal)) - { - foreach (var item in ReadItems(list, warnings, label)) - { - if (result.ContainsKey(item.Name)) - { - warnings.Add($"{label}: 物品名称“{item.Name}”与已有状态字段重复,已跳过该物品字段"); - } - else - { - var field = Field(index, "int", category); - field["itemId"] = item.ItemId; - result[item.Name] = field; - } - - index++; - } - - continue; - } - foreach (var item in list.IPairs()) { if (item is not StringValue nameValue || string.IsNullOrWhiteSpace(nameValue.Value)) @@ -432,6 +410,25 @@ internal static class FuyutsuiConfigConverter } } + if (spec.GetTable("items") is { } items) + { + foreach (var item in ReadItems(items, warnings, label)) + { + if (result.ContainsKey(item.Name)) + { + warnings.Add($"{label}: 物品名称“{item.Name}”与已有状态字段重复,已跳过该物品字段"); + } + else + { + var field = Field(index, "int", ClassStateCatalog.CategoryItem); + field["itemId"] = item.ItemId; + field["isEquipped"] = item.IsEquipped; + result[item.Name] = field; + index++; + } + } + } + if (aurasObject.Count > 0) { result["auras"] = aurasObject; @@ -504,45 +501,35 @@ internal static class FuyutsuiConfigConverter return (result, warnings); } - private static List<(long ItemId, string Name)> ReadItems( + private static List<(long ItemId, string Name, bool IsEquipped)> ReadItems( TableValue list, List warnings, string label) { - var result = new List<(long ItemId, string Name)>(); + var result = new List<(long ItemId, string Name, bool IsEquipped)>(); var seenIds = new HashSet(); - var arrayValues = list.IPairs().ToList(); - foreach (var item in arrayValues) - { - if (item is not StringValue nameValue || string.IsNullOrWhiteSpace(nameValue.Value)) - { - continue; - } - - var name = nameValue.Value.Trim(); - if (!ClassStateCatalog.TryGetLegacyItemId(name, out var itemId)) - { - warnings.Add($"{label}: 旧物品“{name}”缺少 itemId,已跳过"); - continue; - } - - if (seenIds.Add(itemId)) - { - result.Add((itemId, name)); - } - } - - var arrayCount = arrayValues.Count; foreach (var (key, value) in list.Entries) { - if (key is not long itemId || itemId <= arrayCount - || value is not StringValue nameValue || string.IsNullOrWhiteSpace(nameValue.Value) + if (key is not long itemId + || itemId <= 0 + || value is not TableValue itemTable || !seenIds.Add(itemId)) { continue; } - result.Add((itemId, nameValue.Value.Trim())); + var name = itemTable.GetString("name")?.Trim(); + if (string.IsNullOrWhiteSpace(name)) + { + seenIds.Remove(itemId); + warnings.Add($"{label}: itemId {itemId} 缺少名称,已跳过"); + continue; + } + + result.Add(( + itemId, + name, + itemTable.GetBool("isEquipped") == true)); } result.Sort((left, right) => left.ItemId.CompareTo(right.ItemId)); diff --git a/Infrastructure/ModuleDependencyService.cs b/Infrastructure/ModuleDependencyService.cs index 5dabdcdc..5e1be2e9 100644 --- a/Infrastructure/ModuleDependencyService.cs +++ b/Infrastructure/ModuleDependencyService.cs @@ -7,7 +7,6 @@ internal sealed class ModuleDependencyService [ ClassStateCatalog.CategoryState, ClassStateCatalog.CategoryResource, - ClassStateCatalog.CategoryItem, ClassStateCatalog.CategoryConfig, ClassStateCatalog.CategoryTarget, ClassStateCatalog.CategoryFocus, @@ -328,15 +327,22 @@ internal sealed class ModuleDependencyService var items = snapshot.Config.Spec.Items ?? []; var itemReservedNames = new HashSet(StringComparer.Ordinal); - foreach (var category in new[] - { - ClassStateCatalog.CategoryState, - ClassStateCatalog.CategoryResource, - ClassStateCatalog.CategoryConfig - }) + if (snapshot.Config.Spec.NestedStates) { - itemReservedNames.UnionWith( - snapshot.Config.Spec.CategorizedStates.GetValueOrDefault(category) ?? []); + foreach (var category in new[] + { + ClassStateCatalog.CategoryState, + ClassStateCatalog.CategoryResource, + ClassStateCatalog.CategoryConfig + }) + { + itemReservedNames.UnionWith( + snapshot.Config.Spec.CategorizedStates.GetValueOrDefault(category) ?? []); + } + } + else + { + itemReservedNames.UnionWith(snapshot.Config.Spec.FlatStates ?? []); } if (items.Any(item => item.ItemId <= 0 || string.IsNullOrWhiteSpace(item.Name)) || items.Select(item => item.ItemId).Distinct().Count() != items.Count @@ -368,10 +374,12 @@ internal sealed class ModuleDependencyService if (ClassStateCatalog.TryGetLegacyItemId(name, out var itemId) && spec.Items.All(item => item.ItemId != itemId)) { - spec.Items.Add(new ModuleItemSnapshot { ItemId = itemId, Name = name }); + spec.Items.Add(new ModuleItemSnapshot { ItemId = itemId, Name = name, IsEquipped = false }); legacyNames.Remove(name); } } + + spec.CategorizedStates.Remove(ClassStateCatalog.CategoryItem); } snapshot.SchemaVersion = ModuleDependencySnapshot.CurrentSchemaVersion; @@ -459,7 +467,12 @@ internal sealed class ModuleDependencyService StringComparer.Ordinal), Items = spec.Items .Where(item => item.ItemId is > 0 && !string.IsNullOrWhiteSpace(item.Name)) - .Select(item => new ModuleItemSnapshot { ItemId = item.ItemId!.Value, Name = item.Name }) + .Select(item => new ModuleItemSnapshot + { + ItemId = item.ItemId!.Value, + Name = item.Name, + IsEquipped = item.IsEquipped + }) .ToList(), PlayerAuras = spec.PlayerAuras.Select(CaptureAura).ToList(), TargetHarmfulAuras = spec.TargetHarmfulAuras.Select(CaptureAura).ToList(), @@ -517,10 +530,6 @@ internal sealed class ModuleDependencyService { foreach (var category in StateCategories) { - if (string.Equals(category, ClassStateCatalog.CategoryItem, StringComparison.Ordinal)) - { - continue; - } MergeStrings(local.CategorizedStates[category], incoming.CategorizedStates.GetValueOrDefault(category) ?? [], counters); } } @@ -535,10 +544,6 @@ internal sealed class ModuleDependencyService { foreach (var category in StateCategories) { - if (string.Equals(category, ClassStateCatalog.CategoryItem, StringComparison.Ordinal)) - { - continue; - } MergeStrings(local.FlatStates, incoming.CategorizedStates.GetValueOrDefault(category) ?? [], counters); } } @@ -549,9 +554,9 @@ internal sealed class ModuleDependencyService } + var reservedNames = new HashSet(StringComparer.Ordinal); if (local.NestedStates) { - var reservedNames = new HashSet(StringComparer.Ordinal); foreach (var category in new[] { ClassStateCatalog.CategoryState, @@ -561,12 +566,12 @@ internal sealed class ModuleDependencyService { reservedNames.UnionWith(local.CategorizedStates.GetValueOrDefault(category) ?? []); } - MergeItems(local.Items, incoming.Items ?? [], reservedNames, counters); } - else if ((incoming.Items ?? []).Count > 0) + else { - counters.Conflicts.Add("本地配置仍使用平面 states,无法导入 itemId 物品配置。"); + reservedNames.UnionWith(local.FlatStates); } + MergeItems(local.Items, incoming.Items ?? [], reservedNames, counters); MergeAuras(local.PlayerAuras, incoming.PlayerAuras, "玩家光环", counters); MergeAuras(local.TargetHarmfulAuras, incoming.TargetHarmfulAuras, "目标减益", counters); @@ -810,6 +815,11 @@ internal sealed class ModuleDependencyService counters.Conflicts.Add( $"物品 itemId {item.ItemId} 的名称不同:本地“{byId.Name}”、模块“{item.Name}”,已保留本地。"); } + else if (byId.IsEquipped != item.IsEquipped) + { + counters.Conflicts.Add( + $"物品“{item.Name}”的 isEquipped 不同:本地 {byId.IsEquipped}、模块 {item.IsEquipped},已保留本地。"); + } continue; } @@ -827,7 +837,12 @@ internal sealed class ModuleDependencyService continue; } - local.Add(new ClassBlocksStore.ItemEntry { ItemId = item.ItemId, Name = item.Name }); + local.Add(new ClassBlocksStore.ItemEntry + { + ItemId = item.ItemId, + Name = item.Name, + IsEquipped = item.IsEquipped + }); counters.ConfigAdded++; } diff --git a/Modules/ModuleDependencies.cs b/Modules/ModuleDependencies.cs index 1a963f01..6f333a5f 100644 --- a/Modules/ModuleDependencies.cs +++ b/Modules/ModuleDependencies.cs @@ -73,6 +73,7 @@ public sealed class ModuleItemSnapshot { public long ItemId { get; set; } public string Name { get; set; } = string.Empty; + public bool IsEquipped { get; set; } public ModuleItemSnapshot Clone() => (ModuleItemSnapshot)MemberwiseClone(); } diff --git a/Obsidian/00-导航/01-Shigure-AI阅读顺序与术语.md b/Obsidian/00-导航/01-Shigure-AI阅读顺序与术语.md index 2dab3c6e..ad012cbc 100644 --- a/Obsidian/00-导航/01-Shigure-AI阅读顺序与术语.md +++ b/Obsidian/00-导航/01-Shigure-AI阅读顺序与术语.md @@ -56,7 +56,7 @@ verified_at: "2026-08-09" | 术语 | 当前含义 | 常见误解 | |---|---|---| -| `Fuyutsui.ClassBlocks` | `class/*.lua` 按专精声明的 `states/auras/spells/group` 数据 | 不是运行时最终索引,也不是 Shigure JSON | +| `Fuyutsui.ClassBlocks` | `class/*.lua` 按专精声明的 `states/auras/spells/items/group` 数据 | 不是运行时最终索引,也不是 Shigure JSON | | `Fuyutsui.blocks` | `LoadPlayerBlocks` 根据当前专精生成的运行时索引映射 | 不是所有职业的静态配置 | | 主色块行 | 屏幕顶部最多 510 个 RGB 编码格 | 业务字段的绝对索引并非跨专精固定 | | CountBars | 与主色块索引独立的横向计数条,用于充能、施法次数和光环层数 | 不是主色块的第二段索引 | @@ -91,7 +91,7 @@ verified_at: "2026-08-09" | 输入关键词或现象 | 输出层 | 阅读顺序 | |---|---|---| | `510`、RGB、错位、CountBars、治疗吸收 | 像素传输 | [[40-跨项目/01-Shigure-像素生产消费契约|像素契约]] → 生产端/消费端功能页 | -| `states/auras/spells/group`、职业 Lua、step | 配置生成 | [[40-跨项目/02-Shigure-ClassBlocks到config同步契约|ClassBlocks 同步契约]] → [[50-参考资料/TEXTURE_LAYOUT_zh-CN|索引布局]] | +| `states/auras/spells/items/group`、职业 Lua、step | 配置生成 | [[40-跨项目/02-Shigure-ClassBlocks到config同步契约|ClassBlocks 同步契约]] → [[50-参考资料/TEXTURE_LAYOUT_zh-CN|索引布局]] | | 条件不命中、动态单位、公式 | 规则决策 | [[30-Shigure/06-Shigure-规则条件与特殊动作|规则条件]] → [[30-Shigure/07-Shigure-动态单位数量与公式|动态字段]] | | 技能有映射但不发键、单位编号不对 | 热键执行 | [[40-跨项目/03-Shigure-ClassMacros到keymap与按键契约|宏到热键契约]] → [[30-Shigure/08-Shigure-Keymap解析与按键发送|Keymap 与发送]] | | 切专精后字段错、编辑器保存后不同步 | 生成/重载 | ClassBlocks 或 ClassMacros 契约 → [[30-Shigure/09-Shigure-Fuyutsui配置宏编辑与同步|Lua 编辑与同步]] | diff --git a/Obsidian/10-系统/00-Shigure-双项目系统全景.md b/Obsidian/10-系统/00-Shigure-双项目系统全景.md index f3263058..99879e1e 100644 --- a/Obsidian/10-系统/00-Shigure-双项目系统全景.md +++ b/Obsidian/10-系统/00-Shigure-双项目系统全景.md @@ -100,7 +100,7 @@ verified_at: "2026-08-10" 1. `Fuyutsui.toc` 按固定顺序加载核心、职业声明、领域模块和 `main.lua`。 2. `ADDON_LOADED` / `PLAYER_LOGIN` 触发 `OnInitialize` 与 `OnEnable`;事件和 `OnUpdate` 更新玩家、目标、法术、队伍等状态。 -3. `LoadPlayerBlocks` 把当前专精 `states → auras → spells → group` 分配到连续主色块索引;`core/block.lua` 将值画到屏幕。 +3. `LoadPlayerBlocks` 把当前专精 `states → auras → spells → items → group` 分配到连续主色块索引;`core/block.lua` 将值画到屏幕。 4. `PixelScanner.ScanScreenData` 使用 `CopyFromScreen` 采集顶部行、CountBars 标记行和治疗吸收网格。 5. `StateBuilder.Build` 先从主色块第 2、3 格识别职业和专精,再由 `ConfigService.BuildStateConfig` 合并配置并构建 `GameState`。 6. `LogicRegistry.Evaluate` 优先执行选定或最匹配 module;没有模块时才回退到 C# 职业逻辑或默认逻辑。 diff --git a/Obsidian/20-Fuyutsui/03-Fuyutsui-状态块与编码入口.md b/Obsidian/20-Fuyutsui/03-Fuyutsui-状态块与编码入口.md index f0823cba..16fa4e2b 100644 --- a/Obsidian/20-Fuyutsui/03-Fuyutsui-状态块与编码入口.md +++ b/Obsidian/20-Fuyutsui/03-Fuyutsui-状态块与编码入口.md @@ -53,7 +53,7 @@ verified_at: 2026-08-09 | 输入 | 处理 | 输出 | |---|---|---| -| 当前专精的 `ClassBlocks` | 依次展开状态、光环、法术和队伍定义 | `Fuyutsui.blocks` 索引表 | +| 当前专精的 `ClassBlocks` | 依次展开状态、光环、法术、物品和队伍定义 | `Fuyutsui.blocks` 索引表 | | 状态 getter 返回的归一化数值 | `CreateTexture(index, b)` | 顶部主状态行 RGB 像素 | | `castCount`、`maxCharge`、光环 `maxApps` | 自动预留水平单元 | `FuyutsuiCountBars` | | 队伍治疗吸收百分比 | 按成员槽位绘制锚点、100 单元条身和终点 | `FuyutsuiHealAbsorbBars` | @@ -64,7 +64,7 @@ verified_at: 2026-08-09 ```text ClassBlocks[spec] -> LoadPlayerBlocks(spec) - -> blocks.state / blocks.auras / blocks.spells / blocks.groups + -> blocks.state / blocks.auras / blocks.spells / blocks.items / blocks.groups -> 释放并重建 AuraContainer -> UpdatePlayerBlocks() 与各事件处理器 -> UpdateStateBlock(category, name) @@ -93,13 +93,14 @@ ClassBlocks[spec] 从索引 4 开始严格按以下顺序追加: -1. 状态分类:`状态`、`能量`、`物品`、`配置开关`、`目标`、`焦点`。 +1. 状态分类:`状态`、`能量`、`配置开关`、`目标`、`焦点`、`鼠标`、`宠物`、`首领1`~`首领5`。 2. 玩家光环。 3. 目标有害、目标增益、焦点有害、焦点增益光环。 4. 法术冷却;普通法术占 1 槽,带 `charge=true` 的法术连续占冷却与充能 2 槽。 -5. 队伍块只记录此时的 `start`;成员 `n` 的字段偏移为 `start + (n-1)*group.num + offset`。 +5. 顶层 `items` 按 `itemId` 升序占位,每项同时进入 `blocks.state` 与 `blocks.items`。 +6. 队伍块只记录此时的 `start`;成员 `n` 的字段偏移为 `start + (n-1)*group.num + offset`。 -前四个状态分类使用裸名称作为 `blocks.state` 键;目标和焦点使用 `分类 .. 名称`。这使同一裸名称在前四类之间发生覆盖,而不是获得两个独立可寻址键。 +前三个状态分类使用裸名称作为 `blocks.state` 键;单位分类使用 `分类 .. 名称`。物品名称同样是裸键,因此不能与已有裸状态重名。 ## 510 槽 RGB 契约 @@ -142,7 +143,7 @@ Lua 传给 `SetColorTexture` 时再除以 255。因此第 255 槽是 `(0,255,B)` - Lua 与 C# 必须使用完全相同的状态分类顺序、光环顺序和法术占槽规则。 - 主行每个有效索引必须在 1..510;超界时 `createTextureByIndex()` 返回 `nil`,不会自动扩容。 - `blocks.spells` 以 SpellID 为键;同一专精内 SpellID 必须唯一,否则后项覆盖前项索引。 -- 裸状态键在 `状态/能量/物品/配置开关` 之间必须唯一;目标和焦点因带前缀可以同名。 +- 裸状态键在 `状态/能量/配置开关/items` 之间必须唯一;单位分类因带前缀可以同名。 - 横向条的预留顺序必须与 C# 配置转换和扫描顺序一致。 - 队伍容量必须同时满足 `group.start + memberCount*group.num - 1 <= 510` 与消费端支持的成员数。目前 Shigure 构建固定 30 人,并不覆盖 WoW 团队最多 40 人。 - 旧审计记录只说明历史问题;判断当前契约必须回到上述源文件与当前生成配置。 diff --git a/Obsidian/20-Fuyutsui/06-Fuyutsui-法术与物品冷却.md b/Obsidian/20-Fuyutsui/06-Fuyutsui-法术与物品冷却.md index c5e3db46..f3876b77 100644 --- a/Obsidian/20-Fuyutsui/06-Fuyutsui-法术与物品冷却.md +++ b/Obsidian/20-Fuyutsui/06-Fuyutsui-法术与物品冷却.md @@ -66,6 +66,7 @@ verified_at: 2026-08-19 | 输入 | 处理 | 输出 | |---|---|---| | `ClassBlocks.spells` | 顺序分配 1 或 2 个主行槽位 | 冷却、充能恢复像素 | +| `ClassBlocks.items` | 按 itemId 升序分配主行槽位 | 物品冷却与可用性像素 | | 法术书/天赋状态 | 已知法术筛选、`forcedKnown`/`inSpellBook` 例外 | 可更新集合;未知法术写 255 | | Cooldown/Charge Duration | 经 `curve255` 求剩余时间颜色 | `B=0..255` | | `castCount`、`maxCharge` | CountBars 自动布局 | 横向计数条 | @@ -131,9 +132,9 @@ verified_at: 2026-08-19 ## 物品状态 -- `GetItemCount()` 汇总治疗药水、法力药水、治疗石及若干当前版本消耗品的多个 ItemID。 -- `GetItemRemainingTime()` 返回剩余秒数;冷却不可用时返回 255,无冷却时返回 0。 -- `UpdateItemCooldown()` 通过裸状态键更新“治疗药水、魔法药水、治疗石、鲁莽药水、圣光潜力”。 +- `ClassBlocks.items[itemId]` 声明名称和 `isEquipped`,并在法术之后获得独立主行槽位。 +- `GetItemRemainingTime()` 对普通物品检查背包数量,对 `isEquipped=true` 的物品检查装备状态;不存在或不可用时返回 255,无冷却时返回 0。 +- `UpdateItemCooldown()` 遍历当前专精的 `blocks.items`,把各物品冷却直接写入已分配的索引。 ItemID 是版本敏感数据;新增同类物品必须更新聚合列表和相应 getter。 diff --git a/Obsidian/40-跨项目/00-Shigure-跨项目契约-MOC.md b/Obsidian/40-跨项目/00-Shigure-跨项目契约-MOC.md index b0668c48..c768b7e9 100644 --- a/Obsidian/40-跨项目/00-Shigure-跨项目契约-MOC.md +++ b/Obsidian/40-跨项目/00-Shigure-跨项目契约-MOC.md @@ -63,7 +63,7 @@ verified_at: "2026-08-10" | 契约 | 生产输入 | 传输载体 | 消费输出 | |---|---|---|---| | 像素 | `Fuyutsui.blocks`、状态值、光环和队伍数据 | 屏幕 RGB:主行、CountBars、吸收网格 | `RowData`、`BarData`、`HealAbsorbData` | -| ClassBlocks | `class/*.lua` 中各专精的 `states/auras/spells/group` | Lua 表 → `config/*.json` | `StateBuilder` 可使用的 `step/type/bar/group` 映射 | +| ClassBlocks | `class/*.lua` 中各专精的 `states/auras/spells/items/group` | Lua 表 → `config/*.json` | `StateBuilder` 可使用的 `step/type/bar/group` 映射 | | ClassMacros | `core/classmacros.lua` 的 dynamic/static/special 数据 | Lua 表 → `keymap/*.json` + WoW 覆盖绑定 | `(专精、单位、技能、宏条件) → hotkey` | 三条契约最终汇合到 Shigure 的决策路径:原始像素通过 config 变成 `GameState`,module 从 `GameState` 选出技能和单位,再通过 keymap 解析 hotkey。 @@ -107,7 +107,7 @@ verified_at: "2026-08-10" | 计划修改 | 必须进入 | |---|---| | RGB、像素数量、标记色、条宽高、网格行列 | [[40-跨项目/01-Shigure-像素生产消费契约|像素契约]] | -| `states/auras/spells/group` 格式、顺序、占位 | [[40-跨项目/02-Shigure-ClassBlocks到config同步契约|ClassBlocks 契约]] | +| `states/auras/spells/items/group` 格式、顺序、占位 | [[40-跨项目/02-Shigure-ClassBlocks到config同步契约|ClassBlocks 契约]] | | dynamic/static/special 规则、宏键池、单位或条件 | [[40-跨项目/03-Shigure-ClassMacros到keymap与按键契约|宏与热键契约]] | | 任意共享名称、版本、路径或生成方式 | [[40-跨项目/04-Shigure-兼容性变更检查清单|兼容性检查清单]] | diff --git a/Obsidian/40-跨项目/02-Shigure-ClassBlocks到config同步契约.md b/Obsidian/40-跨项目/02-Shigure-ClassBlocks到config同步契约.md index 93a168bc..bc81ad4d 100644 --- a/Obsidian/40-跨项目/02-Shigure-ClassBlocks到config同步契约.md +++ b/Obsidian/40-跨项目/02-Shigure-ClassBlocks到config同步契约.md @@ -48,13 +48,13 @@ verified_at: "2026-08-10" 当前主色块分配总顺序是: ```text -states → auras → spells → group +states → auras → spells → items → group ``` 其中 `states` 的现代分类顺序是: ```text -状态 → 能量 → 物品 → 配置开关 → 目标 → 焦点 +状态 → 能量 → 配置开关 → 目标 → 焦点 → 鼠标 → 宠物 → 首领1…首领5 ``` 这份契约规定转换器必须跟随当前 `LoadPlayerBlocks`,而不是跟随旧文档中的简化顺序。 @@ -80,9 +80,10 @@ states → auras → spells → group | 区域 | 主要字段 | 作用 | |---|---|---| -| `states` | 分类数组或兼容的平面数组 | 普通状态、能量、物品、开关、目标和焦点字段 | +| `states` | 分类数组或兼容的平面数组 | 普通状态、能量、开关和单位字段 | | `auras` | player、target harmful/helpful、focus harmful/helpful | 按 spell ID 创建光环像素槽,可选层数条 | | `spells` | `spellId`、charge、maxCharge、castCount 等 | 冷却、充能回充以及派生 CountBars | +| `items` | `[itemId] = { name, isEquipped }` | 背包物品或已装备物品的冷却状态 | | `group` | `num`、生命值/职责/驱散偏移、成员光环 | 从 `start` 起按成员步长布局最多 30 个单位 | 只有当前玩家职业的 Lua 文件会实际写入 `Fuyutsui.ClassBlocks`。 @@ -105,11 +106,12 @@ states → auras → spells → group ### Fuyutsui 运行时分配 1. `LoadPlayerBlocks(specIndex)` 从索引 1 开始创建新的 `blocks`。 -2. `states` 按现代分类固定顺序展开;状态/能量/物品/配置开关使用裸名称,目标和焦点使用分类前缀形成运行时 key。 +2. `states` 按现代分类固定顺序展开;状态/能量/配置开关使用裸名称,单位分类使用分类前缀形成运行时 key。 3. `auras` 依次展开 player、target harmful、target helpful、focus harmful、focus helpful。条目必须有 `spellId` 或 `spellIds`,否则被跳过并提示。 4. `spells` 按数组顺序展开:普通条目占一格;`charge=true` 占冷却和充能回充两格。`maxCharge` 与正数 `castCount` 额外生成 CountBars 定义,但不占主行新字段。 -5. 若存在 `group`,记录当前索引为 `groups.start`,成员像素按 `start + (memberIndex - 1) * num + offset` 计算。 -6. 替换 `self.blocks` 后释放旧单位、队伍及特定光环容器,后续刷新按新布局重建。 +5. `items` 按 `itemId` 升序展开,每项占一格,同时写入 `blocks.state[name]` 与 `blocks.items[itemId]`。 +6. 若存在 `group`,记录当前索引为 `groups.start`,成员像素按 `start + (memberIndex - 1) * num + offset` 计算。 +7. 替换 `self.blocks` 后释放旧单位、队伍及特定光环容器,后续刷新按新布局重建。 ### Shigure 生成与消费 diff --git a/Obsidian/40-跨项目/04-Shigure-兼容性变更检查清单.md b/Obsidian/40-跨项目/04-Shigure-兼容性变更检查清单.md index 9170b7c4..ada0a320 100644 --- a/Obsidian/40-跨项目/04-Shigure-兼容性变更检查清单.md +++ b/Obsidian/40-跨项目/04-Shigure-兼容性变更检查清单.md @@ -71,7 +71,7 @@ verified_at: "2026-08-10" | 变更 | 契约入口 | 典型影响 | |---|---|---| | 主色块数量、RGB、标记或物理布局 | [[40-跨项目/01-Shigure-像素生产消费契约|像素契约]] | `core/block.lua`、PixelScanner、StateBuilder、截图验证 | -| `states/auras/spells/group` 结构或顺序 | [[40-跨项目/02-Shigure-ClassBlocks到config同步契约|ClassBlocks 契约]] | LoadPlayerBlocks、Store、Converter、config、module 字段 | +| `states/auras/spells/items/group` 结构或顺序 | [[40-跨项目/02-Shigure-ClassBlocks到config同步契约|ClassBlocks 契约]] | LoadPlayerBlocks、Store、Converter、config、module 字段 | | 宏顺序、动态占位、热键池 | [[40-跨项目/03-Shigure-ClassMacros到keymap与按键契约|宏与热键契约]] | CreateMacro、KeymapConverter、keymap、实际绑定 | | 单位编号、宏条件、module schema | 宏与热键契约 | 版本常量、迁移、编辑器、已有 module JSON | | `GameState` 名称或类型 | ClassBlocks 契约 | config、条件字段目录、规则、动态字段、UI | diff --git a/Obsidian/50-参考资料/TEXTURE_LAYOUT_zh-CN.md b/Obsidian/50-参考资料/TEXTURE_LAYOUT_zh-CN.md index 2e2905e6..7ce3642c 100644 --- a/Obsidian/50-参考资料/TEXTURE_LAYOUT_zh-CN.md +++ b/Obsidian/50-参考资料/TEXTURE_LAYOUT_zh-CN.md @@ -1,6 +1,6 @@ --- title: "Fuyutsui 纹理排序说明" -summary: "说明 ClassBlocks 如何依次分配状态、光环、法术和队伍像素,以及辅助条如何独立布局。" +summary: "说明 ClassBlocks 如何依次分配状态、光环、法术、物品和队伍像素,以及辅助条如何独立布局。" aliases: - "纹理排序说明" tags: @@ -81,7 +81,7 @@ flowchart TB `LoadPlayerBlocks` 从索引 **1** 起连续分配,顺序固定为: ```text -states → auras → spells → group +states → auras → spells → items → group ``` 没有空隙:上一段用完后,下一段紧接着递增。不同专精声明的条目数量不同,因此 **同一语义在不同职业/专精上的绝对索引可能不同**;外部程序应按「当前专精表顺序」解读,或按名称 / `spellId` 映射,而不是写死固定格位。 @@ -90,7 +90,8 @@ states → auras → spells → group flowchart LR States["states 连续占位"] --> Auras["auras 连续占位"] Auras --> Spells["spells 连续占位"] - Spells --> Group["group.start = 下一位"] + Spells --> Items["items 按 itemId 升序占位"] + Items --> Group["group.start = 下一位"] ``` --- @@ -146,6 +147,17 @@ states = { 若表中 **没有** `"状态"` / `"目标"` / `"焦点"` 键,则按 `ipairs` 顺序写入 `blocks.state[名称] = index`。新职业表请用分类写法。 +### 3.3 `items`:独立物品像素 + +```lua +items = { + [5512] = { name = "治疗石", isEquipped = false }, + [123456] = { name = "饰品名称", isEquipped = true }, +} +``` + +物品不属于 `states` 分类。运行时在全部法术槽之后按 `itemId` 升序分配,每项同时写入 `blocks.state[name]` 和 `blocks.items[itemId]`;`isEquipped=true` 使用装备检查,否则使用背包数量检查。 + --- ## 4. `auras`:单位光环像素 diff --git a/README.md b/README.md index 503246fb..3c444b20 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ Shigure 是一个 Windows WinForms 桌面程序。它从目标窗口读取 Fuyut - 置顶浮动条:显示程序名、当前职业图标颜色和逻辑状态,提供 `开启/关闭`、`设置`、`✕` 按钮。窗口可拖动和缩放,显示后自动启动运行循环。 - `通用`:设置触发键和发送模式;从项目 Fuyutsui 更新配置并同步游戏插件;按实时环境选择模块,或按职业、专精、英雄天赋和队伍类型指定默认模块;从 GitHub 按需下载或更新技能图标数据包。 -- `配置`:直接编辑项目 `Fuyutsui/class/*.lua` 中的 `ClassBlocks`,包括状态、光环、法术和队伍字段;技能列表页可编辑 `Fuyutsui.spellsList` 中索引 1–100 的法术 ID、索引和名称,也可输入 spellId 与名称并自动分配空闲索引。旧版稀疏索引格式只读,需先迁移到 `states/auras/spells/group` 格式。 +- `配置`:直接编辑项目 `Fuyutsui/class/*.lua` 中的 `ClassBlocks`,包括状态、光环、法术、物品和队伍字段;独立物品页维护 `itemId`、名称及是否装备中,技能列表页可编辑 `Fuyutsui.spellsList` 中索引 1–100 的法术 ID、索引和名称,也可输入 spellId 与名称并自动分配空闲索引。旧版稀疏索引格式只读,需先迁移到 `states/auras/spells/items/group` 格式。 - `宏`:编辑项目 `Fuyutsui/core/classmacros.lua` 中各职业的动态宏、静态宏和特殊宏。动态宏每项占用 30 个团队点名槽位;特殊宏的技能名必须手工填写,不从宏正文解析,生成映射时固定为无目标、无宏条件。 - `模块`:新建、编辑、删除本地模块,维护作者、推荐天赋、匹配条件、动态字段和有序规则。规则支持拖拽、上移、下移、复制与插入。 - `状态`:分栏显示基础状态、`auras`、`spells` 和模块计算出的动态单位/数值。 @@ -149,7 +149,7 @@ Tools\ 辅助脚本 - `keymap`:该职业使用的 keymap 文件名。 - `一键法术`:状态中的本地技能索引到 spellId 的映射。 -- 以专精 ID 为键的对象,包含普通状态字段,以及可选的 `auras`、`spells`、`group`。 +- 以专精 ID 为键的对象,包含普通状态与物品字段,以及可选的 `auras`、`spells`、`group`。 运行时先读取 `common.json` 确定职业和专精,再合并对应专精配置。`group.start` 是队伍数据起始列,`group.num` 是每名成员占用的列数;组内字段的 `step` 是相对偏移。 diff --git a/Shigure.csproj b/Shigure.csproj index 5ebf4997..f5e7ce1d 100644 --- a/Shigure.csproj +++ b/Shigure.csproj @@ -9,9 +9,9 @@ Shigure Shigure Arasaka Corporation - 1.2.1.18 - 1.2.1.18 - 1.2.1.18 + 1.2.1.19 + 1.2.1.19 + 1.2.1.19 Assets\arasaka-icon.ico PerMonitorV2 diff --git a/UI/ClassConfigEditorControl.cs b/UI/ClassConfigEditorControl.cs index 6b499e42..955552ae 100644 --- a/UI/ClassConfigEditorControl.cs +++ b/UI/ClassConfigEditorControl.cs @@ -9,7 +9,7 @@ public sealed record ClassConfigPostSaveResult( IReadOnlyList ModuleWarnings); /// -/// 图形化编辑 Fuyutsui class/*.lua 的 ClassBlocks(states / auras / spells / group), +/// 图形化编辑 Fuyutsui class/*.lua 的 ClassBlocks(states / auras / spells / items / group), /// 并编辑同文件中的 spellsList。 /// public sealed class ClassConfigEditorControl : UserControl @@ -27,12 +27,10 @@ public sealed class ClassConfigEditorControl : UserControl private readonly DataGridView _statesGrid = new(); private readonly DataGridViewComboBoxColumn _stateNameColumn = new(); - private readonly DataGridViewTextBoxColumn _itemIdColumn = new(); - private readonly DataGridViewTextBoxColumn _itemNameColumn = new(); - private Control _stateMoveBar = null!; private ToolStripDropDown? _stateComboDropDown; private readonly DataGridView _aurasGrid = new(); private readonly DataGridView _spellsGrid = new(); + private readonly DataGridView _itemsGrid = new(); private readonly DataGridView _spellsListGrid = new(); private readonly TextBox _spellsListSearchBox = new(); private readonly DataGridView _spellDatabaseGrid = new(); @@ -321,14 +319,14 @@ public sealed class ClassConfigEditorControl : UserControl { Dock = DockStyle.Fill, BackColor = UiTheme.Surface, - ColumnCount = 5, + ColumnCount = 6, RowCount = 1, Margin = new Padding(0, 0, 0, 8), Padding = new Padding(0) }; - for (var i = 0; i < 5; i++) + for (var i = 0; i < 6; i++) { - tabBar.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20)); + tabBar.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F / 6)); } var contentCard = new UiCardPanel @@ -356,6 +354,7 @@ public sealed class ClassConfigEditorControl : UserControl BuildStatesPage(), BuildAurasPage(), BuildSpellsPage(), + BuildItemsPage(), BuildGroupPage(), BuildSpellsListPage() }; @@ -368,7 +367,7 @@ public sealed class ClassConfigEditorControl : UserControl contentHost.Controls.Add(page); } - var tabs = new UiPillTab[5]; + var tabs = new UiPillTab[6]; var selectedIndex = -1; void SelectTab(int index) { @@ -377,6 +376,12 @@ public sealed class ClassConfigEditorControl : UserControl return; } + if (!_suppressUi && selectedIndex == 3) + { + _itemsGrid.EndEdit(); + WriteBackItems(); + } + selectedIndex = index; for (var i = 0; i < tabs.Length; i++) { @@ -390,7 +395,7 @@ public sealed class ClassConfigEditorControl : UserControl } } - var titles = new[] { "状态", "光环", "法术", "队伍", "技能列表" }; + var titles = new[] { "状态", "光环", "法术", "物品", "队伍", "技能列表" }; for (var i = 0; i < titles.Length; i++) { var index = i; @@ -431,16 +436,6 @@ public sealed class ClassConfigEditorControl : UserControl _stateNameColumn.FlatStyle = FlatStyle.Flat; _stateNameColumn.DisplayStyle = DataGridViewComboBoxDisplayStyle.DropDownButton; _statesGrid.Columns.Add(_stateNameColumn); - _itemIdColumn.Name = "ItemId"; - _itemIdColumn.HeaderText = "itemId"; - _itemIdColumn.Width = 180; - _itemIdColumn.Visible = false; - _statesGrid.Columns.Add(_itemIdColumn); - _itemNameColumn.Name = "ItemName"; - _itemNameColumn.HeaderText = "名称"; - _itemNameColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - _itemNameColumn.Visible = false; - _statesGrid.Columns.Add(_itemNameColumn); _statesGrid.Columns.Add(CreateDeleteColumn()); _statesGrid.CellPainting += (_, e) => { @@ -459,8 +454,50 @@ public sealed class ClassConfigEditorControl : UserControl _statesGrid.DataError += (_, e) => e.ThrowException = false; _statesGrid.Disposed += (_, _) => CloseStateComboDropDown(); panel.Controls.Add(_statesGrid, 0, 1); - _stateMoveBar = BuildMoveButtons(_statesGrid); - panel.Controls.Add(_stateMoveBar, 0, 2); + panel.Controls.Add(BuildMoveButtons(_statesGrid), 0, 2); + return panel; + } + + private Control BuildItemsPage() + { + var panel = new TableLayoutPanel + { + Dock = DockStyle.Fill, + ColumnCount = 1, + RowCount = 1, + BackColor = UiTheme.SurfaceRaised + }; + panel.RowStyles.Add(new RowStyle(SizeType.Percent, 100)); + + ConfigureGrid(_itemsGrid, "class-config-items"); + _itemsGrid.Columns.Add(new DataGridViewTextBoxColumn + { + Name = "ItemId", + HeaderText = "itemId", + Width = 180, + SortMode = DataGridViewColumnSortMode.NotSortable + }); + _itemsGrid.Columns.Add(new DataGridViewTextBoxColumn + { + Name = "Name", + HeaderText = "名称", + AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill, + SortMode = DataGridViewColumnSortMode.NotSortable + }); + _itemsGrid.Columns.Add(new DataGridViewCheckBoxColumn + { + Name = "IsEquipped", + HeaderText = "是否装备中", + Width = 130, + FlatStyle = FlatStyle.Flat, + SortMode = DataGridViewColumnSortMode.NotSortable + }); + _itemsGrid.Columns.Add(CreateDeleteColumn()); + _itemsGrid.CellContentClick += HandleDeleteClick; + _itemsGrid.CellValueChanged += (_, _) => MarkDirty(); + _itemsGrid.UserAddedRow += (_, _) => MarkDirty(); + _itemsGrid.DataError += (_, e) => e.ThrowException = false; + panel.Controls.Add(_itemsGrid, 0, 0); return panel; } @@ -1468,7 +1505,7 @@ public sealed class ClassConfigEditorControl : UserControl if (!_currentDocument.IsModernFormat) { - _statusLabel.Text = "此文件仍是旧版稀疏索引格式,请先迁移到 states/auras/spells/group 后再编辑。"; + _statusLabel.Text = "此文件仍是旧版稀疏索引格式,请先迁移到 states/auras/spells/items/group 后再编辑。"; } else { @@ -1575,6 +1612,7 @@ public sealed class ClassConfigEditorControl : UserControl FillStatesGrid(); FillAurasGrid(); FillSpellsGrid(); + FillItemsGrid(); FillGroupEditors(); } finally @@ -1593,28 +1631,6 @@ public sealed class ClassConfigEditorControl : UserControl } var category = _selectedStateCategory; - var isItemCategory = string.Equals(category, ClassStateCatalog.CategoryItem, StringComparison.Ordinal); - _stateNameColumn.Visible = !isItemCategory; - _itemIdColumn.Visible = isItemCategory; - _itemNameColumn.Visible = isItemCategory; - _statesGrid.EditMode = isItemCategory - ? DataGridViewEditMode.EditOnEnter - : DataGridViewEditMode.EditProgrammatically; - _stateMoveBar.Visible = !isItemCategory; - if (isItemCategory) - { - foreach (var item in _currentSpec.Items.OrderBy(item => item.ItemId ?? long.MaxValue)) - { - _statesGrid.Rows.Add( - DBNull.Value, - item.ItemId?.ToString(CultureInfo.InvariantCulture) ?? string.Empty, - item.Name, - "×"); - } - - return; - } - BindStateNameColumn(ClassStateCatalog.GetAllOptions(category)); var storageCategory = ClassStateCatalog.GetStorageCategory(category); IEnumerable names = _currentSpec.NestedStates @@ -1627,7 +1643,25 @@ public sealed class ClassConfigEditorControl : UserControl foreach (var name in names) { EnsureStateOptionAvailable(category, name); - _statesGrid.Rows.Add(name, DBNull.Value, DBNull.Value, "×"); + _statesGrid.Rows.Add(name, "×"); + } + } + + private void FillItemsGrid() + { + _itemsGrid.Rows.Clear(); + if (_currentSpec is null) + { + return; + } + + foreach (var item in _currentSpec.Items.OrderBy(item => item.ItemId ?? long.MaxValue)) + { + _itemsGrid.Rows.Add( + item.ItemId?.ToString(CultureInfo.InvariantCulture) ?? string.Empty, + item.Name, + item.IsEquipped, + "×"); } } @@ -2376,11 +2410,13 @@ public sealed class ClassConfigEditorControl : UserControl return; } + _itemsGrid.EndEdit(); NormalizeFixedStateNames(_currentSpec); WriteBackStatesCategory(_lastStateCategory); WriteBackAuras(_lastAuraBucket); WriteBackSpells(); + WriteBackItems(); WriteBackGroup(); } @@ -2586,27 +2622,28 @@ public sealed class ClassConfigEditorControl : UserControl continue; } - if (!spec.NestedStates) - { - error = $"专精 {specId} 仍使用平面 states,无法保存 itemId 物品配置。"; - return false; - } - var itemIds = new HashSet(); var itemNames = new HashSet(StringComparer.Ordinal); var bareNames = new HashSet(StringComparer.Ordinal); - foreach (var category in new[] - { - ClassStateCatalog.CategoryState, - ClassStateCatalog.CategoryResource, - ClassStateCatalog.CategoryConfig - }) + if (spec.NestedStates) { - foreach (var name in spec.CategorizedStates.GetValueOrDefault(category) ?? []) + foreach (var category in new[] + { + ClassStateCatalog.CategoryState, + ClassStateCatalog.CategoryResource, + ClassStateCatalog.CategoryConfig + }) { - bareNames.Add(name); + foreach (var name in spec.CategorizedStates.GetValueOrDefault(category) ?? []) + { + bareNames.Add(name); + } } } + else + { + bareNames.UnionWith(spec.FlatStates); + } for (var index = 0; index < spec.Items.Count; index++) { @@ -2654,30 +2691,6 @@ public sealed class ClassConfigEditorControl : UserControl return; } - if (string.Equals(category, ClassStateCatalog.CategoryItem, StringComparison.Ordinal)) - { - _currentSpec.Items.Clear(); - foreach (DataGridViewRow row in _statesGrid.Rows) - { - if (row.IsNewRow) - { - continue; - } - - var idText = row.Cells["ItemId"].Value?.ToString()?.Trim(); - var name = row.Cells["ItemName"].Value?.ToString()?.Trim() ?? string.Empty; - long? itemId = long.TryParse(idText, NumberStyles.None, CultureInfo.InvariantCulture, out var parsedId) - ? parsedId - : null; - if (itemId is not null || name.Length > 0) - { - _currentSpec.Items.Add(new ClassBlocksStore.ItemEntry { ItemId = itemId, Name = name }); - } - } - - return; - } - var storageCategory = ClassStateCatalog.GetStorageCategory(category); List list; if (_currentSpec.NestedStates) @@ -2770,6 +2783,38 @@ public sealed class ClassConfigEditorControl : UserControl } } + private void WriteBackItems() + { + if (_currentSpec is null) + { + return; + } + + _currentSpec.Items.Clear(); + foreach (DataGridViewRow row in _itemsGrid.Rows) + { + if (row.IsNewRow) + { + continue; + } + + var idText = row.Cells["ItemId"].Value?.ToString()?.Trim(); + var name = row.Cells["Name"].Value?.ToString()?.Trim() ?? string.Empty; + long? itemId = long.TryParse(idText, NumberStyles.None, CultureInfo.InvariantCulture, out var parsedId) + ? parsedId + : null; + if (itemId is not null || name.Length > 0) + { + _currentSpec.Items.Add(new ClassBlocksStore.ItemEntry + { + ItemId = itemId, + Name = name, + IsEquipped = row.Cells["IsEquipped"].Value is true + }); + } + } + } + private void WriteBackSpells() { if (_currentSpec is null) @@ -2887,6 +2932,7 @@ public sealed class ClassConfigEditorControl : UserControl { _spellsListGrid.EndEdit(); _statesGrid.EndEdit(); + _itemsGrid.EndEdit(); if (!TryValidateSpellsList(out var validationError)) { MessageBox.Show(validationError, "技能列表", MessageBoxButtons.OK, MessageBoxIcon.Warning); @@ -3000,6 +3046,7 @@ public sealed class ClassConfigEditorControl : UserControl _statesGrid.Rows.Clear(); _aurasGrid.Rows.Clear(); _spellsGrid.Rows.Clear(); + _itemsGrid.Rows.Clear(); _spellsListGrid.Rows.Clear(); _spellsListSearchBox.Clear(); _groupAurasGrid.Rows.Clear(); diff --git a/UI/ModuleEditorControl.cs b/UI/ModuleEditorControl.cs index d66b688f..5f0e9420 100644 --- a/UI/ModuleEditorControl.cs +++ b/UI/ModuleEditorControl.cs @@ -1557,15 +1557,42 @@ public sealed class ModuleEditorControl : UserControl { if (e.RowIndex < 0 || e.ColumnIndex < 0 - || _adjustmentsGrid.Rows[e.RowIndex].IsNewRow - || _adjustmentsGrid.Columns[e.ColumnIndex].Name != "Condition") + || _adjustmentsGrid.Rows[e.RowIndex].IsNewRow) { return; } - // 动态数值条件沿用规则表的名称化显示;单元格底层仍保留 spellId 表达式供保存和运行。 - e.Value = FormatConditionExpressionForDisplay(e.Value?.ToString()); - e.FormattingApplied = true; + var columnName = _adjustmentsGrid.Columns[e.ColumnIndex].Name; + if (columnName == "Field") + { + // 调整目标只显示字段名称;单元格底层继续保存结构化 spellId 键。 + e.Value = FormatAdjustmentFieldForDisplay(e.Value?.ToString()); + e.FormattingApplied = true; + } + else if (columnName == "Condition") + { + // 动态数值条件沿用规则表的名称化显示;单元格底层仍保留 spellId 表达式供保存和运行。 + e.Value = FormatConditionExpressionForDisplay(e.Value?.ToString()); + e.FormattingApplied = true; + } + } + + private string FormatAdjustmentFieldForDisplay(string? field) + { + var source = field?.Trim() ?? string.Empty; + var normalized = NormalizeConditionFieldName(source); + var isSpellReference = SpellFieldKey.TryParseSpell(normalized, out var spellId, out _); + var isAuraReference = !isSpellReference + && (SpellFieldKey.TryParseAura(normalized, out _, out spellId, out _) + || SpellFieldKey.TryParseAuraMember(normalized, out spellId, out _)); + if (!isSpellReference && !isAuraReference) + { + return source; + } + + return ResolveConditionFieldDisplayName(normalized, spellId) + ?? ResolveConditionSpellName(spellId, normalized) + ?? source; } private IReadOnlyList BuildAdjustmentFields() @@ -2845,20 +2872,24 @@ public sealed class ModuleEditorControl : UserControl else { var category = ReadAdjustmentType(row); - var values = BuildAdjustmentFields() + var fields = BuildAdjustmentFields() .Where(field => category is null || field.Category == category) - .Select(field => field.Name) - .Prepend(string.Empty) - .Distinct(StringComparer.Ordinal) + .GroupBy(field => field.Name, StringComparer.Ordinal) + .Select(group => group.First()) .ToList(); - if (!values.Contains(currentValue, StringComparer.Ordinal)) + options = fields + .Select(field => new UiDropDownOption( + field.Name, + FormatAdjustmentFieldForDisplay(field.Name))) + .Prepend(new UiDropDownOption(string.Empty, string.Empty)) + .ToList(); + if (!string.IsNullOrEmpty(currentValue) + && !fields.Any(field => string.Equals(field.Name, currentValue, StringComparison.Ordinal))) { - values.Insert(0, currentValue); + options.Insert(0, new UiDropDownOption( + currentValue, + FormatAdjustmentFieldForDisplay(currentValue))); } - - options = values - .Select(value => new UiDropDownOption(value, value)) - .ToList(); } var cellBounds = _adjustmentsGrid.GetCellDisplayRectangle(columnIndex, rowIndex, cutOverflow: true); diff --git a/UI/StatusForm.cs b/UI/StatusForm.cs index 5fb30aa3..52d0dd4a 100644 --- a/UI/StatusForm.cs +++ b/UI/StatusForm.cs @@ -1202,7 +1202,7 @@ public sealed class StatusForm : Form "队伍类型", "队伍人数", "首领战", "难度", "英雄天赋", "施法目标", "施法技能", "敌人数量", "敌人数-无仇恨", "敌人数-有仇恨", "施法(正计时)", "施法(倒计时)", "引导", "蓄力", "蓄力层数", - "酒池", "符文", "姿态", "神圣军备", "自律", "上个技能", "英勇打击", "吸血鬼打击", "收割者战刃" + "酒池", "符文", "姿态", "神圣军备", "自律", "上个技能", "公共冷却", "英勇打击", "吸血鬼打击", "收割者战刃" ], 150), 0, 0); fields.Controls.Add(CreateCommonFieldCard( diff --git a/config/DeathKnight.json b/config/DeathKnight.json index 15b6b8e9..1576886a 100644 --- a/config/DeathKnight.json +++ b/config/DeathKnight.json @@ -206,158 +206,162 @@ "type": "int", "category": "能量" }, - "治疗石": { - "step": 28, - "type": "int", - "category": "物品", - "itemId": 5512 - }, - "物品名称": { - "step": 29, - "type": "int", - "category": "物品", - "itemId": 123456 - }, - "鲁莽药水": { - "step": 30, - "type": "int", - "category": "物品", - "itemId": 241288 - }, - "圣光潜力": { - "step": 31, - "type": "int", - "category": "物品", - "itemId": 241308 - }, "爆发开关": { - "step": 32, + "step": 28, "type": "int", "category": "配置开关" }, "爆发药水开关": { - "step": 33, + "step": 29, "type": "int", "category": "配置开关" }, "目标类型": { - "step": 34, + "step": 30, "type": "int", "category": "目标" }, "目标生命值": { - "step": 35, + "step": 31, "type": "int", "category": "目标" }, "目标施法(倒计时)": { - "step": 36, + "step": 32, "type": "int", "category": "目标" }, "目标施法(正计时)": { - "step": 37, + "step": 33, "type": "int", "category": "目标" }, "目标施法可打断": { - "step": 38, + "step": 34, "type": "int", "category": "目标" }, "目标引导": { - "step": 39, + "step": 35, "type": "int", "category": "目标" }, "目标引导可打断": { - "step": 40, + "step": 36, "type": "int", "category": "目标" }, "目标距离": { - "step": 41, + "step": 37, "type": "int", "category": "目标" }, "焦点施法(倒计时)": { - "step": 42, + "step": 38, "type": "int", "category": "焦点" }, "焦点施法(正计时)": { - "step": 43, + "step": 39, "type": "int", "category": "焦点" }, "焦点施法可打断": { - "step": 44, + "step": 40, "type": "int", "category": "焦点" }, "焦点引导": { - "step": 45, + "step": 41, "type": "int", "category": "焦点" }, "焦点引导可打断": { - "step": 46, + "step": 42, "type": "int", "category": "焦点" }, "焦点距离": { - "step": 47, + "step": 43, "type": "int", "category": "焦点" }, "鼠标类型": { - "step": 48, + "step": 44, "type": "int", "category": "鼠标" }, "鼠标驱散类型": { - "step": 49, + "step": 45, "type": "int", "category": "鼠标" }, "鼠标生命值": { - "step": 50, + "step": 46, "type": "int", "category": "鼠标" }, "鼠标距离": { - "step": 51, + "step": 47, "type": "int", "category": "鼠标" }, "鼠标施法(倒计时)": { - "step": 52, + "step": 48, "type": "int", "category": "鼠标" }, "鼠标施法(正计时)": { - "step": 53, + "step": 49, "type": "int", "category": "鼠标" }, "鼠标施法可打断": { - "step": 54, + "step": 50, "type": "int", "category": "鼠标" }, "鼠标引导": { - "step": 55, + "step": 51, "type": "int", "category": "鼠标" }, "鼠标引导可打断": { - "step": 56, + "step": 52, "type": "int", "category": "鼠标" }, + "治疗石": { + "step": 85, + "type": "int", + "category": "物品", + "itemId": 5512, + "isEquipped": false + }, + "物品名称": { + "step": 86, + "type": "int", + "category": "物品", + "itemId": 123456, + "isEquipped": true + }, + "鲁莽药水": { + "step": 87, + "type": "int", + "category": "物品", + "itemId": 241288, + "isEquipped": false + }, + "圣光潜力": { + "step": 88, + "type": "int", + "category": "物品", + "itemId": 241308, + "isEquipped": false + }, "auras": { "player.195181.value": { - "step": 57, + "step": 53, "type": "int", "category": "玩家", "displayName": "白骨之盾", @@ -382,7 +386,7 @@ "bar": 3 }, "player.81256.value": { - "step": 58, + "step": 54, "type": "int", "category": "玩家", "displayName": "符文刃舞", @@ -394,7 +398,7 @@ ] }, "player.55233.value": { - "step": 59, + "step": 55, "type": "int", "category": "玩家", "displayName": "吸血鬼之血", @@ -406,7 +410,7 @@ ] }, "player.48792.value": { - "step": 60, + "step": 56, "type": "int", "category": "玩家", "displayName": "冰封之韧", @@ -418,7 +422,7 @@ ] }, "player.188290.value": { - "step": 61, + "step": 57, "type": "int", "category": "玩家", "displayName": "枯萎凋零", @@ -430,7 +434,7 @@ ] }, "player.441416.value": { - "step": 62, + "step": 58, "type": "int", "category": "玩家", "displayName": "破灭", @@ -442,7 +446,7 @@ ] }, "player.1264407.value": { - "step": 63, + "step": 59, "type": "int", "category": "玩家", "displayName": "午夜舞步", @@ -454,7 +458,7 @@ ] }, "player.1265968.value": { - "step": 64, + "step": 60, "type": "int", "category": "玩家", "displayName": "沸点", @@ -466,7 +470,7 @@ ] }, "player.81136.value": { - "step": 65, + "step": 61, "type": "int", "category": "玩家", "displayName": "赤色天灾", @@ -478,7 +482,7 @@ ] }, "player.77535.value": { - "step": 66, + "step": 62, "type": "int", "category": "玩家", "displayName": "鲜血护盾", @@ -503,7 +507,7 @@ "bar": 4 }, "player.273947.value": { - "step": 67, + "step": 63, "type": "int", "category": "玩家", "displayName": "鲜血禁闭", @@ -528,7 +532,7 @@ "bar": 5 }, "player.433925.value": { - "step": 68, + "step": 64, "type": "int", "category": "玩家", "displayName": "鲜血女王的精华", @@ -553,7 +557,7 @@ "bar": 6 }, "target.harmful.55078.value": { - "step": 69, + "step": 65, "type": "int", "category": "目标减益", "displayName": "血之疫病", @@ -567,7 +571,7 @@ }, "spells": { "49576.cooldown": { - "step": 70, + "step": 66, "type": "int", "displayName": "死亡之握", "spellId": 49576, @@ -575,7 +579,7 @@ "displayType": "冷却" }, "51052.cooldown": { - "step": 71, + "step": 67, "type": "int", "displayName": "反魔法领域", "spellId": 51052, @@ -583,7 +587,7 @@ "displayType": "冷却" }, "221562.cooldown": { - "step": 72, + "step": 68, "type": "int", "displayName": "窒息", "spellId": 221562, @@ -591,7 +595,7 @@ "displayType": "冷却" }, "207167.cooldown": { - "step": 73, + "step": 69, "type": "int", "displayName": "致盲冰雨", "spellId": 207167, @@ -599,7 +603,7 @@ "displayType": "冷却" }, "47528.cooldown": { - "step": 74, + "step": 70, "type": "int", "displayName": "心灵冰冻", "spellId": 47528, @@ -607,7 +611,7 @@ "displayType": "冷却" }, "195292.cooldown": { - "step": 75, + "step": 71, "type": "int", "displayName": "死神的抚摩", "spellId": 195292, @@ -615,7 +619,7 @@ "displayType": "冷却" }, "439843.cooldown": { - "step": 76, + "step": 72, "type": "int", "displayName": "死神印记", "spellId": 439843, @@ -623,7 +627,7 @@ "displayType": "冷却" }, "46585.cooldown": { - "step": 77, + "step": 73, "type": "int", "displayName": "亡者复生", "spellId": 46585, @@ -631,7 +635,7 @@ "displayType": "冷却" }, "55233.cooldown": { - "step": 78, + "step": 74, "type": "int", "displayName": "吸血鬼之血", "spellId": 55233, @@ -639,7 +643,7 @@ "displayType": "冷却" }, "48792.cooldown": { - "step": 79, + "step": 75, "type": "int", "displayName": "冰封之韧", "spellId": 48792, @@ -647,7 +651,7 @@ "displayType": "冷却" }, "49039.cooldown": { - "step": 80, + "step": 76, "type": "int", "displayName": "巫妖之躯", "spellId": 49039, @@ -655,7 +659,7 @@ "displayType": "冷却" }, "108199.cooldown": { - "step": 81, + "step": 77, "type": "int", "displayName": "血魔之握", "spellId": 108199, @@ -663,7 +667,7 @@ "displayType": "冷却" }, "1263569.cooldown": { - "step": 82, + "step": 78, "type": "int", "displayName": "憎恶附肢", "spellId": 1263569, @@ -671,7 +675,7 @@ "displayType": "冷却" }, "1263824.cooldown": { - "step": 83, + "step": 79, "type": "int", "displayName": "吞噬", "spellId": 1263824, @@ -679,7 +683,7 @@ "displayType": "冷却" }, "50842.cooldown": { - "step": 84, + "step": 80, "type": "int", "displayName": "血液沸腾", "spellId": 50842, @@ -687,7 +691,7 @@ "displayType": "冷却" }, "50842.chargeCooldown": { - "step": 85, + "step": 81, "type": "int", "displayName": "血液沸腾充能", "spellId": 50842, @@ -704,7 +708,7 @@ "displayType": "充能层数" }, "43265.cooldown": { - "step": 86, + "step": 82, "type": "int", "displayName": "枯萎凋零", "spellId": 43265, @@ -712,7 +716,7 @@ "displayType": "冷却" }, "43265.chargeCooldown": { - "step": 87, + "step": 83, "type": "int", "displayName": "枯萎凋零充能", "spellId": 43265, @@ -729,7 +733,7 @@ "displayType": "充能层数" }, "49028.cooldown": { - "step": 88, + "step": 84, "type": "int", "displayName": "符文刃舞", "spellId": 49028, @@ -834,140 +838,141 @@ "type": "int", "category": "能量" }, - "鲁莽药水": { - "step": 23, - "type": "int", - "category": "物品", - "itemId": 241288 - }, "爆发开关": { - "step": 24, + "step": 23, "type": "int", "category": "配置开关" }, "输出模式": { - "step": 25, + "step": 24, "type": "int", "category": "配置开关" }, "AOE开关": { - "step": 26, + "step": 25, "type": "int", "category": "配置开关" }, "爆发药水开关": { - "step": 27, + "step": 26, "type": "int", "category": "配置开关" }, "目标类型": { - "step": 28, + "step": 27, "type": "int", "category": "目标" }, "目标生命值": { - "step": 29, + "step": 28, "type": "int", "category": "目标" }, "目标施法(倒计时)": { - "step": 30, + "step": 29, "type": "int", "category": "目标" }, "目标施法(正计时)": { - "step": 31, + "step": 30, "type": "int", "category": "目标" }, "目标施法可打断": { - "step": 32, + "step": 31, "type": "int", "category": "目标" }, "目标引导": { - "step": 33, + "step": 32, "type": "int", "category": "目标" }, "目标引导可打断": { - "step": 34, + "step": 33, "type": "int", "category": "目标" }, "焦点施法(倒计时)": { - "step": 35, + "step": 34, "type": "int", "category": "焦点" }, "焦点施法(正计时)": { - "step": 36, + "step": 35, "type": "int", "category": "焦点" }, "焦点施法可打断": { - "step": 37, + "step": 36, "type": "int", "category": "焦点" }, "焦点引导": { - "step": 38, + "step": 37, "type": "int", "category": "焦点" }, "焦点引导可打断": { - "step": 39, + "step": 38, "type": "int", "category": "焦点" }, "鼠标类型": { - "step": 40, + "step": 39, "type": "int", "category": "鼠标" }, "鼠标驱散类型": { - "step": 41, + "step": 40, "type": "int", "category": "鼠标" }, "鼠标生命值": { - "step": 42, + "step": 41, "type": "int", "category": "鼠标" }, "鼠标距离": { - "step": 43, + "step": 42, "type": "int", "category": "鼠标" }, "鼠标施法(倒计时)": { - "step": 44, + "step": 43, "type": "int", "category": "鼠标" }, "鼠标施法(正计时)": { - "step": 45, + "step": 44, "type": "int", "category": "鼠标" }, "鼠标施法可打断": { - "step": 46, + "step": 45, "type": "int", "category": "鼠标" }, "鼠标引导": { - "step": 47, + "step": 46, "type": "int", "category": "鼠标" }, "鼠标引导可打断": { - "step": 48, + "step": 47, "type": "int", "category": "鼠标" }, + "鲁莽药水": { + "step": 69, + "type": "int", + "category": "物品", + "itemId": 241288, + "isEquipped": false + }, "auras": { "player.59052.value": { - "step": 49, + "step": 48, "type": "int", "category": "玩家", "displayName": "白霜", @@ -980,7 +985,7 @@ ] }, "player.51271.value": { - "step": 50, + "step": 49, "type": "int", "category": "玩家", "displayName": "冰霜之柱", @@ -992,7 +997,7 @@ ] }, "player.51124.value": { - "step": 51, + "step": 50, "type": "int", "category": "玩家", "displayName": "杀戮机器", @@ -1005,7 +1010,7 @@ ] }, "player.1249658.value": { - "step": 52, + "step": 51, "type": "int", "category": "玩家", "displayName": "冰龙吐息", @@ -1017,7 +1022,7 @@ ] }, "player.101568.value": { - "step": 53, + "step": 52, "type": "int", "category": "玩家", "displayName": "黑暗援助", @@ -1029,7 +1034,7 @@ ] }, "player.1265639.value": { - "step": 54, + "step": 53, "type": "int", "category": "玩家", "displayName": "霜巢之眷", @@ -1041,7 +1046,7 @@ ] }, "player.441378.value": { - "step": 55, + "step": 54, "type": "int", "category": "玩家", "displayName": "破灭", @@ -1057,7 +1062,7 @@ ] }, "player.1233152.value": { - "step": 56, + "step": 55, "type": "int", "category": "玩家", "displayName": "冷酷严冬", @@ -1069,7 +1074,7 @@ ] }, "player.1269300.value": { - "step": 57, + "step": 56, "type": "int", "category": "玩家", "displayName": "强效打击", @@ -1081,7 +1086,7 @@ ] }, "player.12449658.value": { - "step": 58, + "step": 57, "type": "int", "category": "玩家", "displayName": "冰龙吐息", @@ -1095,7 +1100,7 @@ }, "spells": { "49576.cooldown": { - "step": 59, + "step": 58, "type": "int", "displayName": "死亡之握", "spellId": 49576, @@ -1103,7 +1108,7 @@ "displayType": "冷却" }, "51052.cooldown": { - "step": 60, + "step": 59, "type": "int", "displayName": "反魔法领域", "spellId": 51052, @@ -1111,7 +1116,7 @@ "displayType": "冷却" }, "221562.cooldown": { - "step": 61, + "step": 60, "type": "int", "displayName": "窒息", "spellId": 221562, @@ -1119,7 +1124,7 @@ "displayType": "冷却" }, "207167.cooldown": { - "step": 62, + "step": 61, "type": "int", "displayName": "致盲冰雨", "spellId": 207167, @@ -1127,7 +1132,7 @@ "displayType": "冷却" }, "51271.cooldown": { - "step": 63, + "step": 62, "type": "int", "displayName": "冰霜之柱", "spellId": 51271, @@ -1135,7 +1140,7 @@ "displayType": "冷却" }, "279302.cooldown": { - "step": 64, + "step": 63, "type": "int", "displayName": "冰霜巨龙之怒", "spellId": 279302, @@ -1143,7 +1148,7 @@ "displayType": "冷却" }, "439843.cooldown": { - "step": 65, + "step": 64, "type": "int", "displayName": "死神印记", "spellId": 439843, @@ -1151,7 +1156,7 @@ "displayType": "冷却" }, "47568.cooldown": { - "step": 66, + "step": 65, "type": "int", "displayName": "符文武器增效", "spellId": 47568, @@ -1159,7 +1164,7 @@ "displayType": "冷却" }, "47568.chargeCooldown": { - "step": 67, + "step": 66, "type": "int", "displayName": "符文武器增效充能", "spellId": 47568, @@ -1176,7 +1181,7 @@ "displayType": "充能层数" }, "1249658.cooldown": { - "step": 68, + "step": 67, "type": "int", "displayName": "冰龙吐息", "spellId": 1249658, @@ -1184,7 +1189,7 @@ "displayType": "冷却" }, "47528.cooldown": { - "step": 69, + "step": 68, "type": "int", "displayName": "心灵冰冻", "spellId": 47528, @@ -1299,171 +1304,173 @@ "type": "int", "category": "能量" }, - "鲁莽药水": { - "step": 25, - "type": "int", - "category": "物品", - "itemId": 241288 - }, - "治疗药水": { - "step": 26, - "type": "int", - "category": "物品", - "itemId": 241304 - }, "延迟": { - "step": 27, + "step": 25, "type": "int", "category": "配置开关" }, "爆发开关": { - "step": 28, + "step": 26, "type": "int", "category": "配置开关" }, "输出模式": { - "step": 29, + "step": 27, "type": "int", "category": "配置开关" }, "AOE开关": { - "step": 30, + "step": 28, "type": "int", "category": "配置开关" }, "爆发药水开关": { - "step": 31, + "step": 29, "type": "int", "category": "配置开关" }, "目标类型": { - "step": 32, + "step": 30, "type": "int", "category": "目标" }, "目标生命值": { - "step": 33, + "step": 31, "type": "int", "category": "目标" }, "目标距离": { - "step": 34, + "step": 32, "type": "int", "category": "目标" }, "目标施法(倒计时)": { - "step": 35, + "step": 33, "type": "int", "category": "目标" }, "目标施法(正计时)": { - "step": 36, + "step": 34, "type": "int", "category": "目标" }, "目标施法可打断": { - "step": 37, + "step": 35, "type": "int", "category": "目标" }, "目标引导": { - "step": 38, + "step": 36, "type": "int", "category": "目标" }, "目标引导可打断": { - "step": 39, + "step": 37, "type": "int", "category": "目标" }, "焦点类型": { - "step": 40, + "step": 38, "type": "int", "category": "焦点" }, "焦点生命值": { - "step": 41, + "step": 39, "type": "int", "category": "焦点" }, "焦点距离": { - "step": 42, + "step": 40, "type": "int", "category": "焦点" }, "焦点施法(倒计时)": { - "step": 43, + "step": 41, "type": "int", "category": "焦点" }, "焦点施法(正计时)": { - "step": 44, + "step": 42, "type": "int", "category": "焦点" }, "焦点施法可打断": { - "step": 45, + "step": 43, "type": "int", "category": "焦点" }, "焦点引导": { - "step": 46, + "step": 44, "type": "int", "category": "焦点" }, "焦点引导可打断": { - "step": 47, + "step": 45, "type": "int", "category": "焦点" }, "鼠标类型": { - "step": 48, + "step": 46, "type": "int", "category": "鼠标" }, "鼠标驱散类型": { - "step": 49, + "step": 47, "type": "int", "category": "鼠标" }, "鼠标生命值": { - "step": 50, + "step": 48, "type": "int", "category": "鼠标" }, "鼠标距离": { - "step": 51, + "step": 49, "type": "int", "category": "鼠标" }, "鼠标施法(倒计时)": { - "step": 52, + "step": 50, "type": "int", "category": "鼠标" }, "鼠标施法(正计时)": { - "step": 53, + "step": 51, "type": "int", "category": "鼠标" }, "鼠标施法可打断": { - "step": 54, + "step": 52, "type": "int", "category": "鼠标" }, "鼠标引导": { - "step": 55, + "step": 53, "type": "int", "category": "鼠标" }, "鼠标引导可打断": { - "step": 56, + "step": 54, "type": "int", "category": "鼠标" }, + "鲁莽药水": { + "step": 68, + "type": "int", + "category": "物品", + "itemId": 241288, + "isEquipped": false + }, + "治疗药水": { + "step": 69, + "type": "int", + "category": "物品", + "itemId": 241304, + "isEquipped": false + }, "spells": { "49576.cooldown": { - "step": 57, + "step": 55, "type": "int", "displayName": "死亡之握", "spellId": 49576, @@ -1471,7 +1478,7 @@ "displayType": "冷却" }, "51052.cooldown": { - "step": 58, + "step": 56, "type": "int", "displayName": "反魔法领域", "spellId": 51052, @@ -1479,7 +1486,7 @@ "displayType": "冷却" }, "221562.cooldown": { - "step": 59, + "step": 57, "type": "int", "displayName": "窒息", "spellId": 221562, @@ -1487,7 +1494,7 @@ "displayType": "冷却" }, "207167.cooldown": { - "step": 60, + "step": 58, "type": "int", "displayName": "致盲冰雨", "spellId": 207167, @@ -1495,7 +1502,7 @@ "displayType": "冷却" }, "46584.cooldown": { - "step": 61, + "step": 59, "type": "int", "displayName": "亡者复生", "spellId": 46584, @@ -1503,7 +1510,7 @@ "displayType": "冷却" }, "42650.cooldown": { - "step": 62, + "step": 60, "type": "int", "displayName": "亡者大军", "spellId": 42650, @@ -1511,7 +1518,7 @@ "displayType": "冷却" }, "1247378.cooldown": { - "step": 63, + "step": 61, "type": "int", "displayName": "腐化", "spellId": 1247378, @@ -1519,7 +1526,7 @@ "displayType": "冷却" }, "1247378.chargeCooldown": { - "step": 64, + "step": 62, "type": "int", "displayName": "腐化充能", "spellId": 1247378, @@ -1536,7 +1543,7 @@ "displayType": "充能层数" }, "1233448.cooldown": { - "step": 65, + "step": 63, "type": "int", "displayName": "黑暗突变", "spellId": 1233448, @@ -1544,7 +1551,7 @@ "displayType": "冷却" }, "343294.cooldown": { - "step": 66, + "step": 64, "type": "int", "displayName": "灵魂收割", "spellId": 343294, @@ -1552,7 +1559,7 @@ "displayType": "冷却" }, "43265.cooldown": { - "step": 67, + "step": 65, "type": "int", "displayName": "枯萎凋零", "spellId": 43265, @@ -1560,7 +1567,7 @@ "displayType": "冷却" }, "43265.chargeCooldown": { - "step": 68, + "step": 66, "type": "int", "displayName": "枯萎凋零充能", "spellId": 43265, @@ -1577,7 +1584,7 @@ "displayType": "充能层数" }, "55090.cooldown": { - "step": 69, + "step": 67, "type": "int", "displayName": "天灾打击", "spellId": 55090, diff --git a/config/DemonHunter.json b/config/DemonHunter.json index 56b76a00..21f09807 100644 --- a/config/DemonHunter.json +++ b/config/DemonHunter.json @@ -536,152 +536,155 @@ "type": "int", "category": "能量" }, - "治疗石": { - "step": 23, - "type": "int", - "category": "物品", - "itemId": 5512 - }, - "鲁莽药水": { - "step": 24, - "type": "int", - "category": "物品", - "itemId": 241288 - }, - "圣光潜力": { - "step": 25, - "type": "int", - "category": "物品", - "itemId": 241308 - }, "爆发开关": { - "step": 26, + "step": 23, "type": "int", "category": "配置开关" }, "爆发药水开关": { - "step": 27, + "step": 24, "type": "int", "category": "配置开关" }, "目标类型": { - "step": 28, + "step": 25, "type": "int", "category": "目标" }, "目标生命值": { - "step": 29, + "step": 26, "type": "int", "category": "目标" }, "目标施法(倒计时)": { - "step": 30, + "step": 27, "type": "int", "category": "目标" }, "目标施法(正计时)": { - "step": 31, + "step": 28, "type": "int", "category": "目标" }, "目标施法可打断": { - "step": 32, + "step": 29, "type": "int", "category": "目标" }, "目标引导": { - "step": 33, + "step": 30, "type": "int", "category": "目标" }, "目标引导可打断": { - "step": 34, + "step": 31, "type": "int", "category": "目标" }, "目标距离": { - "step": 35, + "step": 32, "type": "int", "category": "目标" }, "焦点施法(倒计时)": { - "step": 36, + "step": 33, "type": "int", "category": "焦点" }, "焦点施法(正计时)": { - "step": 37, + "step": 34, "type": "int", "category": "焦点" }, "焦点施法可打断": { - "step": 38, + "step": 35, "type": "int", "category": "焦点" }, "焦点引导": { - "step": 39, + "step": 36, "type": "int", "category": "焦点" }, "焦点引导可打断": { - "step": 40, + "step": 37, "type": "int", "category": "焦点" }, "焦点距离": { - "step": 41, + "step": 38, "type": "int", "category": "焦点" }, "鼠标类型": { - "step": 42, + "step": 39, "type": "int", "category": "鼠标" }, "鼠标驱散类型": { - "step": 43, + "step": 40, "type": "int", "category": "鼠标" }, "鼠标生命值": { - "step": 44, + "step": 41, "type": "int", "category": "鼠标" }, "鼠标距离": { - "step": 45, + "step": 42, "type": "int", "category": "鼠标" }, "鼠标施法(倒计时)": { - "step": 46, + "step": 43, "type": "int", "category": "鼠标" }, "鼠标施法(正计时)": { - "step": 47, + "step": 44, "type": "int", "category": "鼠标" }, "鼠标施法可打断": { - "step": 48, + "step": 45, "type": "int", "category": "鼠标" }, "鼠标引导": { - "step": 49, + "step": 46, "type": "int", "category": "鼠标" }, "鼠标引导可打断": { - "step": 50, + "step": 47, "type": "int", "category": "鼠标" }, + "治疗石": { + "step": 85, + "type": "int", + "category": "物品", + "itemId": 5512, + "isEquipped": false + }, + "鲁莽药水": { + "step": 86, + "type": "int", + "category": "物品", + "itemId": 241288, + "isEquipped": false + }, + "圣光潜力": { + "step": 87, + "type": "int", + "category": "物品", + "itemId": 241308, + "isEquipped": false + }, "auras": { "player.203819.value": { - "step": 51, + "step": 48, "type": "int", "category": "玩家", "displayName": "恶魔尖刺", @@ -693,7 +696,7 @@ ] }, "player.207771.value": { - "step": 52, + "step": 49, "type": "int", "category": "玩家", "displayName": "烈火烙印", @@ -705,7 +708,7 @@ ] }, "player.203981.value": { - "step": 53, + "step": 50, "type": "int", "category": "玩家", "displayName": "灵魂残片", @@ -730,7 +733,7 @@ "bar": 6 }, "player.258920.value": { - "step": 54, + "step": 51, "type": "int", "category": "玩家", "displayName": "献祭光环", @@ -742,7 +745,7 @@ ] }, "player.444661.value": { - "step": 55, + "step": 52, "type": "int", "category": "玩家", "displayName": "战刃绝技", @@ -767,7 +770,7 @@ "bar": 7 }, "player.442442.value": { - "step": 56, + "step": 53, "type": "int", "category": "玩家", "displayName": "撕裂猛击", @@ -779,7 +782,7 @@ ] }, "player.442435.value": { - "step": 57, + "step": 54, "type": "int", "category": "玩家", "displayName": "战刃乱舞", @@ -791,7 +794,7 @@ ] }, "player.442695.value": { - "step": 58, + "step": 55, "type": "int", "category": "玩家", "displayName": "酣战热血", @@ -803,7 +806,7 @@ ] }, "player.1270547.value": { - "step": 59, + "step": 56, "type": "int", "category": "玩家", "displayName": "沸腾怒意", @@ -828,7 +831,7 @@ "bar": 8 }, "player.1270476.value": { - "step": 60, + "step": 57, "type": "int", "category": "玩家", "displayName": "无羁邪怒", @@ -840,7 +843,7 @@ ] }, "target.harmful.204598.value": { - "step": 61, + "step": 58, "type": "int", "category": "目标减益", "displayName": "烈焰咒符", @@ -852,7 +855,7 @@ ] }, "target.harmful.247456.value": { - "step": 62, + "step": 59, "type": "int", "category": "目标减益", "displayName": "脆弱", @@ -866,7 +869,7 @@ }, "spells": { "263642.cooldown": { - "step": 63, + "step": 60, "type": "int", "displayName": "破裂", "spellId": 263642, @@ -874,7 +877,7 @@ "displayType": "冷却" }, "263642.chargeCooldown": { - "step": 64, + "step": 61, "type": "int", "displayName": "破裂充能", "spellId": 263642, @@ -891,7 +894,7 @@ "displayType": "充能层数" }, "228477.cooldown": { - "step": 65, + "step": 62, "type": "int", "displayName": "灵魂裂劈", "spellId": 228477, @@ -908,7 +911,7 @@ "displayType": "施法次数" }, "247454.cooldown": { - "step": 66, + "step": 63, "type": "int", "displayName": "幽魂炸弹", "spellId": 247454, @@ -916,7 +919,7 @@ "displayType": "冷却" }, "390163.cooldown": { - "step": 67, + "step": 64, "type": "int", "displayName": "怨念咒符", "spellId": 390163, @@ -924,7 +927,7 @@ "displayType": "冷却" }, "204596.cooldown": { - "step": 68, + "step": 65, "type": "int", "displayName": "烈焰咒符", "spellId": 204596, @@ -932,7 +935,7 @@ "displayType": "冷却" }, "232893.cooldown": { - "step": 69, + "step": 66, "type": "int", "displayName": "邪能之刃", "spellId": 232893, @@ -940,7 +943,7 @@ "displayType": "冷却" }, "185123.cooldown": { - "step": 70, + "step": 67, "type": "int", "displayName": "投掷利刃", "spellId": 185123, @@ -948,7 +951,7 @@ "displayType": "冷却" }, "185123.chargeCooldown": { - "step": 71, + "step": 68, "type": "int", "displayName": "投掷利刃充能", "spellId": 185123, @@ -965,7 +968,7 @@ "displayType": "充能层数" }, "258920.cooldown": { - "step": 72, + "step": 69, "type": "int", "displayName": "献祭光环", "spellId": 258920, @@ -973,7 +976,7 @@ "displayType": "冷却" }, "203720.cooldown": { - "step": 73, + "step": 70, "type": "int", "displayName": "恶魔尖刺", "spellId": 203720, @@ -981,7 +984,7 @@ "displayType": "冷却" }, "183752.cooldown": { - "step": 74, + "step": 71, "type": "int", "displayName": "瓦解", "spellId": 183752, @@ -989,7 +992,7 @@ "displayType": "冷却" }, "204021.cooldown": { - "step": 75, + "step": 72, "type": "int", "displayName": "烈火烙印", "spellId": 204021, @@ -997,7 +1000,7 @@ "displayType": "冷却" }, "204021.chargeCooldown": { - "step": 76, + "step": 73, "type": "int", "displayName": "烈火烙印充能", "spellId": 204021, @@ -1014,7 +1017,7 @@ "displayType": "充能层数" }, "212084.cooldown": { - "step": 77, + "step": 74, "type": "int", "displayName": "邪能毁灭", "spellId": 212084, @@ -1022,7 +1025,7 @@ "displayType": "冷却" }, "187827.cooldown": { - "step": 78, + "step": 75, "type": "int", "displayName": "恶魔变形", "spellId": 187827, @@ -1030,7 +1033,7 @@ "displayType": "冷却" }, "189110.cooldown": { - "step": 79, + "step": 76, "type": "int", "displayName": "地狱火撞击", "spellId": 189110, @@ -1038,7 +1041,7 @@ "displayType": "冷却" }, "189110.chargeCooldown": { - "step": 80, + "step": 77, "type": "int", "displayName": "地狱火撞击充能", "spellId": 189110, @@ -1055,7 +1058,7 @@ "displayType": "充能层数" }, "196718.cooldown": { - "step": 81, + "step": 78, "type": "int", "displayName": "黑暗", "spellId": 196718, @@ -1063,7 +1066,7 @@ "displayType": "冷却" }, "198793.cooldown": { - "step": 82, + "step": 79, "type": "int", "displayName": "复仇回避", "spellId": 198793, @@ -1071,7 +1074,7 @@ "displayType": "冷却" }, "207684.cooldown": { - "step": 83, + "step": 80, "type": "int", "displayName": "悲苦咒符", "spellId": 207684, @@ -1079,7 +1082,7 @@ "displayType": "冷却" }, "217832.cooldown": { - "step": 84, + "step": 81, "type": "int", "displayName": "禁锢", "spellId": 217832, @@ -1087,7 +1090,7 @@ "displayType": "冷却" }, "179057.cooldown": { - "step": 85, + "step": 82, "type": "int", "displayName": "混乱新星", "spellId": 179057, @@ -1095,7 +1098,7 @@ "displayType": "冷却" }, "207407.cooldown": { - "step": 86, + "step": 83, "type": "int", "displayName": "灵魂切削", "spellId": 207407, @@ -1103,7 +1106,7 @@ "displayType": "冷却" }, "202137.cooldown": { - "step": 87, + "step": 84, "type": "int", "displayName": "沉默咒符", "spellId": 202137, diff --git a/config/Paladin.json b/config/Paladin.json index 686f730f..eb830f9a 100644 --- a/config/Paladin.json +++ b/config/Paladin.json @@ -194,115 +194,116 @@ "type": "int", "category": "能量" }, - "治疗药水": { - "step": 26, - "type": "int", - "category": "物品", - "itemId": 241304 - }, "爆发开关": { - "step": 27, + "step": 26, "type": "int", "category": "配置开关" }, "延迟": { - "step": 28, + "step": 27, "type": "int", "category": "配置开关" }, "目标类型": { - "step": 29, + "step": 28, "type": "int", "category": "目标" }, "目标距离": { - "step": 30, + "step": 29, "type": "int", "category": "目标" }, "目标施法(倒计时)": { - "step": 31, + "step": 30, "type": "int", "category": "目标" }, "目标施法(正计时)": { - "step": 32, + "step": 31, "type": "int", "category": "目标" }, "目标施法可打断": { - "step": 33, + "step": 32, "type": "int", "category": "目标" }, "目标驱散类型": { - "step": 34, + "step": 33, "type": "int", "category": "目标" }, "目标生命值": { - "step": 35, + "step": 34, "type": "int", "category": "目标" }, "鼠标类型": { - "step": 36, + "step": 35, "type": "int", "category": "鼠标" }, "鼠标驱散类型": { - "step": 37, + "step": 36, "type": "int", "category": "鼠标" }, "鼠标生命值": { - "step": 38, + "step": 37, "type": "int", "category": "鼠标" }, "鼠标距离": { - "step": 39, + "step": 38, "type": "int", "category": "鼠标" }, "鼠标施法(倒计时)": { - "step": 40, + "step": 39, "type": "int", "category": "鼠标" }, "鼠标施法(正计时)": { - "step": 41, + "step": 40, "type": "int", "category": "鼠标" }, "鼠标施法可打断": { - "step": 42, + "step": 41, "type": "int", "category": "鼠标" }, "鼠标引导": { - "step": 43, + "step": 42, "type": "int", "category": "鼠标" }, "鼠标引导可打断": { - "step": 44, + "step": 43, "type": "int", "category": "鼠标" }, "首领1施法(正计时)": { - "step": 45, + "step": 44, "type": "int", "category": "首领1" }, "首领2施法(正计时)": { - "step": 46, + "step": 45, "type": "int", "category": "首领2" }, + "治疗药水": { + "step": 79, + "type": "int", + "category": "物品", + "itemId": 241304, + "isEquipped": false + }, "auras": { "player.432502.value": { - "step": 47, + "step": 46, "type": "int", "category": "玩家", "displayName": "神圣壁垒", @@ -314,7 +315,7 @@ ] }, "player.432496.value": { - "step": 48, + "step": 47, "type": "int", "category": "玩家", "displayName": "圣洁武器", @@ -326,7 +327,7 @@ ] }, "player.223819.value": { - "step": 49, + "step": 48, "type": "int", "category": "玩家", "displayName": "神圣意志", @@ -338,7 +339,7 @@ ] }, "player.387178.value": { - "step": 50, + "step": 49, "type": "int", "category": "玩家", "displayName": "苍穹之遗", @@ -350,7 +351,7 @@ ] }, "player.54149.value": { - "step": 51, + "step": 50, "type": "int", "category": "玩家", "displayName": "圣光灌注", @@ -375,7 +376,7 @@ "bar": 3 }, "player.431522.value": { - "step": 52, + "step": 51, "type": "int", "category": "玩家", "displayName": "晨光", @@ -400,7 +401,7 @@ "bar": 4 }, "player.431831.value": { - "step": 53, + "step": 52, "type": "int", "category": "玩家", "displayName": "晨光-恢复", @@ -425,7 +426,7 @@ "bar": 5 }, "player.414273.value": { - "step": 54, + "step": 53, "type": "int", "category": "玩家", "displayName": "神性之手", @@ -450,7 +451,7 @@ "bar": 6 }, "player.31884.value": { - "step": 55, + "step": 54, "type": "int", "category": "玩家", "displayName": "复仇之怒", @@ -475,7 +476,7 @@ "bar": 7 }, "player.414193.value": { - "step": 56, + "step": 55, "type": "int", "category": "玩家", "displayName": "觉醒", @@ -487,7 +488,7 @@ ] }, "player.200025.value": { - "step": 57, + "step": 56, "type": "int", "category": "玩家", "displayName": "美德道标", @@ -499,7 +500,7 @@ ] }, "target.harmful.414022.value": { - "step": 58, + "step": 57, "type": "int", "category": "目标减益", "displayName": "失格者", @@ -511,7 +512,7 @@ ] }, "target.harmful.204242.value": { - "step": 59, + "step": 58, "type": "int", "category": "目标减益", "displayName": "奉献", @@ -523,7 +524,7 @@ ] }, "focus.harmful.414022.value": { - "step": 60, + "step": 59, "type": "int", "category": "焦点减益", "displayName": "失格者", @@ -535,7 +536,7 @@ ] }, "focus.harmful.204242.value": { - "step": 61, + "step": 60, "type": "int", "category": "焦点减益", "displayName": "奉献", @@ -549,7 +550,7 @@ }, "spells": { "115750.cooldown": { - "step": 62, + "step": 61, "type": "int", "displayName": "盲目之光", "spellId": 115750, @@ -557,7 +558,7 @@ "displayType": "冷却" }, "853.cooldown": { - "step": 63, + "step": 62, "type": "int", "displayName": "制裁之锤", "spellId": 853, @@ -565,7 +566,7 @@ "displayType": "冷却" }, "642.cooldown": { - "step": 64, + "step": 63, "type": "int", "displayName": "圣盾术", "spellId": 642, @@ -573,7 +574,7 @@ "displayType": "冷却" }, "6940.cooldown": { - "step": 65, + "step": 64, "type": "int", "displayName": "牺牲祝福", "spellId": 6940, @@ -581,7 +582,7 @@ "displayType": "冷却" }, "1044.cooldown": { - "step": 66, + "step": 65, "type": "int", "displayName": "自由祝福", "spellId": 1044, @@ -589,7 +590,7 @@ "displayType": "冷却" }, "1022.cooldown": { - "step": 67, + "step": 66, "type": "int", "displayName": "保护祝福", "spellId": 1022, @@ -597,7 +598,7 @@ "displayType": "冷却" }, "633.cooldown": { - "step": 68, + "step": 67, "type": "int", "displayName": "圣疗术", "spellId": 633, @@ -605,7 +606,7 @@ "displayType": "冷却" }, "20473.cooldown": { - "step": 69, + "step": 68, "type": "int", "displayName": "神圣震击", "spellId": 20473, @@ -613,7 +614,7 @@ "displayType": "冷却" }, "20473.chargeCooldown": { - "step": 70, + "step": 69, "type": "int", "displayName": "神圣震击充能", "spellId": 20473, @@ -630,7 +631,7 @@ "displayType": "充能层数" }, "4987.cooldown": { - "step": 71, + "step": 70, "type": "int", "displayName": "清洁术", "spellId": 4987, @@ -638,7 +639,7 @@ "displayType": "冷却" }, "275773.cooldown": { - "step": 72, + "step": 71, "type": "int", "displayName": "审判", "spellId": 275773, @@ -646,7 +647,7 @@ "displayType": "冷却" }, "375576.cooldown": { - "step": 73, + "step": 72, "type": "int", "displayName": "圣洁鸣钟", "spellId": 375576, @@ -654,7 +655,7 @@ "displayType": "冷却" }, "114165.cooldown": { - "step": 74, + "step": 73, "type": "int", "displayName": "神圣棱镜", "spellId": 114165, @@ -662,7 +663,7 @@ "displayType": "冷却" }, "31821.cooldown": { - "step": 75, + "step": 74, "type": "int", "displayName": "光环掌握", "spellId": 31821, @@ -670,7 +671,7 @@ "displayType": "冷却" }, "200025.cooldown": { - "step": 76, + "step": 75, "type": "int", "displayName": "美德道标", "spellId": 200025, @@ -678,7 +679,7 @@ "displayType": "冷却" }, "432459.cooldown": { - "step": 77, + "step": 76, "type": "int", "displayName": "神圣壁垒", "spellId": 432459, @@ -686,7 +687,7 @@ "displayType": "冷却" }, "432459.chargeCooldown": { - "step": 78, + "step": 77, "type": "int", "displayName": "神圣壁垒充能", "spellId": 432459, @@ -703,7 +704,7 @@ "displayType": "充能层数" }, "391054.cooldown": { - "step": 79, + "step": 78, "type": "int", "displayName": "代祷", "spellId": 391054, @@ -848,168 +849,172 @@ "type": "int", "category": "能量" }, - "治疗石": { - "step": 23, - "type": "int", - "category": "物品", - "itemId": 5512 - }, - "鲁莽药水": { - "step": 24, - "type": "int", - "category": "物品", - "itemId": 241288 - }, - "治疗药水": { - "step": 25, - "type": "int", - "category": "物品", - "itemId": 241304 - }, - "圣光潜力": { - "step": 26, - "type": "int", - "category": "物品", - "itemId": 241308 - }, "延迟": { - "step": 27, + "step": 23, "type": "int", "category": "配置开关" }, "爆发开关": { - "step": 28, + "step": 24, "type": "int", "category": "配置开关" }, "输出模式": { - "step": 29, + "step": 25, "type": "int", "category": "配置开关" }, "AOE开关": { - "step": 30, + "step": 26, "type": "int", "category": "配置开关" }, "爆发药水开关": { - "step": 31, + "step": 27, "type": "int", "category": "配置开关" }, "目标类型": { - "step": 32, + "step": 28, "type": "int", "category": "目标" }, "目标距离": { - "step": 33, + "step": 29, "type": "int", "category": "目标" }, "目标施法(倒计时)": { - "step": 34, + "step": 30, "type": "int", "category": "目标" }, "目标施法(正计时)": { - "step": 35, + "step": 31, "type": "int", "category": "目标" }, "目标施法可打断": { - "step": 36, + "step": 32, "type": "int", "category": "目标" }, "目标引导": { - "step": 37, + "step": 33, "type": "int", "category": "目标" }, "目标引导可打断": { - "step": 38, + "step": 34, "type": "int", "category": "目标" }, "焦点施法(倒计时)": { - "step": 39, + "step": 35, "type": "int", "category": "焦点" }, "焦点施法(正计时)": { - "step": 40, + "step": 36, "type": "int", "category": "焦点" }, "焦点施法可打断": { - "step": 41, + "step": 37, "type": "int", "category": "焦点" }, "焦点引导": { - "step": 42, + "step": 38, "type": "int", "category": "焦点" }, "焦点引导可打断": { - "step": 43, + "step": 39, "type": "int", "category": "焦点" }, "焦点距离": { - "step": 44, + "step": 40, "type": "int", "category": "焦点" }, "鼠标类型": { - "step": 45, + "step": 41, "type": "int", "category": "鼠标" }, "鼠标驱散类型": { - "step": 46, + "step": 42, "type": "int", "category": "鼠标" }, "鼠标生命值": { - "step": 47, + "step": 43, "type": "int", "category": "鼠标" }, "鼠标距离": { - "step": 48, + "step": 44, "type": "int", "category": "鼠标" }, "鼠标施法(倒计时)": { - "step": 49, + "step": 45, "type": "int", "category": "鼠标" }, "鼠标施法(正计时)": { - "step": 50, + "step": 46, "type": "int", "category": "鼠标" }, "鼠标施法可打断": { - "step": 51, + "step": 47, "type": "int", "category": "鼠标" }, "鼠标引导": { - "step": 52, + "step": 48, "type": "int", "category": "鼠标" }, "鼠标引导可打断": { - "step": 53, + "step": 49, "type": "int", "category": "鼠标" }, + "治疗石": { + "step": 80, + "type": "int", + "category": "物品", + "itemId": 5512, + "isEquipped": false + }, + "鲁莽药水": { + "step": 81, + "type": "int", + "category": "物品", + "itemId": 241288, + "isEquipped": false + }, + "治疗药水": { + "step": 82, + "type": "int", + "category": "物品", + "itemId": 241304, + "isEquipped": false + }, + "圣光潜力": { + "step": 83, + "type": "int", + "category": "物品", + "itemId": 241308, + "isEquipped": false + }, "auras": { "player.327510.value": { - "step": 54, + "step": 50, "type": "int", "category": "玩家", "displayName": "闪耀之光", @@ -1034,7 +1039,7 @@ "bar": 5 }, "player.182104.value": { - "step": 55, + "step": 51, "type": "int", "category": "玩家", "displayName": "小闪耀之光", @@ -1059,7 +1064,7 @@ "bar": 6 }, "player.132403.value": { - "step": 56, + "step": 52, "type": "int", "category": "玩家", "displayName": "正义盾击", @@ -1071,7 +1076,7 @@ ] }, "player.188370.value": { - "step": 57, + "step": 53, "type": "int", "category": "玩家", "displayName": "奉献", @@ -1083,7 +1088,7 @@ ] }, "player.433550.value": { - "step": 58, + "step": 54, "type": "int", "category": "玩家", "displayName": "圣言祭礼", @@ -1095,7 +1100,7 @@ ] }, "player.135893.value": { - "step": 59, + "step": 55, "type": "int", "category": "玩家", "displayName": "虔诚光环", @@ -1109,7 +1114,7 @@ }, "spells": { "432472.cooldown": { - "step": 60, + "step": 56, "type": "int", "displayName": "圣洁武器", "spellId": 432472, @@ -1117,7 +1122,7 @@ "displayType": "冷却" }, "432472.chargeCooldown": { - "step": 61, + "step": 57, "type": "int", "displayName": "圣洁武器充能", "spellId": 432472, @@ -1134,7 +1139,7 @@ "displayType": "充能层数" }, "432459.cooldown": { - "step": 62, + "step": 58, "type": "int", "displayName": "神圣壁垒", "spellId": 432459, @@ -1142,7 +1147,7 @@ "displayType": "冷却" }, "432459.chargeCooldown": { - "step": 63, + "step": 59, "type": "int", "displayName": "神圣壁垒充能", "spellId": 432459, @@ -1159,7 +1164,7 @@ "displayType": "充能层数" }, "213644.cooldown": { - "step": 64, + "step": 60, "type": "int", "displayName": "清毒术", "spellId": 213644, @@ -1167,7 +1172,7 @@ "displayType": "冷却" }, "275779.cooldown": { - "step": 65, + "step": 61, "type": "int", "displayName": "审判", "spellId": 275779, @@ -1175,7 +1180,7 @@ "displayType": "冷却" }, "275779.chargeCooldown": { - "step": 66, + "step": 62, "type": "int", "displayName": "审判充能", "spellId": 275779, @@ -1192,7 +1197,7 @@ "displayType": "充能层数" }, "31935.cooldown": { - "step": 67, + "step": 63, "type": "int", "displayName": "复仇者之盾", "spellId": 31935, @@ -1200,7 +1205,7 @@ "displayType": "冷却" }, "26573.cooldown": { - "step": 68, + "step": 64, "type": "int", "displayName": "奉献", "spellId": 26573, @@ -1208,7 +1213,7 @@ "displayType": "冷却" }, "53600.cooldown": { - "step": 69, + "step": 65, "type": "int", "displayName": "正义盾击", "spellId": 53600, @@ -1216,7 +1221,7 @@ "displayType": "冷却" }, "85673.cooldown": { - "step": 70, + "step": 66, "type": "int", "displayName": "荣耀圣令", "spellId": 85673, @@ -1224,7 +1229,7 @@ "displayType": "冷却" }, "96231.cooldown": { - "step": 71, + "step": 67, "type": "int", "displayName": "责难", "spellId": 96231, @@ -1232,7 +1237,7 @@ "displayType": "冷却" }, "204019.cooldown": { - "step": 72, + "step": 68, "type": "int", "displayName": "祝福之锤", "spellId": 204019, @@ -1240,7 +1245,7 @@ "displayType": "冷却" }, "204019.chargeCooldown": { - "step": 73, + "step": 69, "type": "int", "displayName": "祝福之锤充能", "spellId": 204019, @@ -1257,7 +1262,7 @@ "displayType": "充能层数" }, "389539.cooldown": { - "step": 74, + "step": 70, "type": "int", "displayName": "戒卫", "spellId": 389539, @@ -1265,7 +1270,7 @@ "displayType": "冷却" }, "375576.cooldown": { - "step": 75, + "step": 71, "type": "int", "displayName": "圣洁鸣钟", "spellId": 375576, @@ -1273,7 +1278,7 @@ "displayType": "冷却" }, "115750.cooldown": { - "step": 76, + "step": 72, "type": "int", "displayName": "盲目之光", "spellId": 115750, @@ -1281,7 +1286,7 @@ "displayType": "冷却" }, "853.cooldown": { - "step": 77, + "step": 73, "type": "int", "displayName": "制裁之锤", "spellId": 853, @@ -1289,7 +1294,7 @@ "displayType": "冷却" }, "642.cooldown": { - "step": 78, + "step": 74, "type": "int", "displayName": "圣盾术", "spellId": 642, @@ -1297,7 +1302,7 @@ "displayType": "冷却" }, "6940.cooldown": { - "step": 79, + "step": 75, "type": "int", "displayName": "牺牲祝福", "spellId": 6940, @@ -1305,7 +1310,7 @@ "displayType": "冷却" }, "1044.cooldown": { - "step": 80, + "step": 76, "type": "int", "displayName": "自由祝福", "spellId": 1044, @@ -1313,7 +1318,7 @@ "displayType": "冷却" }, "1022.cooldown": { - "step": 81, + "step": 77, "type": "int", "displayName": "保护祝福", "spellId": 1022, @@ -1321,7 +1326,7 @@ "displayType": "冷却" }, "633.cooldown": { - "step": 82, + "step": 78, "type": "int", "displayName": "圣疗术", "spellId": 633, @@ -1329,7 +1334,7 @@ "displayType": "冷却" }, "24275.cooldown": { - "step": 83, + "step": 79, "type": "int", "displayName": "愤怒之锤", "spellId": 24275, @@ -1451,140 +1456,141 @@ "type": "int", "category": "能量" }, - "治疗药水": { - "step": 24, - "type": "int", - "category": "物品", - "itemId": 241304 - }, "爆发开关": { - "step": 25, + "step": 24, "type": "int", "category": "配置开关" }, "AOE开关": { - "step": 26, + "step": 25, "type": "int", "category": "配置开关" }, "输出模式": { - "step": 27, + "step": 26, "type": "int", "category": "配置开关" }, "延迟": { - "step": 28, + "step": 27, "type": "int", "category": "配置开关" }, "目标类型": { - "step": 29, + "step": 28, "type": "int", "category": "目标" }, "目标距离": { - "step": 30, + "step": 29, "type": "int", "category": "目标" }, "目标施法(倒计时)": { - "step": 31, + "step": 30, "type": "int", "category": "目标" }, "目标施法(正计时)": { - "step": 32, + "step": 31, "type": "int", "category": "目标" }, "目标施法可打断": { - "step": 33, + "step": 32, "type": "int", "category": "目标" }, "目标引导": { - "step": 34, + "step": 33, "type": "int", "category": "目标" }, "目标引导可打断": { - "step": 35, + "step": 34, "type": "int", "category": "目标" }, "焦点施法(倒计时)": { - "step": 36, + "step": 35, "type": "int", "category": "焦点" }, "焦点施法(正计时)": { - "step": 37, + "step": 36, "type": "int", "category": "焦点" }, "焦点施法可打断": { - "step": 38, + "step": 37, "type": "int", "category": "焦点" }, "焦点引导": { - "step": 39, + "step": 38, "type": "int", "category": "焦点" }, "焦点引导可打断": { - "step": 40, + "step": 39, "type": "int", "category": "焦点" }, "鼠标类型": { - "step": 41, + "step": 40, "type": "int", "category": "鼠标" }, "鼠标驱散类型": { - "step": 42, + "step": 41, "type": "int", "category": "鼠标" }, "鼠标生命值": { - "step": 43, + "step": 42, "type": "int", "category": "鼠标" }, "鼠标距离": { - "step": 44, + "step": 43, "type": "int", "category": "鼠标" }, "鼠标施法(倒计时)": { - "step": 45, + "step": 44, "type": "int", "category": "鼠标" }, "鼠标施法(正计时)": { - "step": 46, + "step": 45, "type": "int", "category": "鼠标" }, "鼠标施法可打断": { - "step": 47, + "step": 46, "type": "int", "category": "鼠标" }, "鼠标引导": { - "step": 48, + "step": 47, "type": "int", "category": "鼠标" }, "鼠标引导可打断": { - "step": 49, + "step": 48, "type": "int", "category": "鼠标" }, + "治疗药水": { + "step": 64, + "type": "int", + "category": "物品", + "itemId": 241304, + "isEquipped": false + }, "spells": { "115750.cooldown": { - "step": 50, + "step": 49, "type": "int", "displayName": "盲目之光", "spellId": 115750, @@ -1592,7 +1598,7 @@ "displayType": "冷却" }, "853.cooldown": { - "step": 51, + "step": 50, "type": "int", "displayName": "制裁之锤", "spellId": 853, @@ -1600,7 +1606,7 @@ "displayType": "冷却" }, "642.cooldown": { - "step": 52, + "step": 51, "type": "int", "displayName": "圣盾术", "spellId": 642, @@ -1608,7 +1614,7 @@ "displayType": "冷却" }, "6940.cooldown": { - "step": 53, + "step": 52, "type": "int", "displayName": "牺牲祝福", "spellId": 6940, @@ -1616,7 +1622,7 @@ "displayType": "冷却" }, "1044.cooldown": { - "step": 54, + "step": 53, "type": "int", "displayName": "自由祝福", "spellId": 1044, @@ -1624,7 +1630,7 @@ "displayType": "冷却" }, "1022.cooldown": { - "step": 55, + "step": 54, "type": "int", "displayName": "保护祝福", "spellId": 1022, @@ -1632,7 +1638,7 @@ "displayType": "冷却" }, "633.cooldown": { - "step": 56, + "step": 55, "type": "int", "displayName": "圣疗术", "spellId": 633, @@ -1640,7 +1646,7 @@ "displayType": "冷却" }, "213644.cooldown": { - "step": 57, + "step": 56, "type": "int", "displayName": "清毒术", "spellId": 213644, @@ -1648,7 +1654,7 @@ "displayType": "冷却" }, "20271.cooldown": { - "step": 58, + "step": 57, "type": "int", "displayName": "审判", "spellId": 20271, @@ -1656,7 +1662,7 @@ "displayType": "冷却" }, "20271.chargeCooldown": { - "step": 59, + "step": 58, "type": "int", "displayName": "审判充能", "spellId": 20271, @@ -1664,7 +1670,7 @@ "displayType": "充能" }, "375576.cooldown": { - "step": 60, + "step": 59, "type": "int", "displayName": "圣洁鸣钟", "spellId": 375576, @@ -1672,7 +1678,7 @@ "displayType": "冷却" }, "184575.cooldown": { - "step": 61, + "step": 60, "type": "int", "displayName": "公正之剑", "spellId": 184575, @@ -1680,7 +1686,7 @@ "displayType": "冷却" }, "343527.cooldown": { - "step": 62, + "step": 61, "type": "int", "displayName": "处决宣判", "spellId": 343527, @@ -1688,7 +1694,7 @@ "displayType": "冷却" }, "255937.cooldown": { - "step": 63, + "step": 62, "type": "int", "displayName": "灰烬觉醒", "spellId": 255937, @@ -1696,7 +1702,7 @@ "displayType": "冷却" }, "31884.cooldown": { - "step": 64, + "step": 63, "type": "int", "displayName": "复仇之怒", "spellId": 31884, diff --git a/config/Priest.json b/config/Priest.json index 0ab62a2d..9713ce70 100644 --- a/config/Priest.json +++ b/config/Priest.json @@ -187,113 +187,117 @@ "type": "int", "category": "能量" }, - "治疗石": { - "step": 24, - "type": "int", - "category": "物品", - "itemId": 5512 - }, - "鲁莽药水": { - "step": 25, - "type": "int", - "category": "物品", - "itemId": 241288 - }, - "魔法药水": { - "step": 26, - "type": "int", - "category": "物品", - "itemId": 241301 - }, - "治疗药水": { - "step": 27, - "type": "int", - "category": "物品", - "itemId": 241304 - }, "延迟": { - "step": 28, + "step": 24, "type": "int", "category": "配置开关" }, "目标类型": { - "step": 29, + "step": 25, "type": "int", "category": "目标" }, "目标生命值": { - "step": 30, + "step": 26, "type": "int", "category": "目标" }, "目标施法(倒计时)": { - "step": 31, + "step": 27, "type": "int", "category": "目标" }, "目标施法(正计时)": { - "step": 32, + "step": 28, "type": "int", "category": "目标" }, "目标施法可打断": { - "step": 33, + "step": 29, "type": "int", "category": "目标" }, "目标驱散类型": { - "step": 34, + "step": 30, "type": "int", "category": "目标" }, "鼠标类型": { - "step": 35, + "step": 31, "type": "int", "category": "鼠标" }, "鼠标驱散类型": { - "step": 36, + "step": 32, "type": "int", "category": "鼠标" }, "鼠标生命值": { - "step": 37, + "step": 33, "type": "int", "category": "鼠标" }, "鼠标距离": { - "step": 38, + "step": 34, "type": "int", "category": "鼠标" }, "鼠标施法(倒计时)": { - "step": 39, + "step": 35, "type": "int", "category": "鼠标" }, "鼠标施法(正计时)": { - "step": 40, + "step": 36, "type": "int", "category": "鼠标" }, "鼠标施法可打断": { - "step": 41, + "step": 37, "type": "int", "category": "鼠标" }, "鼠标引导": { - "step": 42, + "step": 38, "type": "int", "category": "鼠标" }, "鼠标引导可打断": { - "step": 43, + "step": 39, "type": "int", "category": "鼠标" }, + "治疗石": { + "step": 73, + "type": "int", + "category": "物品", + "itemId": 5512, + "isEquipped": false + }, + "鲁莽药水": { + "step": 74, + "type": "int", + "category": "物品", + "itemId": 241288, + "isEquipped": false + }, + "魔法药水": { + "step": 75, + "type": "int", + "category": "物品", + "itemId": 241301, + "isEquipped": false + }, + "治疗药水": { + "step": 76, + "type": "int", + "category": "物品", + "itemId": 241304, + "isEquipped": false + }, "auras": { "player.450193.value": { - "step": 44, + "step": 40, "type": "int", "category": "玩家", "displayName": "熵能裂隙", @@ -305,7 +309,7 @@ ] }, "player.81700.value": { - "step": 45, + "step": 41, "type": "int", "category": "玩家", "displayName": "天使长", @@ -317,7 +321,7 @@ ] }, "player.198069.value": { - "step": 46, + "step": 42, "type": "int", "category": "玩家", "displayName": "阴暗面之力", @@ -329,7 +333,7 @@ ] }, "player.1253591.value": { - "step": 47, + "step": 43, "type": "int", "category": "玩家", "displayName": "黑暗主宰", @@ -354,7 +358,7 @@ "bar": 3 }, "player.114255.value": { - "step": 48, + "step": 44, "type": "int", "category": "玩家", "displayName": "圣光涌动", @@ -379,7 +383,7 @@ "bar": 4 }, "player.472433.value": { - "step": 49, + "step": 45, "type": "int", "category": "玩家", "displayName": "福音", @@ -404,7 +408,7 @@ "bar": 5 }, "player.1253725.value": { - "step": 50, + "step": 46, "type": "int", "category": "玩家", "displayName": "强效惩击", @@ -429,7 +433,7 @@ "bar": 6 }, "player.373183.value": { - "step": 51, + "step": 47, "type": "int", "category": "玩家", "displayName": "严酷戒律", @@ -454,7 +458,7 @@ "bar": 7 }, "player.390787.value": { - "step": 52, + "step": 48, "type": "int", "category": "玩家", "displayName": "祸福相依", @@ -479,7 +483,7 @@ "bar": 8 }, "target.harmful.589.value": { - "step": 53, + "step": 49, "type": "int", "category": "目标减益", "displayName": "暗言术:痛", @@ -491,7 +495,7 @@ ] }, "target.helpful.194384.value": { - "step": 54, + "step": 50, "type": "int", "category": "目标增益", "displayName": "救赎", @@ -503,7 +507,7 @@ ] }, "target.helpful.17.value": { - "step": 55, + "step": 51, "type": "int", "category": "目标增益", "displayName": "真言术:盾", @@ -516,7 +520,7 @@ ] }, "focus.harmful.589.value": { - "step": 56, + "step": 52, "type": "int", "category": "焦点减益", "displayName": "暗言术:痛", @@ -528,7 +532,7 @@ ] }, "focus.helpful.194384.value": { - "step": 57, + "step": 53, "type": "int", "category": "焦点增益", "displayName": "救赎", @@ -540,7 +544,7 @@ ] }, "focus.helpful.17.value": { - "step": 58, + "step": 54, "type": "int", "category": "焦点增益", "displayName": "真言术:盾", @@ -555,7 +559,7 @@ }, "spells": { "8122.cooldown": { - "step": 59, + "step": 55, "type": "int", "displayName": "心灵尖啸", "spellId": 8122, @@ -563,7 +567,7 @@ "displayType": "冷却" }, "32375.cooldown": { - "step": 60, + "step": 56, "type": "int", "displayName": "群体驱散", "spellId": 32375, @@ -571,7 +575,7 @@ "displayType": "冷却" }, "527.cooldown": { - "step": 61, + "step": 57, "type": "int", "displayName": "纯净术", "spellId": 527, @@ -579,7 +583,7 @@ "displayType": "冷却" }, "19236.cooldown": { - "step": 62, + "step": 58, "type": "int", "displayName": "绝望祷言", "spellId": 19236, @@ -587,7 +591,7 @@ "displayType": "冷却" }, "232633.cooldown": { - "step": 63, + "step": 59, "type": "int", "displayName": "奥术洪流", "spellId": 232633, @@ -595,7 +599,7 @@ "displayType": "冷却" }, "47540.cooldown": { - "step": 64, + "step": 60, "type": "int", "displayName": "苦修", "spellId": 47540, @@ -603,7 +607,7 @@ "displayType": "冷却" }, "47540.chargeCooldown": { - "step": 65, + "step": 61, "type": "int", "displayName": "苦修充能", "spellId": 47540, @@ -620,7 +624,7 @@ "displayType": "充能层数" }, "194509.cooldown": { - "step": 66, + "step": 62, "type": "int", "displayName": "真言术:耀", "spellId": 194509, @@ -628,7 +632,7 @@ "displayType": "冷却" }, "194509.chargeCooldown": { - "step": 67, + "step": 63, "type": "int", "displayName": "真言术:耀充能", "spellId": 194509, @@ -645,7 +649,7 @@ "displayType": "充能层数" }, "17.cooldown": { - "step": 68, + "step": 64, "type": "int", "displayName": "真言术:盾", "spellId": 17, @@ -653,7 +657,7 @@ "displayType": "冷却" }, "62618.cooldown": { - "step": 69, + "step": 65, "type": "int", "displayName": "真言术:障", "spellId": 62618, @@ -661,7 +665,7 @@ "displayType": "冷却" }, "421453.cooldown": { - "step": 70, + "step": 66, "type": "int", "displayName": "终极苦修", "spellId": 421453, @@ -669,7 +673,7 @@ "displayType": "冷却" }, "472433.cooldown": { - "step": 71, + "step": 67, "type": "int", "displayName": "福音", "spellId": 472433, @@ -677,7 +681,7 @@ "displayType": "冷却" }, "8092.cooldown": { - "step": 72, + "step": 68, "type": "int", "displayName": "心灵震爆", "spellId": 8092, @@ -685,7 +689,7 @@ "displayType": "冷却" }, "32379.cooldown": { - "step": 73, + "step": 69, "type": "int", "displayName": "暗言术:灭", "spellId": 32379, @@ -693,7 +697,7 @@ "displayType": "冷却" }, "34433.cooldown": { - "step": 74, + "step": 70, "type": "int", "displayName": "暗影魔", "spellId": 34433, @@ -701,7 +705,7 @@ "displayType": "冷却" }, "1235211.cooldown": { - "step": 75, + "step": 71, "type": "int", "displayName": "暗影分流", "spellId": 1235211, @@ -709,7 +713,7 @@ "displayType": "冷却" }, "586.cooldown": { - "step": 76, + "step": 72, "type": "int", "displayName": "渐隐术", "spellId": 586, @@ -853,115 +857,116 @@ "type": "int", "category": "能量" }, - "治疗药水": { - "step": 23, - "type": "int", - "category": "物品", - "itemId": 241304 - }, "延迟": { - "step": 24, + "step": 23, "type": "int", "category": "配置开关" }, "爆发开关": { - "step": 25, + "step": 24, "type": "int", "category": "配置开关" }, "目标类型": { - "step": 26, + "step": 25, "type": "int", "category": "目标" }, "目标施法(倒计时)": { - "step": 27, + "step": 26, "type": "int", "category": "目标" }, "目标施法(正计时)": { - "step": 28, + "step": 27, "type": "int", "category": "目标" }, "目标施法可打断": { - "step": 29, + "step": 28, "type": "int", "category": "目标" }, "目标驱散类型": { - "step": 30, + "step": 29, "type": "int", "category": "目标" }, "鼠标类型": { - "step": 31, + "step": 30, "type": "int", "category": "鼠标" }, "鼠标驱散类型": { - "step": 32, + "step": 31, "type": "int", "category": "鼠标" }, "鼠标生命值": { - "step": 33, + "step": 32, "type": "int", "category": "鼠标" }, "鼠标距离": { - "step": 34, + "step": 33, "type": "int", "category": "鼠标" }, "鼠标施法(倒计时)": { - "step": 35, + "step": 34, "type": "int", "category": "鼠标" }, "鼠标施法(正计时)": { - "step": 36, + "step": 35, "type": "int", "category": "鼠标" }, "鼠标施法可打断": { - "step": 37, + "step": 36, "type": "int", "category": "鼠标" }, "鼠标引导": { - "step": 38, + "step": 37, "type": "int", "category": "鼠标" }, "鼠标引导可打断": { - "step": 39, + "step": 38, "type": "int", "category": "鼠标" }, "首领1施法(倒计时)": { - "step": 40, + "step": 39, "type": "int", "category": "首领1" }, "首领1施法(正计时)": { - "step": 41, + "step": 40, "type": "int", "category": "首领1" }, "首领2施法(倒计时)": { - "step": 42, + "step": 41, "type": "int", "category": "首领2" }, "首领2施法(正计时)": { - "step": 43, + "step": 42, "type": "int", "category": "首领2" }, + "治疗药水": { + "step": 72, + "type": "int", + "category": "物品", + "itemId": 241304, + "isEquipped": false + }, "auras": { "player.200183.value": { - "step": 44, + "step": 43, "type": "int", "category": "玩家", "displayName": "神圣化身", @@ -973,7 +978,7 @@ ] }, "player.405216.value": { - "step": 45, + "step": 44, "type": "int", "category": "玩家", "displayName": "神圣镜像", @@ -985,7 +990,7 @@ ] }, "player.114255.value": { - "step": 46, + "step": 45, "type": "int", "category": "玩家", "displayName": "圣光涌动", @@ -1010,7 +1015,7 @@ "bar": 3 }, "player.1262766.value": { - "step": 47, + "step": 46, "type": "int", "category": "玩家", "displayName": "祈福", @@ -1035,7 +1040,7 @@ "bar": 4 }, "player.194384.value": { - "step": 48, + "step": 47, "type": "int", "category": "玩家", "displayName": "救赎之魂", @@ -1047,7 +1052,7 @@ ] }, "target.harmful.589.value": { - "step": 49, + "step": 48, "type": "int", "category": "目标减益", "displayName": "暗言术:痛", @@ -1059,7 +1064,7 @@ ] }, "target.harmful.14914.value": { - "step": 50, + "step": 49, "type": "int", "category": "目标减益", "displayName": "神圣之火", @@ -1071,7 +1076,7 @@ ] }, "target.helpful.41635.value": { - "step": 51, + "step": 50, "type": "int", "category": "目标增益", "displayName": "愈合祷言", @@ -1083,7 +1088,7 @@ ] }, "target.helpful.139.value": { - "step": 52, + "step": 51, "type": "int", "category": "目标增益", "displayName": "恢复", @@ -1095,7 +1100,7 @@ ] }, "focus.harmful.589.value": { - "step": 53, + "step": 52, "type": "int", "category": "焦点减益", "displayName": "暗言术:痛", @@ -1107,7 +1112,7 @@ ] }, "focus.harmful.14914.value": { - "step": 54, + "step": 53, "type": "int", "category": "焦点减益", "displayName": "神圣之火", @@ -1119,7 +1124,7 @@ ] }, "focus.helpful.41635.value": { - "step": 55, + "step": 54, "type": "int", "category": "焦点增益", "displayName": "愈合祷言", @@ -1131,7 +1136,7 @@ ] }, "focus.helpful.139.value": { - "step": 56, + "step": 55, "type": "int", "category": "焦点增益", "displayName": "恢复", @@ -1145,7 +1150,7 @@ }, "spells": { "8122.cooldown": { - "step": 57, + "step": 56, "type": "int", "displayName": "心灵尖啸", "spellId": 8122, @@ -1153,7 +1158,7 @@ "displayType": "冷却" }, "32375.cooldown": { - "step": 58, + "step": 57, "type": "int", "displayName": "群体驱散", "spellId": 32375, @@ -1161,7 +1166,7 @@ "displayType": "冷却" }, "527.cooldown": { - "step": 59, + "step": 58, "type": "int", "displayName": "纯净术", "spellId": 527, @@ -1169,7 +1174,7 @@ "displayType": "冷却" }, "19236.cooldown": { - "step": 60, + "step": 59, "type": "int", "displayName": "绝望祷言", "spellId": 19236, @@ -1177,7 +1182,7 @@ "displayType": "冷却" }, "232633.cooldown": { - "step": 61, + "step": 60, "type": "int", "displayName": "奥术洪流", "spellId": 232633, @@ -1185,7 +1190,7 @@ "displayType": "冷却" }, "33076.cooldown": { - "step": 62, + "step": 61, "type": "int", "displayName": "愈合祷言", "spellId": 33076, @@ -1193,7 +1198,7 @@ "displayType": "冷却" }, "33076.chargeCooldown": { - "step": 63, + "step": 62, "type": "int", "displayName": "愈合祷言充能", "spellId": 33076, @@ -1210,7 +1215,7 @@ "displayType": "充能层数" }, "2050.cooldown": { - "step": 64, + "step": 63, "type": "int", "displayName": "圣言术:静", "spellId": 2050, @@ -1218,7 +1223,7 @@ "displayType": "冷却" }, "2050.chargeCooldown": { - "step": 65, + "step": 64, "type": "int", "displayName": "圣言术:静充能", "spellId": 2050, @@ -1235,7 +1240,7 @@ "displayType": "充能层数" }, "88625.cooldown": { - "step": 66, + "step": 65, "type": "int", "displayName": "圣言术:罚", "spellId": 88625, @@ -1243,7 +1248,7 @@ "displayType": "冷却" }, "200183.cooldown": { - "step": 67, + "step": 66, "type": "int", "displayName": "神圣化身", "spellId": 200183, @@ -1251,7 +1256,7 @@ "displayType": "冷却" }, "14914.cooldown": { - "step": 68, + "step": 67, "type": "int", "displayName": "神圣之火", "spellId": 14914, @@ -1259,7 +1264,7 @@ "displayType": "冷却" }, "120517.cooldown": { - "step": 69, + "step": 68, "type": "int", "displayName": "光晕", "spellId": 120517, @@ -1267,7 +1272,7 @@ "displayType": "冷却" }, "64843.cooldown": { - "step": 70, + "step": 69, "type": "int", "displayName": "神圣赞美诗", "spellId": 64843, @@ -1275,7 +1280,7 @@ "displayType": "冷却" }, "586.cooldown": { - "step": 71, + "step": 70, "type": "int", "displayName": "渐隐术", "spellId": 586, @@ -1283,7 +1288,7 @@ "displayType": "冷却" }, "528.cooldown": { - "step": 72, + "step": 71, "type": "int", "displayName": "驱散魔法", "spellId": 528, diff --git a/config/Shaman.json b/config/Shaman.json index 43b051b1..61afb75c 100644 --- a/config/Shaman.json +++ b/config/Shaman.json @@ -194,130 +194,131 @@ "type": "int", "category": "能量" }, - "治疗药水": { - "step": 22, - "type": "int", - "category": "物品", - "itemId": 241304 - }, "爆发开关": { - "step": 23, + "step": 22, "type": "int", "category": "配置开关" }, "延迟": { - "step": 24, + "step": 23, "type": "int", "category": "配置开关" }, "目标类型": { - "step": 25, + "step": 24, "type": "int", "category": "目标" }, "目标生命值": { - "step": 26, + "step": 25, "type": "int", "category": "目标" }, "目标施法(倒计时)": { - "step": 27, + "step": 26, "type": "int", "category": "目标" }, "目标施法(正计时)": { - "step": 28, + "step": 27, "type": "int", "category": "目标" }, "目标施法可打断": { - "step": 29, + "step": 28, "type": "int", "category": "目标" }, "目标引导": { - "step": 30, + "step": 29, "type": "int", "category": "目标" }, "目标引导可打断": { - "step": 31, + "step": 30, "type": "int", "category": "目标" }, "焦点施法(倒计时)": { - "step": 32, + "step": 31, "type": "int", "category": "焦点" }, "焦点施法(正计时)": { - "step": 33, + "step": 32, "type": "int", "category": "焦点" }, "焦点施法可打断": { - "step": 34, + "step": 33, "type": "int", "category": "焦点" }, "焦点引导": { - "step": 35, + "step": 34, "type": "int", "category": "焦点" }, "焦点引导可打断": { - "step": 36, + "step": 35, "type": "int", "category": "焦点" }, "鼠标类型": { - "step": 37, + "step": 36, "type": "int", "category": "鼠标" }, "鼠标驱散类型": { - "step": 38, + "step": 37, "type": "int", "category": "鼠标" }, "鼠标生命值": { - "step": 39, + "step": 38, "type": "int", "category": "鼠标" }, "鼠标距离": { - "step": 40, + "step": 39, "type": "int", "category": "鼠标" }, "鼠标施法(倒计时)": { - "step": 41, + "step": 40, "type": "int", "category": "鼠标" }, "鼠标施法(正计时)": { - "step": 42, + "step": 41, "type": "int", "category": "鼠标" }, "鼠标施法可打断": { - "step": 43, + "step": 42, "type": "int", "category": "鼠标" }, "鼠标引导": { - "step": 44, + "step": 43, "type": "int", "category": "鼠标" }, "鼠标引导可打断": { - "step": 45, + "step": 44, "type": "int", "category": "鼠标" }, + "治疗药水": { + "step": 87, + "type": "int", + "category": "物品", + "itemId": 241304, + "isEquipped": false + }, "auras": { "player.462854.value": { - "step": 46, + "step": 45, "type": "int", "category": "玩家", "displayName": "天怒", @@ -329,7 +330,7 @@ ] }, "player.77762.value": { - "step": 47, + "step": 46, "type": "int", "category": "玩家", "displayName": "熔岩奔腾", @@ -341,7 +342,7 @@ ] }, "player.191634.value": { - "step": 48, + "step": 47, "type": "int", "category": "玩家", "displayName": "风暴守护者", @@ -366,7 +367,7 @@ "bar": 2 }, "player.454015.value": { - "step": 49, + "step": 48, "type": "int", "category": "玩家", "displayName": "暴风", @@ -391,7 +392,7 @@ "bar": 3 }, "player.267344.value": { - "step": 50, + "step": 49, "type": "int", "category": "玩家", "displayName": "元素宗师", @@ -403,7 +404,7 @@ ] }, "player.1259491.value": { - "step": 51, + "step": 50, "type": "int", "category": "玩家", "displayName": "净化烈焰", @@ -415,7 +416,7 @@ ] }, "player.263806.value": { - "step": 52, + "step": 51, "type": "int", "category": "玩家", "displayName": "风之爆发", @@ -440,7 +441,7 @@ "bar": 4 }, "player.447244.value": { - "step": 53, + "step": 52, "type": "int", "category": "玩家", "displayName": "先祖召唤", @@ -452,7 +453,7 @@ ] }, "player.1219480.value": { - "step": 54, + "step": 53, "type": "int", "category": "玩家", "displayName": "升腾", @@ -464,7 +465,7 @@ ] }, "player.188592.value": { - "step": 55, + "step": 54, "type": "int", "category": "玩家", "displayName": "火元素", @@ -476,7 +477,7 @@ ] }, "player.157299.value": { - "step": 56, + "step": 55, "type": "int", "category": "玩家", "displayName": "风暴元素", @@ -488,7 +489,7 @@ ] }, "player.191877.value": { - "step": 57, + "step": 56, "type": "int", "category": "玩家", "displayName": "漩涡之力", @@ -513,7 +514,7 @@ "bar": 5 }, "player.118522.value": { - "step": 58, + "step": 57, "type": "int", "category": "玩家", "displayName": "元素冲击暴击", @@ -525,7 +526,7 @@ ] }, "player.173183.value": { - "step": 59, + "step": 58, "type": "int", "category": "玩家", "displayName": "元素冲击急速", @@ -537,7 +538,7 @@ ] }, "player.173184.value": { - "step": 60, + "step": 59, "type": "int", "category": "玩家", "displayName": "元素冲击精通", @@ -549,7 +550,7 @@ ] }, "player.192106.value": { - "step": 61, + "step": 60, "type": "int", "category": "玩家", "displayName": "闪电之盾", @@ -561,7 +562,7 @@ ] }, "player.443454.value": { - "step": 62, + "step": 61, "type": "int", "category": "玩家", "displayName": "先祖迅捷", @@ -573,7 +574,7 @@ ] }, "player.1300219.value": { - "step": 63, + "step": 62, "type": "int", "category": "玩家", "displayName": "元素奔涌", @@ -585,7 +586,7 @@ ] }, "player.1300222.value": { - "step": 64, + "step": 63, "type": "int", "category": "玩家", "displayName": "过载!", @@ -597,7 +598,7 @@ ] }, "target.harmful.188389.value": { - "step": 65, + "step": 64, "type": "int", "category": "目标减益", "displayName": "烈焰震击", @@ -609,7 +610,7 @@ ] }, "target.harmful.197209.value": { - "step": 66, + "step": 65, "type": "int", "category": "目标减益", "displayName": "引雷针", @@ -623,7 +624,7 @@ }, "spells": { "57994.cooldown": { - "step": 67, + "step": 66, "type": "int", "displayName": "风剪", "spellId": 57994, @@ -631,7 +632,7 @@ "displayType": "冷却" }, "198103.cooldown": { - "step": 68, + "step": 67, "type": "int", "displayName": "土元素", "spellId": 198103, @@ -639,7 +640,7 @@ "displayType": "冷却" }, "192058.cooldown": { - "step": 69, + "step": 68, "type": "int", "displayName": "电能图腾", "spellId": 192058, @@ -647,7 +648,7 @@ "displayType": "冷却" }, "378081.cooldown": { - "step": 70, + "step": 69, "type": "int", "displayName": "自然迅捷", "spellId": 378081, @@ -655,7 +656,7 @@ "displayType": "冷却" }, "108287.cooldown": { - "step": 71, + "step": 70, "type": "int", "displayName": "图腾投射", "spellId": 108287, @@ -663,7 +664,7 @@ "displayType": "冷却" }, "51514.cooldown": { - "step": 72, + "step": 71, "type": "int", "displayName": "妖术", "spellId": 51514, @@ -671,7 +672,7 @@ "displayType": "冷却" }, "378773.cooldown": { - "step": 73, + "step": 72, "type": "int", "displayName": "强化净化术", "spellId": 378773, @@ -679,7 +680,7 @@ "displayType": "冷却" }, "8143.cooldown": { - "step": 74, + "step": 73, "type": "int", "displayName": "战栗图腾", "spellId": 8143, @@ -687,7 +688,7 @@ "displayType": "冷却" }, "383013.cooldown": { - "step": 75, + "step": 74, "type": "int", "displayName": "清毒图腾", "spellId": 383013, @@ -695,7 +696,7 @@ "displayType": "冷却" }, "192063.cooldown": { - "step": 76, + "step": 75, "type": "int", "displayName": "阵风", "spellId": 192063, @@ -703,7 +704,7 @@ "displayType": "冷却" }, "58875.cooldown": { - "step": 77, + "step": 76, "type": "int", "displayName": "幽魂步", "spellId": 58875, @@ -711,7 +712,7 @@ "displayType": "冷却" }, "73920.cooldown": { - "step": 78, + "step": 77, "type": "int", "displayName": "治疗之雨", "spellId": 73920, @@ -719,7 +720,7 @@ "displayType": "冷却" }, "114050.cooldown": { - "step": 79, + "step": 78, "type": "int", "displayName": "升腾", "spellId": 114050, @@ -727,7 +728,7 @@ "displayType": "冷却" }, "51490.cooldown": { - "step": 80, + "step": 79, "type": "int", "displayName": "雷霆风暴", "spellId": 51490, @@ -735,7 +736,7 @@ "displayType": "冷却" }, "192077.cooldown": { - "step": 81, + "step": 80, "type": "int", "displayName": "狂风图腾", "spellId": 192077, @@ -743,7 +744,7 @@ "displayType": "冷却" }, "77130.cooldown": { - "step": 82, + "step": 81, "type": "int", "displayName": "净化灵魂", "spellId": 77130, @@ -751,7 +752,7 @@ "displayType": "冷却" }, "51505.cooldown": { - "step": 83, + "step": 82, "type": "int", "displayName": "熔岩爆裂", "spellId": 51505, @@ -759,7 +760,7 @@ "displayType": "冷却" }, "51505.chargeCooldown": { - "step": 84, + "step": 83, "type": "int", "displayName": "熔岩爆裂充能", "spellId": 51505, @@ -776,7 +777,7 @@ "displayType": "充能层数" }, "470057.cooldown": { - "step": 85, + "step": 84, "type": "int", "displayName": "流电炽焰", "spellId": 470057, @@ -784,7 +785,7 @@ "displayType": "冷却" }, "191634.cooldown": { - "step": 86, + "step": 85, "type": "int", "displayName": "风暴守护者", "spellId": 191634, @@ -792,7 +793,7 @@ "displayType": "冷却" }, "443454.cooldown": { - "step": 87, + "step": 86, "type": "int", "displayName": "先祖迅捷", "spellId": 443454, diff --git a/config/Warlock.json b/config/Warlock.json index d815c467..32aa541c 100644 --- a/config/Warlock.json +++ b/config/Warlock.json @@ -524,121 +524,123 @@ "type": "int", "category": "能量" }, - "治疗石": { - "step": 23, - "type": "int", - "category": "物品", - "itemId": 5512 - }, - "治疗药水": { - "step": 24, - "type": "int", - "category": "物品", - "itemId": 241304 - }, "目标类型": { - "step": 25, + "step": 23, "type": "int", "category": "目标" }, "目标施法(倒计时)": { - "step": 26, + "step": 24, "type": "int", "category": "目标" }, "目标施法(正计时)": { - "step": 27, + "step": 25, "type": "int", "category": "目标" }, "目标施法可打断": { - "step": 28, + "step": 26, "type": "int", "category": "目标" }, "目标引导": { - "step": 29, + "step": 27, "type": "int", "category": "目标" }, "目标引导可打断": { - "step": 30, + "step": 28, "type": "int", "category": "目标" }, "焦点施法(倒计时)": { - "step": 31, + "step": 29, "type": "int", "category": "焦点" }, "焦点施法(正计时)": { - "step": 32, + "step": 30, "type": "int", "category": "焦点" }, "焦点施法可打断": { - "step": 33, + "step": 31, "type": "int", "category": "焦点" }, "焦点引导": { - "step": 34, + "step": 32, "type": "int", "category": "焦点" }, "焦点引导可打断": { - "step": 35, + "step": 33, "type": "int", "category": "焦点" }, "鼠标类型": { - "step": 36, + "step": 34, "type": "int", "category": "鼠标" }, "鼠标驱散类型": { - "step": 37, + "step": 35, "type": "int", "category": "鼠标" }, "鼠标生命值": { - "step": 38, + "step": 36, "type": "int", "category": "鼠标" }, "鼠标距离": { - "step": 39, + "step": 37, "type": "int", "category": "鼠标" }, "鼠标施法(倒计时)": { - "step": 40, + "step": 38, "type": "int", "category": "鼠标" }, "鼠标施法(正计时)": { - "step": 41, + "step": 39, "type": "int", "category": "鼠标" }, "鼠标施法可打断": { - "step": 42, + "step": 40, "type": "int", "category": "鼠标" }, "鼠标引导": { - "step": 43, + "step": 41, "type": "int", "category": "鼠标" }, "鼠标引导可打断": { - "step": 44, + "step": 42, "type": "int", "category": "鼠标" }, + "治疗石": { + "step": 64, + "type": "int", + "category": "物品", + "itemId": 5512, + "isEquipped": false + }, + "治疗药水": { + "step": 65, + "type": "int", + "category": "物品", + "itemId": 241304, + "isEquipped": false + }, "spells": { "5782.cooldown": { - "step": 45, + "step": 43, "type": "int", "displayName": "恐惧", "spellId": 5782, @@ -646,7 +648,7 @@ "displayType": "冷却" }, "6789.cooldown": { - "step": 46, + "step": 44, "type": "int", "displayName": "死亡缠绕", "spellId": 6789, @@ -654,7 +656,7 @@ "displayType": "冷却" }, "20707.cooldown": { - "step": 47, + "step": 45, "type": "int", "displayName": "灵魂石", "spellId": 20707, @@ -662,7 +664,7 @@ "displayType": "冷却" }, "30283.cooldown": { - "step": 48, + "step": 46, "type": "int", "displayName": "暗影之怒", "spellId": 30283, @@ -670,7 +672,7 @@ "displayType": "冷却" }, "333889.cooldown": { - "step": 49, + "step": 47, "type": "int", "displayName": "邪能统御", "spellId": 333889, @@ -678,7 +680,7 @@ "displayType": "冷却" }, "108416.cooldown": { - "step": 50, + "step": 48, "type": "int", "displayName": "黑暗契约", "spellId": 108416, @@ -686,7 +688,7 @@ "displayType": "冷却" }, "111771.cooldown": { - "step": 51, + "step": 49, "type": "int", "displayName": "恶魔传送门", "spellId": 111771, @@ -694,7 +696,7 @@ "displayType": "冷却" }, "127174.cooldown": { - "step": 52, + "step": 50, "type": "int", "displayName": "虚弱灾厄", "spellId": 127174, @@ -702,7 +704,7 @@ "displayType": "冷却" }, "1271802.cooldown": { - "step": 53, + "step": 51, "type": "int", "displayName": "语言灾厄", "spellId": 1271802, @@ -710,7 +712,7 @@ "displayType": "冷却" }, "48018.cooldown": { - "step": 54, + "step": 52, "type": "int", "displayName": "恶魔法阵", "spellId": 48018, @@ -718,7 +720,7 @@ "displayType": "冷却" }, "48020.cooldown": { - "step": 55, + "step": 53, "type": "int", "displayName": "恶魔法阵:传送", "spellId": 48020, @@ -726,7 +728,7 @@ "displayType": "冷却" }, "196277.cooldown": { - "step": 56, + "step": 54, "type": "int", "displayName": "内爆", "spellId": 196277, @@ -743,7 +745,7 @@ "displayType": "施法次数" }, "265187.cooldown": { - "step": 57, + "step": 55, "type": "int", "displayName": "召唤恶魔暴君", "spellId": 265187, @@ -751,7 +753,7 @@ "displayType": "冷却" }, "1276467.cooldown": { - "step": 58, + "step": 56, "type": "int", "displayName": "魔典:邪能破坏者", "spellId": 1276467, @@ -759,7 +761,7 @@ "displayType": "冷却" }, "105174.cooldown": { - "step": 59, + "step": 57, "type": "int", "displayName": "古尔丹之手", "spellId": 105174, @@ -767,7 +769,7 @@ "displayType": "冷却" }, "1276672.cooldown": { - "step": 60, + "step": 58, "type": "int", "displayName": "召唤末日守卫", "spellId": 1276672, @@ -775,7 +777,7 @@ "displayType": "冷却" }, "104316.cooldown": { - "step": 61, + "step": 59, "type": "int", "displayName": "召唤恐惧猎犬", "spellId": 104316, @@ -783,7 +785,7 @@ "displayType": "冷却" }, "264187.cooldown": { - "step": 62, + "step": 60, "type": "int", "displayName": "恶魔之箭", "spellId": 264187, @@ -791,7 +793,7 @@ "displayType": "冷却" }, "1276452.cooldown": { - "step": 63, + "step": 61, "type": "int", "displayName": "魔典:小鬼领主", "spellId": 1276452, @@ -799,7 +801,7 @@ "displayType": "冷却" }, "388215.cooldown": { - "step": 64, + "step": 62, "type": "int", "displayName": "吞噬魔法", "spellId": 388215, @@ -807,7 +809,7 @@ "displayType": "冷却" }, "30146.cooldown": { - "step": 65, + "step": 63, "type": "int", "displayName": "召唤恶魔卫士", "spellId": 30146, diff --git a/config/Warrior.json b/config/Warrior.json index f41dc699..9e8f5a80 100644 --- a/config/Warrior.json +++ b/config/Warrior.json @@ -169,150 +169,151 @@ "type": "int", "category": "能量" }, - "鲁莽药水": { - "step": 20, - "type": "int", - "category": "物品", - "itemId": 241288 - }, "爆发开关": { - "step": 21, + "step": 20, "type": "int", "category": "配置开关" }, "输出模式": { - "step": 22, + "step": 21, "type": "int", "category": "配置开关" }, "AOE开关": { - "step": 23, + "step": 22, "type": "int", "category": "配置开关" }, "爆发药水开关": { - "step": 24, + "step": 23, "type": "int", "category": "配置开关" }, "目标类型": { - "step": 25, + "step": 24, "type": "int", "category": "目标" }, "目标生命值": { - "step": 26, + "step": 25, "type": "int", "category": "目标" }, "目标施法(倒计时)": { - "step": 27, + "step": 26, "type": "int", "category": "目标" }, "目标施法(正计时)": { - "step": 28, + "step": 27, "type": "int", "category": "目标" }, "目标施法可打断": { - "step": 29, + "step": 28, "type": "int", "category": "目标" }, "目标引导": { - "step": 30, + "step": 29, "type": "int", "category": "目标" }, "目标引导可打断": { - "step": 31, + "step": 30, "type": "int", "category": "目标" }, "目标距离": { - "step": 32, + "step": 31, "type": "int", "category": "目标" }, "焦点施法(倒计时)": { - "step": 33, + "step": 32, "type": "int", "category": "焦点" }, "焦点施法(正计时)": { - "step": 34, + "step": 33, "type": "int", "category": "焦点" }, "焦点施法可打断": { - "step": 35, + "step": 34, "type": "int", "category": "焦点" }, "焦点引导": { - "step": 36, + "step": 35, "type": "int", "category": "焦点" }, "焦点引导可打断": { - "step": 37, + "step": 36, "type": "int", "category": "焦点" }, "焦点距离": { - "step": 38, + "step": 37, "type": "int", "category": "焦点" }, "鼠标类型": { - "step": 39, + "step": 38, "type": "int", "category": "鼠标" }, "鼠标驱散类型": { - "step": 40, + "step": 39, "type": "int", "category": "鼠标" }, "鼠标生命值": { - "step": 41, + "step": 40, "type": "int", "category": "鼠标" }, "鼠标距离": { - "step": 42, + "step": 41, "type": "int", "category": "鼠标" }, "鼠标施法(倒计时)": { - "step": 43, + "step": 42, "type": "int", "category": "鼠标" }, "鼠标施法(正计时)": { - "step": 44, + "step": 43, "type": "int", "category": "鼠标" }, "鼠标施法可打断": { - "step": 45, + "step": 44, "type": "int", "category": "鼠标" }, "鼠标引导": { - "step": 46, + "step": 45, "type": "int", "category": "鼠标" }, "鼠标引导可打断": { - "step": 47, + "step": 46, "type": "int", "category": "鼠标" }, + "鲁莽药水": { + "step": 92, + "type": "int", + "category": "物品", + "itemId": 241288, + "isEquipped": false + }, "auras": { "player.107574.value": { - "step": 48, + "step": 47, "type": "int", "category": "玩家", "displayName": "天神下凡", @@ -324,7 +325,7 @@ ] }, "player.52437.value": { - "step": 49, + "step": 48, "type": "int", "category": "玩家", "displayName": "猝死", @@ -349,7 +350,7 @@ "bar": 2 }, "player.228920.value": { - "step": 50, + "step": 49, "type": "int", "category": "玩家", "displayName": "破坏者", @@ -361,7 +362,7 @@ ] }, "player.334783.value": { - "step": 51, + "step": 50, "type": "int", "category": "玩家", "displayName": "间接伤害", @@ -386,7 +387,7 @@ "bar": 3 }, "player.440989.value": { - "step": 52, + "step": 51, "type": "int", "category": "玩家", "displayName": "巨人神力", @@ -411,7 +412,7 @@ "bar": 4 }, "player.386633.value": { - "step": 53, + "step": 52, "type": "int", "category": "玩家", "displayName": "刽子手的精准", @@ -436,7 +437,7 @@ "bar": 5 }, "player.1292058.value": { - "step": 54, + "step": 53, "type": "int", "category": "玩家", "displayName": "英勇之力", @@ -461,7 +462,7 @@ "bar": 6 }, "player.1269394.value": { - "step": 55, + "step": 54, "type": "int", "category": "玩家", "displayName": "战争大师", @@ -486,7 +487,7 @@ "bar": 7 }, "player.260708.value": { - "step": 56, + "step": 55, "type": "int", "category": "玩家", "displayName": "横扫攻击", @@ -511,7 +512,7 @@ "bar": 8 }, "player.1261189.value": { - "step": 57, + "step": 56, "type": "int", "category": "玩家", "displayName": "粉碎连击", @@ -536,7 +537,7 @@ "bar": 9 }, "player.456120.value": { - "step": 58, + "step": 57, "type": "int", "category": "玩家", "displayName": "趁虚而入", @@ -561,7 +562,7 @@ "bar": 10 }, "player.445606.value": { - "step": 59, + "step": 58, "type": "int", "category": "玩家", "displayName": "殒命在即", @@ -586,7 +587,7 @@ "bar": 11 }, "player.445584.value": { - "step": 60, + "step": 59, "type": "int", "category": "玩家", "displayName": "处刑者", @@ -611,7 +612,7 @@ "bar": 12 }, "player.316440.value": { - "step": 61, + "step": 60, "type": "int", "category": "玩家", "displayName": "武技神威", @@ -636,7 +637,7 @@ "bar": 13 }, "player.446035.value": { - "step": 62, + "step": 61, "type": "int", "category": "玩家", "displayName": "剑刃风暴", @@ -648,7 +649,7 @@ ] }, "target.harmful.388539.value": { - "step": 63, + "step": 62, "type": "int", "category": "目标减益", "displayName": "撕裂", @@ -660,7 +661,7 @@ ] }, "target.harmful.208086.value": { - "step": 64, + "step": 63, "type": "int", "category": "目标减益", "displayName": "巨人打击", @@ -672,7 +673,7 @@ ] }, "target.harmful.262115.value": { - "step": 65, + "step": 64, "type": "int", "category": "目标减益", "displayName": "重伤", @@ -684,7 +685,7 @@ ] }, "target.harmful.447513.value": { - "step": 66, + "step": 65, "type": "int", "category": "目标减益", "displayName": "崩毁", @@ -709,7 +710,7 @@ "bar": 14 }, "focus.harmful.388539.value": { - "step": 67, + "step": 66, "type": "int", "category": "焦点减益", "displayName": "撕裂", @@ -721,7 +722,7 @@ ] }, "focus.harmful.208086.value": { - "step": 68, + "step": 67, "type": "int", "category": "焦点减益", "displayName": "巨人打击", @@ -733,7 +734,7 @@ ] }, "focus.harmful.262115.value": { - "step": 69, + "step": 68, "type": "int", "category": "焦点减益", "displayName": "重伤", @@ -745,7 +746,7 @@ ] }, "focus.harmful.447513.value": { - "step": 70, + "step": 69, "type": "int", "category": "焦点减益", "displayName": "崩毁", @@ -772,7 +773,7 @@ }, "spells": { "202168.cooldown": { - "step": 71, + "step": 70, "type": "int", "displayName": "胜利在望", "spellId": 202168, @@ -780,7 +781,7 @@ "displayType": "冷却" }, "376079.cooldown": { - "step": 72, + "step": 71, "type": "int", "displayName": "勇士之矛", "spellId": 376079, @@ -788,7 +789,7 @@ "displayType": "冷却" }, "6544.cooldown": { - "step": 73, + "step": 72, "type": "int", "displayName": "英勇飞跃", "spellId": 6544, @@ -796,7 +797,7 @@ "displayType": "冷却" }, "97462.cooldown": { - "step": 74, + "step": 73, "type": "int", "displayName": "集结呐喊", "spellId": 97462, @@ -804,7 +805,7 @@ "displayType": "冷却" }, "46968.cooldown": { - "step": 75, + "step": 74, "type": "int", "displayName": "震荡波", "spellId": 46968, @@ -812,7 +813,7 @@ "displayType": "冷却" }, "107570.cooldown": { - "step": 76, + "step": 75, "type": "int", "displayName": "风暴之锤", "spellId": 107570, @@ -820,7 +821,7 @@ "displayType": "冷却" }, "384110.cooldown": { - "step": 77, + "step": 76, "type": "int", "displayName": "破裂投掷", "spellId": 384110, @@ -828,7 +829,7 @@ "displayType": "冷却" }, "64382.cooldown": { - "step": 78, + "step": 77, "type": "int", "displayName": "碎裂投掷", "spellId": 64382, @@ -836,7 +837,7 @@ "displayType": "冷却" }, "5246.cooldown": { - "step": 79, + "step": 78, "type": "int", "displayName": "破胆怒吼", "spellId": 5246, @@ -844,7 +845,7 @@ "displayType": "冷却" }, "7384.cooldown": { - "step": 80, + "step": 79, "type": "int", "displayName": "压制", "spellId": 7384, @@ -852,7 +853,7 @@ "displayType": "冷却" }, "7384.chargeCooldown": { - "step": 81, + "step": 80, "type": "int", "displayName": "压制充能", "spellId": 7384, @@ -869,7 +870,7 @@ "displayType": "充能层数" }, "163201.cooldown": { - "step": 82, + "step": 81, "type": "int", "displayName": "斩杀", "spellId": 163201, @@ -877,7 +878,7 @@ "displayType": "冷却" }, "845.cooldown": { - "step": 83, + "step": 82, "type": "int", "displayName": "顺劈斩", "spellId": 845, @@ -885,7 +886,7 @@ "displayType": "冷却" }, "12294.cooldown": { - "step": 84, + "step": 83, "type": "int", "displayName": "致死打击", "spellId": 12294, @@ -893,7 +894,7 @@ "displayType": "冷却" }, "167105.cooldown": { - "step": 85, + "step": 84, "type": "int", "displayName": "巨人打击", "spellId": 167105, @@ -901,7 +902,7 @@ "displayType": "冷却" }, "436358.cooldown": { - "step": 86, + "step": 85, "type": "int", "displayName": "崩摧", "spellId": 436358, @@ -909,7 +910,7 @@ "displayType": "冷却" }, "6552.cooldown": { - "step": 87, + "step": 86, "type": "int", "displayName": "拳击", "spellId": 6552, @@ -917,7 +918,7 @@ "displayType": "冷却" }, "118038.cooldown": { - "step": 88, + "step": 87, "type": "int", "displayName": "剑在人在", "spellId": 118038, @@ -925,7 +926,7 @@ "displayType": "冷却" }, "107574.cooldown": { - "step": 89, + "step": 88, "type": "int", "displayName": "天神下凡", "spellId": 107574, @@ -933,7 +934,7 @@ "displayType": "冷却" }, "227847.cooldown": { - "step": 90, + "step": 89, "type": "int", "displayName": "剑刃风暴", "spellId": 227847, @@ -941,7 +942,7 @@ "displayType": "冷却" }, "260708.cooldown": { - "step": 91, + "step": 90, "type": "int", "displayName": "横扫攻击", "spellId": 260708, @@ -949,7 +950,7 @@ "displayType": "冷却" }, "228920.cooldown": { - "step": 92, + "step": 91, "type": "int", "displayName": "破坏者", "spellId": 228920,