diff --git a/Fuyutsui/core/core.lua b/Fuyutsui/core/core.lua index 51bbf101..c4c02579 100644 --- a/Fuyutsui/core/core.lua +++ b/Fuyutsui/core/core.lua @@ -168,6 +168,7 @@ Fuyutsui.blocks = {} Fuyutsui.target = {} Fuyutsui.focus = {} Fuyutsui.mouseover = {} +Fuyutsui.pet = {} Fuyutsui.boss = {} for index = 1, 5 do Fuyutsui.boss["boss" .. index] = {} diff --git a/Fuyutsui/core/events.lua b/Fuyutsui/core/events.lua index c5c0c6f8..29ce2d46 100644 --- a/Fuyutsui/core/events.lua +++ b/Fuyutsui/core/events.lua @@ -249,6 +249,9 @@ function Fuyutsui:UNIT_HEALTH(_, unit) if unit == "mouseover" then self:UpdateMouseoverHealth() end + if unit == "pet" then + self:UpdateUnitHealthBlock(unit) + end if unit and unit:match("^boss[1-5]$") then self:UpdateUnitHealthBlock(unit) end @@ -264,6 +267,9 @@ function Fuyutsui:UNIT_MAXHEALTH(_, unit) if unit == "mouseover" then self:UpdateMouseoverHealth() end + if unit == "pet" then + self:UpdateUnitHealthBlock(unit) + end if unit and unit:match("^boss[1-5]$") then self:UpdateUnitHealthBlock(unit) end diff --git a/Fuyutsui/core/player.lua b/Fuyutsui/core/player.lua index a99c498d..c959b084 100644 --- a/Fuyutsui/core/player.lua +++ b/Fuyutsui/core/player.lua @@ -259,8 +259,8 @@ function Fuyutsui:UpdatePlayerBarInfo() end function Fuyutsui:UpdatePlayerPet() - state.hasPet = UnitExists("pet") and 1 / 255 or 0 - self:UpdateStateBlock("状态", "宠物") + self:UpdateUnitType("pet") + self:UpdateUnitHealthBlock("pet") end function Fuyutsui:UpdatePlayerMounted() diff --git a/Fuyutsui/core/stateblocks.lua b/Fuyutsui/core/stateblocks.lua index f573b70e..d68bcd75 100644 --- a/Fuyutsui/core/stateblocks.lua +++ b/Fuyutsui/core/stateblocks.lua @@ -6,6 +6,7 @@ local state = Fuyutsui.state local target = Fuyutsui.target local focus = Fuyutsui.focus local mouseover = Fuyutsui.mouseover +local pet = Fuyutsui.pet local boss = Fuyutsui.boss local ColorValue0 = CreateColor(0, 0, 0, 1) @@ -116,7 +117,6 @@ local stateBlockGetters = { ["有效性"] = function() return state.valid or 0 end, ["战斗时间"] = function() return state.combatTime or 0 end, ["移动"] = function() return state.moving or 0 end, - ["宠物"] = function() return state.hasPet or 0 end, ["生命值"] = function() return state.healthPercent or 0 end, ["一键辅助"] = function() return state.assistantSpell or 0 end, ["插入法术"] = function() return state.insertSpell or 0 end, @@ -268,6 +268,10 @@ local stateBlockGetters = { ["引导"] = function(self) return self:GetUnitCastPixel("mouseover", "channel") end, ["引导可打断"] = function(self) return self:GetUnitInterruptiblePixel("mouseover", "channel") end, }, + ["宠物"] = { + ["存在"] = function() return pet.exists or 0 end, + ["生命值"] = function() return pet.healthPercent or 0 end, + }, } for index = 1, 5 do diff --git a/Fuyutsui/core/target.lua b/Fuyutsui/core/target.lua index 70b78e0d..f4a65b17 100644 --- a/Fuyutsui/core/target.lua +++ b/Fuyutsui/core/target.lua @@ -6,6 +6,7 @@ local state = Fuyutsui.state local target = Fuyutsui.target local focus = Fuyutsui.focus local mouseover = Fuyutsui.mouseover +local pet = Fuyutsui.pet local boss = Fuyutsui.boss local nameplate = Fuyutsui.nameplate @@ -18,6 +19,7 @@ local unitZHMap = { ["target"] = "目标", ["focus"] = "焦点", ["mouseover"] = "鼠标", + ["pet"] = "宠物", ["boss1"] = "首领1", ["boss2"] = "首领2", ["boss3"] = "首领3", @@ -29,6 +31,7 @@ local function GetUnitCache(unit) if unit == "target" then return target end if unit == "focus" then return focus end if unit == "mouseover" then return mouseover end + if unit == "pet" then return pet end if boss and boss[unit] then return boss[unit] end end @@ -87,6 +90,12 @@ function Fuyutsui:UpdateUnitType(unit) local category = unitZHMap[unit] if not cache or not category then return end + if unit == "pet" then + cache.exists = UnitExists(unit) and 1 / 255 or 0 + self:UpdateStateBlock(category, "存在") + return + end + if boss and boss[unit] then cache.type = (cache.canAttack and 1 or 2) / 255 self:UpdateStateBlock(category, "类型") @@ -156,6 +165,11 @@ function Fuyutsui:UpdateUnitHealthBlock(unit) local cache = GetUnitCache(unit) local category = unitZHMap[unit] if not cache or not category then return end + if not UnitExists(unit) then + cache.healthPercent = 0 + self:UpdateStateBlock(category, "生命值") + return + end local healthPercent = UnitHealthPercent(unit, false, self.curve100) ---@diagnostic disable-next-line: param-type-mismatch local _, _, b = healthPercent:GetRGB() diff --git a/Fuyutsui/main.lua b/Fuyutsui/main.lua index e66bde70..39c3786f 100644 --- a/Fuyutsui/main.lua +++ b/Fuyutsui/main.lua @@ -56,11 +56,11 @@ 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 = { @@ -71,6 +71,7 @@ function Fuyutsui:LoadPlayerBlocks(specIndex) } 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["宠物"] or t.states["首领1"] or t.states["首领2"] or t.states["首领3"] or t.states["首领4"] or t.states["首领5"] if nested then diff --git a/Infrastructure/ClassBlocksStore.cs b/Infrastructure/ClassBlocksStore.cs index a4557397..a5fe55f8 100644 --- a/Infrastructure/ClassBlocksStore.cs +++ b/Infrastructure/ClassBlocksStore.cs @@ -22,6 +22,7 @@ internal static class ClassBlocksStore ClassStateCatalog.CategoryTarget, ClassStateCatalog.CategoryFocus, ClassStateCatalog.CategoryMouseover, + ClassStateCatalog.CategoryPet, ClassStateCatalog.CategoryBoss1, ClassStateCatalog.CategoryBoss2, ClassStateCatalog.CategoryBoss3, @@ -63,6 +64,7 @@ internal static class ClassBlocksStore [ClassStateCatalog.CategoryTarget] = new List(), [ClassStateCatalog.CategoryFocus] = new List(), [ClassStateCatalog.CategoryMouseover] = new List(), + [ClassStateCatalog.CategoryPet] = new List(), [ClassStateCatalog.CategoryBoss1] = new List(), [ClassStateCatalog.CategoryBoss2] = new List(), [ClassStateCatalog.CategoryBoss3] = new List(), diff --git a/Infrastructure/ClassStateCatalog.cs b/Infrastructure/ClassStateCatalog.cs index 49c70d3b..771529e2 100644 --- a/Infrastructure/ClassStateCatalog.cs +++ b/Infrastructure/ClassStateCatalog.cs @@ -14,6 +14,7 @@ internal static class ClassStateCatalog public const string CategoryTarget = "目标"; public const string CategoryFocus = "焦点"; public const string CategoryMouseover = "鼠标"; + public const string CategoryPet = "宠物"; public const string CategoryBoss1 = "首领1"; public const string CategoryBoss2 = "首领2"; public const string CategoryBoss3 = "首领3"; @@ -29,6 +30,7 @@ internal static class ClassStateCatalog CategoryTarget, CategoryFocus, CategoryMouseover, + CategoryPet, CategoryBoss1, CategoryBoss2, CategoryBoss3, @@ -40,7 +42,7 @@ internal static class ClassStateCatalog [ (CategoryState, [ - "职业", "专精", "有效性", "战斗时间", "移动", "宠物", + "职业", "专精", "有效性", "战斗时间", "移动", "生命值", "一键辅助", "插入法术", "队伍类型", "队伍人数", "首领战", "难度", "英雄天赋", "施法目标", "施法技能", "敌人数量", "敌人数-无仇恨", "敌人数-有仇恨", @@ -73,6 +75,10 @@ internal static class ClassStateCatalog [ "类型", "驱散类型", "生命值", "距离", "施法(倒计时)", "施法(正计时)", "施法可打断", "引导", "引导可打断" ]), + (CategoryPet, + [ + "存在", "生命值" + ]), (CategoryBoss1, [ "类型", "驱散类型", "生命值", "距离", "施法(倒计时)", "施法(正计时)", "施法可打断", "引导", "引导可打断" diff --git a/Infrastructure/FuyutsuiConfigConverter.cs b/Infrastructure/FuyutsuiConfigConverter.cs index 95336536..dc0a489e 100644 --- a/Infrastructure/FuyutsuiConfigConverter.cs +++ b/Infrastructure/FuyutsuiConfigConverter.cs @@ -35,6 +35,7 @@ internal static class FuyutsuiConfigConverter ClassStateCatalog.CategoryTarget, ClassStateCatalog.CategoryFocus, ClassStateCatalog.CategoryMouseover, + ClassStateCatalog.CategoryPet, ClassStateCatalog.CategoryBoss1, ClassStateCatalog.CategoryBoss2, ClassStateCatalog.CategoryBoss3, @@ -545,6 +546,7 @@ internal static class FuyutsuiConfigConverter => category is ClassStateCatalog.CategoryTarget or ClassStateCatalog.CategoryFocus or ClassStateCatalog.CategoryMouseover + or ClassStateCatalog.CategoryPet or ClassStateCatalog.CategoryBoss1 or ClassStateCatalog.CategoryBoss2 or ClassStateCatalog.CategoryBoss3 diff --git a/Infrastructure/ModuleDependencyService.cs b/Infrastructure/ModuleDependencyService.cs index 08c8431a..a563bbdf 100644 --- a/Infrastructure/ModuleDependencyService.cs +++ b/Infrastructure/ModuleDependencyService.cs @@ -12,6 +12,7 @@ internal sealed class ModuleDependencyService ClassStateCatalog.CategoryTarget, ClassStateCatalog.CategoryFocus, ClassStateCatalog.CategoryMouseover, + ClassStateCatalog.CategoryPet, ClassStateCatalog.CategoryBoss1, ClassStateCatalog.CategoryBoss2, ClassStateCatalog.CategoryBoss3, diff --git a/Modules/ConditionFieldCatalog.cs b/Modules/ConditionFieldCatalog.cs index 4319b2e9..dd5a8a55 100644 --- a/Modules/ConditionFieldCatalog.cs +++ b/Modules/ConditionFieldCatalog.cs @@ -319,6 +319,7 @@ public sealed class ConditionFieldCatalog => classification is ClassStateCatalog.CategoryTarget or ClassStateCatalog.CategoryFocus or ClassStateCatalog.CategoryMouseover + or ClassStateCatalog.CategoryPet or ClassStateCatalog.CategoryBoss1 or ClassStateCatalog.CategoryBoss2 or ClassStateCatalog.CategoryBoss3 diff --git a/UI/StatusForm.cs b/UI/StatusForm.cs index 855953ee..9ad83b14 100644 --- a/UI/StatusForm.cs +++ b/UI/StatusForm.cs @@ -687,7 +687,7 @@ public sealed class StatusForm : Form Margin = new Padding(0) }; var copyButton = UiTheme.CreateButton("复制全部", UiTheme.ButtonKind.Secondary); - UiTheme.StyleActionButton(copyButton, 96); + UiTheme.StyleActionButton(copyButton, 112); copyButton.Margin = new Padding(0, 0, 8, 6); copyButton.Click += (_, _) => { @@ -697,7 +697,7 @@ public sealed class StatusForm : Form } }; var clearButton = UiTheme.CreateButton("清空显示", UiTheme.ButtonKind.Danger); - UiTheme.StyleActionButton(clearButton, 96); + UiTheme.StyleActionButton(clearButton, 112); clearButton.Margin = new Padding(0, 0, 16, 6); clearButton.Click += (_, _) => _logTextBox.Clear(); var autoScroll = new CheckBox @@ -1225,6 +1225,10 @@ public sealed class StatusForm : Form "鼠标", ["类型", "生命值", "距离", "施法(倒计时)", "施法(正计时)", "施法可打断", "引导", "引导可打断"], 104), 0, 3); + fields.Controls.Add(CreateCommonFieldCard( + "宠物", + ["存在", "生命值"], + 104), 1, 3); scrollHost.Controls.Add(fields); return scrollHost;